}
void
-_evas_object_image_plane_release(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj)
+_evas_object_image_plane_release(Evas_Object *eo_obj EINA_UNUSED,
+ Evas_Object_Protected_Data *obj,
+ Efl_Canvas_Output *output)
{
Evas_Image_Data *o;
if (!o->plane) return;
- ENFN->image_plane_release(ENDT, o->engine_data, o->plane);
+ ENFN->image_plane_release(output->output, o->engine_data, o->plane);
+ output->planes = eina_list_remove(output->planes, obj);
o->plane = NULL;
}
Eina_Bool
-_evas_object_image_can_use_plane(Evas_Object_Protected_Data *obj)
+_evas_object_image_can_use_plane(Evas_Object_Protected_Data *obj,
+ Efl_Canvas_Output *output)
{
Evas_Native_Surface *ns;
Evas_Image_Data *o = obj->private_data;
ns = ENFN->image_native_get(ENC, o->engine_data);
if (!ns) return EINA_FALSE;
- o->plane = ENFN->image_plane_assign(ENDT, o->engine_data,
+ // FIXME: adjust position with output offset.
+ o->plane = ENFN->image_plane_assign(output->output, o->engine_data,
obj->cur->geometry.x,
obj->cur->geometry.y);
if (!o->plane)
return EINA_FALSE;
+ output->planes = eina_list_append(output->planes, obj);
return EINA_TRUE;
}
e = _efl_canvas_output_async_block(output);
if (!e) return ;
- output->x = x;
- output->y = y;
- output->w = w;
- output->h = h;
+ output->geometry.x = x;
+ output->geometry.y = y;
+ output->geometry.w = w;
+ output->geometry.h = h;
// XXX: tell engine about any output size etc. changes
// XXX: tell evas to add damage if viewport loc/size changed
}
efl_canvas_output_view_get(Efl_Canvas_Output *output,
Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
{
- if (x) *x = output->x;
- if (y) *y = output->y;
- if (w) *w = output->w;
- if (h) *h = output->h;
+ if (x) *x = output->geometry.x;
+ if (y) *y = output->geometry.y;
+ if (w) *w = output->geometry.w;
+ if (h) *h = output->geometry.h;
}
EAPI Eina_Bool
}
static Eina_Bool
-_evas_render_can_use_overlay(Evas_Public_Data *e, Evas_Object *eo_obj)
+_evas_render_can_use_overlay(Evas_Public_Data *e, Evas_Object *eo_obj, Efl_Canvas_Output *output)
{
Eina_Rectangle *r;
Evas_Object *eo_tmp;
Eina_Bool surface_below, stacking_check, object_above = EINA_FALSE;
Eina_Bool ignore_window;
- if (!_evas_object_image_can_use_plane(obj))
+ if (!_evas_object_image_can_use_plane(obj, output))
return EINA_FALSE;
video_parent = _evas_object_image_video_parent_get(eo_obj);
return clean_them;
}
+static Efl_Canvas_Output *
+_evas_overlay_output_find(Evas_Public_Data *e, Evas_Object_Protected_Data *obj)
+{
+ Efl_Canvas_Output *output;
+ Eina_List *lo;
+ const Eina_Rectangle geometry = {
+ obj->cur->geometry.x,
+ obj->cur->geometry.y,
+ obj->cur->geometry.w,
+ obj->cur->geometry.h
+ };
+ Eina_Rectangle copy = geometry;
+
+ /* A video object can only be in one output at a time, check that first */
+ EINA_LIST_FOREACH(e->outputs, lo, output)
+ {
+ if (!eina_rectangle_intersection(©, &output->geometry))
+ {
+ copy = geometry;
+ continue ;
+ }
+ if (memcmp(©, &geometry, sizeof (Eina_Rectangle)) != 0)
+ {
+ /* This means that it does intersect this output and another */
+ return NULL;
+ }
+
+ return output;
+ }
+
+ return NULL;
+}
+
static Eina_Bool
evas_render_updates_internal(Evas *eo_e,
unsigned char make_updates,
EINA_LIST_FOREACH(e->video_objects, ll, eo_obj)
{
+ Efl_Canvas_Output *output;
+ Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
+
+ output = _evas_overlay_output_find(e, obj);
+
/* we need the surface to be transparent to display the underlying overlay */
- if (alpha && _evas_render_can_use_overlay(e, eo_obj))
+ if (output && alpha && _evas_render_can_use_overlay(e, eo_obj, output))
_evas_object_image_video_overlay_show(eo_obj);
else
_evas_object_image_video_overlay_hide(eo_obj);
{
Evas_Object_Protected_Data *obj2;
Evas_Object *eo_obj2;
+ Efl_Canvas_Output *output;
+ Eina_List *lo;
obj2 = ao->obj;
eo_obj2 = obj2->object;
if (evas_object_image_video_surface_get(eo_obj2)) continue;
- _evas_object_image_plane_release(eo_obj2, obj2);
- if (!_evas_render_can_use_overlay(e, eo_obj2))
+ /* Find the output the object was in */
+ EINA_LIST_FOREACH(e->outputs, lo, output)
+ {
+ if (!eina_list_data_find(output->planes, obj2)) continue ;
+ _evas_object_image_plane_release(eo_obj2, obj2, output);
+ break;
+ }
+
+ /* A video object can only be in one output at a time, check that first */
+ output = _evas_overlay_output_find(e, obj2);
+ if (!output) continue ;
+
+ if (!_evas_render_can_use_overlay(e, eo_obj2, output))
{
/* This may free up things temporarily allocated by
* _can_use_overlay() testing in the engine */
- _evas_object_image_plane_release(eo_obj2, obj2);
+ _evas_object_image_plane_release(eo_obj2, obj2, output);
}
}
Evas_Engine_Info *info;
void *output;
- Evas_Coord x, y, w, h;
+
+ Eina_List *planes;
+
+ Eina_Rectangle geometry;
int info_magic;
};
void _evas_object_image_video_overlay_show(Evas_Object *obj);
void _evas_object_image_video_overlay_hide(Evas_Object *obj);
void _evas_object_image_video_overlay_do(Evas_Object *obj);
-Eina_Bool _evas_object_image_can_use_plane(Evas_Object_Protected_Data *obj);
-void _evas_object_image_plane_release(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj);
+Eina_Bool _evas_object_image_can_use_plane(Evas_Object_Protected_Data *obj, Efl_Canvas_Output *output);
+void _evas_object_image_plane_release(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj, Efl_Canvas_Output *output);
void _evas_object_image_free(Evas_Object *obj);
void evas_object_smart_bounding_box_get(Evas_Object_Protected_Data *obj,
Evas_Coord_Rectangle *cur_bounding_box,