Index: dm/DMSrcSink.cpp |
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp |
index 5ca66c50e207c4809f41396e907d354d4d78a17d..6ff023d270af1571437db7225088f8118001b497 100644 |
--- a/dm/DMSrcSink.cpp |
+++ b/dm/DMSrcSink.cpp |
@@ -13,8 +13,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) {} |
@@ -38,6 +36,108 @@ Name GMSrc::name() const { |
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
+CodecSrc::CodecSrc(Path path, SkColorType dstCT, SkAlphaType dstAT, SkipZeroes skip, |
+ Scanlines scanlines) |
+ : fPath(path) |
+ , fDstColorType(dstCT) |
+ , fDstAlphaType(dstAT) |
+ , fSkipZeroes(skip) |
+ , fScanlines(scanlines) {} |
+ |
+Error CodecSrc::draw(SkCanvas* canvas) const { |
mtklein
2015/03/06 00:25:25
Can we use non-fatal errors here to have this Code
scroggo
2015/03/06 20:40:27
That could work. Although I'm still trying to wrap
scroggo
2015/03/06 20:43:45
My other thought is that the config you choose wil
scroggo
2015/03/13 21:34:33
Done.
|
+ 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 info; |
+ if (!codec->getInfo(&info)) { |
+ return SkStringPrintf("Couldn't getInfo %s.", fPath.c_str()); |
+ } |
+ info = SkImageInfo::Make(info.width(), info.height(), fDstColorType, |
+ fDstAlphaType, info.profileType()); |
+ SkBitmap bitmap; |
+ 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); |
+ if (kSkipZeroes == fSkipZeroes) { |
+ memset(bitmap.getPixels(), 0, bitmap.getSafeSize()); |
+ // TODO: modify the setting on codec. |
+ } |
+ |
+ // TODO: Support other scanline modes. |
+ SkASSERT(kNormal_Scanlines == fScanlines); |
+ |
+ 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: |
+ 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); |
+} |
+ |
+// This code mimics code in DecodingBench. Can we unify? |
+const char* color_type_name(SkColorType colorType) { |
+ switch(colorType) { |
+ case kN32_SkColorType: |
+ return "N32"; |
+ case kRGB_565_SkColorType: |
+ return "565"; |
+ case kAlpha_8_SkColorType: |
+ return "Alpha8"; |
+ default: |
+ return "Unknown"; |
+ } |
+} |
+ |
+const char* alpha_type_name(SkAlphaType alphaType) { |
+ switch (alphaType) { |
+ case kUnpremul_SkAlphaType: |
+ return "Unpremul"; |
+ case kPremul_SkAlphaType: |
+ return "Premul"; |
+ case kOpaque_SkAlphaType: |
+ return "Opaque"; |
+ default: |
+ // We only support the above three. |
+ SkASSERT(false); |
+ return ""; |
+ } |
+} |
+ |
+Name CodecSrc::name() const { |
+ return SkStringPrintf("%s_%s_%s", SkOSPath::Basename(fPath.c_str()).c_str(), |
+ color_type_name(fDstColorType), |
+ alpha_type_name(fDstAlphaType)); |
+} |
+/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
+ |
ImageSrc::ImageSrc(Path path, int divisor) : fPath(path), fDivisor(divisor) {} |
Error ImageSrc::draw(SkCanvas* canvas) const { |
@@ -49,48 +149,13 @@ Error ImageSrc::draw(SkCanvas* canvas) const { |
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); |