Fix bug in SkJPEGImageDecoder.
The calculation of actualSampleSize should be rounding up not down.
Change-Id: I2964e92265d9e3b1e8e6843c3d1fc0a1528afd4a
diff --git a/src/images/SkImageDecoder_libjpeg.cpp b/src/images/SkImageDecoder_libjpeg.cpp
index 2318a37..29c4b46 100644
--- a/src/images/SkImageDecoder_libjpeg.cpp
+++ b/src/images/SkImageDecoder_libjpeg.cpp
@@ -175,12 +175,10 @@
static bool skip_src_rows_tile(jpeg_decompress_struct* cinfo,
huffman_index *index, void* buffer,
- int startX, int startY, int width, int height,
int count) {
for (int i = 0; i < count; i++) {
JSAMPLE* rowptr = (JSAMPLE*)buffer;
- int row_count = jpeg_read_tile_scanline(cinfo, index, &rowptr,
- startX, startY, width, height);
+ int row_count = jpeg_read_tile_scanline(cinfo, index, &rowptr);
if (row_count != 1) {
return false;
}
@@ -597,11 +595,11 @@
jpeg_init_read_tile_scanline(cinfo, index->index,
&startX, &startY, &width, &height);
int skiaSampleSize = recompute_sampleSize(requestedSampleSize, *cinfo);
+ int actualSampleSize = skiaSampleSize * (DCTSIZE / cinfo->min_DCT_scaled_size);
+
SkBitmap *bitmap = new SkBitmap;
SkAutoTDelete<SkBitmap> adb(bitmap);
- int actualSampleSize = skiaSampleSize * cinfo->image_width / cinfo->output_width;
-
#ifdef ANDROID_RGB
/* short-circuit the SkScaledBitmapSampler when possible, as this gives
a significant performance boost.
@@ -624,7 +622,7 @@
while (row_total_count < height) {
int row_count = jpeg_read_tile_scanline(cinfo,
- index->index, &rowptr, startX, startY, width, height);
+ index->index, &rowptr);
// if row_count == 0, then we didn't get a scanline, so abort.
// if we supported partial images, we might return true in this case
if (0 == row_count) {
@@ -673,16 +671,14 @@
uint8_t* srcRow = (uint8_t*)srcStorage.alloc(width * 4);
// Possibly skip initial rows [sampler.srcY0]
- if (!skip_src_rows_tile(cinfo, index->index, srcRow,
- startX, startY, width, height, sampler.srcY0())) {
+ if (!skip_src_rows_tile(cinfo, index->index, srcRow, sampler.srcY0())) {
return return_false(*cinfo, *bitmap, "skip rows");
}
// now loop through scanlines until y == bitmap->height() - 1
for (int y = 0;; y++) {
JSAMPLE* rowptr = (JSAMPLE*)srcRow;
- int row_count = jpeg_read_tile_scanline(cinfo, index->index, &rowptr,
- startX, startY, width, height);
+ int row_count = jpeg_read_tile_scanline(cinfo, index->index, &rowptr);
if (0 == row_count) {
return return_false(*cinfo, *bitmap, "read_scanlines");
}
@@ -697,7 +693,6 @@
}
if (!skip_src_rows_tile(cinfo, index->index, srcRow,
- startX, startY, width, height,
sampler.srcDY() - 1)) {
return return_false(*cinfo, *bitmap, "skip rows");
}