# HG changeset patch # User Thinker K.F. Li # Date 1274689645 -28800 # Node ID ce11e889ea4e83e3ed8dfeb7924e46772e0927a6 # Parent a1d49b6355c3054190d745ff01f80728eb54ebb6 Simplify dirty area for coords that should be totally redraw diff -r a1d49b6355c3 -r ce11e889ea4e src/redraw_man.c --- a/src/redraw_man.c Mon May 24 11:59:27 2010 +0800 +++ b/src/redraw_man.c Mon May 24 16:27:25 2010 +0800 @@ -1989,7 +1989,7 @@ return ERR; /* - * Clear all flags setted by this function + * Clear all flags setted by zeroing. */ coords = rdman->dirty_coords.ds; for(i = 0; i < rdman->dirty_coords.num; i++) @@ -2216,11 +2216,28 @@ static int draw_dirty_cached_coord(redraw_man_t *rdman, coord_t *coord) { area_t **areas, *area; + area_t full_area; int n_areas; mbe_t *canvas; + mbe_surface_t *surface; int i; int r; + canvas = _coord_get_canvas(coord); + + if(IS_CACHE_REDRAW_ALL(coord)) { + /* + * full_area covers all dirty areas of the cached coord. + */ + DARRAY_CLEAN(_coord_get_dirty_areas(coord)); + surface = mbe_get_target(canvas); + full_area.x = 0; + full_area.y = 0; + full_area.w = mbe_image_surface_get_width(surface); + full_area.h = mbe_image_surface_get_height(surface); + add_dirty_area(rdman, coord, &full_area); + } + areas = _coord_get_dirty_areas(coord)->ds; n_areas = _coord_get_dirty_areas(coord)->num; @@ -2232,7 +2249,6 @@ area->h = ceilf(area->h); } - canvas = _coord_get_canvas(coord); make_clip(canvas, n_areas, areas); clear_canvas(canvas); @@ -2251,10 +2267,18 @@ zeroings = rdman->zeroing_coords.ds; num = rdman->zeroing_coords.num; + /* Draw cached ones from leaves to root. + * Since content of cached ones depend on descendants. + */ for(i = num - 1; i >= 0; i--) { coord = zeroings[i]; + if(coord_get_flags(coord, COF_TEMP_MARK)) + continue; draw_dirty_cached_coord(rdman, coord); + coord_set_flags(coord, COF_TEMP_MARK); } + for(i = 0; i < num; i++) + coord_clear_flags(coord, COF_TEMP_MARK); draw_dirty_cached_coord(rdman, rdman->root_coord); } @@ -2322,13 +2346,6 @@ rdman->n_dirty_areas = 0; } - /* clear COF_MUST_ZEROING flag for coords */ - coords = rdman->zeroing_coords.ds; - for(i = 0; i < rdman->zeroing_coords.num; i++) { - coord = coords[i]; - coord_clear_flags(coord, COF_MUST_ZEROING); - } - DARRAY_CLEAN(&rdman->dirty_coords); DARRAY_CLEAN(&rdman->dirty_geos); DARRAY_CLEAN(&rdman->zeroing_coords);