1 /*
2  * Copyright 2013 Google Inc.
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #include "LazyDecodeBitmap.h"
9 
10 #include "SkData.h"
11 #include "SkDiscardableMemoryPool.h"
12 #include "SkImageGeneratorPriv.h"
13 #include "SkForceLinking.h"
14 
15 #include "SkCommandLineFlags.h"
16 
17 __SK_FORCE_IMAGE_DECODER_LINKING;
18 
19 DEFINE_bool(useVolatileCache, false, "Use a volatile cache for deferred image decoding pixels. "
20             "Only meaningful if --deferImageDecoding is set to true and the platform has an "
21             "implementation.");
22 
23 //  Fits SkPicture::InstallPixelRefProc call signature.
24 //  Used in SkPictureData::CreateFromStream
LazyDecodeBitmap(const void * src,size_t length,SkBitmap * dst)25 bool sk_tools::LazyDecodeBitmap(const void* src, size_t length, SkBitmap* dst) {
26     SkAutoDataUnref data(SkData::NewWithCopy(src, length));
27     if (NULL == data.get()) {
28         return false;
29     }
30 
31     SkAutoTDelete<SkImageGenerator> gen(SkImageGenerator::NewFromData(data));
32     if (NULL == gen.get()) {
33         return false;
34     }
35     const SkImageInfo info = gen->getInfo();
36     SkDiscardableMemory::Factory* pool = NULL;
37     if ((!FLAGS_useVolatileCache) || (info.width() * info.height() < 32 * 1024)) {
38         // how to do switching with SkDiscardableMemory.
39         pool = SkGetGlobalDiscardableMemoryPool();
40         // Only meaningful if platform has a default discardable
41         // memory implementation that differs from the global DM pool.
42     }
43     return SkInstallDiscardablePixelRef(gen.detach(), dst, pool);
44 }
45