forked from enlightenment/efl
parent
3b91e744e4
commit
ab4b1521ac
|
@ -73,7 +73,6 @@ static const Evas_Object_Func object_func =
|
||||||
|
|
||||||
/* Optional
|
/* Optional
|
||||||
.store =
|
.store =
|
||||||
.unstore =
|
|
||||||
|
|
||||||
.is_visible =
|
.is_visible =
|
||||||
.was_visible =
|
.was_visible =
|
||||||
|
@ -231,6 +230,7 @@ _proxy_set(Evas_Object *proxy, Evas_Object *src)
|
||||||
o->source = src;
|
o->source = src;
|
||||||
|
|
||||||
src->proxy.proxies = eina_list_append(src->proxy.proxies, proxy);
|
src->proxy.proxies = eina_list_append(src->proxy.proxies, proxy);
|
||||||
|
src->proxy.redraw = EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -257,22 +257,26 @@ _proxy_render(Evas_Object *obj, void *output, void *context,
|
||||||
Evas_Object_Proxy *o;
|
Evas_Object_Proxy *o;
|
||||||
void *pixels;
|
void *pixels;
|
||||||
int w,h;
|
int w,h;
|
||||||
|
int iw, ih;
|
||||||
|
|
||||||
o = obj->object_data;
|
o = obj->object_data;
|
||||||
printf("proxy render\n");
|
|
||||||
|
|
||||||
if (!o->source) return;
|
if (!o->source) return;
|
||||||
|
|
||||||
/* Images only essentially */
|
// ENFN->context_multiplier_unset(output, context);
|
||||||
if (o->source->proxy.surface)
|
// ENFN->context_render_op_set(output, context, obj->cur.render_op);
|
||||||
|
|
||||||
|
if (o->source->proxy.surface && o->source->proxy.redraw == EINA_FALSE)
|
||||||
{
|
{
|
||||||
pixels = o->source->proxy.surface;
|
pixels = o->source->proxy.surface;
|
||||||
}
|
}
|
||||||
/* Making this faster would be nice... */
|
/* Making this faster would be nice... */
|
||||||
// else if (strcmp(evas_object_type_get(o->source),"image") == 0)
|
else if (strcmp(evas_object_type_get(o->source),"image") == 0)
|
||||||
// {
|
{
|
||||||
// pixels = o->source->func->engine_data_get(o->source);
|
pixels = o->source->func->engine_data_get(o->source);
|
||||||
//}
|
evas_object_image_size_get(o->source, &iw, &ih);
|
||||||
|
printf("\timage source (Pixels %p %dx%d)\n",pixels,iw,ih);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_proxy_subrender(obj->layer->evas, o->source);
|
_proxy_subrender(obj->layer->evas, o->source);
|
||||||
|
@ -321,12 +325,14 @@ _proxy_render(Evas_Object *obj, void *output, void *context,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
printf("\timage draw %p %p %p %p %d %d %d %d %d %d\n",
|
||||||
|
output, context, surface, pixels, w,h,obj->cur.geometry.x+x,
|
||||||
|
obj->cur.geometry.y+y,iw,ih);
|
||||||
|
#warning Your mum
|
||||||
obj->layer->evas->engine.func->image_draw(output, context,
|
obj->layer->evas->engine.func->image_draw(output, context,
|
||||||
surface, pixels,
|
surface, pixels,
|
||||||
0, 0,
|
0, 0,
|
||||||
w, h, /* FIXME:
|
w, h,
|
||||||
o->cur.image.w,
|
|
||||||
o->cur.image.h, */
|
|
||||||
obj->cur.geometry.x + /*ix +*/ x,
|
obj->cur.geometry.x + /*ix +*/ x,
|
||||||
obj->cur.geometry.y + /*iy +*/ y,
|
obj->cur.geometry.y + /*iy +*/ y,
|
||||||
w, h,/* was iw,ih */
|
w, h,/* was iw,ih */
|
||||||
|
@ -346,21 +352,28 @@ _proxy_subrender(Evas *e, Evas_Object *source)
|
||||||
|
|
||||||
if (!source) return;
|
if (!source) return;
|
||||||
|
|
||||||
if (source->proxy.surface)
|
|
||||||
{
|
|
||||||
/* FIXME: Don't free every time */
|
|
||||||
e->engine.func->image_map_surface_free(e->engine.data.output,
|
|
||||||
source->proxy.surface);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
w = source->cur.geometry.w;
|
w = source->cur.geometry.w;
|
||||||
h = source->cur.geometry.h;
|
h = source->cur.geometry.h;
|
||||||
|
|
||||||
|
source->proxy.redraw = EINA_FALSE;
|
||||||
|
|
||||||
|
/* We need to redraw surface then */
|
||||||
|
if (source->proxy.surface && (source->proxy.w != w || source->proxy.h != h))
|
||||||
|
{
|
||||||
|
e->engine.func->image_map_surface_free(e->engine.data.output,
|
||||||
|
source->proxy.surface);
|
||||||
|
source->proxy.surface = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* FIXME: Hardcoded alpha 'on' */
|
/* FIXME: Hardcoded alpha 'on' */
|
||||||
/* FIXME (cont): Should see if the object has alpha */
|
/* FIXME (cont): Should see if the object has alpha */
|
||||||
source->proxy.surface = e->engine.func->image_map_surface_new(
|
if (!source->proxy.surface)
|
||||||
e->engine.data.output, w, h, 1);
|
{
|
||||||
|
source->proxy.surface = e->engine.func->image_map_surface_new(
|
||||||
|
e->engine.data.output, w, h, 1);
|
||||||
|
source->proxy.w = w;
|
||||||
|
source->proxy.h = w;
|
||||||
|
}
|
||||||
|
|
||||||
ctx = e->engine.func->context_new(e->engine.data.output);
|
ctx = e->engine.func->context_new(e->engine.data.output);
|
||||||
e->engine.func->context_color_set(e->engine.data.output, ctx, 0, 0, 0, 0);
|
e->engine.func->context_color_set(e->engine.data.output, ctx, 0, 0, 0, 0);
|
||||||
|
@ -387,19 +400,64 @@ _proxy_subrender(Evas *e, Evas_Object *source)
|
||||||
-source->cur.geometry.y);
|
-source->cur.geometry.y);
|
||||||
}
|
}
|
||||||
e->engine.func->context_free(e->engine.data.output, ctx);
|
e->engine.func->context_free(e->engine.data.output, ctx);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_proxy_render_pre(Evas_Object *obj)
|
_proxy_render_pre(Evas_Object *obj)
|
||||||
{
|
{
|
||||||
printf("Proxy render pre\n");
|
Evas_Object_Proxy *o;
|
||||||
|
Evas *e;
|
||||||
|
int was_v, is_v;
|
||||||
|
|
||||||
if (obj->pre_render_done) return;
|
if (obj->pre_render_done) return;
|
||||||
obj->pre_render_done = 1;
|
obj->pre_render_done = 1;
|
||||||
|
|
||||||
|
printf("Proxy render pre: %p\n",obj);
|
||||||
|
|
||||||
|
e = obj->layer->evas;
|
||||||
|
o = obj->object_data;
|
||||||
|
|
||||||
|
is_v = evas_object_is_visible(obj);
|
||||||
|
was_v = evas_object_was_visible(obj);
|
||||||
|
|
||||||
|
if (is_v != was_v)
|
||||||
|
{
|
||||||
|
printf("\tVis changed\n");
|
||||||
|
evas_object_render_pre_visible_change(&e->clip_changes, obj, is_v, was_v);
|
||||||
|
}
|
||||||
|
if (((obj->cur.geometry.x != obj->prev.geometry.x) ||
|
||||||
|
(obj->cur.geometry.y != obj->prev.geometry.y) ||
|
||||||
|
(obj->cur.geometry.w != obj->prev.geometry.w) ||
|
||||||
|
(obj->cur.geometry.h != obj->prev.geometry.h))
|
||||||
|
)
|
||||||
|
{
|
||||||
|
printf("\tgeo changed\n");
|
||||||
|
evas_object_render_pre_prev_cur_add(&e->clip_changes, obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (o->source && o->source->proxy.redraw)
|
||||||
|
{
|
||||||
|
printf("\tsource redraw set\n");
|
||||||
|
evas_add_rect(&e->clip_changes,
|
||||||
|
obj->cur.geometry.x, obj->cur.geometry.y,
|
||||||
|
obj->cur.geometry.w, obj->cur.geometry.h);
|
||||||
|
}
|
||||||
|
|
||||||
|
evas_object_render_pre_effect_updates(&e->clip_changes, obj, is_v, was_v);
|
||||||
}
|
}
|
||||||
static void
|
static void
|
||||||
_proxy_render_post(Evas_Object *obj)
|
_proxy_render_post(Evas_Object *obj)
|
||||||
{
|
{
|
||||||
|
Evas_Object_Proxy *o;
|
||||||
|
|
||||||
printf("proxy render post\n");
|
printf("proxy render post\n");
|
||||||
|
o = obj->object_data;
|
||||||
|
|
||||||
|
evas_object_clip_changes_clean(obj);
|
||||||
|
/* move cur to prev safely for object data */
|
||||||
|
obj->prev = obj->cur;
|
||||||
|
//o->changed = 0;
|
||||||
}
|
}
|
||||||
static unsigned int
|
static unsigned int
|
||||||
_proxy_id_get(Evas_Object *obj)
|
_proxy_id_get(Evas_Object *obj)
|
||||||
|
|
|
@ -191,6 +191,8 @@ _evas_render_phase1_direct(Evas *e,
|
||||||
Eina_Array *render_objects)
|
Eina_Array *render_objects)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
Eina_List *l;
|
||||||
|
Evas_Object *proxy;
|
||||||
|
|
||||||
RD(" [--- PHASE 1 DIRECT\n");
|
RD(" [--- PHASE 1 DIRECT\n");
|
||||||
for (i = 0; i < render_objects->count; i++)
|
for (i = 0; i < render_objects->count; i++)
|
||||||
|
@ -201,8 +203,15 @@ _evas_render_phase1_direct(Evas *e,
|
||||||
RD(" OBJ [%p] changed %i\n", obj, obj->changed);
|
RD(" OBJ [%p] changed %i\n", obj, obj->changed);
|
||||||
if (obj->changed)
|
if (obj->changed)
|
||||||
{
|
{
|
||||||
|
/* Flag need redraw on proxy too */
|
||||||
evas_object_clip_recalc(obj);
|
evas_object_clip_recalc(obj);
|
||||||
obj->func->render_pre(obj);
|
obj->func->render_pre(obj);
|
||||||
|
if (obj->proxy.proxies)
|
||||||
|
{
|
||||||
|
obj->proxy.redraw = 1;
|
||||||
|
EINA_LIST_FOREACH(obj->proxy.proxies, l, proxy)
|
||||||
|
proxy->func->render_pre(proxy);
|
||||||
|
}
|
||||||
if (obj->pre_render_done)
|
if (obj->pre_render_done)
|
||||||
{
|
{
|
||||||
RD(" pre-render-done smart:%p|%p [%p, %i] | [%p, %i] has_map:%i had_map:%i\n",
|
RD(" pre-render-done smart:%p|%p [%p, %i] | [%p, %i] has_map:%i had_map:%i\n",
|
||||||
|
|
|
@ -444,6 +444,8 @@ struct _Evas_Object
|
||||||
struct {
|
struct {
|
||||||
Eina_List *proxies;
|
Eina_List *proxies;
|
||||||
void *surface;
|
void *surface;
|
||||||
|
int w,h;
|
||||||
|
Eina_Bool redraw;
|
||||||
} proxy;
|
} proxy;
|
||||||
|
|
||||||
Evas_Size_Hints *size_hints;
|
Evas_Size_Hints *size_hints;
|
||||||
|
|
Loading…
Reference in New Issue