diff --git a/include/pdf/SkPDFDevice.h b/include/pdf/SkPDFDevice.h index 7d093dc5d9..1ddf2167f0 100644 --- a/include/pdf/SkPDFDevice.h +++ b/include/pdf/SkPDFDevice.h @@ -137,6 +137,8 @@ public: */ SkStream* content() const; + const SkMatrix& initialTransform() const { return fInitialTransform; } + protected: // override virtual SkDeviceFactory* onNewDeviceFactory(); diff --git a/src/pdf/SkPDFFormXObject.cpp b/src/pdf/SkPDFFormXObject.cpp index 70f166c1a9..40a5564847 100644 --- a/src/pdf/SkPDFFormXObject.cpp +++ b/src/pdf/SkPDFFormXObject.cpp @@ -19,6 +19,7 @@ #include "SkMatrix.h" #include "SkPDFCatalog.h" #include "SkPDFDevice.h" +#include "SkPDFUtils.h" #include "SkStream.h" #include "SkTypes.h" @@ -38,6 +39,16 @@ SkPDFFormXObject::SkPDFFormXObject(SkPDFDevice* device) { insert("BBox", device->getMediaBox().get()); insert("Resources", device->getResourceDict().get()); + // We invert the initial transform and apply that to the xobject so that + // it doesn't get applied twice. We can't just undo it because it's + // embedded in things like shaders and images. + if (!device->initialTransform().isIdentity()) { + SkMatrix inverse; + inverse.reset(); + device->initialTransform().invert(&inverse); + insert("Matrix", SkPDFUtils::MatrixToArray(inverse))->unref(); + } + // Right now SkPDFFormXObject is only used for saveLayer, which implies // isolated blending. Do this conditionally if that changes. SkRefPtr group = new SkPDFDict("Group");