Browse Source

Add dirty rectangle support to the ncurses and VGA drivers.

tags/v0.99.beta17
Sam Hocevar sam 15 years ago
parent
commit
0c7fd89e3a
4 changed files with 63 additions and 32 deletions
  1. +1
    -1
      AUTHORS
  2. +24
    -12
      caca/driver/ncurses.c
  3. +36
    -18
      caca/driver/vga.c
  4. +2
    -1
      caca/driver/win32.c

+ 1
- 1
AUTHORS View File

@@ -1,6 +1,6 @@
/* $Id$ */ /** \page libcaca-authors Libcaca authors

Sam Hocevar <sam@zoy.org>
Sam Hocevar <sam@hocevar.net>
- main programmer

Jean-Yves Lamoureux <jylam@lnxscene.org>


+ 24
- 12
caca/driver/ncurses.c View File

@@ -1,6 +1,6 @@
/*
* 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>
* 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)
{
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);
y = caca_get_cursor_y(dp->cv);
move(y, x);


+ 36
- 18
caca/driver/vga.c View File

@@ -1,6 +1,6 @@
/*
* 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
*
* $Id$
@@ -114,26 +114,44 @@ static int vga_get_display_height(caca_display_t const *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++);
}
}



+ 2
- 1
caca/driver/win32.c View File

@@ -1,6 +1,6 @@
/*
* 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
*
* $Id$
@@ -239,6 +239,7 @@ static void win32_display(caca_display_t *dp)
#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
}


Loading…
Cancel
Save