Use size of SkRect as the key for blur mask cache
authorqiankun.miao <qiankun.miao@intel.com>
Fri, 5 Dec 2014 19:16:25 +0000 (11:16 -0800)
committerCommit bot <commit-bot@chromium.org>
Fri, 5 Dec 2014 19:16:25 +0000 (11:16 -0800)
BUG=429409

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

src/core/SkMaskCache.cpp
src/effects/SkBlurMaskFilter.cpp

index e203081..b4b8b4f 100644 (file)
@@ -104,19 +104,27 @@ public:
         , fQuality(quality)
     {
         SkASSERT(1 == count || 2 == count);
-        fRects[0] = SkRect::MakeEmpty();
-        fRects[1] = SkRect::MakeEmpty();
+        SkIRect ir;
+        rects[0].roundOut(&ir);
+        fSizes[0] = SkSize::Make(0, 0);
+        fSizes[1] = SkSize::Make(0, 0);
+        fSizes[2] = SkSize::Make(0, 0);
+        fSizes[3] = SkSize::Make(rects[0].x() - ir.x(), rects[0].y() - ir.y());
         for (int i = 0; i < count; i++) {
-            fRects[i] = rects[i];
+            fSizes[i] = SkSize::Make(rects[i].width(), rects[i].height());
         }
+        if (2 == count) {
+            fSizes[2] = SkSize::Make(rects[0].x() - rects[1].x(), rects[0].y() - rects[1].y());
+        }
+
         this->init(&gRectsBlurKeyNamespaceLabel,
-                   sizeof(fSigma) + sizeof(fStyle) + sizeof(fQuality) + sizeof(fRects));
+                   sizeof(fSigma) + sizeof(fStyle) + sizeof(fQuality) + sizeof(fSizes));
     }
 
     SkScalar    fSigma;
     int32_t     fStyle;
     int32_t     fQuality;
-    SkRect      fRects[2];
+    SkSize      fSizes[4];
 };
 
 struct RectsBlurRec : public SkResourceCache::Rec {
index 728ba06..f7174e9 100644 (file)
@@ -551,7 +551,7 @@ SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count,
     }
 
     const SkScalar sigma = this->computeXformedSigma(matrix);
-    if (!find_cached_rects(&patch->fMask, sigma, fBlurStyle, this->getQuality(), rects, count)) {
+    if (!find_cached_rects(&patch->fMask, sigma, fBlurStyle, this->getQuality(), smallR, count)) {
         if (count > 1 || !c_analyticBlurNinepatch) {
             if (!draw_rects_into_mask(smallR, count, &srcM)) {
                 return kFalse_FilterReturn;
@@ -568,7 +568,7 @@ SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count,
                 return kFalse_FilterReturn;
             }
         }
-        add_cached_rects(patch->fMask, sigma, fBlurStyle, this->getQuality(), rects, count);
+        add_cached_rects(patch->fMask, sigma, fBlurStyle, this->getQuality(), smallR, count);
     }
     patch->fMask.fBounds.offsetTo(0, 0);
     patch->fOuterRect = dstM.fBounds;