Ignore:
Timestamp:
Sep 23, 2006, 9:54:20 PM (16 years ago)
Author:
Sam Hocevar
Message:
  • Split main.c into main.c/render.c/filters.c.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • toilet/trunk/src/main.c

    r1099 r1100  
    2323#include <string.h>
    2424#include <stdlib.h>
     25#include <cucul.h>
    2526
    26 #include "cucul.h"
    27 #include "caca.h"
    28 
    29 /* String to canvas transformations */
    30 static cucul_canvas_t *cuculize_big(uint32_t const *, unsigned int);
    31 static cucul_canvas_t *cuculize_tiny(uint32_t const *, unsigned int);
    32 
    33 /* Canvas special effects */
    34 static void filter_autocrop(cucul_canvas_t *);
    35 static void filter_metal(cucul_canvas_t *);
    36 static void filter_gay(cucul_canvas_t *);
     27#include "render.h"
     28#include "filters.h"
    3729
    3830int main(int argc, char *argv[])
     
    154146
    155147    /* Do gay stuff with our string (léopard) */
    156     cv = cuculize_big(string, length);
     148    cv = render_big(string, length);
    157149    filter_autocrop(cv);
    158150    if(flag_metal)
     
    172164}
    173165
    174 static cucul_canvas_t *cuculize_big(uint32_t const *string,
    175                                     unsigned int length)
    176 {
    177     cucul_canvas_t *cv;
    178     cucul_font_t *f;
    179     char const * const * fonts;
    180     unsigned char *buf;
    181     unsigned int w, h, x, y, miny, maxy;
    182 
    183     cv = cucul_create_canvas(length, 1);
    184     for(x = 0; x < length; x++)
    185         cucul_putchar(cv, x, 0, string[x]);
    186 
    187     fonts = cucul_get_font_list();
    188     f = cucul_load_font(fonts[0], 0);
    189 
    190     /* Create our bitmap buffer (32-bit ARGB) */
    191     w = cucul_get_canvas_width(cv) * cucul_get_font_width(f);
    192     h = cucul_get_canvas_height(cv) * cucul_get_font_height(f);
    193     buf = malloc(4 * w * h);
    194 
    195     /* Render the canvas onto our image buffer */
    196     cucul_render_canvas(cv, f, buf, w, h, 4 * w);
    197 
    198     /* Free our canvas, and allocate a bigger one */
    199     cucul_free_font(f);
    200     cucul_free_canvas(cv);
    201     cv = cucul_create_canvas(w, h);
    202 
    203     /* Render the image buffer on the canvas */
    204     cucul_set_color(cv, CUCUL_COLOR_WHITE, CUCUL_COLOR_TRANSPARENT);
    205     cucul_clear_canvas(cv);
    206 
    207     miny = h; maxy = 0;
    208 
    209     for(y = 0; y < h; y++)
    210        for(x = 0; x < w; x++)
    211     {
    212         unsigned char c = buf[4 * (x + y * w) + 2];
    213 
    214         if(c >= 0xa0)
    215             cucul_putstr(cv, x, y, "█");
    216         else if(c >= 0x80)
    217             cucul_putstr(cv, x, y, "▓");
    218         else if(c >= 0x40)
    219             cucul_putstr(cv, x, y, "▒");
    220         else if(c >= 0x20)
    221             cucul_putstr(cv, x, y, "░");
    222     }
    223 
    224     free(buf);
    225 
    226     return cv;
    227 }
    228 
    229 static cucul_canvas_t *cuculize_tiny(uint32_t const *string,
    230                                      unsigned int length)
    231 {
    232     unsigned int x;
    233     cucul_canvas_t *cv = cucul_create_canvas(length, 1);
    234 
    235     for(x = 0; x < length; x++)
    236         cucul_putchar(cv, x, 0, string[x]);
    237 
    238     return cv;
    239 }
    240 
    241 static void filter_autocrop(cucul_canvas_t *cv)
    242 {
    243     unsigned int x, y, w, h;
    244     unsigned int xmin, xmax, ymin, ymax;
    245 
    246     xmin = w = cucul_get_canvas_width(cv);
    247     xmax = 0;
    248     ymin = h = cucul_get_canvas_height(cv);
    249     ymax = 0;
    250 
    251     for(y = 0; y < h; y++)
    252         for(x = 0; x < w; x++)
    253     {
    254         unsigned long int ch = cucul_getchar(cv, x, y);
    255         if(ch != (unsigned char)' ')
    256         {
    257             if(x < xmin)
    258                 xmin = x;
    259             if(x > xmax)
    260                 xmax = x;
    261             if(y < ymin)
    262                 ymin = y;
    263             if(y > ymax)
    264                 ymax = y;
    265         }
    266     }
    267 
    268     cucul_set_canvas_boundaries(cv, xmin, ymin,
    269                                 xmax - xmin + 1, ymax - ymin + 1);
    270 }
    271 
    272 static void filter_metal(cucul_canvas_t *cv)
    273 {
    274     static struct
    275     {
    276         char ch[6];
    277         unsigned char fg, bg;
    278     }
    279     const palette[] =
    280     {
    281         { " ", CUCUL_COLOR_LIGHTBLUE, CUCUL_COLOR_LIGHTBLUE },
    282         { "░", CUCUL_COLOR_BLUE, CUCUL_COLOR_LIGHTBLUE },
    283         { "▒", CUCUL_COLOR_BLUE, CUCUL_COLOR_LIGHTBLUE },
    284         { "░", CUCUL_COLOR_LIGHTBLUE, CUCUL_COLOR_BLUE },
    285         { " ", CUCUL_COLOR_BLUE, CUCUL_COLOR_BLUE },
    286         { " ", CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_LIGHTGRAY },
    287         { "░", CUCUL_COLOR_DARKGRAY, CUCUL_COLOR_LIGHTGRAY },
    288         { "▒", CUCUL_COLOR_DARKGRAY, CUCUL_COLOR_LIGHTGRAY },
    289         { "░", CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_DARKGRAY },
    290         { " ", CUCUL_COLOR_DARKGRAY, CUCUL_COLOR_DARKGRAY },
    291     };
    292 
    293     unsigned int x, y, w, h;
    294 
    295     w = cucul_get_canvas_width(cv);
    296     h = cucul_get_canvas_height(cv);
    297 
    298     for(y = 0; y < h; y++)
    299         for(x = 0; x < w; x++)
    300     {
    301         int i;
    302 
    303         if(cucul_getchar(cv, x, y) == (unsigned char)' ')
    304             continue;
    305 
    306         i = y * 10 / h;
    307         cucul_set_color(cv, palette[i].fg, palette[i].bg);
    308         cucul_putstr(cv, x, y, palette[i].ch);
    309     }
    310 }
    311 
    312 static void filter_gay(cucul_canvas_t *cv)
    313 {
    314     static unsigned char const rainbow[] =
    315     {
    316         CUCUL_COLOR_LIGHTMAGENTA,
    317         CUCUL_COLOR_LIGHTRED,
    318         CUCUL_COLOR_YELLOW,
    319         CUCUL_COLOR_LIGHTGREEN,
    320         CUCUL_COLOR_LIGHTCYAN,
    321         CUCUL_COLOR_LIGHTBLUE,
    322     };
    323     unsigned int x, y, w, h;
    324 
    325     w = cucul_get_canvas_width(cv);
    326     h = cucul_get_canvas_height(cv);
    327 
    328     for(y = 0; y < h; y++)
    329         for(x = 0; x < w; x++)
    330     {
    331         unsigned long int ch = cucul_getchar(cv, x, y);
    332         if(ch != (unsigned char)' ')
    333         {
    334             cucul_set_color(cv, rainbow[(x / 2 + y) % 6],
    335                                 CUCUL_COLOR_TRANSPARENT);
    336             cucul_putchar(cv, x, y, ch);
    337         }
    338     }
    339 }
    340 
Note: See TracChangeset for help on using the changeset viewer.