| /* |
| * 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<SkImageGenerator> 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.fWidth * info.fHeight < 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); |
| } |