aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects/SkBlurMaskFilter.cpp
diff options
context:
space:
mode:
authorGravatar reed <reed@google.com>2015-02-04 09:07:17 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-02-04 09:07:17 -0800
commitb0df8be137d8fb49436e46d1fd1a5aec8b7ab562 (patch)
treeb56df14fae666ac8c6c56ee3fe7d6bdc8d64f4f2 /src/effects/SkBlurMaskFilter.cpp
parent1a481fe4bf632ed4f76cb337691236fabfd4ab03 (diff)
return reference to cache instead of copying the mask
Diffstat (limited to 'src/effects/SkBlurMaskFilter.cpp')
-rw-r--r--src/effects/SkBlurMaskFilter.cpp75
1 files changed, 36 insertions, 39 deletions
diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp
index d284717f93..c33edc2ee1 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;
}