evas: use Eina_Cow a lot more and we are closer to the memory size of 1.7.

This commit is contained in:
Cedric BAIL 2013-03-12 21:58:19 +09:00
parent b7221512d5
commit d79a2efa39
19 changed files with 1362 additions and 1177 deletions

View File

@ -6,11 +6,16 @@ evas_object_clip_dirty(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Da
{ {
Eina_List *l; Eina_List *l;
Evas_Object *data; Evas_Object *data;
if (obj->cur.cache.clip.dirty) return;
obj->cur.cache.clip.dirty = EINA_TRUE;
Evas_Object_Protected_Data *clipee = NULL; Evas_Object_Protected_Data *clipee = NULL;
if (obj->cur->cache.clip.dirty) return;
EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->cache.clip.dirty = EINA_TRUE;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
EINA_LIST_FOREACH(obj->clip.clipees, l, data) EINA_LIST_FOREACH(obj->clip.clipees, l, data)
{ {
clipee = eo_data_get(data, EVAS_OBJ_CLASS); clipee = eo_data_get(data, EVAS_OBJ_CLASS);
@ -24,7 +29,7 @@ evas_object_recalc_clippees(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj
Eina_List *l; Eina_List *l;
Evas_Object *data; Evas_Object *data;
if (obj->cur.cache.clip.dirty) if (obj->cur->cache.clip.dirty)
{ {
evas_object_clip_recalc(eo_obj, obj); evas_object_clip_recalc(eo_obj, obj);
EINA_LIST_FOREACH(obj->clip.clipees, l, data) EINA_LIST_FOREACH(obj->clip.clipees, l, data)
@ -38,11 +43,11 @@ evas_object_recalc_clippees(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj
int int
evas_object_clippers_was_visible(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj) evas_object_clippers_was_visible(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj)
{ {
if (obj->prev.visible) if (obj->prev->visible)
{ {
if (obj->prev.clipper) if (obj->prev->clipper)
{ {
return evas_object_clippers_is_visible(obj->prev.eo_clipper, obj->prev.clipper); return evas_object_clippers_is_visible(obj->prev->eo_clipper, obj->prev->clipper);
} }
return 1; return 1;
} }
@ -94,7 +99,12 @@ evas_object_child_map_across_mark(Evas_Object *eo_obj, Evas_Object_Protected_Dat
map_write->cur.map_parent = map_obj; map_write->cur.map_parent = map_obj;
EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write); EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write);
obj->cur.cache.clip.dirty = 1; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->cache.clip.dirty = 1;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_clip_recalc(eo_obj, obj); evas_object_clip_recalc(eo_obj, obj);
if (obj->is_smart) if (obj->is_smart)
{ {
@ -127,8 +137,8 @@ void
evas_object_clip_across_check(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) evas_object_clip_across_check(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{ {
#ifdef MAP_ACROSS #ifdef MAP_ACROSS
if (!obj->cur.clipper) return; if (!obj->cur->clipper) return;
if (obj->cur.clipper->map->cur.map_parent != obj->map->cur.map_parent) if (obj->cur->clipper->map->cur.map_parent != obj->map->cur.map_parent)
evas_object_child_map_across_mark(eo_obj, obj, obj->map->cur.map_parent, 1); evas_object_child_map_across_mark(eo_obj, obj, obj->map->cur.map_parent, 1);
#endif #endif
} }
@ -145,7 +155,7 @@ evas_object_clip_across_clippees_check(Evas_Object *eo_obj, Evas_Object_Protecte
// evas_object_child_map_across_mark(eo_obj, obj->map->cur.map_parent, 1); // evas_object_child_map_across_mark(eo_obj, obj->map->cur.map_parent, 1);
// buggy: // buggy:
evas_object_child_map_across_mark(eo_obj, obj, obj->map->cur.map_parent, 0); evas_object_child_map_across_mark(eo_obj, obj, obj->map->cur.map_parent, 0);
if (obj->cur.cache.clip.dirty) if (obj->cur->cache.clip.dirty)
{ {
EINA_LIST_FOREACH(obj->clip.clipees, l, eo_obj2) EINA_LIST_FOREACH(obj->clip.clipees, l, eo_obj2)
{ {
@ -213,7 +223,7 @@ _clip_set(Eo *eo_obj, void *_pd, va_list *list)
MAGIC_CHECK_END(); MAGIC_CHECK_END();
clip = eo_data_get(eo_clip, EVAS_OBJ_CLASS); clip = eo_data_get(eo_clip, EVAS_OBJ_CLASS);
if (obj->cur.eo_clipper == eo_clip) return; if (obj->cur->eo_clipper == eo_clip) return;
if (eo_obj == eo_clip) if (eo_obj == eo_clip)
{ {
CRIT("Setting clip %p on itself", eo_obj); CRIT("Setting clip %p on itself", eo_obj);
@ -252,41 +262,61 @@ _clip_set(Eo *eo_obj, void *_pd, va_list *list)
{ {
eo_do(eo_obj, evas_obj_smart_clip_set(eo_clip)); eo_do(eo_obj, evas_obj_smart_clip_set(eo_clip));
} }
if (obj->cur.clipper) if (obj->cur->clipper)
{ {
/* unclip */ /* unclip */
obj->cur.clipper->clip.clipees = eina_list_remove(obj->cur.clipper->clip.clipees, eo_obj); obj->cur->clipper->clip.clipees = eina_list_remove(obj->cur->clipper->clip.clipees, eo_obj);
if (!obj->cur.clipper->clip.clipees) if (!obj->cur->clipper->clip.clipees)
{ {
obj->cur.clipper->cur.have_clipees = 0; EINA_COW_STATE_WRITE_BEGIN(obj->cur->clipper, state_write, cur)
if (obj->cur.clipper->cur.visible) {
evas_damage_rectangle_add(obj->cur.clipper->layer->evas->evas, state_write->have_clipees = 0;
obj->cur.clipper->cur.geometry.x, }
obj->cur.clipper->cur.geometry.y, EINA_COW_STATE_WRITE_END(obj->cur->clipper, state_write, cur);
obj->cur.clipper->cur.geometry.w,
obj->cur.clipper->cur.geometry.h); if (obj->cur->clipper->cur->visible)
evas_damage_rectangle_add(obj->cur->clipper->layer->evas->evas,
obj->cur->clipper->cur->geometry.x,
obj->cur->clipper->cur->geometry.y,
obj->cur->clipper->cur->geometry.w,
obj->cur->clipper->cur->geometry.h);
} }
evas_object_change(obj->cur.eo_clipper, obj->cur.clipper); evas_object_change(obj->cur->eo_clipper, obj->cur->clipper);
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
obj->cur.clipper = NULL;
obj->cur.eo_clipper = NULL; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->clipper = NULL;
state_write->eo_clipper = NULL;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
} }
/* clip me */ /* clip me */
if ((!clip->clip.clipees) && (clip->cur.visible)) if ((!clip->clip.clipees) && (clip->cur->visible))
{ {
/* Basically it just went invisible */ /* Basically it just went invisible */
clip->changed = 1; clip->changed = 1;
clip->layer->evas->changed = 1; clip->layer->evas->changed = 1;
evas_damage_rectangle_add(clip->layer->evas->evas, evas_damage_rectangle_add(clip->layer->evas->evas,
clip->cur.geometry.x, clip->cur.geometry.y, clip->cur->geometry.x, clip->cur->geometry.y,
clip->cur.geometry.w, clip->cur.geometry.h); clip->cur->geometry.w, clip->cur->geometry.h);
} }
obj->cur.eo_clipper = eo_clip; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.clipper = clip; {
state_write->eo_clipper = eo_clip;
state_write->clipper = clip;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
clip->clip.clipees = eina_list_append(clip->clip.clipees, eo_obj); clip->clip.clipees = eina_list_append(clip->clip.clipees, eo_obj);
if (clip->clip.clipees) if (clip->clip.clipees)
{ {
clip->cur.have_clipees = 1; EINA_COW_STATE_WRITE_BEGIN(clip, state_write, cur)
{
state_write->have_clipees = 1;
}
EINA_COW_STATE_WRITE_END(clip, state_write, cur);
if (clip->changed) if (clip->changed)
evas_object_update_bounding_box(eo_clip, clip); evas_object_update_bounding_box(eo_clip, clip);
} }
@ -333,7 +363,7 @@ _clip_get(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
{ {
Evas_Object **clip = va_arg(*list, Evas_Object **); Evas_Object **clip = va_arg(*list, Evas_Object **);
const Evas_Object_Protected_Data *obj = _pd; const Evas_Object_Protected_Data *obj = _pd;
*clip = obj->cur.eo_clipper; *clip = obj->cur->eo_clipper;
} }
EAPI void EAPI void
@ -350,30 +380,40 @@ _clip_unset(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
{ {
Evas_Object_Protected_Data *obj = _pd; Evas_Object_Protected_Data *obj = _pd;
if (!obj->cur.clipper) return; if (!obj->cur->clipper) return;
/* unclip */ /* unclip */
if (evas_object_intercept_call_clip_unset(eo_obj)) return; if (evas_object_intercept_call_clip_unset(eo_obj)) return;
if (obj->is_smart) if (obj->is_smart)
{ {
eo_do(eo_obj, evas_obj_smart_clip_unset()); eo_do(eo_obj, evas_obj_smart_clip_unset());
} }
if (obj->cur.clipper) if (obj->cur->clipper)
{ {
obj->cur.clipper->clip.clipees = eina_list_remove(obj->cur.clipper->clip.clipees, eo_obj); obj->cur->clipper->clip.clipees = eina_list_remove(obj->cur->clipper->clip.clipees, eo_obj);
if (!obj->cur.clipper->clip.clipees) if (!obj->cur->clipper->clip.clipees)
{ {
obj->cur.clipper->cur.have_clipees = 0; EINA_COW_STATE_WRITE_BEGIN(obj->cur->clipper, state_write, cur)
if (obj->cur.clipper->cur.visible) {
evas_damage_rectangle_add(obj->cur.clipper->layer->evas->evas, state_write->have_clipees = 0;
obj->cur.clipper->cur.geometry.x, }
obj->cur.clipper->cur.geometry.y, EINA_COW_STATE_WRITE_END(obj->cur->clipper, state_write, cur);
obj->cur.clipper->cur.geometry.w,
obj->cur.clipper->cur.geometry.h); if (obj->cur->clipper->cur->visible)
evas_damage_rectangle_add(obj->cur->clipper->layer->evas->evas,
obj->cur->clipper->cur->geometry.x,
obj->cur->clipper->cur->geometry.y,
obj->cur->clipper->cur->geometry.w,
obj->cur->clipper->cur->geometry.h);
} }
evas_object_change(obj->cur.eo_clipper, obj->cur.clipper); evas_object_change(obj->cur->eo_clipper, obj->cur->clipper);
} }
obj->cur.clipper = NULL; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.eo_clipper = NULL; {
state_write->clipper = NULL;
state_write->eo_clipper = NULL;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj); evas_object_clip_dirty(eo_obj, obj);
evas_object_recalc_clippees(eo_obj, obj); evas_object_recalc_clippees(eo_obj, obj);

View File

@ -26,8 +26,8 @@ _evas_event_havemap_adjust(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protecte
//outside map, this should check the return value for outside case. //outside map, this should check the return value for outside case.
if (evas_map_coords_get(obj->map->cur.map, *x, *y, x, y, mouse_grabbed)) if (evas_map_coords_get(obj->map->cur.map, *x, *y, x, y, mouse_grabbed))
{ {
*x += obj->cur.geometry.x; *x += obj->cur->geometry.x;
*y += obj->cur.geometry.y; *y += obj->cur->geometry.y;
} }
} }
@ -73,7 +73,7 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
if (evas_object_is_source_invisible(eo_obj, obj)) continue; if (evas_object_is_source_invisible(eo_obj, obj)) continue;
} }
if ((obj->delete_me == 0) && if ((obj->delete_me == 0) &&
((source) || ((obj->cur.visible) && (!obj->clip.clipees) && ((source) || ((obj->cur->visible) && (!obj->clip.clipees) &&
evas_object_clippers_is_visible(eo_obj, obj)))) evas_object_clippers_is_visible(eo_obj, obj))))
{ {
if (obj->is_smart) if (obj->is_smart)
@ -98,8 +98,8 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
(eo_e, in, (eo_e, in,
evas_object_smart_members_get_direct(eo_obj), evas_object_smart_members_get_direct(eo_obj),
stop, stop,
obj->cur.geometry.x + obj->map->cur.map->mx, obj->cur->geometry.x + obj->map->cur.map->mx,
obj->cur.geometry.y + obj->map->cur.map->my, obj->cur->geometry.y + obj->map->cur.map->my,
&norep, source); &norep, source);
} }
} }
@ -109,14 +109,14 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
if (!obj->child_has_map) if (!obj->child_has_map)
evas_object_smart_bounding_box_update(eo_obj, obj); evas_object_smart_bounding_box_update(eo_obj, obj);
if (obj->child_has_map || if (obj->child_has_map ||
(obj->cur.bounding_box.x <= x && (obj->cur->bounding_box.x <= x &&
obj->cur.bounding_box.x + obj->cur.bounding_box.w >= x && obj->cur->bounding_box.x + obj->cur->bounding_box.w >= x &&
obj->cur.bounding_box.y <= y && obj->cur->bounding_box.y <= y &&
obj->cur.bounding_box.y + obj->cur.bounding_box.h >= y) || obj->cur->bounding_box.y + obj->cur->bounding_box.h >= y) ||
(obj->cur.geometry.x <= x && (obj->cur->geometry.x <= x &&
obj->cur.geometry.y + obj->cur.geometry.w >= x && obj->cur->geometry.y + obj->cur->geometry.w >= x &&
obj->cur.geometry.y <= y && obj->cur->geometry.y <= y &&
obj->cur.geometry.y + obj->cur.geometry.h >= y)) obj->cur->geometry.y + obj->cur->geometry.h >= y))
in = _evas_event_object_list_in_get in = _evas_event_object_list_in_get
(eo_e, in, evas_object_smart_members_get_direct(eo_obj), (eo_e, in, evas_object_smart_members_get_direct(eo_obj),
stop, x, y, &norep, source); stop, x, y, &norep, source);
@ -168,21 +168,21 @@ _evas_event_object_list_raw_in_get(Evas *eo_e, Eina_List *in,
static void static void
_transform_to_src_space(Evas_Object_Protected_Data *obj, Evas_Object_Protected_Data *src, Evas_Coord *x, Evas_Coord *y) _transform_to_src_space(Evas_Object_Protected_Data *obj, Evas_Object_Protected_Data *src, Evas_Coord *x, Evas_Coord *y)
{ {
Evas_Coord obj_w = obj->cur.geometry.w, obj_h = obj->cur.geometry.h; Evas_Coord obj_w = obj->cur->geometry.w, obj_h = obj->cur->geometry.h;
Evas_Coord src_w = src->cur.geometry.w, src_h = src->cur.geometry.h; Evas_Coord src_w = src->cur->geometry.w, src_h = src->cur->geometry.h;
Evas_Coord tmp_x = *x; Evas_Coord tmp_x = *x;
Evas_Coord tmp_y = *y; Evas_Coord tmp_y = *y;
tmp_x -= obj->cur.geometry.x; tmp_x -= obj->cur->geometry.x;
tmp_y -= obj->cur.geometry.y; tmp_y -= obj->cur->geometry.y;
if (obj_w != src_w) if (obj_w != src_w)
tmp_x = (Evas_Coord) ((float)tmp_x * ((float)src_w / (float)obj_w)); tmp_x = (Evas_Coord) ((float)tmp_x * ((float)src_w / (float)obj_w));
if (obj_h != src_h) if (obj_h != src_h)
tmp_y = (Evas_Coord) ((float)tmp_y * ((float)src_h / (float)obj_h)); tmp_y = (Evas_Coord) ((float)tmp_y * ((float)src_h / (float)obj_h));
tmp_x += src->cur.geometry.x; tmp_x += src->cur->geometry.x;
tmp_y += src->cur.geometry.y; tmp_y += src->cur->geometry.y;
*x = tmp_x; *x = tmp_x;
*y = tmp_y; *y = tmp_y;
} }

View File

@ -11,11 +11,11 @@ evas_object_inject(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *
if (!obj) return; if (!obj) return;
if (!e) return; if (!e) return;
if (obj->in_layer) return; if (obj->in_layer) return;
lay = evas_layer_find(e, obj->cur.layer); lay = evas_layer_find(e, obj->cur->layer);
if (!lay) if (!lay)
{ {
lay = evas_layer_new(e); lay = evas_layer_new(e);
lay->layer = obj->cur.layer; lay->layer = obj->cur->layer;
evas_layer_add(lay); evas_layer_add(lay);
} }
lay->objects = (Evas_Object_Protected_Data *)eina_inlist_append(EINA_INLIST_GET(lay->objects), EINA_INLIST_GET(obj)); lay->objects = (Evas_Object_Protected_Data *)eina_inlist_append(EINA_INLIST_GET(lay->objects), EINA_INLIST_GET(obj));
@ -145,9 +145,14 @@ _evas_object_layer_set_child(Evas_Object *eo_obj, Evas_Object *par, short l)
Evas_Object_Protected_Data *par_obj = eo_data_get(par, EVAS_OBJ_CLASS); Evas_Object_Protected_Data *par_obj = eo_data_get(par, EVAS_OBJ_CLASS);
if (obj->delete_me) return; if (obj->delete_me) return;
if (obj->cur.layer == l) return; if (obj->cur->layer == l) return;
evas_object_release(eo_obj, obj, 1); evas_object_release(eo_obj, obj, 1);
obj->cur.layer = l; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->layer = l;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
obj->layer = par_obj->layer; obj->layer = par_obj->layer;
obj->layer->usage++; obj->layer->usage++;
if (obj->is_smart) if (obj->is_smart)
@ -185,14 +190,19 @@ _layer_set(Eo *eo_obj, void *_obj, va_list *list)
if (obj->delete_me) return; if (obj->delete_me) return;
if (evas_object_intercept_call_layer_set(eo_obj, l)) return; if (evas_object_intercept_call_layer_set(eo_obj, l)) return;
if (obj->smart.parent) return; if (obj->smart.parent) return;
if (obj->cur.layer == l) if (obj->cur->layer == l)
{ {
evas_object_raise(eo_obj); evas_object_raise(eo_obj);
return; return;
} }
eo_e = obj->layer->evas->evas; eo_e = obj->layer->evas->evas;
evas_object_release(eo_obj, obj, 1); evas_object_release(eo_obj, obj, 1);
obj->cur.layer = l; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->layer = l;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_inject(eo_obj, obj, eo_e); evas_object_inject(eo_obj, obj, eo_e);
obj->restack = 1; obj->restack = 1;
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
@ -207,7 +217,7 @@ _layer_set(Eo *eo_obj, void *_obj, va_list *list)
if (evas_object_is_in_output_rect(eo_obj, obj, if (evas_object_is_in_output_rect(eo_obj, obj,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1) && obj->layer->evas->pointer.y, 1, 1) &&
obj->cur.visible) obj->cur->visible)
if (eina_list_data_find(obj->layer->evas->pointer.object.in, obj)) if (eina_list_data_find(obj->layer->evas->pointer.object.in, obj))
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
@ -248,7 +258,7 @@ _layer_get(Eo *eo_obj EINA_UNUSED, void *_obj, va_list *list)
if (obj->smart.parent) if (obj->smart.parent)
{ {
Evas_Object_Protected_Data *smart_parent_obj = eo_data_get(obj->smart.parent, EVAS_OBJ_CLASS); Evas_Object_Protected_Data *smart_parent_obj = eo_data_get(obj->smart.parent, EVAS_OBJ_CLASS);
*layer = smart_parent_obj->cur.layer; *layer = smart_parent_obj->cur->layer;
} }
*layer = obj->cur.layer; *layer = obj->cur->layer;
} }

View File

@ -18,7 +18,7 @@ _evas_map_calc_geom_change(Evas_Object *eo_obj)
is = evas_object_is_in_output_rect(eo_obj, obj, is = evas_object_is_in_output_rect(eo_obj, obj,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1); obj->layer->evas->pointer.y, 1, 1);
if ((is ^ was) && obj->cur.visible) if ((is ^ was) && obj->cur->visible)
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
@ -461,7 +461,7 @@ _map_enable_set(Eo *eo_obj, void *_pd, va_list *list)
EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write); EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write);
} }
evas_object_mapped_clip_across_mark(eo_obj, obj); evas_object_mapped_clip_across_mark(eo_obj, obj);
// obj->map->cur.map->normal_geometry = obj->cur.geometry; // obj->map->cur.map->normal_geometry = obj->cur->geometry;
} }
else else
{ {
@ -557,7 +557,12 @@ _map_set(Eo *eo_obj, void *_pd, va_list *list)
if (obj->map->cur.map) if (obj->map->cur.map)
{ {
obj->changed_map = EINA_TRUE; obj->changed_map = EINA_TRUE;
obj->prev.geometry = obj->map->cur.map->normal_geometry;
EINA_COW_STATE_WRITE_BEGIN(obj, state_write, prev)
{
state_write->geometry = obj->map->cur.map->normal_geometry;
}
EINA_COW_STATE_WRITE_END(obj, state_write, prev);
EINA_COW_WRITE_BEGIN(evas_object_map_cow, obj->map, Evas_Object_Map_Data, map_write) EINA_COW_WRITE_BEGIN(evas_object_map_cow, obj->map, Evas_Object_Map_Data, map_write)
{ {
@ -847,8 +852,8 @@ evas_map_util_points_populate_from_object_full(Evas_Map *m, const Evas_Object *e
ERR("map has count=%d where 4 was expected.", m->count); ERR("map has count=%d where 4 was expected.", m->count);
return; return;
} }
_evas_map_util_points_populate(m, obj->cur.geometry.x, obj->cur.geometry.y, _evas_map_util_points_populate(m, obj->cur->geometry.x, obj->cur->geometry.y,
obj->cur.geometry.w, obj->cur.geometry.h, z); obj->cur->geometry.w, obj->cur->geometry.h, z);
} }
EAPI void EAPI void
@ -869,8 +874,8 @@ 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); ERR("map has count=%d where 4 was expected.", m->count);
return; return;
} }
_evas_map_util_points_populate(m, obj->cur.geometry.x, obj->cur.geometry.y, _evas_map_util_points_populate(m, obj->cur->geometry.x, obj->cur->geometry.y,
obj->cur.geometry.w, obj->cur.geometry.h, 0); obj->cur->geometry.w, obj->cur->geometry.h, 0);
} }
EAPI void EAPI void

File diff suppressed because it is too large Load Diff

View File

@ -140,11 +140,17 @@ _line_xy_set(Eo *eo_obj, void *_pd, va_list *list)
min_y = y2; min_y = y2;
max_y = y1; max_y = y1;
} }
obj->cur.geometry.x = min_x;
obj->cur.geometry.y = min_y; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.geometry.w = max_x - min_x + 2; {
obj->cur.geometry.h = max_y - min_y + 2; state_write->geometry.x = min_x;
//// obj->cur.cache.geometry.validity = 0; state_write->geometry.y = min_y;
state_write->geometry.w = max_x - min_x + 2;
state_write->geometry.h = max_y - min_y + 2;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
//// obj->cur->cache.geometry.validity = 0;
o->cur.x1 = x1 - min_x; o->cur.x1 = x1 - min_x;
o->cur.y1 = y1 - min_y; o->cur.y1 = y1 - min_y;
o->cur.x2 = x2 - min_x; o->cur.x2 = x2 - min_x;
@ -162,7 +168,7 @@ _line_xy_set(Eo *eo_obj, void *_pd, va_list *list)
!evas_event_freezes_through(eo_obj, obj) && !evas_event_freezes_through(eo_obj, obj) &&
!evas_object_is_source_invisible(eo_obj, obj)) !evas_object_is_source_invisible(eo_obj, obj))
{ {
if ((is ^ was) && obj->cur.visible) if ((is ^ was) && obj->cur->visible)
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
@ -198,10 +204,10 @@ _line_xy_get(Eo *eo_obj, void *_pd, va_list *list)
Evas_Coord *y2 = va_arg(*list, Evas_Coord *); Evas_Coord *y2 = va_arg(*list, Evas_Coord *);
Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS); Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS);
if (x1) *x1 = obj->cur.geometry.x + o->cur.x1; if (x1) *x1 = obj->cur->geometry.x + o->cur.x1;
if (y1) *y1 = obj->cur.geometry.y + o->cur.y1; if (y1) *y1 = obj->cur->geometry.y + o->cur.y1;
if (x2) *x2 = obj->cur.geometry.x + o->cur.x2; if (x2) *x2 = obj->cur->geometry.x + o->cur.x2;
if (y2) *y2 = obj->cur.geometry.y + o->cur.y2; if (y2) *y2 = obj->cur->geometry.y + o->cur.y2;
} }
/* all nice and private */ /* all nice and private */
@ -209,20 +215,6 @@ static void
evas_object_line_init(Evas_Object *eo_obj) evas_object_line_init(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS); Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS);
/* set up default settings for this kind of object */
obj->cur.color.r = 255;
obj->cur.color.g = 255;
obj->cur.color.b = 255;
obj->cur.color.a = 255;
obj->cur.geometry.x = 0;
obj->cur.geometry.y = 0;
obj->cur.geometry.w = 0;
obj->cur.geometry.h = 0;
obj->cur.layer = 0;
obj->cur.anti_alias = EINA_TRUE;
obj->cur.render_op = EVAS_RENDER_BLEND;
/* set up object-specific settings */
obj->prev = obj->cur;
/* set up methods (compulsory) */ /* set up methods (compulsory) */
obj->func = &object_func; obj->func = &object_func;
obj->type = o_type; obj->type = o_type;
@ -261,16 +253,16 @@ evas_object_line_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, vo
obj->layer->evas->engine.func->context_color_set(output, obj->layer->evas->engine.func->context_color_set(output,
context, context,
obj->cur.cache.clip.r, obj->cur->cache.clip.r,
obj->cur.cache.clip.g, obj->cur->cache.clip.g,
obj->cur.cache.clip.b, obj->cur->cache.clip.b,
obj->cur.cache.clip.a); obj->cur->cache.clip.a);
obj->layer->evas->engine.func->context_multiplier_unset(output, obj->layer->evas->engine.func->context_multiplier_unset(output,
context); context);
obj->layer->evas->engine.func->context_anti_alias_set(output, context, obj->layer->evas->engine.func->context_anti_alias_set(output, context,
obj->cur.anti_alias); obj->cur->anti_alias);
obj->layer->evas->engine.func->context_render_op_set(output, context, obj->layer->evas->engine.func->context_render_op_set(output, context,
obj->cur.render_op); obj->cur->render_op);
obj->layer->evas->engine.func->line_draw(output, obj->layer->evas->engine.func->line_draw(output,
context, context,
surface, surface,
@ -297,11 +289,11 @@ evas_object_line_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj
/* then when this is done the object needs to figure if it changed and */ /* then when this is done the object needs to figure if it changed and */
/* if so what and where and add the appropriate redraw lines */ /* if so what and where and add the appropriate redraw lines */
/* if someone is clipping this obj - go calculate the clipper */ /* if someone is clipping this obj - go calculate the clipper */
if (obj->cur.clipper) if (obj->cur->clipper)
{ {
if (obj->cur.cache.clip.dirty) if (obj->cur->cache.clip.dirty)
evas_object_clip_recalc(obj->cur.eo_clipper, obj->cur.clipper); evas_object_clip_recalc(obj->cur->eo_clipper, obj->cur->clipper);
obj->cur.clipper->func->render_pre(obj->cur.eo_clipper, obj->cur.clipper); obj->cur->clipper->func->render_pre(obj->cur->eo_clipper, obj->cur->clipper);
} }
/* now figure what changed and add draw rects */ /* now figure what changed and add draw rects */
/* if it just became visible or invisible */ /* if it just became visible or invisible */
@ -323,10 +315,10 @@ evas_object_line_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj
/* clipper changed this is in addition to anything else for obj */ /* clipper changed this is in addition to anything else for obj */
evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, eo_obj); evas_object_render_pre_clipper_change(&obj->layer->evas->clip_changes, eo_obj);
if ((obj->cur.color.r != obj->prev.color.r) || if ((obj->cur->color.r != obj->prev->color.r) ||
(obj->cur.color.g != obj->prev.color.g) || (obj->cur->color.g != obj->prev->color.g) ||
(obj->cur.color.b != obj->prev.color.b) || (obj->cur->color.b != obj->prev->color.b) ||
(obj->cur.color.a != obj->prev.color.a)) (obj->cur->color.a != obj->prev->color.a))
changed_color = EINA_TRUE; changed_color = EINA_TRUE;
/* if we restacked (layer or just within a layer) */ /* if we restacked (layer or just within a layer) */
@ -334,8 +326,8 @@ evas_object_line_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj
/* or if ii changed render op */ /* or if ii changed render op */
/* or if it changed color */ /* or if it changed color */
if ((obj->restack) || if ((obj->restack) ||
(obj->cur.anti_alias != obj->prev.anti_alias) || (obj->cur->anti_alias != obj->prev->anti_alias) ||
(obj->cur.render_op != obj->prev.render_op) || (obj->cur->render_op != obj->prev->render_op) ||
(changed_color) (changed_color)
) )
{ {
@ -347,10 +339,10 @@ evas_object_line_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj
/* if it changed geometry - and obviously not visibility or color */ /* if it changed geometry - and obviously not visibility or color */
/* calculate differences since we have a constant color fill */ /* calculate differences since we have a constant color fill */
/* we really only need to update the differences */ /* we really only need to update the differences */
if ((obj->cur.geometry.x != obj->prev.geometry.x) || if ((obj->cur->geometry.x != obj->prev->geometry.x) ||
(obj->cur.geometry.y != obj->prev.geometry.y) || (obj->cur->geometry.y != obj->prev->geometry.y) ||
(obj->cur.geometry.w != obj->prev.geometry.w) || (obj->cur->geometry.w != obj->prev->geometry.w) ||
(obj->cur.geometry.h != obj->prev.geometry.h) || (obj->cur->geometry.h != obj->prev->geometry.h) ||
((o->changed) && ((o->changed) &&
((o->cur.x1 != o->prev.x1) || ((o->cur.x1 != o->prev.x1) ||
(o->cur.y1 != o->prev.y1) || (o->cur.y1 != o->prev.y1) ||
@ -439,12 +431,12 @@ evas_object_line_coords_recalc(Evas_Object *eo_obj, Evas_Object_Protected_Data *
{ {
Evas_Object_Line *o = eo_data_get(eo_obj, MY_CLASS); Evas_Object_Line *o = eo_data_get(eo_obj, MY_CLASS);
o->cur.cache.x1 = obj->cur.geometry.x + o->cur.x1; o->cur.cache.x1 = obj->cur->geometry.x + o->cur.x1;
o->cur.cache.y1 = obj->cur.geometry.y + o->cur.y1; o->cur.cache.y1 = obj->cur->geometry.y + o->cur.y1;
o->cur.cache.x2 = obj->cur.geometry.x + o->cur.x2; o->cur.cache.x2 = obj->cur->geometry.x + o->cur.x2;
o->cur.cache.y2 = obj->cur.geometry.y + o->cur.y2; o->cur.cache.y2 = obj->cur->geometry.y + o->cur.y2;
o->cur.cache.object.w = obj->cur.geometry.w; o->cur.cache.object.w = obj->cur->geometry.w;
o->cur.cache.object.h = obj->cur.geometry.h; o->cur.cache.object.h = obj->cur->geometry.h;
} }
static void static void

View File

@ -30,24 +30,34 @@ static const Evas_Object_Proxy_Data default_proxy = {
static const Evas_Object_Map_Data default_map = { static const Evas_Object_Map_Data default_map = {
{ NULL, NULL, 0, 0 }, { NULL, NULL, 0, 0 }, NULL, 0, 0, NULL, NULL { NULL, NULL, 0, 0 }, { NULL, NULL, 0, 0 }, NULL, 0, 0, NULL, NULL
}; };
static const Evas_Object_Protected_State default_state = {
NULL, NULL, { 0, 0, 0, 0 }, { 0, 0, 0, 0 },
{ { 0, 0, 0, 0, 0, 0, 0, 0, EINA_FALSE, EINA_FALSE } },
{ 255, 255, 255, 255 },
1.0, EVAS_RENDER_BLEND, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE, EINA_FALSE
};
Eina_Cow *evas_object_proxy_cow = NULL; Eina_Cow *evas_object_proxy_cow = NULL;
Eina_Cow *evas_object_map_cow = NULL; Eina_Cow *evas_object_map_cow = NULL;
Eina_Cow *evas_object_state_cow = NULL;
static Eina_Bool static Eina_Bool
_init_cow(void) _init_cow(void)
{ {
if (evas_object_map_cow && evas_object_proxy_cow) return EINA_TRUE; if (evas_object_map_cow && evas_object_proxy_cow && evas_object_state_cow) return EINA_TRUE;
evas_object_proxy_cow = eina_cow_add("Evas Object Proxy", sizeof (Evas_Object_Proxy_Data), 8, &default_proxy); evas_object_proxy_cow = eina_cow_add("Evas Object Proxy", sizeof (Evas_Object_Proxy_Data), 8, &default_proxy);
evas_object_map_cow = eina_cow_add("Evas Object Map", sizeof (Evas_Object_Map_Data), 8, &default_map); evas_object_map_cow = eina_cow_add("Evas Object Map", sizeof (Evas_Object_Map_Data), 8, &default_map);
evas_object_state_cow = eina_cow_add("Evas Object State", sizeof (Evas_Object_Protected_State), 64, &default_state);
if (!(evas_object_map_cow && evas_object_proxy_cow)) if (!(evas_object_map_cow && evas_object_proxy_cow && evas_object_state_cow))
{ {
eina_cow_del(evas_object_proxy_cow); eina_cow_del(evas_object_proxy_cow);
eina_cow_del(evas_object_map_cow); eina_cow_del(evas_object_map_cow);
eina_cow_del(evas_object_state_cow);
evas_object_proxy_cow = NULL; evas_object_proxy_cow = NULL;
evas_object_map_cow = NULL; evas_object_map_cow = NULL;
evas_object_state_cow = NULL;
return EINA_FALSE; return EINA_FALSE;
} }
@ -70,12 +80,12 @@ _constructor(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
return; return;
} }
obj->cur.scale = 1.0;
obj->prev.scale = 1.0;
obj->is_frame = EINA_FALSE; obj->is_frame = EINA_FALSE;
obj->object = eo_obj; obj->object = eo_obj;
obj->proxy = eina_cow_alloc(evas_object_proxy_cow); obj->proxy = eina_cow_alloc(evas_object_proxy_cow);
obj->map = eina_cow_alloc(evas_object_map_cow); obj->map = eina_cow_alloc(evas_object_map_cow);
obj->cur = eina_cow_alloc(evas_object_state_cow);
obj->prev = eina_cow_alloc(evas_object_state_cow);
} }
void void
@ -124,7 +134,7 @@ evas_object_cur_prev(Evas_Object *eo_obj)
map_write->prev = map_write->cur; map_write->prev = map_write->cur;
EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write); EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write);
} }
obj->prev = obj->cur; eina_cow_memcpy(evas_object_state_cow, (const Eina_Cow_Data **) &obj->prev, obj->cur);
} }
void void
@ -181,6 +191,8 @@ evas_object_free(Evas_Object *eo_obj, int clean_layer)
} }
eina_cow_free(evas_object_proxy_cow, obj->proxy); eina_cow_free(evas_object_proxy_cow, obj->proxy);
eina_cow_free(evas_object_map_cow, obj->map); eina_cow_free(evas_object_map_cow, obj->map);
eina_cow_free(evas_object_state_cow, obj->cur);
eina_cow_free(evas_object_state_cow, obj->prev);
eo_manual_free(eo_obj); eo_manual_free(eo_obj);
} }
@ -259,18 +271,18 @@ evas_object_render_pre_visible_change(Eina_Array *rects, Evas_Object *eo_obj, in
if (is_v) if (is_v)
{ {
evas_add_rect(rects, evas_add_rect(rects,
obj->cur.cache.clip.x, obj->cur->cache.clip.x,
obj->cur.cache.clip.y, obj->cur->cache.clip.y,
obj->cur.cache.clip.w, obj->cur->cache.clip.w,
obj->cur.cache.clip.h); obj->cur->cache.clip.h);
} }
else else
{ {
evas_add_rect(rects, evas_add_rect(rects,
obj->prev.cache.clip.x, obj->prev->cache.clip.x,
obj->prev.cache.clip.y, obj->prev->cache.clip.y,
obj->prev.cache.clip.w, obj->prev->cache.clip.w,
obj->prev.cache.clip.h); obj->prev->cache.clip.h);
} }
} }
@ -281,51 +293,51 @@ evas_object_render_pre_clipper_change(Eina_Array *rects, Evas_Object *eo_obj)
if (!obj) return; if (!obj) return;
if (obj->is_smart) return; if (obj->is_smart) return;
if (obj->cur.clipper == obj->prev.clipper) return; if (obj->cur->clipper == obj->prev->clipper) return;
if ((obj->cur.clipper) && (obj->prev.clipper)) if ((obj->cur->clipper) && (obj->prev->clipper))
{ {
/* get difference rects between clippers */ /* get difference rects between clippers */
evas_rects_return_difference_rects(rects, evas_rects_return_difference_rects(rects,
obj->cur.clipper->cur.cache.clip.x, obj->cur->clipper->cur->cache.clip.x,
obj->cur.clipper->cur.cache.clip.y, obj->cur->clipper->cur->cache.clip.y,
obj->cur.clipper->cur.cache.clip.w, obj->cur->clipper->cur->cache.clip.w,
obj->cur.clipper->cur.cache.clip.h, obj->cur->clipper->cur->cache.clip.h,
obj->prev.clipper->prev.cache.clip.x, obj->prev->clipper->prev->cache.clip.x,
obj->prev.clipper->prev.cache.clip.y, obj->prev->clipper->prev->cache.clip.y,
obj->prev.clipper->prev.cache.clip.w, obj->prev->clipper->prev->cache.clip.w,
obj->prev.clipper->prev.cache.clip.h); obj->prev->clipper->prev->cache.clip.h);
} }
else if (obj->cur.clipper) else if (obj->cur->clipper)
{ {
evas_rects_return_difference_rects(rects, evas_rects_return_difference_rects(rects,
obj->cur.geometry.x, obj->cur->geometry.x,
obj->cur.geometry.y, obj->cur->geometry.y,
obj->cur.geometry.w, obj->cur->geometry.w,
obj->cur.geometry.h, obj->cur->geometry.h,
//// rl = evas_rects_return_difference_rects(obj->cur.cache.geometry.x, //// rl = evas_rects_return_difference_rects(obj->cur->cache.geometry.x,
//// obj->cur.cache.geometry.y, //// obj->cur->cache.geometry.y,
//// obj->cur.cache.geometry.w, //// obj->cur->cache.geometry.w,
//// obj->cur.cache.geometry.h, //// obj->cur->cache.geometry.h,
obj->cur.clipper->cur.cache.clip.x, obj->cur->clipper->cur->cache.clip.x,
obj->cur.clipper->cur.cache.clip.y, obj->cur->clipper->cur->cache.clip.y,
obj->cur.clipper->cur.cache.clip.w, obj->cur->clipper->cur->cache.clip.w,
obj->cur.clipper->cur.cache.clip.h); obj->cur->clipper->cur->cache.clip.h);
} }
else if (obj->prev.clipper) else if (obj->prev->clipper)
{ {
evas_rects_return_difference_rects(rects, evas_rects_return_difference_rects(rects,
obj->prev.geometry.x, obj->prev->geometry.x,
obj->prev.geometry.y, obj->prev->geometry.y,
obj->prev.geometry.w, obj->prev->geometry.w,
obj->prev.geometry.h, obj->prev->geometry.h,
//// rl = evas_rects_return_difference_rects(obj->prev.cache.geometry.x, //// rl = evas_rects_return_difference_rects(obj->prev->cache.geometry.x,
//// obj->prev.cache.geometry.y, //// obj->prev->cache.geometry.y,
//// obj->prev.cache.geometry.w, //// obj->prev->cache.geometry.w,
//// obj->prev.cache.geometry.h, //// obj->prev->cache.geometry.h,
obj->prev.clipper->prev.cache.clip.x, obj->prev->clipper->prev->cache.clip.x,
obj->prev.clipper->prev.cache.clip.y, obj->prev->clipper->prev->cache.clip.y,
obj->prev.clipper->prev.cache.clip.w, obj->prev->clipper->prev->cache.clip.w,
obj->prev.clipper->prev.cache.clip.h); obj->prev->clipper->prev->cache.clip.h);
} }
} }
@ -335,34 +347,34 @@ evas_object_render_pre_prev_cur_add(Eina_Array *rects, Evas_Object *eo_obj EINA_
if (!obj) return; if (!obj) return;
evas_add_rect(rects, evas_add_rect(rects,
obj->cur.cache.clip.x, obj->cur->cache.clip.x,
obj->cur.cache.clip.y, obj->cur->cache.clip.y,
obj->cur.cache.clip.w, obj->cur->cache.clip.w,
obj->cur.cache.clip.h); obj->cur->cache.clip.h);
evas_add_rect(rects, evas_add_rect(rects,
obj->prev.cache.clip.x, obj->prev->cache.clip.x,
obj->prev.cache.clip.y, obj->prev->cache.clip.y,
obj->prev.cache.clip.w, obj->prev->cache.clip.w,
obj->prev.cache.clip.h); obj->prev->cache.clip.h);
/* /*
evas_add_rect(rects, evas_add_rect(rects,
obj->cur.geometry.x, obj->cur->geometry.x,
obj->cur.geometry.y, obj->cur->geometry.y,
obj->cur.geometry.w, obj->cur->geometry.w,
obj->cur.geometry.h); obj->cur->geometry.h);
//// obj->cur.cache.geometry.x, //// obj->cur->cache.geometry.x,
//// obj->cur.cache.geometry.y, //// obj->cur->cache.geometry.y,
//// obj->cur.cache.geometry.w, //// obj->cur->cache.geometry.w,
//// obj->cur.cache.geometry.h); //// obj->cur->cache.geometry.h);
evas_add_rect(rects, evas_add_rect(rects,
obj->prev.geometry.x, obj->prev->geometry.x,
obj->prev.geometry.y, obj->prev->geometry.y,
obj->prev.geometry.w, obj->prev->geometry.w,
obj->prev.geometry.h); obj->prev->geometry.h);
//// obj->prev.cache.geometry.x, //// obj->prev->cache.geometry.x,
//// obj->prev.cache.geometry.y, //// obj->prev->cache.geometry.y,
//// obj->prev.cache.geometry.w, //// obj->prev->cache.geometry.w,
//// obj->prev.cache.geometry.h); //// obj->prev->cache.geometry.h);
*/ */
} }
@ -403,10 +415,10 @@ evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *eo_obj, in
w = r->w; w = r->w;
h = r->h; h = r->h;
RECTS_CLIP_TO_RECT(x, y, w, h, RECTS_CLIP_TO_RECT(x, y, w, h,
obj->cur.cache.clip.x, obj->cur->cache.clip.x,
obj->cur.cache.clip.y, obj->cur->cache.clip.y,
obj->cur.cache.clip.w, obj->cur->cache.clip.w,
obj->cur.cache.clip.h); obj->cur->cache.clip.h);
if ((w > 0) && (h > 0)) if ((w > 0) && (h > 0))
obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output, obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
x, y, w, h); x, y, w, h);
@ -416,10 +428,10 @@ evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *eo_obj, in
w = r->w; w = r->w;
h = r->h; h = r->h;
RECTS_CLIP_TO_RECT(x, y, w, h, RECTS_CLIP_TO_RECT(x, y, w, h,
obj->prev.cache.clip.x, obj->prev->cache.clip.x,
obj->prev.cache.clip.y, obj->prev->cache.clip.y,
obj->prev.cache.clip.w, obj->prev->cache.clip.w,
obj->prev.cache.clip.h); obj->prev->cache.clip.h);
if ((w > 0) && (h > 0)) if ((w > 0) && (h > 0))
obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output, obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
x, y, w, h); x, y, w, h);
@ -429,7 +441,7 @@ evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *eo_obj, in
{ {
Evas_Object_Protected_Data *clipper; Evas_Object_Protected_Data *clipper;
clipper = obj->cur.clipper; clipper = obj->cur->clipper;
while (clipper) while (clipper)
{ {
EINA_LIST_FOREACH(clipper->clip.changes, l, r) EINA_LIST_FOREACH(clipper->clip.changes, l, r)
@ -437,25 +449,25 @@ evas_object_render_pre_effect_updates(Eina_Array *rects, Evas_Object *eo_obj, in
/* get updates and clip to current clip */ /* get updates and clip to current clip */
x = r->x; y = r->y; w = r->w; h = r->h; x = r->x; y = r->y; w = r->w; h = r->h;
RECTS_CLIP_TO_RECT(x, y, w, h, RECTS_CLIP_TO_RECT(x, y, w, h,
obj->cur.cache.clip.x, obj->cur->cache.clip.x,
obj->cur.cache.clip.y, obj->cur->cache.clip.y,
obj->cur.cache.clip.w, obj->cur->cache.clip.w,
obj->cur.cache.clip.h); obj->cur->cache.clip.h);
if ((w > 0) && (h > 0)) if ((w > 0) && (h > 0))
obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output, obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
x, y, w, h); x, y, w, h);
/* get updates and clip to previous clip */ /* get updates and clip to previous clip */
x = r->x; y = r->y; w = r->w; h = r->h; x = r->x; y = r->y; w = r->w; h = r->h;
RECTS_CLIP_TO_RECT(x, y, w, h, RECTS_CLIP_TO_RECT(x, y, w, h,
obj->prev.cache.clip.x, obj->prev->cache.clip.x,
obj->prev.cache.clip.y, obj->prev->cache.clip.y,
obj->prev.cache.clip.w, obj->prev->cache.clip.w,
obj->prev.cache.clip.h); obj->prev->cache.clip.h);
if ((w > 0) && (h > 0)) if ((w > 0) && (h > 0))
obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output, obj->layer->evas->engine.func->output_redraws_rect_add(obj->layer->evas->engine.data.output,
x, y, w, h); x, y, w, h);
} }
clipper = clipper->cur.clipper; clipper = clipper->cur->clipper;
} }
} }
} }
@ -479,10 +491,10 @@ evas_object_was_in_output_rect(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Prot
if (obj->is_smart && !obj->map->prev.map && !obj->map->prev.usemap) return 0; if (obj->is_smart && !obj->map->prev.map && !obj->map->prev.usemap) return 0;
/* assumes coords have been recalced */ /* assumes coords have been recalced */
if ((RECTS_INTERSECT(x, y, w, h, if ((RECTS_INTERSECT(x, y, w, h,
obj->prev.cache.clip.x, obj->prev->cache.clip.x,
obj->prev.cache.clip.y, obj->prev->cache.clip.y,
obj->prev.cache.clip.w, obj->prev->cache.clip.w,
obj->prev.cache.clip.h))) obj->prev->cache.clip.h)))
return 1; return 1;
return 0; return 0;
} }
@ -491,7 +503,7 @@ int
evas_object_was_opaque(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) evas_object_was_opaque(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{ {
if (obj->is_smart) return 0; if (obj->is_smart) return 0;
if (obj->prev.cache.clip.a == 255) if (obj->prev->cache.clip.a == 255)
{ {
if (obj->func->was_opaque) if (obj->func->was_opaque)
return obj->func->was_opaque(eo_obj, obj); return obj->func->was_opaque(eo_obj, obj);
@ -627,7 +639,7 @@ _destructor(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
evas_object_clip_unset(obj->clip.clipees->data); evas_object_clip_unset(obj->clip.clipees->data);
while (obj->proxy->proxies) while (obj->proxy->proxies)
evas_object_image_source_unset(obj->proxy->proxies->data); evas_object_image_source_unset(obj->proxy->proxies->data);
if (obj->cur.clipper) evas_object_clip_unset(eo_obj); if (obj->cur->clipper) evas_object_clip_unset(eo_obj);
evas_object_map_set(eo_obj, NULL); evas_object_map_set(eo_obj, NULL);
if (obj->is_smart) evas_object_smart_del(eo_obj); if (obj->is_smart) evas_object_smart_del(eo_obj);
_evas_object_event_new(); _evas_object_event_new();
@ -659,25 +671,25 @@ evas_object_update_bounding_box(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Pro
if (obj->is_smart) if (obj->is_smart)
{ {
x = obj->cur.bounding_box.x; x = obj->cur->bounding_box.x;
y = obj->cur.bounding_box.y; y = obj->cur->bounding_box.y;
w = obj->cur.bounding_box.w; w = obj->cur->bounding_box.w;
h = obj->cur.bounding_box.h; h = obj->cur->bounding_box.h;
px = obj->prev.bounding_box.x; px = obj->prev->bounding_box.x;
py = obj->prev.bounding_box.y; py = obj->prev->bounding_box.y;
pw = obj->prev.bounding_box.w; pw = obj->prev->bounding_box.w;
ph = obj->prev.bounding_box.h; ph = obj->prev->bounding_box.h;
} }
else else
{ {
x = obj->cur.geometry.x; x = obj->cur->geometry.x;
y = obj->cur.geometry.y; y = obj->cur->geometry.y;
w = obj->cur.geometry.w; w = obj->cur->geometry.w;
h = obj->cur.geometry.h; h = obj->cur->geometry.h;
px = obj->prev.geometry.x; px = obj->prev->geometry.x;
py = obj->prev.geometry.y; py = obj->prev->geometry.y;
pw = obj->prev.geometry.w; pw = obj->prev->geometry.w;
ph = obj->prev.geometry.h; ph = obj->prev->geometry.h;
} }
/* We are not yet trying to find the smallest bounding box, but we want to find a good approximation quickly. /* We are not yet trying to find the smallest bounding box, but we want to find a good approximation quickly.
@ -686,56 +698,77 @@ evas_object_update_bounding_box(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Pro
Evas_Object_Protected_Data *smart_parent = eo_data_get(obj->smart.parent, MY_CLASS); Evas_Object_Protected_Data *smart_parent = eo_data_get(obj->smart.parent, MY_CLASS);
if (!smart_parent) return; if (!smart_parent) return;
if (smart_parent->cur.valid_bounding_box)
if (smart_parent->cur->valid_bounding_box)
{ {
/* Update left limit */ /* Update left limit */
if (noclip && x < smart_parent->cur.bounding_box.x) if (noclip && x < smart_parent->cur->bounding_box.x)
{ {
smart_parent->cur.bounding_box.w += smart_parent->cur.bounding_box.x - x; EINA_COW_STATE_WRITE_BEGIN(smart_parent, state_write, cur)
smart_parent->cur.bounding_box.x = x; {
state_write->bounding_box.w += state_write->bounding_box.x - x;
state_write->bounding_box.x = x;
}
EINA_COW_STATE_WRITE_END(smart_parent, state_write, cur);
propagate = EINA_TRUE; propagate = EINA_TRUE;
} }
else if ((px == smart_parent->prev.bounding_box.x && x > smart_parent->cur.bounding_box.x) else if ((px == smart_parent->prev->bounding_box.x && x > smart_parent->cur->bounding_box.x)
|| (!noclip && x == smart_parent->cur.bounding_box.x)) || (!noclip && x == smart_parent->cur->bounding_box.x))
{ {
computeminmax = EINA_TRUE; computeminmax = EINA_TRUE;
} }
/* Update top limit */ /* Update top limit */
if (noclip && y < smart_parent->cur.bounding_box.y) if (noclip && y < smart_parent->cur->bounding_box.y)
{ {
smart_parent->cur.bounding_box.h += smart_parent->cur.bounding_box.x - x; EINA_COW_STATE_WRITE_BEGIN(smart_parent, state_write, cur)
smart_parent->cur.bounding_box.y = y; {
state_write->bounding_box.h += state_write->bounding_box.x - x;
state_write->bounding_box.y = y;
}
EINA_COW_STATE_WRITE_END(smart_parent, state_write, cur);
propagate = EINA_TRUE; propagate = EINA_TRUE;
} }
else if ((py == smart_parent->prev.bounding_box.y && y > smart_parent->cur.bounding_box.y) else if ((py == smart_parent->prev->bounding_box.y && y > smart_parent->cur->bounding_box.y)
|| (!noclip && y == smart_parent->cur.bounding_box.y)) || (!noclip && y == smart_parent->cur->bounding_box.y))
{ {
computeminmax = EINA_TRUE; computeminmax = EINA_TRUE;
} }
/* Update right limit */ /* Update right limit */
if (noclip && x + w > smart_parent->cur.bounding_box.x + smart_parent->cur.bounding_box.w) if (noclip && x + w > smart_parent->cur->bounding_box.x + smart_parent->cur->bounding_box.w)
{ {
smart_parent->cur.bounding_box.w = x + w - smart_parent->cur.bounding_box.x; EINA_COW_STATE_WRITE_BEGIN(smart_parent, state_write, cur)
{
state_write->bounding_box.w = x + w - state_write->bounding_box.x;
}
EINA_COW_STATE_WRITE_END(smart_parent, state_write, cur);
propagate = EINA_TRUE; propagate = EINA_TRUE;
} }
else if ((px + pw == smart_parent->prev.bounding_box.x + smart_parent->prev.bounding_box.w && else if ((px + pw == smart_parent->prev->bounding_box.x + smart_parent->prev->bounding_box.w &&
x + w < smart_parent->cur.bounding_box.x + smart_parent->cur.bounding_box.w) x + w < smart_parent->cur->bounding_box.x + smart_parent->cur->bounding_box.w)
|| (!noclip && x + w == smart_parent->cur.bounding_box.x + smart_parent->cur.bounding_box.w)) || (!noclip && x + w == smart_parent->cur->bounding_box.x + smart_parent->cur->bounding_box.w))
{ {
computeminmax = EINA_TRUE; computeminmax = EINA_TRUE;
} }
/* Update bottom limit */ /* Update bottom limit */
if (noclip && y + h > smart_parent->cur.bounding_box.y + smart_parent->cur.bounding_box.h) if (noclip && y + h > smart_parent->cur->bounding_box.y + smart_parent->cur->bounding_box.h)
{ {
smart_parent->cur.bounding_box.h = y + h - smart_parent->cur.bounding_box.y; EINA_COW_STATE_WRITE_BEGIN(smart_parent, state_write, cur)
{
state_write->bounding_box.h = y + h - state_write->bounding_box.y;
}
EINA_COW_STATE_WRITE_END(smart_parent, state_write, cur);
propagate = EINA_TRUE; propagate = EINA_TRUE;
} }
else if ((py + ph == smart_parent->prev.bounding_box.y + smart_parent->prev.bounding_box.h && else if ((py + ph == smart_parent->prev->bounding_box.y + smart_parent->prev->bounding_box.h &&
y + h < smart_parent->cur.bounding_box.y + smart_parent->cur.bounding_box.h) || y + h < smart_parent->cur->bounding_box.y + smart_parent->cur->bounding_box.h) ||
(!noclip && y + h == smart_parent->cur.bounding_box.y + smart_parent->cur.bounding_box.h)) (!noclip && y + h == smart_parent->cur->bounding_box.y + smart_parent->cur->bounding_box.h))
{ {
computeminmax = EINA_TRUE; computeminmax = EINA_TRUE;
} }
@ -749,11 +782,16 @@ evas_object_update_bounding_box(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Pro
{ {
if (noclip) if (noclip)
{ {
smart_parent->cur.bounding_box.x = x; EINA_COW_STATE_WRITE_BEGIN(smart_parent, state_write, cur)
smart_parent->cur.bounding_box.y = y; {
smart_parent->cur.bounding_box.w = w; state_write->bounding_box.x = x;
smart_parent->cur.bounding_box.h = h; state_write->bounding_box.y = y;
smart_parent->cur.valid_bounding_box = EINA_TRUE; state_write->bounding_box.w = w;
state_write->bounding_box.h = h;
state_write->valid_bounding_box = EINA_TRUE;
}
EINA_COW_STATE_WRITE_END(smart_parent, state_write, cur);
propagate = EINA_TRUE; propagate = EINA_TRUE;
} }
} }
@ -810,7 +848,7 @@ _position_set(Eo *eo_obj, void *_pd, va_list *list)
return; return;
} }
if ((obj->cur.geometry.x == nx) && (obj->cur.geometry.y == ny)) return; if ((obj->cur->geometry.x == nx) && (obj->cur->geometry.y == ny)) return;
if (!(obj->layer->evas->is_frozen)) if (!(obj->layer->evas->is_frozen))
{ {
@ -829,12 +867,16 @@ _position_set(Eo *eo_obj, void *_pd, va_list *list)
eo_do(eo_obj, evas_obj_smart_move(nx, ny)); eo_do(eo_obj, evas_obj_smart_move(nx, ny));
} }
obj->cur.geometry.x = nx; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.geometry.y = ny; {
state_write->geometry.x = nx;
state_write->geometry.y = ny;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_update_bounding_box(eo_obj, obj); evas_object_update_bounding_box(eo_obj, obj);
//// obj->cur.cache.geometry.validity = 0; //// obj->cur->cache.geometry.validity = 0;
obj->changed_move = EINA_TRUE; obj->changed_move = EINA_TRUE;
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj); evas_object_clip_dirty(eo_obj, obj);
@ -849,7 +891,7 @@ _position_set(Eo *eo_obj, void *_pd, va_list *list)
is = evas_object_is_in_output_rect(eo_obj, obj, is = evas_object_is_in_output_rect(eo_obj, obj,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1); obj->layer->evas->pointer.y, 1, 1);
if ((is ^ was) && obj->cur.visible) if ((is ^ was) && obj->cur->visible)
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
@ -893,7 +935,7 @@ _size_set(Eo *eo_obj, void *_pd, va_list *list)
return; return;
} }
if ((obj->cur.geometry.w == w) && (obj->cur.geometry.h == h)) return; if ((obj->cur->geometry.w == w) && (obj->cur->geometry.h == h)) return;
if (!(obj->layer->evas->is_frozen)) if (!(obj->layer->evas->is_frozen))
{ {
@ -912,12 +954,16 @@ _size_set(Eo *eo_obj, void *_pd, va_list *list)
eo_do(eo_obj, evas_obj_smart_resize(w, h)); eo_do(eo_obj, evas_obj_smart_resize(w, h));
} }
obj->cur.geometry.w = w; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.geometry.h = h; {
state_write->geometry.w = w;
state_write->geometry.h = h;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_update_bounding_box(eo_obj, obj); evas_object_update_bounding_box(eo_obj, obj);
//// obj->cur.cache.geometry.validity = 0; //// obj->cur->cache.geometry.validity = 0;
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj); evas_object_clip_dirty(eo_obj, obj);
obj->doing.in_resize--; obj->doing.in_resize--;
@ -935,7 +981,7 @@ _size_set(Eo *eo_obj, void *_pd, va_list *list)
is = evas_object_is_in_output_rect(eo_obj, obj, is = evas_object_is_in_output_rect(eo_obj, obj,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1); obj->layer->evas->pointer.y, 1, 1);
if ((is ^ was) && (obj->cur.visible)) if ((is ^ was) && (obj->cur->visible))
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
@ -974,8 +1020,8 @@ _position_get(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
return; return;
} }
nx = obj->cur.geometry.x; nx = obj->cur->geometry.x;
ny = obj->cur.geometry.y; ny = obj->cur->geometry.y;
evas = obj->layer->evas; evas = obj->layer->evas;
@ -1006,8 +1052,8 @@ _size_get(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
return; return;
} }
if (w) *w = obj->cur.geometry.w; if (w) *w = obj->cur->geometry.w;
if (h) *h = obj->cur.geometry.h; if (h) *h = obj->cur->geometry.h;
} }
static void static void
@ -1484,11 +1530,16 @@ _show(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{ {
eo_do(eo_obj, evas_obj_smart_show()); eo_do(eo_obj, evas_obj_smart_show());
} }
if (obj->cur.visible) if (obj->cur->visible)
{ {
return; return;
} }
obj->cur.visible = 1; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->visible = 1;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj); evas_object_clip_dirty(eo_obj, obj);
if (!(obj->layer->evas->is_frozen)) if (!(obj->layer->evas->is_frozen))
@ -1528,11 +1579,17 @@ _hide(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{ {
eo_do(eo_obj, evas_obj_smart_hide()); eo_do(eo_obj, evas_obj_smart_hide());
} }
if (!obj->cur.visible) if (!obj->cur->visible)
{ {
return; return;
} }
obj->cur.visible = 0;
EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->visible = 0;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj); evas_object_clip_dirty(eo_obj, obj);
if (!(obj->layer->evas->is_frozen)) if (!(obj->layer->evas->is_frozen))
@ -1632,7 +1689,7 @@ _visible_get(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
return; return;
} }
if (visible) *visible = obj->cur.visible; if (visible) *visible = obj->cur->visible;
} }
EAPI void EAPI void
@ -1680,16 +1737,28 @@ _color_set(Eo *eo_obj, void *_pd, va_list *list)
{ {
eo_do(eo_obj, evas_obj_smart_color_set(r, g, b, a)); eo_do(eo_obj, evas_obj_smart_color_set(r, g, b, a));
} }
if ((obj->cur.color.r == r) && if ((obj->cur->color.r == r) &&
(obj->cur.color.g == g) && (obj->cur->color.g == g) &&
(obj->cur.color.b == b) && (obj->cur->color.b == b) &&
(obj->cur.color.a == a)) return; (obj->cur->color.a == a)) return;
obj->cur.color.r = r;
obj->cur.color.g = g; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.color.b = b; {
state_write->color.r = r;
state_write->color.g = g;
state_write->color.b = b;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_clip_dirty(eo_obj, obj); evas_object_clip_dirty(eo_obj, obj);
if ((obj->cur.color.a == 0) && (a == 0) && (obj->cur.render_op == EVAS_RENDER_BLEND)) return; if ((obj->cur->color.a == 0) && (a == 0) && (obj->cur->render_op == EVAS_RENDER_BLEND)) return;
obj->cur.color.a = a;
EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->color.a = a;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
obj->changed_color = EINA_TRUE; obj->changed_color = EINA_TRUE;
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
} }
@ -1718,10 +1787,10 @@ _color_get(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
if (r) *r = 0; if (g) *g = 0; if (b) *b = 0; if (a) *a = 0; if (r) *r = 0; if (g) *g = 0; if (b) *b = 0; if (a) *a = 0;
return; return;
} }
if (r) *r = obj->cur.color.r; if (r) *r = obj->cur->color.r;
if (g) *g = obj->cur.color.g; if (g) *g = obj->cur->color.g;
if (b) *b = obj->cur.color.b; if (b) *b = obj->cur->color.b;
if (a) *a = obj->cur.color.a; if (a) *a = obj->cur->color.a;
} }
EAPI void EAPI void
@ -1741,8 +1810,14 @@ _anti_alias_set(Eo *eo_obj, void *_pd, va_list *list)
if (obj->delete_me) return; if (obj->delete_me) return;
anti_alias = !!anti_alias; anti_alias = !!anti_alias;
if (obj->cur.anti_alias == anti_alias)return; if (obj->cur->anti_alias == anti_alias)return;
obj->cur.anti_alias = anti_alias;
EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->anti_alias = anti_alias;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
} }
@ -1769,7 +1844,7 @@ _anti_alias_get(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
return; return;
} }
if (anti_alias) *anti_alias = obj->cur.anti_alias; if (anti_alias) *anti_alias = obj->cur->anti_alias;
} }
EAPI void EAPI void
@ -1788,8 +1863,14 @@ _scale_set(Eo *eo_obj, void *_pd, va_list *list)
double scale = va_arg(*list, double); double scale = va_arg(*list, double);
if (obj->delete_me) return; if (obj->delete_me) return;
if (obj->cur.scale == scale) return; if (obj->cur->scale == scale) return;
obj->cur.scale = scale;
EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->scale = scale;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
if (obj->func->scale_update) obj->func->scale_update(eo_obj); if (obj->func->scale_update) obj->func->scale_update(eo_obj);
} }
@ -1816,7 +1897,7 @@ _scale_get(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
if (scale) *scale = 1.0; if (scale) *scale = 1.0;
return; return;
} }
if (scale) *scale = obj->cur.scale; if (scale) *scale = obj->cur->scale;
} }
EAPI void EAPI void
@ -1835,8 +1916,14 @@ _render_op_set(Eo *eo_obj, void *_pd, va_list *list)
Evas_Render_Op render_op = va_arg(*list, Evas_Render_Op); Evas_Render_Op render_op = va_arg(*list, Evas_Render_Op);
if (obj->delete_me) return; if (obj->delete_me) return;
if (obj->cur.render_op == render_op) return; if (obj->cur->render_op == render_op) return;
obj->cur.render_op = render_op;
EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->render_op = render_op;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
} }
@ -1862,7 +1949,7 @@ _render_op_get(Eo *eo_obj EINA_UNUSED, void *_pd, va_list *list)
if (render_op) *render_op = EVAS_RENDER_BLEND; if (render_op) *render_op = EVAS_RENDER_BLEND;
return; return;
} }
if (render_op) *render_op = obj->cur.render_op; if (render_op) *render_op = obj->cur->render_op;
} }
EAPI Evas * EAPI Evas *
@ -2045,7 +2132,7 @@ _canvas_object_top_at_xy_get(Eo *eo_e EINA_UNUSED, void *_pd, va_list *list)
if ((!include_pass_events_objects) && if ((!include_pass_events_objects) &&
(evas_event_passes_through(eo_obj, obj))) continue; (evas_event_passes_through(eo_obj, obj))) continue;
if (evas_object_is_source_invisible(eo_obj, obj)) continue; if (evas_object_is_source_invisible(eo_obj, obj)) continue;
if ((!include_hidden_objects) && (!obj->cur.visible)) continue; if ((!include_hidden_objects) && (!obj->cur->visible)) continue;
evas_object_clip_recalc(eo_obj, obj); evas_object_clip_recalc(eo_obj, obj);
if ((evas_object_is_in_output_rect(eo_obj, obj, xx, yy, 1, 1)) && if ((evas_object_is_in_output_rect(eo_obj, obj, xx, yy, 1, 1)) &&
(!obj->clip.clipees)) (!obj->clip.clipees))
@ -2117,7 +2204,7 @@ _canvas_object_top_in_rectangle_get(Eo *eo_e EINA_UNUSED, void *_pd, va_list *li
if ((!include_pass_events_objects) && if ((!include_pass_events_objects) &&
(evas_event_passes_through(eo_obj, obj))) continue; (evas_event_passes_through(eo_obj, obj))) continue;
if (evas_object_is_source_invisible(eo_obj, obj)) continue; if (evas_object_is_source_invisible(eo_obj, obj)) continue;
if ((!include_hidden_objects) && (!obj->cur.visible)) continue; if ((!include_hidden_objects) && (!obj->cur->visible)) continue;
evas_object_clip_recalc(eo_obj, obj); evas_object_clip_recalc(eo_obj, obj);
if ((evas_object_is_in_output_rect(eo_obj, obj, xx, yy, ww, hh)) && if ((evas_object_is_in_output_rect(eo_obj, obj, xx, yy, ww, hh)) &&
(!obj->clip.clipees)) (!obj->clip.clipees))
@ -2172,7 +2259,7 @@ _canvas_objects_at_xy_get(Eo *eo_e EINA_UNUSED, void *_pd, va_list *list)
if ((!include_pass_events_objects) && if ((!include_pass_events_objects) &&
(evas_event_passes_through(eo_obj, obj))) continue; (evas_event_passes_through(eo_obj, obj))) continue;
if (evas_object_is_source_invisible(eo_obj, obj)) continue; if (evas_object_is_source_invisible(eo_obj, obj)) continue;
if ((!include_hidden_objects) && (!obj->cur.visible)) continue; if ((!include_hidden_objects) && (!obj->cur->visible)) continue;
evas_object_clip_recalc(eo_obj, obj); evas_object_clip_recalc(eo_obj, obj);
if ((evas_object_is_in_output_rect(eo_obj, obj, xx, yy, 1, 1)) && if ((evas_object_is_in_output_rect(eo_obj, obj, xx, yy, 1, 1)) &&
(!obj->clip.clipees)) (!obj->clip.clipees))
@ -2244,7 +2331,7 @@ _canvas_objects_in_rectangle_get(Eo *eo_e EINA_UNUSED, void *_pd, va_list *list)
if ((!include_pass_events_objects) && if ((!include_pass_events_objects) &&
(evas_event_passes_through(eo_obj, obj))) continue; (evas_event_passes_through(eo_obj, obj))) continue;
if (evas_object_is_source_invisible(eo_obj, obj)) continue; if (evas_object_is_source_invisible(eo_obj, obj)) continue;
if ((!include_hidden_objects) && (!obj->cur.visible)) continue; if ((!include_hidden_objects) && (!obj->cur->visible)) continue;
evas_object_clip_recalc(eo_obj, obj); evas_object_clip_recalc(eo_obj, obj);
if ((evas_object_is_in_output_rect(eo_obj, obj, xx, yy, ww, hh)) && if ((evas_object_is_in_output_rect(eo_obj, obj, xx, yy, ww, hh)) &&
(!obj->clip.clipees)) (!obj->clip.clipees))

View File

@ -129,8 +129,8 @@ _polygon_point_add(Eo *eo_obj, void *_pd, va_list *list)
} }
if (!o->points) if (!o->points)
{ {
o->offset.x = obj->cur.geometry.x; o->offset.x = obj->cur->geometry.x;
o->offset.y = obj->cur.geometry.y; o->offset.y = obj->cur->geometry.y;
} }
else else
{ {
@ -151,35 +151,44 @@ _polygon_point_add(Eo *eo_obj, void *_pd, va_list *list)
if (!o->points) if (!o->points)
{ {
obj->cur.geometry.x = p->x; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.geometry.y = p->y; {
obj->cur.geometry.w = 2; state_write->geometry.x = p->x;
obj->cur.geometry.h = 2; state_write->geometry.y = p->y;
state_write->geometry.w = 2;
state_write->geometry.h = 2;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
} }
else else
{ {
if (p->x < obj->cur.geometry.x) min_x = p->x; if (p->x < obj->cur->geometry.x) min_x = p->x;
else min_x = obj->cur.geometry.x; else min_x = obj->cur->geometry.x;
if (p->x > (obj->cur.geometry.x + obj->cur.geometry.w - 2)) if (p->x > (obj->cur->geometry.x + obj->cur->geometry.w - 2))
max_x = p->x; max_x = p->x;
else max_x = obj->cur.geometry.x + obj->cur.geometry.w - 2; else max_x = obj->cur->geometry.x + obj->cur->geometry.w - 2;
if (p->y < obj->cur.geometry.y) min_y = p->y; if (p->y < obj->cur->geometry.y) min_y = p->y;
else min_y = obj->cur.geometry.y; else min_y = obj->cur->geometry.y;
if (p->y > (obj->cur.geometry.y + obj->cur.geometry.h - 2)) if (p->y > (obj->cur->geometry.y + obj->cur->geometry.h - 2))
max_y = p->y; max_y = p->y;
else max_y = obj->cur.geometry.y + obj->cur.geometry.h - 2; else max_y = obj->cur->geometry.y + obj->cur->geometry.h - 2;
obj->cur.geometry.x = min_x;
obj->cur.geometry.y = min_y; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.geometry.w = max_x - min_x + 2; {
obj->cur.geometry.h = max_y - min_y + 2; state_write->geometry.x = min_x;
state_write->geometry.y = min_y;
state_write->geometry.w = max_x - min_x + 2;
state_write->geometry.h = max_y - min_y + 2;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
} }
o->points = eina_list_append(o->points, p); o->points = eina_list_append(o->points, p);
o->geometry = obj->cur.geometry; o->geometry = obj->cur->geometry;
o->offset.x = 0; o->offset.x = 0;
o->offset.y = 0; o->offset.y = 0;
//// obj->cur.cache.geometry.validity = 0; //// obj->cur->cache.geometry.validity = 0;
o->changed = EINA_TRUE; o->changed = EINA_TRUE;
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj); evas_object_clip_dirty(eo_obj, obj);
@ -193,7 +202,7 @@ _polygon_point_add(Eo *eo_obj, void *_pd, va_list *list)
!evas_event_freezes_through(eo_obj, obj) && !evas_event_freezes_through(eo_obj, obj) &&
!evas_object_is_source_invisible(eo_obj, obj)) !evas_object_is_source_invisible(eo_obj, obj))
{ {
if ((is ^ was) && obj->cur.visible) if ((is ^ was) && obj->cur->visible)
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
@ -229,11 +238,17 @@ _polygon_points_clear(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
free(o->points->data); free(o->points->data);
o->points = eina_list_remove(o->points, o->points->data); o->points = eina_list_remove(o->points, o->points->data);
} }
obj->cur.geometry.x = 0;
obj->cur.geometry.y = 0; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.geometry.w = 0; {
obj->cur.geometry.h = 0; state_write->geometry.x = 0;
//// obj->cur.cache.geometry.validity = 0; state_write->geometry.y = 0;
state_write->geometry.w = 0;
state_write->geometry.h = 0;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
//// obj->cur->cache.geometry.validity = 0;
o->changed = EINA_TRUE; o->changed = EINA_TRUE;
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj); evas_object_clip_dirty(eo_obj, obj);
@ -241,7 +256,7 @@ _polygon_points_clear(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
is = evas_object_is_in_output_rect(eo_obj, obj, is = evas_object_is_in_output_rect(eo_obj, obj,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1); obj->layer->evas->pointer.y, 1, 1);
if ((is || was) && obj->cur.visible) if ((is || was) && obj->cur->visible)
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
@ -256,18 +271,6 @@ static void
evas_object_polygon_init(Evas_Object *eo_obj) evas_object_polygon_init(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS); Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS);
/* set up default settings for this kind of object */
obj->cur.color.r = 255;
obj->cur.color.g = 255;
obj->cur.color.b = 255;
obj->cur.color.a = 255;
obj->cur.geometry.x = 0;
obj->cur.geometry.y = 0;
obj->cur.geometry.w = 0;
obj->cur.geometry.h = 0;
obj->cur.layer = 0;
/* set up object-specific settings */
obj->prev = obj->cur;
/* set up methods (compulsory) */ /* set up methods (compulsory) */
obj->func = &object_func; obj->func = &object_func;
obj->type = o_type; obj->type = o_type;
@ -306,14 +309,14 @@ evas_object_polygon_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj,
/* render object to surface with context, and offxet by x,y */ /* render object to surface with context, and offxet by x,y */
obj->layer->evas->engine.func->context_color_set(output, obj->layer->evas->engine.func->context_color_set(output,
context, context,
obj->cur.cache.clip.r, obj->cur->cache.clip.r,
obj->cur.cache.clip.g, obj->cur->cache.clip.g,
obj->cur.cache.clip.b, obj->cur->cache.clip.b,
obj->cur.cache.clip.a); obj->cur->cache.clip.a);
obj->layer->evas->engine.func->context_multiplier_unset(output, obj->layer->evas->engine.func->context_multiplier_unset(output,
context); context);
obj->layer->evas->engine.func->context_render_op_set(output, context, obj->layer->evas->engine.func->context_render_op_set(output, context,
obj->cur.render_op); obj->cur->render_op);
if (o->changed) if (o->changed)
{ {
o->engine_data = obj->layer->evas->engine.func->polygon_points_clear(obj->layer->evas->engine.data.output, o->engine_data = obj->layer->evas->engine.func->polygon_points_clear(obj->layer->evas->engine.data.output,
@ -354,11 +357,11 @@ evas_object_polygon_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *
/* then when this is done the object needs to figure if it changed and */ /* then when this is done the object needs to figure if it changed and */
/* if so what and where and add the appropriate redraw lines */ /* if so what and where and add the appropriate redraw lines */
/* if someone is clipping this obj - go calculate the clipper */ /* if someone is clipping this obj - go calculate the clipper */
if (obj->cur.clipper) if (obj->cur->clipper)
{ {
if (obj->cur.cache.clip.dirty) if (obj->cur->cache.clip.dirty)
evas_object_clip_recalc(obj->cur.eo_clipper, obj->cur.clipper); evas_object_clip_recalc(obj->cur->eo_clipper, obj->cur->clipper);
obj->cur.clipper->func->render_pre(obj->cur.eo_clipper, obj->cur.clipper); obj->cur->clipper->func->render_pre(obj->cur->eo_clipper, obj->cur->clipper);
} }
/* now figure what changed and add draw rects */ /* now figure what changed and add draw rects */
/* if it just became visible or invisible */ /* if it just became visible or invisible */
@ -385,16 +388,16 @@ evas_object_polygon_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *
goto done; goto done;
} }
/* if it changed render op */ /* if it changed render op */
if (obj->cur.render_op != obj->prev.render_op) if (obj->cur->render_op != obj->prev->render_op)
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
goto done; goto done;
} }
/* if it changed color */ /* if it changed color */
if ((obj->cur.color.r != obj->prev.color.r) || if ((obj->cur->color.r != obj->prev->color.r) ||
(obj->cur.color.g != obj->prev.color.g) || (obj->cur->color.g != obj->prev->color.g) ||
(obj->cur.color.b != obj->prev.color.b) || (obj->cur->color.b != obj->prev->color.b) ||
(obj->cur.color.a != obj->prev.color.a)) (obj->cur->color.a != obj->prev->color.a))
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
goto done; goto done;
@ -402,28 +405,28 @@ evas_object_polygon_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *
/* if it changed geometry - and obviously not visibility or color */ /* if it changed geometry - and obviously not visibility or color */
/* calculate differences since we have a constant color fill */ /* calculate differences since we have a constant color fill */
/* we really only need to update the differences */ /* we really only need to update the differences */
if ((obj->cur.geometry.x != obj->prev.geometry.x) || if ((obj->cur->geometry.x != obj->prev->geometry.x) ||
(obj->cur.geometry.y != obj->prev.geometry.y) || (obj->cur->geometry.y != obj->prev->geometry.y) ||
(obj->cur.geometry.w != obj->prev.geometry.w) || (obj->cur->geometry.w != obj->prev->geometry.w) ||
(obj->cur.geometry.h != obj->prev.geometry.h) || (obj->cur->geometry.h != obj->prev->geometry.h) ||
(o->changed)) (o->changed))
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
goto done; goto done;
} }
done: done:
if ((obj->cur.geometry.x != obj->prev.geometry.x) || if ((obj->cur->geometry.x != obj->prev->geometry.x) ||
(obj->cur.geometry.y != obj->prev.geometry.y)) (obj->cur->geometry.y != obj->prev->geometry.y))
{ {
if (!o->changed) if (!o->changed)
{ {
o->offset.x = obj->cur.geometry.x - obj->prev.geometry.x; o->offset.x = obj->cur->geometry.x - obj->prev->geometry.x;
o->offset.y = obj->cur.geometry.y - obj->prev.geometry.y; o->offset.y = obj->cur->geometry.y - obj->prev->geometry.y;
} }
else else
{ {
o->offset.x = obj->cur.geometry.x - o->geometry.x; o->offset.x = obj->cur->geometry.x - o->geometry.x;
o->offset.y = obj->cur.geometry.y - o->geometry.y; o->offset.y = obj->cur->geometry.y - o->geometry.y;
} }
} }
evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, eo_obj, is_v, was_v); evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, eo_obj, is_v, was_v);

