]> granicus.if.org Git - libjpeg-turbo/commitdiff
Port RGB-to-Grayscale color transform from jpeg-8d
authorDRC <dcommander@users.sourceforge.net>
Tue, 1 Jan 2013 10:52:29 +0000 (10:52 +0000)
committerDRC <dcommander@users.sourceforge.net>
Tue, 1 Jan 2013 10:52:29 +0000 (10:52 +0000)
git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/trunk@885 632fc199-4ca6-4c93-a231-07263d6284db

1  2 
ChangeLog.txt
jdcolor.c
libjpeg.txt

diff --cc ChangeLog.txt
index 0dd5e8277bdb7644f9522470f2d89b183c9f3309,0000000000000000000000000000000000000000..13dc0ab60951f1d5f15f1e5cd07429ba547740b6
mode 100644,000000..100644
--- /dev/null
@@@ -1,363 -1,0 +1,366 @@@
 +1.2.90 (1.3 beta1)
 +==================
 +
 +[1] Added support for additional scaling factors (3/8, 5/8, 3/4, 7/8, 9/8, 5/4,
 +11/8, 3/2, 13/8, 7/4, 15/8, and 2) when decompressing.  Note that the IDCT will
 +not be SIMD-accelerated when using any of these new scaling factors.
 +
 +[2] The TurboJPEG dynamic library is now versioned.  It was not strictly
 +necessary to do so, because TurboJPEG uses versioned symbols, and if a function
 +changes in an ABI-incompatible way, that function is renamed and a legacy
 +function is provided to maintain backward compatibility.  However, certain
 +Linux distro maintainers will blindly reject any library that is not versioned,
 +so this was an attempt to make them happy.
 +
 +[3] Extended the TurboJPEG Java API so that it can be used to compress a JPEG
 +image from and decompress a JPEG image to an arbitrary position in a large
 +image buffer.
 +
 +[4] The tjDecompressToYUV() function now supports the TJFLAG_FASTDCT flag.
 +
 +[5] The 32-bit supplementary package for amd64 Debian systems now provides
 +symlinks in /usr/lib/i386-linux-gnu for the TurboJPEG libraries in /usr/lib32.
 +This allows those libraries to be used on MultiArch-compatible systems (such as
 +Ubuntu 11 and later) without setting the linker path.
 +
 +[6] The TurboJPEG Java wrapper should now find the JNI library on Mac systems
 +without having to pass -Djava.library.path=/usr/lib to java.
 +
 +[7] TJBench has been ported to Java to provide a convenient way of validating
 +the performance of the TurboJPEG Java API.  It can be run with
 +'java -cp turbojpeg.jar TJBench'.
 +
 +[8] cjpeg can now be used to generate JPEG files with the RGB colorspace
 +(feature ported from jpeg-8d.)
 +
 +[9] The width and height in the -crop argument passed to jpegtran can now be
 +suffixed with "f" to indicate that, when the upper left corner of the cropping
 +region is automatically moved to the nearest iMCU boundary, the bottom right
 +corner should be moved by the same amount.  In other words, this feature causes
 +jpegtran to strictly honor the specified width/height rather than the specified
 +bottom right corner (feature ported from jpeg-8d.)
 +
