Changeset 3489


Ignore:
Timestamp:
May 20, 2009, 12:48:12 AM (10 years ago)
Author:
Sam Hocevar
Message:

Add dirty rectangle support to the ncurses and VGA drivers.

Location:
libcaca/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/AUTHORS

    r3095 r3489  
    11/* $Id$ */ /** \page libcaca-authors Libcaca authors
    22
    3 Sam Hocevar <sam@zoy.org>
     3Sam Hocevar <sam@hocevar.net>
    44 - main programmer
    55
  • libcaca/trunk/caca/driver/ncurses.c

    r2962 r3489  
    11/*
    22 *  libcaca       Colour ASCII-Art library
    3  *  Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
     3 *  Copyright (c) 2002-2009 Sam Hocevar <sam@hocevar.net>
    44 *                2007 Ben Wiley Sittler <bsittler@gmail.com>
    55 *                All Rights Reserved
     
    346346static void ncurses_display(caca_display_t *dp)
    347347{
    348     uint32_t const *cvchars = (uint32_t const *)caca_get_canvas_chars(dp->cv);
    349     uint32_t const *cvattrs = (uint32_t const *)caca_get_canvas_attrs(dp->cv);
    350     int width = caca_get_canvas_width(dp->cv);
    351     int height = caca_get_canvas_height(dp->cv);
    352     int x, y;
    353 
    354     for(y = 0; y < (int)height; y++)
    355     {
    356         move(y, 0);
    357         for(x = width; x--; )
     348    int x, y, i;
     349
     350    for(i = 0; i < caca_get_dirty_rectangle_count(dp->cv); i++)
     351    {
     352        uint32_t const *cvchars, *cvattrs;
     353        int xmin, ymin, xmax, ymax;
     354
     355        caca_get_dirty_rectangle(dp->cv, i, &xmin, &ymin, &xmax, &ymax);
     356
     357        cvchars = (uint32_t const *)caca_get_canvas_chars(dp->cv)
     358                    + xmin + ymin * dp->cv->width;
     359        cvattrs = (uint32_t const *)caca_get_canvas_attrs(dp->cv)
     360                    + xmin + ymin * dp->cv->width;
     361
     362        for(y = ymin; y <= ymax; y++)
    358363        {
    359             attrset(dp->drv.p->attr[caca_attr_to_ansi(*cvattrs++)]);
    360             ncurses_write_utf32(*cvchars++);
     364            move(y, xmin);
     365            for(x = xmin; x <= xmax; x++)
     366            {
     367                attrset(dp->drv.p->attr[caca_attr_to_ansi(*cvattrs++)]);
     368                ncurses_write_utf32(*cvchars++);
     369            }
     370
     371            cvchars += dp->cv->width - (xmax - xmin) - 1;
     372            cvattrs += dp->cv->width - (xmax - xmin) - 1;
    361373        }
    362374    }
    363    
     375
    364376    x = caca_get_cursor_x(dp->cv);
    365377    y = caca_get_cursor_y(dp->cv);
  • libcaca/trunk/caca/driver/vga.c

    r2962 r3489  
    11/*
    22 *  libcaca       Colour ASCII-Art library
    3  *  Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
     3 *  Copyright (c) 2002-2009 Sam Hocevar <sam@hocevar.net>
    44 *                All Rights Reserved
    55 *
     
    115115static void vga_display(caca_display_t *dp)
    116116{
    117     char *screen = (char *)(intptr_t)0x000b8000;
    118     uint32_t const *cvchars = (uint32_t const *)caca_get_canvas_chars(dp->cv);
    119     uint32_t const *cvattrs = (uint32_t const *)caca_get_canvas_attrs(dp->cv);
    120     int width = caca_get_canvas_width(dp->cv);
    121     int height = caca_get_canvas_height(dp->cv);
    122     int n;
     117    int x, y, i;
    123118
    124     for(n = height * width; n--; )
     119    for(i = 0; i < caca_get_dirty_rectangle_count(dp->cv); i++)
    125120    {
    126         char ch = caca_utf32_to_cp437(*cvchars++);
    127         if(n && *cvchars == CACA_MAGIC_FULLWIDTH)
     121        char *screen = (char *)(intptr_t)0x000b8000;
     122        uint32_t const *cvchars, *cvattrs;
     123        int xmin, ymin, xmax, ymax;
     124
     125        caca_get_dirty_rectangle(dp->cv, i, &xmin, &ymin, &xmax, &ymax);
     126
     127        cvchars = (uint32_t const *)caca_get_canvas_chars(dp->cv)
     128                    + xmin + ymin * dp->cv->width;
     129        cvattrs = (uint32_t const *)caca_get_canvas_attrs(dp->cv)
     130                    + xmin + ymin * dp->cv->width;
     131
     132        screen += ymin * dp->cv->width + xmin;
     133
     134        for(y = ymin; y <= ymax; y++)
    128135        {
    129             *screen++ = '[';
    130             *screen++ = caca_attr_to_ansi(*cvattrs++);
    131             ch = ']';
    132             cvchars++;
    133             n--;
     136            for(x = xmin; x <= xmax; x++)
     137            {
     138                char ch = caca_utf32_to_cp437(*cvchars++);
     139                if(x < xmax && *cvchars == CACA_MAGIC_FULLWIDTH)
     140                {
     141                    *screen++ = '[';
     142                    *screen++ = caca_attr_to_ansi(*cvattrs++);
     143                    ch = ']';
     144                    cvchars++;
     145                    x++;
     146                }
     147                *screen++ = ch;
     148                *screen++ = caca_attr_to_ansi(*cvattrs++);
     149            }
     150
     151            cvchars += dp->cv->width - (xmax - xmin) - 1;
     152            cvattrs += dp->cv->width - (xmax - xmin) - 1;
     153            screen += 2 * (dp->cv->width - (xmax - xmin) - 1);
    134154        }
    135         *screen++ = ch;
    136         *screen++ = caca_attr_to_ansi(*cvattrs++);
    137155    }
    138156}
  • libcaca/trunk/caca/driver/win32.c

    r3412 r3489  
    11/*
    22 *  libcaca       Colour ASCII-Art library
    3  *  Copyright (c) 2002-2006 Sam Hocevar <sam@zoy.org>
     3 *  Copyright (c) 2002-2009 Sam Hocevar <sam@hocevar.net>
    44 *                All Rights Reserved
    55 *
     
    240240    WriteConsoleOutput(dp->drv.p->screen, dp->drv.p->buffer, size, pos, &rect);
    241241#else
     242    /* FIXME: would this benefit from dirty rectangles? */
    242243    WriteConsoleOutputW(dp->drv.p->screen, dp->drv.p->buffer, size, pos, &rect);
    243244#endif
Note: See TracChangeset for help on using the changeset viewer.