The pixman renderer doesn't use the weston_surface_to_buffer* functions to alter coordinates depending on buffer transformation, buffer scaling, and surface scaler (wl_surface_scaler). pixman_transform_scale() is used instead to perform said transformations without having to modify each coordinate. --- src/pixman-renderer.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-)
diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c index 5961965..120f2cd 100644 --- a/src/pixman-renderer.c +++ b/src/pixman-renderer.c @@ -256,9 +256,31 @@ repaint_region(struct weston_view *ev, struct weston_output *output, pixman_double_to_fixed ((double)-ev->geometry.y)); } + if (ev->surface->buffer_viewport.scaler_set) { + double scaler_x, scaler_y, scaler_width, scaler_height; + double ratio_x, ratio_y; - fw = pixman_int_to_fixed(ev->geometry.width); - fh = pixman_int_to_fixed(ev->geometry.height); + scaler_x = wl_fixed_to_double(ev->surface->buffer_viewport.src_x); + scaler_y = wl_fixed_to_double(ev->surface->buffer_viewport.src_y); + scaler_width = wl_fixed_to_double(ev->surface->buffer_viewport.src_width); + scaler_height = wl_fixed_to_double(ev->surface->buffer_viewport.src_height); + + ratio_x = scaler_width / ev->surface->buffer_viewport.dst_width; + ratio_y = scaler_height / ev->surface->buffer_viewport.dst_height; + + pixman_transform_scale(&transform, NULL, + pixman_double_to_fixed(ratio_x), + pixman_double_to_fixed(ratio_y)); + pixman_transform_translate(&transform, NULL, pixman_double_to_fixed(scaler_x), + pixman_double_to_fixed(scaler_y)); + } + + pixman_transform_scale(&transform, NULL, + pixman_double_to_fixed(ev->surface->buffer_viewport.scale), + pixman_double_to_fixed(ev->surface->buffer_viewport.scale)); + + fw = pixman_int_to_fixed(pixman_image_get_width(ps->image)); + fh = pixman_int_to_fixed(pixman_image_get_height(ps->image)); switch (ev->surface->buffer_viewport.transform) { case WL_OUTPUT_TRANSFORM_FLIPPED: @@ -294,10 +316,6 @@ repaint_region(struct weston_view *ev, struct weston_output *output, break; } - pixman_transform_scale(&transform, NULL, - 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_viewport.scale) -- 1.8.4.2 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel