Mercurial > MadButterfly
diff src/redraw_man.c @ 14:d34232f15863
-
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Thu, 31 Jul 2008 17:43:20 +0800 |
parents | ed55009d96d3 |
children | c2ce186a5c37 |
line wrap: on
line diff
--- a/src/redraw_man.c Thu Jul 31 08:10:00 2008 +0800 +++ b/src/redraw_man.c Thu Jul 31 17:43:20 2008 +0800 @@ -41,8 +41,8 @@ elmpool_free(rdman->geo_pool); if(rdman->dirty_coords) free(rdman->dirty_coords); - if(rdman->redrawing_geos) - free(rdman->redrawing_geos); + if(rdman->dirty_geos) + free(rdman->dirty_geos); } @@ -215,20 +215,20 @@ } static int add_dirty_geo(redraw_man_t *rdman, geo_t *geo) { - int max_redrawing_geos; + int max_dirty_geos; int r; - if(rdman->n_redrawing_geos >= rdman->max_redrawing_geos) { - max_redrawing_geos = rdman->n_geos + rdman->n_coords; - r = extend_memblk((void **)&rdman->redrawing_geos, - sizeof(geo_t *) * rdman->n_redrawing_geos, - sizeof(geo_t *) * max_redrawing_geos); + if(rdman->n_dirty_geos >= rdman->max_dirty_geos) { + max_dirty_geos = rdman->n_geos; + r = extend_memblk((void **)&rdman->dirty_geos, + sizeof(geo_t *) * rdman->n_dirty_geos, + sizeof(geo_t *) * max_dirty_geos); if(r != OK) return ERR; - rdman->max_redrawing_geos = max_redrawing_geos; + rdman->max_dirty_geos = max_dirty_geos; } - rdman->redrawing_geos[rdman->n_redrawing_geos++] = geo; + rdman->dirty_geos[rdman->n_dirty_geos++] = geo; return OK; } @@ -281,7 +281,7 @@ /*! \brief Mark a shape is changed. * * The geo_t object of a changed shape is mark as dirty and - * put into redrawing_geos list. + * put into dirty_geos list. */ int rdman_shape_changed(redraw_man_t *rdman, shape_t *shape) { geo_t *geo; @@ -331,13 +331,17 @@ } } -static void compute_coord_geo(coord_t *coord) { +static void compute_coord_area(coord_t *coord) { +} + +static void update_shape_geo(shape_t *shape) { } -static void transform_shape(shape_t *shape) { +static void draw_shape(redraw_man_t *rdman, shape_t *shape) { } -static void draw_shape(shape_t *shape) { +static void clip_and_show(redraw_man_t *rdman, int n_dirty_areas, + area_t **dirty_areas) { } /*! \brief Re-draw all changed shapes or shapes affected by changed coords. @@ -356,26 +360,32 @@ * * steps: * - update chagned coord objects - * - recompute geo for changed coord objects + * - recompute area for changed coord objects * - recompute geo for members shape objects + * - clear dirty of geo for members to prevent from + * recomputing for change of shape objects. + * - add old and new area value to list of dirty areas. * - recompute geo for changed shape objects - * - finding overlaid shape objects for recomputed geo objects. - * - overlaid shape objects is invoked by traveling tree of coord. - * - members of changed coord object are marked computed and dirty. + * - only if a shape object is dirty. + * - put new and old value of area of geo to list of dirty areas. + * - Scan all shapes and redraw shapes overlaid with dirty areas. * - * assert(n_redrawing_geos <= (num_of(shape) + num_of(coord))) + * dirty flag of coord objects is cleared after update. + * + * assert(n_dirty_geos <= (num_of(shape) + num_of(coord))) * Because * - num_of(geo from coord) < num_of(coord) * - num_of(geo from shape) < num_of(shape) */ int rdman_redraw_changed(redraw_man_t *rdman) { - int i, j; + int i; int n_dirty_coords; coord_t **dirty_coords; coord_t *visit_coord; - geo_t *visit_geo, **redrawing_geos; - int n_redrawing_geos; + geo_t *visit_geo, **dirty_geos; + int n_dirty_geos; int n_dirty_areas; + area_t **dirty_areas; if(rdman->n_dirty_coords > 0) { _insert_sort((void **)rdman->dirty_coords, @@ -395,10 +405,9 @@ /* Dirty member, here, and members of this coord * will not be visited anymore. */ visit_coord->flags &= ~COF_DIRTY; - visit_coord->flags |= COF_RECOMP; SWAP(visit_coord->cur_area, visit_coord->last_area, area_t *); - compute_coord_geo(visit_coord); + compute_coord_area(visit_coord); add_dirty_area(rdman, visit_coord->cur_area); add_dirty_area(rdman, visit_coord->last_area); make_redrawing_members(rdman, visit_coord); @@ -407,29 +416,35 @@ rdman->n_dirty_coords = 0; } - n_redrawing_geos = rdman->n_redrawing_geos; - if(n_redrawing_geos > 0) { - redrawing_geos = rdman->redrawing_geos; - for(i = 0; i < n_redrawing_geos; i++) { - visit_geo = redrawing_geos[i]; + n_dirty_geos = rdman->n_dirty_geos; + if(n_dirty_geos > 0) { + dirty_geos = rdman->dirty_geos; + for(i = 0; i < n_dirty_geos; i++) { + visit_geo = dirty_geos[i]; if(!(visit_geo->flags & GEF_DIRTY)) continue; + visit_geo->flags &= ~GEF_DIRTY; SWAP(visit_geo->cur_area, visit_geo->last_area, area_t *); - transform_shape(visit_geo->shape); - visit_geo->flags &= ~GEF_DIRTY; + update_shape_geo(visit_geo->shape); add_dirty_area(rdman, visit_geo->cur_area); add_dirty_area(rdman, visit_geo->last_area); } n_dirty_areas = rdman->n_dirty_areas; + dirty_areas = rdman->dirty_areas; for(visit_geo = STAILQ_HEAD(rdman->all_geos); visit_geo != NULL; visit_geo = STAILQ_NEXT(geo_t, next, visit_geo)) { - if(visit_geo->flags & GEF_DIRTY) - continue; - + for(i = 0; i < n_dirty_areas; i++) { + if(is_overlay(visit_geo->cur_area, + dirty_areas[i])) { + draw_shape(rdman, visit_geo->shape); + break; + } + } } + clip_and_show(rdman, n_dirty_areas, dirty_areas); } return OK;