Vincent Povirk : windowscodecs: Decode CMYK/YCCK JPEG images as CMYK.
Alexandre Julliard
julliard at winehq.org
Mon Sep 13 17:14:44 CDT 2010
Module: wine
Branch: master
Commit: 116cf47df30ed3a0f5753b53954d69f1d2162c87
URL: http://source.winehq.org/git/wine.git/?a=commit;h=116cf47df30ed3a0f5753b53954d69f1d2162c87
Author: Vincent Povirk <vincent at 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;
More information about the wine-cvs
mailing list