Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Unified Diff: src/pdf/SkPDFDevice.cpp

Issue 24811002: Update the SkDocument interface to allow for 1) abort won't emit pdf, 2) close can report success/f… (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: fixes after code review Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/pdf/SkPDFDevice.cpp
diff --git a/src/pdf/SkPDFDevice.cpp b/src/pdf/SkPDFDevice.cpp
index 538422c510ba08f4e456a4ff813bcda9d97df9d0..143c8b8f3f97ddca0d23f0287e101128b8035d2e 100644
--- a/src/pdf/SkPDFDevice.cpp
+++ b/src/pdf/SkPDFDevice.cpp
@@ -2034,6 +2034,7 @@ void SkPDFDevice::internalDrawBitmap(const SkMatrix& matrix,
const SkBitmap& bitmap,
const SkIRect* srcRect,
const SkPaint& paint) {
+ // TODO(edisonn): Perspective matrix support implemented here
SkMatrix scaled;
// Adjust for origin flip.
scaled.setScale(SK_Scalar1, -SK_Scalar1);
@@ -2070,3 +2071,150 @@ bool SkPDFDevice::onReadPixels(const SkBitmap& bitmap, int x, int y,
bool SkPDFDevice::allowImageFilter(SkImageFilter*) {
return false;
}
+
+static SkISize SkSizeToISize(const SkSize& size) {
+ return SkISize::Make(SkScalarRoundToInt(size.width()), SkScalarRoundToInt(size.height()));
+}
+
+static SkMatrix buildMatrixToMapTrimBox00(const SkRect& content) {
+ SkMatrix matrix;
+ matrix.setTranslate(-content.left(), -content.top());
+ return matrix;
+}
+
+SkPDFDeviceFlattener::SkPDFDeviceFlattener(const SkSize& trimBox, const SkRect& content)
+ : SkPDFDevice(SkSizeToISize(trimBox),
+ SkSizeToISize(SkSize::Make(content.width(), content.height())),
+ buildMatrixToMapTrimBox00(content)) {
+}
+
+SkPDFDeviceFlattener::~SkPDFDeviceFlattener() {
+}
+
+void SkPDFDeviceFlattener::drawPaint(const SkDraw& d, const SkPaint& paint) {
+ INHERITED::drawPaint(d, paint);
+}
+
+void SkPDFDeviceFlattener::drawPoints(const SkDraw& d, SkCanvas::PointMode mode,
+ size_t count, const SkPoint points[],
+ const SkPaint& paint) {
+ if (mustFlatten(d)) {
+ SkPoint* flattenedPoints = SkNEW_ARRAY(SkPoint, count);
+ d.fMatrix->mapPoints(flattenedPoints, points, count);
+ SkDraw draw(d);
+ SkMatrix identity = SkMatrix::I();
+ draw.fMatrix = &identity;
+ INHERITED::drawPoints(draw, mode, count, flattenedPoints, paint);
+ SkDELETE_ARRAY(flattenedPoints);
+ return;
+ }
+
+ INHERITED::drawPoints(d, mode, count, points, paint);
+}
+
+void SkPDFDeviceFlattener::drawRect(const SkDraw& d, const SkRect& r, const SkPaint& paint) {
+ if (mustFlatten(d)) {
+ SkPath path;
+ path.addRect(r);
+ path.transform(*d.fMatrix);
+ SkDraw draw(d);
+ SkMatrix matrix = SkMatrix::I();
+ draw.fMatrix = &matrix;
+
+ SkPaint paintFlatten = paint;
+ if (paintFlatten.getShader()) {
+ SkMatrix local = paintFlatten.getShader()->getLocalMatrix();
+ local.preConcat(*d.fMatrix);
+ paintFlatten.getShader()->setLocalMatrix(local);
+ }
+
+ INHERITED::drawPath(draw, path, paintFlatten, NULL, true);
+ return;
+ }
+
+ INHERITED::drawRect(d, r, paint);
+}
+
+void SkPDFDeviceFlattener::drawPath(const SkDraw& d, const SkPath& origpath,
+ const SkPaint& paint, const SkMatrix* prePathMatrix,
+ bool pathIsMutable) {
+ if (mustFlatten(d) || (prePathMatrix && prePathMatrix->hasPerspective())) {
+ SkPath path;
+ path.addPath(origpath);
+ if (prePathMatrix) {
+ path.transform(*prePathMatrix);
+ }
+ path.transform(*d.fMatrix);
+ SkDraw draw(d);
+ SkMatrix matrix = SkMatrix::I();
+ draw.fMatrix = &matrix;
+
+ SkPaint paintFlatten = paint;
+ if (paintFlatten.getShader()) {
+ SkMatrix local = *d.fMatrix;
+ local.preConcat(paintFlatten.getShader()->getLocalMatrix());
+
+ paintFlatten.getShader()->setLocalMatrix(local);
+ }
+
+ INHERITED::drawPath(draw, path, paintFlatten, NULL, true);
+ return;
+ }
+
+ INHERITED::drawPath(d, origpath, paint, prePathMatrix, pathIsMutable);
+}
+
+void SkPDFDeviceFlattener::drawText(const SkDraw& d, const void* text, size_t len,
+ SkScalar x, SkScalar y, const SkPaint& paint) {
+ if (mustPathText(d, paint)) {
+ d.drawText_asPaths((const char*)text, len, x, y, paint);
+ return;
+ }
+
+ INHERITED::drawText(d, text, len, x, y, paint);
+}
+
+void SkPDFDeviceFlattener::drawPosText(const SkDraw& d, const void* text, size_t len,
+ const SkScalar pos[], SkScalar constY,
+ int scalarsPerPos, const SkPaint& paint) {
+ if (mustPathText(d, paint)) {
+ d.drawPosText_asPaths((const char*)text, len, pos, constY, scalarsPerPos, paint);
+ return;
+ }
+ INHERITED::drawPosText(d, text, len,pos, constY,scalarsPerPos, paint);
+}
+
+void SkPDFDeviceFlattener::drawTextOnPath(const SkDraw& d, const void* text, size_t len,
+ const SkPath& path, const SkMatrix* matrix,
+ const SkPaint& paint) {
+ if (mustPathText(d, paint) || (matrix && matrix->hasPerspective())) {
+ d.drawTextOnPath((const char*)text, len, path, matrix, paint);
+ return;
+ }
+ INHERITED::drawTextOnPath(d, text, len, path, matrix, paint);
+}
+
+void SkPDFDeviceFlattener::drawVertices(const SkDraw& d, SkCanvas::VertexMode mode,
+ int vertexCount, const SkPoint verts[],
+ const SkPoint texs[], const SkColor colors[],
+ SkXfermode* xmode, const uint16_t indices[],
+ int indexCount, const SkPaint& paint) {
+ INHERITED::drawVertices(d, mode, vertexCount, verts, texs, colors, xmode, indices, indexCount,
+ paint);
+}
+
+void SkPDFDeviceFlattener::drawDevice(const SkDraw& d, SkBaseDevice* dev, int x, int y,
+ const SkPaint& paint) {
+ INHERITED::drawDevice(d, dev, x, y, paint);
+}
+
+bool SkPDFDeviceFlattener::mustFlatten(const SkDraw& d) const {
+ // TODO(edisonn): testability, add flag to force return true.
+ return d.fMatrix->hasPerspective();
+}
+
+bool SkPDFDeviceFlattener::mustPathText(const SkDraw& d, const SkPaint&) {
+ // TODO(edisonn): testability, add flag to force return true.
+ // TODO(edisonn): TBD: How to flatten MaskFilter.
+ return d.fMatrix->hasPerspective();
+}

Powered by Google App Engine
This is Rietveld 408576698