indent fill.c

This commit is contained in:
Bill Kendrick 2017-10-15 11:44:35 -07:00
parent ce8121301a
commit 0608ce4c34

View file

@ -39,15 +39,13 @@
/* Our globals: */ /* Our globals: */
static Mix_Chunk * fill_snd; static Mix_Chunk *fill_snd;
static Uint8 fill_r, fill_g, fill_b; static Uint8 fill_r, fill_g, fill_b;
/* Local function prototypes: */ /* Local function prototypes: */
static int colors_close(magic_api * api, SDL_Surface * canvas, static int colors_close(magic_api * api, SDL_Surface * canvas, Uint32 c1, Uint32 c2);
Uint32 c1, Uint32 c2); static void do_flood_fill(magic_api * api, SDL_Surface * canvas, int x, int y, Uint32 cur_colr, Uint32 old_colr);
static void do_flood_fill(magic_api * api, SDL_Surface * canvas, int x, int y,
Uint32 cur_colr, Uint32 old_colr);
int fill_modes(magic_api * api, int which); int fill_modes(magic_api * api, int which);
void fill_switchout(magic_api * api, int which, int mode, SDL_Surface * canvas); void fill_switchout(magic_api * api, int which, int mode, SDL_Surface * canvas);
void fill_switchin(magic_api * api, int which, int mode, SDL_Surface * canvas); void fill_switchin(magic_api * api, int which, int mode, SDL_Surface * canvas);
@ -55,18 +53,15 @@ int fill_requires_colors(magic_api * api, int which);
void fill_set_color(magic_api * api, Uint8 r, Uint8 g, Uint8 b); void fill_set_color(magic_api * api, Uint8 r, Uint8 g, Uint8 b);
void fill_shutdown(magic_api * api); void fill_shutdown(magic_api * api);
void fill_release(magic_api * api, int which, void fill_release(magic_api * api, int which,
SDL_Surface * canvas, SDL_Surface * last, SDL_Surface * canvas, SDL_Surface * last, int x, int y, SDL_Rect * update_rect);
int x, int y, SDL_Rect * update_rect);
void fill_click(magic_api * api, int which, int mode, void fill_click(magic_api * api, int which, int mode,
SDL_Surface * canvas, SDL_Surface * last, SDL_Surface * canvas, SDL_Surface * last, int x, int y, SDL_Rect * update_rect);
int x, int y, SDL_Rect * update_rect);
void fill_drag(magic_api * api, int which, SDL_Surface * canvas, void fill_drag(magic_api * api, int which, SDL_Surface * canvas,
SDL_Surface * last, int ox, int oy, int x, int y, SDL_Surface * last, int ox, int oy, int x, int y, SDL_Rect * update_rect);
SDL_Rect * update_rect); char *fill_get_description(magic_api * api, int which, int mode);
char * fill_get_description(magic_api * api, int which, int mode); char *fill_get_name(magic_api * api, int which);
char * fill_get_name(magic_api * api, int which);
int fill_get_tool_count(magic_api * api); int fill_get_tool_count(magic_api * api);
SDL_Surface * fill_get_icon(magic_api * api, int which); SDL_Surface *fill_get_icon(magic_api * api, int which);
Uint32 fill_api_version(void); Uint32 fill_api_version(void);
int fill_init(magic_api * api); int fill_init(magic_api * api);
@ -76,61 +71,59 @@ int fill_init(magic_api * api)
{ {
char fname[1024]; char fname[1024];
snprintf(fname, sizeof(fname), "%s/sounds/magic/fill.wav", snprintf(fname, sizeof(fname), "%s/sounds/magic/fill.wav", api->data_directory);
api->data_directory);
fill_snd = Mix_LoadWAV(fname); fill_snd = Mix_LoadWAV(fname);
return(1); return (1);
} }
Uint32 fill_api_version(void) { return(TP_MAGIC_API_VERSION); } Uint32 fill_api_version(void)
{
return (TP_MAGIC_API_VERSION);
}
// We have multiple tools: // We have multiple tools:
int fill_get_tool_count(magic_api * api ATTRIBUTE_UNUSED) int fill_get_tool_count(magic_api * api ATTRIBUTE_UNUSED)
{ {
return(1); return (1);
} }
// Load our icons: // Load our icons:
SDL_Surface * fill_get_icon(magic_api * api, int which ATTRIBUTE_UNUSED) SDL_Surface *fill_get_icon(magic_api * api, int which ATTRIBUTE_UNUSED)
{ {
char fname[1024]; char fname[1024];
snprintf(fname, sizeof(fname), "%s/images/magic/fill.png", snprintf(fname, sizeof(fname), "%s/images/magic/fill.png", api->data_directory);
api->data_directory);
return(IMG_Load(fname)); return (IMG_Load(fname));
} }
// Return our names, localized: // Return our names, localized:
char * fill_get_name(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED) char *fill_get_name(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED)
{ {
return(strdup(gettext_noop("Fill"))); return (strdup(gettext_noop("Fill")));
} }
// Return our descriptions, localized: // Return our descriptions, localized:
char * fill_get_description(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED) char *fill_get_description(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED)
{ {
return(strdup(gettext_noop( return (strdup(gettext_noop("Click in the picture to fill that area with color.")));
"Click in the picture to fill that area with color.")));
} }
// Affect the canvas on drag: // Affect the canvas on drag:
void fill_drag(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED, void fill_drag(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED,
SDL_Surface * last ATTRIBUTE_UNUSED, int ox ATTRIBUTE_UNUSED, int oy ATTRIBUTE_UNUSED, int x ATTRIBUTE_UNUSED, int y ATTRIBUTE_UNUSED, SDL_Surface * last ATTRIBUTE_UNUSED, int ox ATTRIBUTE_UNUSED, int oy ATTRIBUTE_UNUSED,
SDL_Rect * update_rect ATTRIBUTE_UNUSED) int x ATTRIBUTE_UNUSED, int y ATTRIBUTE_UNUSED, SDL_Rect * update_rect ATTRIBUTE_UNUSED)
{ {
} }
// Affect the canvas on click: // Affect the canvas on click:
void fill_click(magic_api * api, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, void fill_click(magic_api * api, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED,
SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * last ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * last ATTRIBUTE_UNUSED,
int x, int y, SDL_Rect * update_rect) int x, int y, SDL_Rect * update_rect)
{ {
do_flood_fill(api, canvas, x, y, SDL_MapRGB(canvas->format, do_flood_fill(api, canvas, x, y, SDL_MapRGB(canvas->format, fill_r, fill_g, fill_b), api->getpixel(canvas, x, y));
fill_r, fill_g, fill_b),
api->getpixel(canvas, x, y));
update_rect->x = 0; update_rect->x = 0;
update_rect->y = 0; update_rect->y = 0;
@ -139,8 +132,8 @@ void fill_click(magic_api * api, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_
} }
void fill_release(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, void fill_release(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED,
SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * last ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED, SDL_Surface * last ATTRIBUTE_UNUSED,
int x ATTRIBUTE_UNUSED, int y ATTRIBUTE_UNUSED, SDL_Rect * update_rect ATTRIBUTE_UNUSED) int x ATTRIBUTE_UNUSED, int y ATTRIBUTE_UNUSED, SDL_Rect * update_rect ATTRIBUTE_UNUSED)
{ {
} }
@ -164,42 +157,41 @@ int fill_requires_colors(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_U
} }
static int colors_close(magic_api * api, SDL_Surface * canvas, static int colors_close(magic_api * api, SDL_Surface * canvas, Uint32 c1, Uint32 c2)
Uint32 c1, Uint32 c2)
{ {
Uint8 r1, g1, b1, r2, g2, b2; Uint8 r1, g1, b1, r2, g2, b2;
if (c1 == c2) if (c1 == c2)
{ {
/* Get it over with quick, if possible! */ /* Get it over with quick, if possible! */
return 1; return 1;
} }
else else
{ {
double r, g, b; double r, g, b;
SDL_GetRGB(c1, canvas->format, &r1, &g1, &b1);
SDL_GetRGB(c2, canvas->format, &r2, &g2, &b2);
// use distance in linear RGB space SDL_GetRGB(c1, canvas->format, &r1, &g1, &b1);
r = api->sRGB_to_linear(r1) - api->sRGB_to_linear(r2); SDL_GetRGB(c2, canvas->format, &r2, &g2, &b2);
r *= r;
g = api->sRGB_to_linear(g1) - api->sRGB_to_linear(g2);
g *= g;
b = api->sRGB_to_linear(b1) - api->sRGB_to_linear(b2);
b *= b;
// easy to confuse: // use distance in linear RGB space
// dark grey, brown, purple r = api->sRGB_to_linear(r1) - api->sRGB_to_linear(r2);
// light grey, tan r *= r;
// red, orange g = api->sRGB_to_linear(g1) - api->sRGB_to_linear(g2);
return r + g + b < 0.04; g *= g;
} b = api->sRGB_to_linear(b1) - api->sRGB_to_linear(b2);
b *= b;
// easy to confuse:
// dark grey, brown, purple
// light grey, tan
// red, orange
return r + g + b < 0.04;
}
} }
static void do_flood_fill(magic_api * api, SDL_Surface * canvas, int x, int y, static void do_flood_fill(magic_api * api, SDL_Surface * canvas, int x, int y, Uint32 cur_colr, Uint32 old_colr)
Uint32 cur_colr, Uint32 old_colr)
{ {
int fillL, fillR, i, in_line; int fillL, fillR, i, in_line;
static unsigned char prog_anim; static unsigned char prog_anim;
@ -214,10 +206,10 @@ static void do_flood_fill(magic_api * api, SDL_Surface * canvas, int x, int y,
prog_anim++; prog_anim++;
if ((prog_anim % 4) == 0) if ((prog_anim % 4) == 0)
{ {
api->update_progress_bar(); api->update_progress_bar();
api->playsound(fill_snd, (x * 255) / canvas->w, 255); api->playsound(fill_snd, (x * 255) / canvas->w, 255);
} }
/* Find left side, filling along the way */ /* Find left side, filling along the way */
@ -225,15 +217,12 @@ static void do_flood_fill(magic_api * api, SDL_Surface * canvas, int x, int y,
in_line = 1; in_line = 1;
while (in_line) while (in_line)
{ {
api->putpixel(canvas, fillL, y, cur_colr); api->putpixel(canvas, fillL, y, cur_colr);
fillL--; fillL--;
in_line = in_line = (fillL < 0) ? 0 : colors_close(api, canvas, api->getpixel(canvas, fillL, y), old_colr);
(fillL < 0) ? 0 : colors_close(api, canvas, }
api->getpixel(canvas, fillL, y),
old_colr);
}
fillL++; fillL++;
@ -241,14 +230,12 @@ static void do_flood_fill(magic_api * api, SDL_Surface * canvas, int x, int y,
in_line = 1; in_line = 1;
while (in_line) while (in_line)
{ {
api->putpixel(canvas, fillR, y, cur_colr); api->putpixel(canvas, fillR, y, cur_colr);
fillR++; fillR++;
in_line = (fillR >= canvas->w) ? 0 : colors_close(api, canvas, in_line = (fillR >= canvas->w) ? 0 : colors_close(api, canvas, api->getpixel(canvas, fillR, y), old_colr);
api->getpixel(canvas, fillR, y), }
old_colr);
}
fillR--; fillR--;
@ -256,26 +243,26 @@ static void do_flood_fill(magic_api * api, SDL_Surface * canvas, int x, int y,
/* Search top and bottom */ /* Search top and bottom */
for (i = fillL; i <= fillR; i++) for (i = fillL; i <= fillR; i++)
{ {
if (y > 0 && colors_close(api, canvas, api->getpixel(canvas, i, y - 1), if (y > 0 && colors_close(api, canvas, api->getpixel(canvas, i, y - 1), old_colr))
old_colr)) do_flood_fill(api, canvas, i, y - 1, cur_colr, old_colr);
do_flood_fill(api, canvas, i, y - 1, cur_colr, old_colr);
if (y < canvas->h if (y < canvas->h && colors_close(api, canvas, api->getpixel(canvas, i, y + 1), old_colr))
&& colors_close(api, canvas, api->getpixel(canvas, i, y + 1), old_colr)) do_flood_fill(api, canvas, i, y + 1, cur_colr, old_colr);
do_flood_fill(api, canvas, i, y + 1, cur_colr, old_colr); }
}
} }
void fill_switchin(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED) void fill_switchin(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED,
SDL_Surface * canvas ATTRIBUTE_UNUSED)
{ {
} }
void fill_switchout(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED, SDL_Surface * canvas ATTRIBUTE_UNUSED) void fill_switchout(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED, int mode ATTRIBUTE_UNUSED,
SDL_Surface * canvas ATTRIBUTE_UNUSED)
{ {
} }
int fill_modes(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED) int fill_modes(magic_api * api ATTRIBUTE_UNUSED, int which ATTRIBUTE_UNUSED)
{ {
return(MODE_PAINT); return (MODE_PAINT);
} }