Index: dm/DMSrcSink.cpp |
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp |
index 638f6708343ec6c8b24dcb5d35cde124cbfc5452..29c6800505026254c18d403a6f4b595c1d265db3 100644 |
--- a/dm/DMSrcSink.cpp |
+++ b/dm/DMSrcSink.cpp |
@@ -10,8 +10,9 @@ |
#include "SkPictureData.h" |
#include "SkPictureRecorder.h" |
#include "SkRandom.h" |
-#include "SkSVGCanvas.h" |
+#include "SkScanlineDecoder.h" |
#include "SkStream.h" |
+#include "SkSVGCanvas.h" |
#include "SkXMLWriter.h" |
namespace DM { |
@@ -70,19 +71,32 @@ Error CodecSrc::draw(SkCanvas* canvas) const { |
} |
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()); |
+ 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: |
+ // We consider incomplete to be valid, since we should still decode what is |
+ // available. |
+ case SkImageGenerator::kIncompleteInput: |
+ break; |
+ default: |
+ // Everything else is considered a failure. |
+ return SkStringPrintf("Couldn't getPixels %s.", fPath.c_str()); |
+ } |
} |
+ |
+ const SkImageGenerator::Result result = scanlineDecoder->finish(); |
+ if (result != SkImageGenerator::kSuccess) { |
+ return SkStringPrintf("failed in finish!"); |
+ } |
+ canvas->drawBitmap(bitmap, 0, 0); |
+ return ""; |
} |
SkISize CodecSrc::size() const { |