Index: dm/DMSrcSink.cpp |
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp |
index 24ae2d6087ebd4da20775ca7710072190a42d8e3..253f8a69fb2b8d03011045597a0d1c618fd7fd92 100644 |
--- a/dm/DMSrcSink.cpp |
+++ b/dm/DMSrcSink.cpp |
@@ -684,9 +684,9 @@ Error AndroidCodecSrc::draw(SkCanvas* canvas) const { |
return Error::Nonfatal("Divisor is larger than image dimension.\n"); |
} |
- // Rounding the size of the subsets may leave some pixels uninitialized on the bottom |
- // and right edges of the bitmap. |
- bitmap.eraseColor(0); |
+ // Keep track of the final decoded dimensions. |
+ int finalScaledWidth = 0; |
+ int finalScaledHeight = 0; |
for (int x = 0; x < divisor; x++) { |
for (int y = 0; y < divisor; y++) { |
// Calculate the subset dimensions |
@@ -704,13 +704,19 @@ Error AndroidCodecSrc::draw(SkCanvas* canvas) const { |
return "Could not get supported subset to decode.\n"; |
} |
options.fSubset = ⊂ |
- void* pixels = bitmap.getAddr(subset.left() / fSampleSize, |
- subset.top() / fSampleSize); |
+ const int scaledWidthOffset = subset.left() / fSampleSize; |
+ const int scaledHeightOffset = subset.top() / fSampleSize; |
+ void* pixels = bitmap.getAddr(scaledWidthOffset, scaledHeightOffset); |
SkISize scaledSubsetSize = codec->getSampledSubsetDimensions(fSampleSize, |
subset); |
SkImageInfo subsetDecodeInfo = decodeInfo.makeWH(scaledSubsetSize.width(), |
scaledSubsetSize.height()); |
+ if (x + 1 == divisor && y + 1 == divisor) { |
+ finalScaledWidth = scaledWidthOffset + scaledSubsetSize.width(); |
+ finalScaledHeight = scaledHeightOffset + scaledSubsetSize.height(); |
+ } |
+ |
switch (codec->getAndroidPixels(subsetDecodeInfo, pixels, bitmap.rowBytes(), |
&options)) { |
case SkCodec::kSuccess: |
@@ -723,7 +729,10 @@ Error AndroidCodecSrc::draw(SkCanvas* canvas) const { |
} |
} |
} |
- canvas->drawBitmap(bitmap, 0, 0); |
+ |
+ SkRect rect = SkRect::MakeXYWH(0, 0, (SkScalar) finalScaledWidth, |
+ (SkScalar) finalScaledHeight); |
+ canvas->drawBitmapRect(bitmap, rect, rect, nullptr); |
return ""; |
} |
default: |