ソースを参照

* 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
remotes/tiles
jylam 16年前
コミット
baa61a9f6d
3個のファイルの変更14行の追加11行の削除
  1. +1
    -1
      examples/floodfill.c
  2. +12
    -9
      pipi/fill/floodfill.c
  3. +1
    -1
      pipi/pipi.h

+ 1
- 1
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);



+ 12
- 9
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],


+ 1
- 1
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 *);


読み込み中…
キャンセル
保存