Ejemplo n.º 1
0
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
}
Ejemplo n.º 2
0
static void ncurses_display(caca_display_t *dp)
{
    int x, y, i;

    for(i = 0; i < caca_get_dirty_rect_count(dp->cv); i++)
    {
        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;

        for(y = dy; y < dy + dh; y++)
        {
            move(y, dx);
            for(x = dx; x < dx + dw; x++)
            {
                (void)attrset(dp->drv.p->attr[caca_attr_to_ansi(*cvattrs++)]);
                ncurses_write_utf32(*cvchars++);
            }

            cvchars += dp->cv->width - dw;
            cvattrs += dp->cv->width - dw;
        }
    }

    x = caca_wherex(dp->cv);
    y = caca_wherey(dp->cv);
    move(y, x);

    refresh();
}
Ejemplo n.º 3
0
static void win32_display(caca_display_t *dp)
{
    COORD size, pos;
    SMALL_RECT rect;
    CHAR_INFO *buffer = dp->drv.p->buffer;
    uint32_t const *cvchars = caca_get_canvas_chars(dp->cv);
    uint32_t const *cvattrs = caca_get_canvas_attrs(dp->cv);
    int width = caca_get_canvas_width(dp->cv);
    int height = caca_get_canvas_height(dp->cv);
    int n;

    /* Render everything to our screen buffer */
    for(n = height * width; n--; )
    {
        uint32_t ch = *cvchars++;
        uint16_t bgfg = caca_attr_to_ansi(*cvattrs);
        uint8_t fg = bgfg & 0xf;
        uint8_t bg = bgfg >> 4;

#if 0
        if(ch > 0x00000020 && ch < 0x00000080)
            dp->drv.p->buffer[i].Char.AsciiChar = (uint8_t)ch;
        else
            dp->drv.p->buffer[i].Char.AsciiChar = ' ';
#else
        if(n && *cvchars == CACA_MAGIC_FULLWIDTH)
            ;
        else if(ch > 0x00000020 && ch < 0x00010000)
            buffer->Char.UnicodeChar = (uint16_t)ch;
        else
            buffer->Char.UnicodeChar = (uint16_t)' ';
#endif

        buffer->Attributes = win32_fg_palette[fg < 0x10 ? fg : CACA_LIGHTGRAY]
                              | win32_bg_palette[bg < 0x10 ? bg : CACA_BLACK];
        cvattrs++;
        buffer++;
    }

    /* Blit the screen buffer */
    size.X = width;
    size.Y = height;
    pos.X = pos.Y = 0;
    rect.Left = rect.Top = 0;
    rect.Right = width - 1;
    rect.Bottom = height - 1;
#if 0
    WriteConsoleOutput(dp->drv.p->screen, dp->drv.p->buffer, size, pos, &rect);
#else
    /* FIXME: would this benefit from dirty rectangles? */
    WriteConsoleOutputW(dp->drv.p->screen, dp->drv.p->buffer, size, pos, &rect);
#endif
}
Ejemplo n.º 4
0
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);
        }
    }
}
Ejemplo n.º 5
0
static void slang_display(caca_display_t *dp)
{
    int x, y, i;

    SLsig_block_signals();
    for(i = 0; i < caca_get_dirty_rect_count(dp->cv); i++)
    {
        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;

        for(y = dy; y < dy + dh; y++)
        {
            SLsmg_gotorc(y, dx);
            for(x = dx; x < dx + dw; x++)
            {
                uint32_t ch = *cvchars++;

#if defined(OPTIMISE_SLANG_PALETTE)
                /* If foreground == background, just don't use this colour
                 * pair, and print a space instead of the real character. */
                /* XXX: disabled, because I can't remember what it was
                 * here for, and in cases where SLang does not render
                 * bright backgrounds, it's just f****d up. */
#if 0
                uint8_t fgcolor = caca_attr_to_ansi_fg(*cvattrs);
                uint8_t bgcolor = caca_attr_to_ansi_bg(*cvattrs);

                if(fgcolor >= 0x10)
                    fgcolor = CACA_LIGHTGRAY;

                if(bgcolor >= 0x10)
                    bgcolor = CACA_BLACK; /* FIXME: handle transparency */

                if(fgcolor == bgcolor)
                {
                    if(fgcolor == CACA_BLACK)
                        fgcolor = CACA_WHITE;
                    else if(fgcolor == CACA_WHITE
                             || fgcolor <= CACA_LIGHTGRAY)
                        fgcolor = CACA_BLACK;
                    else
                        fgcolor = CACA_WHITE;
                    SLsmg_set_color(slang_assoc[fgcolor + 16 * bgcolor]);
                    SLsmg_write_char(' ');
                    cvattrs++;
                }
                else
#endif
                {
                    SLsmg_set_color(slang_assoc[caca_attr_to_ansi(*cvattrs++)]);
                    slang_write_utf32(ch);
                }
#else
                SLsmg_set_color(caca_attr_to_ansi(*cvattrs++));
                slang_write_utf32(ch);
#endif
            }

            cvchars += dp->cv->width - dw;
            cvattrs += dp->cv->width - dw;
        }
    }
    SLsmg_gotorc(caca_wherey(dp->cv), caca_wherex(dp->cv));
    SLsmg_refresh();
    SLsig_unblock_signals();
}