| Index: dm/DMSrcSink.cpp
|
| diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
|
| index 64c18fc95f819d7e6bd655aae09e3c14a12261a9..2c80fac6be9506e9e26a7a4c180be33e93e06984 100644
|
| --- a/dm/DMSrcSink.cpp
|
| +++ b/dm/DMSrcSink.cpp
|
| @@ -85,14 +85,6 @@ SkScanlineDecoder* start_scanline_decoder(SkData* encoded, const SkImageInfo& in
|
| if (nullptr == scanlineDecoder) {
|
| return nullptr;
|
| }
|
| - // DM scanline test assume kTopDown scanline ordering. Other orderings are
|
| - // tested from within SkScaledCodec.
|
| - // TODO (msarett): Redesign the CodecSrc tests to improve our coverage of SkCodec and
|
| - // SkScanlineDecoder functionality. Maybe we should write code to explicitly
|
| - // test kNone, kOutOfOrder, and kBottomUp.
|
| - if (SkScanlineDecoder::kTopDown_SkScanlineOrder != scanlineDecoder->getScanlineOrder()) {
|
| - return nullptr;
|
| - }
|
| if (SkCodec::kSuccess != scanlineDecoder->start(info, NULL, colorPtr, colorCountPtr)) {
|
| return nullptr;
|
| }
|
| @@ -104,13 +96,20 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
| if (!encoded) {
|
| return SkStringPrintf("Couldn't read %s.", fPath.c_str());
|
| }
|
| - SkAutoTDelete<SkCodec> codec(SkScaledCodec::NewFromData(encoded));
|
| - if (nullptr == codec.get()) {
|
| - // scaledCodec not supported, try normal codec
|
| - codec.reset(SkCodec::NewFromData(encoded));
|
| + SkAutoTDelete<SkCodec> codec(NULL);
|
| + if (kScaledCodec_Mode == fMode) {
|
| + codec.reset(SkScaledCodec::NewFromData(encoded));
|
| + // TODO (msarett): This should fall through to a fatal error once we support scaled
|
| + // codecs for all image types.
|
| if (nullptr == codec.get()) {
|
| - return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str());
|
| + return Error::Nonfatal(SkStringPrintf("Couldn't create scaled codec for %s.",
|
| + fPath.c_str()));
|
| }
|
| + } else {
|
| + codec.reset(SkCodec::NewFromData(encoded));
|
| + }
|
| + if (nullptr == codec.get()) {
|
| + return SkStringPrintf("Couldn't create codec for %s.", fPath.c_str());
|
| }
|
|
|
| // Choose the color type to decode to
|
| @@ -171,7 +170,8 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
| }
|
|
|
| switch (fMode) {
|
| - case kNormal_Mode: {
|
| + case kScaledCodec_Mode:
|
| + case kCodec_Mode: {
|
| switch (codec->getPixels(decodeInfo, bitmap.getPixels(), bitmap.rowBytes(), nullptr,
|
| colorPtr, colorCountPtr)) {
|
| case SkCodec::kSuccess:
|
| @@ -192,7 +192,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
| SkAutoTDelete<SkScanlineDecoder> scanlineDecoder(
|
| start_scanline_decoder(encoded.get(), decodeInfo, colorPtr, colorCountPtr));
|
| if (nullptr == scanlineDecoder) {
|
| - return Error::Nonfatal("Could not start top-down scanline decoder");
|
| + return Error::Nonfatal("Could not start scanline decoder");
|
| }
|
|
|
| const SkCodec::Result result = scanlineDecoder->getScanlines(
|
| @@ -234,7 +234,8 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
| SkImageInfo largestSubsetDecodeInfo =
|
| decodeInfo.makeWH(subsetWidth + extraX, subsetHeight + extraY);
|
| SkBitmap largestSubsetBm;
|
| - if (!largestSubsetBm.tryAllocPixels(largestSubsetDecodeInfo, nullptr, colorTable.get())) {
|
| + if (!largestSubsetBm.tryAllocPixels(largestSubsetDecodeInfo, nullptr,
|
| + colorTable.get())) {
|
| return SkStringPrintf("Image(%s) is too large (%d x %d)\n", fPath.c_str(),
|
| largestSubsetDecodeInfo.width(), largestSubsetDecodeInfo.height());
|
| }
|
| @@ -252,10 +253,11 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
| subsetHeight + extraY : subsetHeight;
|
| const int y = row * subsetHeight;
|
| //create scanline decoder for each subset
|
| - SkAutoTDelete<SkScanlineDecoder> subsetScanlineDecoder(
|
| - start_scanline_decoder(encoded.get(), decodeInfo,
|
| - colorPtr, colorCountPtr));
|
| - if (nullptr == subsetScanlineDecoder) {
|
| + SkAutoTDelete<SkScanlineDecoder> decoder(start_scanline_decoder(encoded.get(),
|
| + decodeInfo, colorPtr, colorCountPtr));
|
| + // TODO (msarett): Support this mode for all scanline orderings.
|
| + if (nullptr == decoder || SkScanlineDecoder::kTopDown_SkScanlineOrder !=
|
| + decoder->getScanlineOrder()) {
|
| if (x == 0 && y == 0) {
|
| //first try, image may not be compatible
|
| return Error::Nonfatal("Could not start top-down scanline decoder");
|
| @@ -264,8 +266,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
| }
|
| }
|
| //skip to first line of subset
|
| - const SkCodec::Result skipResult =
|
| - subsetScanlineDecoder->skipScanlines(y);
|
| + const SkCodec::Result skipResult = decoder->skipScanlines(y);
|
| switch (skipResult) {
|
| case SkCodec::kSuccess:
|
| case SkCodec::kIncompleteInput:
|
| @@ -281,7 +282,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
| SkAssertResult(largestSubsetBm.extractSubset(&subsetBm, bounds));
|
| SkAutoLockPixels autlockSubsetBm(subsetBm, true);
|
| const SkCodec::Result subsetResult =
|
| - subsetScanlineDecoder->getScanlines(buffer, currentSubsetHeight, rowBytes);
|
| + decoder->getScanlines(buffer, currentSubsetHeight, rowBytes);
|
| switch (subsetResult) {
|
| case SkCodec::kSuccess:
|
| case SkCodec::kIncompleteInput:
|
| @@ -323,7 +324,11 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
| // Decode odd stripes
|
| SkAutoTDelete<SkScanlineDecoder> decoder(
|
| start_scanline_decoder(encoded.get(), decodeInfo, colorPtr, colorCountPtr));
|
| - if (nullptr == decoder) {
|
| + if (nullptr == decoder ||
|
| + SkScanlineDecoder::kTopDown_SkScanlineOrder != decoder->getScanlineOrder()) {
|
| + // This mode was designed to test the new skip scanlines API in libjpeg-turbo.
|
| + // Jpegs have kTopDown_SkScanlineOrder, and at this time, it is not interesting
|
| + // to run this test for image types that do not have this scanline ordering.
|
| return Error::Nonfatal("Could not start top-down scanline decoder");
|
| }
|
| for (int i = 0; i < numStripes; i += 2) {
|
|
|