Changeset 557


Ignore:
Timestamp:
Mar 8, 2006, 11:29:00 PM (15 years ago)
Author:
Sam Hocevar
Message:
  • Make output drivers more error resilient when handling UTF-32 characters, by simply ignoring everything non ASCII :-)
Location:
libcaca/trunk/caca
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/driver_conio.c

    r553 r557  
    104104    for(n = kk->qq->height * kk->qq->width; n--; )
    105105    {
    106         *screen++ = *chars++ & 0x7f;
     106        uint32_t c = *chars++;
     107
     108        if(c > 0x00000020 && c < 0x00000080)
     109            *screen++ = (char)c;
     110        else
     111            *screen++ = ' ';
     112
    107113        *screen++ = *attr++;
    108114    }
  • libcaca/trunk/caca/driver_gl.c

    r553 r557  
    7979    float font_width, font_height;
    8080    float incx, incy;
    81     int id[94];
     81    int id[128 - 32];
    8282    unsigned char bit;
    8383    unsigned char mouse_changed, mouse_clicked;
     
    165165    glEnable(GL_TEXTURE_2D);
    166166
    167     for(i = 0; i < 94; i++)
    168     {
    169         glGenTextures(1, (GLuint*)&kk->drv.p->id[i]);
    170         glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[i]);
     167    for(i = 32; i < 128; i++)
     168    {
     169        glGenTextures(1, (GLuint*)&kk->drv.p->id[i - 32]);
     170        glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[i - 32]);
    171171        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    172172        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     
    175175    }
    176176
    177     for(i = 0; i < 94; i++)
     177    for(i = 32; i < 128; i++)
    178178    {
    179179        glDisable(GL_TEXTURE_2D);
     
    182182        glColor3f(1, 1, 1);
    183183        glRasterPos2f(0, 15);
    184         glutBitmapCharacter(GLUT_BITMAP_9_BY_15, i + 32);
     184        glutBitmapCharacter(GLUT_BITMAP_9_BY_15, i);
    185185
    186186        glEnable(GL_TEXTURE_2D);
    187         glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[i]);
     187        glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[i - 32]);
    188188        glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,
    189189                         0, kk->drv.p->height - 16, 16, 16, 0);
     
    237237                glVertex2f(x, y);
    238238                glVertex2f(x + kk->drv.p->font_width, y);
    239                 glVertex2f(x + kk->drv.p->font_width, y + kk->drv.p->font_height);
     239                glVertex2f(x + kk->drv.p->font_width,
     240                           y + kk->drv.p->font_height);
    240241                glVertex2f(x, y + kk->drv.p->font_height);
    241242            glEnd();
     
    260261        for(x = 0; x < kk->drv.p->width; x += kk->drv.p->font_width)
    261262        {
    262             if(*chars != (uint32_t)' ')
     263            uint32_t c = *chars++;
     264
     265            if(c > 0x00000020 && c < 0x00000080)
    263266            {
    264                 char ch = *chars & 0x7f;
    265 
    266                 /* FIXME: check ch bounds */
    267                 glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[ch - 32]);
     267                glBindTexture(GL_TEXTURE_2D, kk->drv.p->id[c - 32]);
    268268                glColor4bv(gl_bgpal[attr[0] & 0xf]);
    269269                glBegin(GL_QUADS);
     
    280280
    281281            attr++;
    282             chars++;
    283282        }
    284283        line++;
  • libcaca/trunk/caca/driver_ncurses.c

    r553 r557  
    193193        for(x = kk->qq->width; x--; )
    194194        {
     195            uint32_t c = *chars++;
     196
    195197            attrset(kk->drv.p->attr[*attr++]);
    196             addch(*chars++ & 0x7f);
     198            if(c > 0x00000020 && c < 0x00000080)
     199                addch((char)c);
     200            else
     201                addch(' ');
    197202        }
    198203    }
  • libcaca/trunk/caca/driver_slang.c

    r553 r557  
    204204        for(x = kk->qq->width; x--; )
    205205        {
     206            uint32_t c = *chars++;
     207
    206208#if defined(OPTIMISE_SLANG_PALETTE)
     209            uint8_t fgcolor = *attr & 0xf;
     210            uint8_t bgcolor = *attr >> 4;
     211
    207212            /* If foreground == background, just don't use this colour
    208213             * pair, and print a space instead of the real character. */
    209             uint8_t fgcolor = *attr & 0xf;
    210             uint8_t bgcolor = *attr >> 4;
    211214            if(fgcolor != bgcolor)
    212215            {
    213216                SLsmg_set_color(slang_assoc[*attr++]);
    214                 SLsmg_write_char(*chars++ & 0x7f);
     217                if(c > 0x00000020 && 0x00000080)
     218                    SLsmg_write_char((char)c);
     219                else
     220                    SLsmg_write_char(' ');
    215221            }
    216222            else
     
    225231                SLsmg_set_color(slang_assoc[fgcolor + 16 * bgcolor]);
    226232                SLsmg_write_char(' ');
    227                 chars++;
    228233                attr++;
    229234            }
    230235#else
    231236            SLsmg_set_color(*attr++);
    232             SLsmg_write_char(*chars++ & 0x7f);
     237            if(c > 0x00000020 && 0x00000080)
     238                SLsmg_write_char((char)c);
     239            else
     240                SLsmg_write_char(' ');
    233241#endif
    234242        }
  • libcaca/trunk/caca/driver_win32.c

    r553 r557  
    199199    for(i = 0; i < kk->qq->width * kk->qq->height; i++)
    200200    {
    201         kk->drv.p->buffer[i].Char.AsciiChar = kk->qq->chars[i] & 0x7f;
     201        uint32_t c = kk->qq->chars[i];
     202
     203        if(c > 0x00000020 && c < 0x00000080)
     204            kk->drv.p->buffer[i].Char.AsciiChar = (char)c;
     205        else
     206            kk->drv.p->buffer[i].Char.AsciiChar = ' ';
     207
    202208        kk->drv.p->buffer[i].Attributes =
    203209                win32_fg_palette[kk->qq->attr[i] & 0xf]
  • libcaca/trunk/caca/driver_x11.c

    r553 r557  
    272272    for(y = 0; y < kk->qq->height; y++)
    273273    {
     274        unsigned int yoff = (y + 1) * kk->drv.p->font_height
     275                                    - kk->drv.p->font_offset;
     276
    274277        for(x = 0; x < kk->qq->width; x += len)
    275278        {
     
    281284
    282285            /* Skip spaces */
    283             if(chars[0] == ' ')
     286            if(chars[0] <= 0x00000020 || chars[0] >= 0x00000080)
    284287                continue;
    285288
    286             buffer[0] = chars[0] & 0x7f;
     289            buffer[0] = (char)chars[0];
    287290
    288291            while(x + len < kk->qq->width
    289292                   && (attr[len] & 0xf) == (attr[0] & 0xf))
    290293            {
    291                 buffer[len] = chars[len] & 0x7f;
     294                if(chars[len] > 0x00000020 && chars[len] < 0x00000080)
     295                    buffer[len] = (char)chars[len];
     296                else
     297                    buffer[len] = ' ';
    292298                len++;
    293299            }
    294300
    295             XSetForeground(kk->drv.p->dpy, kk->drv.p->gc, kk->drv.p->colors[attr[0] & 0xf]);
     301            XSetForeground(kk->drv.p->dpy, kk->drv.p->gc,
     302                           kk->drv.p->colors[attr[0] & 0xf]);
    296303            XDrawString(kk->drv.p->dpy, kk->drv.p->pixmap, kk->drv.p->gc,
    297                         x * kk->drv.p->font_width,
    298                         (y + 1) * kk->drv.p->font_height - kk->drv.p->font_offset,
    299                         buffer, len);
    300         }
    301     }
    302 
    303     XCopyArea(kk->drv.p->dpy, kk->drv.p->pixmap, kk->drv.p->window, kk->drv.p->gc, 0, 0,
     304                        x * kk->drv.p->font_width, yoff, buffer, len);
     305        }
     306    }
     307
     308    XCopyArea(kk->drv.p->dpy, kk->drv.p->pixmap, kk->drv.p->window,
     309              kk->drv.p->gc, 0, 0,
    304310              kk->qq->width * kk->drv.p->font_width,
    305311              kk->qq->height * kk->drv.p->font_height,
Note: See TracChangeset for help on using the changeset viewer.