Index: src/core/SkBitmapCache.cpp |
diff --git a/src/core/SkBitmapCache.cpp b/src/core/SkBitmapCache.cpp |
index 1713fe4c50f0cdcfe1bd79d9e550096aa6aa2d61..c0ce0e63693111dee607a720cba9bd2cf0ba29e4 100644 |
--- a/src/core/SkBitmapCache.cpp |
+++ b/src/core/SkBitmapCache.cpp |
@@ -6,6 +6,8 @@ |
*/ |
#include "SkBitmapCache.h" |
+#include "SkScaledImageCache.h" |
+#include "SkMipMap.h" |
#include "SkRect.h" |
/** |
@@ -41,51 +43,103 @@ public: |
////////////////////////////////////////////////////////////////////////////////////////// |
-SkScaledImageCache::ID* SkBitmapCache::FindAndLock(const SkBitmap& src, |
- SkScalar invScaleX, SkScalar invScaleY, |
- SkBitmap* result) { |
+struct BitmapRec : public SkScaledImageCache::Rec { |
+ BitmapRec(uint32_t genID, SkScalar scaleX, SkScalar scaleY, const SkIRect& bounds, |
+ const SkBitmap& result) |
+ : fKey(genID, scaleX, scaleY, bounds) |
+ , fBitmap(result) |
+ {} |
+ |
+ BitmapKey fKey; |
+ SkBitmap fBitmap; |
+ |
+ virtual const Key& getKey() const SK_OVERRIDE { return fKey; } |
+ virtual size_t bytesUsed() const SK_OVERRIDE { return sizeof(fKey) + fBitmap.getSize(); } |
+}; |
+ |
+static bool find_and_return(const BitmapKey& key, SkBitmap* result) { |
+ const BitmapRec* rec = (BitmapRec*)SkScaledImageCache::FindAndLock(key); |
+ if (rec) { |
+ *result = rec->fBitmap; |
+ SkScaledImageCache::Unlock(rec); |
+ |
+ result->lockPixels(); |
+ if (result->getPixels()) { |
+ return true; |
+ } |
+ // todo: we should explicitly purge rec from the cache at this point, since |
+ // it is effectively purged already (has no memory behind it) |
+ result->reset(); |
+ // fall-through to false |
+ } |
+ return false; |
+} |
+ |
+bool SkBitmapCache::Find(const SkBitmap& src, SkScalar invScaleX, SkScalar invScaleY, |
+ SkBitmap* result) { |
if (0 == invScaleX || 0 == invScaleY) { |
// degenerate, and the key we use for mipmaps |
- return NULL; |
+ return false; |
} |
BitmapKey key(src.getGenerationID(), invScaleX, invScaleY, get_bounds_from_bitmap(src)); |
- return SkScaledImageCache::FindAndLock(key, result); |
+ return find_and_return(key, result); |
} |
-SkScaledImageCache::ID* SkBitmapCache::AddAndLock(const SkBitmap& src, |
- SkScalar invScaleX, SkScalar invScaleY, |
- const SkBitmap& result) { |
+void SkBitmapCache::Add(const SkBitmap& src, SkScalar invScaleX, SkScalar invScaleY, |
+ const SkBitmap& result) { |
if (0 == invScaleX || 0 == invScaleY) { |
// degenerate, and the key we use for mipmaps |
- return NULL; |
+ return; |
} |
- BitmapKey key(src.getGenerationID(), invScaleX, invScaleY, get_bounds_from_bitmap(src)); |
- return SkScaledImageCache::AddAndLock(key, result); |
+ SkScaledImageCache::Add(SkNEW_ARGS(BitmapRec, |
+ (src.getGenerationID(), invScaleX, invScaleY, |
+ get_bounds_from_bitmap(src), result))); |
} |
-//// |
- |
-SkScaledImageCache::ID* SkBitmapCache::FindAndLock(uint32_t genID, int width, int height, |
- SkBitmap* result) { |
+bool SkBitmapCache::Find(uint32_t genID, int width, int height, SkBitmap* result) { |
BitmapKey key(genID, SK_Scalar1, SK_Scalar1, SkIRect::MakeWH(width, height)); |
- return SkScaledImageCache::FindAndLock(key, result); |
+ return find_and_return(key, result); |
} |
-SkScaledImageCache::ID* SkBitmapCache::AddAndLock(uint32_t genID, int width, int height, |
- const SkBitmap& result) { |
- BitmapKey key(genID, SK_Scalar1, SK_Scalar1, SkIRect::MakeWH(width, height)); |
- return SkScaledImageCache::AddAndLock(key, result); |
+void SkBitmapCache::Add(uint32_t genID, int width, int height, const SkBitmap& result) { |
+ SkScaledImageCache::Add(SkNEW_ARGS(BitmapRec, (genID, SK_Scalar1, SK_Scalar1, |
+ SkIRect::MakeWH(width, height), result))); |
} |
-//// |
+////////////////////////////////////////////////////////////////////////////////////////// |
+ |
+struct MipMapRec : public SkScaledImageCache::Rec { |
+ MipMapRec(const SkBitmap& src, const SkMipMap* result) |
+ : fKey(src.getGenerationID(), 0, 0, get_bounds_from_bitmap(src)) |
+ , fMipMap(SkRef(result)) |
+ {} |
-SkScaledImageCache::ID* SkMipMapCache::FindAndLock(const SkBitmap& src, const SkMipMap** result) { |
- BitmapKey key(src.getGenerationID(), SK_Scalar1, SK_Scalar1, get_bounds_from_bitmap(src)); |
- return SkScaledImageCache::FindAndLock(key, result); |
+ virtual ~MipMapRec() { |
+ fMipMap->unref(); |
+ } |
+ |
+ BitmapKey fKey; |
+ const SkMipMap* fMipMap; |
+ |
+ virtual const Key& getKey() const SK_OVERRIDE { return fKey; } |
+ virtual size_t bytesUsed() const SK_OVERRIDE { return sizeof(fKey) + fMipMap->getSize(); } |
+}; |
+ |
+ |
+const SkMipMap* SkMipMapCache::FindAndRef(const SkBitmap& src) { |
+ BitmapKey key(src.getGenerationID(), 0, 0, get_bounds_from_bitmap(src)); |
+ const MipMapRec* rec = (MipMapRec*)SkScaledImageCache::FindAndLock(key); |
+ const SkMipMap* result = NULL; |
+ if (rec) { |
+ result = SkRef(rec->fMipMap); |
+ SkScaledImageCache::Unlock(rec); |
+ } |
+ return result; |
} |
-SkScaledImageCache::ID* SkMipMapCache::AddAndLock(const SkBitmap& src, const SkMipMap* result) { |
- BitmapKey key(src.getGenerationID(), SK_Scalar1, SK_Scalar1, get_bounds_from_bitmap(src)); |
- return SkScaledImageCache::AddAndLock(key, result); |
+void SkMipMapCache::Add(const SkBitmap& src, const SkMipMap* result) { |
+ if (result) { |
+ SkScaledImageCache::Add(SkNEW_ARGS(MipMapRec, (src, result))); |
+ } |
} |