Index: dm/DMSrcSink.cpp |
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp |
index 6f6664f27ce2266bd12156f1ae973cada399ec25..7bbdff73bcb765a31831702db7aa2a9162c8e409 100644 |
--- a/dm/DMSrcSink.cpp |
+++ b/dm/DMSrcSink.cpp |
@@ -14,8 +14,6 @@ |
#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) {} |
@@ -39,59 +37,99 @@ Name GMSrc::name() const { |
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
+CodecSrc::CodecSrc(Path path) : fPath(path) {} |
+ |
+Error CodecSrc::draw(SkCanvas* canvas) const { |
+ SkImageInfo canvasInfo; |
+ if (NULL == canvas->peekPixels(&canvasInfo, NULL)) { |
+ // TODO: Once we implement GPU paths (e.g. JPEG YUV), we should use a deferred decode to |
+ // let the GPU handle it. |
+ return Error::Nonfatal("No need to test decoding to non-raster backend."); |
+ } |
+ |
+ SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); |
+ if (!encoded) { |
+ return SkStringPrintf("Couldn't read %s.", fPath.c_str()); |
+ } |
+ |
+ SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); |
+ if (!codec) { |
+ return SkStringPrintf("Couldn't decode %s.", fPath.c_str()); |
+ } |
+ |
+ SkImageInfo decodeInfo; |
+ if (!codec->getInfo(&decodeInfo)) { |
+ return SkStringPrintf("Couldn't getInfo %s.", fPath.c_str()); |
+ } |
+ |
+ decodeInfo = decodeInfo.makeColorType(canvasInfo.colorType()); |
+ if (decodeInfo.alphaType() == kUnpremul_SkAlphaType) { |
+ // FIXME: Currently we cannot draw unpremultiplied sources. |
+ decodeInfo = decodeInfo.makeAlphaType(kPremul_SkAlphaType); |
+ } |
+ |
+ SkBitmap bitmap; |
+ if (!bitmap.tryAllocPixels(decodeInfo)) { |
+ return SkStringPrintf("Image(%s) is too large (%d x %d)\n", fPath.c_str(), |
+ decodeInfo.width(), decodeInfo.height()); |
+ } |
+ |
+ SkAutoLockPixels alp(bitmap); |
+ switch (codec->getPixels(decodeInfo, bitmap.getPixels(), bitmap.rowBytes())) { |
+ case SkImageGenerator::kSuccess: |
+ // We consider incomplete to be valid, since we should still decode what is |
+ // available. |
+ case SkImageGenerator::kIncompleteInput: |
+ canvas->drawBitmap(bitmap, 0, 0); |
+ return ""; |
+ case SkImageGenerator::kInvalidConversion: |
+ return Error::Nonfatal("Incompatible colortype conversion"); |
+ default: |
+ // Everything else is considered a failure. |
+ return SkStringPrintf("Couldn't getPixels %s.", fPath.c_str()); |
+ } |
+} |
+ |
+SkISize CodecSrc::size() const { |
+ SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); |
+ SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); |
+ SkImageInfo info; |
+ if (codec && codec->getInfo(&info)) { |
+ return info.dimensions(); |
+ } |
+ return SkISize::Make(0,0); |
+} |
+ |
+Name CodecSrc::name() const { |
+ return SkOSPath::Basename(fPath.c_str()); |
+} |
+ |
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
+ |
ImageSrc::ImageSrc(Path path, int divisor) : fPath(path), fDivisor(divisor) {} |
Error ImageSrc::draw(SkCanvas* canvas) const { |
+ SkImageInfo canvasInfo; |
+ if (NULL == canvas->peekPixels(&canvasInfo, NULL)) { |
+ // TODO: Instead, use lazy decoding to allow the GPU to handle cases like YUV. |
+ return Error::Nonfatal("No need to test decoding to non-raster backend."); |
+ } |
+ |
SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); |
if (!encoded) { |
return SkStringPrintf("Couldn't read %s.", fPath.c_str()); |
} |
- const SkColorType dstColorType = canvas->imageInfo().colorType(); |
+ const SkColorType dstColorType = canvasInfo.colorType(); |
if (fDivisor == 0) { |
// Decode the full image. |
SkBitmap bitmap; |
- 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()); |
- switch (result) { |
- case SkImageGenerator::kSuccess: |
- // We consider incomplete to be valid, since we should still decode what is |
- // available. |
- case SkImageGenerator::kIncompleteInput: |
- break; |
- case SkImageGenerator::kInvalidConversion: |
- return Error::Nonfatal("Incompatible colortype conversion"); |
- default: |
- // Everything else is considered a failure. |
- 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()); |
- } |
- if (kRGB_565_SkColorType == dstColorType && !bitmap.isOpaque()) { |
- // Do not draw a bitmap with alpha to a destination without alpha. |
- return Error::Nonfatal("Uninteresting to decode image with alpha into 565."); |
- } |
+ if (!SkImageDecoder::DecodeMemory(encoded->data(), encoded->size(), &bitmap, |
+ dstColorType, SkImageDecoder::kDecodePixels_Mode)) { |
+ return SkStringPrintf("Couldn't decode %s.", fPath.c_str()); |
+ } |
+ if (kRGB_565_SkColorType == dstColorType && !bitmap.isOpaque()) { |
+ // Do not draw a bitmap with alpha to a destination without alpha. |
+ return Error::Nonfatal("Uninteresting to decode image with alpha into 565."); |
} |
encoded.reset((SkData*)NULL); // Might as well drop this when we're done with it. |
canvas->drawBitmap(bitmap, 0,0); |
@@ -141,27 +179,15 @@ Error ImageSrc::draw(SkCanvas* canvas) const { |
SkISize ImageSrc::size() const { |
SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(fPath.c_str())); |
- if (FLAGS_codec) { |
- SkAutoTDelete<SkCodec> codec(SkCodec::NewFromData(encoded)); |
- if (!codec) { |
- return SkISize::Make(0,0); |
- } |
- SkImageInfo info; |
- if (!codec->getInfo(&info)) { |
- return SkISize::Make(0,0); |
- } |
- return info.dimensions(); |
- } else { |
- SkBitmap bitmap; |
- if (!encoded || !SkImageDecoder::DecodeMemory(encoded->data(), |
- encoded->size(), |
- &bitmap, |
- kUnknown_SkColorType, |
- SkImageDecoder::kDecodeBounds_Mode)) { |
- return SkISize::Make(0,0); |
- } |
- return bitmap.dimensions(); |
+ SkBitmap bitmap; |
+ if (!encoded || !SkImageDecoder::DecodeMemory(encoded->data(), |
+ encoded->size(), |
+ &bitmap, |
+ kUnknown_SkColorType, |
+ SkImageDecoder::kDecodeBounds_Mode)) { |
+ return SkISize::Make(0,0); |
} |
+ return bitmap.dimensions(); |
} |
Name ImageSrc::name() const { |