| @@ -1,6 +1,6 @@ | |||||
| /* $Id$ */ /** \page libcaca-authors Libcaca authors | /* $Id$ */ /** \page libcaca-authors Libcaca authors | ||||
| Sam Hocevar <sam@zoy.org> | |||||
| Sam Hocevar <sam@hocevar.net> | |||||
| - main programmer | - main programmer | ||||
| Jean-Yves Lamoureux <jylam@lnxscene.org> | Jean-Yves Lamoureux <jylam@lnxscene.org> | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * libcaca Colour ASCII-Art library | * libcaca Colour ASCII-Art library | ||||
| * Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org> | |||||
| * Copyright (c) 2002-2009 Sam Hocevar <sam@hocevar.net> | |||||
| * 2007 Ben Wiley Sittler <bsittler@gmail.com> | * 2007 Ben Wiley Sittler <bsittler@gmail.com> | ||||
| * All Rights Reserved | * All Rights Reserved | ||||
| * | * | ||||
| @@ -345,22 +345,34 @@ static int ncurses_get_display_height(caca_display_t const *dp) | |||||
| static void ncurses_display(caca_display_t *dp) | static void ncurses_display(caca_display_t *dp) | ||||
| { | { | ||||
| uint32_t const *cvchars = (uint32_t const *)caca_get_canvas_chars(dp->cv); | |||||
| uint32_t const *cvattrs = (uint32_t const *)caca_get_canvas_attrs(dp->cv); | |||||
| int width = caca_get_canvas_width(dp->cv); | |||||
| int height = caca_get_canvas_height(dp->cv); | |||||
| int x, y; | |||||
| int x, y, i; | |||||
| for(y = 0; y < (int)height; y++) | |||||
| for(i = 0; i < caca_get_dirty_rectangle_count(dp->cv); i++) | |||||
| { | { | ||||
| move(y, 0); | |||||
| for(x = width; x--; ) | |||||
| uint32_t const *cvchars, *cvattrs; | |||||
| int xmin, ymin, xmax, ymax; | |||||
| caca_get_dirty_rectangle(dp->cv, i, &xmin, &ymin, &xmax, &ymax); | |||||
| cvchars = (uint32_t const *)caca_get_canvas_chars(dp->cv) | |||||
| + xmin + ymin * dp->cv->width; | |||||
| cvattrs = (uint32_t const *)caca_get_canvas_attrs(dp->cv) | |||||
| + xmin + ymin * dp->cv->width; | |||||
| for(y = ymin; y <= ymax; y++) | |||||
| { | { | ||||
| attrset(dp->drv.p->attr[caca_attr_to_ansi(*cvattrs++)]); | |||||
| ncurses_write_utf32(*cvchars++); | |||||
| move(y, xmin); | |||||
| for(x = xmin; x <= xmax; x++) | |||||
| { | |||||
| attrset(dp->drv.p->attr[caca_attr_to_ansi(*cvattrs++)]); | |||||
| ncurses_write_utf32(*cvchars++); | |||||
| } | |||||
| cvchars += dp->cv->width - (xmax - xmin) - 1; | |||||
| cvattrs += dp->cv->width - (xmax - xmin) - 1; | |||||
| } | } | ||||
| } | } | ||||
| x = caca_get_cursor_x(dp->cv); | x = caca_get_cursor_x(dp->cv); | ||||
| y = caca_get_cursor_y(dp->cv); | y = caca_get_cursor_y(dp->cv); | ||||
| move(y, x); | move(y, x); | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * libcaca Colour ASCII-Art library | * libcaca Colour ASCII-Art library | ||||
| * Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org> | |||||
| * Copyright (c) 2002-2009 Sam Hocevar <sam@hocevar.net> | |||||
| * All Rights Reserved | * All Rights Reserved | ||||
| * | * | ||||
| * $Id$ | * $Id$ | ||||
| @@ -114,26 +114,44 @@ static int vga_get_display_height(caca_display_t const *dp) | |||||
| static void vga_display(caca_display_t *dp) | static void vga_display(caca_display_t *dp) | ||||
| { | { | ||||
| char *screen = (char *)(intptr_t)0x000b8000; | |||||
| uint32_t const *cvchars = (uint32_t const *)caca_get_canvas_chars(dp->cv); | |||||
| uint32_t const *cvattrs = (uint32_t const *)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--; ) | |||||
| int x, y, i; | |||||
| for(i = 0; i < caca_get_dirty_rectangle_count(dp->cv); i++) | |||||
| { | { | ||||
| char ch = caca_utf32_to_cp437(*cvchars++); | |||||
| if(n && *cvchars == CACA_MAGIC_FULLWIDTH) | |||||
| char *screen = (char *)(intptr_t)0x000b8000; | |||||
| uint32_t const *cvchars, *cvattrs; | |||||
| int xmin, ymin, xmax, ymax; | |||||
| caca_get_dirty_rectangle(dp->cv, i, &xmin, &ymin, &xmax, &ymax); | |||||
| cvchars = (uint32_t const *)caca_get_canvas_chars(dp->cv) | |||||
| + xmin + ymin * dp->cv->width; | |||||
| cvattrs = (uint32_t const *)caca_get_canvas_attrs(dp->cv) | |||||
| + xmin + ymin * dp->cv->width; | |||||
| screen += ymin * dp->cv->width + xmin; | |||||
| for(y = ymin; y <= ymax; y++) | |||||
| { | { | ||||
| *screen++ = '['; | |||||
| *screen++ = caca_attr_to_ansi(*cvattrs++); | |||||
| ch = ']'; | |||||
| cvchars++; | |||||
| n--; | |||||
| for(x = xmin; x <= xmax; x++) | |||||
| { | |||||
| char ch = caca_utf32_to_cp437(*cvchars++); | |||||
| if(x < xmax && *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 - (xmax - xmin) - 1; | |||||
| cvattrs += dp->cv->width - (xmax - xmin) - 1; | |||||
| screen += 2 * (dp->cv->width - (xmax - xmin) - 1); | |||||
| } | } | ||||
| *screen++ = ch; | |||||
| *screen++ = caca_attr_to_ansi(*cvattrs++); | |||||
| } | } | ||||
| } | } | ||||
| @@ -1,6 +1,6 @@ | |||||
| /* | /* | ||||
| * libcaca Colour ASCII-Art library | * libcaca Colour ASCII-Art library | ||||
| * Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org> | |||||
| * Copyright (c) 2002-2009 Sam Hocevar <sam@hocevar.net> | |||||
| * All Rights Reserved | * All Rights Reserved | ||||
| * | * | ||||
| * $Id$ | * $Id$ | ||||
| @@ -239,6 +239,7 @@ static void win32_display(caca_display_t *dp) | |||||
| #if 0 | #if 0 | ||||
| WriteConsoleOutput(dp->drv.p->screen, dp->drv.p->buffer, size, pos, &rect); | WriteConsoleOutput(dp->drv.p->screen, dp->drv.p->buffer, size, pos, &rect); | ||||
| #else | #else | ||||
| /* FIXME: would this benefit from dirty rectangles? */ | |||||
| WriteConsoleOutputW(dp->drv.p->screen, dp->drv.p->buffer, size, pos, &rect); | WriteConsoleOutputW(dp->drv.p->screen, dp->drv.p->buffer, size, pos, &rect); | ||||
| #endif | #endif | ||||
| } | } | ||||