[PDF] Fix regression - correct for fInitialTrnasform in form xobjects.
authorvandebo@chromium.org <vandebo@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 24 May 2011 23:02:07 +0000 (23:02 +0000)
committervandebo@chromium.org <vandebo@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Tue, 24 May 2011 23:02:07 +0000 (23:02 +0000)
Chrome bug http://crbug.com/83658

Review URL: http://codereview.appspot.com/4550072

git-svn-id: http://skia.googlecode.com/svn/trunk@1415 2bbb7eff-a529-9590-31e7-b0007b416f81

include/pdf/SkPDFDevice.h
src/pdf/SkPDFFormXObject.cpp

index 7d093dc..1ddf216 100644 (file)
@@ -137,6 +137,8 @@ public:
      */
     SkStream* content() const;
 
+    const SkMatrix& initialTransform() const { return fInitialTransform; }
+
 protected:
     // override
     virtual SkDeviceFactory* onNewDeviceFactory();
index 70f166c..40a5564 100644 (file)
@@ -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<SkPDFDict> group = new SkPDFDict("Group");