Przeglądaj źródła

* Make filters line-feed aware.

pull/1/head
Sam Hocevar sam 19 lat temu
rodzic
commit
b337442c2c
4 zmienionych plików z 50 dodań i 45 usunięć
  1. +32
    -32
      src/filter.c
  2. +17
    -11
      src/render.c
  3. +0
    -1
      src/render.h
  4. +1
    -1
      src/toilet.h

+ 32
- 32
src/filter.c Wyświetl plik

@@ -28,17 +28,17 @@
#include "toilet.h" #include "toilet.h"
#include "filter.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 struct
{ {
char const *name; char const *name;
void (*function)(cucul_canvas_t *);
void (*function)(context_t *);
} }
const lookup[] = const lookup[] =
{ {
@@ -92,7 +92,7 @@ int filter_do(context_t *cx)
unsigned int i; unsigned int i;


for(i = 0; i < cx->nfilters; i++) for(i = 0; i < cx->nfilters; i++)
cx->filters[i](cx->torender);
cx->filters[i](cx);


return 0; return 0;
} }
@@ -104,20 +104,20 @@ int filter_end(context_t *cx)
return 0; 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 x, y, w, h;
unsigned int xmin, xmax, ymin, ymax; unsigned int xmin, xmax, ymin, ymax;


xmin = w = cucul_get_canvas_width(cv);
xmin = w = cucul_get_canvas_width(cx->torender);
xmax = 0; xmax = 0;
ymin = h = cucul_get_canvas_height(cv);
ymin = h = cucul_get_canvas_height(cx->torender);
ymax = 0; ymax = 0;


for(y = 0; y < h; y++) for(y = 0; y < h; y++)
for(x = 0; x < w; x++) 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(ch != (unsigned char)' ')
{ {
if(x < xmin) if(x < xmin)
@@ -134,11 +134,11 @@ static void filter_crop(cucul_canvas_t *cv)
if(xmax < xmin || ymax < ymin) if(xmax < xmin || ymax < ymin)
return; return;


cucul_set_canvas_boundaries(cv, xmin, ymin,
cucul_set_canvas_boundaries(cx->torender, xmin, ymin,
xmax - xmin + 1, ymax - ymin + 1); 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[] = static unsigned char const palette[] =
{ {
@@ -150,25 +150,25 @@ static void filter_metal(cucul_canvas_t *cv)


unsigned int x, y, w, h; 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(y = 0; y < h; y++)
for(x = 0; x < w; x++) 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; int i;


if(ch == (unsigned char)' ') if(ch == (unsigned char)' ')
continue; 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[] = static unsigned char const rainbow[] =
{ {
@@ -181,34 +181,34 @@ static void filter_gay(cucul_canvas_t *cv)
}; };
unsigned int x, y, w, h; 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(y = 0; y < h; y++)
for(x = 0; x < w; x++) 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(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_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);
} }



+ 17
- 11
src/render.c Wyświetl plik

@@ -29,6 +29,8 @@
#include "render.h" #include "render.h"
#include "filter.h" #include "filter.h"


static int render_flush(context_t *);

int render_init(context_t *cx) int render_init(context_t *cx)
{ {
cx->x = cx->y = 0; cx->x = cx->y = 0;
@@ -66,7 +68,7 @@ int render_stdin(context_t *cx)
i = 0; i = 0;


if(ch == '\n') if(ch == '\n')
render_line(cx);
render_flush(cx);
} }


return 0; return 0;
@@ -91,12 +93,22 @@ int render_list(context_t *cx, unsigned int argc, char *argv[])
} }
} }


render_line(cx);
render_flush(cx);

return 0;
}

int render_end(context_t *cx)
{
cx->end(cx);
cucul_free_canvas(cx->cv);


return 0; return 0;
} }


int render_line(context_t *cx)
/* XXX: Following functions are local */

static int render_flush(context_t *cx)
{ {
cucul_buffer_t *buffer; cucul_buffer_t *buffer;


@@ -106,6 +118,8 @@ int render_line(context_t *cx)
/* Apply optional effects to our string */ /* Apply optional effects to our string */
filter_do(cx); filter_do(cx);


cx->lines += cucul_get_canvas_height(cx->torender);

/* Output line */ /* Output line */
buffer = cucul_export_canvas(cx->torender, cx->export); buffer = cucul_export_canvas(cx->torender, cx->export);
fwrite(cucul_get_buffer_data(buffer), fwrite(cucul_get_buffer_data(buffer),
@@ -116,11 +130,3 @@ int render_line(context_t *cx)
return 0; return 0;
} }


int render_end(context_t *cx)
{
cx->end(cx);
cucul_free_canvas(cx->cv);

return 0;
}


+ 0
- 1
src/render.h Wyświetl plik

@@ -22,6 +22,5 @@ extern int init_figlet(context_t *);
extern int render_init(context_t *); extern int render_init(context_t *);
extern int render_stdin(context_t *); extern int render_stdin(context_t *);
extern int render_list(context_t *, unsigned int, char *[]); extern int render_list(context_t *, unsigned int, char *[]);
extern int render_line(context_t *);
extern int render_end(context_t *); extern int render_end(context_t *);



+ 1
- 1
src/toilet.h Wyświetl plik

@@ -47,7 +47,7 @@ struct toilet_context
unsigned int *lookup; unsigned int *lookup;


/* Render filters */ /* Render filters */
void (**filters)(cucul_canvas_t *);
void (**filters)(struct toilet_context *);
unsigned int nfilters; unsigned int nfilters;
}; };




Ładowanie…
Anuluj
Zapisz