surface: Add APIs for tizen_viewport 48/309148/1
authorSeunghun Lee <shiin.lee@samsung.com>
Thu, 18 Jan 2024 02:11:56 +0000 (11:11 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Fri, 5 Apr 2024 06:45:54 +0000 (15:45 +0900)
The main goals of this change are:

1. To decouple the viewport handling logic from the E_Client, which is
quite large and complex abstraction

2. To encapsulate all viewport-related data within the E_Surface module,
making it easier to manage and maintain.

Change-Id: Ice0f925551afda53fe0c046d04009468353090f9

src/bin/e_compositor.c
src/bin/e_compositor.h

index c9dc749..bf341dc 100644 (file)
@@ -87,6 +87,11 @@ static void _e_subsurface_cb_request_move(struct wl_listener *listener, void *da
 static void _e_subsurface_cb_surface_destroy(struct wl_listener *listener, void *data);
 static void _e_subsurface_cb_parent_surface_destroy(struct wl_listener *listener, void *data);
 
+static void _ds_surface_buffer_transform_set(struct ds_surface *ds_surface, enum wl_output_transform transform);
+static void _ds_surface_viewport_source_box_set(struct ds_surface *ds_surface, Eina_Rectangle *box);
+static void _ds_surface_viewport_destination_set(struct ds_surface *ds_surface, int32_t width, int32_t height);
+static void _ds_surface_viewport_unset(struct ds_surface *ds_surface);
+
 static const char *e_comp_wl_subsurface_role_name = "ds_subsurface";
 static E_Compositor *_compositor;
 
@@ -263,6 +268,143 @@ e_surface_parent_destroy_listener_add(E_Surface *surface, struct wl_listener *li
    wl_signal_add(&surface->events.parent_destroy, listener);
 }
 
+EINTERN struct wl_resource *
+e_surface_viewporter_resource_get(E_Surface *surface)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(surface, NULL);
+   return surface->base.scaler.viewport;
+}
+
+EINTERN void
+e_surface_viewporter_resource_set(E_Surface *surface, struct wl_resource *viewporter)
+{
+   EINA_SAFETY_ON_NULL_RETURN(surface);
+   surface->base.scaler.viewport = viewporter;
+}
+
+EINTERN void
+e_surface_viewporter_resource_unset(E_Surface *surface)
+{
+   EINA_SAFETY_ON_NULL_RETURN(surface);
+
+   surface->base.scaler.viewport = NULL;
+   surface->base.scaler.buffer_viewport.buffer.src_width = wl_fixed_from_int(-1);
+   surface->base.scaler.buffer_viewport.surface.width = -1;
+   surface->base.scaler.buffer_viewport.changed = 1;
+   surface->base.pending.buffer_viewport.buffer.src_width = wl_fixed_from_int(-1);
+   surface->base.pending.buffer_viewport.surface.width = -1;
+   surface->base.pending.buffer_viewport.changed = 1;
+
+   if (surface->ds_surface)
+     _ds_surface_viewport_unset(surface->ds_surface);
+}
+
+EINTERN enum wl_output_transform
+e_surface_buffer_transform_get(E_Surface *surface)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(surface, WL_OUTPUT_TRANSFORM_NORMAL);
+   return surface->base.scaler.buffer_viewport.buffer.transform;
+}
+
+EINTERN Eina_Bool
+e_surface_buffer_transform_set(E_Surface *surface, enum wl_output_transform transform)
+{
+   E_Subsurface *sub;
+   E_Comp_Wl_Buffer_Viewport *vp;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EINA_FALSE);
+
+   vp = &surface->base.scaler.buffer_viewport;
+   if (vp->buffer.transform == transform)
+     return EINA_FALSE;
+
+   vp->buffer.transform = transform;
+   vp->changed = EINA_TRUE;
+
+   surface->base.pending.buffer_viewport = *vp;
+
+   sub = _e_subsurface_from_surface(surface);
+   if (sub)
+     sub->base.cached.buffer_viewport = *vp;
+
+   if (surface->ds_surface)
+     _ds_surface_buffer_transform_set(surface->ds_surface, transform);
+
+   return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_surface_viewport_source_box_set(E_Surface *surface, Eina_Rectangle *box)
+{
+   E_Subsurface *sub;
+   E_Comp_Wl_Buffer_Viewport *vp;
+   wl_fixed_t fx, fy, fw, fh;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EINA_FALSE);
+
+   fx = wl_fixed_from_int(box->x);
+   fy = wl_fixed_from_int(box->y);
+   fw = wl_fixed_from_int(box->w);
+   fh = wl_fixed_from_int(box->h);
+
+   vp = &surface->base.scaler.buffer_viewport;
+   if ((vp->buffer.src_x == fx) && (vp->buffer.src_y == fy) &&
+       (vp->buffer.src_width == fw) && (vp->buffer.src_height == fh))
+     return EINA_FALSE;
+
+   vp->buffer.src_x = fx;
+   vp->buffer.src_y = fy;
+   vp->buffer.src_width = fw;
+   vp->buffer.src_height = fh;
+   vp->changed = EINA_TRUE;
+
+   surface->base.pending.buffer_viewport = *vp;
+
+   sub = _e_subsurface_from_surface(surface);
+   if (sub)
+     sub->base.cached.buffer_viewport = *vp;
+
+   if (surface->ds_surface)
+     _ds_surface_viewport_source_box_set(surface->ds_surface, box);
+
+   return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_surface_viewport_destination_set(E_Surface *surface, int32_t width, int32_t height)
+{
+   E_Subsurface *sub;
+   E_Comp_Wl_Buffer_Viewport *vp;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EINA_FALSE);
+
+   vp = &surface->base.scaler.buffer_viewport;
+   if ((vp->surface.width == width) && (vp->surface.height == height))
+     return EINA_FALSE;
+
+   vp->surface.width = width;
+   vp->surface.height = height;
+   vp->changed = EINA_TRUE;
+
+   surface->base.pending.buffer_viewport = *vp;
+
+   sub = _e_subsurface_from_surface(surface);
+   if (sub)
+     sub->base.cached.buffer_viewport = *vp;
+
+   if (surface->ds_surface)
+     _ds_surface_viewport_destination_set(surface->ds_surface, width, height);
+
+   return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_surface_viewport_changed_get(E_Surface *surface)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EINA_FALSE);
+   return surface->base.scaler.buffer_viewport.changed;
+}
+
 static void
 _e_compositor_cb_display_destroy(struct wl_listener *listener EINA_UNUSED, void *data EINA_UNUSED)
 {
@@ -1340,3 +1482,45 @@ _e_subsurface_cb_parent_surface_destroy(struct wl_listener *listener, void *data
    e_comp_wl_client_subsurface_parent_unset(sub->surface->ec);
 }
 
+static void
+_ds_surface_buffer_transform_set(struct ds_surface *ds_surface, enum wl_output_transform transform)
+{
+   ds_surface->pending.transform = transform;
+   ds_surface->current.transform = transform;
+}
+
+static void
+_ds_surface_viewport_source_box_set(struct ds_surface *ds_surface, Eina_Rectangle *box)
+{
+   ds_surface->pending.viewport.has_src = true;
+   ds_surface->pending.viewport.src.x = (double)box->x;
+   ds_surface->pending.viewport.src.y = (double)box->y;
+   ds_surface->pending.viewport.src.width = (double)box->w;
+   ds_surface->pending.viewport.src.height = (double)box->h;
+   ds_surface->current.viewport.has_src = true;
+   ds_surface->current.viewport.src = ds_surface->pending.viewport.src;
+}
+
+static void
+_ds_surface_viewport_destination_set(struct ds_surface *ds_surface, int32_t width, int32_t height)
+{
+   ds_surface->pending.viewport.has_dst = true;
+   ds_surface->pending.viewport.dst_width = width;
+   ds_surface->pending.viewport.dst_height = height;
+   ds_surface->pending.width = width;
+   ds_surface->pending.height = height;
+   ds_surface->current.viewport.has_dst = true;
+   ds_surface->current.viewport.dst_width = width;
+   ds_surface->current.viewport.dst_height = height;
+   ds_surface->current.width = width;
+   ds_surface->current.height = height;
+}
+
+static void
+_ds_surface_viewport_unset(struct ds_surface *ds_surface)
+{
+   ds_surface->pending.viewport.has_src = false;
+   ds_surface->pending.viewport.has_dst = false;
+   ds_surface->current.viewport.has_src = false;
+   ds_surface->current.viewport.has_dst = false;
+}
index dee1174..21dc398 100644 (file)
@@ -10,5 +10,13 @@ EINTERN E_Surface *e_surface_from_resource(struct wl_resource *surface_resource)
 EINTERN void e_surface_destroy_listener_add(E_Surface *surface, struct wl_listener *listener);
 EINTERN void e_surface_parent_destroy_listener_add(E_Surface *surface, struct wl_listener *listener);
 EINTERN struct wl_listener *e_surface_destroy_listener_get(E_Surface *surface, wl_notify_func_t notify);
+EINTERN struct wl_resource *e_surface_viewporter_resource_get(E_Surface *surface);
+EINTERN void e_surface_viewporter_resource_set(E_Surface *surface, struct wl_resource *viewporter);
+EINTERN void e_surface_viewporter_resource_unset(E_Surface *surface);
+EINTERN enum wl_output_transform e_surface_buffer_transform_get(E_Surface *surface);
+EINTERN Eina_Bool e_surface_buffer_transform_set(E_Surface *surface, enum wl_output_transform transform);
+EINTERN Eina_Bool e_surface_viewport_source_box_set(E_Surface *surface, Eina_Rectangle *box);
+EINTERN Eina_Bool e_surface_viewport_destination_set(E_Surface *surface, int32_t width, int32_t height);
+EINTERN Eina_Bool e_surface_viewport_changed_get(E_Surface *surface);
 
 #endif