Chromium Code Reviews| Index: dm/DMSrcSink.cpp |
| diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp |
| index b44f1d78180e94e9d9f5505789024e5db42c4007..47e2a9e1a115c6b24f1017b981a16149f6f48128 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 "SkMultiPictureDraw.h" |
| #include "SkNullCanvas.h" |
| @@ -11,6 +12,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) {} |
| @@ -45,9 +48,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)); |
|
mtklein
2015/02/26 20:41:13
You might want to split off a CodecSrc as a separa
scroggo
2015/02/26 21:00:11
Thanks for the feedback. This is really a stopgap
|
| + 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); |