evas/map: Consider framespace offset when populating map points.
authorRafael Antognolli <rafael.antognolli@linux.intel.com>
Sun, 31 Mar 2013 19:15:53 +0000 (16:15 -0300)
committerRafael Antognolli <rafael.antognolli@linux.intel.com>
Tue, 2 Apr 2013 17:40:00 +0000 (14:40 -0300)
Since the objects are moved by the framespace offset, it must be
considered when populating map points. This is done when the map is
applied to an object (the map points are updated with the framespace
offset of the canvas that is parent of that object.

Additionally, a flag is set on the map struct to indicate that it had
its points updated already to avoid re-adding the offset.

src/lib/evas/canvas/evas_map.c
src/lib/evas/include/evas_private.h

index 5f0526367651f88def0bda83f5c32f314c8bf568..2b31ffc97aa203c5902481018682a9d3ce855709 100644 (file)
@@ -153,6 +153,7 @@ _evas_map_copy(Evas_Map *dst, const Evas_Map *src)
    dst->smooth = src->smooth;
    dst->alpha = src->alpha;
    dst->persp = src->persp;
+   dst->offset_applied = src->offset_applied;
    return EINA_TRUE;
 }
 
@@ -165,6 +166,7 @@ _evas_map_dup(const Evas_Map *orig)
    copy->smooth = orig->smooth;
    copy->alpha = orig->alpha;
    copy->persp = orig->persp;
+   copy->offset_applied = orig->offset_applied;
    return copy;
 }
 
@@ -535,6 +537,31 @@ evas_object_map_set(Evas_Object *eo_obj, const Evas_Map *map)
    eo_do(eo_obj, evas_obj_map_set(map));
 }
 
+static void
+_evas_map_coord_offset_update(Eo *eo_obj, Evas_Object_Protected_Data *obj, Evas_Map *m)
+{
+   Evas_Public_Data *evas;
+   Evas_Map_Point *p, *p_end;
+
+   if (m->offset_applied)
+     return;
+
+   evas = obj->layer->evas;
+
+   if (obj->is_frame || (eo_obj == evas->framespace.clip))
+     return;
+
+   p = m->points;
+   p_end = p + m->count;
+   for (; p < p_end; p++)
+     {
+        p->x += evas->framespace.x;
+        p->px += evas->framespace.x;
+        p->y += evas->framespace.y;
+        p->py += evas->framespace.y;
+     }
+}
+
 void
 _map_set(Eo *eo_obj, void *_pd, va_list *list)
 {
@@ -615,12 +642,18 @@ _map_set(Eo *eo_obj, void *_pd, va_list *list)
 
    // We do have the same exact count of point in this map, so just copy it
    if ((obj->map->cur.map) && (obj->map->cur.map->count == map->count))
-     _evas_map_copy(obj->map->cur.map, map);
+     {
+        _evas_map_copy(obj->map->cur.map, map);
+        _evas_map_coord_offset_update(eo_obj, obj, obj->map->cur.map);
+     }
    else
      {
+        Evas_Map *m;
         if (obj->map->cur.map) _evas_map_free(eo_obj, obj->map->cur.map);
+        m = _evas_map_dup(map);
+        _evas_map_coord_offset_update(eo_obj, obj, m);
         EINA_COW_WRITE_BEGIN(evas_object_map_cow, obj->map, Evas_Object_Map_Data, map_write)
-          map_write->cur.map = _evas_map_dup(map);
+          map_write->cur.map = m;
         EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write);
         if (obj->map->cur.usemap)
            evas_object_mapped_clip_across_mark(eo_obj, obj);
@@ -859,6 +892,7 @@ evas_map_util_points_populate_from_object_full(Evas_Map *m, const Evas_Object *e
 EAPI void
 evas_map_util_points_populate_from_object(Evas_Map *m, const Evas_Object *eo_obj)
 {
+   Evas_Coord x, y, w, h;
    MAGIC_CHECK(m, Evas_Map, MAGIC_MAP);
    return;
    MAGIC_CHECK_END();
@@ -874,8 +908,9 @@ evas_map_util_points_populate_from_object(Evas_Map *m, const Evas_Object *eo_obj
         ERR("map has count=%d where 4 was expected.", m->count);
         return;
      }
-   _evas_map_util_points_populate(m, obj->cur->geometry.x, obj->cur->geometry.y,
-                                  obj->cur->geometry.w, obj->cur->geometry.h, 0);
+
+   evas_object_geometry_get(eo_obj, &x, &y, &w, &h);
+   _evas_map_util_points_populate(m, x, y, w, h, 0);
 }
 
 EAPI void
index e3270b99003013dafd9429fe5a9be1db44392eda..82443319a813845b6976c331c4b8e4812b0e3a5a 100644 (file)
@@ -499,6 +499,7 @@ struct _Evas_Map
    } persp;
    Eina_Bool             alpha : 1;
    Eina_Bool             smooth : 1;
+   Eina_Bool             offset_applied : 1; // whether the framespace offset was applied already or not.
    Evas_Map_Point        points[]; // actual points
 };