It doesn't seem to matter whether COLOR_3_CHANNEL is mapped to TYPE_RGB or TYPE_CMY, so I've left it as TYPE_RGB as is the default.
This makes Purple Pen orienteering map app usable (colors, not B/W).
Signed-off-by: Lauri Kenttä lauri.kentta@gmail.com --- dlls/mscms/liblcms.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/mscms/liblcms.c b/dlls/mscms/liblcms.c index 1f43c359c4a..04fae980d26 100644 --- a/dlls/mscms/liblcms.c +++ b/dlls/mscms/liblcms.c @@ -173,6 +173,7 @@ static BOOL CDECL lcms_translate_colors( void *transform, COLOR *in, DWORD count case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].cmyk, &out[i].gray, 1 ); return TRUE; case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].cmyk, &out[i].cmyk, 1 ); return TRUE; case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].cmyk, &out[i].XYZ, 1 ); return TRUE; + case COLOR_3_CHANNEL: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].cmyk, &out[i].gen3ch, 1 ); return TRUE; default: break; } break;
No need to use nested switch statements for all COLORTYPE pairs, since they are all symmetrically either supported or not. Calculate COLOR member offset with offsetof and use that in a single loop to avoid duplicate code.
Signed-off-by: Lauri Kenttä lauri.kentta@gmail.com --- dlls/mscms/liblcms.c | 84 ++++++++++++-------------------------------- 1 file changed, 22 insertions(+), 62 deletions(-)
diff --git a/dlls/mscms/liblcms.c b/dlls/mscms/liblcms.c index 04fae980d26..0a702a4b043 100644 --- a/dlls/mscms/liblcms.c +++ b/dlls/mscms/liblcms.c @@ -123,76 +123,36 @@ static BOOL CDECL lcms_translate_bits( void *transform, void *srcbits, BMFORMAT return TRUE; }
+static int lcms_offsetof_type( COLORTYPE type ) +{ + switch (type) + { + case COLOR_GRAY: return offsetof(COLOR, gray); + case COLOR_RGB: return offsetof(COLOR, rgb); + case COLOR_CMYK: return offsetof(COLOR, cmyk); + case COLOR_XYZ: return offsetof(COLOR, XYZ); + case COLOR_3_CHANNEL: return offsetof(COLOR, gen3ch); + case COLOR_Lab: return offsetof(COLOR, Lab); + } + return -1; +} + static BOOL CDECL lcms_translate_colors( void *transform, COLOR *in, DWORD count, COLORTYPE input_type, COLOR *out, COLORTYPE output_type ) { unsigned int i; + int input_field_offset = lcms_offsetof_type( input_type ); + int output_field_offset = lcms_offsetof_type( output_type );
if (!cmsChangeBuffersFormat( transform, from_type(input_type), from_type(output_type) )) return FALSE; - - switch (input_type) + if (input_field_offset == -1 || output_field_offset == -1) { - case COLOR_RGB: - switch (output_type) - { - case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].rgb, &out[i].rgb, 1 ); return TRUE; - case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].rgb, &out[i].Lab, 1 ); return TRUE; - case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].rgb, &out[i].gray, 1 ); return TRUE; - case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].rgb, &out[i].cmyk, 1 ); return TRUE; - case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].rgb, &out[i].XYZ, 1 ); return TRUE; - default: break; - } - break; - case COLOR_Lab: - switch (output_type) - { - case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].Lab, &out[i].rgb, 1 ); return TRUE; - case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].Lab, &out[i].Lab, 1 ); return TRUE; - case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].Lab, &out[i].gray, 1 ); return TRUE; - case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].Lab, &out[i].cmyk, 1 ); return TRUE; - case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].Lab, &out[i].XYZ, 1 ); return TRUE; - default: break; - } - break; - case COLOR_GRAY: - switch (output_type) - { - case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].gray, &out[i].rgb, 1 ); return TRUE; - case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].gray, &out[i].Lab, 1 ); return TRUE; - case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].gray, &out[i].gray, 1 ); return TRUE; - case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].gray, &out[i].cmyk, 1 ); return TRUE; - case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].gray, &out[i].XYZ, 1 ); return TRUE; - default: break; - } - break; - case COLOR_CMYK: - switch (output_type) - { - case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].cmyk, &out[i].rgb, 1 ); return TRUE; - case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].cmyk, &out[i].Lab, 1 ); return TRUE; - case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].cmyk, &out[i].gray, 1 ); return TRUE; - case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].cmyk, &out[i].cmyk, 1 ); return TRUE; - case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].cmyk, &out[i].XYZ, 1 ); return TRUE; - case COLOR_3_CHANNEL: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].cmyk, &out[i].gen3ch, 1 ); return TRUE; - default: break; - } - break; - case COLOR_XYZ: - switch (output_type) - { - case COLOR_RGB: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].XYZ, &out[i].rgb, 1 ); return TRUE; - case COLOR_Lab: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].XYZ, &out[i].Lab, 1 ); return TRUE; - case COLOR_GRAY: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].XYZ, &out[i].gray, 1 ); return TRUE; - case COLOR_CMYK: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].XYZ, &out[i].cmyk, 1 ); return TRUE; - case COLOR_XYZ: for (i = 0; i < count; i++) cmsDoTransform( transform, &in[i].XYZ, &out[i].XYZ, 1 ); return TRUE; - default: break; - } - break; - default: - break; + FIXME("unhandled input/output pair: %d/%d\n", input_type, output_type); + return FALSE; } - FIXME("unhandled input/output pair: %d/%d\n", input_type, output_type); - return FALSE; + for (i = 0; i < count; i++) + cmsDoTransform( transform, (char*)&in[i] + input_field_offset, (char*)&out[i] + output_field_offset, 1 ); + return TRUE; }
static void CDECL lcms_close_transform( void *transform )
If we assume that trying a color translation is at least as good as just returning FALSE, then there's no point in cheching COLORTYPE. COLOR is union, so offsetof will be 0 anyway and can be omitted too.
Signed-off-by: Lauri Kenttä lauri.kentta@gmail.com --- dlls/mscms/liblcms.c | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-)
diff --git a/dlls/mscms/liblcms.c b/dlls/mscms/liblcms.c index 0a702a4b043..b1eabddc247 100644 --- a/dlls/mscms/liblcms.c +++ b/dlls/mscms/liblcms.c @@ -123,35 +123,14 @@ static BOOL CDECL lcms_translate_bits( void *transform, void *srcbits, BMFORMAT return TRUE; }
-static int lcms_offsetof_type( COLORTYPE type ) -{ - switch (type) - { - case COLOR_GRAY: return offsetof(COLOR, gray); - case COLOR_RGB: return offsetof(COLOR, rgb); - case COLOR_CMYK: return offsetof(COLOR, cmyk); - case COLOR_XYZ: return offsetof(COLOR, XYZ); - case COLOR_3_CHANNEL: return offsetof(COLOR, gen3ch); - case COLOR_Lab: return offsetof(COLOR, Lab); - } - return -1; -} - static BOOL CDECL lcms_translate_colors( void *transform, COLOR *in, DWORD count, COLORTYPE input_type, COLOR *out, COLORTYPE output_type ) { unsigned int i; - int input_field_offset = lcms_offsetof_type( input_type ); - int output_field_offset = lcms_offsetof_type( output_type );
if (!cmsChangeBuffersFormat( transform, from_type(input_type), from_type(output_type) )) return FALSE; - if (input_field_offset == -1 || output_field_offset == -1) - { - FIXME("unhandled input/output pair: %d/%d\n", input_type, output_type); - return FALSE; - } for (i = 0; i < count; i++) - cmsDoTransform( transform, (char*)&in[i] + input_field_offset, (char*)&out[i] + output_field_offset, 1 ); + cmsDoTransform( transform, &in[i], &out[i], 1 ); return TRUE; }