Module: wine Branch: master Commit: 116cf47df30ed3a0f5753b53954d69f1d2162c87 URL: http://source.winehq.org/git/wine.git/?a=commit;h=116cf47df30ed3a0f5753b5395...
Author: Vincent Povirk vincent@codeweavers.com Date: Sat Sep 11 15:07:45 2010 -0500
windowscodecs: Decode CMYK/YCCK JPEG images as CMYK.
---
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 41abe24..4923b20 100644 --- a/dlls/windowscodecs/jpegformat.c +++ b/dlls/windowscodecs/jpegformat.c @@ -266,10 +266,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)) { @@ -427,6 +441,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; @@ -457,6 +473,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; @@ -514,6 +531,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; i<data_size; i++) + This->image_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;