viewport: Replace E_Client variables with E_Surface APIs 49/309149/1
authorSeunghun Lee <shiin.lee@samsung.com>
Thu, 18 Jan 2024 02:48:47 +0000 (11:48 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Fri, 5 Apr 2024 06:46:04 +0000 (15:46 +0900)
This patch changes the way viewport and transformation are handled.
Instead of directly modifying E_Client's variables, it now utilizes
E_Surface APIs to achieve the same functionality.

Change-Id: I213dcbde4d6e698719026e3df6eba23bec54fcdd

src/bin/e_comp_wl_viewport.c

index 9493480c52194e02d2ce0df0598ddef34a7655cc..ac9862093b00204367ff2d362e33f765117fd22f 100644 (file)
@@ -3,6 +3,7 @@
 #endif
 
 #include "e.h"
+#include "e_compositor.h"
 #include <wayland-server.h>
 #include <wayland-tbm-server.h>
 #include <scaler-server-protocol.h>
@@ -75,6 +76,7 @@ typedef struct _E_Viewport
    struct wl_resource *dst_mode_res;
 
    E_Client *ec;
+   E_Surface *surface;
    E_Client *epc;
    Ecore_Window window;
 
@@ -106,14 +108,10 @@ static void _e_comp_wl_viewport_parent_unset(E_Viewport *viewport);
 static void
 _destroy_viewport(E_Viewport *viewport)
 {
-   E_Client *ec;
-
    if (!viewport) return;
 
    PIN("destroy E_Viewport");
 
-   ec = viewport->ec;
-
    ecore_event_handler_del(viewport->topmost_rotate_hdl);
 
    _e_comp_wl_viewport_parent_unset(viewport);
@@ -133,16 +131,7 @@ _destroy_viewport(E_Viewport *viewport)
    if (viewport->dst_mode_res)
      wl_resource_set_user_data(viewport->dst_mode_res, NULL);
 
-   if (ec->comp_data && ec->comp_data->scaler.viewport)
-     {
-        ec->comp_data->scaler.viewport = NULL;
-        ec->comp_data->scaler.buffer_viewport.buffer.src_width = wl_fixed_from_int(-1);
-        ec->comp_data->scaler.buffer_viewport.surface.width = -1;
-        ec->comp_data->scaler.buffer_viewport.changed = 1;
-        ec->comp_data->pending.buffer_viewport.buffer.src_width = wl_fixed_from_int(-1);
-        ec->comp_data->pending.buffer_viewport.surface.width = -1;
-        ec->comp_data->pending.buffer_viewport.changed = 1;
-     }
+   e_surface_viewporter_resource_unset(viewport->surface);
 
    free(viewport);
 }
@@ -1307,13 +1296,9 @@ _e_comp_wl_viewport_crop_by_parent(E_Viewport *viewport, Eina_Rectangle *parent,
 static Eina_Bool
 _e_comp_wl_viewport_apply_transform(E_Viewport *viewport, int *rtransform)
 {
-   E_Client *ec;
-   E_Comp_Wl_Buffer_Viewport *vp;
    Eina_Bool changed = EINA_FALSE;
    unsigned int new_transform;
 
-   ec = viewport->ec;
-   vp = &ec->comp_data->scaler.buffer_viewport;
    new_transform = viewport->current.transform;
 
    if (viewport->current.follow_parent_transform && viewport->epc)
@@ -1324,7 +1309,7 @@ _e_comp_wl_viewport_apply_transform(E_Viewport *viewport, int *rtransform)
 
         if (!epc->comp_data || e_object_is_del(E_OBJECT(epc)))
           {
-             *rtransform = vp->buffer.transform;
+             *rtransform = e_surface_buffer_transform_get(viewport->surface);
              return EINA_FALSE;
           }
 
@@ -1342,22 +1327,13 @@ _e_comp_wl_viewport_apply_transform(E_Viewport *viewport, int *rtransform)
         new_transform = ((ptran + ctran) & 0x3) + ((pflip + cflip) & 0x4);
      }
 
-   if (new_transform != vp->buffer.transform)
-     {
-        vp->buffer.transform = new_transform;
-        vp->changed = changed = EINA_TRUE;
-
-        ec->comp_data->pending.buffer_viewport = *vp;
-        if (ec->comp_data->sub.data)
-          ec->comp_data->sub.data->cached.buffer_viewport = *vp;
-     }
-
+   changed = e_surface_buffer_transform_set(viewport->surface, new_transform);
    if (changed)
      PIN("apply transform: %d type(%d) follow(%d) changed(%d)",
-         vp->buffer.transform, viewport->current.destination.mode.type,
+         new_transform, viewport->current.destination.mode.type,
          viewport->current.follow_parent_transform, changed);
 
-   *rtransform = vp->buffer.transform;
+   *rtransform = new_transform;
 
    return changed;
 }
@@ -1450,16 +1426,8 @@ _e_comp_wl_viewport_apply_destination(E_Viewport *viewport, Eina_Rectangle *rrec
         dst.y = ec->y;
      }
 
-   if (vp->surface.width != dst.w || vp->surface.height != dst.h)
-     {
-        vp->surface.width = dst.w;
-        vp->surface.height = dst.h;
-        vp->changed = changed = EINA_TRUE;
-
-        ec->comp_data->pending.buffer_viewport = *vp;
-        if (ec->comp_data->sub.data)
-          ec->comp_data->sub.data->cached.buffer_viewport = *vp;
-     }
+   if (e_surface_viewport_destination_set(viewport->surface, dst.w, dst.h))
+     changed = EINA_TRUE;
 
    *rrect = dst;
 
@@ -1473,14 +1441,11 @@ static Eina_Bool
 _e_comp_wl_viewport_apply_source(E_Viewport *viewport)
 {
    E_Client *ec;
-   E_Comp_Wl_Buffer_Viewport *vp;
    Eina_Rectangle rect = {0,};
    int bw = 0, bh = 0;
-   wl_fixed_t fx, fy, fw, fh;
    Eina_Bool changed = EINA_FALSE;
 
    ec = viewport->ec;
-   vp = &ec->comp_data->scaler.buffer_viewport;
 
    if (viewport->cropped_source.w == -1)
      return EINA_FALSE;
@@ -1500,25 +1465,7 @@ _e_comp_wl_viewport_apply_source(E_Viewport *viewport)
                                 e_comp_wl_output_buffer_transform_get(ec), 1,
                                 &rect, &rect);
 
-   fx = wl_fixed_from_int(rect.x);
-   fy = wl_fixed_from_int(rect.y);
-   fw = wl_fixed_from_int(rect.w);
-   fh = wl_fixed_from_int(rect.h);
-
-   if (vp->buffer.src_x != fx || vp->buffer.src_y != fy ||
-       vp->buffer.src_width != fw || vp->buffer.src_height != fh)
-     {
-        vp->buffer.src_x = wl_fixed_from_int(rect.x);
-        vp->buffer.src_y = wl_fixed_from_int(rect.y);
-        vp->buffer.src_width = wl_fixed_from_int(rect.w);
-        vp->buffer.src_height = wl_fixed_from_int(rect.h);
-        vp->changed = changed = EINA_TRUE;
-
-        ec->comp_data->pending.buffer_viewport = *vp;
-        if (ec->comp_data->sub.data)
-          ec->comp_data->sub.data->cached.buffer_viewport = *vp;
-     }
-
+   changed = e_surface_viewport_source_box_set(viewport->surface, &rect);
    if (changed)
      PIN("apply source: %d,%d %dx%d orig(%d,%d %dx%d) changed(%d)",
          EINA_RECTANGLE_ARGS(&rect), EINA_RECTANGLE_ARGS(&viewport->cropped_source), changed);
@@ -1628,15 +1575,13 @@ _e_comp_wl_viewport_cb_apply_viewport(struct wl_listener *listener, void *data)
    E_Viewport *viewport;
    E_Client *ec;
    E_Client *topmost;
-   E_Comp_Wl_Buffer_Viewport *vp;
    Eina_Bool changed = EINA_FALSE;
 
    viewport = container_of(listener, E_Viewport, surface_apply_viewport_listener);
    ec = viewport->ec;
    topmost = e_comp_wl_topmost_parent_get(ec);
-   vp = &ec->comp_data->scaler.buffer_viewport;
 
-   if (vp->changed)
+   if (e_surface_viewport_changed_get(viewport->surface))
      changed = EINA_TRUE;
 
    if (viewport->cached.changed)
@@ -1696,20 +1641,21 @@ _e_comp_wl_viewport_cb_topmost_rotate(void *data, int type, void *event)
 E_API Eina_Bool
 e_comp_wl_viewport_create(struct wl_resource *resource,
                           uint32_t id,
-                          struct wl_resource *surface)
+                          struct wl_resource *surface_resource)
 {
    E_Client *ec;
+   E_Surface *surface;
    int version;
    struct wl_client *client;
    struct wl_resource *res;
    E_Viewport *viewport;
 
-   ec = e_client_from_surface_resource(surface);
+   ec = e_client_from_surface_resource(surface_resource);
    version = wl_resource_get_version(resource);
 
    if (!ec || !ec->comp_data || e_object_is_del(E_OBJECT(ec)))
      {
-        ERR("wrong resource %d", wl_resource_get_id(surface));
+        ERR("wrong resource %d", wl_resource_get_id(surface_resource));
         return EINA_FALSE;
      }
 
@@ -1720,17 +1666,23 @@ e_comp_wl_viewport_create(struct wl_resource *resource,
         return EINA_FALSE;
      }
 
-   if (ec->comp_data->scaler.viewport)
+   surface = e_surface_from_resource(surface_resource);
+   if (!surface)
      {
-        ERR("wl_surface@%d already has a viewport",
-            wl_resource_get_id(surface));
+        ERR("Could not get E_Surface from wl_resource(%p)", surface_resource);
         return EINA_FALSE;
      }
 
-   if (!(client = wl_resource_get_client(surface)))
+   if (e_surface_viewporter_resource_get(surface))
+     {
+        ERR("E_Surface(%p) already has a viewport", surface);
+        return EINA_FALSE;
+     }
+
+   if (!(client = wl_resource_get_client(surface_resource)))
      {
         ERR("Could not get client from wl_surface@%d",
-            wl_resource_get_id(surface));
+            wl_resource_get_id(surface_resource));
         return EINA_FALSE;
      }
 
@@ -1751,6 +1703,7 @@ e_comp_wl_viewport_create(struct wl_resource *resource,
 
    viewport->resource = res;
    viewport->ec = ec;
+   viewport->surface = surface;
    viewport->window = e_client_util_win_get(ec);
 
    _e_comp_wl_viewport_parent_check(viewport);
@@ -1774,7 +1727,8 @@ e_comp_wl_viewport_create(struct wl_resource *resource,
    wl_signal_add(&ec->comp_data->apply_viewport_signal, &viewport->surface_apply_viewport_listener);
 
    /* Use scaler variable because tizen_viewport is the alternative of wl_viewport */
-   ec->comp_data->scaler.viewport = res;
+   e_surface_viewporter_resource_set(viewport->surface, res);
+
    wl_resource_set_implementation(res, &_e_comp_wl_viewport_interface,
                                   viewport, _e_comp_wl_viewport_destroy);