compositor: Add e_surface_buffer_source_box_get 13/320913/1
authorSeunghun Lee <shiin.lee@samsung.com>
Mon, 10 Feb 2025 03:11:29 +0000 (12:11 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Tue, 11 Mar 2025 04:41:13 +0000 (13:41 +0900)
This function will return actual buffer area to be referenced based on
the surface's transform and buffer source region.

Change-Id: I7ff0d0a71bd779dafdc5f8d2a3bc1b8bba73244c

configure.ac
src/bin/server/e_compositor.c
src/bin/server/e_compositor_intern.h

index 197d19691dbe1f392c890f7277378ace3ab4cff8..aef9089af07c1919f1bb9a890d94b1647cecee1e 100755 (executable)
@@ -301,7 +301,7 @@ e_requires="\
   libtdm >= "1.0.0" \
   glib-2.0 \
   gobject-2.0 \
-  libds >= 0.1.12 \
+  libds >= 0.1.13 \
   libds-xdg-shell-v6 \
   libds-tizen >= 0.1.3 \
   "
index 13af2cabb5a77241a774379fff458664136df5f4..817b027212738b86c2d5c2c25611284ecc9787d2 100644 (file)
@@ -1063,6 +1063,52 @@ e_surface_destroy(E_Surface *surface)
    free(surface);
 }
 
+static enum wl_output_transform
+_output_transform_invert(enum wl_output_transform tr)
+{
+   if (tr == WL_OUTPUT_TRANSFORM_90)
+     tr = WL_OUTPUT_TRANSFORM_270;
+   else if (tr == WL_OUTPUT_TRANSFORM_270)
+     tr = WL_OUTPUT_TRANSFORM_90;
+
+   return tr;
+}
+
+EINTERN void
+e_surface_buffer_source_box_get(E_Surface *surface, struct ds_fbox *box)
+{
+   int32_t buffer_width = 0, buffer_height = 0;
+   enum wl_output_transform transform;
+
+   if (surface->base.buffer_ref.buffer)
+     e_comp_wl_buffer_size_get(surface->base.buffer_ref.buffer, &buffer_width, &buffer_height);
+
+   if (surface->base.scaler.buffer_viewport.buffer.src_width != wl_fixed_from_int(-1))
+     {
+        box->x = wl_fixed_to_double(surface->base.scaler.buffer_viewport.buffer.src_x) * surface->base.scaler.buffer_viewport.buffer.scale;
+        box->y = wl_fixed_to_double(surface->base.scaler.buffer_viewport.buffer.src_y) * surface->base.scaler.buffer_viewport.buffer.scale;
+        box->width = wl_fixed_to_double(surface->base.scaler.buffer_viewport.buffer.src_width) * surface->base.scaler.buffer_viewport.buffer.scale;
+        box->height = wl_fixed_to_double(surface->base.scaler.buffer_viewport.buffer.src_height) * surface->base.scaler.buffer_viewport.buffer.scale;
+
+        /* HACK: Invert transform value if it's 90 or 270.
+         * We have been interpreting transform values for angles 90 and 270
+         * incorrectly. These transforms were used inversely across all
+         * clients, making it impossible to correct them individually due to
+         * widespread adoption. Therefore, here we convert transform values
+         * for 90 or 270 before passing it to ds_fbox, which interprets
+         * them correctly.
+         */
+        transform = _output_transform_invert(surface->base.scaler.buffer_viewport.buffer.transform);
+        ds_fbox_transform(box, box, transform, buffer_width, buffer_height);
+     }
+   else
+     {
+        box->x = box->y = 0;
+        box->width = buffer_width;
+        box->height = buffer_height;
+     }
+}
+
 static void
 _e_surface_ds_surface_set(E_Surface *surface, struct ds_surface *ds_surface)
 {
index df3824a2ebab7cab240375d61c353ccca092dbde..31f8e797d33b9a92e11e72ecbe17cf17de8e0b7e 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <wayland-server.h>
 #include <pixman.h>
+#include <libds/util/box.h>
 
 #define E_SURFACE_INVALID_EXPORTED_ID 0
 
@@ -57,6 +58,12 @@ uint32_t e_surface_exported_id_get(E_Surface *surface);
 struct wl_resource *e_surface_resource_get(E_Surface *surface);
 void e_surface_presentation_time_feedback_add(E_Surface *surface, E_Presentation_Time_Feedback *feedback);
 
+/**
+ * Return actual buffer area to be referenced based on surface's buffer
+ * transform and source region of viewport.
+ */
+void e_surface_buffer_source_box_get(E_Surface *surface, struct ds_fbox *box);
+
 E_Subsurface *e_subsurface_create(struct wl_resource *factory_resource, uint32_t id, E_Surface *surface, E_Surface *parent);
 E_Subsurface *e_subsurface_from_resource(struct wl_resource *resource);
 E_Subsurface *e_subsurface_try_from_resource(struct wl_resource *resource);