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 }
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(); }
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 }
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); } } }
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(); }