evas/map - fixed afterimage problem. now we don't need work-around code anymore.
authorChunEon Park <chuneon.park@samsung.com>
Fri, 1 Jun 2012 04:34:39 +0000 (13:34 +0900)
committerChunEon Park <chuneon.park@samsung.com>
Fri, 1 Jun 2012 04:34:39 +0000 (13:34 +0900)
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
src/lib/canvas/evas_object_image.c
src/lib/canvas/evas_object_line.c
src/lib/canvas/evas_object_polygon.c
src/lib/canvas/evas_object_rectangle.c
src/lib/canvas/evas_object_smart.c
src/lib/canvas/evas_object_text.c
src/lib/canvas/evas_object_textblock.c
src/lib/canvas/evas_render.c

index 1d5fdd2..ac51425 100644 (file)
@@ -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);
 }
 
index 8ed75a0..a22902e 100755 (executable)
@@ -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;
index b09a6e2..d7b0f9d 100644 (file)
@@ -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 */
index cbc1802..41655c3 100644 (file)
@@ -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 */
index 36678e7..a7ccf14 100644 (file)
@@ -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 */
index 4c1ed67..0506488 100644 (file)
@@ -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;
index dbe5e08..0e9f519 100644 (file)
@@ -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 */
index 8a56db1..578e1d0 100644 (file)
@@ -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 */
index 1d626ac..54ba10c 100644 (file)
@@ -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);