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)
{
#include <wayland-server.h>
#include <pixman.h>
+#include <libds/util/box.h>
#define E_SURFACE_INVALID_EXPORTED_ID 0
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);