From baa61a9f6d849e676e362597b6bb8923814737bb Mon Sep 17 00:00:00 2001
From: jylam <jylam@92316355-f0b4-4df1-b90c-862c8a59935f>
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 *);