surface: Add ds_surface_get_buffer_source_box 65/304865/1
authorSeunghun Lee <shiin.lee@samsung.com>
Mon, 15 Jan 2024 06:41:40 +0000 (15:41 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Thu, 25 Jan 2024 02:49:56 +0000 (11:49 +0900)
With this patch, the ds_surface will provide the source region of a
buffer based on the viewport.

Change-Id: Iab026679d1d046b26a4784ab165fbc157a747c5b

include/libds/surface.h
include/libds/util/transform.h [new file with mode: 0644]
src/compositor/surface.c
src/meson.build
src/util/transform.c [new file with mode: 0644]

index 9b6b1cf..7a0eee6 100644 (file)
@@ -5,6 +5,7 @@
 #include <wayland-server.h>
 
 #include <libds/buffer.h>
+#include <libds/util/box.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -69,6 +70,9 @@ ds_surface_reset_role_data(struct ds_surface *surface);
 struct wl_resource *
 ds_surface_get_wl_resource(struct ds_surface *surface);
 
+void ds_surface_get_buffer_source_box(struct ds_surface *surface,
+    struct ds_fbox *box);
+
 /**
  * Get a viewport handle of surface exclusively
  *
diff --git a/include/libds/util/transform.h b/include/libds/util/transform.h
new file mode 100644 (file)
index 0000000..496e1a5
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef LIBDS_UTIL_TRANSFORM_H
+#define LIBDS_UTIL_TRANSFORM_H
+
+#include <wayland-server-protocol.h>
+
+enum wl_output_transform ds_output_transform_invert(enum wl_output_transform tr);
+
+#endif
\ No newline at end of file
index 62d7be1..9396c69 100644 (file)
@@ -1,6 +1,8 @@
 #include <stdlib.h>
 
 #include "libds/region.h"
+#include "libds/util/box.h"
+#include "libds/util/transform.h"
 #include "region.h"
 #include "compositor_private.h"
 
@@ -15,6 +17,8 @@ static bool surface_for_each(struct ds_surface *surface, int x, int y,
 static void surface_update_damage(pixman_region32_t *buffer_damage,
         struct ds_surface_state *current, struct ds_surface_state *pending);
 static void surface_update_buffer(struct ds_surface *surface);
+static void surface_state_transformed_buffer_size(struct ds_surface_state *state,
+    int *width, int *height);
 
 WL_EXPORT void
 ds_surface_add_destroy_listener(struct ds_surface *surface,
@@ -300,6 +304,32 @@ ds_surface_get_wl_resource(struct ds_surface *surface)
     return surface->resource;
 }
 
+WL_EXPORT void
+ds_surface_get_buffer_source_box(struct ds_surface *surface,
+    struct ds_fbox *box)
+{
+    int width, height;
+    int32_t scale;
+
+    if (surface->current.viewport.has_src) {
+        scale = surface->current.scale;
+        box->x = surface->current.viewport.src.x * scale;
+        box->y = surface->current.viewport.src.y * scale;
+        box->width = surface->current.viewport.src.width * scale;
+        box->height = surface->current.viewport.src.height * scale;
+
+        surface_state_transformed_buffer_size(&surface->current, &width, &height);
+        ds_fbox_transform(box, box,
+            ds_output_transform_invert(surface->current.transform),
+            width, height);
+    }
+    else {
+        box->x = box->y = 0;
+        box->width = surface->current.buffer_width;
+        box->height = surface->current.buffer_height;
+    }
+}
+
 void
 surface_state_move(struct ds_surface_state *state, struct ds_surface_state *next)
 {
@@ -723,8 +753,6 @@ static void
 surface_state_viewport_src_size(struct ds_surface_state *state,
         int *out_width, int *out_height)
 {
-    int width, height, tmp;
-
     if (state->buffer_width == 0 && state->buffer_height == 0) {
         *out_width = 0;
         *out_height = 0;
@@ -736,16 +764,9 @@ surface_state_viewport_src_size(struct ds_surface_state *state,
         *out_height = state->viewport.src.height;
     }
     else {
-        width = state->buffer_width / state->scale;
-        height = state->buffer_height / state->scale;
-        if ((state->transform & WL_OUTPUT_TRANSFORM_90) != 0) {
-            tmp = width;
-            width =  height;
-            height = tmp;
-        }
-
-        *out_width = width;
-        *out_height = height;
+        surface_state_transformed_buffer_size(state, out_width, out_height);
+        *out_width /= state->scale;
+        *out_height /= state->scale;
     }
 }
 
@@ -799,16 +820,6 @@ surface_finalize_pending(struct ds_surface *surface)
             0, 0, pending->buffer_width, pending->buffer_height);
 }
 
-// FIXME
-static enum wl_output_transform
-ds_output_transform_invert(enum wl_output_transform tr)
-{
-    if ((tr & WL_OUTPUT_TRANSFORM_90) && !(tr & WL_OUTPUT_TRANSFORM_FLIPPED)) {
-        tr ^= WL_OUTPUT_TRANSFORM_180;
-    }
-    return tr;
-}
-
 static void
 surface_update_damage(pixman_region32_t *buffer_damage,
         struct ds_surface_state *current, struct ds_surface_state *pending)
@@ -910,3 +921,17 @@ surface_for_each(struct ds_surface *surface, int x, int y,
 
     return false;
 }
+
+static void
+surface_state_transformed_buffer_size(struct ds_surface_state *state,
+    int *width, int *height)
+{
+    if (state->transform & WL_OUTPUT_TRANSFORM_90) {
+        *width = state->buffer_height;
+        *height = state->buffer_width;
+    }
+    else {
+        *width = state->buffer_width;
+        *height = state->buffer_height;
+    }
+}
\ No newline at end of file
index 7bed33b..d9a9410 100644 (file)
@@ -9,6 +9,7 @@ libds_files = [
   'util/time.c',
   'util/shm.c',
   'util/box.c',
+  'util/transform.c',
   'compositor/compositor.c',
   'compositor/subcompositor.c',
   'compositor/surface.c',
diff --git a/src/util/transform.c b/src/util/transform.c
new file mode 100644 (file)
index 0000000..4672947
--- /dev/null
@@ -0,0 +1,10 @@
+#include <wayland-server.h>
+
+WL_EXPORT enum wl_output_transform
+ds_output_transform_invert(enum wl_output_transform tr)
+{
+    if ((tr & WL_OUTPUT_TRANSFORM_90) && !(tr & WL_OUTPUT_TRANSFORM_FLIPPED)) {
+        tr ^= WL_OUTPUT_TRANSFORM_180;
+    }
+    return tr;
+}