From baa61a9f6d849e676e362597b6bb8923814737bb Mon Sep 17 00:00:00 2001 From: jylam Date: Fri, 8 Aug 2008 18:07:10 +0000 Subject: [PATCH] * Handle alpha layer in floodfill (but don't make it conditionnal to the algorithm) git-svn-id: file:///srv/caca.zoy.org/var/lib/svn/libpipi/trunk@2678 92316355-f0b4-4df1-b90c-862c8a59935f --- examples/floodfill.c | 2 +- pipi/fill/floodfill.c | 21 ++++++++++++--------- pipi/pipi.h | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/examples/floodfill.c b/examples/floodfill.c index cae5a27..141c029 100644 --- a/examples/floodfill.c +++ b/examples/floodfill.c @@ -30,7 +30,7 @@ int main(int argc, char *argv[]) newimg = pipi_copy(img); pipi_free(img); - ret = pipi_flood_fill(newimg, atoi(argv[2]), atoi(argv[3]), 1, 0, 0); + ret = pipi_flood_fill(newimg, atoi(argv[2]), atoi(argv[3]), 1, 0, 0, 1); if(!ret) pipi_save(newimg, dstname); diff --git a/pipi/fill/floodfill.c b/pipi/fill/floodfill.c index 025a22f..1aa1bd8 100644 --- a/pipi/fill/floodfill.c +++ b/pipi/fill/floodfill.c @@ -35,8 +35,8 @@ static void pipi_flood_fill_stack_scanline_u32(pipi_pixels_t *dstp, uint32_t new, uint32_t old); static void pipi_flood_fill_stack_scanline_float(pipi_pixels_t *dstp, int x, int y, - float nr, float ng, float nb, - float or, float og, float ob); + float nr, float ng, float nb, float na, + float or, float og, float ob, float oa); static int pop (int *x,int *y, int h); static int push(int x, int y, int h); static void clear_stack(int h); @@ -63,7 +63,7 @@ static int validate_pixel_f(float r1, float g1, float b1, /* Public function */ int pipi_flood_fill(pipi_image_t *src, int px, int py, - float r, float g, float b) + float r, float g, float b, float a) { pipi_image_t *dst = src; pipi_pixels_t *dstp; @@ -80,7 +80,7 @@ int pipi_flood_fill(pipi_image_t *src, if(src->last_modified == PIPI_PIXELS_RGBA32) { uint32_t *dstdata; - unsigned char nr, ng, nb; + unsigned char nr, ng, nb, na; /* Get ARGB32 pointer */ dstp = pipi_getpixels(dst, PIPI_PIXELS_RGBA32); @@ -89,15 +89,16 @@ int pipi_flood_fill(pipi_image_t *src, nr = r*255.0f; ng = g*255.0f; nb = b*255.0f; + na = a*255.0f; dstp->w = w; dstp->h = h; - pipi_flood_fill_stack_scanline_u32(dstp, px, py, (nr<<16)|(ng<<8)|(nb), dstdata[px+py*w]); + pipi_flood_fill_stack_scanline_u32(dstp, px, py, (na<<24)|(nr<<16)|(ng<<8)|(nb), dstdata[px+py*w]); } else { int gray = (dst->last_modified == PIPI_PIXELS_Y_F); float *dstdata; - float or, og, ob; + float or, og, ob, oa; dstp = gray ? pipi_getpixels(dst, PIPI_PIXELS_Y_F) : pipi_getpixels(dst, PIPI_PIXELS_RGBA_F); @@ -107,11 +108,12 @@ int pipi_flood_fill(pipi_image_t *src, or = dstdata[(px+py*w)*4]; og = dstdata[(px+py*w)*4 + 1]; ob = dstdata[(px+py*w)*4 + 2]; + oa = dstdata[(px+py*w)*4 + 3]; dstp->w = w; dstp->h = h; - pipi_flood_fill_stack_scanline_float(dstp, px, py, r, g, b, or, og, ob); + pipi_flood_fill_stack_scanline_float(dstp, px, py, r, g, b, a, or, og, ob, oa); } return 0; @@ -177,8 +179,8 @@ void pipi_flood_fill_stack_scanline_u32(pipi_pixels_t *dstp, /* Float version. Much slower, but supports HDR and (soon antialiasing) */ static void pipi_flood_fill_stack_scanline_float(pipi_pixels_t *dstp, int x, int y, - float nr, float ng, float nb, - float or, float og, float ob) + float nr, float ng, float nb, float na, + float or, float og, float ob, float oa) { if((nr==or) && (ng==og) && (nb==ob)) return; @@ -214,6 +216,7 @@ static void pipi_flood_fill_stack_scanline_float(pipi_pixels_t *dstp, cur_line[x*4] = nr; cur_line[x*4 + 1] = ng; cur_line[x*4 + 2] = nb; + cur_line[x*4 + 3] = na; if(!left && x > 0 && validate_pixel_f(cur_line[xm1], cur_line[xm1 + 1], diff --git a/pipi/pipi.h b/pipi/pipi.h index aef91d7..658e190 100644 --- a/pipi/pipi.h +++ b/pipi/pipi.h @@ -83,7 +83,7 @@ extern pipi_image_t *pipi_gaussian_blur_ext(pipi_image_t *, float, float, float, float); extern int pipi_flood_fill(pipi_image_t *, - int, int, float, float, float); + int, int, float, float, float, float); extern pipi_image_t *pipi_dither_floydsteinberg(pipi_image_t *, pipi_scan_t); extern pipi_image_t *pipi_dither_ordered(pipi_image_t *);