Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(964)

Unified Diff: Source/core/platform/image-decoders/jpeg/JPEGImageDecoder.cpp

Issue 15466004: Make image decoders faster by refactoring hot loops that fills the lines of ImageFrame. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Make image decoders faster by refactoring hot loops that fills the lines of ImageFrame. Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
diff --git a/Source/core/platform/image-decoders/jpeg/JPEGImageDecoder.cpp b/Source/core/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
index 7974b79a7ee2dd3a4fbb4c7579bab8dad2315872..cc2b43bda198021fc04cc63296919b11c8df7e47 100644
--- a/Source/core/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
+++ b/Source/core/platform/image-decoders/jpeg/JPEGImageDecoder.cpp
@@ -637,31 +637,7 @@ bool JPEGImageDecoder::setFailed()
return ImageDecoder::setFailed();
}
-template <J_COLOR_SPACE colorSpace> void setPixel(ImageFrame& buffer, ImageFrame::PixelData* pixel, JSAMPARRAY samples, int column)
-{
- JSAMPLE* jsample = *samples + column * (colorSpace == JCS_RGB ? 3 : 4);
-
- switch (colorSpace) {
- case JCS_RGB:
- buffer.setRGBA(pixel, jsample[0], jsample[1], jsample[2], 0xFF);
- break;
- case JCS_CMYK:
- // Source is 'Inverted CMYK', output is RGB.
- // See: http://www.easyrgb.com/math.php?MATH=M12#text12
- // Or: http://www.ilkeratalay.com/colorspacesfaq.php#rgb
- // From CMYK to CMY:
- // X = X * (1 - K ) + K [for X = C, M, or Y]
- // Thus, from Inverted CMYK to CMY is:
- // X = (1-iX) * (1 - (1-iK)) + (1-iK) => 1 - iX*iK
- // From CMY (0..1) to RGB (0..1):
- // R = 1 - C => 1 - (1 - iC*iK) => iC*iK [G and B similar]
- unsigned k = jsample[3];
- buffer.setRGBA(pixel, jsample[0] * k / 255, jsample[1] * k / 255, jsample[2] * k / 255, 0xFF);
- break;
- }
-}
-
-template <J_COLOR_SPACE colorSpace> bool outputRows(JPEGImageReader* reader, ImageFrame& buffer)
+static bool outputRows(JPEGImageReader* reader, ImageFrame& buffer, J_COLOR_SPACE colorSpace)
{
JSAMPARRAY samples = reader->samples();
jpeg_decompress_struct* info = reader->info();
@@ -678,9 +654,13 @@ template <J_COLOR_SPACE colorSpace> bool outputRows(JPEGImageReader* reader, Ima
if (reader->colorTransform() && colorSpace == JCS_RGB)
qcms_transform_data(reader->colorTransform(), *samples, *samples, width);
#endif
- ImageFrame::PixelData* pixel = buffer.getAddr(0, y);
- for (int x = 0; x < width; ++pixel, ++x)
- setPixel<colorSpace>(buffer, pixel, samples, x);
+ unsigned const char* row = *samples;
+ if (colorSpace == JCS_RGB)
+ buffer.fillRowFromRGBSource(y, row);
+ else if (colorSpace == JCS_CMYK)
+ buffer.fillRowFromInvertedCMYK(y, row);
+ else
+ ASSERT_NOT_REACHED();
}
return true;
@@ -722,16 +702,7 @@ bool JPEGImageDecoder::outputScanlines()
}
#endif
- switch (info->out_color_space) {
- case JCS_RGB:
- return outputRows<JCS_RGB>(m_reader.get(), buffer);
- case JCS_CMYK:
- return outputRows<JCS_CMYK>(m_reader.get(), buffer);
- default:
- ASSERT_NOT_REACHED();
- }
-
- return setFailed();
+ return outputRows(m_reader.get(), buffer, info->out_color_space);
}
void JPEGImageDecoder::jpegComplete()

Powered by Google App Engine
This is Rietveld 408576698