From e15f20a316ecfd990c945b398ea196dfd9fb8e9b Mon Sep 17 00:00:00 2001 From: sam Date: Thu, 31 Jul 2008 22:02:17 +0000 Subject: [PATCH] * pixels.c: add Floyd-Steinberg dithering to the float32 -> rgba32 conversion. git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@2616 92316355-f0b4-4df1-b90c-862c8a59935f --- pipi/pixels.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/pipi/pixels.c b/pipi/pixels.c index 63d38cd..9f0b253 100644 --- a/pipi/pixels.c +++ b/pipi/pixels.c @@ -28,6 +28,8 @@ #include "pipi.h" #include "pipi_internals.h" +#define GAMMA 2.2 + static void init_tables(void); static float u8tof32_table[256]; @@ -85,13 +87,30 @@ pipi_pixels_t *pipi_getpixels(pipi_image_t *img, pipi_format_t type) float *src = (float *)img->p[PIPI_PIXELS_RGBA_F].pixels; uint8_t *dest = (uint8_t *)img->p[type].pixels; + init_tables(); + for(y = 0; y < img->h; y++) for(x = 0; x < img->w; x++) for(i = 0; i < 4; i++) { - double p = src[4 * (y * img->w + x) + i]; - dest[4 * (y * img->w + x) + i] - = (int)(255.999 * pow(p, 1. / 2.2)); + double p, e; + uint8_t d; + + p = src[4 * (y * img->w + x) + i]; + d = (int)(255.999 * pow(p, 1. / GAMMA)); + dest[4 * (y * img->w + x) + i] = d; + + e = p - u8tof32(d); + if(x < img->w - 1) + src[4 * (y * img->w + x + 1) + i] += e * .4375; + if(y < img->h - 1) + { + if(x < img->w - 1) + src[4 * ((y + 1) * img->w + x - 1) + i] += e * .1875; + src[4 * ((y + 1) * img->w + x) + i] += e * .3125; + if(x < img->w - 1) + src[4 * ((y + 1) * img->w + x + 1) + i] += e * .0625; + } } } else @@ -114,7 +133,7 @@ static void init_tables(void) return; for(i = 0; i < 256; i++) - u8tof32_table[i] = pow((double)i / 255., 2.2); + u8tof32_table[i] = pow((double)i / 255., GAMMA); done = 1; }