Changeset 300


Ignore:
Timestamp:
Jan 1, 2004, 6:51:57 PM (16 years ago)
Author:
Sam Hocevar
Message:
  • src/graphics.c: + Minor optimisation in caca_set_color(). + Added an X11 error handler to avoid BadFont? aborts in the X11 driver. + Optimised the X11 caca_refresh() routine by handling strings of the

same colour as one text chunk.

  • src/caca.c: + Bugfix in caca_init when conio is the only compiled-in driver.
  • README: + Minor documentation updates.
Location:
libcaca/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/README

    r270 r300  
    55   o  Run configure then make. Useful configure flags are:
    66
    7      --enable-ncurses: support for the ncurses library (default enabled)
    8      --enable-slang: add support for the SLang library
    9      --enable-conio: add support for MS-DOS conio.h
    10      --enable-x11: add support for native X11 rendering
     7     --enable-ncurses: support for the ncurses library
     8     --enable-slang: support for the SLang library
     9     --enable-conio: support for MS-DOS conio.h
     10     --enable-x11: support for native X11 rendering
     11
     12     --disable-imlib2: remove Imlib2 support in cacaview
    1113
    1214   o  Cross-compilation example:
    1315 
    14      ./configure --disable-ncurses --enable-conio --host=i386-pc-msdosdjgpp
     16     ./configure --disable-imlib2 --host=i386-pc-msdosdjgpp
    1517
    1618
  • libcaca/trunk/src/caca.c

    r291 r300  
    147147#endif
    148148#if defined(USE_X11)
    149     {
    150         /* Nothing to do */
    151     }
    152 #endif
     149    /* Nothing to do */
     150#endif
     151    {
     152        /* Dummy */
     153    }
    153154
    154155    if(_caca_init_graphics())
     
    439440
    440441#if defined(HAVE_GETENV) && defined(HAVE_STRCASECMP)
    441     if((var = getenv("CACA_BACKGROUND")))
     442    if((var = getenv("CACA_BACKGROUND")) && *var)
    442443    {
    443444        if(!strcasecmp("black", var))
     
    447448    }
    448449
    449     if((var = getenv("CACA_ANTIALIASING")))
     450    if((var = getenv("CACA_ANTIALIASING")) && *var)
    450451    {
    451452        if(!strcasecmp("none", var))
     
    455456    }
    456457
    457     if((var = getenv("CACA_DITHERING")))
     458    if((var = getenv("CACA_DITHERING")) && *var)
    458459    {
    459460        if(!strcasecmp("none", var))
  • libcaca/trunk/src/graphics.c

    r298 r300  
    144144static GC x11_gc;
    145145static Pixmap x11_pixmap;
    146 static int *x11_screen;
     146static uint8_t *x11_char, *x11_attr;
    147147static int x11_colors[16];
    148148static Font x11_font;
     
    168168#if defined(USE_SLANG)
    169169static void slang_init_palette(void);
     170#endif
     171
     172#if defined(USE_X11)
     173static int x11_error_handler(Display *, XErrorEvent *);
    170174#endif
    171175
     
    202206        {
    203207            _caca_fgisbg = 1;
    204             switch(fgcolor)
    205             {
    206             case CACA_COLOR_BLACK:
     208            if(fgcolor == CACA_COLOR_BLACK)
    207209                fgcolor = CACA_COLOR_WHITE;
    208                 break;
    209             case CACA_COLOR_WHITE:
     210            else if(fgcolor == CACA_COLOR_WHITE
     211                     || fgcolor <= CACA_COLOR_LIGHTGRAY)
    210212                fgcolor = CACA_COLOR_BLACK;
    211                 break;
    212             default:
    213                 if(fgcolor <= CACA_COLOR_LIGHTGRAY)
    214                     fgcolor = CACA_COLOR_BLACK;
    215                 else
    216                     fgcolor = CACA_COLOR_WHITE;
    217             }
     213            else
     214                fgcolor = CACA_COLOR_WHITE;
    218215        }
    219216#endif
     
    320317#if defined(USE_X11)
    321318    case CACA_DRIVER_X11:
    322         x11_screen[x + y * _caca_width] =
    323             ((int)c << 8) | ((int)_caca_bgcolor << 4) | (int)_caca_fgcolor;
     319        x11_char[x + y * _caca_width] = c;
     320        x11_attr[x + y * _caca_width] = (_caca_bgcolor << 4) | _caca_fgcolor;
    324321        break;
    325322#endif
     
    342339void caca_putstr(int x, int y, const char *s)
    343340{
    344 #if defined(USE_CONIO)
     341#if defined(USE_CONIO) | defined(USE_X11)
    345342    char *charbuf;
    346343#endif
    347344#if defined(USE_X11)
    348     int *intbuf;
     345    char *attrbuf;
    349346#endif
    350347    unsigned int len;
     
    405402#if defined(USE_X11)
    406403    case CACA_DRIVER_X11:
    407         intbuf = x11_screen + x + y * _caca_width;
     404        charbuf = x11_char + x + y * _caca_width;
     405        attrbuf = x11_attr + x + y * _caca_width;
    408406        while(*s)
    409             *intbuf++ = ((int)*s++ << 8)
    410                          | ((int)_caca_bgcolor << 4) | (int)_caca_fgcolor;
     407        {
     408            *charbuf++ = *s++;
     409            *attrbuf++ = (_caca_bgcolor << 4) | _caca_fgcolor;
     410        }
    411411        break;
    412412#endif
     
    482482        slang_init_palette();
    483483
    484         /* Disable alt charset support so that we get all 256 colour pairs */
     484        /* Disable alt charset support so that we get a chance to have all
     485         * 256 colour pairs */
    485486        SLtt_Has_Alt_Charset = 0;
    486487
     
    580581        {
    581582            /* Standard curses colours */
    582             0, 0, 0,
    583             0, 0, 32768,
    584             0, 32768, 0,
    585             0, 32768, 32768,
    586             32768, 0, 0,
    587             32768, 0, 32768,
    588             32768, 32768, 0,
    589             32768, 32768, 32768,
     583            0x0,    0x0,    0x0,
     584            0x0,    0x0,    0x8000,
     585            0x0,    0x8000, 0x0,
     586            0x0,    0x8000, 0x8000,
     587            0x8000, 0x0,    0x0,
     588            0x8000, 0x0,    0x8000,
     589            0x8000, 0x8000, 0x0,
     590            0x8000, 0x8000, 0x8000,
    590591            /* Extra values for xterm-16color */
    591             16384, 16384, 16384,
    592             16384, 16384, 65535,
    593             16384, 65535, 16384,
    594             16384, 65535, 65535,
    595             65535, 16384, 16384,
    596             65535, 16384, 65535,
    597             65535, 65535, 16384,
    598             65535, 65535, 65535,
     592            0x4000, 0x4000, 0x4000,
     593            0x4000, 0x4000, 0xffff,
     594            0x4000, 0xffff, 0x4000,
     595            0x4000, 0xffff, 0xffff,
     596            0xffff, 0x4000, 0x4000,
     597            0xffff, 0x4000, 0xffff,
     598            0xffff, 0xffff, 0x4000,
     599            0xffff, 0xffff, 0xffff,
    599600        };
    600601
    601602        Colormap colormap;
    602         XSetWindowAttributes x11_attr;
     603        XSetWindowAttributes x11_winattr;
     604        int (*old_error_handler)(Display *, XErrorEvent *);
    603605        const char *font_name = "8x13bold";
    604606        int i;
    605607
    606         if(getenv("CACA_GEOMETRY"))
     608        if(getenv("CACA_GEOMETRY") && *(getenv("CACA_GEOMETRY")))
    607609            sscanf(getenv("CACA_GEOMETRY"),
    608610                   "%ux%u", &_caca_width, &_caca_height);
     
    613615            _caca_height = 32;
    614616
    615         x11_screen = malloc(_caca_width * _caca_height * sizeof(int));
    616         if(x11_screen == NULL)
     617        x11_char = malloc(_caca_width * _caca_height * sizeof(int));
     618        if(x11_char == NULL)
    617619            return -1;
     620
     621        x11_attr = malloc(_caca_width * _caca_height * sizeof(int));
     622        if(x11_attr == NULL)
     623        {
     624            free(x11_char);
     625            return -1;
     626        }
    618627
    619628        x11_dpy = XOpenDisplay(NULL);
    620629        if(x11_dpy == NULL)
    621630        {
    622             free(x11_screen);
     631            free(x11_char);
     632            free(x11_attr);
    623633            return -1;
    624634        }
    625635
    626         if(getenv("CACA_FONT"))
     636        if(getenv("CACA_FONT") && *(getenv("CACA_FONT")))
    627637            font_name = getenv("CACA_FONT");
     638
     639        /* Ignore font errors */
     640        old_error_handler = XSetErrorHandler(x11_error_handler);
    628641
    629642        x11_font = XLoadFont(x11_dpy, font_name);
     
    631644        {
    632645            XCloseDisplay(x11_dpy);
    633             free(x11_screen);
     646            free(x11_char);
     647            free(x11_attr);
    634648            return -1;
    635649        }
     
    640654            XUnloadFont(x11_dpy, x11_font);
    641655            XCloseDisplay(x11_dpy);
    642             free(x11_screen);
     656            free(x11_char);
     657            free(x11_attr);
    643658            return -1;
    644659        }
     660
     661        /* Reset the default X11 error handler */
     662        XSetErrorHandler(old_error_handler);
    645663
    646664        x11_font_width = x11_font_struct->max_bounds.width;
     
    660678        }
    661679
    662         x11_attr.backing_store = Always;
    663         x11_attr.background_pixel = x11_colors[0];
    664         x11_attr.event_mask = ExposureMask | StructureNotifyMask;
     680        x11_winattr.backing_store = Always;
     681        x11_winattr.background_pixel = x11_colors[0];
     682        x11_winattr.event_mask = ExposureMask | StructureNotifyMask;
    665683
    666684        x11_window = XCreateWindow(x11_dpy, DefaultRootWindow(x11_dpy), 0, 0,
     
    669687                                   0, 0, InputOutput, 0,
    670688                                   CWBackingStore | CWBackPixel | CWEventMask,
    671                                    &x11_attr);
     689                                   &x11_winattr);
    672690
    673691        XStoreName(x11_dpy, x11_window, "caca for X");
     
    742760        XDestroyWindow(x11_dpy, x11_window);
    743761        XCloseDisplay(x11_dpy);
    744         free(x11_screen);
    745     }
    746 #endif
     762        free(x11_char);
     763        free(x11_attr);
     764    }
     765    else
     766#endif
     767    {
     768        /* Dummy */
     769    }
     770
    747771    free(_caca_empty_line);
    748772
     
    846870    if(_caca_driver == CACA_DRIVER_X11)
    847871    {
    848         unsigned int x, y;
     872        unsigned int x, y, len;
    849873
    850874        /* FIXME: This is very, very slow. There are several things that can
     
    854878         *  - use our own rendering routine (screen depth dependent) */
    855879        for(y = 0; y < _caca_height; y++)
    856             for(x = 0; x < _caca_width; x++)
     880        {
     881            for(x = 0; x < _caca_width; x += len)
    857882            {
    858                 int item = x11_screen[x + y * _caca_width];
    859                 char data = item >> 8;
    860                 XSetForeground(x11_dpy, x11_gc, x11_colors[(item >> 4) & 0xf]);
     883                unsigned char *attr = x11_attr + x + y * _caca_width;
     884
     885                len = 1;
     886                while(x + len < _caca_width && attr[len] == attr[0])
     887                    len++;
     888
     889                XSetForeground(x11_dpy, x11_gc, x11_colors[attr[0] >> 4]);
    861890                XFillRectangle(x11_dpy, x11_pixmap, x11_gc,
    862891                               x * x11_font_width, y * x11_font_height,
    863                                x11_font_width, x11_font_height);
    864                 XSetForeground(x11_dpy, x11_gc, x11_colors[item & 0xf]);
     892                               len * x11_font_width, x11_font_height);
     893
     894                XSetForeground(x11_dpy, x11_gc, x11_colors[attr[0] & 0xf]);
    865895                XDrawString(x11_dpy, x11_pixmap, x11_gc, x * x11_font_width,
    866896                            (y + 1) * x11_font_height - x11_font_offset,
    867                             &data, 1);
     897                            x11_char + x + y * _caca_width, len);
    868898            }
     899        }
     900
    869901        XCopyArea(x11_dpy, x11_pixmap, x11_window, x11_gc, 0, 0,
    870902                  _caca_width * x11_font_width, _caca_height * x11_font_height,
     
    890922
    891923#if defined(USE_SLANG)
    892 
    893 #if defined(OPTIMISE_SLANG_PALETTE)
    894 #endif
    895 
    896924static void slang_init_palette(void)
    897925{
     
    919947    };
    920948
    921 #if !defined(OPTIMISE_SLANG_PALETTE)
    922     int fg, bg;
    923 
    924     for(bg = 0; bg < 16; bg++)
    925         for(fg = 0; fg < 16; fg++)
    926         {
    927             int i = fg + 16 * bg;
    928             SLtt_set_color(i, NULL, slang_colors[fg], slang_colors[bg]);
    929         }
    930 #else
     949#if defined(OPTIMISE_SLANG_PALETTE)
    931950    int i;
    932951
     
    934953        SLtt_set_color(i, NULL, slang_colors[slang_palette[i * 2]],
    935954                                slang_colors[slang_palette[i * 2 + 1]]);
     955#else
     956    int fg, bg;
     957
     958    for(bg = 0; bg < 16; bg++)
     959        for(fg = 0; fg < 16; fg++)
     960        {
     961            int i = fg + 16 * bg;
     962            SLtt_set_color(i, NULL, slang_colors[fg], slang_colors[bg]);
     963        }
    936964#endif
    937965}
    938966#endif /* USE_SLANG */
    939967
     968#if defined(USE_X11)
     969static int x11_error_handler(Display *dpy, XErrorEvent *event)
     970{
     971    return 0;
     972}
     973#endif
     974
Note: See TracChangeset for help on using the changeset viewer.