From 0bda2c6069c84b7f8b759ad013bd304864f56fe7 Mon Sep 17 00:00:00 2001 From: Vincent Povirk Date: Sat, 11 Sep 2010 15:07:45 -0500 Subject: [PATCH 1/2] windowscodecs: Decode CMYK/YCCK JPEG images as CMYK. libjpeg cannot convert these images to RGB, probably because that conversion would lose information. --- dlls/windowscodecs/jpegformat.c | 26 ++++++++++++++++++++++++-- dlls/windowscodecs/regsvr.c | 1 + include/wincodec.idl | 2 ++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/dlls/windowscodecs/jpegformat.c b/dlls/windowscodecs/jpegformat.c index 99b7832..5243d94 100644 --- a/dlls/windowscodecs/jpegformat.c +++ b/dlls/windowscodecs/jpegformat.c @@ -314,10 +314,24 @@ static HRESULT WINAPI JpegDecoder_Initialize(IWICBitmapDecoder *iface, IStream * return E_FAIL; } - if (This->cinfo.jpeg_color_space == JCS_GRAYSCALE) + switch (This->cinfo.jpeg_color_space) + { + case JCS_GRAYSCALE: This->cinfo.out_color_space = JCS_GRAYSCALE; - else + break; + case JCS_RGB: + case JCS_YCbCr: This->cinfo.out_color_space = JCS_RGB; + break; + case JCS_CMYK: + case JCS_YCCK: + This->cinfo.out_color_space = JCS_CMYK; + break; + default: + ERR("Unknown JPEG color space %i\n", This->cinfo.jpeg_color_space); + LeaveCriticalSection(&This->lock); + return E_FAIL; + } if (!pjpeg_start_decompress(&This->cinfo)) { @@ -475,6 +489,8 @@ static HRESULT WINAPI JpegDecoder_Frame_GetPixelFormat(IWICBitmapFrameDecode *if TRACE("(%p,%p)\n", iface, pPixelFormat); if (This->cinfo.out_color_space == JCS_RGB) memcpy(pPixelFormat, &GUID_WICPixelFormat24bppBGR, sizeof(GUID)); + else if (This->cinfo.out_color_space == JCS_CMYK) + memcpy(pPixelFormat, &GUID_WICPixelFormat32bppCMYK, sizeof(GUID)); else /* This->cinfo.out_color_space == JCS_GRAYSCALE */ memcpy(pPixelFormat, &GUID_WICPixelFormat8bppGray, sizeof(GUID)); return S_OK; @@ -506,6 +522,7 @@ static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, TRACE("(%p,%p,%u,%u,%p)\n", iface, prc, cbStride, cbBufferSize, pbBuffer); if (This->cinfo.out_color_space == JCS_GRAYSCALE) bpp = 8; + else if (This->cinfo.out_color_space == JCS_CMYK) bpp = 32; else bpp = 24; stride = bpp * This->cinfo.output_width; @@ -571,6 +588,11 @@ static HRESULT WINAPI JpegDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface, } } } + + if (This->cinfo.out_color_space == JCS_CMYK && This->cinfo.saw_Adobe_marker) + /* Adobe JPEG's have inverted CMYK data. */ + for (i=0; iimage_data[i] ^= 0xff; } LeaveCriticalSection(&This->lock); diff --git a/dlls/windowscodecs/regsvr.c b/dlls/windowscodecs/regsvr.c index ef87a38..61ed96e 100644 --- a/dlls/windowscodecs/regsvr.c +++ b/dlls/windowscodecs/regsvr.c @@ -1036,6 +1036,7 @@ static const BYTE jpeg_magic[] = {0xff, 0xd8, 0xff, 0xe0}; static GUID const * const jpeg_formats[] = { &GUID_WICPixelFormat24bppBGR, + &GUID_WICPixelFormat32bppCMYK, &GUID_WICPixelFormat8bppGray, NULL }; diff --git a/include/wincodec.idl b/include/wincodec.idl index 2fe51d7..76aac1b 100644 --- a/include/wincodec.idl +++ b/include/wincodec.idl @@ -166,6 +166,8 @@ cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppPBGRA, 0x6fddc324,0x4e03,0x4bfe,0 cpp_quote("DEFINE_GUID(GUID_WICPixelFormat48bppRGB, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x15);") cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppRGBA, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x16);") +cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppCMYK, 0x6fddc324,0x4e03,0x4fbe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x1c);") + typedef struct WICRect { INT X; INT Y; -- 1.6.3.3