Ignore:
Timestamp:
Oct 22, 2006, 6:35:25 PM (14 years ago)
Author:
Sam Hocevar
Message:
  • Support for fullwidth glyphs in the libcaca output drivers.
Location:
libcaca/trunk/caca
Files:
7 edited

Legend:

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

    r1006 r1218  
    100100    uint32_t *attr = dp->cv->attr;
    101101    uint32_t *chars = dp->cv->chars;
    102     int n;
     102    unsigned int n;
    103103
    104104    for(n = dp->cv->height * dp->cv->width; n--; )
    105105    {
    106         *screen++ = cucul_utf32_to_cp437(*chars++);
     106        char ch = cucul_utf32_to_cp437(*chars++);
     107        if(n && *chars == CUCUL_MAGIC_FULLWIDTH)
     108        {
     109            *screen++ = '[';
     110            *screen++ = _cucul_argb32_to_ansi8(*attr++);
     111            ch = ']';
     112            chars++;
     113            n--;
     114        }
     115        *screen++ = ch;
    107116        *screen++ = _cucul_argb32_to_ansi8(*attr++);
    108117    }
  • libcaca/trunk/caca/driver_gl.c

    r1072 r1218  
    219219        uint32_t *attr = dp->cv->attr + line * dp->cv->width;
    220220
     221        /* FIXME: optimise using stride */
    221222        for(x = 0; x < dp->drv.p->width; x += dp->drv.p->font_width)
    222223        {
     
    251252        for(x = 0; x < dp->drv.p->width; x += dp->drv.p->font_width, attr++)
    252253        {
    253             uint32_t cv = *chars++;
     254            uint32_t ch = *chars++;
    254255            uint16_t fg;
    255             int i, b;
     256            int i, b, fullwidth;
     257
     258            fullwidth = cucul_utf32_is_fullwidth(ch);
    256259
    257260            for(b = 0, i = 0; dp->drv.p->blocks[i + 1]; i += 2)
    258261            {
    259                 if(cv < (uint32_t)dp->drv.p->blocks[i])
     262                if(ch < (uint32_t)dp->drv.p->blocks[i])
    260263                     break;
    261264
    262                 if(cv >= (uint32_t)dp->drv.p->blocks[i + 1])
     265                if(ch >= (uint32_t)dp->drv.p->blocks[i + 1])
    263266                {
    264267                    b += (uint32_t)(dp->drv.p->blocks[i + 1]
     
    268271
    269272                glBindTexture(GL_TEXTURE_2D,
    270                               dp->drv.p->txid[b + cv
     273                              dp->drv.p->txid[b + ch
    271274                                        - (uint32_t)dp->drv.p->blocks[i]]);
    272275
     
    275278                          ((fg & 0x0f0) >> 4) * 8,
    276279                          (fg & 0x00f) * 8);
     280                /* FIXME: handle fullwidth glyphs here */
    277281                glBegin(GL_QUADS);
    278282                glTexCoord2f(0, dp->drv.p->sh);
     
    286290                glVertex2f(x, y + dp->drv.p->font_height);
    287291                glEnd();
     292            }
     293
     294            if(fullwidth)
     295            {
     296                chars++; attr++; x += dp->drv.p->font_width;
    288297            }
    289298        }
  • libcaca/trunk/caca/driver_ncurses.c

    r1006 r1218  
    435435    char buf[10];
    436436    int bytes;
    437 
     437#endif
     438
     439    if(ch == CUCUL_MAGIC_FULLWIDTH)
     440        return;
     441
     442#if defined HAVE_NCURSESW_NCURSES_H
    438443    bytes = cucul_utf32_to_utf8(buf, ch);
    439444    buf[bytes] = '\0';
  • libcaca/trunk/caca/driver_slang.c

    r1033 r1218  
    442442    char buf[10];
    443443    int bytes;
    444 
     444#endif
     445
     446    if(ch == CUCUL_MAGIC_FULLWIDTH)
     447        return;
     448
     449#ifdef HAVE_SLSMG_UTF8_ENABLE
    445450    bytes = cucul_utf32_to_utf8(buf, ch);
    446451    buf[bytes] = '\0';
  • libcaca/trunk/caca/driver_vga.c

    r1054 r1218  
    122122    for(n = dp->cv->height * dp->cv->width; n--; )
    123123    {
    124         *screen++ = cucul_utf32_to_cp437(*chars++);
     124        char ch = cucul_utf32_to_cp437(*chars++);
     125        if(n && *chars == CUCUL_MAGIC_FULLWIDTH)
     126        {
     127            *screen++ = '[';
     128            *screen++ = _cucul_argb32_to_ansi8(*attr++);
     129            ch = ']';
     130            chars++;
     131            n--;
     132        }
     133        *screen++ = ch;
    125134        *screen++ = _cucul_argb32_to_ansi8(*attr++);
    126135    }
  • libcaca/trunk/caca/driver_win32.c

    r969 r1218  
    190190    COORD size, pos;
    191191    SMALL_RECT rect;
    192     unsigned int i;
     192    CHAR_INFO *buffer = dp->drv.p->buffer;
     193    uint32_t *attr = dp->cv->attr;
     194    uint32_t *chars = dp->cv->chars;
     195    unsigned int n;
    193196
    194197    /* Render everything to our screen buffer */
    195     for(i = 0; i < dp->cv->width * dp->cv->height; i++)
     198    for(n = dp->cv->height * dp->cv->width; n--; )
    196199    {
    197         uint32_t ch = dp->cv->chars[i];
     200        uint32_t ch = *chars++;
    198201
    199202#if 0
     
    203206            dp->drv.p->buffer[i].Char.AsciiChar = ' ';
    204207#else
    205         if(ch > 0x00000020 && ch < 0x00010000)
    206             dp->drv.p->buffer[i].Char.UnicodeChar = (uint16_t)ch;
     208        if(n && *chars == CUCUL_MAGIC_FULLWIDTH)
     209            ;
     210        else if(ch > 0x00000020 && ch < 0x00010000)
     211            buffer->Char.UnicodeChar = (uint16_t)ch;
    207212        else
    208             dp->drv.p->buffer[i].Char.UnicodeChar = (uint16_t)' ';
     213            buffer->Char.UnicodeChar = (uint16_t)' ';
    209214#endif
    210215
    211         dp->drv.p->buffer[i].Attributes =
    212                 win32_fg_palette[_cucul_argb32_to_ansi4fg(dp->cv->attr[i])]
    213                  | win32_bg_palette[_cucul_argb32_to_ansi4bg(dp->cv->attr[i])];
     216        buffer->Attributes =
     217                win32_fg_palette[_cucul_argb32_to_ansi4fg(*attr)]
     218                 | win32_bg_palette[_cucul_argb32_to_ansi4bg(*attr)];
     219        attr++;
     220        buffer++;
    214221    }
    215222
  • libcaca/trunk/caca/driver_x11.c

    r969 r1218  
    276276
    277277            /* Skip spaces */
    278             if(*chars == 0x00000020)
     278            if(*chars <= 0x00000020)
     279                continue;
     280
     281            if(*chars == CUCUL_MAGIC_FULLWIDTH)
    279282                continue;
    280283
Note: See TracChangeset for help on using the changeset viewer.