unsigned int bg_animating;
} E_Effect_Client;
-typedef struct
-{
- tdm_layer *tlayer;
- int zpos;
-} Under_Layer;
-
-static int
-_eff_object_underlayer_sort(const void *data1, const void *data2)
-{
- const Under_Layer *layer1, *layer2;
-
- layer1 = data1;
- layer2 = data2;
-
- if (layer1->zpos < layer2->zpos)
- return -1;
- else if (layer1->zpos > layer2->zpos)
- return 1;
- else
- return 0;
-}
-
-static Evas_Object *
-_eff_object_underlayer_get(E_Client *ec)
-{
- Evas_Object *underlay = NULL;
- E_Comp_Screen *e_comp_screen;
- Eina_List *l;
- Under_Layer *ulayer;
- E_Zone *zone;
-
- e_comp_screen = e_comp->e_comp_screen;
- if (!e_comp_screen)
- return NULL;
-
- zone = e_comp_zone_find_by_ec(ec);
- if (!zone) return NULL;
-
- if (e_client_video_client_has(ec))
- {
- if ((!_eff->under_layers) && (!_eff->under_checked))
- {
- tdm_layer_capability capabilities;
- E_Output *eoutput;
- E_Plane *plane;
- const Eina_List *planes, *l;
-
- eoutput = e_output_find(zone->output_id);
- if (eoutput) return NULL;
-
- planes = e_output_planes_get(eoutput);
- if (!planes) return NULL;
-
- /* Find a plane which is placed under primary and used for video.
- * planes is supposed to be sorted by zpos (lower -> higher) */
- EINA_LIST_FOREACH(planes, l, plane)
- {
- if (e_plane_is_primary(plane))
- break;
-
- if (!plane->is_video)
- continue;
-
- tdm_layer_get_capabilities(plane->tlayer, &capabilities);
- if (!(capabilities & TDM_LAYER_CAPABILITY_GRAPHIC)) continue;
-
- ulayer = E_NEW(Under_Layer, 1);
- if (!ulayer) continue;
- ulayer->zpos = plane->zpos;
- ulayer->tlayer = plane->tlayer;
-
- _eff->under_layers = eina_list_append(_eff->under_layers,
- ulayer);
- }
-
- _eff->under_checked = EINA_TRUE;
-
- if (!_eff->under_layers)
- return NULL;
-
- _eff->under_layers = eina_list_sort(_eff->under_layers,
- eina_list_count(_eff->under_layers),
- _eff_object_underlayer_sort);
- }
-
- if (!_eff->under_layers) return NULL;
-
- EINA_LIST_FOREACH(_eff->under_layers, l, ulayer)
- {
- tdm_layer *layer;
- Evas_Object *img;
- tbm_surface_h buffer;
- Evas_Native_Surface ns;
- tdm_info_layer info;
- tdm_error err = TDM_ERROR_NONE;
-
- layer = ulayer->tlayer;
-
- buffer = tdm_layer_get_displaying_buffer(layer, NULL);
- if (!buffer) continue;
-
- err = tdm_layer_get_info(layer, &info);
- if (err != TDM_ERROR_NONE) continue;
-
- if (info.dst_pos.w <= 0 || info.dst_pos.h <= 0)
- continue;
-
- img = evas_object_image_filled_add(e_comp->evas);
- if (!img) continue;
-
- memset(&ns, 0, sizeof(Evas_Native_Surface));
- ns.version = EVAS_NATIVE_SURFACE_VERSION;
- ns.type = EVAS_NATIVE_SURFACE_TBM;
- ns.data.tbm.buffer = buffer;
-
- evas_object_image_size_set(img, info.dst_pos.w, info.dst_pos.h);
- evas_object_image_native_surface_set(img, &ns);
- evas_object_image_pixels_dirty_set(img, EINA_TRUE);
-
- if (!underlay)
- {
- Evas_Object *bg;
-
- underlay = e_layout_add(e_comp->evas);
- if (!underlay)
- {
- evas_object_del(img);
- return NULL;
- }
-
- evas_object_name_set(underlay, "effect-under-layout");
- e_layout_virtual_size_set(underlay, zone->w, zone->h);
- evas_object_move(underlay, zone->x, zone->y);
-
- bg = evas_object_rectangle_add(e_comp->evas);
- evas_object_color_set(bg, 0, 0, 0, 255);
- e_layout_pack(underlay, bg);
- e_layout_child_move(bg, 0, 0);
- e_layout_child_resize(bg, zone->w, zone->h);
- evas_object_show(bg);
- }
-
- e_layout_pack(underlay, img);
- e_layout_child_move(img, info.dst_pos.x, info.dst_pos.y);
- e_layout_child_resize(img, info.dst_pos.w, info.dst_pos.h);
- e_layout_child_raise(img);
- evas_object_show(img);
-
- EFFDBG("Video Object Created img(%p) %d,%d %dx%d underlay(%p)",
- ec,
- img, info.dst_pos.x, info.dst_pos.y, info.dst_pos.w, info.dst_pos.h,
- underlay);
- }
- }
-
- return underlay;
-}
-
static void
_eff_event_send(E_Client *ec, Eina_Bool start, E_Effect_Type type)
{
efc->under_ref = 0;
}
-static void
-_eff_object_under_setup(E_Client *ec)
-{
- E_Effect_Client *efc = NULL;
- Evas_Object *underlay = NULL;
-
- efc = _eff_client_get(ec);
- if (!efc) return;
-
- if (efc->under)
- {
- efc->under_ref ++;
- }
- else if ((underlay = _eff_object_underlayer_get(ec)))
- {
- Eina_List *children;
- Evas_Object *child;
-
- if (e_comp_object_effect_object_part_swallow(ec->frame, "under", underlay))
- {
- evas_object_event_callback_add(underlay,
- EVAS_CALLBACK_DEL,
- _eff_object_under_cb_del,
- efc);
- evas_object_show(underlay);
- efc->under = underlay;
- efc->under_ref ++;
- }
- else
- {
- children = e_layout_children_get(underlay);
- EINA_LIST_FREE(children, child)
- {
- e_layout_unpack(child);
- evas_object_del(child);
- }
-
- evas_object_del(underlay);
- }
- }
-}
-
static void
_eff_object_under_del(E_Client *ec)
{
ec->extra_animating = EINA_TRUE;
_eff_object_setup(ec, group);
- _eff_object_under_setup(ec);
ang = _eff_group_angle_get(ec, group);
e_view_client_effect_params_set(e_client_view_get(ec), 0, (int[]){0, ang}, 2);
_eff_object_layer_up(ec);
_eff_object_setup(ec, group);
- _eff_object_under_setup(ec);
ang = _eff_group_angle_get(ec, group);
e_view_client_effect_params_set(e_client_view_get(ec), 0, (int[]){1, ang}, 2);
}
_eff_object_setup(ec, group);
- _eff_object_under_setup(ec);
ang = _eff_group_angle_get(ec, group);
e_view_client_effect_params_set(e_client_view_get(ec), 0, (int[]){0, ang}, 2);
}
_eff_object_setup(ec, group);
- _eff_object_under_setup(ec);
ang = _eff_group_angle_get(ec, group);
e_view_client_effect_params_set(e_client_view_get(ec), 0, (int[]){1, ang}, 2);
ec->extra_animating = EINA_TRUE;
_eff_object_setup(ec, group);
- _eff_object_under_setup(ec);
ang = _eff_group_angle_get(ec, group);
e_view_client_effect_params_set(e_client_view_get(ec), 0, (int[]){2, ang}, 2);
_eff_object_layer_up(ec);
_eff_object_setup(ec, group);
- _eff_object_under_setup(ec);
ang = _eff_group_angle_get(ec, group);
e_view_client_effect_params_set(e_client_view_get(ec), 0, (int[]){3, ang}, 2);
}
_eff_object_setup(ec, group);
- _eff_object_under_setup(ec);
ang = _eff_group_angle_get(ec, group);
e_view_client_effect_params_set(e_client_view_get(ec), 0, (int[]){4, ang}, 2);