Index: src/core/SkMaskFilter.cpp |
diff --git a/src/core/SkMaskFilter.cpp b/src/core/SkMaskFilter.cpp |
index c9783e76d6113e7bd9abb9a800341a1d83591c42..be4ec9e9e6f3d442231a18fb15075d3c537a5005 100644 |
--- a/src/core/SkMaskFilter.cpp |
+++ b/src/core/SkMaskFilter.cpp |
@@ -10,6 +10,7 @@ |
#include "SkMaskFilter.h" |
#include "SkBlitter.h" |
#include "SkDraw.h" |
+#include "SkMaskCache.h" |
#include "SkRasterClip.h" |
#include "SkRRect.h" |
#include "SkTypes.h" |
@@ -263,9 +264,42 @@ bool SkMaskFilter::filterPath(const SkPath& devPath, const SkMatrix& matrix, |
} |
SkAutoMaskFreeImage autoSrc(srcM.fImage); |
- if (!this->filterMask(&dstM, srcM, matrix, NULL)) { |
- return false; |
+ BlurRec rec; |
+ if (this->asABlur(&rec) && rectCount) { |
+ SkScalar scaledSigma = matrix.mapRadius(rec.fSigma); |
+ if (!SkMaskCache::FindAndCopy(scaledSigma, rec.fStyle, rec.fQuality, |
reed1
2015/01/08 15:51:21
I think it will be easier to read if we change thi
qiankun
2015/01/12 04:36:26
Done.
|
+ rects, rectCount, &dstM)) { |
+ if (!this->filterMask(&dstM, srcM, matrix, NULL)) { |
+ return false; |
+ } |
+ SkMaskCache::AddAndCopy(scaledSigma, rec.fStyle, rec.fQuality, rects, rectCount, dstM); |
+ } else { |
+ // Compute the correct bounds of dst mask if dst mask is got from cache. |
+ SkMask tmpSrc, tmpDst; |
+ tmpSrc = srcM; |
+ tmpSrc.fImage = NULL; |
+ if (!this->filterMask(&tmpDst, tmpSrc, matrix, NULL)) { |
+ return false; |
+ } |
+ |
+ // Fallback to original calculation if size of bounds is different with |
reed1
2015/01/08 15:51:21
I'm afraid I still don't understand the scenario t
qiankun
2015/01/12 04:36:26
It was used to handle clipping bounds. Now, the ne
|
+ // size of the cached mask. |
+ if (dstM.fBounds.width() != tmpDst.fBounds.width() || |
+ dstM.fBounds.height() != tmpDst.fBounds.height()) { |
+ SkMask::FreeImage(dstM.fImage); |
+ if (!this->filterMask(&dstM, srcM, matrix, NULL)) { |
+ return false; |
+ } |
+ } else { |
+ dstM.fBounds = tmpDst.fBounds; |
+ } |
+ } |
+ } else { |
+ if (!this->filterMask(&dstM, srcM, matrix, NULL)) { |
+ return false; |
+ } |
} |
+ |
SkAutoMaskFreeImage autoDst(dstM.fImage); |
// if we get here, we need to (possibly) resolve the clip and blitter |