[Pkg-e-commits] [SCM] Enlightenment DR17 advanced canvas library branch, upstream-vcs, updated. 069f3cc6c93f253bffbc90289fe21d868f745bb6
cedric
cedric at alioth.debian.org
Sat Jun 7 18:24:36 UTC 2008
The following commit has been merged in the upstream-vcs branch:
commit ec14123cdfdb2e4f66db084a1c5c9b1c5480e9db
Author: cedric <cedric>
Date: Wed Jun 4 16:42:39 2008 +0000
Fix osbcuring case with evas_render cache.
diff --git a/src/lib/canvas/evas_main.c b/src/lib/canvas/evas_main.c
index 113f141..27b3ce6 100644
--- a/src/lib/canvas/evas_main.c
+++ b/src/lib/canvas/evas_main.c
@@ -68,6 +68,8 @@ evas_new(void)
evas_array_setup(&e->restack_objects, 16);
evas_array_setup(&e->render_objects, 16);
evas_array_setup(&e->pending_objects, 16);
+ evas_array_setup(&e->obscuring_objects, 16);
+ evas_array_setup(&e->temporary_objects, 16);
return e;
}
@@ -97,6 +99,7 @@ evas_free(Evas *e)
if (e->walking_list > 0) return;
del = 1;
e->walking_list++;
+ e->cleanup = 1;
while (del)
{
del = 0;
@@ -172,6 +175,8 @@ evas_free(Evas *e)
evas_array_flush(&e->restack_objects);
evas_array_flush(&e->render_objects);
evas_array_flush(&e->pending_objects);
+ evas_array_flush(&e->obscuring_objects);
+ evas_array_flush(&e->temporary_objects);
e->magic = 0;
free(e);
@@ -368,6 +373,7 @@ evas_output_size_set(Evas *e, int w, int h)
e->output.changed = 1;
e->output_validity++;
e->changed = 1;
+ evas_render_invalidate(e);
}
/**
diff --git a/src/lib/canvas/evas_render.c b/src/lib/canvas/evas_render.c
index 512b237..2ca4890 100644
--- a/src/lib/canvas/evas_render.c
+++ b/src/lib/canvas/evas_render.c
@@ -242,60 +242,89 @@ _evas_render_check_pending_objects(Evas_Array *pending_objects, Evas *e)
obj = _evas_array_get(pending_objects, i);
- if (obj->render_pre
- || obj->rect_del)
- {
- evas_object_clip_recalc(obj);
- is_active = evas_object_is_active(obj);
+ evas_object_clip_recalc(obj);
+ is_active = evas_object_is_active(obj);
- if (obj->is_active == is_active)
- {
- if (obj->changed)
- {
- if (obj->smart.smart)
- ok = 1;
- else
- if ((is_active) && (obj->restack) && (!obj->clip.clipees) &&
- ((evas_object_is_visible(obj) && (!obj->cur.have_clipees)) ||
- (evas_object_was_visible(obj) && (!obj->prev.have_clipees))))
- ok = 0;
- else
- if (is_active && (!obj->clip.clipees) &&
- ((evas_object_is_visible(obj) && (!obj->cur.have_clipees)) ||
- (evas_object_was_visible(obj) && (!obj->prev.have_clipees))))
+ if (!is_active && !obj->is_active && !obj->render_pre && !obj->rect_del)
+ ok = 1;
+ else
+ if (obj->is_active == is_active)
+ {
+ if (obj->changed)
+ {
+ if (obj->smart.smart)
+ {
+ if (obj->render_pre
+ || obj->rect_del)
+ ok = 1;
+ }
+ else
+ if ((is_active) && (obj->restack) && (!obj->clip.clipees) &&
+ ((evas_object_is_visible(obj) && (!obj->cur.have_clipees)) ||
+ (evas_object_was_visible(obj) && (!obj->prev.have_clipees))))
+ {
+ if (!(obj->render_pre
+ || obj->rect_del))
ok = 1;
- }
- else
- {
- if ((!obj->clip.clipees) && (obj->delete_me == 0) &&
- (!obj->cur.have_clipees || (evas_object_was_visible(obj) && (!obj->prev.have_clipees)))
- && evas_object_is_opaque(obj) && evas_object_is_visible(obj))
- if (obj->rect_del || obj->smart.smart)
+ }
+ else
+ if (is_active && (!obj->clip.clipees) &&
+ ((evas_object_is_visible(obj) && (!obj->cur.have_clipees)) ||
+ (evas_object_was_visible(obj) && (!obj->prev.have_clipees))))
+ {
+ if (obj->render_pre
+ || obj->rect_del)
+ ok = 1;
+ }
+ }
+ else
+ {
+ if ((!obj->clip.clipees) && (obj->delete_me == 0) &&
+ (!obj->cur.have_clipees || (evas_object_was_visible(obj) && (!obj->prev.have_clipees)))
+ && evas_object_is_opaque(obj) && evas_object_is_visible(obj))
+ if (obj->rect_del || obj->smart.smart)
+ {
ok = 1;
- }
- }
- }
+ }
+ }
+ }
if (!ok)
{
- evas_render_invalidate(e);
+ evas_array_clean(&e->active_objects);
+ evas_array_clean(&e->render_objects);
+
+ evas_array_clean(&e->restack_objects);
+ evas_array_clean(&e->delete_objects);
+
+ e->invalidate = 1;
+
return ;
}
}
}
+Evas_Bool pending_change(void *data, void *gdata)
+{
+ Evas_Object *obj;
+
+ obj = data;
+
+ if (obj->delete_me) return 0;
+
+ return obj->changed ? 1 : 0;
+}
+
static Evas_List *
evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char do_draw)
{
Evas_List *updates = NULL;
- Evas_List *obscuring_objects = NULL;
- Evas_List *obscuring_objects_orig = NULL;
Evas_List *ll;
void *surface;
Evas_Bool clean_them = 0;
int ux, uy, uw, uh;
int cx, cy, cw, ch;
- unsigned int i;
+ unsigned int i, j;
MAGIC_CHECK(e, Evas, MAGIC_EVAS);
return NULL;
@@ -303,14 +332,11 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char
if (!e->changed) return NULL;
/* Check if the modified object mean recalculating every thing */
- if (&e->pending_objects.count > 0)
- {
- _evas_render_check_pending_objects(&e->pending_objects, e);
- evas_array_clean(&e->pending_objects);
- }
+ if (!e->invalidate)
+ _evas_render_check_pending_objects(&e->pending_objects, e);
/* phase 1. add extra updates for changed objects */
- if (e->render_objects.count <= 0)
+ if (e->invalidate || e->render_objects.count <= 0)
clean_them = _evas_render_phase1_process(e, &e->active_objects, &e->restack_objects, &e->delete_objects, &e->render_objects);
_evas_render_phase1_direct(e, &e->render_objects);
@@ -386,14 +412,17 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char
(!obj->delete_me) &&
(obj->cur.cache.clip.visible) &&
(!obj->smart.smart)))
- obscuring_objects = evas_list_append(obscuring_objects, obj);
+/* obscuring_objects = evas_list_append(obscuring_objects, obj); */
+ _evas_array_append(&e->obscuring_objects, obj);
}
/* save this list */
- obscuring_objects_orig = obscuring_objects;
- obscuring_objects = NULL;
+/* obscuring_objects_orig = obscuring_objects; */
+/* obscuring_objects = NULL; */
/* phase 6. go thru each update rect and render objects in it*/
if (do_draw)
{
+ unsigned int offset = 0;
+
while ((surface =
e->engine.func->output_redraws_next_update_get(e->engine.data.output,
&ux, &uy, &uw, &uh,
@@ -415,19 +444,18 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char
off_x = cx - ux;
off_y = cy - uy;
/* build obscuring objects list (in order from bottom to top) */
- for (ll = obscuring_objects_orig; ll; ll = ll->next)
+ for (i = 0; i < e->obscuring_objects.count; ++i)
{
Evas_Object *obj;
- obj = (Evas_Object *)(ll->data);
+ obj = (Evas_Object *) _evas_array_get(&e->obscuring_objects, i);
if (evas_object_is_in_output_rect(obj, ux, uy, uw, uh))
- obscuring_objects = evas_list_append(obscuring_objects, obj);
+ _evas_array_append(&e->temporary_objects, obj);
}
/* render all object that intersect with rect */
for (i = 0; i < e->active_objects.count; ++i)
{
Evas_Object *obj;
- Evas_List *l3;
obj = _evas_array_get(&e->active_objects, i);
@@ -442,9 +470,9 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char
{
int x, y, w, h;
- if ((obscuring_objects) &&
- (obscuring_objects->data == obj))
- obscuring_objects = evas_list_remove(obscuring_objects, obj);
+ if ((e->temporary_objects.count > offset) &&
+ (_evas_array_get(&e->temporary_objects, offset) == obj))
+ offset++;
x = cx; y = cy; w = cw; h = ch;
RECTS_CLIP_TO_RECT(x, y, w, h,
obj->cur.cache.clip.x + off_x,
@@ -472,11 +500,11 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char
e->engine.data.context,
x, y, w, h);
#if 1 /* FIXME: this can slow things down... figure out optimum... coverage */
- for (l3 = obscuring_objects; l3; l3 = l3->next)
+ for (j = offset; j < e->temporary_objects.count; ++j)
{
Evas_Object *obj2;
- obj2 = (Evas_Object *)l3->data;
+ obj2 = (Evas_Object *) _evas_array_get(&e->temporary_objects, j);
e->engine.func->context_cutout_add(e->engine.data.output,
e->engine.data.context,
obj2->cur.cache.clip.x + off_x,
@@ -500,7 +528,7 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char
surface,
ux, uy, uw, uh);
/* free obscuring objects list */
- obscuring_objects = evas_list_free(obscuring_objects);
+ evas_array_clean(&e->temporary_objects);
}
/* flush redraws */
e->engine.func->output_flush(e->engine.data.output);
@@ -529,7 +557,12 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char
*/
}
/* free our obscuring object list */
- evas_list_free(obscuring_objects_orig);
+ evas_array_clean(&e->obscuring_objects);
+
+ /* If some object are still marked as changed, do not remove
+ them from the pending list. */
+ evas_array_remove(&e->pending_objects, pending_change, NULL);
+
/* delete all objects flagged for deletion now */
for (i = 0; i < e->delete_objects.count; ++i)
{
@@ -538,14 +571,21 @@ evas_render_updates_internal(Evas *e, unsigned char make_updates, unsigned char
obj = _evas_array_get(&e->delete_objects, i);
evas_object_free(obj, 1);
}
-
- /* If their are some object to restack or some object to delete, it's useless to keep the render object list around. */
- if (clean_them)
- evas_render_invalidate(e);
+ evas_array_clean(&e->delete_objects);
e->changed = 0;
e->viewport.changed = 0;
e->output.changed = 0;
+ e->invalidate = 0;
+
+ /* If their are some object to restack or some object to delete, it's useless to keep the render object list around. */
+ if (clean_them)
+ {
+ evas_array_clean(&e->active_objects);
+ evas_array_clean(&e->render_objects);
+
+ e->invalidate = 1;
+ }
evas_module_clean();
@@ -640,7 +680,12 @@ evas_render_idle_flush(Evas *e)
evas_array_flush(&e->active_objects);
evas_array_flush(&e->restack_objects);
evas_array_flush(&e->render_objects);
- evas_array_flush(&e->pending_objects);
+
+ /* If some object are still marked as changed, do not remove
+ them from the pending list. */
+ evas_array_remove(&e->pending_objects, pending_change, NULL);
+
+ e->invalidate = 1;
}
void
@@ -652,10 +697,15 @@ evas_render_invalidate(Evas *e)
evas_array_clean(&e->active_objects);
evas_array_clean(&e->render_objects);
- evas_array_clean(&e->pending_objects);
+
+ /* If some object are still marked as changed, do not remove
+ them from the pending list. */
+ evas_array_remove(&e->pending_objects, pending_change, NULL);
evas_array_flush(&e->restack_objects);
evas_array_flush(&e->delete_objects);
+
+ e->invalidate = 1;
}
void
@@ -665,15 +715,16 @@ evas_render_object_recalc(Evas_Object *obj)
return;
MAGIC_CHECK_END();
- if (!obj->changed && obj->layer)
+ if (!obj->changed && obj->delete_me < 2)
{
Evas *e;
e = obj->layer->evas;
+ if (!e || e->cleanup) return ;
+
+ obj->changed = 1;
- if (e->active_objects.count > 0
- && e->render_objects.count > 0)
- _evas_array_append(&e->pending_objects, obj);
+ _evas_array_append(&e->pending_objects, obj);
}
}
diff --git a/src/lib/include/evas_private.h b/src/lib/include/evas_private.h
index e446ea0..5ddb9b5 100644
--- a/src/lib/include/evas_private.h
+++ b/src/lib/include/evas_private.h
@@ -344,6 +344,8 @@ struct _Evas
Evas_Array restack_objects;
Evas_Array render_objects;
Evas_Array pending_objects;
+ Evas_Array obscuring_objects;
+ Evas_Array temporary_objects;
int delete_grabs;
int walking_grabs;
@@ -359,8 +361,10 @@ struct _Evas
int last_mouse_down_counter;
int last_mouse_up_counter;
Evas_Font_Hinting_Flags hinting;
- unsigned char changed : 1;
+ unsigned char changed : 1;
unsigned char delete_me : 1;
+ unsigned char invalidate : 1;
+ unsigned char cleanup : 1;
};
struct _Evas_Layer
--
Enlightenment DR17 advanced canvas library
More information about the Pkg-e-commits
mailing list