Index: tools/LazyDecodeBitmap.cpp |
diff --git a/tools/LazyDecodeBitmap.cpp b/tools/LazyDecodeBitmap.cpp |
index c0b7eea724fa621325b539c6dfd8dc7fb144854d..9e850e5753b6b26f6b67396abd480be8dba32e63 100644 |
--- a/tools/LazyDecodeBitmap.cpp |
+++ b/tools/LazyDecodeBitmap.cpp |
@@ -7,70 +7,41 @@ |
#include "LazyDecodeBitmap.h" |
-#include "PictureRenderingFlags.h" // --deferImageDecoding is defined here. |
-#include "SkBitmap.h" |
#include "SkData.h" |
-#include "SkImageDecoder.h" |
+#include "SkDecodingImageGenerator.h" |
+#include "SkDiscardableMemoryPool.h" |
+#include "SkDiscardablePixelRef.h" |
#include "SkForceLinking.h" |
-#include "SkLruImageCache.h" |
-#include "SkPurgeableImageCache.h" |
+ |
#include "SkCommandLineFlags.h" |
__SK_FORCE_IMAGE_DECODER_LINKING; |
+// TODO(halcanary) Use this flag when ashmem-backed discardable memory lands. |
DEFINE_bool(useVolatileCache, false, "Use a volatile cache for deferred image decoding pixels. " |
"Only meaningful if --deferImageDecoding is set to true and the platform has an " |
"implementation."); |
-SkLruImageCache gLruImageCache(1024 * 1024); |
- |
-namespace sk_tools { |
- |
-// Simple cache selector to choose between a purgeable cache for large images and the standard one |
-// for smaller images. |
-// |
-class CacheSelector : public SkBitmapFactory::CacheSelector { |
- |
-public: |
- CacheSelector() { |
- fPurgeableImageCache = SkPurgeableImageCache::Create(); |
- } |
- |
- ~CacheSelector() { |
- SkSafeUnref(fPurgeableImageCache); |
+// Fits SkPicture::InstallPixelRefProc call signature. |
+// Used in SkPicturePlayback::CreateFromStream |
+bool sk_tools::LazyDecodeBitmap(const void* src, |
+ size_t length, |
+ SkBitmap* dst) { |
+ SkAutoDataUnref data(SkData::NewWithCopy(src, length)); |
+ if (NULL == data.get()) { |
+ return false; |
} |
- virtual SkImageCache* selectCache(const SkImageInfo& info) SK_OVERRIDE { |
- if (info.fWidth * info.fHeight > 32 * 1024 && fPurgeableImageCache != NULL) { |
- return fPurgeableImageCache; |
- } |
- return &gLruImageCache; |
+ SkAutoTDelete<SkImageGenerator> gen(SkNEW_ARGS(SkDecodingImageGenerator, |
+ (data))); |
+ SkImageInfo info; |
+ if (!gen->getInfo(&info)) { |
+ return false; |
} |
-private: |
- SkImageCache* fPurgeableImageCache; |
-}; |
- |
-static CacheSelector gCacheSelector; |
-static SkBitmapFactory gFactory(&SkImageDecoder::DecodeMemoryToTarget); |
- |
-bool LazyDecodeBitmap(const void* buffer, size_t size, SkBitmap* bitmap) { |
- void* copiedBuffer = sk_malloc_throw(size); |
- memcpy(copiedBuffer, buffer, size); |
- SkAutoDataUnref data(SkData::NewFromMalloc(copiedBuffer, size)); |
- |
- static bool gOnce; |
- if (!gOnce) { |
- // Only use the cache selector if there is a purgeable image cache to use for large |
- // images. |
- if (FLAGS_useVolatileCache && SkAutoTUnref<SkImageCache>( |
- SkPurgeableImageCache::Create()).get() != NULL) { |
- gFactory.setCacheSelector(&gCacheSelector); |
- } else { |
- gFactory.setImageCache(&gLruImageCache); |
- } |
- gOnce = true; |
+ SkDiscardableMemory::Factory* pool = NULL; |
+ if (info.fWidth * info.fHeight > 32 * 1024) { |
+ // how to do switching with SkDiscardableMemory. |
+ pool = SkGetGlobalDiscardableMemoryPool(); |
} |
- return gFactory.installPixelRef(data, bitmap); |
+ return SkDiscardablePixelRef::Install(gen.detach(), dst, pool); |
} |
- |
-} // namespace sk_tools |