| Index: src/core/SkImageFilter.cpp
|
| diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp
|
| index 9fca5cf6c9d65ddc7580fffa13252b8328fe3fc3..94d6ab6a16567fe0d681c77b56ccee5d2b65752e 100644
|
| --- a/src/core/SkImageFilter.cpp
|
| +++ b/src/core/SkImageFilter.cpp
|
| @@ -13,12 +13,10 @@
|
| #include "SkDevice.h"
|
| #include "SkLocalMatrixImageFilter.h"
|
| #include "SkMatrixImageFilter.h"
|
| -#include "SkMutex.h"
|
| #include "SkOncePtr.h"
|
| #include "SkReadBuffer.h"
|
| #include "SkRect.h"
|
| #include "SkTDynamicHash.h"
|
| -#include "SkTHash.h"
|
| #include "SkTInternalLList.h"
|
| #include "SkValidationUtils.h"
|
| #include "SkWriteBuffer.h"
|
| @@ -197,7 +195,7 @@ SkImageFilter::~SkImageFilter() {
|
| SkSafeUnref(fInputs[i]);
|
| }
|
| delete[] fInputs;
|
| - Cache::Get()->purgeByImageFilterId(fUniqueID);
|
| + Cache::Get()->purgeByKeys(fCacheKeys.begin(), fCacheKeys.count());
|
| }
|
|
|
| SkImageFilter::SkImageFilter(int inputCount, SkReadBuffer& buffer)
|
| @@ -253,6 +251,8 @@ bool SkImageFilter::filterImage(Proxy* proxy, const SkBitmap& src,
|
| this->onFilterImage(proxy, src, context, result, offset)) {
|
| if (context.cache()) {
|
| context.cache()->set(key, *result, *offset);
|
| + SkAutoMutexAcquire mutex(fMutex);
|
| + fCacheKeys.push_back(key);
|
| }
|
| return true;
|
| }
|
| @@ -547,7 +547,6 @@ public:
|
| ++iter;
|
| delete v;
|
| }
|
| - fIdToKeys.foreach([](uint32_t, SkTArray<Key>** array) { delete *array; });
|
| }
|
| struct Value {
|
| Value(const Key& key, const SkBitmap& bitmap, const SkIPoint& offset)
|
| @@ -582,13 +581,6 @@ public:
|
| removeInternal(v);
|
| }
|
| Value* v = new Value(key, result, offset);
|
| - if (SkTArray<Key>** array = fIdToKeys.find(key.fUniqueID)) {
|
| - (*array)->push_back(key);
|
| - } else {
|
| - SkTArray<Key>* keyArray = new SkTArray<Key>();
|
| - keyArray->push_back(key);
|
| - fIdToKeys.set(key.fUniqueID, keyArray);
|
| - }
|
| fLookup.add(v);
|
| fLRU.addToHead(v);
|
| fCurrentBytes += result.getSize();
|
| @@ -611,16 +603,12 @@ public:
|
| }
|
| }
|
|
|
| - void purgeByImageFilterId(uint32_t uniqueID) override {
|
| + void purgeByKeys(const Key keys[], int count) override {
|
| SkAutoMutexAcquire mutex(fMutex);
|
| - if (SkTArray<Key>** array = fIdToKeys.find(uniqueID)) {
|
| - for (auto& key : **array) {
|
| - if (Value* v = fLookup.find(key)) {
|
| - this->removeInternal(v);
|
| - }
|
| + for (int i = 0; i < count; i++) {
|
| + if (Value* v = fLookup.find(keys[i])) {
|
| + this->removeInternal(v);
|
| }
|
| - fIdToKeys.remove(uniqueID);
|
| - delete *array; // This can be deleted outside the lock
|
| }
|
| }
|
|
|
| @@ -633,7 +621,6 @@ private:
|
| }
|
| private:
|
| SkTDynamicHash<Value, Key> fLookup;
|
| - SkTHashMap<uint32_t, SkTArray<Key>*> fIdToKeys;
|
| mutable SkTInternalLList<Value> fLRU;
|
| size_t fMaxBytes;
|
| size_t fCurrentBytes;
|
|
|