Chromium Code Reviews| Index: src/lazy/SkImageCache.cpp |
| diff --git a/src/lazy/SkImageCache.cpp b/src/lazy/SkImageCache.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..94035f59d67120985857d2b364c1c4ac44d2c6eb |
| --- /dev/null |
| +++ b/src/lazy/SkImageCache.cpp |
| @@ -0,0 +1,83 @@ |
| +/* |
| + * Copyright 2013 Google Inc. |
| + * |
| + * Use of this source code is governed by a BSD-style license that can be |
| + * found in the LICENSE file. |
| + */ |
| + |
| +#include "SkImageCache.h" |
| + |
| +namespace { |
| +class ImageCacheBackedDM : public SkDiscardableMemory { |
| +public: |
| + static SkDiscardableMemory * create(SkImageCache* cache, size_t size); |
|
scroggo
2013/12/02 19:00:09
SkDiscardableMemory* create
|
| + virtual ~ImageCacheBackedDM(); |
| + virtual bool lock() SK_OVERRIDE; |
| + virtual void* data() SK_OVERRIDE; |
| + virtual void unlock() SK_OVERRIDE; |
| +private: |
| + ImageCacheBackedDM(SkImageCache* cache, SkImageCache::ID id, void* ptr); |
| + SkImageCache* fCache; |
| + SkImageCache::ID fId; |
| + void* fPtr; |
| +}; |
| + |
| +SkDiscardableMemory * ImageCacheBackedDM::create(SkImageCache* cache, |
|
scroggo
2013/12/02 19:00:09
SkDiscardableMemory* ImageCacheBackedDM...
|
| + size_t bytes) { |
| + SkASSERT(cache); |
| + SkImageCache::ID id(SkImageCache::UNINITIALIZED_ID); |
| + void* ptr = cache->allocAndPinCache(bytes, &id); |
| + SkASSERT((NULL == ptr) == (SkImageCache::UNINITIALIZED_ID == id)); |
| + if (ptr == NULL) { |
| + return NULL; |
| + } |
| + return SkNEW_ARGS(ImageCacheBackedDM, (cache, id, ptr)); |
| +} |
| + |
| +ImageCacheBackedDM::ImageCacheBackedDM(SkImageCache* cache, |
| + SkImageCache::ID id, void* ptr) |
| + : fCache(cache), fId(id), fPtr(ptr) { |
|
scroggo
2013/12/02 19:00:09
These should be on their own line:
: fCache(cache
|
| + fCache->ref(); |
| +} |
| + |
| +ImageCacheBackedDM::~ImageCacheBackedDM() { |
| + if (fId != SkImageCache::UNINITIALIZED_ID) { |
| + fCache->throwAwayCache(fId); |
| + } |
| + fCache->unref(); |
| +} |
| + |
| +bool ImageCacheBackedDM::lock() { |
| + SkImageCache::DataStatus status; |
| + SkASSERT(NULL == fPtr); |
| + fPtr = fCache->pinCache(fId, &status); |
| + if (NULL == fPtr) { |
| + fId = SkImageCache::UNINITIALIZED_ID; |
| + return false; |
| + } |
| + if (SkImageCache::kRetained_DataStatus == status) { |
| + return true; |
| + } |
| + // not retained, fail. |
| + fCache->releaseCache(fId); |
| + fCache->throwAwayCache(fId); |
| + fId = SkImageCache::UNINITIALIZED_ID; |
| + fPtr = NULL; |
| + return false; |
| +} |
| + |
| +void* ImageCacheBackedDM::data() { |
| + return fPtr; |
| +} |
| + |
| +void ImageCacheBackedDM::unlock() { |
| + if (fId != SkImageCache::UNINITIALIZED_ID) { |
| + fCache->releaseCache(fId); |
| + } |
| + fPtr = NULL; |
| +} |
| +} // namespace |
| + |
| +SkDiscardableMemory* SkImageCache::create(size_t bytes) { |
| + return ImageCacheBackedDM::create(this, bytes); |
| +} |