[PATCH v2 2/3] mscms: Eliminate duplicate code.

Hans Leidekker hans at codeweavers.com
Mon Mar 22 03:51:23 CDT 2021


From: Lauri Kenttä <lauri.kentta at gmail.com>

v2: Add default case in switch statement.

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 at gmail.com>
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/mscms/liblcms.c | 85 ++++++++++++--------------------------------
 1 file changed, 23 insertions(+), 62 deletions(-)

diff --git a/dlls/mscms/liblcms.c b/dlls/mscms/liblcms.c
index 04fae980d26..5dbfc463522 100644
--- a/dlls/mscms/liblcms.c
+++ b/dlls/mscms/liblcms.c
@@ -123,76 +123,37 @@ 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);
+        default: break;
+    }
+    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 )
-- 
2.30.2




More information about the wine-devel mailing list