e_comp_wl: Deprecate viewport_transform 93/325393/1
authorSeunghun Lee <shiin.lee@samsung.com>
Thu, 22 May 2025 03:18:44 +0000 (12:18 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 10 Jun 2025 02:33:43 +0000 (11:33 +0900)
This patch deprecates viewport_transform and moves its implementation
into surface_view.

Change-Id: I3cd74369a71ad5d269f4f14a7ddd796848bf7ac6

src/bin/server/e_comp_wl.c
src/bin/server/e_compositor.c
src/bin/server/e_surface_view.c
src/bin/server/e_surface_view_intern.h
src/include/e_comp_wl.h

index 9261da4413709b3db73e3b8db0152d9cae4c4939..3f33434cdff8f2bdbb3561915a48fe0492d26e2e 100644 (file)
@@ -35,7 +35,6 @@
 #include "e_client_video_intern.h"
 #include "e_comp_wl_video_intern.h"
 #include "e_comp_object_intern.h"
-#include "e_desk_intern.h"
 #include "e_zone_intern.h"
 #include "e_hints_intern.h"
 #include "e_comp_input_intern.h"
@@ -484,103 +483,13 @@ e_comp_wl_topmost_parent_get(E_Client *ec)
 E_API void
 e_comp_wl_map_apply(E_Client *ec)
 {
-   E_Comp_Wl_Buffer_Viewport *vp;
-   E_Comp_Wl_Subsurf_Data *sdata;
-   E_Comp_Wl_Client_Data *cdata;
-   int x1, y1, x2, y2, x, y;
-   int dx = 0, dy = 0;
-   Eina_Bool zoom_animating = EINA_FALSE;
-
-   if (!ec || !ec->comp_data || e_object_is_del(E_OBJECT(ec))) return;
-
-   e_view_client_map_update(e_client_view_get(ec));
+   E_Surface_View *view;
 
-   cdata = ec->comp_data;
-   vp = &cdata->scaler.buffer_viewport;
-   if ((vp->buffer.src_width == wl_fixed_from_int(-1)) &&
-       (vp->surface.width == -1) &&
-       (!cdata->viewport_transform))
+   view = e_surface_view_try_from_ec(ec);
+   if (!view)
      return;
 
-   sdata = e_client_subsurface_data_try_get(ec);
-   if (sdata)
-     {
-        e_comp_wl_subsurface_data_coord_get(sdata, &dx, &dy);
-
-        if (sdata->remote_surface.offscreen_parent)
-          {
-             E_Client *offscreen_parent = sdata->remote_surface.offscreen_parent;
-             Eina_Rectangle *rect;
-             Eina_List *l;
-
-             EINA_LIST_FOREACH(offscreen_parent->comp_data->remote_surface.regions, l, rect)
-               {
-                  /* TODO: If there are one more regions, it means that provider's offscreen
-                   * is displayed by one more remote_surfaces. Have to consider it later. At
-                   * this time, just consider only one remote_surface.
-                   */
-                  dx += rect->x;
-                  dy += rect->y;
-                  break;
-               }
-          }
-     }
-   else
-     {
-        dx = ec->x;
-        dy = ec->y;
-     }
-
-   e_view_client_geometry_get(e_client_view_get(ec), &x, &y, NULL, NULL);
-   if (x != dx || y != dy)
-       e_view_position_set(e_view_client_view_get(e_client_view_get(ec)), dx, dy);
-
-   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, dx, dy,
-                                 ec->comp_data->width_from_viewport,
-                                 ec->comp_data->height_from_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 */
-   if (!zoom_animating)
-     e_client_transform_core_update(ec);
-
+   e_surface_view_viewport_apply(view);
 }
 
 EINTERN void
@@ -679,14 +588,16 @@ static void
 _e_comp_wl_subsurface_client_reposition(E_Client *subc)
 {
    E_View_Client *view_client;
+   E_Surface_View *surface_view;
    int x, y;
 
    e_comp_wl_subsurface_data_coord_get(subc->comp_data->sub.data, &x, &y);
    view_client = e_client_view_get(subc);
    e_view_position_set(e_view_client_view_get(view_client), x, y);
 
-   if (subc->comp_data->viewport_transform)
-     e_comp_wl_map_apply(subc);
+   surface_view = e_surface_view_try_from_ec(subc);
+   if (e_surface_view_viewport_transform_try_get(surface_view))
+     e_surface_view_viewport_apply(surface_view);
    else
      e_client_transform_core_update(subc);
 }
@@ -4377,10 +4288,15 @@ e_comp_wl_scaler_viewport_resource_set(E_Client *ec, struct wl_resource *resourc
 E_API E_Util_Transform *
 e_comp_wl_viewport_transform_get(E_Client *ec)
 {
+   E_Surface_View *surface_view;
+
    if (!ec) return NULL;
-   if (!ec->comp_data) return NULL;
 
-   return ec->comp_data->viewport_transform;
+   surface_view = e_surface_view_try_from_ec(ec);
+   if (!surface_view)
+     return NULL;
+
+   return e_surface_view_viewport_transform_try_get(surface_view);
 }
 
 E_API int
index da6dd022473bd70270c594668b1a44f081086d7e..5ba3d494665304e56df295de04033c80e7263619 100644 (file)
@@ -1090,13 +1090,6 @@ e_surface_destroy(E_Surface *surface)
 
    e_comp_wl_data_secondary_remove(surface->ec);
 
-   if (surface->base.viewport_transform)
-     {
-        e_client_transform_core_remove(surface->ec, surface->base.viewport_transform);
-        e_util_transform_del(surface->base.viewport_transform);
-        surface->base.viewport_transform = NULL;
-     }
-
    surface->ec->comp_data = NULL;
 
    _e_surface_base_finish(&surface->base);
index d61559663f6615b8522cb4a5b8969b1975f47646..cf52710b2a605e5952ff2b29e4c71c5c74f7660f 100644 (file)
@@ -8,6 +8,7 @@
 #include "e_compositor_private.h"
 #include "e_surface_view_intern.h"
 #include "e_view_client_intern.h"
+#include "e_desk_intern.h"
 
 #include <stdlib.h>
 #include <wayland-util.h>
@@ -33,6 +34,7 @@ struct _E_Surface_View
 {
    E_Surface *surface;
    E_Client *ec;
+   E_Util_Transform *transform;
 
    struct wl_listener ec_destroy;
    struct wl_listener viewport_commit;
@@ -55,6 +57,12 @@ _surface_view_destroy(E_Surface_View *view)
 
    e_comp_wl_hook_call(E_COMP_WL_HOOK_DEL, view->ec);
 
+   if (view->transform)
+     {
+        e_client_transform_core_remove(view->ec, view->transform);
+        e_util_transform_del(view->transform);
+     }
+
    e_comp_wl_client_evas_deinit(view->ec);
 
    _surface_view_surface_unlink(view);
@@ -68,7 +76,7 @@ _surface_view_cb_viewport_commit(struct wl_listener *listener, void *data)
 {
    E_Surface_View *view = wl_container_of(listener, view, viewport_commit);
 
-   e_comp_wl_map_apply(view->ec);
+   e_surface_view_viewport_apply(view);
 }
 
 static Eina_Bool
@@ -390,3 +398,121 @@ e_surface_view_module_init(struct wl_display *display)
 
    return EINA_TRUE;
 }
+
+EINTERN E_Surface_View *
+e_surface_view_try_from_ec(E_Client *ec)
+{
+   E_Surface_View *view;
+   struct wl_listener *listener;
+
+   listener = e_client_destroy_listener_get(ec, _surface_view_cb_ec_destroy);
+   if (!listener)
+     return NULL;
+
+   return wl_container_of(listener, view, ec_destroy);
+}
+
+EINTERN void
+e_surface_view_viewport_apply(E_Surface_View *view)
+{
+   E_Client *ec = view->ec;
+   E_Comp_Wl_Buffer_Viewport *vp;
+   E_Comp_Wl_Subsurf_Data *sdata;
+   E_Comp_Wl_Client_Data *cdata;
+   int x1, y1, x2, y2, x, y;
+   int dx = 0, dy = 0;
+   Eina_Bool zoom_animating = EINA_FALSE;
+
+   e_view_client_map_update(e_client_view_get(ec));
+
+   cdata = ec->comp_data;
+   vp = &cdata->scaler.buffer_viewport;
+   if ((vp->buffer.src_width == wl_fixed_from_int(-1)) &&
+       (vp->surface.width == -1) &&
+       (!view->transform))
+     return;
+
+   sdata = e_client_subsurface_data_try_get(ec);
+   if (sdata)
+     {
+        e_comp_wl_subsurface_data_coord_get(sdata, &dx, &dy);
+
+        if (sdata->remote_surface.offscreen_parent)
+          {
+             E_Client *offscreen_parent = sdata->remote_surface.offscreen_parent;
+             Eina_Rectangle *rect;
+
+             /* TODO: If there are one more regions, it means that provider's offscreen
+              * is displayed by one more remote_surfaces. Have to consider it later. At
+              * this time, just consider only one remote_surface.
+              */
+             rect = eina_list_nth(offscreen_parent->comp_data->remote_surface.regions, 0);
+             if (rect)
+               {
+                  dx += rect->x;
+                  dy += rect->y;
+               }
+          }
+     }
+   else
+     {
+        dx = ec->x;
+        dy = ec->y;
+     }
+
+   e_view_client_geometry_get(e_client_view_get(ec), &x, &y, NULL, NULL);
+   if (x != dx || y != dy)
+       e_view_position_set(e_view_client_view_get(e_client_view_get(ec)), dx, dy);
+
+   if (!view->transform)
+     {
+        view->transform = e_util_transform_new();
+        e_util_transform_role_set(view->transform, "viewport_transform");
+        e_client_transform_core_add(ec, view->transform);
+     }
+
+   e_util_transform_viewport_set(view->transform, dx, dy,
+                                 ec->comp_data->width_from_viewport,
+                                 ec->comp_data->height_from_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(view->transform, 0, x1, y1);
+   e_util_transform_texcoord_set(view->transform, 1, x2, y1);
+   e_util_transform_texcoord_set(view->transform, 2, x2, y2);
+   e_util_transform_texcoord_set(view->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);
+
+   ESV_INF("Apply viewport: 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 */
+   if (!zoom_animating)
+     e_client_transform_core_update(ec);
+}
+
+EINTERN E_Util_Transform *
+e_surface_view_viewport_transform_try_get(E_Surface_View *view)
+{
+   return view->transform;
+}
index e317138ebb557a53e2b95ba23ef77fa02c6b2134..0d832ad6b79b77535e4a88c9f4195cd23b9b2d1c 100644 (file)
@@ -7,4 +7,8 @@ typedef struct _E_Surface_View E_Surface_View;
 
 Eina_Bool e_surface_view_module_init(struct wl_display *display);
 
+E_Surface_View *e_surface_view_try_from_ec(E_Client *ec);
+void e_surface_view_viewport_apply(E_Surface_View *view);
+E_Util_Transform *e_surface_view_viewport_transform_try_get(E_Surface_View *view);
+
 #endif
index ebfad97304f1b868296e6fff61afdbecc2a9afd1..424af56cc77baf8ff80559cdf6cd27b0a896d2d2 100644 (file)
@@ -494,7 +494,7 @@ struct _E_Comp_Wl_Client_Data
    E_Devicemgr_Input_Device *last_device_touch;
    E_Devicemgr_Input_Device *last_device_kbd;
 
-   E_Util_Transform *viewport_transform;
+   E_DEPRECATED E_Util_Transform *viewport_transform;
 
    struct
      {
@@ -604,7 +604,7 @@ E_API void     e_comp_wl_scaler_buffer_viewport_surface_width_set(E_Client *ec,
 E_DEPRECATED E_API struct wl_resource *e_comp_wl_scaler_viewport_resource_get(E_Client *ec);
 E_DEPRECATED E_API void                e_comp_wl_scaler_viewport_resource_set(E_Client *ec, struct wl_resource *resource);
 
-E_API E_Util_Transform *e_comp_wl_viewport_transform_get(E_Client *ec);
+E_DEPRECATED E_API E_Util_Transform *e_comp_wl_viewport_transform_get(E_Client *ec); // Use e_surface_view_viewport_transform_try_get
 E_API int               e_comp_wl_viewport_width_get(E_Client *ec);
 E_API int               e_comp_wl_viewport_height_get(E_Client *ec);
 E_API struct wl_signal *e_comp_wl_viewport_apply_signal_get(E_Client *ec);