Changeset 1243 for toilet


Ignore:
Timestamp:
Oct 26, 2006, 3:30:14 PM (13 years ago)
Author:
Sam Hocevar
Message:
  • Make filters line-feed aware.
Location:
toilet/trunk/src
Files:
4 edited

Legend:

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

    r1241 r1243  
    2929#include "filter.h"
    3030
    31 static void filter_crop(cucul_canvas_t *);
    32 static void filter_gay(cucul_canvas_t *);
    33 static void filter_metal(cucul_canvas_t *);
    34 static void filter_flip(cucul_canvas_t *);
    35 static void filter_flop(cucul_canvas_t *);
    36 static void filter_rotate(cucul_canvas_t *);
     31static void filter_crop(context_t *);
     32static void filter_gay(context_t *);
     33static void filter_metal(context_t *);
     34static void filter_flip(context_t *);
     35static void filter_flop(context_t *);
     36static void filter_rotate(context_t *);
    3737
    3838struct
    3939{
    4040    char const *name;
    41     void (*function)(cucul_canvas_t *);
     41    void (*function)(context_t *);
    4242}
    4343const lookup[] =
     
    9393
    9494    for(i = 0; i < cx->nfilters; i++)
    95         cx->filters[i](cx->torender);
     95        cx->filters[i](cx);
    9696
    9797    return 0;
     
    105105}
    106106
    107 static void filter_crop(cucul_canvas_t *cv)
     107static void filter_crop(context_t *cx)
    108108{
    109109    unsigned int x, y, w, h;
    110110    unsigned int xmin, xmax, ymin, ymax;
    111111
    112     xmin = w = cucul_get_canvas_width(cv);
     112    xmin = w = cucul_get_canvas_width(cx->torender);
    113113    xmax = 0;
    114     ymin = h = cucul_get_canvas_height(cv);
     114    ymin = h = cucul_get_canvas_height(cx->torender);
    115115    ymax = 0;
    116116
     
    118118        for(x = 0; x < w; x++)
    119119    {
    120         unsigned long int ch = cucul_getchar(cv, x, y);
     120        unsigned long int ch = cucul_getchar(cx->torender, x, y);
    121121        if(ch != (unsigned char)' ')
    122122        {
     
    135135        return;
    136136
    137     cucul_set_canvas_boundaries(cv, xmin, ymin,
     137    cucul_set_canvas_boundaries(cx->torender, xmin, ymin,
    138138                                xmax - xmin + 1, ymax - ymin + 1);
    139139}
    140140
    141 static void filter_metal(cucul_canvas_t *cv)
     141static void filter_metal(context_t *cx)
    142142{
    143143    static unsigned char const palette[] =
     
    151151    unsigned int x, y, w, h;
    152152
    153     w = cucul_get_canvas_width(cv);
    154     h = cucul_get_canvas_height(cv);
     153    w = cucul_get_canvas_width(cx->torender);
     154    h = cucul_get_canvas_height(cx->torender);
    155155
    156156    for(y = 0; y < h; y++)
    157157        for(x = 0; x < w; x++)
    158158    {
    159         unsigned long int ch = cucul_getchar(cv, x, y);
     159        unsigned long int ch = cucul_getchar(cx->torender, x, y);
    160160        int i;
    161161
     
    163163            continue;
    164164
    165         i = y * 4 / h;
    166         cucul_set_color(cv, palette[i], CUCUL_COLOR_TRANSPARENT);
    167         cucul_putchar(cv, x, y, ch);
    168     }
    169 }
    170 
    171 static void filter_gay(cucul_canvas_t *cv)
     165        i = ((cx->lines + y + x / 8) / 2) % 4;
     166        cucul_set_color(cx->torender, palette[i], CUCUL_COLOR_TRANSPARENT);
     167        cucul_putchar(cx->torender, x, y, ch);
     168    }
     169}
     170
     171static void filter_gay(context_t *cx)
    172172{
    173173    static unsigned char const rainbow[] =
     
    182182    unsigned int x, y, w, h;
    183183
    184     w = cucul_get_canvas_width(cv);
    185     h = cucul_get_canvas_height(cv);
     184    w = cucul_get_canvas_width(cx->torender);
     185    h = cucul_get_canvas_height(cx->torender);
    186186
    187187    for(y = 0; y < h; y++)
    188188        for(x = 0; x < w; x++)
    189189    {
    190         unsigned long int ch = cucul_getchar(cv, x, y);
     190        unsigned long int ch = cucul_getchar(cx->torender, x, y);
    191191        if(ch != (unsigned char)' ')
    192192        {
    193             cucul_set_color(cv, rainbow[(x / 2 + y) % 6],
     193            cucul_set_color(cx->torender, rainbow[(x / 2 + y + cx->lines) % 6],
    194194                                CUCUL_COLOR_TRANSPARENT);
    195             cucul_putchar(cv, x, y, ch);
     195            cucul_putchar(cx->torender, x, y, ch);
    196196        }
    197197    }
    198198}
    199199
    200 static void filter_flip(cucul_canvas_t *cv)
    201 {
    202     cucul_flip(cv);
    203 }
    204 
    205 static void filter_flop(cucul_canvas_t *cv)
    206 {
    207     cucul_flop(cv);
    208 }
    209 
    210 static void filter_rotate(cucul_canvas_t *cv)
    211 {
    212     cucul_rotate(cv);
    213 }
    214 
     200static void filter_flip(context_t *cx)
     201{
     202    cucul_flip(cx->torender);
     203}
     204
     205static void filter_flop(context_t *cx)
     206{
     207    cucul_flop(cx->torender);
     208}
     209
     210static void filter_rotate(context_t *cx)
     211{
     212    cucul_rotate(cx->torender);
     213}
     214
  • toilet/trunk/src/render.c

    r1242 r1243  
    2929#include "render.h"
    3030#include "filter.h"
     31
     32static int render_flush(context_t *);
    3133
    3234int render_init(context_t *cx)
     
    6769
    6870        if(ch == '\n')
    69             render_line(cx);
     71            render_flush(cx);
    7072    }
    7173
     
    9294    }
    9395
    94     render_line(cx);
    95 
    96     return 0;
    97 }
    98 
    99 int render_line(context_t *cx)
    100 {
    101     cucul_buffer_t *buffer;
    102 
    103     /* Flush current line */
    104     cx->flush(cx);
    105 
    106     /* Apply optional effects to our string */
    107     filter_do(cx);
    108 
    109     /* Output line */
    110     buffer = cucul_export_canvas(cx->torender, cx->export);
    111     fwrite(cucul_get_buffer_data(buffer),
    112            cucul_get_buffer_size(buffer), 1, stdout);
    113     cucul_free_buffer(buffer);
    114     cucul_free_canvas(cx->torender);
     96    render_flush(cx);
    11597
    11698    return 0;
     
    125107}
    126108
     109/* XXX: Following functions are local */
     110
     111static int render_flush(context_t *cx)
     112{
     113    cucul_buffer_t *buffer;
     114
     115    /* Flush current line */
     116    cx->flush(cx);
     117
     118    /* Apply optional effects to our string */
     119    filter_do(cx);
     120
     121    cx->lines += cucul_get_canvas_height(cx->torender);
     122
     123    /* Output line */
     124    buffer = cucul_export_canvas(cx->torender, cx->export);
     125    fwrite(cucul_get_buffer_data(buffer),
     126           cucul_get_buffer_size(buffer), 1, stdout);
     127    cucul_free_buffer(buffer);
     128    cucul_free_canvas(cx->torender);
     129
     130    return 0;
     131}
     132
  • toilet/trunk/src/render.h

    r1241 r1243  
    2323extern int render_stdin(context_t *);
    2424extern int render_list(context_t *, unsigned int, char *[]);
    25 extern int render_line(context_t *);
    2625extern int render_end(context_t *);
    2726
  • toilet/trunk/src/toilet.h

    r1242 r1243  
    4848
    4949    /* Render filters */
    50     void (**filters)(cucul_canvas_t *);
     50    void (**filters)(struct toilet_context *);
    5151    unsigned int nfilters;
    5252};
Note: See TracChangeset for help on using the changeset viewer.