compositor: gather buffer_transform and _scale into a struct
Gather the variables affecting the coordinate transformations between
buffer and local coordinates into a new struct weston_buffer_viewport.
This will be more useful later, when the crop & scale extension is
implemented.
diff --git a/src/compositor-drm.c b/src/compositor-drm.c
index a1d9d59..c34fc1c 100644
--- a/src/compositor-drm.c
+++ b/src/compositor-drm.c
@@ -463,7 +463,7 @@
buffer == NULL || c->gbm == NULL ||
buffer->width != output->base.current_mode->width ||
buffer->height != output->base.current_mode->height ||
- output->base.transform != ev->surface->buffer_transform ||
+ output->base.transform != ev->surface->buffer_viewport.transform ||
ev->transform.enabled)
return NULL;
@@ -818,10 +818,10 @@
if (c->gbm == NULL)
return NULL;
- if (ev->surface->buffer_transform != output_base->transform)
+ if (ev->surface->buffer_viewport.transform != output_base->transform)
return NULL;
- if (ev->surface->buffer_scale != output_base->current_scale)
+ if (ev->surface->buffer_viewport.scale != output_base->current_scale)
return NULL;
if (c->sprites_are_broken)
@@ -931,8 +931,9 @@
tbox = weston_transformed_rect(wl_fixed_from_int(ev->geometry.width),
wl_fixed_from_int(ev->geometry.height),
- ev->surface->buffer_transform,
- ev->surface->buffer_scale, tbox);
+ ev->surface->buffer_viewport.transform,
+ ev->surface->buffer_viewport.scale,
+ tbox);
s->src_x = tbox.x1 << 8;
s->src_y = tbox.y1 << 8;
diff --git a/src/compositor.c b/src/compositor.c
index 4668c2a..59b4a53 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -399,10 +399,9 @@
surface->compositor = compositor;
surface->ref_count = 1;
- surface->buffer_transform = WL_OUTPUT_TRANSFORM_NORMAL;
- surface->buffer_scale = 1;
- surface->pending.buffer_transform = surface->buffer_transform;
- surface->pending.buffer_scale = surface->buffer_scale;
+ surface->buffer_viewport.transform = WL_OUTPUT_TRANSFORM_NORMAL;
+ surface->buffer_viewport.scale = 1;
+ surface->pending.buffer_viewport = surface->buffer_viewport;
surface->output = NULL;
surface->pending.newly_attached = 0;
@@ -638,8 +637,8 @@
{
weston_transformed_coord(surface->width,
surface->height,
- surface->buffer_transform,
- surface->buffer_scale,
+ surface->buffer_viewport.transform,
+ surface->buffer_viewport.scale,
sx, sy, bx, by);
}
@@ -651,8 +650,8 @@
weston_transformed_coord(surface->width,
surface->height,
- surface->buffer_transform,
- surface->buffer_scale,
+ surface->buffer_viewport.transform,
+ surface->buffer_viewport.scale,
sx, sy, &bxf, &byf);
*bx = floorf(bxf);
*by = floorf(byf);
@@ -664,8 +663,8 @@
{
return weston_transformed_rect(surface->width,
surface->height,
- surface->buffer_transform,
- surface->buffer_scale,
+ surface->buffer_viewport.transform,
+ surface->buffer_viewport.scale,
rect);
}
@@ -1145,7 +1144,7 @@
weston_surface_buffer_width(struct weston_surface *surface)
{
int32_t width;
- switch (surface->buffer_transform) {
+ switch (surface->buffer_viewport.transform) {
case WL_OUTPUT_TRANSFORM_90:
case WL_OUTPUT_TRANSFORM_270:
case WL_OUTPUT_TRANSFORM_FLIPPED_90:
@@ -1156,14 +1155,14 @@
width = surface->buffer_ref.buffer->width;
break;
}
- return width / surface->buffer_scale;
+ return width / surface->buffer_viewport.scale;
}
WL_EXPORT int32_t
weston_surface_buffer_height(struct weston_surface *surface)
{
int32_t height;
- switch (surface->buffer_transform) {
+ switch (surface->buffer_viewport.transform) {
case WL_OUTPUT_TRANSFORM_90:
case WL_OUTPUT_TRANSFORM_270:
case WL_OUTPUT_TRANSFORM_FLIPPED_90:
@@ -1174,7 +1173,7 @@
height = surface->buffer_ref.buffer->height;
break;
}
- return height / surface->buffer_scale;
+ return height / surface->buffer_viewport.scale;
}
WL_EXPORT uint32_t
@@ -1963,10 +1962,8 @@
pixman_region32_t opaque;
/* wl_surface.set_buffer_transform */
- surface->buffer_transform = surface->pending.buffer_transform;
-
/* wl_surface.set_buffer_scale */
- surface->buffer_scale = surface->pending.buffer_scale;
+ surface->buffer_viewport = surface->pending.buffer_viewport;
/* wl_surface.attach */
if (surface->pending.buffer || surface->pending.newly_attached)
@@ -2066,7 +2063,7 @@
{
struct weston_surface *surface = wl_resource_get_user_data(resource);
- surface->pending.buffer_transform = transform;
+ surface->pending.buffer_viewport.transform = transform;
}
static void
@@ -2076,7 +2073,7 @@
{
struct weston_surface *surface = wl_resource_get_user_data(resource);
- surface->pending.buffer_scale = scale;
+ surface->pending.buffer_viewport.scale = scale;
}
static const struct wl_surface_interface surface_interface = {
@@ -2197,10 +2194,8 @@
pixman_region32_t opaque;
/* wl_surface.set_buffer_transform */
- surface->buffer_transform = sub->cached.buffer_transform;
-
/* wl_surface.set_buffer_scale */
- surface->buffer_scale = sub->cached.buffer_scale;
+ surface->buffer_viewport = sub->cached.buffer_viewport;
/* wl_surface.attach */
if (sub->cached.buffer_ref.buffer || sub->cached.newly_attached)
@@ -2293,8 +2288,7 @@
surface->pending.sy = 0;
surface->pending.newly_attached = 0;
- sub->cached.buffer_transform = surface->pending.buffer_transform;
- sub->cached.buffer_scale = surface->pending.buffer_scale;
+ sub->cached.buffer_viewport = surface->pending.buffer_viewport;
pixman_region32_copy(&sub->cached.opaque, &surface->pending.opaque);
diff --git a/src/compositor.h b/src/compositor.h
index 8c19619..e445dc3 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -647,6 +647,14 @@
struct wl_listener destroy_listener;
};
+struct weston_buffer_viewport {
+ /* wl_surface.set_buffer_transform */
+ uint32_t transform;
+
+ /* wl_surface.set_scaling_factor */
+ int32_t scale;
+};
+
struct weston_region {
struct wl_resource *resource;
pixman_region32_t region;
@@ -693,10 +701,8 @@
struct wl_list frame_callback_list;
/* wl_surface.set_buffer_transform */
- uint32_t buffer_transform;
-
/* wl_surface.set_buffer_scale */
- int32_t buffer_scale;
+ struct weston_buffer_viewport buffer_viewport;
} cached;
int synchronized;
@@ -835,8 +841,7 @@
struct wl_list frame_callback_list;
struct weston_buffer_reference buffer_ref;
- uint32_t buffer_transform;
- int32_t buffer_scale;
+ struct weston_buffer_viewport buffer_viewport;
int keep_buffer; /* bool for backends to prevent early release */
/* All the pending state, that wl_surface.commit will apply. */
@@ -861,10 +866,8 @@
struct wl_list frame_callback_list;
/* wl_surface.set_buffer_transform */
- uint32_t buffer_transform;
-
/* wl_surface.set_scaling_factor */
- int32_t buffer_scale;
+ struct weston_buffer_viewport buffer_viewport;
} pending;
/*
diff --git a/src/gl-renderer.c b/src/gl-renderer.c
index 52451cd..a74aef5 100644
--- a/src/gl-renderer.c
+++ b/src/gl-renderer.c
@@ -536,7 +536,7 @@
shader_uniforms(gs->shader, ev, output);
if (ev->transform.enabled || output->zoom.active ||
- output->current_scale != ev->surface->buffer_scale)
+ output->current_scale != ev->surface->buffer_viewport.scale)
filter = GL_LINEAR;
else
filter = GL_NEAREST;
diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c
index b719829..5961965 100644
--- a/src/pixman-renderer.c
+++ b/src/pixman-renderer.c
@@ -260,7 +260,7 @@
fw = pixman_int_to_fixed(ev->geometry.width);
fh = pixman_int_to_fixed(ev->geometry.height);
- switch (ev->surface->buffer_transform) {
+ switch (ev->surface->buffer_viewport.transform) {
case WL_OUTPUT_TRANSFORM_FLIPPED:
case WL_OUTPUT_TRANSFORM_FLIPPED_90:
case WL_OUTPUT_TRANSFORM_FLIPPED_180:
@@ -272,7 +272,7 @@
break;
}
- switch (ev->surface->buffer_transform) {
+ switch (ev->surface->buffer_viewport.transform) {
default:
case WL_OUTPUT_TRANSFORM_NORMAL:
case WL_OUTPUT_TRANSFORM_FLIPPED:
@@ -295,12 +295,12 @@
}
pixman_transform_scale(&transform, NULL,
- pixman_double_to_fixed ((double)ev->surface->buffer_scale),
- pixman_double_to_fixed ((double)ev->surface->buffer_scale));
+ pixman_double_to_fixed ((double)ev->surface->buffer_viewport.scale),
+ pixman_double_to_fixed ((double)ev->surface->buffer_viewport.scale));
pixman_image_set_transform(ps->image, &transform);
- if (ev->transform.enabled || output->current_scale != ev->surface->buffer_scale)
+ if (ev->transform.enabled || output->current_scale != ev->surface->buffer_viewport.scale)
pixman_image_set_filter(ps->image, PIXMAN_FILTER_BILINEAR, NULL, 0);
else
pixman_image_set_filter(ps->image, PIXMAN_FILTER_NEAREST, NULL, 0);
diff --git a/src/shell.c b/src/shell.c
index 2084ed6..605f090 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -2333,11 +2333,11 @@
case WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER:
if (shell_surface_is_top_fullscreen(shsurf)) {
struct weston_mode mode = {0,
- surf_width * surface->buffer_scale,
- surf_height * surface->buffer_scale,
+ surf_width * surface->buffer_viewport.scale,
+ surf_height * surface->buffer_viewport.scale,
shsurf->fullscreen.framerate};
- if (weston_output_switch_mode(output, &mode, surface->buffer_scale,
+ if (weston_output_switch_mode(output, &mode, surface->buffer_viewport.scale,
WESTON_MODE_SWITCH_SET_TEMPORARY) == 0) {
weston_view_set_position(shsurf->view,
output->x - surf_x,