Ignore:
Timestamp:
Mar 5, 2006, 7:43:13 PM (15 years ago)
Author:
Sam Hocevar
Message:

A new low-level text management library (canvas for ultrafast compositing

of unicode letters) is now separated from the higher level rendering and I/O
(that is, libcaca). This commit totally breaks the API, but once everything
is polished I will think about source-level backward compatibility. Most
drivers are broken, but X11 still sorta works.

The new design is much more object-oriented and allows having several

active renderers at the same time, changing renderers on the fly, and more
important, having no renderer at all (useful for converters, or when you
want to do your own renderer).

And in case you are still wondering, the libcucul acronym has "Unicode"

because I want to support at least a subset of Unicode. There are awesome
glyphs in it, including the ones inherited from Codepage 437 such as
"gray 25%" that are used in DOS and Win32 ANSI art.

Location:
libcaca/trunk/examples
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/examples

    • Property svn:ignore
      •  

        old new  
        33.libs
        44.deps
        5 cacademo
        6 cacademo.exe
        75caca-spritedit
        86caca-spritedit.exe
  • libcaca/trunk/examples/cacaview.c

    r522 r524  
    2828#endif
    2929
     30#include "cucul.h"
    3031#include "caca.h"
    3132
     
    4142#define ZOOM_MAX 50
    4243#define PAD_STEP 0.15
     44
     45/* libcucul/libcaca contexts */
     46cucul_t *qq; caca_t *kk;
    4347
    4448/* Local functions */
     
    6064#endif
    6165char *pixels = NULL;
    62 struct caca_bitmap *bitmap = NULL;
     66struct cucul_bitmap *bitmap = NULL;
    6367unsigned int w, h, depth, bpp, rmask, gmask, bmask, amask;
    6468#if !defined(HAVE_IMLIB2_H)
     
    7983    int i;
    8084
    81     /* Initialise libcaca */
    82     if(caca_init())
     85    /* Initialise libcucul */
     86    qq = cucul_init();
     87    if(!qq)
     88    {
     89        fprintf(stderr, "%s: unable to initialise libcucul\n", argv[0]);
     90        return 1;
     91    }
     92
     93    kk = caca_attach(qq);
     94    if(!kk)
    8395    {
    8496        fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]);
     
    8799
    88100    /* Set the window title */
    89     caca_set_window_title("cacaview");
    90 
    91     ww = caca_get_width();
    92     wh = caca_get_height();
     101    caca_set_window_title(kk, "cacaview");
     102
     103    ww = cucul_get_width(qq);
     104    wh = cucul_get_height(qq);
    93105
    94106    /* Fill the zoom table */
     
    128140
    129141        if(update)
    130             event = caca_get_event(event_mask);
     142            event = caca_get_event(kk, event_mask);
    131143        else
    132             event = caca_wait_event(event_mask);
     144            event = caca_wait_event(kk, event_mask);
    133145
    134146        while(event)
     
    166178                break;
    167179            case 'b':
    168                 i = 1 + caca_get_feature(CACA_BACKGROUND);
    169                 if(i > CACA_BACKGROUND_MAX) i = CACA_BACKGROUND_MIN;
    170                 caca_set_feature(i);
     180                i = 1 + cucul_get_feature(qq, CUCUL_BACKGROUND);
     181                if(i > CUCUL_BACKGROUND_MAX) i = CUCUL_BACKGROUND_MIN;
     182                cucul_set_feature(qq, i);
    171183                new_status = STATUS_BACKGROUND;
    172184                update = 1;
    173185                break;
    174186            case 'B':
    175                 i = -1 + caca_get_feature(CACA_BACKGROUND);
    176                 if(i < CACA_BACKGROUND_MIN) i = CACA_BACKGROUND_MAX;
    177                 caca_set_feature(i);
     187                i = -1 + cucul_get_feature(qq, CUCUL_BACKGROUND);
     188                if(i < CUCUL_BACKGROUND_MIN) i = CUCUL_BACKGROUND_MAX;
     189                cucul_set_feature(qq, i);
    178190                new_status = STATUS_BACKGROUND;
    179191                update = 1;
    180192                break;
    181193            case 'a':
    182                 i = 1 + caca_get_feature(CACA_ANTIALIASING);
    183                 if(i > CACA_ANTIALIASING_MAX) i = CACA_ANTIALIASING_MIN;
    184                 caca_set_feature(i);
     194                i = 1 + cucul_get_feature(qq, CUCUL_ANTIALIASING);
     195                if(i > CUCUL_ANTIALIASING_MAX) i = CUCUL_ANTIALIASING_MIN;
     196                cucul_set_feature(qq, i);
    185197                new_status = STATUS_ANTIALIASING;
    186198                update = 1;
    187199                break;
    188200            case 'A':
    189                 i = -1 + caca_get_feature(CACA_ANTIALIASING);
    190                 if(i < CACA_ANTIALIASING_MIN) i = CACA_ANTIALIASING_MAX;
    191                 caca_set_feature(i);
     201                i = -1 + cucul_get_feature(qq, CUCUL_ANTIALIASING);
     202                if(i < CUCUL_ANTIALIASING_MIN) i = CUCUL_ANTIALIASING_MAX;
     203                cucul_set_feature(qq, i);
    192204                new_status = STATUS_ANTIALIASING;
    193205                update = 1;
    194206                break;
    195207            case 'd':
    196                 i = 1 + caca_get_feature(CACA_DITHERING);
    197                 if(i > CACA_DITHERING_MAX) i = CACA_DITHERING_MIN;
    198                 caca_set_feature(i);
     208                i = 1 + cucul_get_feature(qq, CUCUL_DITHERING);
     209                if(i > CUCUL_DITHERING_MAX) i = CUCUL_DITHERING_MIN;
     210                cucul_set_feature(qq, i);
    199211                new_status = STATUS_DITHERING;
    200212                update = 1;
    201213                break;
    202214            case 'D':
    203                 i = -1 + caca_get_feature(CACA_DITHERING);
    204                 if(i < CACA_DITHERING_MIN) i = CACA_DITHERING_MAX;
    205                 caca_set_feature(i);
     215                i = -1 + cucul_get_feature(qq, CUCUL_DITHERING);
     216                if(i < CUCUL_DITHERING_MIN) i = CUCUL_DITHERING_MAX;
     217                cucul_set_feature(qq, i);
    206218                new_status = STATUS_DITHERING;
    207219                update = 1;
     
    259271            else if(event == CACA_EVENT_RESIZE)
    260272            {
    261                 caca_refresh();
    262                 ww = caca_get_width();
    263                 wh = caca_get_height();
     273                caca_refresh(kk);
     274                ww = cucul_get_width(qq);
     275                wh = cucul_get_height(qq);
    264276                update = 1;
    265277                set_zoom(zoom);
     
    272284                help = new_help;
    273285
    274             event = caca_get_event(CACA_EVENT_KEY_PRESS);
     286            event = caca_get_event(kk, CACA_EVENT_KEY_PRESS);
    275287        }
    276288
     
    287299            sprintf(buffer, " Loading `%s'... ", list[current]);
    288300            buffer[ww] = '\0';
    289             caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLUE);
    290             caca_putstr((ww - strlen(buffer)) / 2, wh / 2, buffer);
    291             caca_refresh();
    292             ww = caca_get_width();
    293             wh = caca_get_height();
     301            cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
     302            cucul_putstr(qq, (ww - strlen(buffer)) / 2, wh / 2, buffer);
     303            caca_refresh(kk);
     304            ww = cucul_get_width(qq);
     305            wh = cucul_get_height(qq);
    294306
    295307            unload_image();
     
    305317        }
    306318
    307         caca_clear();
     319        cucul_clear(qq);
    308320
    309321        if(!items)
    310322        {
    311             caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLUE);
    312             caca_printf(ww / 2 - 5, wh / 2, " No image. ");
     323            cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
     324            cucul_printf(qq, ww / 2 - 5, wh / 2, " No image. ");
    313325        }
    314326        else if(!pixels)
     
    329341            sprintf(buffer, ERROR_STRING, list[current]);
    330342            buffer[ww] = '\0';
    331             caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLUE);
    332             caca_putstr((ww - strlen(buffer)) / 2, wh / 2, buffer);
     343            cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
     344            cucul_putstr(qq, (ww - strlen(buffer)) / 2, wh / 2, buffer);
    333345            free(buffer);
    334346        }
     
    349361                          y + height * (1.0 + yfactor) / 2);
    350362
    351             caca_draw_bitmap(ww * (1.0 - xfactor) * xdelta,
    352                              y + height * (1.0 - yfactor) * ydelta,
    353                              ww * (xdelta + (1.0 - xdelta) * xfactor),
    354                              y + height * (ydelta + (1.0 - ydelta) * yfactor),
    355                              bitmap, pixels);
     363            cucul_draw_bitmap(qq, ww * (1.0 - xfactor) * xdelta,
     364                              y + height * (1.0 - yfactor) * ydelta,
     365                              ww * (xdelta + (1.0 - xdelta) * xfactor),
     366                              y + height * (ydelta + (1.0 - ydelta) * yfactor),
     367                              bitmap, pixels);
    356368        }
    357369
     
    360372            print_status();
    361373
    362             caca_set_color(CACA_COLOR_LIGHTGRAY, CACA_COLOR_BLACK);
     374            cucul_set_color(qq, CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_BLACK);
    363375            switch(status)
    364376            {
    365377                case STATUS_ANTIALIASING:
    366                     caca_printf(0, wh - 1, "Antialiasing: %s",
    367                   caca_get_feature_name(caca_get_feature(CACA_ANTIALIASING)));
     378                    cucul_printf(qq, 0, wh - 1, "Antialiasing: %s",
     379                  cucul_get_feature_name(cucul_get_feature(qq, CUCUL_ANTIALIASING)));
    368380                    break;
    369381                case STATUS_DITHERING:
    370                     caca_printf(0, wh - 1, "Dithering: %s",
    371                   caca_get_feature_name(caca_get_feature(CACA_DITHERING)));
     382                    cucul_printf(qq, 0, wh - 1, "Dithering: %s",
     383                  cucul_get_feature_name(cucul_get_feature(qq, CUCUL_DITHERING)));
    372384                    break;
    373385                case STATUS_BACKGROUND:
    374                     caca_printf(0, wh - 1, "Background: %s",
    375                   caca_get_feature_name(caca_get_feature(CACA_BACKGROUND)));
     386                    cucul_printf(qq, 0, wh - 1, "Background: %s",
     387                  cucul_get_feature_name(cucul_get_feature(qq, CUCUL_BACKGROUND)));
    376388                    break;
    377389            }
     
    383395        }
    384396
    385         caca_refresh();
     397        caca_refresh(kk);
    386398        update = 0;
    387399    }
     
    389401    /* Clean up */
    390402    unload_image();
    391     caca_end();
     403    caca_detach(kk);
     404    cucul_end(qq);
    392405
    393406    return 0;
     
    396409static void print_status(void)
    397410{
    398     caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLUE);
    399     caca_draw_line(0, 0, ww - 1, 0, ' ');
    400     caca_draw_line(0, wh - 2, ww - 1, wh - 2, '-');
    401     caca_putstr(0, 0, "q:Quit  np:Next/Prev  +-x:Zoom  "
    402                       "hjkl:Move  d:Dithering  a:Antialias");
    403     caca_putstr(ww - strlen("?:Help"), 0, "?:Help");
    404     caca_printf(3, wh - 2, "cacaview %s", VERSION);
    405     caca_printf(ww - 14, wh - 2, "(zoom: %s%i)", zoom > 0 ? "+" : "", zoom);
    406 
    407     caca_set_color(CACA_COLOR_LIGHTGRAY, CACA_COLOR_BLACK);
    408     caca_draw_line(0, wh - 1, ww - 1, wh - 1, ' ');
     411    cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
     412    cucul_draw_line(qq, 0, 0, ww - 1, 0, ' ');
     413    cucul_draw_line(qq, 0, wh - 2, ww - 1, wh - 2, '-');
     414    cucul_putstr(qq, 0, 0, "q:Quit  np:Next/Prev  +-x:Zoom  "
     415                           "hjkl:Move  d:Dithering  a:Antialias");
     416    cucul_putstr(qq, ww - strlen("?:Help"), 0, "?:Help");
     417    cucul_printf(qq, 3, wh - 2, "cacaview %s", VERSION);
     418    cucul_printf(qq, ww - 14, wh - 2, "(zoom: %s%i)", zoom > 0 ? "+" : "", zoom);
     419
     420    cucul_set_color(qq, CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_BLACK);
     421    cucul_draw_line(qq, 0, wh - 1, ww - 1, wh - 1, ' ');
    409422}
    410423
     
    431444    int i;
    432445
    433     caca_set_color(CACA_COLOR_WHITE, CACA_COLOR_BLUE);
     446    cucul_set_color(qq, CUCUL_COLOR_WHITE, CUCUL_COLOR_BLUE);
    434447
    435448    for(i = 0; help[i]; i++)
    436         caca_putstr(x, y + i, help[i]);
     449        cucul_putstr(qq, x, y + i, help[i]);
    437450}
    438451
     
    446459    if(zoom < -ZOOM_MAX) zoom = -ZOOM_MAX;
    447460
    448     ww = caca_get_width();
     461    ww = cucul_get_width(qq);
    449462    height = fullscreen ? wh : wh - 3;
    450463
    451464    xfactor = (zoom < 0) ? 1.0 / zoomtab[-zoom] : zoomtab[zoom];
    452465    yfactor = xfactor * ww / height * h / w
    453                * caca_get_height() / caca_get_width()
    454                * caca_get_window_width() / caca_get_window_height();
     466               * cucul_get_height(qq) / cucul_get_width(qq)
     467               * caca_get_window_width(kk) / caca_get_window_height(kk);
    455468
    456469    if(yfactor > xfactor)
     
    475488#endif
    476489    if(bitmap)
    477         caca_free_bitmap(bitmap);
     490        cucul_free_bitmap(qq, bitmap);
    478491    bitmap = NULL;
    479492}
     
    499512    depth = 4;
    500513
    501     /* Create the libcaca bitmap */
    502     bitmap = caca_create_bitmap(bpp, w, h, depth * w,
    503                                 rmask, gmask, bmask, amask);
     514    /* Create the libcucul bitmap */
     515    bitmap = cucul_create_bitmap(qq, bpp, w, h, depth * w,
     516                                 rmask, gmask, bmask, amask);
    504517    if(!bitmap)
    505518    {
     
    686699    int xn, yn;
    687700
    688     if(x2 + 1 > (int)caca_get_width()) x2 = caca_get_width() - 1;
    689     if(y2 + 1 > (int)caca_get_height()) y2 = caca_get_height() - 1;
     701    if(x2 + 1 > (int)cucul_get_width(qq)) x2 = cucul_get_width(qq) - 1;
     702    if(y2 + 1 > (int)cucul_get_height(qq)) y2 = cucul_get_height(qq) - 1;
    690703
    691704    for(yn = y1 > 0 ? y1 : 0; yn <= y2; yn++)
     
    693706    {
    694707        if((((xn - x1) / 5) ^ ((yn - y1) / 3)) & 1)
    695             caca_set_color(CACA_COLOR_LIGHTGRAY, CACA_COLOR_DARKGRAY);
     708            cucul_set_color(qq, CUCUL_COLOR_LIGHTGRAY, CUCUL_COLOR_DARKGRAY);
    696709        else
    697             caca_set_color(CACA_COLOR_DARKGRAY, CACA_COLOR_LIGHTGRAY);
    698         caca_putchar(xn, yn, ' ');
     710            cucul_set_color(qq, CUCUL_COLOR_DARKGRAY, CUCUL_COLOR_LIGHTGRAY);
     711        cucul_putchar(qq, xn, yn, ' ');
    699712    }
    700713}
Note: See TracChangeset for help on using the changeset viewer.