/* * 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 "LazyDecodeBitmap.h" #include "PictureRenderingFlags.h" // --deferImageDecoding is defined here. #include "SkBitmap.h" #include "SkData.h" #include "SkImageDecoder.h" #include "SkForceLinking.h" #include "SkLruImageCache.h" #include "SkPurgeableImageCache.h" #include "SkCommandLineFlags.h" __SK_FORCE_IMAGE_DECODER_LINKING; 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); } virtual SkImageCache* selectCache(const SkImageInfo& info) SK_OVERRIDE { if (info.fWidth * info.fHeight > 32 * 1024 && fPurgeableImageCache != NULL) { return fPurgeableImageCache; } return &gLruImageCache; } 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( SkPurgeableImageCache::Create()).get() != NULL) { gFactory.setCacheSelector(&gCacheSelector); } else { gFactory.setImageCache(&gLruImageCache); } gOnce = true; } return gFactory.installPixelRef(data, bitmap); } } // namespace sk_tools