From db43a4df0d971f599fd03013c6fa2a3e7bdbdc6d Mon Sep 17 00:00:00 2001 From: sam Date: Wed, 20 Aug 2008 01:38:51 +0000 Subject: [PATCH] * img2rubik.c: add quick and dirty dithering code to img2rubik. git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@2738 92316355-f0b4-4df1-b90c-862c8a59935f --- examples/img2rubik.c | 99 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 94 insertions(+), 5 deletions(-) diff --git a/examples/img2rubik.c b/examples/img2rubik.c index d6a8d02..3c7e0ea 100644 --- a/examples/img2rubik.c +++ b/examples/img2rubik.c @@ -12,16 +12,105 @@ int main(int argc, char *argv[]) { static double const mypal[] = { - 0.900, 0.001, 0.001, /* red */ - 0.001, 0.800, 0.001, /* green */ - 0.005, 0.001, 0.500, /* blue */ +#if 1 + 0.800, 0.001, 0.001, /* red */ + 0.001, 0.700, 0.001, /* green */ + 0.005, 0.001, 0.600, /* blue */ 0.900, 0.900, 0.900, /* white */ 0.900, 0.900, 0.001, /* yellow */ - 0.800, 0.400, 0.001, /* orange */ + 0.850, 0.450, 0.001, /* orange */ +#else + 1,1,1, + 0,.05,.60, + 1,0,0, + .15,.76,0, + .96,1,0, + 1,.61,0, +#endif }; +#define NCOLORS ((int)(sizeof(mypal)/sizeof(*mypal)/3)) + + int x, y, w, h; pipi_image_t *src = pipi_load(argv[1]); - pipi_image_t *dst = pipi_reduce(src, 6, mypal); + pipi_image_t *dst = pipi_reduce(src, NCOLORS, mypal); + + pipi_pixels_t *p = pipi_getpixels(dst, PIPI_PIXELS_RGBA_F); + float *data = (float *)p->pixels; + w = p->w; + h = p->h; + + for(y = 0; y < h; y++) + for(x = 0; x < w; x++) + { + double pr, pg, pb, qr, qg, qb, er, eg, eb; + + pr = data[4 * (y * w + x) + 2]; + pg = data[4 * (y * w + x) + 1]; + pb = data[4 * (y * w + x)]; + + double dist = 10.0; + int n, best = -1; + + for(n = 0; n < NCOLORS; n++) + { + double dr, dg, db, d; + + dr = pr - mypal[n * 3]; + dg = pg - mypal[n * 3 + 1]; + db = pb - mypal[n * 3 + 2]; + + d = dr * dr + dg * dg + db * db; + //d = 0.299 * dr * dr + 0.587 * dg * dg + 0.114 * db * db; + + if(d < dist) + { + best = n; + dist = d; + } + } + + qr = mypal[best * 3]; + qg = mypal[best * 3 + 1]; + qb = mypal[best * 3 + 2]; + + er = (pr - qr) / 16; + eg = (pg - qg) / 16; + eb = (pb - qb) / 16; + + if(x < w - 1) + { + data[4 * (y * w + x + 1) + 2] += 7 * er; + data[4 * (y * w + x + 1) + 1] += 7 * eg; + data[4 * (y * w + x + 1)] += 7 * eb; + } + + if(y < h - 1) + { + if(x < w - 1) + { + data[4 * (y * w + x + w + 1) + 2] += 1 * er; + data[4 * (y * w + x + w + 1) + 1] += 1 * eg; + data[4 * (y * w + x + w + 1)] += 1 * eb; + } + + data[4 * (y * w + x + w) + 2] += 5 * er; + data[4 * (y * w + x + w) + 1] += 5 * eg; + data[4 * (y * w + x + w)] += 5 * eb; + + if(x > 0) + { + data[4 * (y * w + x + w - 1) + 2] += 3 * er; + data[4 * (y * w + x + w - 1) + 1] += 3 * eg; + data[4 * (y * w + x + w - 1)] += 3 * eb; + } + } + + data[4 * (y * w + x) + 2] = qr; + data[4 * (y * w + x) + 1] = qg; + data[4 * (y * w + x)] = qb; + } + pipi_save(dst, argv[2]); return 0;