++[10] JPEG files using the RGB colorspace can now be decompressed into grayscale
++images (feature ported from jpeg-8d.)
++
 +
 +1.2.1
 +=====
 +
 +[1] Creating or decoding a JPEG file that uses the RGB colorspace should now
 +properly work when the input or output colorspace is one of the libjpeg-turbo
 +colorspace extensions.
 +
 +[2] When libjpeg-turbo was built without SIMD support and merged (non-fancy)
 +upsampling was used along with an alpha-enabled colorspace during
 +decompression, the unused byte of the decompressed pixels was not being set to
 +0xFF.  This has been fixed.  TJUnitTest has also been extended to test for the
 +correct behavior of the colorspace extensions when merged upsampling is used.
 +
 +[3] Fixed a bug whereby the libjpeg-turbo SSE2 SIMD code would not preserve the
 +upper 64 bits of xmm6 and xmm7 on Win64 platforms, which violated the Win64
 +calling conventions.
 +
 +[4] Fixed a regression caused by 1.2.0[6] whereby decompressing corrupt JPEG
 +images (specifically, images in which the component count was erroneously set
 +to a large value) would cause libjpeg-turbo to segfault.
 +
 +[5] Worked around a severe performance issue with "Bobcat" (AMD Embedded APU)
 +processors.  The MASKMOVDQU instruction, which was used by the libjpeg-turbo
 +SSE2 SIMD code, is apparently implemented in microcode on AMD processors, and
 +it is painfully slow on Bobcat processors in particular.  Eliminating the use
 +of this instruction improved performance by an order of magnitude on Bobcat
 +processors and by a small amount (typically 5%) on AMD desktop processors.
 +
 +[6] Added SIMD acceleration for performing 4:2:2 upsampling on NEON-capable ARM
 +platforms.  This speeds up the decompression of 4:2:2 JPEGs by 20-25% on such
 +platforms.
 +
 +[7] Fixed a regression caused by 1.2.0[2] whereby, on Linux/x86 platforms
 +running the 32-bit SSE2 SIMD code in libjpeg-turbo, decompressing a 4:2:0 or
 +4:2:2 JPEG image into a 32-bit (RGBX, BGRX, etc.) buffer without using fancy
 +upsampling would produce several incorrect columns of pixels at the right-hand
 +side of the output image if each row in the output image was not evenly
 +divisible by 16 bytes.
 +
 +[8] Fixed an issue whereby attempting to build the SIMD extensions with Xcode
 +4.3 on OS X platforms would cause NASM to return numerous errors of the form
 +"'%define' expects a macro identifier".
 +
 +[9] Added flags to the TurboJPEG API that allow the caller to force the use of
 +either the fast or the accurate DCT/IDCT algorithms in the underlying codec.
 +
 +
 +1.2.0
 +=====
 +
 +[1] Fixed build issue with YASM on Unix systems (the libjpeg-turbo build system
 +was not adding the current directory to the assembler include path, so YASM
 +was not able to find jsimdcfg.inc.)
 +
 +[2] Fixed out-of-bounds read in SSE2 SIMD code that occurred when decompressing
 +a JPEG image to a bitmap buffer whose size was not a multiple of 16 bytes.
 +This was more of an annoyance than an actual bug, since it did not cause any
 +actual run-time problems, but the issue showed up when running libjpeg-turbo in
 +valgrind.  See http://crbug.com/72399 for more information.
 +
 +[3] Added a compile-time macro (LIBJPEG_TURBO_VERSION) that can be used to
 +check the version of libjpeg-turbo against which an application was compiled.
 +
 +[4] Added new RGBA/BGRA/ABGR/ARGB colorspace extension constants (libjpeg API)
 +and pixel formats (TurboJPEG API), which allow applications to specify that,
 +when decompressing to a 4-component RGB buffer, the unused byte should be set
 +to 0xFF so that it can be interpreted as an opaque alpha channel.
 +
 +[5] Fixed regression issue whereby DevIL failed to build against libjpeg-turbo
 +because libjpeg-turbo's distributed version of jconfig.h contained an INLINE
 +macro, which conflicted with a similar macro in DevIL.  This macro is used only
 +internally when building libjpeg-turbo, so it was moved into config.h.
 +
 +[6] libjpeg-turbo will now correctly decompress erroneous CMYK/YCCK JPEGs whose
 +K component is assigned a component ID of 1 instead of 4.  Although these files
 +are in violation of the spec, other JPEG implementations handle them
 +correctly.
 +
 +[7] Added ARM v6 and ARM v7 architectures to libjpeg.a and libturbojpeg.a in
 +the official OS X distribution package, so that those libraries can be used to
 +build both OS X and iOS applications.
 +
 +
 +1.1.90 (1.2 beta1)
 +==================
 +
 +[1] Added a Java wrapper for the TurboJPEG API.  See java/README for more
 +details.
 +
 +[2] The TurboJPEG API can now be used to scale down images during
 +decompression.
 +
 +[3] Added SIMD routines for RGB-to-grayscale color conversion, which
 +significantly improves the performance of grayscale JPEG compression from an
 +RGB source image.
 +
 +[4] Improved the performance of the C color conversion routines, which are used
 +on platforms for which SIMD acceleration is not available.
 +
 +[5] Added a function to the TurboJPEG API that performs lossless transforms.
 +This function is implemented using the same back end as jpegtran, but it
 +performs transcoding entirely in memory and allows multiple transforms and/or
 +crop operations to be batched together, so the source coefficients only need to
 +be read once.  This is useful when generating image tiles from a single source
 +JPEG.
 +
 +[6] Added tests for the new TurboJPEG scaled decompression and lossless
 +transform features to tjbench (the TurboJPEG benchmark, formerly called
 +"jpgtest".)
 +
 +[7] Added support for 4:4:0 (transposed 4:2:2) subsampling in TurboJPEG, which
 +was necessary in order for it to read 4:2:2 JPEG files that had been losslessly
 +transposed or rotated 90 degrees.
 +
 +[8] All legacy VirtualGL code has been re-factored, and this has allowed
 +libjpeg-turbo, in its entirety, to be re-licensed under a BSD-style license.
 +
 +[9] libjpeg-turbo can now be built with YASM.
 +
 +[10] Added SIMD acceleration for ARM Linux and iOS platforms that support
 +NEON instructions.
 +
 +[11] Refactored the TurboJPEG C API and documented it using Doxygen.  The
 +TurboJPEG 1.2 API uses pixel formats to define the size and component order of
 +the uncompressed source/destination images, and it includes a more efficient
 +version of TJBUFSIZE() that computes a worst-case JPEG size based on the level
 +of chrominance subsampling.  The refactored implementation of TurboJPEG/OSS
 +now uses the libjpeg memory source and destination managers, which allows the
 +TurboJPEG compressor to grow the JPEG buffer as necessary.
 +
 +[12] Eliminated errors in the output of jpegtran on Windows that occurred when
 +the application was invoked using I/O redirection
 +(jpegtran <input.jpg >output.jpg).
 +
 +[13] The inclusion of libjpeg v7 and v8 emulation as well as arithmetic coding
 +support in libjpeg-turbo v1.1.0 introduced several new error constants in
 +jerror.h, and these were mistakenly enabled for all emulation modes, causing
 +the error enum in libjpeg-turbo to sometimes have different values than the
 +same enum in libjpeg.  This represents an ABI incompatibility, and it caused
 +problems with rare applications that took specific action based on a particular
 +error value.  The fix was to include the new error constants conditionally
 +based on whether libjpeg v7 or v8 emulation was enabled.
 +
 +[14] Fixed an issue whereby Windows applications that used libjpeg-turbo would
 +fail to compile if the Windows system headers were included before jpeglib.h.
 +This issue was caused by a conflict in the definition of the INT32 type.
 +
 +[15] Fixed 32-bit supplementary package for amd64 Debian systems, which was
 +broken by enhancements to the packaging system in 1.1.
 +
 +[16] When decompressing a JPEG image using an output colorspace of
 +JCS_EXT_RGBX, JCS_EXT_BGRX, JCS_EXT_XBGR, or JCS_EXT_XRGB, libjpeg-turbo will
 +now set the unused byte to 0xFF, which allows applications to interpret that
 +byte as an alpha channel (0xFF = opaque).
 +
 +
 +1.1.1
 +=====
 +
 +[1] Fixed a 1-pixel error in row 0, column 21 of the luminance plane generated
 +by tjEncodeYUV().
 +
 +[2] libjpeg-turbo's accelerated Huffman decoder previously ignored unexpected
 +markers found in the middle of the JPEG data stream during decompression.  It
 +will now hand off decoding of a particular block to the unaccelerated Huffman
 +decoder if an unexpected marker is found, so that the unaccelerated Huffman
 +decoder can generate an appropriate warning.
 +
 +[3] Older versions of MinGW64 prefixed symbol names with underscores by
 +default, which differed from the behavior of 64-bit Visual C++.  MinGW64 1.0
 +has adopted the behavior of 64-bit Visual C++ as the default, so to accommodate
 +this, the libjpeg-turbo SIMD function names are no longer prefixed with an
 +underscore when building with MinGW64.  This means that, when building
 +libjpeg-turbo with older versions of MinGW64, you will now have to add
 +-fno-leading-underscore to the CFLAGS.
 +
 +[4] Fixed a regression bug in the NSIS script that caused the Windows installer
 +build to fail when using the Visual Studio IDE.
 +
 +[5] Fixed a bug in jpeg_read_coefficients() whereby it would not initialize
 +cinfo->image_width and cinfo->image_height if libjpeg v7 or v8 emulation was
 +enabled.  This specifically caused the jpegoptim program to fail if it was
 +linked against a version of libjpeg-turbo that was built with libjpeg v7 or v8
 +emulation.
 +
 +[6] Eliminated excessive I/O overhead that occurred when reading BMP files in
 +cjpeg.
 +
 +[7] Eliminated errors in the output of cjpeg on Windows that occurred when the
 +application was invoked using I/O redirection (cjpeg <inputfile >output.jpg).
 +
 +
 +1.1.0
 +=====
 +
 +[1] The algorithm used by the SIMD quantization function cannot produce correct
 +results when the JPEG quality is >= 98 and the fast integer forward DCT is
 +used.  Thus, the non-SIMD quantization function is now used for those cases,
 +and libjpeg-turbo should now produce identical output to libjpeg v6b in all
 +cases.
 +
 +[2] Despite the above, the fast integer forward DCT still degrades somewhat for
 +JPEG qualities greater than 95, so TurboJPEG/OSS will now automatically use the
 +slow integer forward DCT when generating JPEG images of quality 96 or greater.
 +This reduces compression performance by as much as 15% for these high-quality
 +images but is necessary to ensure that the images are perceptually lossless.
 +It also ensures that the library can avoid the performance pitfall created by
 +[1].
 +
 +[3] Ported jpgtest.cxx to pure C to avoid the need for a C++ compiler.
 +
 +[4] Fixed visual artifacts in grayscale JPEG compression caused by a typo in
 +the RGB-to-luminance lookup tables.
 +
 +[5] The Windows distribution packages now include the libjpeg run-time programs
 +(cjpeg, etc.)
 +
 +[6] All packages now include jpgtest.
 +
 +[7] The TurboJPEG dynamic library now uses versioned symbols.
 +
 +[8] Added two new TurboJPEG API functions, tjEncodeYUV() and
 +tjDecompressToYUV(), to replace the somewhat hackish TJ_YUV flag.
 +
 +
 +1.0.90 (1.1 beta1)
 +==================
 +
 +[1] Added emulation of the libjpeg v7 and v8 APIs and ABIs.  See
 +README-turbo.txt for more details.  This feature was sponsored by CamTrace SAS.
 +
 +[2] Created a new CMake-based build system for the Visual C++ and MinGW builds.
 +
 +[3] Grayscale bitmaps can now be compressed from/decompressed to using the
 +TurboJPEG API.
 +
 +[4] jpgtest can now be used to test decompression performance with existing
 +JPEG images.
 +
 +[5] If the default install prefix (/opt/libjpeg-turbo) is used, then
 +'make install' now creates /opt/libjpeg-turbo/lib32 and
 +/opt/libjpeg-turbo/lib64 sym links to duplicate the behavior of the binary
 +packages.
 +
 +[6] All symbols in the libjpeg-turbo dynamic library are now versioned, even
 +when the library is built with libjpeg v6b emulation.
 +
 +[7] Added arithmetic encoding and decoding support (can be disabled with
 +configure or CMake options)
 +
 +[8] Added a TJ_YUV flag to the TurboJPEG API, which causes both the compressor
 +and decompressor to output planar YUV images.
 +
 +[9] Added an extended version of tjDecompressHeader() to the TurboJPEG API,
 +which allows the caller to determine the type of subsampling used in a JPEG
 +image.
 +
 +[10] Added further protections against invalid Huffman codes.
 +
 +
 +1.0.1
 +=====
 +
 +[1] The Huffman decoder will now handle erroneous Huffman codes (for instance,
 +from a corrupt JPEG image.)  Previously, these would cause libjpeg-turbo to
 +crash under certain circumstances.
 +
 +[2] Fixed typo in SIMD dispatch routines that was causing 4:2:2 upsampling to
 +be used instead of 4:2:0 when decompressing JPEG images using SSE2 code.
 +
 +[3] configure script will now automatically determine whether the
 +INCOMPLETE_TYPES_BROKEN macro should be defined.
 +
 +
 +1.0.0
 +=====
 +
 +[1] 2983700: Further FreeBSD build tweaks (no longer necessary to specify
 +--host when configuring on a 64-bit system)
 +
 +[2] Created sym. links in the Unix/Linux packages so that the TurboJPEG
 +include file can always be found in /opt/libjpeg-turbo/include, the 32-bit
 +static libraries can always be found in /opt/libjpeg-turbo/lib32, and the
 +64-bit static libraries can always be found in /opt/libjpeg-turbo/lib64.
 +
 +[3] The Unix/Linux distribution packages now include the libjpeg run-time
 +programs (cjpeg, etc.) and man pages.
 +
 +[4] Created a 32-bit supplementary package for amd64 Debian systems, which
 +contains just the 32-bit libjpeg-turbo libraries.
 +
 +[5] Moved the libraries from */lib32 to */lib in the i386 Debian package.
 +
 +[6] Include distribution package for Cygwin
 +
 +[7] No longer necessary to specify --without-simd on non-x86 architectures, and
 +unit tests now work on those architectures.
 +
 +
 +0.0.93
 +======
 +
 +[1] 2982659, Fixed x86-64 build on FreeBSD systems
 +
 +[2] 2988188: Added support for Windows 64-bit systems
 +
 +
 +0.0.91
 +======
 +
 +[1] Added documentation to .deb packages
 +
 +[2] 2968313: Fixed data corruption issues when decompressing large JPEG images
 +and/or using buffered I/O with the libjpeg-turbo decompressor
 +
 +
 +0.0.90
 +======
 +
 +Initial release
