Changeset 226 for libcaca/trunk/src


Ignore:
Timestamp:
Nov 27, 2003, 10:56:30 PM (17 years ago)
Author:
Sam Hocevar
Message:
  • NOTES: + Added setab/setaf quotes from the XTerm terminfo. + Proposed a workaround for bright colours on any terminal.
  • src/caca.c: + 16 colour support for ncurses and conio.
  • src/graphics.c: + Ported to 16 colour support. + Added a missing <stdio.h> for BUFSIZ. + Disabled vsnprintf under DOS (only vsprintf exists).
  • examples/: + Don't abort if the caca.txt sprite was not found. + Ported to 16 colour support.
Location:
libcaca/trunk/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/src/bitmap.c

    r221 r226  
    3434#else
    3535typedef unsigned char uint8_t;
     36typedef unsigned short uint16_t;
     37typedef unsigned int uint32_t;
    3638#endif
    3739
  • libcaca/trunk/src/caca.c

    r213 r226  
    6262#if defined(USE_NCURSES)
    6363static mmask_t oldmask;
    64 int _caca_attr[16];
     64int _caca_attr[16*16];
    6565#endif
    6666
     
    7373{
    7474#if defined(USE_SLANG)
     75    /* See SLang ref., 5.4.4. */
    7576    static char *slang_colors[16] =
    7677    {
     
    9394    };
    9495
    95     int i;
     96    int fg, bg;
    9697
    9798    /* Initialize slang library */
     
    121122    SLsmg_refresh();
    122123
    123     for(i = 0; i < 16; i++)
    124         SLtt_set_color(i + 1, NULL, slang_colors[i], "black");
    125 
    126 #elif defined(USE_NCURSES)
    127     int i;
     124    for(bg = 0; bg < 16; bg++)
     125        for(fg = 0; fg < 16; fg++)
     126        {
     127            int i = fg + 16 * bg;
     128            SLtt_set_color(i, NULL, slang_colors[fg], slang_colors[bg]);
     129        }
     130
     131#elif defined(USE_NCURSES)
     132    static int curses_colors[] =
     133    {
     134        COLOR_BLACK,
     135        COLOR_BLUE,
     136        COLOR_GREEN,
     137        COLOR_CYAN,
     138        COLOR_RED,
     139        COLOR_MAGENTA,
     140        COLOR_YELLOW,
     141        COLOR_WHITE,
     142        /* Extra values for xterm-16color */
     143        COLOR_BLACK + 8,
     144        COLOR_BLUE + 8,
     145        COLOR_GREEN + 8,
     146        COLOR_CYAN + 8,
     147        COLOR_RED + 8,
     148        COLOR_MAGENTA + 8,
     149        COLOR_YELLOW + 8,
     150        COLOR_WHITE + 8
     151    };
     152
     153    int fg, bg, max;
    128154    mmask_t newmask;
    129155
     
    136162    curs_set(0);
    137163
     164    /* Activate mouse */
    138165    newmask = ALL_MOUSE_EVENTS;
    139166    mousemask(newmask, &oldmask);
    140167
     168    /* Activate colour */
    141169    start_color();
    142170
    143     init_pair(1 + CACA_COLOR_BLACK,        COLOR_BLACK,   COLOR_BLACK);
    144     init_pair(1 + CACA_COLOR_BLUE,         COLOR_BLUE,    COLOR_BLACK);
    145     init_pair(1 + CACA_COLOR_GREEN,        COLOR_GREEN,   COLOR_BLACK);
    146     init_pair(1 + CACA_COLOR_CYAN,         COLOR_CYAN,    COLOR_BLACK);
    147     init_pair(1 + CACA_COLOR_RED,          COLOR_RED,     COLOR_BLACK);
    148     init_pair(1 + CACA_COLOR_MAGENTA,      COLOR_MAGENTA, COLOR_BLACK);
    149     init_pair(1 + CACA_COLOR_BROWN,        COLOR_YELLOW,  COLOR_BLACK);
    150     init_pair(1 + CACA_COLOR_LIGHTGRAY,    COLOR_WHITE,   COLOR_BLACK);
    151     init_pair(1 + CACA_COLOR_DARKGRAY,     COLOR_BLACK,   COLOR_BLACK);
    152     init_pair(1 + CACA_COLOR_LIGHTBLUE,    COLOR_BLUE,    COLOR_BLACK);
    153     init_pair(1 + CACA_COLOR_LIGHTGREEN,   COLOR_GREEN,   COLOR_BLACK);
    154     init_pair(1 + CACA_COLOR_LIGHTCYAN,    COLOR_CYAN,    COLOR_BLACK);
    155     init_pair(1 + CACA_COLOR_LIGHTRED,     COLOR_RED,     COLOR_BLACK);
    156     init_pair(1 + CACA_COLOR_LIGHTMAGENTA, COLOR_MAGENTA, COLOR_BLACK);
    157     init_pair(1 + CACA_COLOR_YELLOW,       COLOR_YELLOW,  COLOR_BLACK);
    158     init_pair(1 + CACA_COLOR_WHITE,        COLOR_WHITE,   COLOR_BLACK);
    159 
    160     for(i = 0; i < 8; i++)
    161     {
    162         _caca_attr[i] = COLOR_PAIR(1 + i);
    163         _caca_attr[i + 8] = A_BOLD | COLOR_PAIR(1 + i);
    164     }
     171    max = COLORS >= 16 ? 16 : 8;
     172
     173    for(bg = 0; bg < max; bg++)
     174        for(fg = 0; fg < max; fg++)
     175        {
     176            /* Use ((max + 7 - fg) % max) instead of fg so that colour 0
     177             * is light gray on black, since some terminals don't like
     178             * this colour pair to be redefined. */
     179            int col = ((max + 7 - fg) % max) + max * bg;
     180            init_pair(col, curses_colors[fg], curses_colors[bg]);
     181            _caca_attr[fg + 16 * bg] = COLOR_PAIR(col);
     182
     183            if(max == 8)
     184            {
     185                /* Bright fg on simple bg */
     186                _caca_attr[fg + 8 + 16 * bg] = A_BOLD | COLOR_PAIR(col);
     187                /* Simple fg on bright bg */
     188                _caca_attr[fg + 16 * (bg + 8)] = A_BLINK | COLOR_PAIR(col);
     189                /* Bright fg on bright bg */
     190                _caca_attr[fg + 8 + 16 * (bg + 8)] = A_BLINK | A_BOLD | COLOR_PAIR(col);
     191            }
     192        }
    165193
    166194#elif defined(USE_CONIO)
  • libcaca/trunk/src/caca.h

    r213 r226  
    151151 * Character graphics
    152152 */
    153 void caca_set_color(enum caca_color);
    154 enum caca_color caca_get_color(void);
     153void caca_set_color(enum caca_color, enum caca_color);
     154enum caca_color caca_get_fg_color(void);
     155enum caca_color caca_get_bg_color(void);
    155156void caca_putchar(int, int, char);
    156157void caca_putstr(int, int, const char *);
     
    203204struct caca_bitmap;
    204205struct caca_bitmap *caca_create_bitmap(int, int, int, int, int, int, int);
     206void caca_set_bitmap_palette(struct caca_bitmap *, int[], int[], int[]);
    205207void caca_draw_bitmap(int, int, int, int, struct caca_bitmap *, char *);
    206208void caca_free_bitmap(struct caca_bitmap *);
  • libcaca/trunk/src/graphics.c

    r205 r226  
    4040#endif
    4141
     42#include <stdio.h> /* BUFSIZ */
    4243#include <string.h>
    4344#include <stdlib.h>
     
    4748#include "caca_internals.h"
    4849
    49 static enum caca_color _caca_color = CACA_COLOR_WHITE;
     50static enum caca_color _caca_fgcolor = CACA_COLOR_LIGHTGRAY;
     51static enum caca_color _caca_bgcolor = CACA_COLOR_BLACK;
    5052
    51 void caca_set_color(enum caca_color color)
     53void caca_set_color(enum caca_color fgcolor, enum caca_color bgcolor)
    5254{
    53     if(color < 0 || color > 15)
     55    if(fgcolor < 0 || fgcolor > 15 || bgcolor < 0 || bgcolor > 15)
    5456        return;
    5557
    56     _caca_color = color;
     58    _caca_fgcolor = fgcolor;
     59    _caca_bgcolor = bgcolor;
    5760#if defined(USE_SLANG)
    58     SLsmg_set_color(color + 1);
     61    SLsmg_set_color(fgcolor + 16 * bgcolor);
    5962#elif defined(USE_NCURSES)
    60     attrset(_caca_attr[color]);
     63    attrset(_caca_attr[fgcolor + 16 * bgcolor]);
    6164#elif defined(USE_CONIO)
    62     textcolor(color);
     65    textbackground(bgcolor);
     66    textcolor(fgcolor);
    6367#endif
    6468}
    6569
    66 enum caca_color caca_get_color(void)
     70enum caca_color caca_get_fg_color(void)
    6771{
    68     return _caca_color;
     72    return _caca_fgcolor;
     73}
     74
     75enum caca_color caca_get_bg_color(void)
     76{
     77    return _caca_bgcolor;
    6978}
    7079
    7180void caca_putchar(int x, int y, char c)
    7281{
     82#if defined(USE_CONIO)
     83    char *data;
     84#endif
    7385    if(x < 0 || x >= (int)caca_get_width() ||
    7486       y < 0 || y >= (int)caca_get_height())
     
    8294    addch(c);
    8395#elif defined(USE_CONIO)
    84     _caca_screen[2 * (x + y * caca_get_width())] = c;
    85     _caca_screen[2 * (x + y * caca_get_width()) + 1] = _caca_color;
     96    data = _caca_screen + 2 * (x + y * caca_get_width());
     97    data[0] = c;
     98    data[1] = (_caca_bgcolor << 4) | _caca_fgcolor;
    8699//    gotoxy(x + 1, y + 1);
    87100//    putch(c);
     
    125138    {
    126139        *buf++ = *s++;
    127         *buf++ = _caca_color;
     140        *buf++ = (_caca_bgcolor << 4) | _caca_fgcolor;
    128141    }
    129142//    gotoxy(x + 1, y + 1);
     
    145158
    146159    va_start(args, format);
     160#if defined(HAVE_VSNPRINTF)
    147161    vsnprintf(buf, caca_get_width() - x + 1, format, args);
     162#else
     163    vsprintf(buf, format, args);
     164#endif
    148165    buf[caca_get_width() - x] = '\0';
    149166    va_end(args);
     
    157174void caca_clear(void)
    158175{
    159     /* We could use SLsmg_cls() etc., but drawing empty lines is much faster */
     176    enum caca_color oldfg = caca_get_fg_color();
     177    enum caca_color oldbg = caca_get_bg_color();
    160178    int y = caca_get_height();
    161179
     180    caca_set_color(CACA_COLOR_LIGHTGRAY, CACA_COLOR_BLACK);
     181
     182    /* We could use SLsmg_cls() etc., but drawing empty lines is much faster */
    162183    while(y--)
    163184        caca_putstr(0, y, _caca_empty_line);
     185
     186    caca_set_color(oldfg, oldbg);
    164187}
    165188
  • libcaca/trunk/src/sprite.c

    r205 r226  
    220220void caca_draw_sprite(int x, int y, struct caca_sprite *sprite, int f)
    221221{
    222     int i, j, oldcol;
     222    int i, j;
     223    enum caca_color oldfg, oldbg;
    223224    struct caca_frame *frame;
    224225
     
    231232    frame = &sprite->frames[f];
    232233
    233     oldcol = caca_get_color();
     234    oldfg = caca_get_fg_color();
     235    oldbg = caca_get_bg_color();
    234236
    235237    for(j = 0; j < frame->h; j++)
     
    240242            if(col >= 0)
    241243            {
    242                 caca_set_color(col);
     244                caca_set_color(col, CACA_COLOR_BLACK);
    243245                caca_putchar(x + i - frame->dx, y + j - frame->dy,
    244246                           frame->chars[frame->w * j + i]);
     
    247249    }
    248250
    249     caca_set_color(oldcol);
     251    caca_set_color(oldfg, oldbg);
    250252}
    251253
Note: See TracChangeset for help on using the changeset viewer.