From 1db97a9af906524b577e5f1a4f842e18a0a942a4 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Sun, 6 Aug 2017 21:38:40 +1200 Subject: Updated DRM cursor rendering --- render/matrix.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'render') diff --git a/render/matrix.c b/render/matrix.c index 4de20e5d..c7b11efe 100644 --- a/render/matrix.c +++ b/render/matrix.c @@ -1,5 +1,6 @@ #include #include +#include #include /* Obtains the index for the given row/column */ @@ -81,3 +82,62 @@ void wlr_matrix_mul(const float (*x)[16], const float (*y)[16], float (*product) }; memcpy(*product, _product, sizeof(_product)); } + +static const float transforms[][4] = { + [WL_OUTPUT_TRANSFORM_NORMAL] = { + 1.0f, 0.0f, + 0.0f, -1.0f, + }, + [WL_OUTPUT_TRANSFORM_90] = { + 0.0f, -1.0f, + -1.0f, 0.0f, + }, + [WL_OUTPUT_TRANSFORM_180] = { + -1.0f, 0.0f, + 0.0f, 1.0f, + }, + [WL_OUTPUT_TRANSFORM_270] = { + 0.0f, 1.0f, + 1.0f, 0.0f, + }, + [WL_OUTPUT_TRANSFORM_FLIPPED] = { + -1.0f, 0.0f, + 0.0f, -1.0f, + }, + [WL_OUTPUT_TRANSFORM_FLIPPED_90] = { + 0.0f, 1.0f, + -1.0f, 0.0f, + }, + [WL_OUTPUT_TRANSFORM_FLIPPED_180] = { + 1.0f, 0.0f, + 0.0f, 1.0f, + }, + [WL_OUTPUT_TRANSFORM_FLIPPED_270] = { + 0.0f, -1.0f, + 1.0f, 0.0f, + }, +}; + +// Equivilent to glOrtho(0, width, 0, height, 1, -1) with the transform applied +void wlr_matrix_surface(float mat[static 16], int32_t width, int32_t height, + enum wl_output_transform transform) { + memset(mat, 0, sizeof(*mat) * 16); + + const float *t = transforms[transform]; + float x = 2.0f / width; + float y = 2.0f / height; + + // Rotation + relection + mat[0] = x * t[0]; + mat[1] = x * t[1]; + mat[4] = y * t[2]; + mat[5] = y * t[3]; + + // Translation + mat[3] = -copysign(1.0f, mat[0] + mat[1]); + mat[7] = -copysign(1.0f, mat[4] + mat[5]); + + // Identity + mat[10] = 1.0f; + mat[15] = 1.0f; +} -- cgit v1.2.3