If a transformation matrix causes a scale, a rotation not a multiple of 90 degrees or a non-integer translation then textures rendered with it would benefit from bilinear filtering.
This test is done in a lazy fashion by examining elements of the matrix to check for a simple pattern that indicates these conditions are met. --- src/compositor.c | 35 +++++++++++++++++++++++++++++++++++ src/compositor.h | 4 ++++ 2 files changed, 39 insertions(+) diff --git a/src/compositor.c b/src/compositor.c index 68fbd71..00d404d 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -799,6 +799,41 @@ weston_matrix_transform_region(pixman_region32_t *dest, free(dest_rects); } +static bool near_zero(float a) +{ + if (fabs(a) > 0.0001) + return false; + + return true; +} + +WL_EXPORT bool +weston_matrix_needs_filtering(struct weston_matrix *matrix) +{ + /* check for non-integral x/y translation */ + if ((nearbyintf(matrix->d[12]) != matrix->d[12]) || + (nearbyintf(matrix->d[13]) != matrix->d[13])) + return true; + + if (!near_zero(matrix->d[3]) || !near_zero(matrix->d[7]) || + !near_zero(matrix->d[15] - 1.0)) + return true; + + if (near_zero(matrix->d[0])) { + if (!near_zero(matrix->d[5]) || + !near_zero(fabsf(matrix->d[1]) - 1.0) || + !near_zero(fabsf(matrix->d[4]) - 1.0)) + return true; + } else { + if (!near_zero(matrix->d[1]) || !near_zero(matrix->d[4]) || + !near_zero(fabsf(matrix->d[0]) - 1.0) || + !near_zero(fabsf(matrix->d[5]) - 1.0)) + return true; + } + + return false; +} + WL_EXPORT void weston_surface_to_buffer_float(struct weston_surface *surface, float sx, float sy, float *bx, float *by) diff --git a/src/compositor.h b/src/compositor.h index 4fdf4dc..bc22026 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -28,6 +28,7 @@ extern "C" { #endif +#include <stdbool.h> #include <time.h> #include <pixman.h> #include <xkbcommon/xkbcommon.h> @@ -987,6 +988,9 @@ weston_view_from_global_fixed(struct weston_view *view, wl_fixed_t x, wl_fixed_t y, wl_fixed_t *vx, wl_fixed_t *vy); +bool +weston_matrix_needs_filtering(struct weston_matrix *matrix); + void weston_surface_to_buffer_float(struct weston_surface *surface, float x, float y, float *bx, float *by); -- 2.1.1 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel