Index: dm/DMSrcSink.cpp |
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp |
index 638f6708343ec6c8b24dcb5d35cde124cbfc5452..c3fcd15e1c847791bbc6ace698a3da9b5e9a0b4c 100644 |
--- a/dm/DMSrcSink.cpp |
+++ b/dm/DMSrcSink.cpp |
@@ -10,6 +10,7 @@ |
#include "SkPictureData.h" |
#include "SkPictureRecorder.h" |
#include "SkRandom.h" |
+#include "SkScanlineDecoder.h" |
#include "SkSVGCanvas.h" |
#include "SkStream.h" |
#include "SkXMLWriter.h" |
@@ -37,7 +38,7 @@ Name GMSrc::name() const { |
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
-CodecSrc::CodecSrc(Path path) : fPath(path) {} |
+CodecSrc::CodecSrc(Path path, Mode mode) : fPath(path), fMode(mode) {} |
Error CodecSrc::draw(SkCanvas* canvas) const { |
SkImageInfo canvasInfo; |
@@ -69,20 +70,43 @@ Error CodecSrc::draw(SkCanvas* canvas) const { |
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()); |
+ switch (fMode) { |
+ case kNormal_Mode: |
+ 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: |
+ 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()); |
+ } |
+ break; |
+ case kScanline_Mode: { |
+ SkScanlineDecoder* scanlineDecoder = codec->getScanlineDecoder(decodeInfo); |
+ if (NULL == scanlineDecoder) { |
+ return Error::Nonfatal("Cannot use scanline decoder for all images"); |
+ } |
+ for (int y = 0; y < decodeInfo.height(); ++y) { |
+ const SkImageGenerator::Result result = scanlineDecoder->getScanlines( |
+ bitmap.getAddr(0, y), 1, 0); |
+ switch (result) { |
+ case SkImageGenerator::kSuccess: |
+ case SkImageGenerator::kIncompleteInput: |
+ break; |
+ default: |
+ return SkStringPrintf("%s failed after %d scanlines with error message %d", |
+ y-1, fPath.c_str(), (int) result); |
mtklein
2015/03/25 20:31:38
y-1 and fPath.c_str() are backwards?
scroggo
2015/03/25 20:36:28
Yep. Changed the string and forgot to change the p
|
+ } |
+ } |
+ break; |
+ } |
} |
+ canvas->drawBitmap(bitmap, 0, 0); |
+ return ""; |
} |
SkISize CodecSrc::size() const { |