diff --git a/src/filter.c b/src/filter.c index 8fb4a0d..c5143f3 100644 --- a/src/filter.c +++ b/src/filter.c @@ -28,17 +28,17 @@ #include "toilet.h" #include "filter.h" -static void filter_crop(cucul_canvas_t *); -static void filter_gay(cucul_canvas_t *); -static void filter_metal(cucul_canvas_t *); -static void filter_flip(cucul_canvas_t *); -static void filter_flop(cucul_canvas_t *); -static void filter_rotate(cucul_canvas_t *); +static void filter_crop(context_t *); +static void filter_gay(context_t *); +static void filter_metal(context_t *); +static void filter_flip(context_t *); +static void filter_flop(context_t *); +static void filter_rotate(context_t *); struct { char const *name; - void (*function)(cucul_canvas_t *); + void (*function)(context_t *); } const lookup[] = { @@ -92,7 +92,7 @@ int filter_do(context_t *cx) unsigned int i; for(i = 0; i < cx->nfilters; i++) - cx->filters[i](cx->torender); + cx->filters[i](cx); return 0; } @@ -104,20 +104,20 @@ int filter_end(context_t *cx) return 0; } -static void filter_crop(cucul_canvas_t *cv) +static void filter_crop(context_t *cx) { unsigned int x, y, w, h; unsigned int xmin, xmax, ymin, ymax; - xmin = w = cucul_get_canvas_width(cv); + xmin = w = cucul_get_canvas_width(cx->torender); xmax = 0; - ymin = h = cucul_get_canvas_height(cv); + ymin = h = cucul_get_canvas_height(cx->torender); ymax = 0; for(y = 0; y < h; y++) for(x = 0; x < w; x++) { - unsigned long int ch = cucul_getchar(cv, x, y); + unsigned long int ch = cucul_getchar(cx->torender, x, y); if(ch != (unsigned char)' ') { if(x < xmin) @@ -134,11 +134,11 @@ static void filter_crop(cucul_canvas_t *cv) if(xmax < xmin || ymax < ymin) return; - cucul_set_canvas_boundaries(cv, xmin, ymin, + cucul_set_canvas_boundaries(cx->torender, xmin, ymin, xmax - xmin + 1, ymax - ymin + 1); } -static void filter_metal(cucul_canvas_t *cv) +static void filter_metal(context_t *cx) { static unsigned char const palette[] = { @@ -150,25 +150,25 @@ static void filter_metal(cucul_canvas_t *cv) unsigned int x, y, w, h; - w = cucul_get_canvas_width(cv); - h = cucul_get_canvas_height(cv); + w = cucul_get_canvas_width(cx->torender); + h = cucul_get_canvas_height(cx->torender); for(y = 0; y < h; y++) for(x = 0; x < w; x++) { - unsigned long int ch = cucul_getchar(cv, x, y); + unsigned long int ch = cucul_getchar(cx->torender, x, y); int i; if(ch == (unsigned char)' ') continue; - i = y * 4 / h; - cucul_set_color(cv, palette[i], CUCUL_COLOR_TRANSPARENT); - cucul_putchar(cv, x, y, ch); + i = ((cx->lines + y + x / 8) / 2) % 4; + cucul_set_color(cx->torender, palette[i], CUCUL_COLOR_TRANSPARENT); + cucul_putchar(cx->torender, x, y, ch); } } -static void filter_gay(cucul_canvas_t *cv) +static void filter_gay(context_t *cx) { static unsigned char const rainbow[] = { @@ -181,34 +181,34 @@ static void filter_gay(cucul_canvas_t *cv) }; unsigned int x, y, w, h; - w = cucul_get_canvas_width(cv); - h = cucul_get_canvas_height(cv); + w = cucul_get_canvas_width(cx->torender); + h = cucul_get_canvas_height(cx->torender); for(y = 0; y < h; y++) for(x = 0; x < w; x++) { - unsigned long int ch = cucul_getchar(cv, x, y); + unsigned long int ch = cucul_getchar(cx->torender, x, y); if(ch != (unsigned char)' ') { - cucul_set_color(cv, rainbow[(x / 2 + y) % 6], + cucul_set_color(cx->torender, rainbow[(x / 2 + y + cx->lines) % 6], CUCUL_COLOR_TRANSPARENT); - cucul_putchar(cv, x, y, ch); + cucul_putchar(cx->torender, x, y, ch); } } } -static void filter_flip(cucul_canvas_t *cv) +static void filter_flip(context_t *cx) { - cucul_flip(cv); + cucul_flip(cx->torender); } -static void filter_flop(cucul_canvas_t *cv) +static void filter_flop(context_t *cx) { - cucul_flop(cv); + cucul_flop(cx->torender); } -static void filter_rotate(cucul_canvas_t *cv) +static void filter_rotate(context_t *cx) { - cucul_rotate(cv); + cucul_rotate(cx->torender); } diff --git a/src/render.c b/src/render.c index 8763099..4aa53f2 100644 --- a/src/render.c +++ b/src/render.c @@ -29,6 +29,8 @@ #include "render.h" #include "filter.h" +static int render_flush(context_t *); + int render_init(context_t *cx) { cx->x = cx->y = 0; @@ -66,7 +68,7 @@ int render_stdin(context_t *cx) i = 0; if(ch == '\n') - render_line(cx); + render_flush(cx); } return 0; @@ -91,27 +93,7 @@ int render_list(context_t *cx, unsigned int argc, char *argv[]) } } - render_line(cx); - - return 0; -} - -int render_line(context_t *cx) -{ - cucul_buffer_t *buffer; - - /* Flush current line */ - cx->flush(cx); - - /* Apply optional effects to our string */ - filter_do(cx); - - /* Output line */ - buffer = cucul_export_canvas(cx->torender, cx->export); - fwrite(cucul_get_buffer_data(buffer), - cucul_get_buffer_size(buffer), 1, stdout); - cucul_free_buffer(buffer); - cucul_free_canvas(cx->torender); + render_flush(cx); return 0; } @@ -124,3 +106,27 @@ int render_end(context_t *cx) return 0; } +/* XXX: Following functions are local */ + +static int render_flush(context_t *cx) +{ + cucul_buffer_t *buffer; + + /* Flush current line */ + cx->flush(cx); + + /* Apply optional effects to our string */ + filter_do(cx); + + cx->lines += cucul_get_canvas_height(cx->torender); + + /* Output line */ + buffer = cucul_export_canvas(cx->torender, cx->export); + fwrite(cucul_get_buffer_data(buffer), + cucul_get_buffer_size(buffer), 1, stdout); + cucul_free_buffer(buffer); + cucul_free_canvas(cx->torender); + + return 0; +} + diff --git a/src/render.h b/src/render.h index ec311ec..a4e028b 100644 --- a/src/render.h +++ b/src/render.h @@ -22,6 +22,5 @@ extern int init_figlet(context_t *); extern int render_init(context_t *); extern int render_stdin(context_t *); extern int render_list(context_t *, unsigned int, char *[]); -extern int render_line(context_t *); extern int render_end(context_t *); diff --git a/src/toilet.h b/src/toilet.h index ea1c3c3..1128462 100644 --- a/src/toilet.h +++ b/src/toilet.h @@ -47,7 +47,7 @@ struct toilet_context unsigned int *lookup; /* Render filters */ - void (**filters)(cucul_canvas_t *); + void (**filters)(struct toilet_context *); unsigned int nfilters; };