Changeset 1218


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
Files:
10 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
  • libcaca/trunk/cucul/canvas.c

    r1215 r1218  
    7070    int fullwidth;
    7171
    72     if(!ch || x >= (int)cv->width || y < 0 || y >= (int)cv->height)
     72    if(x >= (int)cv->width || y < 0 || y >= (int)cv->height)
     73        return 0;
     74
     75    if(ch == CUCUL_MAGIC_FULLWIDTH)
    7376        return 0;
    7477
     
    9093    /* When overwriting the right part of a fullwidth character,
    9194     * replace its left part with a space. */
    92     if(x && curchar[0] == MAGIC_FULLWIDTH)
     95    if(x && curchar[0] == CUCUL_MAGIC_FULLWIDTH)
    9396        curchar[-1] = ' ';
    9497
     
    101104            /* When overwriting the left part of a fullwidth character,
    102105             * replace its right part with a space. */
    103             if(x + 2 < (int)cv->width && curchar[2] == MAGIC_FULLWIDTH)
     106            if(x + 2 < (int)cv->width && curchar[2] == CUCUL_MAGIC_FULLWIDTH)
    104107                curchar[2] = ' ';
    105108
    106             curchar[1] = MAGIC_FULLWIDTH;
     109            curchar[1] = CUCUL_MAGIC_FULLWIDTH;
    107110            curattr[1] = attr;
    108111        }
     
    112115        /* When overwriting the left part of a fullwidth character,
    113116         * replace its right part with a space. */
    114         if(x + 1 != (int)cv->width && curchar[1] == MAGIC_FULLWIDTH)
     117        if(x + 1 != (int)cv->width && curchar[1] == CUCUL_MAGIC_FULLWIDTH)
    115118            curchar[1] = ' ';
    116119    }
     
    130133 *
    131134 *  If the coordinates are outside the canvas boundaries, a space (0x20)
    132  *  is returned. FIXME: explain MAGIC_FULLWIDTH
     135 *  is returned. FIXME: explain CUCUL_MAGIC_FULLWIDTH
    133136 *
    134137 *  This function never fails.
  • libcaca/trunk/cucul/cucul.h

    r1211 r1218  
    9898 *
    9999 *  @{ */
     100#define CUCUL_MAGIC_FULLWIDTH 0x000ffffe /**< Used to indicate that the previous character was a fullwidth glyph. */
    100101int cucul_set_color(cucul_canvas_t *, unsigned char, unsigned char);
    101102int cucul_set_truecolor(cucul_canvas_t *, unsigned int, unsigned int);
  • libcaca/trunk/cucul/cucul_internals.h

    r1215 r1218  
    1818#   include <inttypes.h>
    1919#endif
    20 
    21 #define MAGIC_FULLWIDTH 0x00000000
    2220
    2321struct cucul_canvas
Note: See TracChangeset for help on using the changeset viewer.