diff --cc jdcolor.c
index 7a8ed221c74c9f960e4300a736f0bf4674d6c883,83e4d069abc0061a6b2666588c0afd8a61ef6f1b..e477b0b58e8fb95e9626b9e34d99c704627f487b
+++ b/jdcolor.c
@@@ -1,11 -1,9 +1,12 @@@
  /*
   * jdcolor.c
   *
 + * This file was part of the Independent JPEG Group's software:
   * Copyright (C) 1991-1997, Thomas G. Lane.
 - * This file is part of the Independent JPEG Group's software.
+  * Modified 2011 by Guido Vollbeding.
 + * Modifications:
 + * Copyright 2009 Pierre Ossman <ossman@cendio.se> for Cendio AB
 + * Copyright (C) 2009, 2011-2012, D. R. Commander.
   * For conditions of distribution and use, see the accompanying README file.
   *
   * This file contains output colorspace conversion routines.
@@@ -66,120 -70,19 +75,132 @@@ typedef my_color_deconverter * my_cconv
  #define ONE_HALF      ((INT32) 1 << (SCALEBITS-1))
  #define FIX(x)                ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
  
+ /* We allocate one big table for RGB->Y conversion and divide it up into
+  * three parts, instead of doing three alloc_small requests.  This lets us
+  * use a single table base address, which can be held in a register in the
+  * inner loops on many machines (more than can hold all three addresses,
+  * anyway).
+  */
+ #define R_Y_OFF               0                       /* offset to R => Y section */
+ #define G_Y_OFF               (1*(MAXJSAMPLE+1))      /* offset to G => Y section */
+ #define B_Y_OFF               (2*(MAXJSAMPLE+1))      /* etc. */
+ #define TABLE_SIZE    (3*(MAXJSAMPLE+1))
  
 +/* Include inline routines for colorspace extensions */
 +
 +#include "jdcolext.c"
 +#undef RGB_RED
 +#undef RGB_GREEN
 +#undef RGB_BLUE
 +#undef RGB_PIXELSIZE
 +
 +#define RGB_RED EXT_RGB_RED
 +#define RGB_GREEN EXT_RGB_GREEN
 +#define RGB_BLUE EXT_RGB_BLUE
 +#define RGB_PIXELSIZE EXT_RGB_PIXELSIZE
 +#define ycc_rgb_convert_internal ycc_extrgb_convert_internal
 +#define gray_rgb_convert_internal gray_extrgb_convert_internal
 +#define rgb_rgb_convert_internal rgb_extrgb_convert_internal
 +#include "jdcolext.c"
 +#undef RGB_RED
 +#undef RGB_GREEN
 +#undef RGB_BLUE
 +#undef RGB_PIXELSIZE
 +#undef ycc_rgb_convert_internal
 +#undef gray_rgb_convert_internal
 +#undef rgb_rgb_convert_internal
 +
 +#define RGB_RED EXT_RGBX_RED
 +#define RGB_GREEN EXT_RGBX_GREEN
 +#define RGB_BLUE EXT_RGBX_BLUE
 +#define RGB_ALPHA 3
 +#define RGB_PIXELSIZE EXT_RGBX_PIXELSIZE
 +#define ycc_rgb_convert_internal ycc_extrgbx_convert_internal
 +#define gray_rgb_convert_internal gray_extrgbx_convert_internal
 +#define rgb_rgb_convert_internal rgb_extrgbx_convert_internal
 +#include "jdcolext.c"
 +#undef RGB_RED
 +#undef RGB_GREEN
 +#undef RGB_BLUE
 +#undef RGB_ALPHA
 +#undef RGB_PIXELSIZE
 +#undef ycc_rgb_convert_internal
 +#undef gray_rgb_convert_internal
 +#undef rgb_rgb_convert_internal
 +
 +#define RGB_RED EXT_BGR_RED
 +#define RGB_GREEN EXT_BGR_GREEN
 +#define RGB_BLUE EXT_BGR_BLUE
 +#define RGB_PIXELSIZE EXT_BGR_PIXELSIZE
 +#define ycc_rgb_convert_internal ycc_extbgr_convert_internal
 +#define gray_rgb_convert_internal gray_extbgr_convert_internal
 +#define rgb_rgb_convert_internal rgb_extbgr_convert_internal
 +#include "jdcolext.c"
 +#undef RGB_RED
 +#undef RGB_GREEN
 +#undef RGB_BLUE
 +#undef RGB_PIXELSIZE
 +#undef ycc_rgb_convert_internal
 +#undef gray_rgb_convert_internal
 +#undef rgb_rgb_convert_internal
 +
 +#define RGB_RED EXT_BGRX_RED
 +#define RGB_GREEN EXT_BGRX_GREEN
 +#define RGB_BLUE EXT_BGRX_BLUE
 +#define RGB_ALPHA 3
 +#define RGB_PIXELSIZE EXT_BGRX_PIXELSIZE
 +#define ycc_rgb_convert_internal ycc_extbgrx_convert_internal
 +#define gray_rgb_convert_internal gray_extbgrx_convert_internal
 +#define rgb_rgb_convert_internal rgb_extbgrx_convert_internal
 +#include "jdcolext.c"
 +#undef RGB_RED
 +#undef RGB_GREEN
 +#undef RGB_BLUE
 +#undef RGB_ALPHA
 +#undef RGB_PIXELSIZE
 +#undef ycc_rgb_convert_internal
 +#undef gray_rgb_convert_internal
 +#undef rgb_rgb_convert_internal
 +
 +#define RGB_RED EXT_XBGR_RED
 +#define RGB_GREEN EXT_XBGR_GREEN
 +#define RGB_BLUE EXT_XBGR_BLUE
 +#define RGB_ALPHA 0
 +#define RGB_PIXELSIZE EXT_XBGR_PIXELSIZE
 +#define ycc_rgb_convert_internal ycc_extxbgr_convert_internal
 +#define gray_rgb_convert_internal gray_extxbgr_convert_internal
 +#define rgb_rgb_convert_internal rgb_extxbgr_convert_internal
 +#include "jdcolext.c"
 +#undef RGB_RED
 +#undef RGB_GREEN
 +#undef RGB_BLUE
 +#undef RGB_ALPHA
 +#undef RGB_PIXELSIZE
 +#undef ycc_rgb_convert_internal
 +#undef gray_rgb_convert_internal
 +#undef rgb_rgb_convert_internal
 +
 +#define RGB_RED EXT_XRGB_RED
 +#define RGB_GREEN EXT_XRGB_GREEN
 +#define RGB_BLUE EXT_XRGB_BLUE
 +#define RGB_ALPHA 0
 +#define RGB_PIXELSIZE EXT_XRGB_PIXELSIZE
 +#define ycc_rgb_convert_internal ycc_extxrgb_convert_internal
 +#define gray_rgb_convert_internal gray_extxrgb_convert_internal
 +#define rgb_rgb_convert_internal rgb_extxrgb_convert_internal
 +#include "jdcolext.c"
 +#undef RGB_RED
 +#undef RGB_GREEN
 +#undef RGB_BLUE
 +#undef RGB_ALPHA
 +#undef RGB_PIXELSIZE
 +#undef ycc_rgb_convert_internal
 +#undef gray_rgb_convert_internal
 +#undef rgb_rgb_convert_internal
 +
 +
  /*
   * Initialize tables for YCC->RGB colorspace conversion.
   */
