| Index: src/core/SkImageFilter.cpp
|
| diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp
|
| index fdd78f8f73a062c79d1c31c11dc83e0c6c28c9df..e19a504be9b808d087327c3b47045cfb46a44845 100644
|
| --- a/src/core/SkImageFilter.cpp
|
| +++ b/src/core/SkImageFilter.cpp
|
| @@ -6,20 +6,16 @@
|
| */
|
|
|
| #include "SkImageFilter.h"
|
| -#include "SkImageFilterCacheKey.h"
|
|
|
| #include "SkCanvas.h"
|
| -#include "SkChecksum.h"
|
| #include "SkFuzzLogging.h"
|
| +#include "SkImageFilterCache.h"
|
| #include "SkLocalMatrixImageFilter.h"
|
| #include "SkMatrixImageFilter.h"
|
| -#include "SkOncePtr.h"
|
| #include "SkReadBuffer.h"
|
| #include "SkRect.h"
|
| #include "SkSpecialImage.h"
|
| #include "SkSpecialSurface.h"
|
| -#include "SkTDynamicHash.h"
|
| -#include "SkTInternalLList.h"
|
| #include "SkValidationUtils.h"
|
| #include "SkWriteBuffer.h"
|
| #if SK_SUPPORT_GPU
|
| @@ -27,12 +23,6 @@
|
| #include "GrDrawContext.h"
|
| #endif
|
|
|
| -#ifdef SK_BUILD_FOR_IOS
|
| - enum { kDefaultCacheSize = 2 * 1024 * 1024 };
|
| -#else
|
| - enum { kDefaultCacheSize = 128 * 1024 * 1024 };
|
| -#endif
|
| -
|
| #ifndef SK_IGNORE_TO_STRING
|
| void SkImageFilter::CropRect::toString(SkString* str) const {
|
| if (!fFlags) {
|
| @@ -179,7 +169,7 @@ SkImageFilter::SkImageFilter(sk_sp<SkImageFilter>* inputs,
|
| }
|
|
|
| SkImageFilter::~SkImageFilter() {
|
| - Cache::Get()->purgeByKeys(fCacheKeys.begin(), fCacheKeys.count());
|
| + SkImageFilterCache::Get()->purgeByKeys(fCacheKeys.begin(), fCacheKeys.count());
|
| }
|
|
|
| SkImageFilter::SkImageFilter(int inputCount, SkReadBuffer& buffer)
|
| @@ -211,7 +201,7 @@ sk_sp<SkSpecialImage> SkImageFilter::filterImage(SkSpecialImage* src, const Cont
|
|
|
| uint32_t srcGenID = fUsesSrcInput ? src->uniqueID() : 0;
|
| const SkIRect srcSubset = fUsesSrcInput ? src->subset() : SkIRect::MakeWH(0, 0);
|
| - Cache::Key key(fUniqueID, context.ctm(), context.clipBounds(), srcGenID, srcSubset);
|
| + SkImageFilterCacheKey key(fUniqueID, context.ctm(), context.clipBounds(), srcGenID, srcSubset);
|
| if (context.cache()) {
|
| SkSpecialImage* result = context.cache()->get(key, offset);
|
| if (result) {
|
| @@ -462,115 +452,6 @@ sk_sp<SkSpecialImage> SkImageFilter::filterInput(int index,
|
| return result;
|
| }
|
|
|
| -namespace {
|
| -
|
| -class CacheImpl : public SkImageFilter::Cache {
|
| -public:
|
| - CacheImpl(size_t maxBytes) : fMaxBytes(maxBytes), fCurrentBytes(0) { }
|
| - ~CacheImpl() override {
|
| - SkTDynamicHash<Value, Key>::Iter iter(&fLookup);
|
| -
|
| - while (!iter.done()) {
|
| - Value* v = &*iter;
|
| - ++iter;
|
| - delete v;
|
| - }
|
| - }
|
| - struct Value {
|
| - Value(const Key& key, SkSpecialImage* image, const SkIPoint& offset)
|
| - : fKey(key), fImage(SkRef(image)), fOffset(offset) {}
|
| -
|
| - Key fKey;
|
| - SkAutoTUnref<SkSpecialImage> fImage;
|
| - SkIPoint fOffset;
|
| - static const Key& GetKey(const Value& v) {
|
| - return v.fKey;
|
| - }
|
| - static uint32_t Hash(const Key& key) {
|
| - return SkChecksum::Murmur3(reinterpret_cast<const uint32_t*>(&key), sizeof(Key));
|
| - }
|
| - SK_DECLARE_INTERNAL_LLIST_INTERFACE(Value);
|
| - };
|
| -
|
| - SkSpecialImage* get(const Key& key, SkIPoint* offset) const override {
|
| - SkAutoMutexAcquire mutex(fMutex);
|
| - if (Value* v = fLookup.find(key)) {
|
| - *offset = v->fOffset;
|
| - if (v != fLRU.head()) {
|
| - fLRU.remove(v);
|
| - fLRU.addToHead(v);
|
| - }
|
| - return v->fImage;
|
| - }
|
| - return nullptr;
|
| - }
|
| -
|
| - void set(const Key& key, SkSpecialImage* image, const SkIPoint& offset) override {
|
| - SkAutoMutexAcquire mutex(fMutex);
|
| - if (Value* v = fLookup.find(key)) {
|
| - this->removeInternal(v);
|
| - }
|
| - Value* v = new Value(key, image, offset);
|
| - fLookup.add(v);
|
| - fLRU.addToHead(v);
|
| - fCurrentBytes += image->getSize();
|
| - while (fCurrentBytes > fMaxBytes) {
|
| - Value* tail = fLRU.tail();
|
| - SkASSERT(tail);
|
| - if (tail == v) {
|
| - break;
|
| - }
|
| - this->removeInternal(tail);
|
| - }
|
| - }
|
| -
|
| - void purge() override {
|
| - SkAutoMutexAcquire mutex(fMutex);
|
| - while (fCurrentBytes > 0) {
|
| - Value* tail = fLRU.tail();
|
| - SkASSERT(tail);
|
| - this->removeInternal(tail);
|
| - }
|
| - }
|
| -
|
| - void purgeByKeys(const Key keys[], int count) override {
|
| - SkAutoMutexAcquire mutex(fMutex);
|
| - for (int i = 0; i < count; i++) {
|
| - if (Value* v = fLookup.find(keys[i])) {
|
| - this->removeInternal(v);
|
| - }
|
| - }
|
| - }
|
| -
|
| - SkDEBUGCODE(int count() const override { return fLookup.count(); })
|
| -private:
|
| - void removeInternal(Value* v) {
|
| - SkASSERT(v->fImage);
|
| - fCurrentBytes -= v->fImage->getSize();
|
| - fLRU.remove(v);
|
| - fLookup.remove(v->fKey);
|
| - delete v;
|
| - }
|
| -private:
|
| - SkTDynamicHash<Value, Key> fLookup;
|
| - mutable SkTInternalLList<Value> fLRU;
|
| - size_t fMaxBytes;
|
| - size_t fCurrentBytes;
|
| - mutable SkMutex fMutex;
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -SkImageFilter::Cache* SkImageFilter::Cache::Create(size_t maxBytes) {
|
| - return new CacheImpl(maxBytes);
|
| -}
|
| -
|
| -SK_DECLARE_STATIC_ONCE_PTR(SkImageFilter::Cache, cache);
|
| -SkImageFilter::Cache* SkImageFilter::Cache::Get() {
|
| - return cache.get([]{ return SkImageFilter::Cache::Create(kDefaultCacheSize); });
|
| -}
|
| -
|
| void SkImageFilter::PurgeCache() {
|
| - Cache::Get()->purge();
|
| + SkImageFilterCache::Get()->purge();
|
| }
|
| -
|
|
|