View File

@ -97,19 +97,6 @@ static void
evas_object_rectangle_init(Evas_Object *eo_obj) evas_object_rectangle_init(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS); Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS);
/* set up default settings for this kind of object */
obj->cur.color.r = 255;
obj->cur.color.g = 255;
obj->cur.color.b = 255;
obj->cur.color.a = 255;
obj->cur.geometry.x = 0;
obj->cur.geometry.y = 0;
obj->cur.geometry.w = 0;
obj->cur.geometry.h = 0;
obj->cur.layer = 0;
obj->cur.render_op = EVAS_RENDER_BLEND;
/* set up object-specific settings */
obj->prev = obj->cur;
/* set up methods (compulsory) */ /* set up methods (compulsory) */
obj->func = &object_func; obj->func = &object_func;
obj->type = o_type; obj->type = o_type;
@ -127,26 +114,26 @@ evas_object_rectangle_render(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protec
/* render object to surface with context, and offxet by x,y */ /* render object to surface with context, and offxet by x,y */
obj->layer->evas->engine.func->context_color_set(output, obj->layer->evas->engine.func->context_color_set(output,
context, context,
obj->cur.cache.clip.r, obj->cur->cache.clip.r,
obj->cur.cache.clip.g, obj->cur->cache.clip.g,
obj->cur.cache.clip.b, obj->cur->cache.clip.b,
obj->cur.cache.clip.a); obj->cur->cache.clip.a);
obj->layer->evas->engine.func->context_multiplier_unset(output, obj->layer->evas->engine.func->context_multiplier_unset(output,
context); context);
obj->layer->evas->engine.func->context_render_op_set(output, context, obj->layer->evas->engine.func->context_render_op_set(output, context,
obj->cur.render_op); obj->cur->render_op);
obj->layer->evas->engine.func->rectangle_draw(output, obj->layer->evas->engine.func->rectangle_draw(output,
context, context,
surface, surface,
obj->cur.geometry.x + x, obj->cur->geometry.x + x,
obj->cur.geometry.y + y, obj->cur->geometry.y + y,
obj->cur.geometry.w, obj->cur->geometry.w,
obj->cur.geometry.h, obj->cur->geometry.h,
do_async); do_async);
//// obj->cur.cache.geometry.x + x, //// obj->cur->cache.geometry.x + x,
//// obj->cur.cache.geometry.y + y, //// obj->cur->cache.geometry.y + y,
//// obj->cur.cache.geometry.w, //// obj->cur->cache.geometry.w,
//// obj->cur.cache.geometry.h); //// obj->cur->cache.geometry.h);
} }
static void static void
@ -163,11 +150,11 @@ evas_object_rectangle_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data
/* then when this is done the object needs to figure if it changed and */ /* then when this is done the object needs to figure if it changed and */
/* if so what and where and add the appropriate redraw rectangles */ /* if so what and where and add the appropriate redraw rectangles */
/* if someone is clipping this obj - go calculate the clipper */ /* if someone is clipping this obj - go calculate the clipper */
if (obj->cur.clipper) if (obj->cur->clipper)
{ {
if (obj->cur.cache.clip.dirty) if (obj->cur->cache.clip.dirty)
evas_object_clip_recalc(obj->cur.eo_clipper, obj->cur.clipper); evas_object_clip_recalc(obj->cur->eo_clipper, obj->cur->clipper);
obj->cur.clipper->func->render_pre(obj->cur.eo_clipper, obj->cur.clipper); obj->cur->clipper->func->render_pre(obj->cur->eo_clipper, obj->cur->clipper);
} }
/* now figure what changed and add draw rects */ /* now figure what changed and add draw rects */
/* if it just became visible or invisible */ /* if it just became visible or invisible */
@ -195,16 +182,16 @@ evas_object_rectangle_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data
goto done; goto done;
} }
/* if it changed render op */ /* if it changed render op */
if (obj->cur.render_op != obj->prev.render_op) if (obj->cur->render_op != obj->prev->render_op)
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
goto done; goto done;
} }
/* if it changed color */ /* if it changed color */
if ((obj->cur.color.r != obj->prev.color.r) || if ((obj->cur->color.r != obj->prev->color.r) ||
(obj->cur.color.g != obj->prev.color.g) || (obj->cur->color.g != obj->prev->color.g) ||
(obj->cur.color.b != obj->prev.color.b) || (obj->cur->color.b != obj->prev->color.b) ||
(obj->cur.color.a != obj->prev.color.a)) (obj->cur->color.a != obj->prev->color.a))
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
goto done; goto done;
@ -212,28 +199,28 @@ evas_object_rectangle_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data
/* if it changed geometry - and obviously not visibility or color */ /* if it changed geometry - and obviously not visibility or color */
/* calculate differences since we have a constant color fill */ /* calculate differences since we have a constant color fill */
/* we really only need to update the differences */ /* we really only need to update the differences */
if ((obj->cur.geometry.x != obj->prev.geometry.x) || if ((obj->cur->geometry.x != obj->prev->geometry.x) ||
(obj->cur.geometry.y != obj->prev.geometry.y) || (obj->cur->geometry.y != obj->prev->geometry.y) ||
(obj->cur.geometry.w != obj->prev.geometry.w) || (obj->cur->geometry.w != obj->prev->geometry.w) ||
(obj->cur.geometry.h != obj->prev.geometry.h)) (obj->cur->geometry.h != obj->prev->geometry.h))
{ {
evas_rects_return_difference_rects(&obj->layer->evas->clip_changes, evas_rects_return_difference_rects(&obj->layer->evas->clip_changes,
obj->cur.geometry.x, obj->cur->geometry.x,
obj->cur.geometry.y, obj->cur->geometry.y,
obj->cur.geometry.w, obj->cur->geometry.w,
obj->cur.geometry.h, obj->cur->geometry.h,
obj->prev.geometry.x, obj->prev->geometry.x,
obj->prev.geometry.y, obj->prev->geometry.y,
obj->prev.geometry.w, obj->prev->geometry.w,
obj->prev.geometry.h); obj->prev->geometry.h);
//// rl = evas_rects_return_difference_rects(obj->cur.cache.geometry.x, //// rl = evas_rects_return_difference_rects(obj->cur->cache.geometry.x,
//// obj->cur.cache.geometry.y, //// obj->cur->cache.geometry.y,
//// obj->cur.cache.geometry.w, //// obj->cur->cache.geometry.w,
//// obj->cur.cache.geometry.h, //// obj->cur->cache.geometry.h,
//// obj->prev.cache.geometry.x, //// obj->prev->cache.geometry.x,
//// obj->prev.cache.geometry.y, //// obj->prev->cache.geometry.y,
//// obj->prev.cache.geometry.w, //// obj->prev->cache.geometry.w,
//// obj->prev.cache.geometry.h); //// obj->prev->cache.geometry.h);
goto done; goto done;
} }
/* it obviously didn't change - add a NO obscure - this "unupdates" this */ /* it obviously didn't change - add a NO obscure - this "unupdates" this */
@ -244,10 +231,10 @@ evas_object_rectangle_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data
evas_object_is_opaque(eo_obj) && evas_object_is_opaque(eo_obj) &&
(!obj->clip.clipees)) (!obj->clip.clipees))
obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output, obj->layer->evas->engine.func->output_redraws_rect_del(obj->layer->evas->engine.data.output,
obj->cur.cache.clip.x, obj->cur->cache.clip.x,
obj->cur.cache.clip.y, obj->cur->cache.clip.y,
obj->cur.cache.clip.w, obj->cur->cache.clip.w,
obj->cur.cache.clip.h); obj->cur->cache.clip.h);
*/ */
done: done:
evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, eo_obj, is_v, was_v); evas_object_render_pre_effect_updates(&obj->layer->evas->clip_changes, eo_obj, is_v, was_v);
@ -272,9 +259,9 @@ evas_object_rectangle_is_opaque(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Pro
/* this returns 1 if the internal object data implies that the object is */ /* this returns 1 if the internal object data implies that the object is */
/* currently fully opaque over the entire rectangle it occupies */ /* currently fully opaque over the entire rectangle it occupies */
if ((obj->map->cur.map) && (obj->map->cur.usemap)) return 0; if ((obj->map->cur.map) && (obj->map->cur.usemap)) return 0;
if (obj->cur.render_op == EVAS_RENDER_COPY) if (obj->cur->render_op == EVAS_RENDER_COPY)
return 1; return 1;
if (obj->cur.render_op != EVAS_RENDER_BLEND) if (obj->cur->render_op != EVAS_RENDER_BLEND)
return 0; return 0;
return 1; return 1;
} }
@ -284,9 +271,9 @@ evas_object_rectangle_was_opaque(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Pr
{ {
/* this returns 1 if the internal object data implies that the object was */ /* this returns 1 if the internal object data implies that the object was */
/* previously fully opaque over the entire rectangle it occupies */ /* previously fully opaque over the entire rectangle it occupies */
if (obj->prev.render_op == EVAS_RENDER_COPY) if (obj->prev->render_op == EVAS_RENDER_COPY)
return 1; return 1;
if (obj->prev.render_op != EVAS_RENDER_BLEND) if (obj->prev->render_op != EVAS_RENDER_BLEND)
return 0; return 0;
return 1; return 1;
} }

View File

@ -257,7 +257,12 @@ _smart_member_add(Eo *smart_obj, void *_pd, va_list *list)
o->member_count++; o->member_count++;
evas_object_release(eo_obj, obj, 1); evas_object_release(eo_obj, obj, 1);
obj->layer = smart->layer; obj->layer = smart->layer;
obj->cur.layer = obj->layer->layer; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->layer = obj->layer->layer;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
obj->layer->usage++; obj->layer->usage++;
obj->smart.parent = smart_obj; obj->smart.parent = smart_obj;
o->contained = eina_inlist_append(o->contained, EINA_INLIST_GET(obj)); o->contained = eina_inlist_append(o->contained, EINA_INLIST_GET(obj));
@ -303,7 +308,13 @@ _smart_member_del(Eo *smart_obj, void *_pd EINA_UNUSED, va_list *list)
obj->smart.parent = NULL; obj->smart.parent = NULL;
evas_object_smart_member_cache_invalidate(eo_obj, EINA_TRUE, EINA_TRUE, EINA_TRUE); evas_object_smart_member_cache_invalidate(eo_obj, EINA_TRUE, EINA_TRUE, EINA_TRUE);
obj->layer->usage--; obj->layer->usage--;
obj->cur.layer = obj->layer->layer;
EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->layer = obj->layer->layer;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_inject(eo_obj, obj, obj->layer->evas->evas); evas_object_inject(eo_obj, obj, obj->layer->evas->evas);
obj->restack = 1; obj->restack = 1;
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
@ -1347,17 +1358,17 @@ evas_object_smart_bounding_box_update(Evas_Object *eo_obj, Evas_Object_Protected
{ {
evas_object_smart_bounding_box_update(o->object, o); evas_object_smart_bounding_box_update(o->object, o);
tx = o->cur.bounding_box.x; tx = o->cur->bounding_box.x;
ty = o->cur.bounding_box.y; ty = o->cur->bounding_box.y;
tw = o->cur.bounding_box.x + o->cur.bounding_box.w; tw = o->cur->bounding_box.x + o->cur->bounding_box.w;
th = o->cur.bounding_box.y + o->cur.bounding_box.h; th = o->cur->bounding_box.y + o->cur->bounding_box.h;
} }
else else
{ {
tx = o->cur.geometry.x; tx = o->cur->geometry.x;
ty = o->cur.geometry.y; ty = o->cur->geometry.y;
tw = o->cur.geometry.x + o->cur.geometry.w; tw = o->cur->geometry.x + o->cur->geometry.w;
th = o->cur.geometry.y + o->cur.geometry.h; th = o->cur->geometry.y + o->cur->geometry.h;
} }
if (tx < minx) minx = tx; if (tx < minx) minx = tx;
@ -1366,26 +1377,42 @@ evas_object_smart_bounding_box_update(Evas_Object *eo_obj, Evas_Object_Protected
if (th > maxh) maxh = th; if (th > maxh) maxh = th;
} }
if (minx != obj->cur.bounding_box.x) if (minx != obj->cur->bounding_box.x)
{ {
obj->cur.bounding_box.w += obj->cur.bounding_box.x - minx; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.bounding_box.x = minx; {
state_write->bounding_box.w += state_write->bounding_box.x - minx;
state_write->bounding_box.x = minx;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
} }
if (miny != obj->cur.bounding_box.y) if (miny != obj->cur->bounding_box.y)
{ {
obj->cur.bounding_box.h += obj->cur.bounding_box.y - miny; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.bounding_box.y = miny; {
state_write->bounding_box.h += state_write->bounding_box.y - miny;
state_write->bounding_box.y = miny;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
} }
if (maxw != obj->cur.bounding_box.x + obj->cur.bounding_box.w) if (maxw != obj->cur->bounding_box.x + obj->cur->bounding_box.w)
{ {
obj->cur.bounding_box.w = maxw - obj->cur.bounding_box.x; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->bounding_box.w = maxw - state_write->bounding_box.x;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
} }
if (maxh != obj->cur.bounding_box.y + obj->cur.bounding_box.h) if (maxh != obj->cur->bounding_box.y + obj->cur->bounding_box.h)
{ {
obj->cur.bounding_box.h = maxh - obj->cur.bounding_box.y; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->bounding_box.h = maxh - state_write->bounding_box.y;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
} }
} }
@ -1395,18 +1422,6 @@ evas_object_smart_init(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS); Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS);
obj->is_smart = EINA_TRUE; obj->is_smart = EINA_TRUE;
/* set up default settings for this kind of object */
obj->cur.color.r = 255;
obj->cur.color.g = 255;
obj->cur.color.b = 255;
obj->cur.color.a = 255;
obj->cur.geometry.x = 0;
obj->cur.geometry.y = 0;
obj->cur.geometry.w = 0;
obj->cur.geometry.h = 0;
obj->cur.layer = 0;
/* set up object-specific settings */
obj->prev = obj->cur;
/* set up methods (compulsory) */ /* set up methods (compulsory) */
obj->func = &object_func; obj->func = &object_func;
} }
@ -1421,7 +1436,7 @@ static void
evas_object_smart_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) evas_object_smart_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{ {
if (obj->pre_render_done) return; if (obj->pre_render_done) return;
if (!obj->child_has_map && !obj->cur.cached_surface) if (!obj->child_has_map && !obj->cur->cached_surface)
{ {
#if 0 #if 0
Evas_Object_Smart *o; Evas_Object_Smart *o;
@ -1429,10 +1444,10 @@ evas_object_smart_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *ob
fprintf(stderr, ""); fprintf(stderr, "");
o = (Evas_Object_Smart *)(obj->object_data); o = (Evas_Object_Smart *)(obj->object_data);
if (/* o->member_count > 1 && */ if (/* o->member_count > 1 && */
obj->cur.bounding_box.w == obj->prev.bounding_box.w && obj->cur->bounding_box.w == obj->prev->bounding_box.w &&
obj->cur.bounding_box.h == obj->prev.bounding_box.h && obj->cur->bounding_box.h == obj->prev->bounding_box.h &&
(obj->cur.bounding_box.x != obj->prev.bounding_box.x || (obj->cur->bounding_box.x != obj->prev->bounding_box.x ||
obj->cur.bounding_box.y != obj->prev.bounding_box.y)) obj->cur->bounding_box.y != obj->prev->bounding_box.y))
{ {
Eina_Bool cache_map = EINA_FALSE; Eina_Bool cache_map = EINA_FALSE;
@ -1456,14 +1471,14 @@ evas_object_smart_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *ob
int speed_x, speed_y; int speed_x, speed_y;
int speed_px, speed_py; int speed_px, speed_py;
speed_x = obj->cur.geometry.x - obj->prev.geometry.x; speed_x = obj->cur->geometry.x - obj->prev->geometry.x;
speed_y = obj->cur.geometry.y - obj->prev.geometry.y; speed_y = obj->cur->geometry.y - obj->prev->geometry.y;
speed_px = obj->smart.parent->cur.geometry.x - obj->smart.parent->prev.geometry.x; speed_px = obj->smart.parent->cur.geometry.x - obj->smart.parent->prev.geometry.x;
speed_py = obj->smart.parent->cur.geometry.y - obj->smart.parent->prev.geometry.y; speed_py = obj->smart.parent->cur.geometry.y - obj->smart.parent->prev.geometry.y;
/* speed_x = obj->cur.bounding_box.x - obj->prev.bounding_box.x; */ /* speed_x = obj->cur->bounding_box.x - obj->prev->bounding_box.x; */
/* speed_y = obj->cur.bounding_box.y - obj->prev.bounding_box.y; */ /* speed_y = obj->cur->bounding_box.y - obj->prev->bounding_box.y; */
/* speed_px = obj->smart.parent->cur.bounding_box.x - obj->smart.parent->prev.bounding_box.x; */ /* speed_px = obj->smart.parent->cur.bounding_box.x - obj->smart.parent->prev.bounding_box.x; */
/* speed_py = obj->smart.parent->cur.bounding_box.y - obj->smart.parent->prev.bounding_box.y; */ /* speed_py = obj->smart.parent->cur.bounding_box.y - obj->smart.parent->prev.bounding_box.y; */
@ -1480,15 +1495,15 @@ evas_object_smart_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *ob
if (cache_map) if (cache_map)
fprintf(stderr, "Wouhou, I can detect moving smart object (%s, %p [%i, %i, %i, %i] < %s, %p [%i, %i, %i, %i])\n", fprintf(stderr, "Wouhou, I can detect moving smart object (%s, %p [%i, %i, %i, %i] < %s, %p [%i, %i, %i, %i])\n",
evas_object_type_get(eo_obj), obj, evas_object_type_get(eo_obj), obj,
obj->cur.bounding_box.x - obj->prev.bounding_box.x, obj->cur->bounding_box.x - obj->prev->bounding_box.x,
obj->cur.bounding_box.y - obj->prev.bounding_box.y, obj->cur->bounding_box.y - obj->prev->bounding_box.y,
obj->cur.bounding_box.w, obj->cur.bounding_box.h, obj->cur->bounding_box.w, obj->cur->bounding_box.h,
evas_object_type_get(obj->smart.parent), obj->smart.parent, evas_object_type_get(obj->smart.parent), obj->smart.parent,
obj->smart.parent->cur.bounding_box.x - obj->smart.parent->prev.bounding_box.x, obj->smart.parent->cur.bounding_box.x - obj->smart.parent->prev.bounding_box.x,
obj->smart.parent->cur.bounding_box.y - obj->smart.parent->prev.bounding_box.y, obj->smart.parent->cur.bounding_box.y - obj->smart.parent->prev.bounding_box.y,
obj->smart.parent->cur.bounding_box.w, obj->smart.parent->cur.bounding_box.h); obj->smart.parent->cur.bounding_box.w, obj->smart.parent->cur.bounding_box.h);
obj->cur.cached_surface = cache_map; obj->cur->cached_surface = cache_map;
} }
#endif #endif
} }

View File

@ -41,8 +41,8 @@ _smart_move_children_relative(Eo *eo_obj, void *_pd EINA_UNUSED, va_list *list)
// evas_object_geometry_get(child, &orig_x, &orig_y, NULL, NULL); // evas_object_geometry_get(child, &orig_x, &orig_y, NULL, NULL);
if (child->delete_me) continue; if (child->delete_me) continue;
if (child->is_static_clip) continue; if (child->is_static_clip) continue;
orig_x = child->cur.geometry.x; orig_x = child->cur->geometry.x;
orig_y = child->cur.geometry.y; orig_y = child->cur->geometry.y;
evas_object_move(child->object, orig_x + dx, orig_y + dy); evas_object_move(child->object, orig_x + dx, orig_y + dy);
} }
} }

