Ignore:
Timestamp:
May 14, 2009, 2:18:23 AM (11 years ago)
Author:
Sam Hocevar
Message:

Finish the dirty rectangle architecture. They are now reliable in the sense
that anything outside the dirty rectangle is guaranteed to be unchanged, but
we currently mark far too many cells as dirty. This must be optimised.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/string.c

    r2826 r3448  
    113113{
    114114    uint32_t *curchar, *curattr, attr;
    115     int fullwidth;
     115    int fullwidth, xmin, xmax;
    116116
    117117    if(x >= (int)cv->width || y < 0 || y >= (int)cv->height)
     
    136136    attr = cv->curattr;
    137137
     138    xmin = xmax = x;
     139
    138140    /* When overwriting the right part of a fullwidth character,
    139141     * replace its left part with a space. */
    140142    if(x && curchar[0] == CACA_MAGIC_FULLWIDTH)
     143    {
    141144        curchar[-1] = ' ';
     145        xmin--;
     146    }
    142147
    143148    if(fullwidth)
     
    147152        else
    148153        {
     154            xmax++;
     155
    149156            /* When overwriting the left part of a fullwidth character,
    150157             * replace its right part with a space. */
    151158            if(x + 2 < (int)cv->width && curchar[2] == CACA_MAGIC_FULLWIDTH)
     159            {
    152160                curchar[2] = ' ';
     161                xmax++;
     162            }
    153163
    154164            curchar[1] = CACA_MAGIC_FULLWIDTH;
     
    163173            curchar[1] = ' ';
    164174    }
     175
     176    caca_add_dirty_rectangle(cv, xmin, xmax, y, y);
    165177
    166178    curchar[0] = ch;
     
    308320    }
    309321
     322    caca_set_dirty_rectangle(cv, 0, 0, cv->width - 1, cv->height - 1);
     323
    310324    return 0;
    311325}
     
    376390 */
    377391int caca_blit(caca_canvas_t *dst, int x, int y,
    378                caca_canvas_t const *src, caca_canvas_t const *mask)
    379 {
    380     int i, j, starti, startj, endi, endj;
     392              caca_canvas_t const *src, caca_canvas_t const *mask)
     393{
     394    int i, j, starti, startj, endi, endj, stride, bleed_left, bleed_right;
    381395
    382396    if(mask && (src->width != mask->width || src->height != mask->height))
     
    393407    endi = (x + src->width >= dst->width) ? dst->width - x : src->width;
    394408    endj = (y + src->height >= dst->height) ? dst->height - y : src->height;
     409    stride = endi - starti;
    395410
    396411    if(starti > src->width || startj > src->height
     
    398413        return 0;
    399414
     415    bleed_left = bleed_right = 0;
     416
    400417    for(j = startj; j < endj; j++)
    401418    {
    402419        int dstix = (j + y) * dst->width + starti + x;
    403420        int srcix = j * src->width + starti;
    404         int stride = endi - starti;
    405421
    406422        /* FIXME: we are ignoring the mask here */
    407423        if((starti + x) && dst->chars[dstix] == CACA_MAGIC_FULLWIDTH)
     424        {
    408425            dst->chars[dstix - 1] = ' ';
     426            bleed_left = 1;
     427        }
    409428
    410429        if(endi + x < dst->width
    411430                && dst->chars[dstix + stride] == CACA_MAGIC_FULLWIDTH)
     431        {
    412432            dst->chars[dstix + stride] = ' ';
     433            bleed_right = 1;
     434        }
    413435
    414436        if(mask)
     
    437459    }
    438460
     461    caca_add_dirty_rectangle(dst, starti + x - bleed_left, startj + y,
     462                             endi + x - 1 + bleed_right, endj + y - 1);
     463
    439464    return 0;
    440465}
     
    499524    caca_set_frame(cv, saved_f);
    500525    _caca_load_frame_info(cv);
     526
     527    /* FIXME: this may be optimised somewhat */
     528    caca_set_dirty_rectangle(cv, 0, 0, cv->width - 1, cv->height - 1);
    501529
    502530    return 0;
Note: See TracChangeset for help on using the changeset viewer.