Chromium Code Reviews| Index: src/core/SkBitmapCache.cpp |
| diff --git a/src/core/SkBitmapCache.cpp b/src/core/SkBitmapCache.cpp |
| index 1713fe4c50f0cdcfe1bd79d9e550096aa6aa2d61..c6baf4d8897637a2a901d61ebc2b989b491421f2 100644 |
| --- a/src/core/SkBitmapCache.cpp |
| +++ b/src/core/SkBitmapCache.cpp |
| @@ -6,6 +6,7 @@ |
| */ |
| #include "SkBitmapCache.h" |
| +#include "SkMipMap.h" |
| #include "SkRect.h" |
| /** |
| @@ -41,51 +42,103 @@ public: |
| ////////////////////////////////////////////////////////////////////////////////////////// |
| -SkScaledImageCache::ID* SkBitmapCache::FindAndLock(const SkBitmap& src, |
| +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; |
|
qiankun
2014/08/26 07:12:40
Can we use pointer type for fKey to avoid using vi
reed1
2014/08/26 14:04:02
If the virtual call overhead shows up as a problem
|
| + SkBitmap fBitmap; |
| + |
| + virtual const Key& getKey() const SK_OVERRIDE { return fKey; } |
| + virtual size_t bytesUsed() const SK_OVERRIDE { return fBitmap.getSize(); } |
| +}; |
| + |
| +SkScaledImageCache::ID SkBitmapCache::FindAndLock(const SkBitmap& src, |
| SkScalar invScaleX, SkScalar invScaleY, |
| SkBitmap* result) { |
| if (0 == invScaleX || 0 == invScaleY) { |
| // degenerate, and the key we use for mipmaps |
| return NULL; |
| } |
| + |
| BitmapKey key(src.getGenerationID(), invScaleX, invScaleY, get_bounds_from_bitmap(src)); |
| - return SkScaledImageCache::FindAndLock(key, result); |
| + const BitmapRec* rec = (BitmapRec*)SkScaledImageCache::FindAndLock(key); |
| + if (rec) { |
| + *result = rec->fBitmap; |
| + return rec; |
| + } |
| + return NULL; |
| } |
| -SkScaledImageCache::ID* SkBitmapCache::AddAndLock(const SkBitmap& src, |
| +SkScaledImageCache::ID SkBitmapCache::AddAndLock(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; |
| } |
| - BitmapKey key(src.getGenerationID(), invScaleX, invScaleY, get_bounds_from_bitmap(src)); |
| - return SkScaledImageCache::AddAndLock(key, result); |
| + return SkScaledImageCache::AddAndLock(SkNEW_ARGS(BitmapRec, |
| + (src.getGenerationID(), invScaleX, invScaleY, |
| + get_bounds_from_bitmap(src), |
| + result))); |
| } |
| -//// |
| - |
| -SkScaledImageCache::ID* SkBitmapCache::FindAndLock(uint32_t genID, int width, int height, |
| +SkScaledImageCache::ID SkBitmapCache::FindAndLock(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); |
| + const BitmapRec* rec = (BitmapRec*)SkScaledImageCache::FindAndLock(key); |
| + if (rec) { |
| + *result = rec->fBitmap; |
| + return rec; |
| + } |
| + return NULL; |
| } |
| -SkScaledImageCache::ID* SkBitmapCache::AddAndLock(uint32_t genID, int width, int height, |
| +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); |
| + return SkScaledImageCache::AddAndLock(SkNEW_ARGS(BitmapRec, |
| + (genID, SK_Scalar1, SK_Scalar1, |
| + SkIRect::MakeWH(width, height), |
| + 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); |
| +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)) |
| + {} |
| + |
| + 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 fMipMap->getSize(); } |
| +}; |
| + |
| + |
| +SkScaledImageCache::ID SkMipMapCache::FindAndLock(const SkBitmap& src, const SkMipMap** result) { |
| + BitmapKey key(src.getGenerationID(), 0, 0, get_bounds_from_bitmap(src)); |
| + const MipMapRec* rec = (MipMapRec*)SkScaledImageCache::FindAndLock(key); |
| + if (rec) { |
| + *result = rec->fMipMap; |
| + return rec; |
| + } |
| + return NULL; |
| } |
| -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); |
| +SkScaledImageCache::ID SkMipMapCache::AddAndLock(const SkBitmap& src, const SkMipMap* result) { |
| + if (NULL == result) { |
| + return NULL; |
| + } |
| + return SkScaledImageCache::AddAndLock(SkNEW_ARGS(MipMapRec, (src, result))); |
| } |