#include <stdlib.h>
#include "libds/region.h"
+#include "libds/util/box.h"
+#include "libds/util/transform.h"
#include "region.h"
#include "compositor_private.h"
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,
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)
{
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;
*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;
}
}
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)
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