# HG changeset patch # User Matti Hamalainen # Date 1352242875 -7200 # Node ID 95d1facfdb772543dd7a0fd47c37b1086ab1f122 # Parent 73bfe73553ebe666eacc3519ac1a3c931d78fccb Improve color matching, make it possible to ignore alpha values. diff -r 73bfe73553eb -r 95d1facfdb77 gfxconv.c --- 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,