Index: src/images/SkImageDecoder.cpp |
diff --git a/src/images/SkImageDecoder.cpp b/src/images/SkImageDecoder.cpp |
index 5d94bb1c2db97efd618320213210ef91ee363329..9b8ae726acb26938d605244b0ccf34e8debe2fa7 100644 |
--- a/src/images/SkImageDecoder.cpp |
+++ b/src/images/SkImageDecoder.cpp |
@@ -8,12 +8,16 @@ |
#include "SkImageDecoder.h" |
#include "SkBitmap.h" |
+#include "SkData.h" |
+#include "SkForceLinking.h" |
#include "SkImagePriv.h" |
#include "SkPixelRef.h" |
#include "SkStream.h" |
#include "SkTemplates.h" |
#include "SkCanvas.h" |
+__SK_FORCE_IMAGE_DECODER_LINKING; |
+ |
SK_DEFINE_INST_COUNT(SkImageDecoder::Peeker) |
SK_DEFINE_INST_COUNT(SkImageDecoder::Chooser) |
SK_DEFINE_INST_COUNT(SkImageDecoderFactory) |
@@ -280,6 +284,22 @@ bool SkImageDecoder::DecodeFile(const char file[], SkBitmap* bm, |
return false; |
} |
+SkLruImageCache SkImageDecoder::fLruImageCache(1024*1024); |
+SkBitmapFactory SkImageDecoder::fLazyBitmapFactory(&SkImageDecoder::DecodeMemoryToTarget); |
+ |
+bool SkImageDecoder::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) { |
+ fLazyBitmapFactory.setImageCache(&fLruImageCache); |
+ gOnce = true; |
+ } |
+ return fLazyBitmapFactory.installPixelRef(data, bitmap); |
+} |
+ |
bool SkImageDecoder::DecodeMemory(const void* buffer, size_t size, SkBitmap* bm, |
SkBitmap::Config pref, Mode mode, Format* format) { |
if (0 == size) { |