| @@ -1,7 +1,7 @@ | |||||
| bin_PROGRAMS = toilet | bin_PROGRAMS = toilet | ||||
| toilet_SOURCES = main.c | |||||
| toilet_SOURCES = main.c render.c render.h filters.c filter.h | |||||
| toilet_CFLAGS = `pkg-config --cflags cucul` | toilet_CFLAGS = `pkg-config --cflags cucul` | ||||
| toilet_LDFLAGS = `pkg-config --libs cucul` @GETOPT_LIBS@ | toilet_LDFLAGS = `pkg-config --libs cucul` @GETOPT_LIBS@ | ||||
| @@ -0,0 +1,122 @@ | |||||
| /* | |||||
| * TOIlet The Other Implementation’s letters | |||||
| * Copyright (c) 2006 Sam Hocevar <sam@zoy.org> | |||||
| * All Rights Reserved | |||||
| * | |||||
| * $Id$ | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the Do What The Fuck You Want To | |||||
| * Public License, Version 2, as published by Sam Hocevar. See | |||||
| * http://sam.zoy.org/wtfpl/COPYING for more details. | |||||
| */ | |||||
| #include "config.h" | |||||
| #if defined(HAVE_INTTYPES_H) | |||||
| # include <inttypes.h> | |||||
| #endif | |||||
| #include <cucul.h> | |||||
| #include "filters.h" | |||||
| void filter_autocrop(cucul_canvas_t *cv) | |||||
| { | |||||
| unsigned int x, y, w, h; | |||||
| unsigned int xmin, xmax, ymin, ymax; | |||||
| xmin = w = cucul_get_canvas_width(cv); | |||||
| xmax = 0; | |||||
| ymin = h = cucul_get_canvas_height(cv); | |||||
| ymax = 0; | |||||
| for(y = 0; y < h; y++) | |||||
| for(x = 0; x < w; x++) | |||||
| { | |||||
| unsigned long int ch = cucul_getchar(cv, x, y); | |||||
| if(ch != (unsigned char)' ') | |||||
| { | |||||
| if(x < xmin) | |||||
| xmin = x; | |||||
| if(x > xmax) | |||||
| xmax = x; | |||||
| if(y < ymin) | |||||
| ymin = y; | |||||
| if(y > ymax) | |||||
| ymax = y; | |||||
| } | |||||
| } | |||||
| cucul_set_canvas_boundaries(cv, xmin, ymin, | |||||
| xmax - xmin + 1, ymax - ymin + 1); | |||||
| } | |||||
| void filter_metal(cucul_canvas_t *cv) | |||||
| { | |||||
| static struct | |||||
| { | |||||
| char ch[6]; | |||||
| unsigned char fg, bg; | |||||
| } | |||||
| const palette[] = | |||||
| { | |||||
| { " ", CUCUL_COLOR_LIGHTBLUE, CUCUL_COLOR_LIGHTBLUE }, | |||||
| { "░", CUCUL_COLOR_BLUE, CUCUL_COLOR_LIGHTBLUE }, | |||||
| { "▒", CUCUL_COLOR_BLUE, CUCUL_COLOR_LIGHTBLUE }, | |||||
| { "░", CUCUL_COLOR_LIGHTBLUE, CUCUL_COLOR_BLUE }, | |||||
| { " ", CUCUL_COLOR_BLUE, CUCUL_COLOR_BLUE }, | |||||
| { " ", CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_LIGHTGRAY }, | |||||
| { "░", CUCUL_COLOR_DARKGRAY, CUCUL_COLOR_LIGHTGRAY }, | |||||
| { "▒", CUCUL_COLOR_DARKGRAY, CUCUL_COLOR_LIGHTGRAY }, | |||||
| { "░", CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_DARKGRAY }, | |||||
| { " ", CUCUL_COLOR_DARKGRAY, CUCUL_COLOR_DARKGRAY }, | |||||
| }; | |||||
| unsigned int x, y, w, h; | |||||
| w = cucul_get_canvas_width(cv); | |||||
| h = cucul_get_canvas_height(cv); | |||||
| for(y = 0; y < h; y++) | |||||
| for(x = 0; x < w; x++) | |||||
| { | |||||
| int i; | |||||
| if(cucul_getchar(cv, x, y) == (unsigned char)' ') | |||||
| continue; | |||||
| i = y * 10 / h; | |||||
| cucul_set_color(cv, palette[i].fg, palette[i].bg); | |||||
| cucul_putstr(cv, x, y, palette[i].ch); | |||||
| } | |||||
| } | |||||
| void filter_gay(cucul_canvas_t *cv) | |||||
| { | |||||
| static unsigned char const rainbow[] = | |||||
| { | |||||
| CUCUL_COLOR_LIGHTMAGENTA, | |||||
| CUCUL_COLOR_LIGHTRED, | |||||
| CUCUL_COLOR_YELLOW, | |||||
| CUCUL_COLOR_LIGHTGREEN, | |||||
| CUCUL_COLOR_LIGHTCYAN, | |||||
| CUCUL_COLOR_LIGHTBLUE, | |||||
| }; | |||||
| unsigned int x, y, w, h; | |||||
| w = cucul_get_canvas_width(cv); | |||||
| h = cucul_get_canvas_height(cv); | |||||
| for(y = 0; y < h; y++) | |||||
| for(x = 0; x < w; x++) | |||||
| { | |||||
| unsigned long int ch = cucul_getchar(cv, x, y); | |||||
| if(ch != (unsigned char)' ') | |||||
| { | |||||
| cucul_set_color(cv, rainbow[(x / 2 + y) % 6], | |||||
| CUCUL_COLOR_TRANSPARENT); | |||||
| cucul_putchar(cv, x, y, ch); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,17 @@ | |||||
| /* | |||||
| * TOIlet The Other Implementation’s letters | |||||
| * Copyright (c) 2006 Sam Hocevar <sam@zoy.org> | |||||
| * All Rights Reserved | |||||
| * | |||||
| * $Id$ | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the Do What The Fuck You Want To | |||||
| * Public License, Version 2, as published by Sam Hocevar. See | |||||
| * http://sam.zoy.org/wtfpl/COPYING for more details. | |||||
| */ | |||||
| extern void filter_autocrop(cucul_canvas_t *); | |||||
| extern void filter_metal(cucul_canvas_t *); | |||||
| extern void filter_gay(cucul_canvas_t *); | |||||
| @@ -22,18 +22,10 @@ | |||||
| #include <stdio.h> | #include <stdio.h> | ||||
| #include <string.h> | #include <string.h> | ||||
| #include <stdlib.h> | #include <stdlib.h> | ||||
| #include <cucul.h> | |||||
| #include "cucul.h" | |||||
| #include "caca.h" | |||||
| /* String to canvas transformations */ | |||||
| static cucul_canvas_t *cuculize_big(uint32_t const *, unsigned int); | |||||
| static cucul_canvas_t *cuculize_tiny(uint32_t const *, unsigned int); | |||||
| /* Canvas special effects */ | |||||
| static void filter_autocrop(cucul_canvas_t *); | |||||
| static void filter_metal(cucul_canvas_t *); | |||||
| static void filter_gay(cucul_canvas_t *); | |||||
| #include "render.h" | |||||
| #include "filters.h" | |||||
| int main(int argc, char *argv[]) | int main(int argc, char *argv[]) | ||||
| { | { | ||||
| @@ -153,7 +145,7 @@ int main(int argc, char *argv[]) | |||||
| } | } | ||||
| /* Do gay stuff with our string (léopard) */ | /* Do gay stuff with our string (léopard) */ | ||||
| cv = cuculize_big(string, length); | |||||
| cv = render_big(string, length); | |||||
| filter_autocrop(cv); | filter_autocrop(cv); | ||||
| if(flag_metal) | if(flag_metal) | ||||
| filter_metal(cv); | filter_metal(cv); | ||||
| @@ -171,170 +163,3 @@ int main(int argc, char *argv[]) | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| static cucul_canvas_t *cuculize_big(uint32_t const *string, | |||||
| unsigned int length) | |||||
| { | |||||
| cucul_canvas_t *cv; | |||||
| cucul_font_t *f; | |||||
| char const * const * fonts; | |||||
| unsigned char *buf; | |||||
| unsigned int w, h, x, y, miny, maxy; | |||||
| cv = cucul_create_canvas(length, 1); | |||||
| for(x = 0; x < length; x++) | |||||
| cucul_putchar(cv, x, 0, string[x]); | |||||
| fonts = cucul_get_font_list(); | |||||
| f = cucul_load_font(fonts[0], 0); | |||||
| /* Create our bitmap buffer (32-bit ARGB) */ | |||||
| w = cucul_get_canvas_width(cv) * cucul_get_font_width(f); | |||||
| h = cucul_get_canvas_height(cv) * cucul_get_font_height(f); | |||||
| buf = malloc(4 * w * h); | |||||
| /* Render the canvas onto our image buffer */ | |||||
| cucul_render_canvas(cv, f, buf, w, h, 4 * w); | |||||
| /* Free our canvas, and allocate a bigger one */ | |||||
| cucul_free_font(f); | |||||
| cucul_free_canvas(cv); | |||||
| cv = cucul_create_canvas(w, h); | |||||
| /* Render the image buffer on the canvas */ | |||||
| cucul_set_color(cv, CUCUL_COLOR_WHITE, CUCUL_COLOR_TRANSPARENT); | |||||
| cucul_clear_canvas(cv); | |||||
| miny = h; maxy = 0; | |||||
| for(y = 0; y < h; y++) | |||||
| for(x = 0; x < w; x++) | |||||
| { | |||||
| unsigned char c = buf[4 * (x + y * w) + 2]; | |||||
| if(c >= 0xa0) | |||||
| cucul_putstr(cv, x, y, "█"); | |||||
| else if(c >= 0x80) | |||||
| cucul_putstr(cv, x, y, "▓"); | |||||
| else if(c >= 0x40) | |||||
| cucul_putstr(cv, x, y, "▒"); | |||||
| else if(c >= 0x20) | |||||
| cucul_putstr(cv, x, y, "░"); | |||||
| } | |||||
| free(buf); | |||||
| return cv; | |||||
| } | |||||
| static cucul_canvas_t *cuculize_tiny(uint32_t const *string, | |||||
| unsigned int length) | |||||
| { | |||||
| unsigned int x; | |||||
| cucul_canvas_t *cv = cucul_create_canvas(length, 1); | |||||
| for(x = 0; x < length; x++) | |||||
| cucul_putchar(cv, x, 0, string[x]); | |||||
| return cv; | |||||
| } | |||||
| static void filter_autocrop(cucul_canvas_t *cv) | |||||
| { | |||||
| unsigned int x, y, w, h; | |||||
| unsigned int xmin, xmax, ymin, ymax; | |||||
| xmin = w = cucul_get_canvas_width(cv); | |||||
| xmax = 0; | |||||
| ymin = h = cucul_get_canvas_height(cv); | |||||
| ymax = 0; | |||||
| for(y = 0; y < h; y++) | |||||
| for(x = 0; x < w; x++) | |||||
| { | |||||
| unsigned long int ch = cucul_getchar(cv, x, y); | |||||
| if(ch != (unsigned char)' ') | |||||
| { | |||||
| if(x < xmin) | |||||
| xmin = x; | |||||
| if(x > xmax) | |||||
| xmax = x; | |||||
| if(y < ymin) | |||||
| ymin = y; | |||||
| if(y > ymax) | |||||
| ymax = y; | |||||
| } | |||||
| } | |||||
| cucul_set_canvas_boundaries(cv, xmin, ymin, | |||||
| xmax - xmin + 1, ymax - ymin + 1); | |||||
| } | |||||
| static void filter_metal(cucul_canvas_t *cv) | |||||
| { | |||||
| static struct | |||||
| { | |||||
| char ch[6]; | |||||
| unsigned char fg, bg; | |||||
| } | |||||
| const palette[] = | |||||
| { | |||||
| { " ", CUCUL_COLOR_LIGHTBLUE, CUCUL_COLOR_LIGHTBLUE }, | |||||
| { "░", CUCUL_COLOR_BLUE, CUCUL_COLOR_LIGHTBLUE }, | |||||
| { "▒", CUCUL_COLOR_BLUE, CUCUL_COLOR_LIGHTBLUE }, | |||||
| { "░", CUCUL_COLOR_LIGHTBLUE, CUCUL_COLOR_BLUE }, | |||||
| { " ", CUCUL_COLOR_BLUE, CUCUL_COLOR_BLUE }, | |||||
| { " ", CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_LIGHTGRAY }, | |||||
| { "░", CUCUL_COLOR_DARKGRAY, CUCUL_COLOR_LIGHTGRAY }, | |||||
| { "▒", CUCUL_COLOR_DARKGRAY, CUCUL_COLOR_LIGHTGRAY }, | |||||
| { "░", CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_DARKGRAY }, | |||||
| { " ", CUCUL_COLOR_DARKGRAY, CUCUL_COLOR_DARKGRAY }, | |||||
| }; | |||||
| unsigned int x, y, w, h; | |||||
| w = cucul_get_canvas_width(cv); | |||||
| h = cucul_get_canvas_height(cv); | |||||
| for(y = 0; y < h; y++) | |||||
| for(x = 0; x < w; x++) | |||||
| { | |||||
| int i; | |||||
| if(cucul_getchar(cv, x, y) == (unsigned char)' ') | |||||
| continue; | |||||
| i = y * 10 / h; | |||||
| cucul_set_color(cv, palette[i].fg, palette[i].bg); | |||||
| cucul_putstr(cv, x, y, palette[i].ch); | |||||
| } | |||||
| } | |||||
| static void filter_gay(cucul_canvas_t *cv) | |||||
| { | |||||
| static unsigned char const rainbow[] = | |||||
| { | |||||
| CUCUL_COLOR_LIGHTMAGENTA, | |||||
| CUCUL_COLOR_LIGHTRED, | |||||
| CUCUL_COLOR_YELLOW, | |||||
| CUCUL_COLOR_LIGHTGREEN, | |||||
| CUCUL_COLOR_LIGHTCYAN, | |||||
| CUCUL_COLOR_LIGHTBLUE, | |||||
| }; | |||||
| unsigned int x, y, w, h; | |||||
| w = cucul_get_canvas_width(cv); | |||||
| h = cucul_get_canvas_height(cv); | |||||
| for(y = 0; y < h; y++) | |||||
| for(x = 0; x < w; x++) | |||||
| { | |||||
| unsigned long int ch = cucul_getchar(cv, x, y); | |||||
| if(ch != (unsigned char)' ') | |||||
| { | |||||
| cucul_set_color(cv, rainbow[(x / 2 + y) % 6], | |||||
| CUCUL_COLOR_TRANSPARENT); | |||||
| cucul_putchar(cv, x, y, ch); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,88 @@ | |||||
| /* | |||||
| * TOIlet The Other Implementation’s letters | |||||
| * Copyright (c) 2006 Sam Hocevar <sam@zoy.org> | |||||
| * All Rights Reserved | |||||
| * | |||||
| * $Id$ | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the Do What The Fuck You Want To | |||||
| * Public License, Version 2, as published by Sam Hocevar. See | |||||
| * http://sam.zoy.org/wtfpl/COPYING for more details. | |||||
| */ | |||||
| #include "config.h" | |||||
| #if defined(HAVE_INTTYPES_H) | |||||
| # include <inttypes.h> | |||||
| #endif | |||||
| #include <stdlib.h> | |||||
| #include <cucul.h> | |||||
| #include "render.h" | |||||
| cucul_canvas_t *render_big(uint32_t const *string, unsigned int length) | |||||
| { | |||||
| cucul_canvas_t *cv; | |||||
| cucul_font_t *f; | |||||
| char const * const * fonts; | |||||
| unsigned char *buf; | |||||
| unsigned int w, h, x, y, miny, maxy; | |||||
| cv = cucul_create_canvas(length, 1); | |||||
| for(x = 0; x < length; x++) | |||||
| cucul_putchar(cv, x, 0, string[x]); | |||||
| fonts = cucul_get_font_list(); | |||||
| f = cucul_load_font(fonts[0], 0); | |||||
| /* Create our bitmap buffer (32-bit ARGB) */ | |||||
| w = cucul_get_canvas_width(cv) * cucul_get_font_width(f); | |||||
| h = cucul_get_canvas_height(cv) * cucul_get_font_height(f); | |||||
| buf = malloc(4 * w * h); | |||||
| /* Render the canvas onto our image buffer */ | |||||
| cucul_render_canvas(cv, f, buf, w, h, 4 * w); | |||||
| /* Free our canvas, and allocate a bigger one */ | |||||
| cucul_free_font(f); | |||||
| cucul_free_canvas(cv); | |||||
| cv = cucul_create_canvas(w, h); | |||||
| /* Render the image buffer on the canvas */ | |||||
| cucul_set_color(cv, CUCUL_COLOR_WHITE, CUCUL_COLOR_TRANSPARENT); | |||||
| cucul_clear_canvas(cv); | |||||
| miny = h; maxy = 0; | |||||
| for(y = 0; y < h; y++) | |||||
| for(x = 0; x < w; x++) | |||||
| { | |||||
| unsigned char c = buf[4 * (x + y * w) + 2]; | |||||
| if(c >= 0xa0) | |||||
| cucul_putstr(cv, x, y, "█"); | |||||
| else if(c >= 0x80) | |||||
| cucul_putstr(cv, x, y, "▓"); | |||||
| else if(c >= 0x40) | |||||
| cucul_putstr(cv, x, y, "▒"); | |||||
| else if(c >= 0x20) | |||||
| cucul_putstr(cv, x, y, "░"); | |||||
| } | |||||
| free(buf); | |||||
| return cv; | |||||
| } | |||||
| cucul_canvas_t *render_tiny(uint32_t const *string, unsigned int length) | |||||
| { | |||||
| unsigned int x; | |||||
| cucul_canvas_t *cv = cucul_create_canvas(length, 1); | |||||
| for(x = 0; x < length; x++) | |||||
| cucul_putchar(cv, x, 0, string[x]); | |||||
| return cv; | |||||
| } | |||||
| @@ -0,0 +1,16 @@ | |||||
| /* | |||||
| * TOIlet The Other Implementation’s letters | |||||
| * Copyright (c) 2006 Sam Hocevar <sam@zoy.org> | |||||
| * All Rights Reserved | |||||
| * | |||||
| * $Id$ | |||||
| * | |||||
| * This program is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the Do What The Fuck You Want To | |||||
| * Public License, Version 2, as published by Sam Hocevar. See | |||||
| * http://sam.zoy.org/wtfpl/COPYING for more details. | |||||
| */ | |||||
| extern cucul_canvas_t *render_big(uint32_t const *, unsigned int); | |||||
| extern cucul_canvas_t *render_tiny(uint32_t const *, unsigned int); | |||||