| Index: dm/DMSrcSink.cpp
|
| diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp
|
| index e27628ad043aeedc9676dfd1a00187c843ad2fa8..1ee838e6c753fb29b4effbfbf4dab45a28750458 100644
|
| --- a/dm/DMSrcSink.cpp
|
| +++ b/dm/DMSrcSink.cpp
|
| @@ -373,6 +373,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
| break;
|
| }
|
| case kStripe_Mode: {
|
| + const int width = decodeInfo.width();
|
| const int height = decodeInfo.height();
|
| // This value is chosen arbitrarily. We exercise more cases by choosing a value that
|
| // does not align with image blocks.
|
| @@ -380,7 +381,10 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
| const int numStripes = (height + stripeHeight - 1) / stripeHeight;
|
|
|
| // Decode odd stripes
|
| - if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, NULL, colorPtr,
|
| + SkCodec::Options opts;
|
| + SkIRect subset = SkIRect::MakeXYWH(0, 0, width / 2, height);
|
| + opts.fSubset = ⊂
|
| + if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, &opts, colorPtr,
|
| colorCountPtr)
|
| || SkCodec::kTopDown_SkScanlineOrder != codec->getScanlineOrder()) {
|
| // This mode was designed to test the new skip scanlines API in libjpeg-turbo.
|
| @@ -403,7 +407,7 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
| }
|
|
|
| // Decode even stripes
|
| - const SkCodec::Result startResult = codec->startScanlineDecode(decodeInfo, nullptr,
|
| + SkCodec::Result startResult = codec->startScanlineDecode(decodeInfo, &opts,
|
| colorPtr, colorCountPtr);
|
| if (SkCodec::kSuccess != startResult) {
|
| return "Failed to restart scanline decoder with same parameters.";
|
| @@ -420,6 +424,48 @@ Error CodecSrc::draw(SkCanvas* canvas) const {
|
| codec->skipScanlines(linesToSkip);
|
| }
|
| }
|
| +
|
| + // Begin duplicated code
|
| + SkIRect nextSubset = SkIRect::MakeXYWH(width / 2, 0, width / 2 + width % 2, height);
|
| + opts.fSubset = &nextSubset;
|
| + startResult = codec->startScanlineDecode(decodeInfo, &opts, colorPtr, colorCountPtr);
|
| + if (SkCodec::kSuccess != startResult) {
|
| + return "Failed to restart scanline decoder with same parameters.";
|
| + }
|
| +
|
| + for (int i = 0; i < numStripes; i += 2) {
|
| + // Skip a stripe
|
| + const int linesToSkip = SkTMin(stripeHeight, height - i * stripeHeight);
|
| + codec->skipScanlines(linesToSkip);
|
| +
|
| + // Read a stripe
|
| + const int startY = (i + 1) * stripeHeight;
|
| + const int linesToRead = SkTMin(stripeHeight, height - startY);
|
| + if (linesToRead > 0) {
|
| + codec->getScanlines(bitmap.getAddr(width / 2, startY), linesToRead,
|
| + bitmap.rowBytes());
|
| + }
|
| + }
|
| +
|
| + // Decode even stripes
|
| + startResult = codec->startScanlineDecode(decodeInfo, &opts, colorPtr, colorCountPtr);
|
| + if (SkCodec::kSuccess != startResult) {
|
| + return "Failed to restart scanline decoder with same parameters.";
|
| + }
|
| + for (int i = 0; i < numStripes; i += 2) {
|
| + // Read a stripe
|
| + const int startY = i * stripeHeight;
|
| + const int linesToRead = SkTMin(stripeHeight, height - startY);
|
| + codec->getScanlines(bitmap.getAddr(width / 2, startY), linesToRead, bitmap.rowBytes());
|
| +
|
| + // Skip a stripe
|
| + const int linesToSkip = SkTMin(stripeHeight, height - (i + 1) * stripeHeight);
|
| + if (linesToSkip > 0) {
|
| + codec->skipScanlines(linesToSkip);
|
| + }
|
| + }
|
| +
|
| +
|
| canvas->drawBitmap(bitmap, 0, 0);
|
| break;
|
| }
|
|
|