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