View File

@ -172,7 +172,7 @@ _evas_object_text_items_clean(Evas_Object_Protected_Data *obj, Evas_Object_Text
(!memcmp(&o->cur.glow, &o->prev.glow, sizeof (o->cur.glow))) && (!memcmp(&o->cur.glow, &o->prev.glow, sizeof (o->cur.glow))) &&
(!memcmp(&o->cur.glow2, &o->prev.glow2, sizeof (o->cur.glow2))) && (!memcmp(&o->cur.glow2, &o->prev.glow2, sizeof (o->cur.glow2))) &&
(o->cur.style == o->prev.style) && (o->cur.style == o->prev.style) &&
(obj->cur.scale == obj->prev.scale)) (obj->cur->scale == obj->prev->scale))
{ {
if ((o->last_computed.ellipsis_start) && if ((o->last_computed.ellipsis_start) &&
(o->last_computed.ellipsis_start == o->items)) (o->last_computed.ellipsis_start == o->items))
@ -465,7 +465,7 @@ _text_font_set(Eo *eo_obj, void *_pd, va_list *list)
} }
o->font = evas_font_load(obj->layer->evas->evas, o->cur.fdesc, o->cur.source, o->font = evas_font_load(obj->layer->evas->evas, o->cur.fdesc, o->cur.source,
(int)(((double) o->cur.size) * obj->cur.scale)); (int)(((double) o->cur.size) * obj->cur->scale));
if (o->font) if (o->font)
{ {
o->ascent = ENFN->font_ascent_get(ENDT, o->font); o->ascent = ENFN->font_ascent_get(ENDT, o->font);
@ -493,7 +493,7 @@ _text_font_set(Eo *eo_obj, void *_pd, va_list *list)
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
1, 1); 1, 1);
if ((is ^ was) && obj->cur.visible) if ((is ^ was) && obj->cur->visible)
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
@ -697,9 +697,9 @@ _evas_object_text_layout(Evas_Object *eo_obj, Evas_Object_Text *o, Eina_Unicode
if (o->items && if (o->items &&
!memcmp(&o->cur, &o->prev, sizeof (o->cur)) && !memcmp(&o->cur, &o->prev, sizeof (o->cur)) &&
o->cur.text == text && o->cur.text == text &&
obj->cur.scale == obj->prev.scale && obj->cur->scale == obj->prev->scale &&
o->last_computed.w == obj->cur.geometry.w && o->last_computed.w == obj->cur->geometry.w &&
o->last_computed.h == obj->cur.geometry.h) o->last_computed.h == obj->cur->geometry.h)
return ; return ;
evas_object_content_change(eo_obj, obj); evas_object_content_change(eo_obj, obj);
@ -767,9 +767,9 @@ _evas_object_text_layout(Evas_Object *eo_obj, Evas_Object_Text *o, Eina_Unicode
} }
/* Handle ellipsis */ /* Handle ellipsis */
if ((o->cur.ellipsis >= 0.0) && (advance > obj->cur.geometry.w) && (obj->cur.geometry.w > 0)) if ((o->cur.ellipsis >= 0.0) && (advance > obj->cur->geometry.w) && (obj->cur->geometry.w > 0))
{ {
Evas_Coord ellip_frame = obj->cur.geometry.w; Evas_Coord ellip_frame = obj->cur->geometry.w;
Evas_Object_Text_Item *start_ellip_it = NULL, *end_ellip_it = NULL; Evas_Object_Text_Item *start_ellip_it = NULL, *end_ellip_it = NULL;
/* Account of the ellipsis item width. As long as ellipsis != 0 /* Account of the ellipsis item width. As long as ellipsis != 0
* we have a left ellipsis. And the same with 1 and right. */ * we have a left ellipsis. And the same with 1 and right. */
@ -1029,7 +1029,7 @@ _text_text_set(Eo *eo_obj, void *_pd, va_list *list)
is = evas_object_is_in_output_rect(eo_obj, obj, is = evas_object_is_in_output_rect(eo_obj, obj,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1); obj->layer->evas->pointer.y, 1, 1);
if ((is || was) && obj->cur.visible) if ((is || was) && obj->cur->visible)
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
@ -1302,14 +1302,14 @@ _text_char_pos_get(Eo *eo_obj, void *_pd, va_list *list)
w += x; w += x;
x = 0; x = 0;
} }
if ((x + w) > obj->cur.geometry.w) w = obj->cur.geometry.w - x; if ((x + w) > obj->cur->geometry.w) w = obj->cur->geometry.w - x;
if (w < 0) w = 0; if (w < 0) w = 0;
if (y < 0) if (y < 0)
{ {
h += y; h += y;
y = 0; y = 0;
} }
if ((y + h) > obj->cur.geometry.h) h = obj->cur.geometry.h - y; if ((y + h) > obj->cur->geometry.h) h = obj->cur->geometry.h - y;
if (h < 0) h = 0; if (h < 0) h = 0;
if (cx) *cx = x; if (cx) *cx = x;
if (cy) *cy = y; if (cy) *cy = y;
@ -1387,14 +1387,14 @@ _text_char_coords_get(Eo *eo_obj, void *_pd, va_list *list)
rx = 0; rx = 0;
} }
Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS); Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS);
if ((rx + rw) > obj->cur.geometry.w) rw = obj->cur.geometry.w - rx; if ((rx + rw) > obj->cur->geometry.w) rw = obj->cur->geometry.w - rx;
if (rw < 0) rw = 0; if (rw < 0) rw = 0;
if (ry < 0) if (ry < 0)
{ {
rh += ry; rh += ry;
ry = 0; ry = 0;
} }
if ((ry + rh) > obj->cur.geometry.h) rh = obj->cur.geometry.h - ry; if ((ry + rh) > obj->cur->geometry.h) rh = obj->cur->geometry.h - ry;
if (rh < 0) rh = 0; if (rh < 0) rh = 0;
if (cx) *cx = rx; if (cx) *cx = rx;
if (cy) *cy = ry; if (cy) *cy = ry;
@ -1425,11 +1425,17 @@ _text_style_set(Eo *eo_obj, void *_pd, va_list *list)
evas_text_style_pad_get(o->cur.style, &pl, &pr, &pt, &pb); evas_text_style_pad_get(o->cur.style, &pl, &pr, &pt, &pb);
o->cur.style = style; o->cur.style = style;
evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b); evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b);
if (o->items)
obj->cur.geometry.w += (l - pl) + (r - pr); EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
else {
obj->cur.geometry.w = 0; if (o->items)
obj->cur.geometry.h += (t - pt) + (b - pb); state_write->geometry.w += (l - pl) + (r - pr);
else
state_write->geometry.w = 0;
state_write->geometry.h += (t - pt) + (b - pb);
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
evas_object_change(eo_obj, obj); evas_object_change(eo_obj, obj);
evas_object_clip_dirty(eo_obj, obj); evas_object_clip_dirty(eo_obj, obj);
} }
@ -1878,18 +1884,6 @@ static void
evas_object_text_init(Evas_Object *eo_obj) evas_object_text_init(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS); Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS);
/* set up default settings for this kind of object */
obj->cur.color.r = 255;
obj->cur.color.g = 255;
obj->cur.color.b = 255;
obj->cur.color.a = 255;
obj->cur.geometry.x = 0;
obj->cur.geometry.y = 0;
obj->cur.geometry.w = 0;
obj->cur.geometry.h = 0;
obj->cur.layer = 0;
/* set up object-specific settings */
obj->prev = obj->cur;
/* set up methods (compulsory) */ /* set up methods (compulsory) */
obj->func = &object_func; obj->func = &object_func;
obj->type = o_type; obj->type = o_type;
@ -1968,13 +1962,13 @@ evas_object_text_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, vo
/* render object to surface with context, and offxet by x,y */ /* render object to surface with context, and offxet by x,y */
evas_text_style_pad_get(o->cur.style, &sl, NULL, &st, NULL); evas_text_style_pad_get(o->cur.style, &sl, NULL, &st, NULL);
ENFN->context_multiplier_unset(output, context); ENFN->context_multiplier_unset(output, context);
ENFN->context_render_op_set(output, context, obj->cur.render_op); ENFN->context_render_op_set(output, context, obj->cur->render_op);
/* FIXME: This clipping is just until we fix inset handling correctly. */ /* FIXME: This clipping is just until we fix inset handling correctly. */
ENFN->context_clip_clip(output, context, ENFN->context_clip_clip(output, context,
obj->cur.geometry.x + x, obj->cur->geometry.x + x,
obj->cur.geometry.y + y, obj->cur->geometry.y + y,
obj->cur.geometry.w, obj->cur->geometry.w,
obj->cur.geometry.h); obj->cur->geometry.h);
/* /*
ENFN->context_color_set(output, ENFN->context_color_set(output,
context, context,
@ -1982,10 +1976,10 @@ evas_object_text_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, vo
ENFN->rectangle_draw(output, ENFN->rectangle_draw(output,
context, context,
surface, surface,
obj->cur.geometry.x + x, obj->cur->geometry.x + x,
obj->cur.geometry.y + y, obj->cur->geometry.y + y,
obj->cur.geometry.w, obj->cur->geometry.w,
obj->cur.geometry.h); obj->cur->geometry.h);
*/ */
#define COLOR_ONLY_SET(object, sub, col) \ #define COLOR_ONLY_SET(object, sub, col) \
ENFN->context_color_set(output, context, \ ENFN->context_color_set(output, context, \
@ -1995,13 +1989,13 @@ evas_object_text_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, vo
object->sub.col.a); object->sub.col.a);
#define COLOR_SET(object, sub, col) \ #define COLOR_SET(object, sub, col) \
if (obj->cur.clipper)\ if (obj->cur->clipper)\
{ \ { \
ENFN->context_color_set(output, context, \ ENFN->context_color_set(output, context, \
((int)object->sub.col.r * ((int)obj->cur.clipper->cur.cache.clip.r + 1)) >> 8, \ ((int)object->sub.col.r * ((int)obj->cur->clipper->cur->cache.clip.r + 1)) >> 8, \
((int)object->sub.col.g * ((int)obj->cur.clipper->cur.cache.clip.g + 1)) >> 8, \ ((int)object->sub.col.g * ((int)obj->cur->clipper->cur->cache.clip.g + 1)) >> 8, \
((int)object->sub.col.b * ((int)obj->cur.clipper->cur.cache.clip.b + 1)) >> 8, \ ((int)object->sub.col.b * ((int)obj->cur->clipper->cur->cache.clip.b + 1)) >> 8, \
((int)object->sub.col.a * ((int)obj->cur.clipper->cur.cache.clip.a + 1)) >> 8); \ ((int)object->sub.col.a * ((int)obj->cur->clipper->cur->cache.clip.a + 1)) >> 8); \
} \ } \
else\ else\
ENFN->context_color_set(output, context, \ ENFN->context_color_set(output, context, \
@ -2011,13 +2005,13 @@ evas_object_text_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, vo
object->sub.col.a); object->sub.col.a);
#define COLOR_SET_AMUL(object, sub, col, amul) \ #define COLOR_SET_AMUL(object, sub, col, amul) \
if (obj->cur.clipper) \ if (obj->cur->clipper) \
{ \ { \
ENFN->context_color_set(output, context, \ ENFN->context_color_set(output, context, \
(((int)object->sub.col.r) * ((int)obj->cur.clipper->cur.cache.clip.r) * (amul)) / 65025, \ (((int)object->sub.col.r) * ((int)obj->cur->clipper->cur->cache.clip.r) * (amul)) / 65025, \
(((int)object->sub.col.g) * ((int)obj->cur.clipper->cur.cache.clip.g) * (amul)) / 65025, \ (((int)object->sub.col.g) * ((int)obj->cur->clipper->cur->cache.clip.g) * (amul)) / 65025, \
(((int)object->sub.col.b) * ((int)obj->cur.clipper->cur.cache.clip.b) * (amul)) / 65025, \ (((int)object->sub.col.b) * ((int)obj->cur->clipper->cur->cache.clip.b) * (amul)) / 65025, \
(((int)object->sub.col.a) * ((int)obj->cur.clipper->cur.cache.clip.a) * (amul)) / 65025); \ (((int)object->sub.col.a) * ((int)obj->cur->clipper->cur->cache.clip.a) * (amul)) / 65025); \
} \ } \
else \ else \
ENFN->context_color_set(output, context, \ ENFN->context_color_set(output, context, \
@ -2032,14 +2026,14 @@ evas_object_text_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, vo
context, \ context, \
surface, \ surface, \
o->font, \ o->font, \
obj->cur.geometry.x + x + sl + ox + it->x, \ obj->cur->geometry.x + x + sl + ox + it->x, \
obj->cur.geometry.y + y + st + oy + \ obj->cur->geometry.y + y + st + oy + \
(int) \ (int) \
(((o->max_ascent * obj->cur.geometry.h) / obj->cur.geometry.h)), \ (((o->max_ascent * obj->cur->geometry.h) / obj->cur->geometry.h)), \
obj->cur.geometry.w, \ obj->cur->geometry.w, \
obj->cur.geometry.h, \ obj->cur->geometry.h, \
obj->cur.geometry.w, \ obj->cur->geometry.w, \
obj->cur.geometry.h, \ obj->cur->geometry.h, \
&it->text_props, \ &it->text_props, \
do_async); do_async);
@ -2191,7 +2185,7 @@ evas_object_text_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, vo
} }
/* normal text */ /* normal text */
COLOR_ONLY_SET(obj, cur.cache, clip); COLOR_ONLY_SET(obj, cur->cache, clip);
DRAW_TEXT(0, 0); DRAW_TEXT(0, 0);
} }
} }
@ -2210,18 +2204,18 @@ evas_object_text_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj
Then when this is done the object needs to figure if it changed and Then when this is done the object needs to figure if it changed and
if so what and where and add the appropriate redraw rectangles */ if so what and where and add the appropriate redraw rectangles */
/* if someone is clipping this obj - go calculate the clipper */ /* if someone is clipping this obj - go calculate the clipper */
if (obj->cur.clipper) if (obj->cur->clipper)
{ {
if (obj->cur.cache.clip.dirty) if (obj->cur->cache.clip.dirty)
evas_object_clip_recalc(obj->cur.eo_clipper, obj->cur.clipper); evas_object_clip_recalc(obj->cur->eo_clipper, obj->cur->clipper);
obj->cur.clipper->func->render_pre(obj->cur.eo_clipper, obj->cur.clipper); obj->cur->clipper->func->render_pre(obj->cur->eo_clipper, obj->cur->clipper);
} }
/* If object size changed and ellipsis is set */ /* If object size changed and ellipsis is set */
if (((o->cur.ellipsis >= 0.0 || if (((o->cur.ellipsis >= 0.0 ||
o->cur.ellipsis != o->prev.ellipsis) && o->cur.ellipsis != o->prev.ellipsis) &&
((obj->cur.geometry.w != o->last_computed.w) || ((obj->cur->geometry.w != o->last_computed.w) ||
(obj->cur.geometry.h != o->last_computed.h))) || (obj->cur->geometry.h != o->last_computed.h))) ||
(obj->cur.scale != obj->prev.scale)) (obj->cur->scale != obj->prev->scale))
{ {
_evas_object_text_recalc(eo_obj, o->cur.text); _evas_object_text_recalc(eo_obj, o->cur.text);
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes,
@ -2256,10 +2250,10 @@ evas_object_text_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj
goto done; goto done;
} }
/* if it changed color */ /* if it changed color */
if ((obj->cur.color.r != obj->prev.color.r) || if ((obj->cur->color.r != obj->prev->color.r) ||
(obj->cur.color.g != obj->prev.color.g) || (obj->cur->color.g != obj->prev->color.g) ||
(obj->cur.color.b != obj->prev.color.b) || (obj->cur->color.b != obj->prev->color.b) ||
(obj->cur.color.a != obj->prev.color.a)) (obj->cur->color.a != obj->prev->color.a))
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes,
eo_obj, obj); eo_obj, obj);
@ -2268,16 +2262,16 @@ evas_object_text_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj
/* if it changed geometry - and obviously not visibility or color /* if it changed geometry - and obviously not visibility or color
calculate differences since we have a constant color fill calculate differences since we have a constant color fill
we really only need to update the differences */ we really only need to update the differences */
if ((obj->cur.geometry.x != obj->prev.geometry.x) || if ((obj->cur->geometry.x != obj->prev->geometry.x) ||
(obj->cur.geometry.y != obj->prev.geometry.y) || (obj->cur->geometry.y != obj->prev->geometry.y) ||
(obj->cur.geometry.w != obj->prev.geometry.w) || (obj->cur->geometry.w != obj->prev->geometry.w) ||
(obj->cur.geometry.h != obj->prev.geometry.h)) (obj->cur->geometry.h != obj->prev->geometry.h))
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes,
eo_obj, obj); eo_obj, obj);
goto done; goto done;
} }
if (obj->cur.render_op != obj->prev.render_op) if (obj->cur->render_op != obj->prev->render_op)
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes,
eo_obj, obj); eo_obj, obj);
@ -2385,7 +2379,7 @@ _evas_object_text_rehint(Evas_Object *eo_obj)
is = evas_object_is_in_output_rect(eo_obj, obj, is = evas_object_is_in_output_rect(eo_obj, obj,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, 1, 1); obj->layer->evas->pointer.y, 1, 1);
if ((is || was) && obj->cur.visible) if ((is || was) && obj->cur->visible)
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
@ -2412,21 +2406,32 @@ _evas_object_text_recalc(Evas_Object *eo_obj, Eina_Unicode *text)
w = _evas_object_text_horiz_advance_get(eo_obj, o); w = _evas_object_text_horiz_advance_get(eo_obj, o);
h = _evas_object_text_vert_advance_get(eo_obj, o); h = _evas_object_text_vert_advance_get(eo_obj, o);
evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b); evas_text_style_pad_get(o->cur.style, &l, &r, &t, &b);
obj->cur.geometry.w = w + l + r;
obj->cur.geometry.h = h + t + b; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
//// obj->cur.cache.geometry.validity = 0; {
state_write->geometry.w = w + l + r;
state_write->geometry.h = h + t + b;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
//// obj->cur->cache.geometry.validity = 0;
} }
else else
{ {
int t = 0, b = 0; int t = 0, b = 0;
evas_text_style_pad_get(o->cur.style, NULL, NULL, &t, &b); evas_text_style_pad_get(o->cur.style, NULL, NULL, &t, &b);
obj->cur.geometry.w = 0; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.geometry.h = o->max_ascent + o->max_descent + t + b; {
//// obj->cur.cache.geometry.validity = 0; state_write->geometry.w = 0;
state_write->geometry.h = o->max_ascent + o->max_descent + t + b;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
//// obj->cur->cache.geometry.validity = 0;
} }
o->last_computed.w = obj->cur.geometry.w; o->last_computed.w = obj->cur->geometry.w;
o->last_computed.h = obj->cur.geometry.h; o->last_computed.h = obj->cur->geometry.h;
evas_object_clip_dirty(eo_obj, obj); evas_object_clip_dirty(eo_obj, obj);
} }

