Mercurial > MadButterfly
changeset 850:33fd5fdc8b48 abs_n_rel_center
Keep cache to parent device matrix in canvas_info.
This can avoid to compute matrix repeatly.
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Mon, 20 Sep 2010 22:43:43 +0800 |
parents | dfe28355bded |
children | 85f22a771e4a |
files | include/mb_types.h src/redraw_man.c |
diffstat | 2 files changed, 17 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/include/mb_types.h Sun Sep 19 19:28:33 2010 +0800 +++ b/include/mb_types.h Mon Sep 20 22:43:43 2010 +0800 @@ -175,6 +175,9 @@ * cached. */ area_t *pcache_cur_area; /*!< Current area for parent cached. */ area_t *pcache_last_area; /*!< Last area for parent cached. */ + co_aix cache_2_pdev[6]; /*!< Transfrom matrix from space of + * cached one to its parent. */ + co_aix cache_2_pdev_rev[6]; /*!< Reverse of cache_2_pdev. */ } coord_canvas_info_t; /*! \brief A coordination system. @@ -367,6 +370,8 @@ #define _coord_get_dirty_areas(coord) (&(coord)->canvas_info->dirty_areas) #define _coord_get_aggr_dirty_areas(coord) \ ((coord)->canvas_info->aggr_dirty_areas) +#define coord_get_2pdev(coord) ((coord)->canvas_info->cache_2_pdev) +#define coord_get_2pdev_rev(coord) ((coord)->canvas_info->cache_2_pdev_rev) /* @} */
--- a/src/redraw_man.c Sun Sep 19 19:28:33 2010 +0800 +++ b/src/redraw_man.c Mon Sep 20 22:43:43 2010 +0800 @@ -1285,8 +1285,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; @@ -1312,6 +1312,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. @@ -1326,7 +1328,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; @@ -1335,7 +1337,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); @@ -1740,6 +1741,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. */ @@ -1760,7 +1762,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; @@ -1837,7 +1839,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); @@ -2183,22 +2185,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 }