Changeset 3556


Ignore:
Timestamp:
07/19/09 22:37:12 (4 years ago)
Author:
pterjan
Message:
  • When blitting, only add dirty rectangles on changed lines, or on changed chars if we have a mask
Location:
libcaca/trunk
Files:
2 edited

Legend:

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

    r3554 r3556  
    449449                    continue; 
    450450 
    451                 dst->chars[dstix + i] = src->chars[srcix + i]; 
    452                 dst->attrs[dstix + i] = src->attrs[srcix + i]; 
     451                if(dst->chars[dstix + i] != src->chars[srcix + i] || 
     452                   dst->attrs[dstix + i] != src->attrs[srcix + i]) 
     453                { 
     454                    dst->chars[dstix + i] = src->chars[srcix + i]; 
     455                    dst->attrs[dstix + i] = src->attrs[srcix + i]; 
     456                    caca_add_dirty_rect(dst, x + starti + i, y + j, 1, 1); 
     457                } 
    453458            } 
    454459        } 
    455460        else 
    456461        { 
    457             memcpy(dst->chars + dstix, src->chars + srcix, stride * 4); 
    458             memcpy(dst->attrs + dstix, src->attrs + srcix, stride * 4); 
     462            if(memcmp(dst->chars + dstix, src->chars + srcix, stride * 4) || 
     463               memcmp(dst->attrs + dstix, src->attrs + srcix, stride * 4)) 
     464            { 
     465                /* FIXME be more precise ? */ 
     466                memcpy(dst->chars + dstix, src->chars + srcix, stride * 4); 
     467                memcpy(dst->attrs + dstix, src->attrs + srcix, stride * 4); 
     468                caca_add_dirty_rect(dst, x + starti, y + j, stride, 1); 
     469            } 
    459470        } 
    460471 
     
    467478    } 
    468479 
    469     caca_add_dirty_rect(dst, starti + x - bleed_left, startj + y, 
    470                         endi - starti + bleed_left + bleed_right, 
    471                         endj - startj); 
    472480 
    473481    return 0; 
  • libcaca/trunk/tests/dirty.cpp

    r3513 r3556  
    2929    CPPUNIT_TEST(test_put_char_not_dirty); 
    3030    CPPUNIT_TEST(test_box); 
     31    CPPUNIT_TEST(test_blit); 
    3132    CPPUNIT_TEST_SUITE_END(); 
    3233 
     
    186187    } 
    187188 
     189    void test_blit() 
     190    { 
     191        caca_canvas_t *cv, *cv2; 
     192        int i, dx, dy, dw, dh; 
     193 
     194        cv = caca_create_canvas(WIDTH, HEIGHT); 
     195        caca_clear_dirty_rect_list(cv); 
     196        cv2 = caca_create_canvas(2, 2); 
     197        caca_fill_box(cv2, 0, 0, 2, 1, 'x'); 
     198 
     199        caca_blit(cv, 1, 1, cv2, NULL); 
     200        i = caca_get_dirty_rect_count(cv); 
     201        CPPUNIT_ASSERT_EQUAL(i, 1); 
     202        caca_get_dirty_rect(cv, 0, &dx, &dy, &dw, &dh); 
     203 
     204        /* Check that blitting a canvas make a dirty rectangle 
     205         * only for modified lines */ 
     206        CPPUNIT_ASSERT(dx == 1); 
     207        CPPUNIT_ASSERT(dy == 1); 
     208        CPPUNIT_ASSERT(dw >= 2); 
     209        CPPUNIT_ASSERT(dh == 1); 
     210    } 
     211 
    188212private: 
    189213    static int const WIDTH = 80, HEIGHT = 50; 
Note: See TracChangeset for help on using the changeset viewer.