示例#1
0
文件: conio.c 项目: gitpan/Term-Caca
static void conio_display(caca_display_t *dp)
{
    char *screen = dp->drv.p->screen;
    uint32_t const *chars = caca_get_canvas_chars(dp->cv);
    uint32_t const *attrs = caca_get_canvas_attrs(dp->cv);
    int width = caca_get_canvas_width(dp->cv);
    int height = caca_get_canvas_height(dp->cv);
    int n;

    for(n = height * width; n--; )
    {
        char ch = caca_utf32_to_cp437(*chars++);
        if(n && *chars == CACA_MAGIC_FULLWIDTH)
        {
            *screen++ = '[';
            *screen++ = caca_attr_to_ansi(*attrs++);
            ch = ']';
            chars++;
            n--;
        }
        *screen++ = ch;
        *screen++ = caca_attr_to_ansi(*attrs++);
    }
#   if defined(SCREENUPDATE_IN_PC_H)
    ScreenUpdate(dp->drv.p->screen);
#   else
    /* FIXME */
#   endif
}
示例#2
0
文件: vga.c 项目: mwgoldsmith/caca
static void vga_display(caca_display_t *dp)
{
    int x, y, i;

    for(i = 0; i < caca_get_dirty_rect_count(dp->cv); i++)
    {
        char *screen = (char *)(intptr_t)0x000b8000;
        uint32_t const *cvchars, *cvattrs;
        int dx, dy, dw, dh;

        caca_get_dirty_rect(dp->cv, i, &dx, &dy, &dw, &dh);

        cvchars = caca_get_canvas_chars(dp->cv) + dx + dy * dp->cv->width;
        cvattrs = caca_get_canvas_attrs(dp->cv) + dx + dy * dp->cv->width;

        screen += dy * dp->cv->width + dx;

        for(y = dy; y < dy + dh; y++)
        {
            for(x = dx; x < dx + dw; x++)
            {
                char ch = caca_utf32_to_cp437(*cvchars++);
                if(x < dx + dw - 1 && *cvchars == CACA_MAGIC_FULLWIDTH)
                {
                    *screen++ = '[';
                    *screen++ = caca_attr_to_ansi(*cvattrs++);
                    ch = ']';
                    cvchars++;
                    x++;
                }
                *screen++ = ch;
                *screen++ = caca_attr_to_ansi(*cvattrs++);
            }

            cvchars += dp->cv->width - dw;
            cvattrs += dp->cv->width - dw;
            screen += 2 * (dp->cv->width - dw);
        }
    }
}