| Index: dm/DMSrcSink.cpp
|
| diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
|
| index 755bae378edce7c7760ba7f7b0ef6e10419d0f73..f8c9bc0b586c858df22e23e1e497e6de763b0b43 100644
|
| --- a/dm/DMSrcSink.cpp
|
| +++ b/dm/DMSrcSink.cpp
|
| @@ -432,55 +432,31 @@
|
| break;
|
| }
|
| case kScanline_Mode: {
|
| + if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, NULL, colorPtr,
|
| + &colorCount)) {
|
| + return "Could not start scanline decoder";
|
| + }
|
| +
|
| void* dst = pixels.get();
|
| uint32_t height = decodeInfo.height();
|
| - const bool png = fPath.endsWith("png");
|
| - const bool ico = fPath.endsWith("ico");
|
| - bool useOldScanlineMethod = !png && !ico;
|
| - if (png || ico) {
|
| - if (SkCodec::kSuccess == codec->startIncrementalDecode(decodeInfo, dst,
|
| - rowBytes, nullptr, colorPtr, &colorCount)) {
|
| - int rowsDecoded;
|
| - if (SkCodec::kIncompleteInput == codec->incrementalDecode(&rowsDecoded)) {
|
| - codec->fillIncompleteImage(decodeInfo, dst, rowBytes,
|
| - SkCodec::kNo_ZeroInitialized, height,
|
| - rowsDecoded);
|
| + switch (codec->getScanlineOrder()) {
|
| + case SkCodec::kTopDown_SkScanlineOrder:
|
| + case SkCodec::kBottomUp_SkScanlineOrder:
|
| + case SkCodec::kNone_SkScanlineOrder:
|
| + // We do not need to check the return value. On an incomplete
|
| + // image, memory will be filled with a default value.
|
| + codec->getScanlines(dst, height, rowBytes);
|
| + break;
|
| + case SkCodec::kOutOfOrder_SkScanlineOrder: {
|
| + for (int y = 0; y < decodeInfo.height(); y++) {
|
| + int dstY = codec->outputScanline(y);
|
| + void* dstPtr = SkTAddOffset<void>(dst, rowBytes * dstY);
|
| + // We complete the loop, even if this call begins to fail
|
| + // due to an incomplete image. This ensures any uninitialized
|
| + // memory will be filled with the proper value.
|
| + codec->getScanlines(dstPtr, 1, rowBytes);
|
| }
|
| - } else {
|
| - if (png) {
|
| - // Error: PNG should support incremental decode.
|
| - return "Could not start incremental decode";
|
| - }
|
| - // Otherwise, this is an ICO. Since incremental failed, it must contain a BMP,
|
| - // which should work via startScanlineDecode
|
| - useOldScanlineMethod = true;
|
| - }
|
| - }
|
| -
|
| - if (useOldScanlineMethod) {
|
| - if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, NULL, colorPtr,
|
| - &colorCount)) {
|
| - return "Could not start scanline decoder";
|
| - }
|
| -
|
| - switch (codec->getScanlineOrder()) {
|
| - case SkCodec::kTopDown_SkScanlineOrder:
|
| - case SkCodec::kBottomUp_SkScanlineOrder:
|
| - // We do not need to check the return value. On an incomplete
|
| - // image, memory will be filled with a default value.
|
| - codec->getScanlines(dst, height, rowBytes);
|
| - break;
|
| - case SkCodec::kOutOfOrder_SkScanlineOrder: {
|
| - for (int y = 0; y < decodeInfo.height(); y++) {
|
| - int dstY = codec->outputScanline(y);
|
| - void* dstPtr = SkTAddOffset<void>(dst, rowBytes * dstY);
|
| - // We complete the loop, even if this call begins to fail
|
| - // due to an incomplete image. This ensures any uninitialized
|
| - // memory will be filled with the proper value.
|
| - codec->getScanlines(dstPtr, 1, rowBytes);
|
| - }
|
| - break;
|
| - }
|
| + break;
|
| }
|
| }
|
|
|
|
|