Changeset 263


Ignore:
Timestamp:
Dec 20, 2003, 1:07:56 PM (17 years ago)
Author:
Sam Hocevar
Message:
  • src/graphics.c: + Support for CACA_WIDTH, CACA_HEIGHT and CACA_FONT in the x11 driver. + Use an intermediary X pixmap for rendering. + Slightly changed the variable naming scheme.
Location:
libcaca/trunk/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/src/caca_internals.h

    r251 r263  
    4545#if defined(USE_X11)
    4646#include <X11/Xlib.h>
    47 extern Display *_caca_dpy;
    48 extern Window _caca_window;
     47extern Display *x11_dpy;
     48extern Window x11_window;
    4949#endif
    5050
  • libcaca/trunk/src/graphics.c

    r261 r263  
    6363 * Global variables
    6464 */
    65 unsigned int _caca_width;
    66 unsigned int _caca_height;
     65unsigned int _caca_width = 0;
     66unsigned int _caca_height = 0;
    6767
    6868/*
     
    7070 */
    7171#if defined(USE_NCURSES)
    72 static int _caca_attr[16*16];
     72static int ncurses_attr[16*16];
    7373#endif
    7474
    7575#if defined(USE_CONIO)
    76 static struct text_info ti;
    77 static char *_caca_screen;
     76static struct text_info conio_ti;
     77static char *conio_screen;
    7878#endif
    7979
    8080#if defined(USE_X11)
    81 Display *_caca_dpy;
    82 Window _caca_window;
    83 GC _caca_gc;
    84 XImage _caca_image;
    85 static int *_caca_screen;
    86 int _caca_colors[16];
     81Display *x11_dpy;
     82Window x11_window;
     83static GC x11_gc;
     84static Pixmap x11_pixmap;
     85static int *x11_screen;
     86static int x11_colors[16];
     87static Font x11_font;
     88static XFontStruct *x11_font_struct;
     89static int x11_font_width, x11_font_height, x11_font_offset;
    8790#endif
    8891
     
    113116    SLsmg_set_color((bgcolor + 16 * fgcolor) /*% 128*/);
    114117#elif defined(USE_NCURSES)
    115     attrset(_caca_attr[fgcolor + 16 * bgcolor]);
     118    attrset(ncurses_attr[fgcolor + 16 * bgcolor]);
    116119#elif defined(USE_CONIO)
    117120    textbackground(bgcolor);
     
    166169    addch(c);
    167170#elif defined(USE_CONIO)
    168     data = _caca_screen + 2 * (x + y * _caca_width);
     171    data = conio_screen + 2 * (x + y * _caca_width);
    169172    data[0] = c;
    170173    data[1] = (_caca_bgcolor << 4) | _caca_fgcolor;
     
    172175//    putch(c);
    173176#elif defined(USE_X11)
    174     _caca_screen[x + y * _caca_width] =
     177    x11_screen[x + y * _caca_width] =
    175178        ((int)c << 8) | ((int)_caca_bgcolor << 4) | (int)_caca_fgcolor;
    176179#endif
     
    222225    addstr(s);
    223226#elif defined(USE_CONIO)
    224     buf = _caca_screen + 2 * (x + y * _caca_width);
     227    buf = conio_screen + 2 * (x + y * _caca_width);
    225228    while(*s)
    226229    {
     
    231234//    cputs(s);
    232235#elif defined(USE_X11)
    233     buf = _caca_screen + x + y * _caca_width;
     236    buf = x11_screen + x + y * _caca_width;
    234237    while(*s)
    235238        *buf++ = ((int)*s++ << 8) | ((int)_caca_bgcolor << 4) | (int)_caca_fgcolor;
     
    378381            int col = ((max + 7 - fg) % max) + max * bg;
    379382            init_pair(col, curses_colors[fg], curses_colors[bg]);
    380             _caca_attr[fg + 16 * bg] = COLOR_PAIR(col);
     383            ncurses_attr[fg + 16 * bg] = COLOR_PAIR(col);
    381384
    382385            if(max == 8)
    383386            {
    384387                /* Bright fg on simple bg */
    385                 _caca_attr[fg + 8 + 16 * bg] = A_BOLD | COLOR_PAIR(col);
     388                ncurses_attr[fg + 8 + 16 * bg] = A_BOLD | COLOR_PAIR(col);
    386389                /* Simple fg on bright bg */
    387                 _caca_attr[fg + 16 * (bg + 8)] = A_BLINK | COLOR_PAIR(col);
     390                ncurses_attr[fg + 16 * (bg + 8)] = A_BLINK | COLOR_PAIR(col);
    388391                /* Bright fg on bright bg */
    389                 _caca_attr[fg + 8 + 16 * (bg + 8)] = A_BLINK | A_BOLD
    390                                                              | COLOR_PAIR(col);
     392                ncurses_attr[fg + 8 + 16 * (bg + 8)] = A_BLINK | A_BOLD
     393                                                        | COLOR_PAIR(col);
    391394            }
    392395        }
     
    396399
    397400#elif defined(USE_CONIO)
    398     gettextinfo(&ti);
    399     _caca_screen = malloc(2 * ti.screenwidth * ti.screenheight * sizeof(char));
    400     if(_caca_screen == NULL)
     401    gettextinfo(&conio_ti);
     402    conio_screen = malloc(2 * conio_ti.screenwidth
     403                             * conio_ti.screenheight * sizeof(char));
     404    if(conio_screen == NULL)
    401405        return -1;
    402406#   if defined(SCREENUPDATE_IN_PC_H)
    403     ScreenRetrieve(_caca_screen);
     407    ScreenRetrieve(conio_screen);
    404408#   else
    405409    /* FIXME */
    406410#   endif
    407     _caca_width = ti.screenwidth;
    408     _caca_height = ti.screenheight;
    409 
    410 #elif defined(USE_X11)
    411     static int x11_colors[] =
     411    _caca_width = conio_ti.screenwidth;
     412    _caca_height = conio_ti.screenheight;
     413
     414#elif defined(USE_X11)
     415    static int x11_palette[] =
    412416    {
    413417        /* Standard curses colours */
     
    431435    };
    432436
     437    Colormap colormap;
     438    const char *font_name = "8x13bold";
    433439    int i;
    434     Colormap colormap;
    435 
    436     /* FIXME */
    437     _caca_width = 80;
    438     _caca_height = 30;
    439 
    440     _caca_screen = malloc(_caca_width * _caca_height * sizeof(int));
    441     if(_caca_screen == NULL)
     440
     441    if(getenv("CACA_WIDTH"))
     442        _caca_width = atoi(getenv("CACA_WIDTH"));
     443    if(!_caca_width)
     444        _caca_width = 80;
     445
     446    if(getenv("CACA_HEIGHT"))
     447        _caca_height = atoi(getenv("CACA_HEIGHT"));
     448    if(!_caca_height)
     449        _caca_height = 25;
     450
     451    x11_screen = malloc(_caca_width * _caca_height * sizeof(int));
     452    if(x11_screen == NULL)
    442453        return -1;
    443454
    444     _caca_dpy = XOpenDisplay(NULL);
    445     if(_caca_dpy == NULL)
    446     {
    447         free(_caca_screen);
     455    x11_dpy = XOpenDisplay(NULL);
     456    if(x11_dpy == NULL)
     457    {
     458        free(x11_screen);
    448459        return -1;
    449460    }
    450461
    451     colormap = DefaultColormap(_caca_dpy, DefaultScreen(_caca_dpy));
     462    if(getenv("CACA_FONT"))
     463        font_name = getenv("CACA_FONT");
     464
     465    x11_font = XLoadFont(x11_dpy, font_name);
     466    if(!x11_font)
     467    {
     468        XCloseDisplay(x11_dpy);
     469        free(x11_screen);
     470        return -1;
     471    }
     472
     473    x11_font_struct = XQueryFont(x11_dpy, x11_font);
     474    if(!x11_font_struct)
     475    {
     476        XUnloadFont(x11_dpy, x11_font);
     477        XCloseDisplay(x11_dpy);
     478        free(x11_screen);
     479        return -1;
     480    }
     481
     482    x11_font_width = x11_font_struct->max_bounds.width;
     483    x11_font_height = x11_font_struct->max_bounds.ascent
     484                         + x11_font_struct->max_bounds.descent;
     485    x11_font_offset = x11_font_struct->max_bounds.descent;
     486
     487    colormap = DefaultColormap(x11_dpy, DefaultScreen(x11_dpy));
    452488    for(i = 0; i < 16; i++)
    453489    {
    454490        XColor color;
    455         color.red = x11_colors[i * 3];
    456         color.green = x11_colors[i * 3 + 1];
    457         color.blue = x11_colors[i * 3 + 2];
    458         XAllocColor(_caca_dpy, colormap, &color);
    459         _caca_colors[i] = color.pixel;
    460     }
    461 
    462     _caca_window = XCreateSimpleWindow(_caca_dpy, DefaultRootWindow(_caca_dpy),
    463                                        0, 0, 400, 300, 0,
    464                                        _caca_colors[0], _caca_colors[0]);
    465     XSelectInput(_caca_dpy, _caca_window, StructureNotifyMask);
    466     XMapWindow(_caca_dpy, _caca_window);
    467 
    468     _caca_gc = XCreateGC(_caca_dpy, _caca_window, 0, NULL);
    469     XSetForeground(_caca_dpy, _caca_gc, _caca_colors[15]);
     491        color.red = x11_palette[i * 3];
     492        color.green = x11_palette[i * 3 + 1];
     493        color.blue = x11_palette[i * 3 + 2];
     494        XAllocColor(x11_dpy, colormap, &color);
     495        x11_colors[i] = color.pixel;
     496    }
     497
     498    x11_window = XCreateSimpleWindow(x11_dpy, DefaultRootWindow(x11_dpy),
     499                                       0, 0, _caca_width * x11_font_width,
     500                                       _caca_height * x11_font_height, 0,
     501                                       x11_colors[0], x11_colors[0]);
     502    XSelectInput(x11_dpy, x11_window, StructureNotifyMask);
     503    XMapWindow(x11_dpy, x11_window);
     504
     505    x11_gc = XCreateGC(x11_dpy, x11_window, 0, NULL);
     506    XSetForeground(x11_dpy, x11_gc, x11_colors[15]);
     507    XSetFont(x11_dpy, x11_gc, x11_font);
    470508
    471509    for(;;)
    472510    {
    473511        XEvent event;
    474         XNextEvent(_caca_dpy, &event);
     512        XNextEvent(x11_dpy, &event);
    475513        if (event.type == MapNotify)
    476514            break;
    477515    }
    478516
    479     XSelectInput(_caca_dpy, _caca_window, KeyPressMask);
    480 
    481     XSync(_caca_dpy, False);
    482 
    483     //_caca_image =
     517    XSelectInput(x11_dpy, x11_window, KeyPressMask);
     518
     519    XSync(x11_dpy, False);
     520
     521    x11_pixmap = XCreatePixmap(x11_dpy, x11_window,
     522                               _caca_width * x11_font_width,
     523                               _caca_height * x11_font_height,
     524                               DefaultDepth(x11_dpy, DefaultScreen(x11_dpy)));
    484525#endif
    485526    _caca_empty_line = malloc(_caca_width + 1);
     
    502543    /* Nothing to do */
    503544#elif defined(USE_CONIO)
    504     free(_caca_screen);
    505 #elif defined(USE_X11)
    506     XSync(_caca_dpy, False);
    507     XFreeGC(_caca_dpy, _caca_gc);
    508     XUnmapWindow(_caca_dpy, _caca_window);
    509     XDestroyWindow(_caca_dpy, _caca_window);
    510     XCloseDisplay(_caca_dpy);
    511     free(_caca_screen);
     545    free(conio_screen);
     546#elif defined(USE_X11)
     547    XSync(x11_dpy, False);
     548    XFreePixmap(x11_dpy, x11_pixmap);
     549    XFreeFont(x11_dpy, x11_font_struct);
     550    XFreeGC(x11_dpy, x11_gc);
     551    XUnmapWindow(x11_dpy, x11_window);
     552    XDestroyWindow(x11_dpy, x11_window);
     553    XCloseDisplay(x11_dpy);
     554    free(x11_screen);
    512555#endif
    513556    free(_caca_empty_line);
     
    574617#elif defined(USE_CONIO)
    575618#   if defined(SCREENUPDATE_IN_PC_H)
    576     ScreenUpdate(_caca_screen);
     619    ScreenUpdate(conio_screen);
    577620#   else
    578621    /* FIXME */
    579622#   endif
    580623#elif defined(USE_X11)
    581     int x, y;
     624    unsigned int x, y;
    582625
    583626    for(y = 0; y < _caca_height; y++)
    584627        for(x = 0; x < _caca_width; x++)
    585628        {
    586             int item = _caca_screen[x + y * _caca_width];
     629            int item = x11_screen[x + y * _caca_width];
    587630            char data = item >> 8;
    588             XSetForeground(_caca_dpy, _caca_gc, _caca_colors[(item >> 4) & 0xf]);
    589             XFillRectangle(_caca_dpy, _caca_window, _caca_gc,
    590                            x * 6, y * 12, 6, 12);
    591             XSetForeground(_caca_dpy, _caca_gc, _caca_colors[item & 0xf]);
    592             XDrawString(_caca_dpy, _caca_window, _caca_gc,
    593                         x * 6, y * 12 + 10, &data, 1);
     631            XSetForeground(x11_dpy, x11_gc, x11_colors[(item >> 4) & 0xf]);
     632            XFillRectangle(x11_dpy, x11_pixmap, x11_gc,
     633                           x * x11_font_width, y * x11_font_height,
     634                           x11_font_width, x11_font_height);
     635            XSetForeground(x11_dpy, x11_gc, x11_colors[item & 0xf]);
     636            XDrawString(x11_dpy, x11_pixmap, x11_gc, x * x11_font_width,
     637                        (y + 1) * x11_font_height - x11_font_offset, &data, 1);
    594638        }
    595     XFlush(_caca_dpy);
     639    XCopyArea(x11_dpy, x11_pixmap, x11_window, x11_gc, 0, 0,
     640              _caca_width * x11_font_width, _caca_height * x11_font_height,
     641              0, 0);
     642    XFlush(x11_dpy);
    596643#endif
    597644
  • libcaca/trunk/src/io.c

    r257 r263  
    217217    char key;
    218218
    219     while(XCheckWindowEvent(_caca_dpy, _caca_window, KeyPressMask, &event)
     219    while(XCheckWindowEvent(x11_dpy, x11_window, KeyPressMask, &event)
    220220           == True)
    221221    {
Note: See TracChangeset for help on using the changeset viewer.