aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/SkImageFilter.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp
index 4c4b56beac..b67fbe01e7 100644
--- a/src/core/SkImageFilter.cpp
+++ b/src/core/SkImageFilter.cpp
@@ -379,7 +379,10 @@ static uint32_t compute_hash(const uint32_t* data, int count) {
class CacheImpl : public SkImageFilter::Cache {
public:
- explicit CacheImpl(int minChildren) : fMinChildren(minChildren) {}
+ explicit CacheImpl(int minChildren) : fMinChildren(minChildren) {
+ SkASSERT(fMinChildren <= 2);
+ }
+
virtual ~CacheImpl();
bool get(const SkImageFilter* key, SkBitmap* result, SkIPoint* offset) SK_OVERRIDE;
void set(const SkImageFilter* key, const SkBitmap& result, const SkIPoint& offset) SK_OVERRIDE;
@@ -422,7 +425,10 @@ void CacheImpl::remove(const SkImageFilter* key) {
}
void CacheImpl::set(const SkImageFilter* key, const SkBitmap& result, const SkIPoint& offset) {
- if (key->getRefCnt() >= fMinChildren) {
+ if (fMinChildren < 2 || !key->unique()) {
+ // We take !key->unique() as a signal that there are probably at least 2 refs on the key,
+ // meaning this filter probably has at least two children and is worth caching when
+ // fMinChildren is 2. If fMinChildren is less than two, we'll just always cache.
fData.add(new Value(key, result, offset));
}
}