/* * 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 "SkData.h" #include "SkDecodingImageGenerator.h" #include "SkDiscardableMemoryPool.h" #include "SkImageGeneratorPriv.h" #include "SkForceLinking.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."); // Fits SkPicture::InstallPixelRefProc call signature. // Used in SkPictureData::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; } SkAutoTDelete gen( SkDecodingImageGenerator::Create( data, SkDecodingImageGenerator::Options())); SkImageInfo info; if ((NULL == gen.get()) || !gen->getInfo(&info)) { return false; } SkDiscardableMemory::Factory* pool = NULL; if ((!FLAGS_useVolatileCache) || (info.width() * info.height() < 32 * 1024)) { // how to do switching with SkDiscardableMemory. pool = SkGetGlobalDiscardableMemoryPool(); // Only meaningful if platform has a default discardable // memory implementation that differs from the global DM pool. } return SkInstallDiscardablePixelRef(gen.detach(), dst, pool); }