Index: dm/DMSrcSink.cpp |
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp |
index e67d4355e4ca4caf4f7605422b2bd73f8b91a3ac..67f8ac6edb0da8df4faba5350170e118a4cc0689 100644 |
--- a/dm/DMSrcSink.cpp |
+++ b/dm/DMSrcSink.cpp |
@@ -1,6 +1,7 @@ |
#include "DMSrcSink.h" |
#include "SamplePipeControllers.h" |
#include "SkCommonFlags.h" |
+#include "SkCodec.h" |
#include "SkDocument.h" |
#include "SkError.h" |
#include "SkMultiPictureDraw.h" |
@@ -12,6 +13,8 @@ |
#include "SkStream.h" |
#include "SkXMLWriter.h" |
+DEFINE_bool(codec, false, "Use SkCodec instead of SkImageDecoder"); |
+ |
namespace DM { |
GMSrc::GMSrc(skiagm::GMRegistry::Factory factory) : fFactory(factory) {} |
@@ -46,9 +49,35 @@ Error ImageSrc::draw(SkCanvas* canvas) const { |
if (fDivisor == 0) { |
// Decode the full image. |
SkBitmap bitmap; |
- if (!SkImageDecoder::DecodeMemory(encoded->data(), encoded->size(), &bitmap, |
- dstColorType, SkImageDecoder::kDecodePixels_Mode)) { |
- return SkStringPrintf("Couldn't decode %s.", fPath.c_str()); |
+ if (FLAGS_codec) { |
+ SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); |
+ if (!codec) { |
+ return SkStringPrintf("Couldn't decode %s.", fPath.c_str()); |
+ } |
+ SkImageInfo info; |
+ if (!codec->getInfo(&info)) { |
+ return SkStringPrintf("Couldn't getInfo %s.", fPath.c_str()); |
+ } |
+ info = info.makeColorType(dstColorType); |
+ if (info.alphaType() == kUnpremul_SkAlphaType) { |
+ // FIXME: Currently we cannot draw unpremultiplied sources. |
+ info = info.makeAlphaType(kPremul_SkAlphaType); |
+ } |
+ if (!bitmap.tryAllocPixels(info)) { |
+ return SkStringPrintf("Image(%s) is too large (%d x %d)\n", fPath.c_str(), |
+ info.width(), info.height()); |
+ } |
+ SkAutoLockPixels alp(bitmap); |
+ const SkImageGenerator::Result result = codec->getPixels(info, bitmap.getPixels(), |
+ bitmap.rowBytes()); |
+ if (result != SkImageGenerator::kSuccess) { |
+ return SkStringPrintf("Couldn't getPixels %s.", fPath.c_str()); |
+ } |
+ } else { |
+ if (!SkImageDecoder::DecodeMemory(encoded->data(), encoded->size(), &bitmap, |
+ dstColorType, SkImageDecoder::kDecodePixels_Mode)) { |
+ return SkStringPrintf("Couldn't decode %s.", fPath.c_str()); |
+ } |
} |
encoded.reset((SkData*)NULL); // Might as well drop this when we're done with it. |
canvas->drawBitmap(bitmap, 0,0); |