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

Add dirty rectangle support to the ncurses and VGA drivers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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}
Note: See TracChangeset for help on using the changeset viewer.