summaryrefslogtreecommitdiffstats
path: root/www/libxul/files/patch-bug791305
diff options
context:
space:
mode:
Diffstat (limited to 'www/libxul/files/patch-bug791305')
-rw-r--r--www/libxul/files/patch-bug791305107
1 files changed, 107 insertions, 0 deletions
diff --git a/www/libxul/files/patch-bug791305 b/www/libxul/files/patch-bug791305
new file mode 100644
index 0000000..534e7f2
--- /dev/null
+++ b/www/libxul/files/patch-bug791305
@@ -0,0 +1,107 @@
+commit c269a16
+Author: Jeff Muizelaar <jmuizelaar@mozilla.com>
+Date: Fri Sep 14 15:54:55 2012 -0400
+
+ Bug 791305. Use libjpeg's color conversion code instead of our own. r=joe,r=khuey
+
+ libjpeg-turbo supports converting directly to a format compatible with cairo's
+ FORMAT_RGB24. Use that instead of our own handcoded function. This also gives
+ us SSE2 and NEON version of this function.
+
+ --HG--
+ extra : rebase_source : 18f48925f023a33ec2a097d4f4e5cc2ab40be1e9
+---
+ configure.in | 6 +-
+ image/decoders/nsJPEGDecoder.cpp | 311 ++-------------------------------------
+ 2 files changed, 20 insertions(+), 297 deletions(-)
+
+diff --git image/decoders/nsJPEGDecoder.cpp image/decoders/nsJPEGDecoder.cpp
+index c1fb515..1d2a259 100644
+--- image/decoders/nsJPEGDecoder.cpp
++++ image/decoders/nsJPEGDecoder.cpp
+@@ -22,6 +22,13 @@
+ extern "C" {
+ #include "iccjpeg.h"
+
++#ifdef JCS_EXTENSIONS
++#if defined(IS_BIG_ENDIAN)
++#define MOZ_JCS_EXT_NATIVE_ENDIAN_XRGB JCS_EXT_XRGB
++#else
++#define MOZ_JCS_EXT_NATIVE_ENDIAN_XRGB JCS_EXT_BGRX
++#endif
++#else
+ /* Colorspace conversion (copied from jpegint.h) */
+ struct jpeg_color_deconverter {
+ JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
+@@ -34,6 +41,7 @@ METHODDEF(void)
+ ycc_rgb_convert_argb (j_decompress_ptr cinfo,
+ JSAMPIMAGE input_buf, JDIMENSION input_row,
+ JSAMPARRAY output_buf, int num_rows);
++#endif
+ }
+
+ static void cmyk_convert_rgb(JSAMPROW row, JDIMENSION width);
+@@ -329,7 +340,18 @@ nsJPEGDecoder::WriteInternal(const char *aBuffer, PRUint32 aCount)
+ case JCS_GRAYSCALE:
+ case JCS_RGB:
+ case JCS_YCbCr:
++#ifdef JCS_EXTENSIONS
++ // if we're not color managing we can decode directly to
++ // MOZ_JCS_EXT_NATIVE_ENDIAN_XRGB
++ if (mCMSMode != eCMSMode_All) {
++ mInfo.out_color_space = MOZ_JCS_EXT_NATIVE_ENDIAN_XRGB;
++ mInfo.out_color_components = 4;
++ } else {
++ mInfo.out_color_space = JCS_RGB;
++ }
++#else
+ mInfo.out_color_space = JCS_RGB;
++#endif
+ break;
+ case JCS_CMYK:
+ case JCS_YCCK:
+@@ -397,6 +419,7 @@ nsJPEGDecoder::WriteInternal(const char *aBuffer, PRUint32 aCount)
+ return; /* I/O suspension */
+ }
+
++#ifndef JCS_EXTENSIONS
+ /* Force to use our YCbCr to Packed RGB converter when possible */
+ if (!mTransform && (mCMSMode != eCMSMode_All) &&
+ mInfo.jpeg_color_space == JCS_YCbCr && mInfo.out_color_space == JCS_RGB) {
+@@ -404,6 +427,7 @@ nsJPEGDecoder::WriteInternal(const char *aBuffer, PRUint32 aCount)
+ mInfo.out_color_components = 4; /* Packed ARGB pixels are always 4 bytes...*/
+ mInfo.cconvert->color_convert = ycc_rgb_convert_argb;
+ }
++#endif
+
+ /* If this is a progressive JPEG ... */
+ mState = mInfo.buffered_image ? JPEG_DECOMPRESS_PROGRESSIVE : JPEG_DECOMPRESS_SEQUENTIAL;
+@@ -542,7 +566,11 @@ nsJPEGDecoder::OutputScanlines(bool* suspend)
+ PRUint32 *imageRow = ((PRUint32*)mImageData) +
+ (mInfo.output_scanline * mInfo.output_width);
+
++#ifdef JCS_EXTENSIONS
++ if (mInfo.out_color_space == MOZ_JCS_EXT_NATIVE_ENDIAN_XRGB) {
++#else
+ if (mInfo.cconvert->color_convert == ycc_rgb_convert_argb) {
++#endif
+ /* Special case: scanline will be directly converted into packed ARGB */
+ if (jpeg_read_scanlines(&mInfo, (JSAMPARRAY)&imageRow, 1) != 1) {
+ *suspend = true; /* suspend */
+@@ -858,6 +887,7 @@ term_source (j_decompress_ptr jd)
+ } // namespace mozilla
+
+
++#ifndef JCS_EXTENSIONS
+ /**************** YCbCr -> Cairo's RGB24/ARGB32 conversion: most common case **************/
+
+ /*
+@@ -1130,7 +1160,8 @@ ycc_rgb_convert_argb (j_decompress_ptr cinfo,
+ }
+ }
+ }
++#endif
+
+
+ /**************** Inverted CMYK -> RGB conversion **************/
+ /*
OpenPOWER on IntegriCloud