| Index: src/effects/SkBlurMaskFilter.cpp
|
| diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp
|
| index d284717f936a34bc92514949f58c302cdc38cf59..c33edc2ee182f0ec98a69c64d21f6ab0cbb26b85 100644
|
| --- a/src/effects/SkBlurMaskFilter.cpp
|
| +++ b/src/effects/SkBlurMaskFilter.cpp
|
| @@ -262,54 +262,43 @@ static bool rect_exceeds(const SkRect& r, SkScalar 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();
|
| +static SkCachedData* copy_mask_to_cacheddata(SkMask* mask) {
|
| + const size_t size = mask->computeTotalImageSize();
|
| SkCachedData* data = SkResourceCache::NewCachedData(size);
|
| if (data) {
|
| - memcpy(data->writable_data(), mask.fImage, size);
|
| - return data;
|
| + memcpy(data->writable_data(), mask->fImage, size);
|
| + SkMask::FreeImage(mask->fImage);
|
| + mask->fImage = (uint8_t*)data->data();
|
| }
|
| - return NULL;
|
| + return data;
|
| }
|
|
|
| -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 SkCachedData* find_cached_rrect(SkMask* mask, SkScalar sigma, SkBlurStyle style,
|
| + SkBlurQuality quality, const SkRRect& rrect) {
|
| + return SkMaskCache::FindAndRef(sigma, style, quality, rrect, 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 SkCachedData* add_cached_rrect(SkMask* mask, SkScalar sigma, SkBlurStyle style,
|
| + SkBlurQuality quality, const SkRRect& rrect) {
|
| + SkCachedData* cache = copy_mask_to_cacheddata(mask);
|
| + if (cache) {
|
| + SkMaskCache::Add(sigma, style, quality, rrect, *mask, cache);
|
| }
|
| + return cache;
|
| }
|
|
|
| -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 SkCachedData* find_cached_rects(SkMask* mask, SkScalar sigma, SkBlurStyle style,
|
| + SkBlurQuality quality, const SkRect rects[], int count) {
|
| + return SkMaskCache::FindAndRef(sigma, style, quality, rects, count, 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);
|
| +static SkCachedData* add_cached_rects(SkMask* mask, SkScalar sigma, SkBlurStyle style,
|
| + SkBlurQuality quality, const SkRect rects[], int count) {
|
| + SkCachedData* cache = copy_mask_to_cacheddata(mask);
|
| + if (cache) {
|
| + SkMaskCache::Add(sigma, style, quality, rects, count, *mask, cache);
|
| }
|
| + return cache;
|
| }
|
|
|
| #ifdef SK_IGNORE_FAST_RRECT_BLUR
|
| @@ -420,7 +409,9 @@ SkBlurMaskFilterImpl::filterRRectToNine(const SkRRect& rrect, const SkMatrix& ma
|
| smallRR.setRectRadii(smallR, radii);
|
|
|
| const SkScalar sigma = this->computeXformedSigma(matrix);
|
| - if (!find_cached_rrect(&patch->fMask, sigma, fBlurStyle, this->getQuality(), smallRR)) {
|
| + SkCachedData* cache = find_cached_rrect(&patch->fMask, sigma, fBlurStyle,
|
| + this->getQuality(), smallRR);
|
| + if (!cache) {
|
| bool analyticBlurWorked = false;
|
| if (c_analyticBlurRRect) {
|
| analyticBlurWorked =
|
| @@ -439,13 +430,15 @@ SkBlurMaskFilterImpl::filterRRectToNine(const SkRRect& rrect, const SkMatrix& ma
|
| return kFalse_FilterReturn;
|
| }
|
| }
|
| - add_cached_rrect(patch->fMask, sigma, fBlurStyle, this->getQuality(), smallRR);
|
| + cache = add_cached_rrect(&patch->fMask, sigma, fBlurStyle, this->getQuality(), smallRR);
|
| }
|
|
|
| patch->fMask.fBounds.offsetTo(0, 0);
|
| patch->fOuterRect = dstM.fBounds;
|
| patch->fCenter.fX = SkScalarCeilToInt(leftUnstretched) + 1;
|
| patch->fCenter.fY = SkScalarCeilToInt(topUnstretched) + 1;
|
| + SkASSERT(NULL == patch->fCache);
|
| + patch->fCache = cache; // transfer ownership to patch
|
| return kTrue_FilterReturn;
|
| }
|
|
|
| @@ -550,7 +543,9 @@ SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count,
|
| }
|
|
|
| const SkScalar sigma = this->computeXformedSigma(matrix);
|
| - if (!find_cached_rects(&patch->fMask, sigma, fBlurStyle, this->getQuality(), smallR, count)) {
|
| + SkCachedData* cache = find_cached_rects(&patch->fMask, sigma, fBlurStyle,
|
| + this->getQuality(), smallR, count);
|
| + if (!cache) {
|
| if (count > 1 || !c_analyticBlurNinepatch) {
|
| if (!draw_rects_into_mask(smallR, count, &srcM)) {
|
| return kFalse_FilterReturn;
|
| @@ -567,11 +562,13 @@ SkBlurMaskFilterImpl::filterRectsToNine(const SkRect rects[], int count,
|
| return kFalse_FilterReturn;
|
| }
|
| }
|
| - add_cached_rects(patch->fMask, sigma, fBlurStyle, this->getQuality(), smallR, count);
|
| + cache = add_cached_rects(&patch->fMask, sigma, fBlurStyle, this->getQuality(), smallR, count);
|
| }
|
| patch->fMask.fBounds.offsetTo(0, 0);
|
| patch->fOuterRect = dstM.fBounds;
|
| patch->fCenter = center;
|
| + SkASSERT(NULL == patch->fCache);
|
| + patch->fCache = cache; // transfer ownership to patch
|
| return kTrue_FilterReturn;
|
| }
|
|
|
|
|