diff options
Diffstat (limited to 'WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp')
-rw-r--r-- | WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp | 86 |
1 files changed, 17 insertions, 69 deletions
diff --git a/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp b/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp index 2565ea6..ae09586 100644 --- a/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp +++ b/WebCore/platform/image-decoders/jpeg/JPEGImageDecoder.cpp @@ -461,27 +461,11 @@ void JPEGImageDecoder::decode(bool sizeOnly) } } -static void convertCMYKToRGBA(RGBA32Buffer& dest, int destY, JSAMPROW src, int srcWidth -#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) - , bool scaled, const Vector<int>& scaledColumns -#endif - ) +static void convertCMYKToRGBA(RGBA32Buffer& dest, JSAMPROW src, jpeg_decompress_struct* info) { -#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) - if (scaled) { - int numColumns = scaledColumns.size(); - for (int x = 0; x < numColumns; ++x) { - JSAMPLE* jsample = src + scaledColumns[x] * 3; - unsigned c = jsample[0]; - unsigned m = jsample[1]; - unsigned y = jsample[2]; - unsigned k = jsample[3]; - dest.setRGBA(x, destY, c * k / 255, m * k / 255, y * k / 255, 0xFF); - } - return; - } -#endif - for (unsigned x = 0; x < srcWidth; ++x) { + ASSERT(info->out_color_space == JCS_CMYK); + + for (unsigned x = 0; x < info->output_width; ++x) { unsigned c = *src++; unsigned m = *src++; unsigned y = *src++; @@ -505,31 +489,23 @@ static void convertCMYKToRGBA(RGBA32Buffer& dest, int destY, JSAMPROW src, int s // G = 1 - M => 1 - (1 - iM*iK) => iM*iK // B = 1 - Y => 1 - (1 - iY*iK) => iY*iK - dest.setRGBA(x, destY, c * k / 255, m * k / 255, y * k / 255, 0xFF); + // read_scanlines has increased the scanline counter, so we + // actually mean the previous one. + dest.setRGBA(x, info->output_scanline - 1, c * k / 255, m * k / 255, y * k / 255, 0xFF); } } -static void convertRGBToRGBA(RGBA32Buffer& dest, int destY, JSAMPROW src, int srcWidth -#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) - , bool scaled, const Vector<int>& scaledColumns -#endif - ) +static void convertRGBToRGBA(RGBA32Buffer& dest, JSAMPROW src, jpeg_decompress_struct* info) { -#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) - if (scaled) { - int numColumns = scaledColumns.size(); - for (int x = 0; x < numColumns; ++x) { - JSAMPLE* jsample = src + scaledColumns[x] * 3; - dest.setRGBA(x, destY, jsample[0], jsample[1], jsample[2], 0xFF); - } - return; - } -#endif - for (unsigned x = 0; x < srcWidth; ++x) { + ASSERT(info->out_color_space == JCS_RGB); + + for (unsigned x = 0; x < info->output_width; ++x) { unsigned r = *src++; unsigned g = *src++; unsigned b = *src++; - dest.setRGBA(x, destY, r, g, b, 0xFF); + // read_scanlines has increased the scanline counter, so we + // actually mean the previous one. + dest.setRGBA(x, info->output_scanline - 1, r, g, b, 0xFF); } } @@ -541,17 +517,7 @@ bool JPEGImageDecoder::outputScanlines() // Initialize the framebuffer if needed. RGBA32Buffer& buffer = m_frameBufferCache[0]; if (buffer.status() == RGBA32Buffer::FrameEmpty) { - int bufferWidth = size().width(); - int bufferHeight = size().height(); -#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) - // Let's resize our buffer now to the correct width/height. - if (m_scaled) { - bufferWidth = m_scaledColumns.size(); - bufferHeight = m_scaledRows.size(); - } -#endif - - if (!buffer.setSize(bufferWidth, bufferHeight)) { + if (!buffer.setSize(size().width(), size().height())) { m_failed = true; return false; } @@ -566,34 +532,16 @@ bool JPEGImageDecoder::outputScanlines() JSAMPARRAY samples = m_reader->samples(); while (info->output_scanline < info->output_height) { - // jpeg_read_scanlines will increase the scanline counter, so we - // save the scanline before calling it. - int sourceY = info->output_scanline; /* Request one scanline. Returns 0 or 1 scanlines. */ if (jpeg_read_scanlines(info, samples, 1) != 1) return false; - int destY = sourceY; -#if ENABLE(IMAGE_DECODER_DOWN_SAMPLING) - if (m_scaled) { - destY = scaledY(sourceY); - if (destY < 0) - continue; - } if (info->out_color_space == JCS_RGB) - convertRGBToRGBA(buffer, destY, *samples, info->output_width, m_scaled, m_scaledColumns); + convertRGBToRGBA(buffer, *samples, info); else if (info->out_color_space == JCS_CMYK) - convertCMYKToRGBA(buffer, destY, *samples, info->output_width, m_scaled, m_scaledColumns); + convertCMYKToRGBA(buffer, *samples, info); else return false; -#else - if (info->out_color_space == JCS_RGB) - convertRGBToRGBA(buffer, destY, *samples, info->output_width); - else if (info->out_color_space == JCS_CMYK) - convertCMYKToRGBA(buffer, destY, *samples, info->output_width); - else - return false; -#endif } return true; |