diff options
-rw-r--r-- | src/core/SkMaskCache.cpp | 50 | ||||
-rw-r--r-- | src/core/SkMaskCache.h | 19 | ||||
-rw-r--r-- | src/core/SkMaskFilter.cpp | 37 | ||||
-rw-r--r-- | src/effects/SkBlurMaskFilter.cpp | 62 |
4 files changed, 58 insertions, 110 deletions
diff --git a/src/core/SkMaskCache.cpp b/src/core/SkMaskCache.cpp index 207ea0e77d..b4b8b4faf3 100644 --- a/src/core/SkMaskCache.cpp +++ b/src/core/SkMaskCache.cpp @@ -18,28 +18,6 @@ struct MaskValue { namespace { static unsigned gRRectBlurKeyNamespaceLabel; -static bool copy_cacheddata_to_mask(SkCachedData* data, SkMask* mask) { - const size_t size = data->size(); - SkASSERT(mask->computeTotalImageSize() <= size); - - mask->fImage = SkMask::AllocImage(size); - if (mask->fImage) { - memcpy(mask->fImage, data->data(), size); - return true; - } - return false; -} - -static SkCachedData* copy_mask_to_cacheddata(const SkMask& mask) { - const size_t size = mask.computeTotalImageSize(); - SkCachedData* data = SkResourceCache::NewCachedData(size); - if (data) { - memcpy(data->writable_data(), mask.fImage, size); - return data; - } - return NULL; -} - struct RRectBlurKey : public SkResourceCache::Key { public: RRectBlurKey(SkScalar sigma, const SkRRect& rrect, SkBlurStyle style, SkBlurQuality quality) @@ -112,20 +90,6 @@ void SkMaskCache::Add(SkScalar sigma, SkBlurStyle style, SkBlurQuality quality, return CHECK_LOCAL(localCache, add, Add, SkNEW_ARGS(RRectBlurRec, (key, mask, data))); } -bool SkMaskCache::FindAndCopy(SkScalar sigma, SkBlurStyle style, SkBlurQuality quality, - const SkRRect& rrect, SkMask* mask) { - SkAutoTUnref<SkCachedData> data(SkMaskCache::FindAndRef(sigma, style, quality, rrect, mask)); - return data.get() && copy_cacheddata_to_mask(data, mask); -} - -void SkMaskCache::AddAndCopy(SkScalar sigma, SkBlurStyle style, SkBlurQuality quality, - const SkRRect& rrect, const SkMask& mask) { - SkAutoTUnref<SkCachedData> data(copy_mask_to_cacheddata(mask)); - if (data.get()) { - SkMaskCache::Add(sigma, style, quality, rrect, mask, data); - } -} - ////////////////////////////////////////////////////////////////////////////////////////// namespace { @@ -217,17 +181,3 @@ void SkMaskCache::Add(SkScalar sigma, SkBlurStyle style, SkBlurQuality quality, RectsBlurKey key(sigma, style, quality, rects, count); return CHECK_LOCAL(localCache, add, Add, SkNEW_ARGS(RectsBlurRec, (key, mask, data))); } - -bool SkMaskCache::FindAndCopy(SkScalar sigma, SkBlurStyle style, SkBlurQuality quality, - const SkRect rects[], int count, SkMask* mask) { - SkAutoTUnref<SkCachedData> data(SkMaskCache::FindAndRef(sigma, style, quality, rects, count, mask)); - return data.get() && copy_cacheddata_to_mask(data, mask); -} - -void SkMaskCache::AddAndCopy(SkScalar sigma, SkBlurStyle style, SkBlurQuality quality, - const SkRect rects[], int count, const SkMask& mask) { - SkAutoTUnref<SkCachedData> data(copy_mask_to_cacheddata(mask)); - if (data.get()) { - SkMaskCache::Add(sigma, style, quality, rects, count, mask, data); - } -} diff --git a/src/core/SkMaskCache.h b/src/core/SkMaskCache.h index 2cfb971dde..f98387b206 100644 --- a/src/core/SkMaskCache.h +++ b/src/core/SkMaskCache.h @@ -39,25 +39,6 @@ public: static void Add(SkScalar sigma, SkBlurStyle style, SkBlurQuality quality, const SkRect rects[], int count, const SkMask& mask, SkCachedData* data, SkResourceCache* localCache = NULL); - - /** - * On success, set mask with cached value, allocate memory for mask->fImage, - * copy pixels from SkCachedData in the cache to mask->fImage, then return true. - * - * On failure, return false, no memory allocated for mask->fImage. - */ - static bool FindAndCopy(SkScalar sigma, SkBlurStyle style, SkBlurQuality quality, - const SkRRect& rrect, SkMask* mask); - static bool FindAndCopy(SkScalar sigma, SkBlurStyle style, SkBlurQuality quality, - const SkRect rects[], int count, SkMask* mask); - - /** - * Create a new SkCachedData, copy pixels from mask.fImage to it, then add it into cache. - */ - static void AddAndCopy(SkScalar sigma, SkBlurStyle style, SkBlurQuality quality, - const SkRRect& rrect, const SkMask& mask); - static void AddAndCopy(SkScalar sigma, SkBlurStyle style, SkBlurQuality quality, - const SkRect rects[], int count, const SkMask& mask); }; #endif diff --git a/src/core/SkMaskFilter.cpp b/src/core/SkMaskFilter.cpp index 3a4e3a41e9..c9783e76d6 100644 --- a/src/core/SkMaskFilter.cpp +++ b/src/core/SkMaskFilter.cpp @@ -10,7 +10,6 @@ #include "SkMaskFilter.h" #include "SkBlitter.h" #include "SkDraw.h" -#include "SkMaskCache.h" #include "SkRasterClip.h" #include "SkRRect.h" #include "SkTypes.h" @@ -264,41 +263,9 @@ bool SkMaskFilter::filterPath(const SkPath& devPath, const SkMatrix& matrix, } SkAutoMaskFreeImage autoSrc(srcM.fImage); - BlurRec rec; - if (this->asABlur(&rec) && rectCount) { - SkScalar scaledSigma = matrix.mapRadius(rec.fSigma); - if (!SkMaskCache::FindAndCopy(scaledSigma, rec.fStyle, rec.fQuality, - 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 - // size of the cached mask. - if (dstM.fBounds.width() != tmpDst.fBounds.width() || - dstM.fBounds.height() != tmpDst.fBounds.height()) { - if (!this->filterMask(&dstM, srcM, matrix, NULL)) { - return false; - } - } else { - dstM.fBounds = tmpDst.fBounds; - } - } - } else { - if (!this->filterMask(&dstM, srcM, matrix, NULL)) { - return false; - } + 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 diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp index 38b2acca9e..97ae436367 100644 --- a/src/effects/SkBlurMaskFilter.cpp +++ b/src/effects/SkBlurMaskFilter.cpp @@ -11,7 +11,6 @@ #include "SkGpuBlurUtils.h" #include "SkReadBuffer.h" #include "SkWriteBuffer.h" -#include "SkMaskCache.h" #include "SkMaskFilter.h" #include "SkRRect.h" #include "SkRTConf.h" @@ -261,6 +260,58 @@ static bool rect_exceeds(const SkRect& r, SkScalar v) { r.width() > v || r.height() > v; } +#include "SkMaskCache.h" + +static bool copy_cacheddata_to_mask(SkCachedData* data, SkMask* mask) { + const size_t size = data->size(); + SkASSERT(mask->computeTotalImageSize() <= size); + + mask->fImage = SkMask::AllocImage(size); + if (mask->fImage) { + memcpy(mask->fImage, data->data(), size); + return true; + } + return false; +} + +static SkCachedData* copy_mask_to_cacheddata(const SkMask& mask) { + const size_t size = mask.computeTotalImageSize(); + SkCachedData* data = SkResourceCache::NewCachedData(size); + if (data) { + memcpy(data->writable_data(), mask.fImage, size); + return data; + } + return NULL; +} + +static bool find_cached_rrect(SkMask* mask, SkScalar sigma, SkBlurStyle style, + SkBlurQuality quality, const SkRRect& rrect) { + SkAutoTUnref<SkCachedData> data(SkMaskCache::FindAndRef(sigma, style, quality, rrect, mask)); + return data.get() && copy_cacheddata_to_mask(data, mask); +} + +static void add_cached_rrect(const SkMask& mask, SkScalar sigma, SkBlurStyle style, + SkBlurQuality quality, const SkRRect& rrect) { + SkAutoTUnref<SkCachedData> data(copy_mask_to_cacheddata(mask)); + if (data.get()) { + SkMaskCache::Add(sigma, style, quality, rrect, mask, data); + } +} + +static bool find_cached_rects(SkMask* mask, SkScalar sigma, SkBlurStyle style, + SkBlurQuality quality, const SkRect rects[], int count) { + SkAutoTUnref<SkCachedData> data(SkMaskCache::FindAndRef(sigma, style, quality, rects, count, mask)); + return data.get() && copy_cacheddata_to_mask(data, mask); +} + +static void add_cached_rects(const SkMask& mask, SkScalar sigma, SkBlurStyle style, + SkBlurQuality quality, const SkRect rects[], int count) { + SkAutoTUnref<SkCachedData> data(copy_mask_to_cacheddata(mask)); + if (data.get()) { + SkMaskCache::Add(sigma, style, quality, rects, count, mask, data); + } +} + #ifdef SK_IGNORE_FAST_RRECT_BLUR SK_CONF_DECLARE( bool, c_analyticBlurRRect, "mask.filter.blur.analyticblurrrect", false, "Use the faster analytic blur approach for ninepatch rects" ); #else @@ -369,7 +420,7 @@ SkBlurMaskFilterImpl::filterRRectToNine(const SkRRect& rrect, const SkMatrix& ma smallRR.setRectRadii(smallR, radii); const SkScalar sigma = this->computeXformedSigma(matrix); - if (!SkMaskCache::FindAndCopy(sigma, fBlurStyle, this->getQuality(), smallRR, &patch->fMask)) { + if (!find_cached_rrect(&patch->fMask, sigma, fBlurStyle, this->getQuality(), smallRR)) { bool analyticBlurWorked = false; if (c_analyticBlurRRect) { analyticBlurWorked = @@ -388,7 +439,7 @@ SkBlurMaskFilterImpl::filterRRectToNine(const SkRRect& rrect, const SkMatrix& ma return kFalse_FilterReturn; } } - SkMaskCache::AddAndCopy(sigma, fBlurStyle, this->getQuality(), smallRR, patch->fMask); + add_cached_rrect(patch->fMask, sigma, fBlurStyle, this->getQuality(), smallRR); } patch->fMask.fBounds.offsetTo(0, 0); @@ -499,8 +550,7 @@ SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count, } const SkScalar sigma = this->computeXformedSigma(matrix); - if (!SkMaskCache::FindAndCopy(sigma, fBlurStyle, this->getQuality(), - smallR, count, &patch->fMask)) { + 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; @@ -517,7 +567,7 @@ SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count, return kFalse_FilterReturn; } } - SkMaskCache::AddAndCopy(sigma, fBlurStyle, this->getQuality(), smallR, count, patch->fMask); + add_cached_rects(patch->fMask, sigma, fBlurStyle, this->getQuality(), smallR, count); } patch->fMask.fBounds.offsetTo(0, 0); patch->fOuterRect = dstM.fBounds; |