From d9800b153c9a217b5d9035ec49ab105dd598e6e4 Mon Sep 17 00:00:00 2001 From: ChunEon Park Date: Fri, 1 Jun 2012 13:34:39 +0900 Subject: [PATCH] evas/map - fixed afterimage problem. now we don't need work-around code anymore. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@71549 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 Conflicts: src/lib/canvas/evas_map.c src/lib/canvas/evas_object_smart.c --- src/lib/canvas/evas_map.c | 27 ++++++--------------------- src/lib/canvas/evas_object_image.c | 3 +-- src/lib/canvas/evas_object_line.c | 6 +++--- src/lib/canvas/evas_object_polygon.c | 6 +++--- src/lib/canvas/evas_object_rectangle.c | 6 +++--- src/lib/canvas/evas_object_smart.c | 19 +++++++++++++++++-- src/lib/canvas/evas_object_text.c | 7 +++---- src/lib/canvas/evas_object_textblock.c | 6 +++--- src/lib/canvas/evas_render.c | 5 ++--- 9 files changed, 41 insertions(+), 44 deletions(-) diff --git a/src/lib/canvas/evas_map.c b/src/lib/canvas/evas_map.c index 1d5fdd2..ac51425 100644 --- a/src/lib/canvas/evas_map.c +++ b/src/lib/canvas/evas_map.c @@ -392,14 +392,6 @@ evas_object_map_enable_set(Evas_Object *obj, Eina_Bool enabled) { _evas_map_calc_geom_change(obj); evas_object_mapped_clip_across_mark(obj); - //FIXME: Since the last frame is not updated when map is - //disabled, afterimage problem is happened in s/w rendering. - //Need to find out the fundamental reason then fix it. - evas_damage_rectangle_add(obj->layer->evas, - 0, - 0, - obj->layer->evas->output.w, - obj->layer->evas->output.h); } } _evas_map_calc_map_geometry(obj); @@ -449,6 +441,8 @@ evas_object_map_set(Evas_Object *obj, const Evas_Map *map) { if (obj->cur.map) { + obj->changed_map = EINA_TRUE; + if (obj->cur.map->surface) { obj->layer->evas->engine.func->image_map_surface_free @@ -469,29 +463,18 @@ evas_object_map_set(Evas_Object *obj, const Evas_Map *map) if (!obj->cur.usemap) _evas_map_calc_geom_change(obj); else _evas_map_calc_map_geometry(obj); if (obj->cur.usemap) - { - evas_object_mapped_clip_across_mark(obj); - //FIXME: Since the last frame is not updated when map is - //disabled, afterimage problem is happened in s/w - //rendering. Need to find out the fundamental reason - //then fix it. - evas_damage_rectangle_add(obj->layer->evas, - 0, - 0, - obj->layer->evas->output.w, - obj->layer->evas->output.h); - } + evas_object_mapped_clip_across_mark(obj); } return; } + // We do have the same exact count of point in this map, so just copy it if ((obj->cur.map) && (obj->cur.map->count == map->count)) { Evas_Map *omap = obj->cur.map; obj->cur.map = _evas_map_new(map->count); memcpy(obj->cur.map, omap, sizeof(Evas_Map) + (map->count * sizeof(Evas_Map_Point))); _evas_map_copy(obj->cur.map, map); - if (obj->prev.map == omap) obj->prev.map = NULL; free(omap); } else @@ -501,6 +484,8 @@ evas_object_map_set(Evas_Object *obj, const Evas_Map *map) if (obj->cur.usemap) evas_object_mapped_clip_across_mark(obj); } + obj->changed_map = EINA_TRUE; + _evas_map_calc_map_geometry(obj); } diff --git a/src/lib/canvas/evas_object_image.c b/src/lib/canvas/evas_object_image.c index 8ed75a0..a22902e 100755 --- a/src/lib/canvas/evas_object_image.c +++ b/src/lib/canvas/evas_object_image.c @@ -3246,8 +3246,7 @@ evas_object_image_render_pre(Evas_Object *obj) evas_object_render_pre_visible_change(&e->clip_changes, obj, is_v, was_v); if (!o->pixel_updates) goto done; } - if ((obj->cur.map != obj->prev.map) || - (obj->cur.usemap != obj->prev.usemap)) + if (obj->changed_map) { evas_object_render_pre_prev_cur_add(&e->clip_changes, obj); goto done; diff --git a/src/lib/canvas/evas_object_line.c b/src/lib/canvas/evas_object_line.c index b09a6e2..d7b0f9d 100644 --- a/src/lib/canvas/evas_object_line.c +++ b/src/lib/canvas/evas_object_line.c @@ -310,10 +310,10 @@ evas_object_line_render_pre(Evas_Object *obj) evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, obj, is_v, was_v); goto done; } - if ((obj->cur.map != obj->prev.map) || - (obj->cur.usemap != obj->prev.usemap)) + if (obj->changed_map) { - evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj); + evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, + obj); goto done; } /* it's not visible - we accounted for it appearing or not so just abort */ diff --git a/src/lib/canvas/evas_object_polygon.c b/src/lib/canvas/evas_object_polygon.c index cbc1802..41655c3 100644 --- a/src/lib/canvas/evas_object_polygon.c +++ b/src/lib/canvas/evas_object_polygon.c @@ -366,10 +366,10 @@ evas_object_polygon_render_pre(Evas_Object *obj) evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, obj, is_v, was_v); goto done; } - if ((obj->cur.map != obj->prev.map) || - (obj->cur.usemap != obj->prev.usemap)) + if (obj->changed_map) { - evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj); + evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, + obj); goto done; } /* it's not visible - we accounted for it appearing or not so just abort */ diff --git a/src/lib/canvas/evas_object_rectangle.c b/src/lib/canvas/evas_object_rectangle.c index 36678e7..a7ccf14 100644 --- a/src/lib/canvas/evas_object_rectangle.c +++ b/src/lib/canvas/evas_object_rectangle.c @@ -194,10 +194,10 @@ evas_object_rectangle_render_pre(Evas_Object *obj) evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, obj, is_v, was_v); goto done; } - if ((obj->cur.map != obj->prev.map) || - (obj->cur.usemap != obj->prev.usemap)) + if (obj->changed_map) { - evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj); + evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, + obj); goto done; } /* it's not visible - we accounted for it appearing or not so just abort */ diff --git a/src/lib/canvas/evas_object_smart.c b/src/lib/canvas/evas_object_smart.c index 4c1ed67..0506488 100644 --- a/src/lib/canvas/evas_object_smart.c +++ b/src/lib/canvas/evas_object_smart.c @@ -907,8 +907,23 @@ static void evas_object_smart_render_pre(Evas_Object *obj) { if (obj->pre_render_done) return; - if ((obj->cur.map != obj->prev.map) || - (obj->cur.usemap != obj->prev.usemap)) + if (!obj->child_has_map) + { +#if 0 + Evas_Object_Smart *o; + + o = (Evas_Object_Smart *)(obj->object_data); + if (o->member_count > 1 && + obj->cur.bounding_box.w == obj->prev.bounding_box.w && + obj->cur.bounding_box.h == obj->prev.bounding_box.h && + (obj->cur.bounding_box.x != obj->prev.bounding_box.x || + obj->cur.bounding_box.y != obj->prev.bounding_box.y)) + { + fprintf(stderr, "Wouhou, I can detect moving smart object (%s, %p < %p)\n", evas_object_type_get(obj), obj, obj->smart.parent); + } +#endif + } + if (obj->changed_map) evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj); obj->pre_render_done = EINA_TRUE; diff --git a/src/lib/canvas/evas_object_text.c b/src/lib/canvas/evas_object_text.c index dbe5e08..0e9f519 100644 --- a/src/lib/canvas/evas_object_text.c +++ b/src/lib/canvas/evas_object_text.c @@ -1700,11 +1700,10 @@ evas_object_text_render_pre(Evas_Object *obj) obj, is_v, was_v); goto done; } - if ((obj->cur.map != obj->prev.map) || - (obj->cur.usemap != obj->prev.usemap)) + if (obj->changed_map) { - evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, - obj); + evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, + obj); goto done; } /* its not visible - we accounted for it appearing or not so just abort */ diff --git a/src/lib/canvas/evas_object_textblock.c b/src/lib/canvas/evas_object_textblock.c index 8a56db1..578e1d0 100644 --- a/src/lib/canvas/evas_object_textblock.c +++ b/src/lib/canvas/evas_object_textblock.c @@ -9789,10 +9789,10 @@ evas_object_textblock_render_pre(Evas_Object *obj) evas_object_render_pre_visible_change(&obj->layer->evas->clip_changes, obj, is_v, was_v); goto done; } - if ((obj->cur.map != obj->prev.map) || - (obj->cur.usemap != obj->prev.usemap)) + if (obj->changed_map) { - evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, obj); + evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, + obj); goto done; } /* it's not visible - we accounted for it appearing or not so just abort */ diff --git a/src/lib/canvas/evas_render.c b/src/lib/canvas/evas_render.c index 1d626ac..54ba10c 100644 --- a/src/lib/canvas/evas_render.c +++ b/src/lib/canvas/evas_render.c @@ -318,7 +318,7 @@ _evas_render_phase1_object_process(Evas *e, Evas_Object *obj, } return clean_them; } - else if (_evas_render_had_map(obj)) + else if (hmap) { RDI(level); RD(" had map - restack objs\n"); @@ -1566,8 +1566,7 @@ evas_render_updates_internal(Evas *e, obj->restack = EINA_FALSE; evas_object_change_reset(obj); } - else if ((obj->cur.map != obj->prev.map) || - (obj->cur.usemap != obj->prev.usemap) || clean_them) + else if (clean_them) { RD(" OBJ [%p] post... func2\n", obj); obj->func->render_post(obj); -- 2.7.4