View File

@ -2429,7 +2429,7 @@ _format_dup(Evas_Object *eo_obj, const Evas_Object_Textblock_Format *fmt)
/* FIXME: just ref the font here... */ /* FIXME: just ref the font here... */
fmt2->font.font = evas_font_load(obj->layer->evas->evas, fmt2->font.fdesc, fmt2->font.font = evas_font_load(obj->layer->evas->evas, fmt2->font.fdesc,
fmt2->font.source, (int)(((double) fmt2->font.size) * obj->cur.scale)); fmt2->font.source, (int)(((double) fmt2->font.size) * obj->cur->scale));
return fmt2; return fmt2;
} }
@ -2526,7 +2526,7 @@ _layout_format_ascent_descent_adjust(const Evas_Object *eo_obj,
{ {
int dh; int dh;
dh = obj->cur.geometry.h - (*maxascent + *maxdescent); dh = obj->cur->geometry.h - (*maxascent + *maxdescent);
if (dh < 0) dh = 0; if (dh < 0) dh = 0;
dh = fmt->linefill * dh; dh = fmt->linefill * dh;
*maxdescent += dh / 2; *maxdescent += dh / 2;
@ -3107,8 +3107,8 @@ _layout_calculate_format_item_size(const Evas_Object *eo_obj,
p += 6; p += 6;
if (sscanf(p, "%ix%i", &w, &h) == 2) if (sscanf(p, "%ix%i", &w, &h) == 2)
{ {
w = w * obj->cur.scale; w = w * obj->cur->scale;
h = h * obj->cur.scale; h = h * obj->cur->scale;
} }
} }
break; break;
@ -3723,7 +3723,7 @@ _format_finalize(Evas_Object *eo_obj, Evas_Object_Textblock_Format *fmt)
of = fmt->font.font; of = fmt->font.font;
fmt->font.font = evas_font_load(obj->layer->evas->evas, fmt->font.fdesc, fmt->font.font = evas_font_load(obj->layer->evas->evas, fmt->font.fdesc,
fmt->font.source, (int)(((double) fmt->font.size) * obj->cur.scale)); fmt->font.source, (int)(((double) fmt->font.size) * obj->cur->scale));
if (of) evas_font_free(obj->layer->evas->evas, of); if (of) evas_font_free(obj->layer->evas->evas, of);
} }
@ -4873,7 +4873,7 @@ _layout(const Evas_Object *eo_obj, int w, int h, int *w_ret, int *h_ret)
c->align = 0.0; c->align = 0.0;
c->align_auto = EINA_TRUE; c->align_auto = EINA_TRUE;
c->ln = NULL; c->ln = NULL;
c->width_changed = (obj->cur.geometry.w != o->last_w); c->width_changed = (obj->cur->geometry.w != o->last_w);
/* Start of logical layout creation */ /* Start of logical layout creation */
/* setup default base style */ /* setup default base style */
@ -5029,11 +5029,11 @@ _relayout(const Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS); Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS);
Evas_Object_Textblock *o = eo_data_get(eo_obj, MY_CLASS); Evas_Object_Textblock *o = eo_data_get(eo_obj, MY_CLASS);
_layout(eo_obj, obj->cur.geometry.w, obj->cur.geometry.h, _layout(eo_obj, obj->cur->geometry.w, obj->cur->geometry.h,
&o->formatted.w, &o->formatted.h); &o->formatted.w, &o->formatted.h);
o->formatted.valid = 1; o->formatted.valid = 1;
o->last_w = obj->cur.geometry.w; o->last_w = obj->cur->geometry.w;
o->last_h = obj->cur.geometry.h; o->last_h = obj->cur->geometry.h;
o->changed = 0; o->changed = 0;
o->content_changed = 0; o->content_changed = 0;
o->format_changed = EINA_FALSE; o->format_changed = EINA_FALSE;
@ -9180,7 +9180,7 @@ evas_textblock_cursor_visible_range_get(Evas_Textblock_Cursor *start, Evas_Textb
TB_HEAD_RETURN(EINA_FALSE); TB_HEAD_RETURN(EINA_FALSE);
eo_e = evas_object_evas_get(eo_obj); eo_e = evas_object_evas_get(eo_obj);
Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS); Evas_Public_Data *e = eo_data_get(eo_e, EVAS_CLASS);
cy = 0 - obj->cur.geometry.y; cy = 0 - obj->cur->geometry.y;
ch = e->viewport.h; ch = e->viewport.h;
evas_textblock_cursor_line_coord_set(start, cy); evas_textblock_cursor_line_coord_set(start, cy);
evas_textblock_cursor_line_coord_set(end, cy + ch); evas_textblock_cursor_line_coord_set(end, cy + ch);
@ -10131,18 +10131,6 @@ evas_object_textblock_init(Evas_Object *eo_obj)
init_wordbreak(); init_wordbreak();
} }
/* set up default settings for this kind of object */
obj->cur.color.r = 255;
obj->cur.color.g = 255;
obj->cur.color.b = 255;
obj->cur.color.a = 255;
obj->cur.geometry.x = 0.0;
obj->cur.geometry.y = 0.0;
obj->cur.geometry.w = 0.0;
obj->cur.geometry.h = 0.0;
obj->cur.layer = 0;
/* set up object-specific settings */
obj->prev = obj->cur;
/* set up methods (compulsory) */ /* set up methods (compulsory) */
obj->func = &object_func; obj->func = &object_func;
obj->type = o_type; obj->type = o_type;
@ -10211,10 +10199,10 @@ evas_object_textblock_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *ob
context); context);
/* FIXME: This clipping is just until we fix inset handling correctly. */ /* FIXME: This clipping is just until we fix inset handling correctly. */
ENFN->context_clip_clip(output, context, ENFN->context_clip_clip(output, context,
obj->cur.geometry.x + x, obj->cur->geometry.x + x,
obj->cur.geometry.y + y, obj->cur->geometry.y + y,
obj->cur.geometry.w, obj->cur->geometry.w,
obj->cur.geometry.h); obj->cur->geometry.h);
clip = ENFN->context_clip_get(output, context, &cx, &cy, &cw, &ch); clip = ENFN->context_clip_get(output, context, &cx, &cy, &cw, &ch);
/* If there are no paragraphs and thus there are no lines, /* If there are no paragraphs and thus there are no lines,
* there's nothing left to do. */ * there's nothing left to do. */
@ -10226,9 +10214,9 @@ evas_object_textblock_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *ob
if (!par->visible) continue; \ if (!par->visible) continue; \
if (clip) \ if (clip) \
{ \ { \
if ((obj->cur.geometry.y + y + par->y + par->h) < (cy - 20)) \ if ((obj->cur->geometry.y + y + par->y + par->h) < (cy - 20)) \
continue; \ continue; \
if ((obj->cur.geometry.y + y + par->y) > (cy + ch + 20)) \ if ((obj->cur->geometry.y + y + par->y) > (cy + ch + 20)) \
break; \ break; \
} \ } \
_layout_paragraph_render(o, par); \ _layout_paragraph_render(o, par); \
@ -10238,9 +10226,9 @@ evas_object_textblock_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *ob
\ \
if (clip) \ if (clip) \
{ \ { \
if ((obj->cur.geometry.y + y + par->y + ln->y + ln->h) < (cy - 20)) \ if ((obj->cur->geometry.y + y + par->y + ln->y + ln->h) < (cy - 20)) \
continue; \ continue; \
if ((obj->cur.geometry.y + y + par->y + ln->y) > (cy + ch + 20)) \ if ((obj->cur->geometry.y + y + par->y + ln->y) > (cy + ch + 20)) \
break; \ break; \
} \ } \
EINA_INLIST_FOREACH(ln->items, itr) \ EINA_INLIST_FOREACH(ln->items, itr) \
@ -10253,13 +10241,13 @@ evas_object_textblock_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *ob
} \ } \
if (clip) \ if (clip) \
{ \ { \
if ((obj->cur.geometry.x + x + ln->x + itr->x + itr->w) < (cx - 20)) \ if ((obj->cur->geometry.x + x + ln->x + itr->x + itr->w) < (cx - 20)) \
continue; \ continue; \
if ((obj->cur.geometry.x + x + ln->x + itr->x) > (cx + cw + 20)) \ if ((obj->cur->geometry.x + x + ln->x + itr->x) > (cx + cw + 20)) \
break; \ break; \
} \ } \
if ((ln->x + itr->x + itr->w) <= 0) continue; \ if ((ln->x + itr->x + itr->w) <= 0) continue; \
if (ln->x + itr->x > obj->cur.geometry.w) break; \ if (ln->x + itr->x > obj->cur->geometry.w) break; \
do do
#define ITEM_WALK_END() \ #define ITEM_WALK_END() \
@ -10270,22 +10258,22 @@ evas_object_textblock_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *ob
do {} while(0) do {} while(0)
#define COLOR_SET(col) \ #define COLOR_SET(col) \
ENFN->context_color_set(output, context, \ ENFN->context_color_set(output, context, \
(obj->cur.cache.clip.r * ti->parent.format->color.col.r) / 255, \ (obj->cur->cache.clip.r * ti->parent.format->color.col.r) / 255, \
(obj->cur.cache.clip.g * ti->parent.format->color.col.g) / 255, \ (obj->cur->cache.clip.g * ti->parent.format->color.col.g) / 255, \
(obj->cur.cache.clip.b * ti->parent.format->color.col.b) / 255, \ (obj->cur->cache.clip.b * ti->parent.format->color.col.b) / 255, \
(obj->cur.cache.clip.a * ti->parent.format->color.col.a) / 255); (obj->cur->cache.clip.a * ti->parent.format->color.col.a) / 255);
#define COLOR_SET_AMUL(col, amul) \ #define COLOR_SET_AMUL(col, amul) \
ENFN->context_color_set(output, context, \ ENFN->context_color_set(output, context, \
(obj->cur.cache.clip.r * ti->parent.format->color.col.r * (amul)) / 65025, \ (obj->cur->cache.clip.r * ti->parent.format->color.col.r * (amul)) / 65025, \
(obj->cur.cache.clip.g * ti->parent.format->color.col.g * (amul)) / 65025, \ (obj->cur->cache.clip.g * ti->parent.format->color.col.g * (amul)) / 65025, \
(obj->cur.cache.clip.b * ti->parent.format->color.col.b * (amul)) / 65025, \ (obj->cur->cache.clip.b * ti->parent.format->color.col.b * (amul)) / 65025, \
(obj->cur.cache.clip.a * ti->parent.format->color.col.a * (amul)) / 65025); (obj->cur->cache.clip.a * ti->parent.format->color.col.a * (amul)) / 65025);
#define DRAW_TEXT(ox, oy) \ #define DRAW_TEXT(ox, oy) \
if (ti->parent.format->font.font) \ if (ti->parent.format->font.font) \
evas_font_draw_async_check(obj, output, context, surface, \ evas_font_draw_async_check(obj, output, context, surface, \
ti->parent.format->font.font, \ ti->parent.format->font.font, \
obj->cur.geometry.x + ln->x + ti->parent.x + x + (ox), \ obj->cur->geometry.x + ln->x + ti->parent.x + x + (ox), \
obj->cur.geometry.y + ln->par->y + ln->y + yoff + y + (oy), \ obj->cur->geometry.y + ln->par->y + ln->y + yoff + y + (oy), \
ti->parent.w, ti->parent.h, ti->parent.w, ti->parent.h, \ ti->parent.w, ti->parent.h, ti->parent.w, ti->parent.h, \
&ti->text_props, do_async); &ti->text_props, do_async);
@ -10295,15 +10283,15 @@ evas_object_textblock_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *ob
{ \ { \
ENFN->context_color_set(output, \ ENFN->context_color_set(output, \
context, \ context, \
(obj->cur.cache.clip.r * or) / 255, \ (obj->cur->cache.clip.r * or) / 255, \
(obj->cur.cache.clip.g * og) / 255, \ (obj->cur->cache.clip.g * og) / 255, \
(obj->cur.cache.clip.b * ob) / 255, \ (obj->cur->cache.clip.b * ob) / 255, \
(obj->cur.cache.clip.a * oa) / 255); \ (obj->cur->cache.clip.a * oa) / 255); \
ENFN->rectangle_draw(output, \ ENFN->rectangle_draw(output, \
context, \ context, \
surface, \ surface, \
obj->cur.geometry.x + ln->x + x + (ox), \ obj->cur->geometry.x + ln->x + x + (ox), \
obj->cur.geometry.y + ln->par->y + ln->y + y + (oy), \ obj->cur->geometry.y + ln->par->y + ln->y + y + (oy), \
(ow), \ (ow), \
(oh), \ (oh), \
do_async); \ do_async); \
@ -10365,10 +10353,10 @@ evas_object_textblock_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *ob
while (0) while (0)
{ {
Evas_Coord look_for_y = 0 - (obj->cur.geometry.y + y); Evas_Coord look_for_y = 0 - (obj->cur->geometry.y + y);
if (clip) if (clip)
{ {
Evas_Coord tmp_lfy = cy - (obj->cur.geometry.y + y); Evas_Coord tmp_lfy = cy - (obj->cur->geometry.y + y);
if (tmp_lfy > look_for_y) if (tmp_lfy > look_for_y)
look_for_y = tmp_lfy; look_for_y = tmp_lfy;
} }
@ -10601,9 +10589,9 @@ evas_object_textblock_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data
/* then when this is done the object needs to figure if it changed and */ /* then when this is done the object needs to figure if it changed and */
/* if so what and where and add the appropriate redraw textblocks */ /* if so what and where and add the appropriate redraw textblocks */
if ((o->changed) || (o->content_changed) || (o->format_changed) || if ((o->changed) || (o->content_changed) || (o->format_changed) ||
((obj->cur.geometry.w != o->last_w) || ((obj->cur->geometry.w != o->last_w) ||
(((o->valign != 0.0) || (o->have_ellipsis)) && (((o->valign != 0.0) || (o->have_ellipsis)) &&
(obj->cur.geometry.h != o->last_h)))) (obj->cur->geometry.h != o->last_h))))
{ {
_relayout(eo_obj); _relayout(eo_obj);
o->redraw = 0; o->redraw = 0;
@ -10621,11 +10609,11 @@ evas_object_textblock_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data
goto done; goto done;
} }
/* if someone is clipping this obj - go calculate the clipper */ /* if someone is clipping this obj - go calculate the clipper */
if (obj->cur.clipper) if (obj->cur->clipper)
{ {
if (obj->cur.cache.clip.dirty) if (obj->cur->cache.clip.dirty)
evas_object_clip_recalc(obj->cur.eo_clipper, obj->cur.clipper); evas_object_clip_recalc(obj->cur->eo_clipper, obj->cur->clipper);
obj->cur.clipper->func->render_pre(obj->cur.eo_clipper, obj->cur.clipper); obj->cur->clipper->func->render_pre(obj->cur->eo_clipper, obj->cur->clipper);
} }
/* now figure what changed and add draw rects */ /* now figure what changed and add draw rects */
/* if it just became visible or invisible */ /* if it just became visible or invisible */
@ -10653,10 +10641,10 @@ evas_object_textblock_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data
goto done; goto done;
} }
/* if it changed color */ /* if it changed color */
if ((obj->cur.color.r != obj->prev.color.r) || if ((obj->cur->color.r != obj->prev->color.r) ||
(obj->cur.color.g != obj->prev.color.g) || (obj->cur->color.g != obj->prev->color.g) ||
(obj->cur.color.b != obj->prev.color.b) || (obj->cur->color.b != obj->prev->color.b) ||
(obj->cur.color.a != obj->prev.color.a)) (obj->cur->color.a != obj->prev->color.a))
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
goto done; goto done;
@ -10664,10 +10652,10 @@ evas_object_textblock_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data
/* if it changed geometry - and obviously not visibility or color */ /* if it changed geometry - and obviously not visibility or color */
/* calculate differences since we have a constant color fill */ /* calculate differences since we have a constant color fill */
/* we really only need to update the differences */ /* we really only need to update the differences */
if ((obj->cur.geometry.x != obj->prev.geometry.x) || if ((obj->cur->geometry.x != obj->prev->geometry.x) ||
(obj->cur.geometry.y != obj->prev.geometry.y) || (obj->cur->geometry.y != obj->prev->geometry.y) ||
(obj->cur.geometry.w != obj->prev.geometry.w) || (obj->cur->geometry.w != obj->prev->geometry.w) ||
(obj->cur.geometry.h != obj->prev.geometry.h)) (obj->cur->geometry.h != obj->prev->geometry.h))
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
goto done; goto done;
@ -10733,9 +10721,9 @@ static void
evas_object_textblock_coords_recalc(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) evas_object_textblock_coords_recalc(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{ {
Evas_Object_Textblock *o = eo_data_get(eo_obj, MY_CLASS); Evas_Object_Textblock *o = eo_data_get(eo_obj, MY_CLASS);
if ((obj->cur.geometry.w != o->last_w) || if ((obj->cur->geometry.w != o->last_w) ||
(((o->valign != 0.0) || (o->have_ellipsis)) && (((o->valign != 0.0) || (o->have_ellipsis)) &&
(obj->cur.geometry.h != o->last_h))) (obj->cur->geometry.h != o->last_h)))
{ {
o->formatted.valid = 0; o->formatted.valid = 0;
o->changed = 1; o->changed = 1;

View File

@ -342,18 +342,6 @@ static void
evas_object_textgrid_init(Evas_Object *eo_obj) evas_object_textgrid_init(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS); Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS);
/* set up default settings for this kind of object */
obj->cur.color.r = 255;
obj->cur.color.g = 255;
obj->cur.color.b = 255;
obj->cur.color.a = 255;
obj->cur.geometry.x = 0;
obj->cur.geometry.y = 0;
obj->cur.geometry.w = 0;
obj->cur.geometry.h = 0;
obj->cur.layer = 0;
/* set up object-specific settings */
obj->prev = obj->cur;
/* set up methods (compulsory) */ /* set up methods (compulsory) */
obj->func = &object_func; obj->func = &object_func;
obj->type = o_type; obj->type = o_type;
@ -578,14 +566,14 @@ evas_object_textgrid_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj
/* render object to surface with context, and offset by x,y */ /* render object to surface with context, and offset by x,y */
Evas_Object_Textgrid *o = eo_data_get(eo_obj, MY_CLASS); Evas_Object_Textgrid *o = eo_data_get(eo_obj, MY_CLASS);
ENFN->context_multiplier_unset(output, context); ENFN->context_multiplier_unset(output, context);
ENFN->context_render_op_set(output, context, obj->cur.render_op); ENFN->context_render_op_set(output, context, obj->cur->render_op);
if (!(o->font) || (!o->cur.cells)) return; if (!(o->font) || (!o->cur.cells)) return;
w = o->cur.char_width; w = o->cur.char_width;
h = o->cur.char_height; h = o->cur.char_height;
ww = obj->cur.geometry.w; ww = obj->cur->geometry.w;
hh = obj->cur.geometry.h; hh = obj->cur->geometry.h;
// generate row data from cells (and only deal with rows that updated) // generate row data from cells (and only deal with rows that updated)
for (yy = 0, cells = o->cur.cells; yy < o->cur.h; yy++) for (yy = 0, cells = o->cur.cells; yy < o->cur.h; yy++)
@ -672,14 +660,14 @@ evas_object_textgrid_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj
rr, rg, rb, ra); rr, rg, rb, ra);
} }
} }
yp = obj->cur.geometry.y + y; yp = obj->cur->geometry.y + y;
// draw the row data that is generated from the cell array // draw the row data that is generated from the cell array
for (yy = 0, cells = o->cur.cells; yy < o->cur.h; yy++) for (yy = 0, cells = o->cur.cells; yy < o->cur.h; yy++)
{ {
Evas_Object_Textgrid_Row *row = &(o->cur.rows[yy]); Evas_Object_Textgrid_Row *row = &(o->cur.rows[yy]);
Evas_Font_Array *texts; Evas_Font_Array *texts;
xp = obj->cur.geometry.x + x; xp = obj->cur->geometry.x + x;
for (xx = 0; xx < row->rects_num; xx++) for (xx = 0; xx < row->rects_num; xx++)
{ {
ENFN->context_color_set(output, context, ENFN->context_color_set(output, context,
@ -803,11 +791,11 @@ evas_object_textgrid_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data
/* if so what and where and add thr appropriate redraw rectangles */ /* if so what and where and add thr appropriate redraw rectangles */
Evas_Object_Textgrid *o = eo_data_get(eo_obj, MY_CLASS); Evas_Object_Textgrid *o = eo_data_get(eo_obj, MY_CLASS);
/* if someone is clipping this obj - go calculate the clipper */ /* if someone is clipping this obj - go calculate the clipper */
if (obj->cur.clipper) if (obj->cur->clipper)
{ {
if (obj->cur.cache.clip.dirty) if (obj->cur->cache.clip.dirty)
evas_object_clip_recalc(obj->cur.eo_clipper, obj->cur.clipper); evas_object_clip_recalc(obj->cur->eo_clipper, obj->cur->clipper);
obj->cur.clipper->func->render_pre(obj->cur.eo_clipper, obj->cur.clipper); obj->cur->clipper->func->render_pre(obj->cur->eo_clipper, obj->cur->clipper);
} }
/* now figure what changed and add draw rects */ /* now figure what changed and add draw rects */
/* if it just became visible or invisible */ /* if it just became visible or invisible */
@ -835,10 +823,10 @@ evas_object_textgrid_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data
goto done; goto done;
} }
/* if it changed color */ /* if it changed color */
if ((obj->cur.color.r != obj->prev.color.r) || if ((obj->cur->color.r != obj->prev->color.r) ||
(obj->cur.color.g != obj->prev.color.g) || (obj->cur->color.g != obj->prev->color.g) ||
(obj->cur.color.b != obj->prev.color.b) || (obj->cur->color.b != obj->prev->color.b) ||
(obj->cur.color.a != obj->prev.color.a)) (obj->cur->color.a != obj->prev->color.a))
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
goto done; goto done;
@ -846,20 +834,20 @@ evas_object_textgrid_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data
/* if it changed geometry - and obviously not visibility or color */ /* if it changed geometry - and obviously not visibility or color */
/* calculate differences since we have a constant color fill */ /* calculate differences since we have a constant color fill */
/* we really only need to update the differences */ /* we really only need to update the differences */
if ((obj->cur.geometry.x != obj->prev.geometry.x) || if ((obj->cur->geometry.x != obj->prev->geometry.x) ||
(obj->cur.geometry.y != obj->prev.geometry.y) || (obj->cur->geometry.y != obj->prev->geometry.y) ||
(obj->cur.geometry.w != obj->prev.geometry.w) || (obj->cur->geometry.w != obj->prev->geometry.w) ||
(obj->cur.geometry.h != obj->prev.geometry.h)) (obj->cur->geometry.h != obj->prev->geometry.h))
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
goto done; goto done;
} }
if (obj->cur.render_op != obj->prev.render_op) if (obj->cur->render_op != obj->prev->render_op)
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
goto done; goto done;
} }
if (obj->cur.scale != obj->prev.scale) if (obj->cur->scale != obj->prev->scale)
{ {
evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj); evas_object_render_pre_prev_cur_add(&obj->layer->evas->clip_changes, eo_obj, obj);
goto done; goto done;
@ -896,9 +884,9 @@ evas_object_textgrid_render_pre(Evas_Object *eo_obj, Evas_Object_Protected_Data
Evas_Object_Textgrid_Row *r = &(o->cur.rows[i]); Evas_Object_Textgrid_Row *r = &(o->cur.rows[i]);
if (r->ch1 >= 0) if (r->ch1 >= 0)
evas_add_rect(&obj->layer->evas->clip_changes, evas_add_rect(&obj->layer->evas->clip_changes,
obj->cur.geometry.x + obj->cur->geometry.x +
(r->ch1 * o->cur.char_width), (r->ch1 * o->cur.char_width),
obj->cur.geometry.y + obj->cur->geometry.y +
(i * o->cur.char_height), (i * o->cur.char_height),
(r->ch2 - r->ch1 + 1) * o->cur.char_width, (r->ch2 - r->ch1 + 1) * o->cur.char_width,
o->cur.char_height); o->cur.char_height);
@ -1221,7 +1209,7 @@ _font_set(Eo *eo_obj, void *_pd, va_list *list)
o->font = evas_font_load(obj->layer->evas->evas, o->cur.font_description, o->font = evas_font_load(obj->layer->evas->evas, o->cur.font_description,
o->cur.font_source, o->cur.font_source,
(int)(((double) o->cur.font_size) * (int)(((double) o->cur.font_size) *
obj->cur.scale)); obj->cur->scale));
if (o->font) if (o->font)
{ {
Eina_Unicode W[2] = { 'W', 0 }; Eina_Unicode W[2] = { 'W', 0 };
@ -1251,8 +1239,13 @@ _font_set(Eo *eo_obj, void *_pd, va_list *list)
} }
else else
{ {
obj->cur.geometry.w = 0; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.geometry.h = 0; {
state_write->geometry.w = 0;
state_write->geometry.h = 0;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
o->max_ascent = 0; o->max_ascent = 0;
} }
@ -1268,7 +1261,7 @@ _font_set(Eo *eo_obj, void *_pd, va_list *list)
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
1, 1); 1, 1);
if ((is ^ was) && obj->cur.visible) if ((is ^ was) && obj->cur->visible)
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,

View File

@ -199,36 +199,36 @@ static Eina_Bool
_evas_render_had_map(Evas_Object_Protected_Data *obj) _evas_render_had_map(Evas_Object_Protected_Data *obj)
{ {
return ((obj->map->prev.map) && (obj->map->prev.usemap)); return ((obj->map->prev.map) && (obj->map->prev.usemap));
// return ((!obj->map->cur.map) && (obj->prev.usemap)); // return ((!obj->map->cur.map) && (obj->prev->usemap));
} }
static Eina_Bool static Eina_Bool
_evas_render_is_relevant(Evas_Object *eo_obj) _evas_render_is_relevant(Evas_Object *eo_obj)
{ {
Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS); Evas_Object_Protected_Data *obj = eo_data_get(eo_obj, EVAS_OBJ_CLASS);
return ((evas_object_is_visible(eo_obj, obj) && (!obj->cur.have_clipees)) || return ((evas_object_is_visible(eo_obj, obj) && (!obj->cur->have_clipees)) ||
(evas_object_was_visible(eo_obj, obj) && (!obj->prev.have_clipees))); (evas_object_was_visible(eo_obj, obj) && (!obj->prev->have_clipees)));
} }
static Eina_Bool static Eina_Bool
_evas_render_can_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) _evas_render_can_render(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{ {
return (evas_object_is_visible(eo_obj, obj) && (!obj->cur.have_clipees)); return (evas_object_is_visible(eo_obj, obj) && (!obj->cur->have_clipees));
} }
static void static void
_evas_render_prev_cur_clip_cache_add(Evas_Public_Data *e, Evas_Object_Protected_Data *obj) _evas_render_prev_cur_clip_cache_add(Evas_Public_Data *e, Evas_Object_Protected_Data *obj)
{ {
e->engine.func->output_redraws_rect_add(e->engine.data.output, e->engine.func->output_redraws_rect_add(e->engine.data.output,
obj->prev.cache.clip.x, obj->prev->cache.clip.x,
obj->prev.cache.clip.y, obj->prev->cache.clip.y,
obj->prev.cache.clip.w, obj->prev->cache.clip.w,
obj->prev.cache.clip.h); obj->prev->cache.clip.h);
e->engine.func->output_redraws_rect_add(e->engine.data.output, e->engine.func->output_redraws_rect_add(e->engine.data.output,
obj->cur.cache.clip.x, obj->cur->cache.clip.x,
obj->cur.cache.clip.y, obj->cur->cache.clip.y,
obj->cur.cache.clip.w, obj->cur->cache.clip.w,
obj->cur.cache.clip.h); obj->cur->cache.clip.h);
} }
static void static void
@ -236,17 +236,17 @@ _evas_render_cur_clip_cache_del(Evas_Public_Data *e, Evas_Object_Protected_Data
{ {
Evas_Coord x, y, w, h; Evas_Coord x, y, w, h;
x = obj->cur.cache.clip.x; x = obj->cur->cache.clip.x;
y = obj->cur.cache.clip.y; y = obj->cur->cache.clip.y;
w = obj->cur.cache.clip.w; w = obj->cur->cache.clip.w;
h = obj->cur.cache.clip.h; h = obj->cur->cache.clip.h;
if (obj->cur.clipper) if (obj->cur->clipper)
{ {
RECTS_CLIP_TO_RECT(x, y, w, h, RECTS_CLIP_TO_RECT(x, y, w, h,
obj->cur.clipper->cur.cache.clip.x, obj->cur->clipper->cur->cache.clip.x,
obj->cur.clipper->cur.cache.clip.y, obj->cur->clipper->cur->cache.clip.y,
obj->cur.clipper->cur.cache.clip.w, obj->cur->clipper->cur->cache.clip.w,
obj->cur.clipper->cur.cache.clip.h); obj->cur->clipper->cur->cache.clip.h);
} }
e->engine.func->output_redraws_rect_del(e->engine.data.output, e->engine.func->output_redraws_rect_del(e->engine.data.output,
x, y, w, h); x, y, w, h);
@ -318,7 +318,7 @@ _evas_render_phase1_direct(Evas_Public_Data *e,
obj->smart.smart, obj->smart.smart,
evas_object_smart_members_get_direct(eo_obj), evas_object_smart_members_get_direct(eo_obj),
obj->map->cur.map, obj->map->cur.usemap, obj->map->cur.map, obj->map->cur.usemap,
obj->map->prev.map, obj->prev.usemap, obj->map->prev.map, obj->prev->usemap,
_evas_render_has_map(eo_obj, obj), _evas_render_has_map(eo_obj, obj),
_evas_render_had_map(obj)); _evas_render_had_map(obj));
if ((obj->is_smart) && if ((obj->is_smart) &&
@ -384,7 +384,7 @@ _evas_render_phase1_object_process(Evas_Public_Data *e, Evas_Object *eo_obj,
obj->is_active = is_active; obj->is_active = is_active;
RDI(level); RDI(level);
RD(" [--- PROCESS [%p] '%s' active = %i, del = %i | %i %i %ix%i\n", obj, obj->type, is_active, obj->delete_me, obj->cur.geometry.x, obj->cur.geometry.y, obj->cur.geometry.w, obj->cur.geometry.h); RD(" [--- PROCESS [%p] '%s' active = %i, del = %i | %i %i %ix%i\n", obj, obj->type, is_active, obj->delete_me, obj->cur->geometry.x, obj->cur->geometry.y, obj->cur->geometry.w, obj->cur->geometry.h);
if ((!mapped_parent) && ((is_active) || (obj->delete_me != 0))) if ((!mapped_parent) && ((is_active) || (obj->delete_me != 0)))
eina_array_push(active_objects, obj); eina_array_push(active_objects, obj);
@ -393,7 +393,7 @@ _evas_render_phase1_object_process(Evas_Public_Data *e, Evas_Object *eo_obj,
if (!is_active) if (!is_active)
{ {
RDI(level); RDI(level);
RD(" [%p] vis: %i, cache.clip.vis: %i cache.clip.a: %i [%p]\n", obj, obj->cur.visible, obj->cur.cache.clip.visible, obj->cur.cache.clip.a, obj->func->is_visible); RD(" [%p] vis: %i, cache.clip.vis: %i cache.clip.a: %i [%p]\n", obj, obj->cur->visible, obj->cur->cache.clip.visible, obj->cur->cache.clip.a, obj->func->is_visible);
} }
#endif #endif
@ -420,8 +420,8 @@ _evas_render_phase1_object_process(Evas_Public_Data *e, Evas_Object *eo_obj,
if (map != hmap) *redraw_all = 1; if (map != hmap) *redraw_all = 1;
if ((is_active) && (!obj->clip.clipees) && if ((is_active) && (!obj->clip.clipees) &&
((evas_object_is_visible(eo_obj, obj) && (!obj->cur.have_clipees)) || ((evas_object_is_visible(eo_obj, obj) && (!obj->cur->have_clipees)) ||
(evas_object_was_visible(eo_obj, obj) && (!obj->prev.have_clipees)))) (evas_object_was_visible(eo_obj, obj) && (!obj->prev->have_clipees))))
{ {
eina_array_push(render_objects, obj); eina_array_push(render_objects, obj);
_evas_render_prev_cur_clip_cache_add(e, obj); _evas_render_prev_cur_clip_cache_add(e, obj);
@ -522,12 +522,12 @@ _evas_render_phase1_object_process(Evas_Public_Data *e, Evas_Object *eo_obj,
{ {
RD(" not changed... [%i] -> (%i %i %p %i) [%i]\n", RD(" not changed... [%i] -> (%i %i %p %i) [%i]\n",
evas_object_is_visible(eo_obj, obj), evas_object_is_visible(eo_obj, obj),
obj->cur.visible, obj->cur.cache.clip.visible, obj->smart.smart, obj->cur->visible, obj->cur->cache.clip.visible, obj->smart.smart,
obj->cur.cache.clip.a, evas_object_was_visible(eo_obj, obj)); obj->cur->cache.clip.a, evas_object_was_visible(eo_obj, obj));
if ((!obj->clip.clipees) && (obj->delete_me == 0) && if ((!obj->clip.clipees) && (obj->delete_me == 0) &&
(_evas_render_can_render(eo_obj, obj) || (_evas_render_can_render(eo_obj, obj) ||
(evas_object_was_visible(eo_obj, obj) && (!obj->prev.have_clipees)))) (evas_object_was_visible(eo_obj, obj) && (!obj->prev->have_clipees))))
{ {
if (obj->is_smart) if (obj->is_smart)
{ {
@ -679,7 +679,7 @@ _evas_render_check_pending_objects(Eina_Array *pending_objects, Evas *eo_e EINA_
else else
if ((is_active) && (obj->restack) && (!obj->clip.clipees) && if ((is_active) && (obj->restack) && (!obj->clip.clipees) &&
(_evas_render_can_render(eo_obj, obj) || (_evas_render_can_render(eo_obj, obj) ||
(evas_object_was_visible(eo_obj, obj) && (!obj->prev.have_clipees)))) (evas_object_was_visible(eo_obj, obj) && (!obj->prev->have_clipees))))
{ {
if (!(obj->render_pre || obj->rect_del)) if (!(obj->render_pre || obj->rect_del))
ok = EINA_TRUE; ok = EINA_TRUE;
@ -687,7 +687,7 @@ _evas_render_check_pending_objects(Eina_Array *pending_objects, Evas *eo_e EINA_
else else
if (is_active && (!obj->clip.clipees) && if (is_active && (!obj->clip.clipees) &&
(_evas_render_can_render(eo_obj, obj) || (_evas_render_can_render(eo_obj, obj) ||
(evas_object_was_visible(eo_obj, obj) && (!obj->prev.have_clipees)))) (evas_object_was_visible(eo_obj, obj) && (!obj->prev->have_clipees))))
{ {
if (obj->render_pre || obj->rect_del) ok = EINA_TRUE; if (obj->render_pre || obj->rect_del) ok = EINA_TRUE;
} }
@ -695,7 +695,7 @@ _evas_render_check_pending_objects(Eina_Array *pending_objects, Evas *eo_e EINA_
else else
{ {
if ((!obj->clip.clipees) && (obj->delete_me == 0) && if ((!obj->clip.clipees) && (obj->delete_me == 0) &&
(!obj->cur.have_clipees || (evas_object_was_visible(eo_obj, obj) && (!obj->prev.have_clipees))) (!obj->cur->have_clipees || (evas_object_was_visible(eo_obj, obj) && (!obj->prev->have_clipees)))
&& evas_object_is_opaque(eo_obj, obj) && evas_object_is_visible(eo_obj, obj)) && evas_object_is_opaque(eo_obj, obj) && evas_object_is_visible(eo_obj, obj))
{ {
if (obj->rect_del || obj->is_smart) ok = EINA_TRUE; if (obj->rect_del || obj->is_smart) ok = EINA_TRUE;
@ -764,18 +764,18 @@ _evas_render_can_use_overlay(Evas_Public_Data *e, Evas_Object *eo_obj)
if (!evas_object_is_visible(eo_obj, obj)) return EINA_FALSE; /* no need to update the overlay if it's not visible */ if (!evas_object_is_visible(eo_obj, obj)) return EINA_FALSE; /* no need to update the overlay if it's not visible */
/* If any recoloring of the surface is needed, n overlay to */ /* If any recoloring of the surface is needed, n overlay to */
if ((obj->cur.cache.clip.r != 255) || if ((obj->cur->cache.clip.r != 255) ||
(obj->cur.cache.clip.g != 255) || (obj->cur->cache.clip.g != 255) ||
(obj->cur.cache.clip.b != 255) || (obj->cur->cache.clip.b != 255) ||
(obj->cur.cache.clip.a != 255)) (obj->cur->cache.clip.a != 255))
return EINA_FALSE; return EINA_FALSE;
/* Check presence of transparent object on top of the video object */ /* Check presence of transparent object on top of the video object */
EINA_RECTANGLE_SET(&zone, EINA_RECTANGLE_SET(&zone,
obj->cur.cache.clip.x, obj->cur->cache.clip.x,
obj->cur.cache.clip.y, obj->cur->cache.clip.y,
obj->cur.cache.clip.w, obj->cur->cache.clip.w,
obj->cur.cache.clip.h); obj->cur->cache.clip.h);
for (i = e->active_objects.count - 1; i > 0; i--) for (i = e->active_objects.count - 1; i > 0; i--)
{ {
@ -793,25 +793,25 @@ _evas_render_can_use_overlay(Evas_Public_Data *e, Evas_Object *eo_obj)
break; break;
EINA_RECTANGLE_SET(&self, EINA_RECTANGLE_SET(&self,
current->cur.cache.clip.x, current->cur->cache.clip.x,
current->cur.cache.clip.y, current->cur->cache.clip.y,
current->cur.cache.clip.w, current->cur->cache.clip.w,
current->cur.cache.clip.h); current->cur->cache.clip.h);
/* This doesn't cover the area of the video object, so don't bother with that object */ /* This doesn't cover the area of the video object, so don't bother with that object */
if (!eina_rectangles_intersect(&zone, &self)) if (!eina_rectangles_intersect(&zone, &self))
continue; continue;
xc1 = current->cur.cache.clip.x; xc1 = current->cur->cache.clip.x;
yc1 = current->cur.cache.clip.y; yc1 = current->cur->cache.clip.y;
xc2 = current->cur.cache.clip.x + current->cur.cache.clip.w; xc2 = current->cur->cache.clip.x + current->cur->cache.clip.w;
yc2 = current->cur.cache.clip.y + current->cur.cache.clip.h; yc2 = current->cur->cache.clip.y + current->cur->cache.clip.h;
if (evas_object_is_visible(eo_current, current) && if (evas_object_is_visible(eo_current, current) &&
(!current->clip.clipees) && (!current->clip.clipees) &&
(current->cur.visible) && (current->cur->visible) &&
(!current->delete_me) && (!current->delete_me) &&
(current->cur.cache.clip.visible) && (current->cur->cache.clip.visible) &&
(!eo_isa(eo_current, EVAS_OBJ_SMART_CLASS))) (!eo_isa(eo_current, EVAS_OBJ_SMART_CLASS)))
{ {
Eina_Bool included = EINA_FALSE; Eina_Bool included = EINA_FALSE;
@ -844,8 +844,8 @@ _evas_render_can_use_overlay(Evas_Public_Data *e, Evas_Object *eo_obj)
Eina_List *ln; Eina_List *ln;
Evas_Coord xn2, yn2; Evas_Coord xn2, yn2;
r = eina_rectangle_new(current->cur.cache.clip.x, current->cur.cache.clip.y, r = eina_rectangle_new(current->cur->cache.clip.x, current->cur->cache.clip.y,
current->cur.cache.clip.w, current->cur.cache.clip.h); current->cur->cache.clip.w, current->cur->cache.clip.h);
opaques = eina_list_append(opaques, r); opaques = eina_list_append(opaques, r);
@ -911,8 +911,8 @@ _evas_render_can_use_overlay(Evas_Public_Data *e, Evas_Object *eo_obj)
/* No inclusion at all, so add it */ /* No inclusion at all, so add it */
if (!included) if (!included)
{ {
r = eina_rectangle_new(current->cur.cache.clip.x, current->cur.cache.clip.y, r = eina_rectangle_new(current->cur->cache.clip.x, current->cur->cache.clip.y,
current->cur.cache.clip.w, current->cur.cache.clip.h); current->cur->cache.clip.w, current->cur->cache.clip.h);
alphas = eina_list_append(alphas, r); alphas = eina_list_append(alphas, r);
} }
@ -958,7 +958,7 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object *eo_obj,
if (mapped) if (mapped)
{ {
if ((!evas_object_is_visible(eo_obj, obj)) || (obj->clip.clipees) || if ((!evas_object_is_visible(eo_obj, obj)) || (obj->clip.clipees) ||
(obj->cur.have_clipees)) (obj->cur->have_clipees))
{ {
RDI(level); RDI(level);
RD(" }\n"); RD(" }\n");
@ -987,8 +987,8 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object *eo_obj,
clean_them = EINA_TRUE; clean_them = EINA_TRUE;
sw = obj->cur.geometry.w; sw = obj->cur->geometry.w;
sh = obj->cur.geometry.h; sh = obj->cur->geometry.h;
RDI(level); RDI(level);
RD(" mapped obj: %ix%i\n", sw, sh); RD(" mapped obj: %ix%i\n", sw, sh);
if ((sw <= 0) || (sh <= 0)) if ((sw <= 0) || (sh <= 0))
@ -1097,8 +1097,8 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object *eo_obj,
e->engine.func->context_free(e->engine.data.output, ctx); e->engine.func->context_free(e->engine.data.output, ctx);
} }
ctx = e->engine.func->context_new(e->engine.data.output); ctx = e->engine.func->context_new(e->engine.data.output);
off_x2 = -obj->cur.geometry.x; off_x2 = -obj->cur->geometry.x;
off_y2 = -obj->cur.geometry.y; off_y2 = -obj->cur->geometry.y;
if (obj->is_smart) if (obj->is_smart)
{ {
EINA_INLIST_FOREACH EINA_INLIST_FOREACH
@ -1123,10 +1123,10 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object *eo_obj,
w = obj->map->surface_w; w = obj->map->surface_w;
h = obj->map->surface_h; h = obj->map->surface_h;
RECTS_CLIP_TO_RECT(x, y, w, h, RECTS_CLIP_TO_RECT(x, y, w, h,
obj->cur.geometry.x + off_x2, obj->cur->geometry.x + off_x2,
obj->cur.geometry.y + off_y2, obj->cur->geometry.y + off_y2,
obj->cur.geometry.w, obj->cur->geometry.w,
obj->cur.geometry.h); obj->cur->geometry.h);
e->engine.func->context_clip_set(e->engine.data.output, e->engine.func->context_clip_set(e->engine.data.output,
ctx, x, y, w, h); ctx, x, y, w, h);
@ -1157,36 +1157,40 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object *eo_obj,
context); context);
if (obj->map->surface) if (obj->map->surface)
{ {
if (obj->cur.clipper) if (obj->cur->clipper)
{ {
int x, y, w, h; int x, y, w, h;
evas_object_clip_recalc(eo_obj, obj); evas_object_clip_recalc(eo_obj, obj);
x = obj->cur.cache.clip.x; x = obj->cur->cache.clip.x;
y = obj->cur.cache.clip.y; y = obj->cur->cache.clip.y;
w = obj->cur.cache.clip.w; w = obj->cur->cache.clip.w;
h = obj->cur.cache.clip.h; h = obj->cur->cache.clip.h;
if (obj->is_smart) if (obj->is_smart)
{ {
Evas_Object *tobj; Evas_Object *tobj;
obj->cur.cache.clip.dirty = EINA_TRUE; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
{
state_write->cache.clip.dirty = EINA_TRUE;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
EINA_COW_WRITE_BEGIN(evas_object_map_cow, obj->map, Evas_Object_Map_Data, map_write) EINA_COW_WRITE_BEGIN(evas_object_map_cow, obj->map, Evas_Object_Map_Data, map_write)
{ {
tobj = map_write->cur.map_parent; tobj = map_write->cur.map_parent;
map_write->cur.map_parent = obj->cur.clipper->map->cur.map_parent; map_write->cur.map_parent = obj->cur->clipper->map->cur.map_parent;
map_write->cur.map_parent = tobj; map_write->cur.map_parent = tobj;
} }
EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write); EINA_COW_WRITE_END(evas_object_map_cow, obj->map, map_write);
} }
RECTS_CLIP_TO_RECT(x, y, w, h, RECTS_CLIP_TO_RECT(x, y, w, h,
obj->cur.clipper->cur.cache.clip.x, obj->cur->clipper->cur->cache.clip.x,
obj->cur.clipper->cur.cache.clip.y, obj->cur->clipper->cur->cache.clip.y,
obj->cur.clipper->cur.cache.clip.w, obj->cur->clipper->cur->cache.clip.w,
obj->cur.clipper->cur.cache.clip.h); obj->cur->clipper->cur->cache.clip.h);
e->engine.func->context_clip_set(e->engine.data.output, e->engine.func->context_clip_set(e->engine.data.output,
context, context,
@ -1197,7 +1201,7 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object *eo_obj,
e->engine.func->context_clip_clip(e->engine.data.output, e->engine.func->context_clip_clip(e->engine.data.output,
context, context,
ecx, ecy, ecw, ech); ecx, ecy, ecw, ech);
if (obj->cur.cache.clip.visible) if (obj->cur->cache.clip.visible)
{ {
obj->layer->evas->engine.func->context_multiplier_unset obj->layer->evas->engine.func->context_multiplier_unset
(e->engine.data.output, context); (e->engine.data.output, context);
@ -1214,11 +1218,11 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object *eo_obj,
} }
else else
{ {
if (0 && obj->cur.cached_surface) if (0 && obj->cur->cached_surface)
fprintf(stderr, "We should cache '%s' [%i, %i, %i, %i]\n", fprintf(stderr, "We should cache '%s' [%i, %i, %i, %i]\n",
evas_object_type_get(eo_obj), evas_object_type_get(eo_obj),
obj->cur.bounding_box.x, obj->cur.bounding_box.x, obj->cur->bounding_box.x, obj->cur->bounding_box.x,
obj->cur.bounding_box.w, obj->cur.bounding_box.h); obj->cur->bounding_box.w, obj->cur->bounding_box.h);
if (mapped) if (mapped)
{ {
RDI(level); RDI(level);
@ -1244,39 +1248,39 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object *eo_obj,
{ {
RDI(level); RDI(level);
if (obj->cur.clipper) if (obj->cur->clipper)
{ {
RD(" clip: %i %i %ix%i [%i %i %ix%i]\n", RD(" clip: %i %i %ix%i [%i %i %ix%i]\n",
obj->cur.cache.clip.x + off_x, obj->cur->cache.clip.x + off_x,
obj->cur.cache.clip.y + off_y, obj->cur->cache.clip.y + off_y,
obj->cur.cache.clip.w, obj->cur->cache.clip.w,
obj->cur.cache.clip.h, obj->cur->cache.clip.h,
obj->cur.geometry.x + off_x, obj->cur->geometry.x + off_x,
obj->cur.geometry.y + off_y, obj->cur->geometry.y + off_y,
obj->cur.geometry.w, obj->cur->geometry.w,
obj->cur.geometry.h); obj->cur->geometry.h);
RD(" clipper: %i %i %ix%i\n", RD(" clipper: %i %i %ix%i\n",
obj->cur.clipper->cur.cache.clip.x + off_x, obj->cur->clipper->cur->cache.clip.x + off_x,
obj->cur.clipper->cur.cache.clip.y + off_y, obj->cur->clipper->cur->cache.clip.y + off_y,
obj->cur.clipper->cur.cache.clip.w, obj->cur->clipper->cur->cache.clip.w,
obj->cur.clipper->cur.cache.clip.h); obj->cur->clipper->cur->cache.clip.h);
int x, y, w, h; int x, y, w, h;
if (_evas_render_has_map(eo_obj, obj)) if (_evas_render_has_map(eo_obj, obj))
evas_object_clip_recalc(eo_obj, obj); evas_object_clip_recalc(eo_obj, obj);
x = obj->cur.cache.clip.x + off_x; x = obj->cur->cache.clip.x + off_x;
y = obj->cur.cache.clip.y + off_y; y = obj->cur->cache.clip.y + off_y;
w = obj->cur.cache.clip.w; w = obj->cur->cache.clip.w;
h = obj->cur.cache.clip.h; h = obj->cur->cache.clip.h;
RECTS_CLIP_TO_RECT(x, y, w, h, RECTS_CLIP_TO_RECT(x, y, w, h,
obj->cur.clipper->cur.cache.clip.x + off_x, obj->cur->clipper->cur->cache.clip.x + off_x,
obj->cur.clipper->cur.cache.clip.y + off_y, obj->cur->clipper->cur->cache.clip.y + off_y,
obj->cur.clipper->cur.cache.clip.w, obj->cur->clipper->cur->cache.clip.w,
obj->cur.clipper->cur.cache.clip.h); obj->cur->clipper->cur->cache.clip.h);
e->engine.func->context_clip_set(e->engine.data.output, e->engine.func->context_clip_set(e->engine.data.output,
ctx, x, y, w, h); ctx, x, y, w, h);
@ -1288,21 +1292,21 @@ evas_render_mapped(Evas_Public_Data *e, Evas_Object *eo_obj,
} }
else else
{ {
if (obj->cur.clipper) if (obj->cur->clipper)
{ {
int x, y, w, h; int x, y, w, h;
if (_evas_render_has_map(eo_obj, obj)) if (_evas_render_has_map(eo_obj, obj))
evas_object_clip_recalc(eo_obj, obj); evas_object_clip_recalc(eo_obj, obj);
x = obj->cur.cache.clip.x; x = obj->cur->cache.clip.x;
y = obj->cur.cache.clip.y; y = obj->cur->cache.clip.y;
w = obj->cur.cache.clip.w; w = obj->cur->cache.clip.w;
h = obj->cur.cache.clip.h; h = obj->cur->cache.clip.h;
RECTS_CLIP_TO_RECT(x, y, w, h, RECTS_CLIP_TO_RECT(x, y, w, h,
obj->cur.clipper->cur.cache.clip.x, obj->cur->clipper->cur->cache.clip.x,
obj->cur.clipper->cur.cache.clip.y, obj->cur->clipper->cur->cache.clip.y,
obj->cur.clipper->cur.cache.clip.w, obj->cur->clipper->cur->cache.clip.w,
obj->cur.clipper->cur.cache.clip.h); obj->cur->clipper->cur->cache.clip.h);
e->engine.func->context_clip_set(e->engine.data.output, e->engine.func->context_clip_set(e->engine.data.output,
context, context,
x + off_x, y + off_y, w, h); x + off_x, y + off_y, w, h);
@ -1334,10 +1338,10 @@ _evas_render_cutout_add(Evas *eo_e, Evas_Object *eo_obj, int off_x, int off_y)
if (evas_object_is_opaque(eo_obj, obj)) if (evas_object_is_opaque(eo_obj, obj))
{ {
Evas_Coord cox, coy, cow, coh; Evas_Coord cox, coy, cow, coh;
cox = obj->cur.cache.clip.x; cox = obj->cur->cache.clip.x;
coy = obj->cur.cache.clip.y; coy = obj->cur->cache.clip.y;
cow = obj->cur.cache.clip.w; cow = obj->cur->cache.clip.w;
coh = obj->cur.cache.clip.h; coh = obj->cur->cache.clip.h;
if ((obj->map->cur.map) && (obj->map->cur.usemap)) if ((obj->map->cur.map) && (obj->map->cur.usemap))
{ {
Evas_Object *eo_oo; Evas_Object *eo_oo;
@ -1345,19 +1349,19 @@ _evas_render_cutout_add(Evas *eo_e, Evas_Object *eo_obj, int off_x, int off_y)
eo_oo = eo_obj; eo_oo = eo_obj;
oo = eo_data_get(eo_oo, EVAS_OBJ_CLASS); oo = eo_data_get(eo_oo, EVAS_OBJ_CLASS);
while (oo->cur.clipper) while (oo->cur->clipper)
{ {
if ((oo->cur.clipper->map->cur.map_parent if ((oo->cur->clipper->map->cur.map_parent
!= oo->map->cur.map_parent) && != oo->map->cur.map_parent) &&
(!((oo->map->cur.map) && (oo->map->cur.usemap)))) (!((oo->map->cur.map) && (oo->map->cur.usemap))))
break; break;
RECTS_CLIP_TO_RECT(cox, coy, cow, coh, RECTS_CLIP_TO_RECT(cox, coy, cow, coh,
oo->cur.geometry.x, oo->cur->geometry.x,
oo->cur.geometry.y, oo->cur->geometry.y,
oo->cur.geometry.w, oo->cur->geometry.w,
oo->cur.geometry.h); oo->cur->geometry.h);
eo_oo = oo->cur.eo_clipper; eo_oo = oo->cur->eo_clipper;
oo = oo->cur.clipper; oo = oo->cur->clipper;
} }
} }
e->engine.func->context_cutout_add e->engine.func->context_cutout_add
@ -1376,10 +1380,10 @@ _evas_render_cutout_add(Evas *eo_e, Evas_Object *eo_obj, int off_x, int off_y)
obx += off_x; obx += off_x;
oby += off_y; oby += off_y;
RECTS_CLIP_TO_RECT(obx, oby, obw, obh, RECTS_CLIP_TO_RECT(obx, oby, obw, obh,
obj->cur.cache.clip.x + off_x, obj->cur->cache.clip.x + off_x,
obj->cur.cache.clip.y + off_y, obj->cur->cache.clip.y + off_y,
obj->cur.cache.clip.w, obj->cur->cache.clip.w,
obj->cur.cache.clip.h); obj->cur->cache.clip.h);
e->engine.func->context_cutout_add e->engine.func->context_cutout_add
(e->engine.data.output, e->engine.data.context, (e->engine.data.output, e->engine.data.context,
obx, oby, obw, obh); obx, oby, obw, obh);
@ -1593,10 +1597,10 @@ evas_render_updates_internal(Evas *eo_e,
eo_data_get(e->framespace.clip, EVAS_OBJ_CLASS); eo_data_get(e->framespace.clip, EVAS_OBJ_CLASS);
EINA_RECTANGLE_SET(&clip_rect, EINA_RECTANGLE_SET(&clip_rect,
framespace_clip->cur.geometry.x, framespace_clip->cur->geometry.x,
framespace_clip->cur.geometry.y, framespace_clip->cur->geometry.y,
framespace_clip->cur.geometry.w, framespace_clip->cur->geometry.w,
framespace_clip->cur.geometry.h) framespace_clip->cur->geometry.h)
/* With the master clip all setup, we need to loop the objects on this /* With the master clip all setup, we need to loop the objects on this
* canvas and determine if the object is in the viewport space. If it * canvas and determine if the object is in the viewport space. If it
@ -1620,8 +1624,8 @@ evas_render_updates_internal(Evas *eo_e,
if (eo_obj == framespace_clip->object) continue; if (eo_obj == framespace_clip->object) continue;
EINA_RECTANGLE_SET(&obj_rect, EINA_RECTANGLE_SET(&obj_rect,
obj->cur.geometry.x, obj->cur.geometry.y, obj->cur->geometry.x, obj->cur->geometry.y,
obj->cur.geometry.w, obj->cur.geometry.h); obj->cur->geometry.w, obj->cur->geometry.h);
/* if the object does not intersect our clip rect, ignore it */ /* if the object does not intersect our clip rect, ignore it */
if (!eina_rectangles_intersect(&clip_rect, &obj_rect)) if (!eina_rectangles_intersect(&clip_rect, &obj_rect))
@ -1657,9 +1661,9 @@ evas_render_updates_internal(Evas *eo_e,
(obj->func->has_opaque_rect(eo_obj, obj)))) && (obj->func->has_opaque_rect(eo_obj, obj)))) &&
evas_object_is_visible(eo_obj, obj) && evas_object_is_visible(eo_obj, obj) &&
(!obj->clip.clipees) && (!obj->clip.clipees) &&
(obj->cur.visible) && (obj->cur->visible) &&
(!obj->delete_me) && (!obj->delete_me) &&
(obj->cur.cache.clip.visible) && (obj->cur->cache.clip.visible) &&
(!obj->is_smart))) (!obj->is_smart)))
/* obscuring_objects = eina_list_append(obscuring_objects, obj); */ /* obscuring_objects = eina_list_append(obscuring_objects, obj); */
eina_array_push(&e->obscuring_objects, obj); eina_array_push(&e->obscuring_objects, obj);
@ -1751,19 +1755,19 @@ evas_render_updates_internal(Evas *eo_e,
eo_obj = obj->object; eo_obj = obj->object;
/* if it's in our outpout rect and it doesn't clip anything */ /* if it's in our outpout rect and it doesn't clip anything */
RD(" OBJ: [%p] '%s' %i %i %ix%i\n", obj, obj->type, obj->cur.geometry.x, obj->cur.geometry.y, obj->cur.geometry.w, obj->cur.geometry.h); RD(" OBJ: [%p] '%s' %i %i %ix%i\n", obj, obj->type, obj->cur->geometry.x, obj->cur->geometry.y, obj->cur->geometry.w, obj->cur->geometry.h);
if ((evas_object_is_in_output_rect(eo_obj, obj, ux, uy, uw, uh) || if ((evas_object_is_in_output_rect(eo_obj, obj, ux, uy, uw, uh) ||
(obj->is_smart)) && (obj->is_smart)) &&
(!obj->clip.clipees) && (!obj->clip.clipees) &&
(obj->cur.visible) && (obj->cur->visible) &&
(!obj->delete_me) && (!obj->delete_me) &&
(obj->cur.cache.clip.visible) && (obj->cur->cache.clip.visible) &&
// (!obj->is_smart) && // (!obj->is_smart) &&
((obj->cur.color.a > 0 || obj->cur.render_op != EVAS_RENDER_BLEND))) ((obj->cur->color.a > 0 || obj->cur->render_op != EVAS_RENDER_BLEND)))
{ {
int x, y, w, h; int x, y, w, h;
RD(" DRAW (vis: %i, a: %i, clipees: %p\n", obj->cur.visible, obj->cur.color.a, obj->clip.clipees); RD(" DRAW (vis: %i, a: %i, clipees: %p\n", obj->cur->visible, obj->cur->color.a, obj->clip.clipees);
if ((e->temporary_objects.count > offset) && if ((e->temporary_objects.count > offset) &&
(eina_array_data_get(&e->temporary_objects, offset) == obj)) (eina_array_data_get(&e->temporary_objects, offset) == obj))
offset++; offset++;
@ -1773,10 +1777,10 @@ evas_render_updates_internal(Evas *eo_e,
if (!obj->is_smart) if (!obj->is_smart)
{ {
RECTS_CLIP_TO_RECT(x, y, w, h, RECTS_CLIP_TO_RECT(x, y, w, h,
obj->cur.cache.clip.x + off_x, obj->cur->cache.clip.x + off_x,
obj->cur.cache.clip.y + off_y, obj->cur->cache.clip.y + off_y,
obj->cur.cache.clip.w, obj->cur->cache.clip.w,
obj->cur.cache.clip.h); obj->cur->cache.clip.h);
} }
e->engine.func->context_clip_set(e->engine.data.output, e->engine.func->context_clip_set(e->engine.data.output,

View File

@ -83,7 +83,7 @@ _raise(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
if (evas_object_is_in_output_rect(eo_obj, obj, if (evas_object_is_in_output_rect(eo_obj, obj,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
1, 1) && obj->cur.visible) 1, 1) && obj->cur->visible)
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
@ -140,7 +140,7 @@ _lower(Eo *eo_obj, void *_pd, va_list *list EINA_UNUSED)
if (evas_object_is_in_output_rect(eo_obj, obj, if (evas_object_is_in_output_rect(eo_obj, obj,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
1, 1) && obj->cur.visible) 1, 1) && obj->cur->visible)
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
@ -227,7 +227,7 @@ _stack_above(Eo *eo_obj, void *_pd, va_list *list)
if (evas_object_is_in_output_rect(eo_obj, obj, if (evas_object_is_in_output_rect(eo_obj, obj,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
1, 1) && obj->cur.visible) 1, 1) && obj->cur->visible)
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
@ -314,7 +314,7 @@ _stack_below(Eo *eo_obj, void *_pd, va_list *list)
if (evas_object_is_in_output_rect(eo_obj, obj, if (evas_object_is_in_output_rect(eo_obj, obj,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,
1, 1) && obj->cur.visible) 1, 1) && obj->cur->visible)
evas_event_feed_mouse_move(obj->layer->evas->evas, evas_event_feed_mouse_move(obj->layer->evas->evas,
obj->layer->evas->pointer.x, obj->layer->evas->pointer.x,
obj->layer->evas->pointer.y, obj->layer->evas->pointer.y,

View File

@ -18,10 +18,10 @@ _evas_object_event_new(void)
static inline int static inline int
evas_object_was_visible(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) evas_object_was_visible(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{ {
if ((obj->prev.visible) && if ((obj->prev->visible) &&
((obj->prev.cache.clip.visible) || obj->is_smart) && ((obj->prev->cache.clip.visible) || obj->is_smart) &&
((obj->prev.cache.clip.a > 0 && obj->prev.render_op == EVAS_RENDER_BLEND) ((obj->prev->cache.clip.a > 0 && obj->prev->render_op == EVAS_RENDER_BLEND)
|| obj->prev.render_op != EVAS_RENDER_BLEND)) || obj->prev->render_op != EVAS_RENDER_BLEND))
{ {
if (obj->func->was_visible) if (obj->func->was_visible)
return obj->func->was_visible(eo_obj); return obj->func->was_visible(eo_obj);
@ -66,13 +66,13 @@ evas_object_is_opaque(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{ {
if (obj->is_smart) return 0; if (obj->is_smart) return 0;
/* If a mask: Assume alpha */ /* If a mask: Assume alpha */
if (obj->cur.cache.clip.a == 255) if (obj->cur->cache.clip.a == 255)
{ {
if (obj->func->is_opaque) if (obj->func->is_opaque)
return obj->func->is_opaque(eo_obj, obj); return obj->func->is_opaque(eo_obj, obj);
return 1; return 1;
} }
if (obj->cur.render_op == EVAS_RENDER_COPY) if (obj->cur->render_op == EVAS_RENDER_COPY)
return 1; return 1;
return 0; return 0;
} }
@ -123,10 +123,10 @@ evas_object_is_source_invisible(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Pro
static inline int static inline int
evas_object_is_visible(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) evas_object_is_visible(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{ /* post 1.0 -> enable? */ { /* post 1.0 -> enable? */
if ((obj->cur.visible)/* && (obj->cur.color.a > 0)*/ && if ((obj->cur->visible)/* && (obj->cur->color.a > 0)*/ &&
((obj->cur.cache.clip.visible) || (obj->is_smart)) && ((obj->cur->cache.clip.visible) || (obj->is_smart)) &&
((obj->cur.cache.clip.a > 0 && obj->cur.render_op == EVAS_RENDER_BLEND) ((obj->cur->cache.clip.a > 0 && obj->cur->render_op == EVAS_RENDER_BLEND)
|| obj->cur.render_op != EVAS_RENDER_BLEND)) || obj->cur->render_op != EVAS_RENDER_BLEND))
{ {
if (obj->func->is_visible) if (obj->func->is_visible)
return obj->func->is_visible(eo_obj); return obj->func->is_visible(eo_obj);
@ -138,12 +138,12 @@ evas_object_is_visible(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
static inline int static inline int
evas_object_clippers_is_visible(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj) evas_object_clippers_is_visible(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj)
{ {
if (obj->cur.visible) if (obj->cur->visible)
{ {
if (obj->cur.clipper) if (obj->cur->clipper)
{ {
return evas_object_clippers_is_visible(obj->cur.eo_clipper, return evas_object_clippers_is_visible(obj->cur->eo_clipper,
obj->cur.clipper); obj->cur->clipper);
} }
return 1; return 1;
} }
@ -155,10 +155,10 @@ evas_object_is_in_output_rect(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Prote
{ {
/* assumes coords have been recalced */ /* assumes coords have been recalced */
if ((RECTS_INTERSECT(x, y, w, h, if ((RECTS_INTERSECT(x, y, w, h,
obj->cur.cache.clip.x, obj->cur->cache.clip.x,
obj->cur.cache.clip.y, obj->cur->cache.clip.y,
obj->cur.cache.clip.w, obj->cur->cache.clip.w,
obj->cur.cache.clip.h))) obj->cur->cache.clip.h)))
return 1; return 1;
return 0; return 0;
} }
@ -198,20 +198,20 @@ evas_object_is_active(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
static inline void static inline void
evas_object_coords_recalc(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) evas_object_coords_recalc(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
{ {
//// if (obj->cur.cache.geometry.validity == obj->layer->evas->output_validity) //// if (obj->cur->cache.geometry.validity == obj->layer->evas->output_validity)
//// return; //// return;
//// obj->cur.cache.geometry.x = //// obj->cur->cache.geometry.x =
//// evas_coord_world_x_to_screen(obj->layer->evas, obj->cur.geometry.x); //// evas_coord_world_x_to_screen(obj->layer->evas, obj->cur->geometry.x);
//// obj->cur.cache.geometry.y = //// obj->cur->cache.geometry.y =
//// evas_coord_world_y_to_screen(obj->layer->evas, obj->cur.geometry.y); //// evas_coord_world_y_to_screen(obj->layer->evas, obj->cur->geometry.y);
//// obj->cur.cache.geometry.w = //// obj->cur->cache.geometry.w =
//// evas_coord_world_x_to_screen(obj->layer->evas, obj->cur.geometry.w) - //// evas_coord_world_x_to_screen(obj->layer->evas, obj->cur->geometry.w) -
//// evas_coord_world_x_to_screen(obj->layer->evas, 0); //// evas_coord_world_x_to_screen(obj->layer->evas, 0);
//// obj->cur.cache.geometry.h = //// obj->cur->cache.geometry.h =
//// evas_coord_world_y_to_screen(obj->layer->evas, obj->cur.geometry.h) - //// evas_coord_world_y_to_screen(obj->layer->evas, obj->cur->geometry.h) -
//// evas_coord_world_y_to_screen(obj->layer->evas, 0); //// evas_coord_world_y_to_screen(obj->layer->evas, 0);
if (obj->func->coords_recalc) obj->func->coords_recalc(eo_obj, obj); if (obj->func->coords_recalc) obj->func->coords_recalc(eo_obj, obj);
//// obj->cur.cache.geometry.validity = obj->layer->evas->output_validity; //// obj->cur->cache.geometry.validity = obj->layer->evas->output_validity;
} }
static inline void static inline void
@ -222,10 +222,10 @@ evas_object_clip_recalc(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
int nx, ny, nw, nh, nr, ng, nb, na; int nx, ny, nw, nh, nr, ng, nb, na;
Eina_Bool cvis, nvis; Eina_Bool cvis, nvis;
clipper = obj->cur.clipper; clipper = obj->cur->clipper;
if ((!obj->cur.cache.clip.dirty) && if ((!obj->cur->cache.clip.dirty) &&
!(!obj->cur.clipper || clipper->cur.cache.clip.dirty)) return; !(!obj->cur->clipper || clipper->cur->cache.clip.dirty)) return;
if (obj->layer->evas->is_frozen) return; if (obj->layer->evas->is_frozen) return;
@ -240,60 +240,65 @@ evas_object_clip_recalc(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj)
} }
else else
{ {
cx = obj->cur.geometry.x; cx = obj->cur->geometry.x;
cy = obj->cur.geometry.y; cy = obj->cur->geometry.y;
cw = obj->cur.geometry.w; cw = obj->cur->geometry.w;
ch = obj->cur.geometry.h; ch = obj->cur->geometry.h;
} }
if (obj->cur.color.a == 0 && obj->cur.render_op == EVAS_RENDER_BLEND) if (obj->cur->color.a == 0 && obj->cur->render_op == EVAS_RENDER_BLEND)
cvis = EINA_FALSE; cvis = EINA_FALSE;
else cvis = obj->cur.visible; else cvis = obj->cur->visible;
cr = obj->cur.color.r; cg = obj->cur.color.g; cr = obj->cur->color.r; cg = obj->cur->color.g;
cb = obj->cur.color.b; ca = obj->cur.color.a; cb = obj->cur->color.b; ca = obj->cur->color.a;
if (clipper) if (clipper)
{ {
// this causes problems... hmmm ????? // this causes problems... hmmm ?????
if (clipper->cur.cache.clip.dirty) if (clipper->cur->cache.clip.dirty)
evas_object_clip_recalc(obj->cur.eo_clipper, clipper); evas_object_clip_recalc(obj->cur->eo_clipper, clipper);
// I don't know why this test was here in the first place. As I have // I don't know why this test was here in the first place. As I have
// no issue showing up due to this, I keep it and move color out of it. // no issue showing up due to this, I keep it and move color out of it.
// breaks cliping of mapped images!!! // breaks cliping of mapped images!!!
if (clipper->map->cur.map_parent == obj->map->cur.map_parent) if (clipper->map->cur.map_parent == obj->map->cur.map_parent)
{ {
nx = clipper->cur.cache.clip.x; nx = clipper->cur->cache.clip.x;
ny = clipper->cur.cache.clip.y; ny = clipper->cur->cache.clip.y;
nw = clipper->cur.cache.clip.w; nw = clipper->cur->cache.clip.w;
nh = clipper->cur.cache.clip.h; nh = clipper->cur->cache.clip.h;
RECTS_CLIP_TO_RECT(cx, cy, cw, ch, nx, ny, nw, nh); RECTS_CLIP_TO_RECT(cx, cy, cw, ch, nx, ny, nw, nh);
} }
nvis = clipper->cur.cache.clip.visible; nvis = clipper->cur->cache.clip.visible;
nr = clipper->cur.cache.clip.r; nr = clipper->cur->cache.clip.r;
ng = clipper->cur.cache.clip.g; ng = clipper->cur->cache.clip.g;
nb = clipper->cur.cache.clip.b; nb = clipper->cur->cache.clip.b;
na = clipper->cur.cache.clip.a; na = clipper->cur->cache.clip.a;
cvis = (cvis & nvis); cvis = (cvis & nvis);
cr = (cr * (nr + 1)) >> 8; cr = (cr * (nr + 1)) >> 8;
cg = (cg * (ng + 1)) >> 8; cg = (cg * (ng + 1)) >> 8;
cb = (cb * (nb + 1)) >> 8; cb = (cb * (nb + 1)) >> 8;
ca = (ca * (na + 1)) >> 8; ca = (ca * (na + 1)) >> 8;
} }
if ((ca == 0 && obj->cur.render_op == EVAS_RENDER_BLEND) || if ((ca == 0 && obj->cur->render_op == EVAS_RENDER_BLEND) ||
(cw <= 0) || (ch <= 0)) cvis = EINA_FALSE; (cw <= 0) || (ch <= 0)) cvis = EINA_FALSE;
obj->cur.cache.clip.x = cx;
obj->cur.cache.clip.y = cy; EINA_COW_STATE_WRITE_BEGIN(obj, state_write, cur)
obj->cur.cache.clip.w = cw; {
obj->cur.cache.clip.h = ch; state_write->cache.clip.x = cx;
obj->cur.cache.clip.visible = cvis; state_write->cache.clip.y = cy;
obj->cur.cache.clip.r = cr; state_write->cache.clip.w = cw;
obj->cur.cache.clip.g = cg; state_write->cache.clip.h = ch;
obj->cur.cache.clip.b = cb; state_write->cache.clip.visible = cvis;
obj->cur.cache.clip.a = ca; state_write->cache.clip.r = cr;
obj->cur.cache.clip.dirty = EINA_FALSE; state_write->cache.clip.g = cg;
state_write->cache.clip.b = cb;
state_write->cache.clip.a = ca;
state_write->cache.clip.dirty = EINA_FALSE;
}
EINA_COW_STATE_WRITE_END(obj, state_write, cur);
} }
#endif #endif

View File

@ -536,7 +536,7 @@ struct _Evas_Object_Protected_State
{ {
Evas_Object_Protected_Data *clipper; Evas_Object_Protected_Data *clipper;
Evas_Object *eo_clipper; Evas_Object *eo_clipper;
double scale;
Evas_Coord_Rectangle geometry; Evas_Coord_Rectangle geometry;
Evas_Coord_Rectangle bounding_box; Evas_Coord_Rectangle bounding_box;
struct { struct {
@ -547,21 +547,23 @@ struct _Evas_Object_Protected_State
Eina_Bool dirty : 1; Eina_Bool dirty : 1;
} clip; } clip;
} cache; } cache;
short layer;
struct { struct {
unsigned char r, g, b, a; unsigned char r, g, b, a;
} color; } color;
double scale;
short layer;
Evas_Render_Op render_op : 4; Evas_Render_Op render_op : 4;
Eina_Bool visible : 1; Eina_Bool visible : 1;
Eina_Bool have_clipees : 1; Eina_Bool have_clipees : 1;
Eina_Bool anti_alias : 1; Eina_Bool anti_alias : 1;
Eina_Bool valid_bounding_box : 1; Eina_Bool valid_bounding_box : 1;
Eina_Bool cached_surface : 1; Eina_Bool cached_surface : 1;
Eina_Bool parent_cached_surface : 1; Eina_Bool parent_cached_surface : 1;
Eina_Bool opaque_valid : 1;
Eina_Bool opaque : 1;
}; };
struct _Evas_Object_Protected_Data struct _Evas_Object_Protected_Data
@ -571,7 +573,8 @@ struct _Evas_Object_Protected_Data
const char *type; const char *type;
Evas_Layer *layer; Evas_Layer *layer;
Evas_Object_Protected_State cur, prev; const Evas_Object_Protected_State *cur;
const Evas_Object_Protected_State *prev;
char *name; char *name;
@ -1257,11 +1260,19 @@ void _evas_device_unref(Evas_Device *dev);
extern Eina_Cow *evas_object_proxy_cow; extern Eina_Cow *evas_object_proxy_cow;
extern Eina_Cow *evas_object_map_cow; extern Eina_Cow *evas_object_map_cow;
extern Eina_Cow *evas_object_state_cow;
extern Eina_Cow *evas_object_image_pixels_cow; extern Eina_Cow *evas_object_image_pixels_cow;
extern Eina_Cow *evas_object_image_load_opts_cow; extern Eina_Cow *evas_object_image_load_opts_cow;
extern Eina_Cow *evas_object_image_state_cow; extern Eina_Cow *evas_object_image_state_cow;
# define EINA_COW_STATE_WRITE_BEGIN(Obj, Write, State) \
EINA_COW_WRITE_BEGIN(evas_object_state_cow, Obj->State, \
Evas_Object_Protected_State, Write)
# define EINA_COW_STATE_WRITE_END(Obj, Write, State) \
EINA_COW_WRITE_END(evas_object_state_cow, Obj->State, Write)
/****************************************************************************/ /****************************************************************************/
/*****************************************/ /*****************************************/
/********************/ /********************/

View File

@ -164,10 +164,10 @@ compute_gl_coordinates(Evas_Object *obj, int rot, int clip,
if (rot == 0) if (rot == 0)
{ {
// oringinal image object coordinate in gl coordinate // oringinal image object coordinate in gl coordinate
imgc[0] = pd->cur.geometry.x; imgc[0] = pd->cur->geometry.x;
imgc[1] = pd->layer->evas->output.h - pd->cur.geometry.y - pd->cur.geometry.h; imgc[1] = pd->layer->evas->output.h - pd->cur->geometry.y - pd->cur->geometry.h;
imgc[2] = imgc[0] + pd->cur.geometry.w; imgc[2] = imgc[0] + pd->cur->geometry.w;
imgc[3] = imgc[1] + pd->cur.geometry.h; imgc[3] = imgc[1] + pd->cur->geometry.h;
// transformed (x,y,width,height) in gl coordinate // transformed (x,y,width,height) in gl coordinate
objc[0] = imgc[0] + x; objc[0] = imgc[0] + x;
@ -178,14 +178,14 @@ compute_gl_coordinates(Evas_Object *obj, int rot, int clip,
else if (rot == 180) else if (rot == 180)
{ {
// oringinal image object coordinate in gl coordinate // oringinal image object coordinate in gl coordinate
imgc[0] = pd->layer->evas->output.w - pd->cur.geometry.x - pd->cur.geometry.w; imgc[0] = pd->layer->evas->output.w - pd->cur->geometry.x - pd->cur->geometry.w;
imgc[1] = pd->cur.geometry.y; imgc[1] = pd->cur->geometry.y;
imgc[2] = imgc[0] + pd->cur.geometry.w; imgc[2] = imgc[0] + pd->cur->geometry.w;
imgc[3] = imgc[1] + pd->cur.geometry.h; imgc[3] = imgc[1] + pd->cur->geometry.h;
// transformed (x,y,width,height) in gl coordinate // transformed (x,y,width,height) in gl coordinate
objc[0] = imgc[0] + pd->cur.geometry.w - x - width; objc[0] = imgc[0] + pd->cur->geometry.w - x - width;
objc[1] = imgc[1] + pd->cur.geometry.h - y - height; objc[1] = imgc[1] + pd->cur->geometry.h - y - height;
objc[2] = objc[0] + width; objc[2] = objc[0] + width;
objc[3] = objc[1] + height; objc[3] = objc[1] + height;
@ -193,13 +193,13 @@ compute_gl_coordinates(Evas_Object *obj, int rot, int clip,
else if (rot == 90) else if (rot == 90)
{ {
// oringinal image object coordinate in gl coordinate // oringinal image object coordinate in gl coordinate
imgc[0] = pd->cur.geometry.y; imgc[0] = pd->cur->geometry.y;
imgc[1] = pd->cur.geometry.x; imgc[1] = pd->cur->geometry.x;
imgc[2] = imgc[0] + pd->cur.geometry.h; imgc[2] = imgc[0] + pd->cur->geometry.h;
imgc[3] = imgc[1] + pd->cur.geometry.w; imgc[3] = imgc[1] + pd->cur->geometry.w;
// transformed (x,y,width,height) in gl coordinate // transformed (x,y,width,height) in gl coordinate
objc[0] = imgc[0] + pd->cur.geometry.h - y - height; objc[0] = imgc[0] + pd->cur->geometry.h - y - height;
objc[1] = imgc[1] + x; objc[1] = imgc[1] + x;
objc[2] = objc[0] + height; objc[2] = objc[0] + height;
objc[3] = objc[1] + width; objc[3] = objc[1] + width;
@ -207,14 +207,14 @@ compute_gl_coordinates(Evas_Object *obj, int rot, int clip,
else if (rot == 270) else if (rot == 270)
{ {
// oringinal image object coordinate in gl coordinate // oringinal image object coordinate in gl coordinate
imgc[0] = pd->layer->evas->output.h - pd->cur.geometry.y - pd->cur.geometry.h; imgc[0] = pd->layer->evas->output.h - pd->cur->geometry.y - pd->cur->geometry.h;
imgc[1] = pd->layer->evas->output.w - pd->cur.geometry.x - pd->cur.geometry.w; imgc[1] = pd->layer->evas->output.w - pd->cur->geometry.x - pd->cur->geometry.w;
imgc[2] = imgc[0] + pd->cur.geometry.h; imgc[2] = imgc[0] + pd->cur->geometry.h;
imgc[3] = imgc[1] + pd->cur.geometry.w; imgc[3] = imgc[1] + pd->cur->geometry.w;
// transformed (x,y,width,height) in gl coordinate // transformed (x,y,width,height) in gl coordinate
objc[0] = imgc[0] + y; objc[0] = imgc[0] + y;
objc[1] = imgc[1] + pd->cur.geometry.w - x - width; objc[1] = imgc[1] + pd->cur->geometry.w - x - width;
objc[2] = objc[0] + height; objc[2] = objc[0] + height;
objc[3] = objc[1] + width; objc[3] = objc[1] + width;
} }
@ -390,8 +390,8 @@ _evgl_glGetIntegerv(GLenum pname, GLint* params)
{ {
params[0] = 0; params[0] = 0;
params[1] = 0; params[1] = 0;
params[2] = (GLint)img->cur.geometry.w; params[2] = (GLint)img->cur->geometry.w;
params[3] = (GLint)img->cur.geometry.h; params[3] = (GLint)img->cur->geometry.h;
return; return;
} }
} }