Use SkShader's localMat for SkLocalMatrixShader.
authorscroggo <scroggo@google.com>
Fri, 11 Jul 2014 17:42:12 +0000 (10:42 -0700)
committerCommit bot <commit-bot@chromium.org>
Fri, 11 Jul 2014 17:42:12 +0000 (10:42 -0700)
Instead of setting SkShader::fLocalMatrix to Identity and storing
a separate SkMatrix inside SkLocalMatrixShader, reuse
SkShader::fLocalMatrix.

R=reed@google.com

Author: scroggo@google.com

Review URL: https://codereview.chromium.org/386693003

include/core/SkPicture.h
include/core/SkReadBuffer.h
include/core/SkShader.h
src/core/SkLocalMatrixShader.cpp
src/core/SkLocalMatrixShader.h

index ca26eb44962c381687b13fa5d44beffa3addef16..03d983fe5843b68f75841ac59612e55fc060f67f 100644 (file)
@@ -231,13 +231,14 @@ private:
     // V27: Remove SkUnitMapper from gradients (and skia).
     // V28: No longer call bitmap::flatten inside SkWriteBuffer::writeBitmap.
     // V29: Removed SaveFlags parameter from save().
+    // V30: Remove redundant SkMatrix from SkLocalMatrixShader.
 
     // Note: If the picture version needs to be increased then please follow the
     // steps to generate new SKPs in (only accessible to Googlers): http://goo.gl/qATVcw
 
     // Only SKPs within the min/current picture version range (inclusive) can be read.
     static const uint32_t MIN_PICTURE_VERSION = 19;
-    static const uint32_t CURRENT_PICTURE_VERSION = 29;
+    static const uint32_t CURRENT_PICTURE_VERSION = 30;
 
     mutable uint32_t      fUniqueID;
 
index 5db86345ad7ce1b110d4d5d071eb5feb2d657b63..faf7eb81a5727e0253b363558668d7dce865f37d 100644 (file)
@@ -45,6 +45,7 @@ public:
         kColorShaderNoBool_Version         = 26,
         kNoUnitMappers_Version             = 27,
         kNoMoreBitmapFlatten_Version       = 28,
+        kSimplifyLocalMatrix_Version       = 30,
     };
 
     /**
index 8871f1b02131daac82f4aaf43d52721c532dc846..33a7a15b0f01b2f1628cb155331fba9ab0ede34a 100644 (file)
@@ -41,11 +41,17 @@ public:
 
     /**
      *  Returns the local matrix.
+     *
+     *  FIXME: This can be incorrect for a Shader with its own local matrix
+     *  that is also wrapped via CreateLocalMatrixShader.
      */
     const SkMatrix& getLocalMatrix() const { return fLocalMatrix; }
 
     /**
      *  Returns true if the local matrix is not an identity matrix.
+     *
+     *  FIXME: This can be incorrect for a Shader with its own local matrix
+     *  that is also wrapped via CreateLocalMatrixShader.
      */
     bool hasLocalMatrix() const { return !fLocalMatrix.isIdentity(); }
 
@@ -474,7 +480,10 @@ protected:
 
 private:
     SkMatrix fLocalMatrix;
-    
+
+    // So the SkLocalMatrixShader can whack fLocalMatrix in its SkReadBuffer constructor.
+    friend class SkLocalMatrixShader;
+
     typedef SkFlattenable INHERITED;
 };
 
index 53580e6ac953f48cc983a59116b6996953f221c1..c77f38d6d68bcf53d6a230bce164d3f8a32a6ce3 100644 (file)
@@ -8,7 +8,9 @@
 #include "SkLocalMatrixShader.h"
 
 SkLocalMatrixShader::SkLocalMatrixShader(SkReadBuffer& buffer) : INHERITED(buffer) {
-    buffer.readMatrix(&fProxyLocalMatrix);
+    if (buffer.isVersionLT(SkReadBuffer::kSimplifyLocalMatrix_Version)) {
+        buffer.readMatrix(&(INHERITED::fLocalMatrix));
+    }
     fProxyShader.reset(buffer.readShader());
     if (NULL == fProxyShader.get()) {
         sk_throw();
@@ -17,7 +19,6 @@ SkLocalMatrixShader::SkLocalMatrixShader(SkReadBuffer& buffer) : INHERITED(buffe
 
 void SkLocalMatrixShader::flatten(SkWriteBuffer& buffer) const {
     this->INHERITED::flatten(buffer);
-    buffer.writeMatrix(fProxyLocalMatrix);
     buffer.writeFlattenable(fProxyShader.get());
 }
 
@@ -26,10 +27,10 @@ SkShader::Context* SkLocalMatrixShader::onCreateContext(const ContextRec& rec,
     ContextRec newRec(rec);
     SkMatrix tmp;
     if (rec.fLocalMatrix) {
-        tmp.setConcat(fProxyLocalMatrix, *rec.fLocalMatrix);
+        tmp.setConcat(this->getLocalMatrix(), *rec.fLocalMatrix);
         newRec.fLocalMatrix = &tmp;
     } else {
-        newRec.fLocalMatrix = &fProxyLocalMatrix;
+        newRec.fLocalMatrix = &this->getLocalMatrix();
     }
     return fProxyShader->createContext(newRec, storage);
 }
index b56cd4726fb4beaaa00cccdae19ff70fe3366708..7eb7c1337aa1ae830b13ca241668411276828a01 100644 (file)
@@ -15,8 +15,8 @@
 class SkLocalMatrixShader : public SkShader {
 public:
     SkLocalMatrixShader(SkShader* proxy, const SkMatrix& localMatrix)
-    : fProxyShader(SkRef(proxy))
-    , fProxyLocalMatrix(localMatrix)
+    : INHERITED(&localMatrix)
+    , fProxyShader(SkRef(proxy))
     {}
 
     virtual size_t contextSize() const SK_OVERRIDE {
@@ -36,7 +36,7 @@ public:
     
     virtual bool asNewEffect(GrContext* context, const SkPaint& paint, const SkMatrix* localMatrix,
                              GrColor* grColor, GrEffect** grEffect) const SK_OVERRIDE {
-        SkMatrix tmp = fProxyLocalMatrix;
+        SkMatrix tmp = this->getLocalMatrix();
         if (localMatrix) {
             tmp.preConcat(*localMatrix);
         }
@@ -55,7 +55,7 @@ public:
     
     virtual SkShader* refAsALocalMatrixShader(SkMatrix* localMatrix) const SK_OVERRIDE {
         if (localMatrix) {
-            *localMatrix = fProxyLocalMatrix;
+            *localMatrix = this->getLocalMatrix();
         }
         return SkRef(fProxyShader.get());
     }
@@ -70,7 +70,6 @@ protected:
 
 private:
     SkAutoTUnref<SkShader> fProxyShader;
-    SkMatrix  fProxyLocalMatrix;
 
     typedef SkShader INHERITED;
 };