}
static void
-_source_viewport_destination_update(E_Video_Viewport_Source *source)
+_source_destination_update(E_Video_Viewport_Source *source)
{
E_Video_Viewport *viewport = source->viewport;
Eina_Rectangle dest_rect = {0, 0, -1, -1};
}
static void
-_source_viewport_transform_update(E_Video_Viewport_Source *source)
+_source_viewport_update(E_Video_Viewport_Source *source)
+{
+ E_Client *ec = e_surface_ec_get(source->surface->surface);
+ E_Comp_Wl_Buffer_Viewport *vp;
+ E_Comp_Wl_Client_Data *cdata;
+ int x1, y1, x2, y2, x, y;
+
+ e_view_client_map_update(e_client_view_get(ec));
+
+ e_comp_wl_subsurface_data_coord_get(&source->base, &x, &y);
+ e_view_position_set(e_view_client_view_get(e_client_view_get(ec)), x, y);
+
+ cdata = ec->comp_data;
+ if (!cdata->viewport_transform)
+ {
+ cdata->viewport_transform = e_util_transform_new();
+ e_util_transform_role_set(cdata->viewport_transform, "viewport_transform");
+ e_client_transform_core_add(ec, cdata->viewport_transform);
+ }
+
+ e_util_transform_viewport_set(cdata->viewport_transform, x, y,
+ ec->comp_data->width_from_viewport,
+ ec->comp_data->height_from_viewport);
+
+ vp = &cdata->scaler.buffer_viewport;
+ if (vp->buffer.src_width == wl_fixed_from_int(-1))
+ {
+ x1 = 0;
+ y1 = 0;
+ x2 = cdata->width_from_buffer;
+ y2 = cdata->height_from_buffer;
+ }
+ else
+ {
+ x1 = wl_fixed_to_int(vp->buffer.src_x);
+ y1 = wl_fixed_to_int(vp->buffer.src_y);
+ x2 = wl_fixed_to_int(vp->buffer.src_x + vp->buffer.src_width);
+ y2 = wl_fixed_to_int(vp->buffer.src_y + vp->buffer.src_height);
+ }
+
+ e_util_transform_texcoord_set(cdata->viewport_transform, 0, x1, y1);
+ e_util_transform_texcoord_set(cdata->viewport_transform, 1, x2, y1);
+ e_util_transform_texcoord_set(cdata->viewport_transform, 2, x2, y2);
+ e_util_transform_texcoord_set(cdata->viewport_transform, 3, x1, y2);
+
+ VS_INF("SOURCE %p| Update viewport: source(%d,%d %dx%d) destination(%d,%d %dx%d)",
+ source, x1, y1, (x2 - x1), (y2 - y1),
+ ec->x, ec->y, ec->comp_data->width_from_viewport, ec->comp_data->height_from_viewport);
+}
+
+static void
+_source_rotation_update(E_Video_Viewport_Source *source)
{
E_Video_Viewport *viewport = source->viewport;
E_Client *ec = e_surface_ec_get(source->surface->surface);
e_client_transform_core_remove(ec, source->transform);
e_util_transform_del(source->transform);
source->transform = NULL;
- goto end;
}
return;
}
assert(0);
}
-end:
- e_client_transform_core_update(ec);
+ VS_INF("SOURCE %p| Update rotation: %s", source, _viewport_transform_to_str(viewport->current.transform));
}
static void
-_source_viewport_apply(E_Video_Viewport_Source *source)
+_source_transform_update(E_Video_Viewport_Source *source)
{
E_Client *ec = e_surface_ec_get(source->surface->surface);
- E_Comp_Wl_Buffer_Viewport *vp;
- E_Comp_Wl_Client_Data *cdata;
- int x1, y1, x2, y2, x, y;
+ E_Desk *desk;
Eina_Bool zoom_animating = EINA_FALSE;
e_comp_wl_map_size_cal_from_viewport(ec);
- // FIXME: This code is copied from e_comp_wl_map_apply()
- e_view_client_map_update(e_client_view_get(ec));
-
- e_comp_wl_subsurface_data_coord_get(&source->base, &x, &y);
- e_view_position_set(e_view_client_view_get(e_client_view_get(ec)), x, y);
-
- cdata = ec->comp_data;
- if (!cdata->viewport_transform)
- {
- cdata->viewport_transform = e_util_transform_new();
- e_util_transform_role_set(cdata->viewport_transform, "viewport_transform");
- e_client_transform_core_add(ec, cdata->viewport_transform);
- }
-
- e_util_transform_viewport_set(cdata->viewport_transform, x, y,
- ec->comp_data->width_from_viewport,
- ec->comp_data->height_from_viewport);
+ _source_viewport_update(source);
+ _source_rotation_update(source);
- vp = &cdata->scaler.buffer_viewport;
- if (vp->buffer.src_width == wl_fixed_from_int(-1))
- {
- x1 = 0;
- y1 = 0;
- x2 = cdata->width_from_buffer;
- y2 = cdata->height_from_buffer;
- }
- else
- {
- x1 = wl_fixed_to_int(vp->buffer.src_x);
- y1 = wl_fixed_to_int(vp->buffer.src_y);
- x2 = wl_fixed_to_int(vp->buffer.src_x + vp->buffer.src_width);
- y2 = wl_fixed_to_int(vp->buffer.src_y + vp->buffer.src_height);
- }
-
- e_util_transform_texcoord_set(cdata->viewport_transform, 0, x1, y1);
- e_util_transform_texcoord_set(cdata->viewport_transform, 1, x2, y1);
- e_util_transform_texcoord_set(cdata->viewport_transform, 2, x2, y2);
- e_util_transform_texcoord_set(cdata->viewport_transform, 3, x1, y2);
-
- E_Desk *desk;
desk = e_comp_desk_find_by_ec(ec);
if (desk)
zoom_animating = e_desk_zoom_is_animating(desk);
- ELOGF("TRANSFORM", "viewport map: point(%d,%d %dx%d) uv(%d,%d %d,%d %d,%d %d,%d), zoom_animating: %d",
- ec, ec->x, ec->y, ec->comp_data->width_from_viewport,
- ec->comp_data->height_from_viewport, x1, y1, x2, y1, x2, y2, x1, y2, zoom_animating);
-
/* workaround:: when the desk zoom is doing their animation,
the transform core update can override animation's zoom boundary.
so, don't doing transform core update while desk zoom animation */
_source_cb_surface_commit(struct wl_listener *listener, void *data)
{
E_Video_Viewport_Source *source = wl_container_of(listener, source, surface_commit);
- Eina_Bool need_apply = EINA_FALSE;
source->current = source->pending;
source->pending.committed = E_VIDEO_VIEWPORT_SOURCE_STATE_CLEAN;
_source_map_state_update(source);
if (source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_SOURCE_REGION)
- {
- _source_viewport_source_box_update(source);
- need_apply = EINA_TRUE;
- }
+ _source_viewport_source_box_update(source);
if (source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO)
- {
- _source_viewport_destination_update(source);
- need_apply = EINA_TRUE;
- }
+ _source_destination_update(source);
- if (need_apply)
- {
- _source_viewport_apply(source);
- _source_viewport_transform_update(source);
- }
+ if ((source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_SOURCE_REGION) ||
+ (source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO))
+ _source_transform_update(source);
}
static const char *
if (source->surface->stand_alone)
source->base.stand_alone = EINA_TRUE;
- _source_viewport_destination_update(source);
- _source_viewport_apply(source);
- _source_viewport_transform_update(source);
+ _source_destination_update(source);
+ _source_transform_update(source);
return EINA_TRUE;
}
_source_viewport_committed(E_Video_Viewport_Source *source)
{
E_Video_Viewport_State *state = &source->viewport->current;
- Eina_Bool need_transform = EINA_FALSE;
VS_DBG("SOURCE %p| viewport committed", source);
if (state->committed & E_VIDEO_VIEWPORT_STATE_DESTINATION ||
state->committed & E_VIDEO_VIEWPORT_STATE_TRANSFORM)
{
- _source_viewport_destination_update(source);
- _source_viewport_apply(source);
- need_transform = EINA_TRUE;
- }
-
- if (need_transform || (state->committed & E_VIDEO_VIEWPORT_STATE_TRANSFORM))
- {
- _source_viewport_transform_update(source);
+ _source_destination_update(source);
+ _source_transform_update(source);
}
}
return wtz_transform;
}
+static void
+_viewport_state_transform_set(E_Video_Viewport *viewport, enum wtz_video_exported_viewport_transform transform)
+{
+ if (viewport->current.transform == transform)
+ return;
+
+ viewport->current.transform = transform;
+ viewport->current.committed |= E_VIDEO_VIEWPORT_STATE_TRANSFORM;
+
+ if (!(viewport->pending.committed & E_VIDEO_VIEWPORT_STATE_TRANSFORM))
+ viewport->pending.transform = transform;
+}
+
+static void
+_viewport_state_geometry_set(E_Video_Viewport *viewport, int x, int y, int width, int height)
+{
+ int sx, sy;
+
+ e_subsurface_position_get(viewport->subsurface, &sx, &sy);
+ if (sx == x && sy == y && viewport->current.width == width && viewport->current.height == height)
+ return;
+
+ e_subsurface_position_set(viewport->subsurface, x, y);
+
+ viewport->current.width = width;
+ viewport->current.height = height;
+ viewport->current.committed |= E_VIDEO_VIEWPORT_STATE_DESTINATION;
+
+ if (!(viewport->pending.committed & E_VIDEO_VIEWPORT_STATE_DESTINATION))
+ {
+ viewport->pending.width = width;
+ viewport->pending.height = height;
+ }
+}
+
+static void
+_source_state_aspect_ratio_set(E_Video_Viewport_Source *source, int width, int height)
+{
+ if (width == -1 && height == -1)
+ source->current.has_aspect_ratio = EINA_FALSE;
+ else if (width > 0 && height > 0)
+ source->current.has_aspect_ratio = EINA_TRUE;
+ else
+ return;
+
+ source->current.aspect_ratio.width = width;
+ source->current.aspect_ratio.height = height;
+ source->current.committed = E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO;
+
+ if (!(source->pending.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO))
+ {
+ source->pending.aspect_ratio.width = width;
+ source->pending.aspect_ratio.height = height;
+ }
+}
+
EINTERN void
e_video_shell_viewport_transform(const char *handle, E_Video_Shell_Transform transform, int x, int y, int width, int height, int ratio_width, int ratio_height)
{
E_Video_Shell *shell;
E_Video_Viewport *viewport;
- enum wtz_video_exported_viewport_transform wtz_transform;
wl_list_for_each(shell, &shells, link)
{
if (!viewport)
continue;
- if (viewport->source && ratio_width != -2 && ratio_height != -2)
- {
- if ((ratio_width == -1 && ratio_height == -1) ||
- (ratio_width > 0 && ratio_height > 0))
- {
- if (ratio_width == -1 && ratio_height == -1)
- {
- viewport->source->pending.has_aspect_ratio = EINA_FALSE;
- }
- else
- {
- viewport->source->pending.has_aspect_ratio = EINA_TRUE;
- viewport->source->pending.aspect_ratio.width = ratio_width;
- viewport->source->pending.aspect_ratio.height = ratio_height;
- }
- viewport->source->pending.committed |= E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO;
-
- viewport->source->current = viewport->source->pending;
- viewport->source->pending.committed = E_VIDEO_VIEWPORT_SOURCE_STATE_CLEAN;
-
- _source_viewport_destination_update(viewport->source);
- _source_viewport_apply(viewport->source);
- _source_viewport_transform_update(viewport->source);
- }
- }
+ viewport->current.committed = E_VIDEO_VIEWPORT_STATE_CLEAN;
- wtz_transform = _e_video_shell_transform_to_wtz(transform);
- if (viewport->pending.transform != wtz_transform)
- {
- viewport->pending.committed |= E_VIDEO_VIEWPORT_STATE_TRANSFORM;
- viewport->pending.transform = _e_video_shell_transform_to_wtz(transform);
- }
+ _viewport_state_transform_set(viewport, _e_video_shell_transform_to_wtz(transform));
if (width != -1 && height != -1)
+ _viewport_state_geometry_set(viewport, x, y, width, height);
+
+ if (viewport->source && ratio_width != -2 && ratio_height != -2)
+ _source_state_aspect_ratio_set(viewport->source, ratio_width, ratio_height);
+
+ if (viewport->current.committed != E_VIDEO_VIEWPORT_STATE_CLEAN)
{
- e_subsurface_position_set(viewport->subsurface, x, y);
+ if (viewport->current.committed & E_VIDEO_VIEWPORT_STATE_DESTINATION)
+ _viewport_border_geometry_update(viewport);
- viewport->pending.committed |= E_VIDEO_VIEWPORT_STATE_DESTINATION;
- viewport->pending.width = width;
- viewport->pending.height = height;
+ if (viewport->source)
+ _source_viewport_committed(viewport->source);
+ }
+ else if (viewport->source && viewport->source->current.committed != E_VIDEO_VIEWPORT_SOURCE_STATE_CLEAN)
+ {
+ if (viewport->source->current.committed & E_VIDEO_VIEWPORT_SOURCE_STATE_ASPECT_RATIO)
+ _source_destination_update(viewport->source);
+ _source_transform_update(viewport->source);
}
-
- if (viewport->pending.committed != E_VIDEO_VIEWPORT_STATE_CLEAN)
- _viewport_state_commit(viewport, &viewport->pending);
break;
}