Chromium Code Reviews| 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 { |