Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Unified Diff: src/effects/SkBlurMaskFilter.cpp

Issue 471473002: Optimize CSS box-shadow performance (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: add SkMaskCache Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/core/SkScaledImageCache.cpp ('K') | « src/effects/SkBlurMask.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/effects/SkBlurMaskFilter.cpp
diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp
index e4133a8bceff3ec689c253afb671de8a3113c5fe..fb38cdb07fbf2688617ae77d02d19c5c64c3aff9 100644
--- a/src/effects/SkBlurMaskFilter.cpp
+++ b/src/effects/SkBlurMaskFilter.cpp
@@ -11,6 +11,7 @@
#include "SkGpuBlurUtils.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
+#include "SkMaskCache.h"
#include "SkMaskFilter.h"
#include "SkRRect.h"
#include "SkRTConf.h"
@@ -66,6 +67,14 @@ public:
virtual void computeFastBounds(const SkRect&, SkRect*) const SK_OVERRIDE;
virtual bool asABlur(BlurRec*) const SK_OVERRIDE;
+ static bool getCachedBlurMask(SkScalar sigma,
+ unsigned rectCount,
+ const SkRect rects[],
+ SkCachedMask &mask);
+ static bool getCachedBlurMask(SkScalar sigma,
+ const SkRRect rrect,
+ SkCachedMask &mask);
+
SK_TO_STRING_OVERRIDE()
SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBlurMaskFilterImpl)
@@ -115,6 +124,23 @@ private:
const SkScalar SkBlurMaskFilterImpl::kMAX_BLUR_SIGMA = SkIntToScalar(128);
+bool SkBlurMaskFilterImpl::getCachedBlurMask(SkScalar sigma,
reed1 2014/08/25 11:58:42 Do we really need these helper methods? The caller
qiankun 2014/08/26 08:36:33 Done.
+ const SkRRect rrect,
+ SkCachedMask &mask) {
reed1 2014/08/25 11:58:42 skia's convention is to only use reference-paramet
qiankun 2014/08/26 08:36:33 Done.
+ SkMaskCache::ID* cacheId = SkMaskCache::FindAndLock(sigma, rrect, &mask.fMask);
+ mask.fCacheId = cacheId;
reed1 2014/08/25 11:58:42 Skia's convention is to not set the result fields
qiankun 2014/08/26 08:36:33 Done.
+ return cacheId ? true : false;
+}
+
+bool SkBlurMaskFilterImpl::getCachedBlurMask(SkScalar sigma,
+ unsigned rectCount,
+ const SkRect rects[],
+ SkCachedMask &mask) {
+ SkMaskCache::ID* cacheId = SkMaskCache::FindAndLock(sigma, rectCount, rects, &mask.fMask);
+ mask.fCacheId = cacheId;
+ return cacheId ? true : false;
+}
+
SkMaskFilter* SkBlurMaskFilter::Create(SkBlurStyle style, SkScalar sigma, uint32_t flags) {
if (!SkScalarIsFinite(sigma) || sigma <= 0) {
return NULL;
@@ -368,10 +394,21 @@ SkBlurMaskFilterImpl::filterRRectToNine(const SkRRect& rrect, const SkMatrix& ma
radii[SkRRect::kLowerLeft_Corner] = LL;
smallRR.setRectRadii(smallR, radii);
+ SkScalar sigma = this->computeXformedSigma(matrix);
+ SkCachedMask cachedBlurMask;
+ cachedBlurMask.fCacheId = NULL;
+ if (getCachedBlurMask(sigma, rrect, cachedBlurMask)) {
+ patch->fCachedMask = cachedBlurMask;
+ patch->fOuterRect = dstM.fBounds;
+ patch->fCenter.fX = SkScalarCeilToInt(leftUnstretched) + 1;
+ patch->fCenter.fY = SkScalarCeilToInt(topUnstretched) + 1;
+ return kTrue_FilterReturn;
+ }
+
bool analyticBlurWorked = false;
if (c_analyticBlurRRect) {
analyticBlurWorked =
- this->filterRRectMask(&patch->fMask, smallRR, matrix, &margin,
+ this->filterRRectMask(&(patch->fCachedMask.fMask), smallRR, matrix, &margin,
SkMask::kComputeBoundsAndRenderImage_CreateMode);
}
@@ -382,15 +419,20 @@ SkBlurMaskFilterImpl::filterRRectToNine(const SkRRect& rrect, const SkMatrix& ma
SkAutoMaskFreeImage amf(srcM.fImage);
- if (!this->filterMask(&patch->fMask, srcM, matrix, &margin)) {
+ if (!this->filterMask(&(patch->fCachedMask.fMask), srcM, matrix, &margin)) {
return kFalse_FilterReturn;
}
}
- patch->fMask.fBounds.offsetTo(0, 0);
+ patch->fCachedMask.fMask.fBounds.offsetTo(0, 0);
patch->fOuterRect = dstM.fBounds;
patch->fCenter.fX = SkScalarCeilToInt(leftUnstretched) + 1;
patch->fCenter.fY = SkScalarCeilToInt(topUnstretched) + 1;
+ if (!cachedBlurMask.fCacheId) {
+ patch->fCachedMask.fCacheId = SkMaskCache::AddAndLock(sigma, rrect,
+ patch->fCachedMask.fMask);
+ }
+
return kTrue_FilterReturn;
}
@@ -470,6 +512,16 @@ SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count,
smallH + (innerIR.top() - srcM.fBounds.top()));
}
+ SkScalar sigma = this->computeXformedSigma(matrix);
+ SkCachedMask cachedBlurMask;
+ cachedBlurMask.fCacheId = NULL;
+ if (getCachedBlurMask(sigma, count, rects, cachedBlurMask)) {
+ patch->fCachedMask = cachedBlurMask;
+ patch->fOuterRect = dstM.fBounds;
+ patch->fCenter = center;
+ return kTrue_FilterReturn;
+ }
+
// +1 so we get a clean, stretchable, center row/col
smallW += 1;
smallH += 1;
@@ -498,21 +550,25 @@ SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count,
if (!draw_rects_into_mask(smallR, count, &srcM)) {
return kFalse_FilterReturn;
}
-
SkAutoMaskFreeImage amf(srcM.fImage);
- if (!this->filterMask(&patch->fMask, srcM, matrix, &margin)) {
+ if (!this->filterMask(&patch->fCachedMask.fMask, srcM, matrix, &margin)) {
return kFalse_FilterReturn;
}
} else {
- if (!this->filterRectMask(&patch->fMask, smallR[0], matrix, &margin,
+ if (!this->filterRectMask(&patch->fCachedMask.fMask, smallR[0], matrix, &margin,
SkMask::kComputeBoundsAndRenderImage_CreateMode)) {
return kFalse_FilterReturn;
}
}
- patch->fMask.fBounds.offsetTo(0, 0);
+ patch->fCachedMask.fMask.fBounds.offsetTo(0, 0);
patch->fOuterRect = dstM.fBounds;
patch->fCenter = center;
+ if (!cachedBlurMask.fCacheId) {
+ patch->fCachedMask.fCacheId = SkMaskCache::AddAndLock(sigma, count, rects,
+ patch->fCachedMask.fMask);
+ }
+
return kTrue_FilterReturn;
}
« src/core/SkScaledImageCache.cpp ('K') | « src/effects/SkBlurMask.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698