@@@ -272,6 -181,98 +293,66 @@@ ycc_rgb_convert (j_decompress_ptr cinfo
  /**************** Cases other than YCbCr -> RGB **************/
  
  
 -/*
 - * No colorspace change, but conversion from separate-planes
 - * to interleaved representation.
 - */
 -
 -METHODDEF(void)
 -rgb_convert (j_decompress_ptr cinfo,
 -           JSAMPIMAGE input_buf, JDIMENSION input_row,
 -           JSAMPARRAY output_buf, int num_rows)
 -{
 -  register JSAMPROW outptr;
 -  register JSAMPROW inptr0, inptr1, inptr2;
 -  register JDIMENSION col;
 -  JDIMENSION num_cols = cinfo->output_width;
 -
 -  while (--num_rows >= 0) {
 -    inptr0 = input_buf[0][input_row];
 -    inptr1 = input_buf[1][input_row];
 -    inptr2 = input_buf[2][input_row];
 -    input_row++;
 -    outptr = *output_buf++;
 -    for (col = 0; col < num_cols; col++) {
 -      /* We can dispense with GETJSAMPLE() here */
 -      outptr[RGB_RED]   = inptr0[col];
 -      outptr[RGB_GREEN] = inptr1[col];
 -      outptr[RGB_BLUE]  = inptr2[col];
 -      outptr += RGB_PIXELSIZE;
 -    }
 -  }
 -}
 -
 -
+ /*
+  * Initialize for RGB->grayscale colorspace conversion.
+  */
+ LOCAL(void)
+ build_rgb_y_table (j_decompress_ptr cinfo)
+ {
+   my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+   INT32 * rgb_y_tab;
+   INT32 i;
+   /* Allocate and fill in the conversion tables. */
+   cconvert->rgb_y_tab = rgb_y_tab = (INT32 *)
+     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
+                               (TABLE_SIZE * SIZEOF(INT32)));
+   for (i = 0; i <= MAXJSAMPLE; i++) {
+     rgb_y_tab[i+R_Y_OFF] = FIX(0.29900) * i;
+     rgb_y_tab[i+G_Y_OFF] = FIX(0.58700) * i;
+     rgb_y_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF;
+   }
+ }
+ /*
+  * Convert RGB to grayscale.
+  */
+ METHODDEF(void)
+ rgb_gray_convert (j_decompress_ptr cinfo,
+                 JSAMPIMAGE input_buf, JDIMENSION input_row,
+                 JSAMPARRAY output_buf, int num_rows)
+ {
+   my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
+   register int r, g, b;
+   register INT32 * ctab = cconvert->rgb_y_tab;
+   register JSAMPROW outptr;
+   register JSAMPROW inptr0, inptr1, inptr2;
+   register JDIMENSION col;
+   JDIMENSION num_cols = cinfo->output_width;
+   while (--num_rows >= 0) {
+     inptr0 = input_buf[0][input_row];
+     inptr1 = input_buf[1][input_row];
+     inptr2 = input_buf[2][input_row];
+     input_row++;
+     outptr = *output_buf++;
+     for (col = 0; col < num_cols; col++) {
+       r = GETJSAMPLE(inptr0[col]);
+       g = GETJSAMPLE(inptr1[col]);
+       b = GETJSAMPLE(inptr2[col]);
+       /* Y */
+       outptr[col] = (JSAMPLE)
+               ((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
+                >> SCALEBITS);
+     }
+   }
+ }
  /*
   * Color conversion for no colorspace change: just copy the data,
   * converting from separate-planes to interleaved representation.
diff --cc libjpeg.txt
index 5f38a316ddf09a114dc6019e1aa80a16162af3c7,9702669ea26ffc185dc5f8e9a70ed28008364375..88d3a5d17eb313edd5fd13599f0f70b36fc189f5
@@@ -1,9 -1,7 +1,9 @@@
  USING THE IJG JPEG LIBRARY
  
- Copyright (C) 1994-2009, Thomas G. Lane, Guido Vollbeding.
 +This file was part of the Independent JPEG Group's software:
 -This file is part of the Independent JPEG Group's software.
+ Copyright (C) 1994-2011, Thomas G. Lane, Guido Vollbeding.
 +Modifications:
 +Copyright (C) 2010, D. R. Commander.
  For conditions of distribution and use, see the accompanying README file.