Mercurial > MadButterfly
diff src/redraw_man.c @ 896:ae86e03acb6d
Merge abs_n_rel_center
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Tue, 28 Sep 2010 17:28:13 +0800 |
parents | 8a2d676d9fa3 |
children | 960e2395973d |
line wrap: on
line diff
--- a/src/redraw_man.c Mon Sep 27 23:02:45 2010 +0800 +++ b/src/redraw_man.c Tue Sep 28 17:28:13 2010 +0800 @@ -612,6 +612,7 @@ coord_canvas_info_new(redraw_man_t *rdman, coord_t *coord, mbe_t *canvas) { coord_canvas_info_t *info; + static co_aix id[6] = {1, 0, 0, 0, 1, 0}; info = (coord_canvas_info_t *)elmpool_elm_alloc(rdman->coord_canvas_pool); if(info == NULL) @@ -624,6 +625,10 @@ bzero(info->pcache_areas, sizeof(area_t) * 2); info->pcache_cur_area = &info->pcache_areas[0]; info->pcache_last_area = &info->pcache_areas[1]; + memcpy(info->cache_2_pdev, id, sizeof(co_aix) * 6); + memcpy(info->cache_2_pdev_rev, id, sizeof(co_aix) * 6); + memcpy(info->aggr_2_pdev, id, sizeof(co_aix) * 6); + memcpy(info->aggr_2_pdev_rev, id, sizeof(co_aix) * 6); return info; } @@ -1310,8 +1315,8 @@ /* \brief Compute matrix from cached canvas to parent device space. */ -static void compute_cached_2_pdev_matrix(coord_t *coord, - co_aix canvas2pdev_matrix[6]) { +static void compute_cached_2_pdev_matrix(coord_t *coord) { + co_aix *canvas2pdev_matrix = coord_get_2pdev(coord); coord_t *parent; co_aix *aggr; co_aix *matrix, *paggr; @@ -1337,6 +1342,8 @@ canvas2p[5] = shift_y; matrix_mul(paggr, canvas2p, canvas2pdev_matrix); + + compute_reverse(canvas2pdev_matrix, coord_get_2pdev_rev(coord)); } /*! \brief Compute area in parent cached coord for a cached coord. @@ -1351,7 +1358,7 @@ * ancestral cached coord. */ static void compute_pcache_area(coord_t *coord) { - co_aix cached2pdev[6]; + co_aix *cached2pdev = coord_get_2pdev(coord); int c_w, c_h; canvas_t *canvas; coord_canvas_info_t *canvas_info; @@ -1360,7 +1367,6 @@ canvas_info = coord->canvas_info; SWAP(canvas_info->pcache_cur_area, canvas_info->pcache_last_area, area_t *); - compute_cached_2_pdev_matrix(coord, cached2pdev); canvas = _coord_get_canvas(coord); canvas_get_size(canvas, &c_w, &c_h); @@ -1766,6 +1772,7 @@ coord = all_zeroing->ds[i]; if(coord_is_zeroing(coord)) zeroing_coord(rdman, coord); + compute_cached_2_pdev_matrix(coord); /* This is required by ancester cached ones to perform * zeroing. */ @@ -1775,6 +1782,34 @@ return OK; } +/*! \brief Update aggregated cache_2_pdev matrix for cached coords. + * + * This is perfromed from root to leaves. Aggregated cache_2_pdev is + * named as aggr_2_pdev field of canvas_info_t. It is the matrix to + * transform a point from space of a cached coord to the space of root + * coord. + */ +static int +update_aggr_pdev(redraw_man_t *rdman) { + int i; + coords_t *all_zeroing; + coord_t *coord, *parent_cached; + + all_zeroing = &rdman->zeroing_coords; + for(i = 0; i < all_zeroing->num; i++) { + coord = all_zeroing->ds[i]; + parent_cached = coord_get_cached(coord_get_parent(coord)); + matrix_mul(coord_get_2pdev(parent_cached), + coord_get_2pdev(coord), + coord_get_aggr2pdev(coord)); + matrix_mul(coord_get_2pdev_rev(coord), + coord_get_2pdev_rev(parent_cached), + coord_get_aggr2pdev_rev(coord)); + } + + return OK; +} + /*! \brief Add aggregated dirty areas to ancestor. * * Dirty areas are aggregated into two areas. It assumes that even or odd @@ -1786,7 +1821,7 @@ int i; int n_areas; co_aix poses0[2][2], poses1[2][2]; - co_aix canvas2pdev_matrix[6]; + co_aix *canvas2pdev_matrix; area_t **areas, *area; area_t *area0, *area1; coord_t *parent, *pcached_coord; @@ -1863,7 +1898,7 @@ parent = coord_get_parent(coord); pcached_coord = coord_get_cached(parent); - compute_cached_2_pdev_matrix(coord, canvas2pdev_matrix); + canvas2pdev_matrix = coord_get_2pdev(coord); /* Add dirty areas to parent cached coord. */ matrix_trans_pos(canvas2pdev_matrix, poses0[0], poses0[0] + 1); @@ -2032,6 +2067,10 @@ if(r != OK) return ERR; + r = update_aggr_pdev(rdman); + if(r != OK) + return ERR; + /* * Clear all flags setted by zeroing. */ @@ -2129,7 +2168,7 @@ fill = shape->fill; if(shape->fill) { - fill->prepare(fill, cr); + fill->prepare(fill, cr, shape); if(shape->stroke) fill_path_preserve(rdman, cr); else @@ -2138,7 +2177,7 @@ stroke = shape->stroke; if(stroke) { - stroke->prepare(stroke, cr); + stroke->prepare(stroke, cr, shape); set_shape_stroke_param(shape, cr); stroke_path(rdman, cr); } @@ -2209,22 +2248,20 @@ static void update_cached_canvas_2_parent(redraw_man_t *rdman, coord_t *coord) { mbe_t *pcanvas, *canvas; - co_aix reverse[6]; - co_aix canvas2pdev_matrix[6]; + co_aix *c2pdev_reverse; if(coord_is_root(coord)) return; - compute_cached_2_pdev_matrix(coord, canvas2pdev_matrix); - compute_reverse(canvas2pdev_matrix, reverse); + c2pdev_reverse = coord_get_2pdev_rev(coord); canvas = _coord_get_canvas(coord); pcanvas = _coord_get_canvas(coord->parent); #ifndef UNITTEST - _update_cached_canvas_2_parent(rdman, reverse, canvas, pcanvas, + _update_cached_canvas_2_parent(rdman, c2pdev_reverse, canvas, pcanvas, coord->opacity); #else - memcpy(((mock_mbe_t *)canvas)->parent_2_cache, reverse, + memcpy(((mock_mbe_t *)canvas)->parent_2_cache, c2pdev_reverse, sizeof(co_aix) * 6); #endif } @@ -2344,8 +2381,10 @@ draw_dirty_cached_coord(rdman, coord); coord_set_flags(coord, COF_TEMP_MARK); } - for(i = 0; i < num; i++) + for(i = 0; i < num; i++) { + coord = zeroings[i]; coord_clear_flags(coord, COF_TEMP_MARK); + } draw_dirty_cached_coord(rdman, rdman->root_coord); }