diff gfxconv.c @ 474:95d1facfdb77

Improve color matching, make it possible to ignore alpha values.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 07 Nov 2012 01:01:15 +0200
parents 73bfe73553eb
children c0dedfef3edf
line wrap: on
line diff
--- a/gfxconv.c	Wed Nov 07 00:55:43 2012 +0200
+++ b/gfxconv.c	Wed Nov 07 01:01:15 2012 +0200
@@ -99,7 +99,7 @@
 
 typedef struct
 {
-    BOOL triplet;
+    BOOL triplet, alpha;
     DMColor color;
     int from, to;
 } DMMapValue;
@@ -258,21 +258,23 @@
     {
         int colR, colG, colB, colA;
 
-        if (sscanf(opt + 1, "%2x%2x%2x%2x", &colR, &colG, &colB, &colA) != 4 &&
-            sscanf(opt + 1, "%2X%2X%2X%2X", &colR, &colG, &colB, &colA) != 4)
+        if (sscanf(opt + 1, "%2x%2x%2x%2x", &colR, &colG, &colB, &colA) == 4 ||
+            sscanf(opt + 1, "%2X%2X%2X%2X", &colR, &colG, &colB, &colA) == 4)
         {
-            colA = 0;
-            if (sscanf(opt + 1, "%2x%2x%2x", &colR, &colG, &colB) != 3 &&
-                sscanf(opt + 1, "%2X%2X%2X", &colR, &colG, &colB) != 3)
-            {
-                dmError("Invalid %s value '%s', expected a hex triplet after #.\n", msg, opt);
-                return FALSE;
-            }
+            value->alpha = TRUE;
+            value->color.a = colA;
         }
+        else
+        if (sscanf(opt + 1, "%2x%2x%2x", &colR, &colG, &colB) != 3 &&
+            sscanf(opt + 1, "%2X%2X%2X", &colR, &colG, &colB) != 3)
+        {
+            dmError("Invalid %s value '%s', expected a hex triplet after #.\n", msg, opt);
+            return FALSE;
+        }
+
         value->color.r = colR;
         value->color.g = colG;
         value->color.b = colB;
-        value->color.a = colA;
         value->triplet = TRUE;
     }
     else
@@ -728,6 +730,16 @@
 }
 #endif
 
+BOOL dmCompareColor(const DMColor *c1, const DMColor *c2, BOOL alpha)
+{
+    if (c1->r == c2->r &&
+        c1->g == c2->g &&
+        c1->b == c2->b)
+        return alpha ? (c1->a == c2->a) : TRUE;
+    else
+        return FALSE;
+}
+
 
 int dmRemapImageColors(DMImage *image)
 {
@@ -756,7 +768,7 @@
             int n;
             for (n = 0; n < image->ncolors; n++)
             {
-                if (memcmp(&(image->pal[n]), &(map->color), sizeof(DMColor)) == 0)
+                if (dmCompareColor(&(image->pal[n]), &(map->color), map->alpha))
                 {
                     dmMsg(3, "RGBA match #%02x%02x%02x%02x: %d -> %d\n",
                         map->color.r, map->color.g, map->color.b, map->color.a,