aboutsummaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2018-01-24 14:48:01 +0100
committeremersion <contact@emersion.fr>2018-01-24 14:48:01 +0100
commit6281deb90fa6a97835d5045a8be610556ab588fe (patch)
treeb29d32c44a9a035fbf70e4cdb3dc964a4d3f1507 /render
parent4d282c859099321b1e799a2ab344480f186359ef (diff)
parent7a2e9a17bae919088f4265961ad8d00fece7b870 (diff)
Merge remote-tracking branch 'upstream/master' into output-damage
Diffstat (limited to 'render')
-rw-r--r--render/gles2/renderer.c2
-rw-r--r--render/matrix.c50
2 files changed, 51 insertions, 1 deletions
diff --git a/render/gles2/renderer.c b/render/gles2/renderer.c
index 3909fd84..b2412f79 100644
--- a/render/gles2/renderer.c
+++ b/render/gles2/renderer.c
@@ -188,7 +188,7 @@ static bool wlr_gles2_render_texture(struct wlr_renderer *wlr_renderer,
static void wlr_gles2_render_quad(struct wlr_renderer *wlr_renderer,
const float (*color)[4], const float (*matrix)[16]) {
GL_CALL(glUseProgram(shaders.quad));
- GL_CALL(glUniformMatrix4fv(0, 1, GL_TRUE, *matrix));
+ GL_CALL(glUniformMatrix4fv(0, 1, GL_FALSE, *matrix));
GL_CALL(glUniform4f(1, (*color)[0], (*color)[1], (*color)[2], (*color)[3]));
draw_quad();
}
diff --git a/render/matrix.c b/render/matrix.c
index 54dba4cc..fa45dd04 100644
--- a/render/matrix.c
+++ b/render/matrix.c
@@ -1,6 +1,8 @@
#include <string.h>
#include <math.h>
#include <wayland-server-protocol.h>
+#include <wlr/types/wlr_box.h>
+#include <wlr/types/wlr_output.h>
#include <wlr/render/matrix.h>
/* Obtains the index for the given row/column */
@@ -158,3 +160,51 @@ void wlr_matrix_texture(float mat[static 16], int32_t width, int32_t height,
mat[10] = 1.0f;
mat[15] = 1.0f;
}
+
+void wlr_matrix_project_box(float (*mat)[16], struct wlr_box *box,
+ enum wl_output_transform transform, float rotation,
+ float (*projection)[16]) {
+ int x = box->x;
+ int y = box->y;
+ int width = box->width;
+ int height = box->height;
+
+ wlr_matrix_translate(mat, x, y, 0);
+
+ if (rotation != 0) {
+ float translate_center[16];
+ wlr_matrix_translate(&translate_center, width/2, height/2, 0);
+
+ float rotate[16];
+ wlr_matrix_rotate(&rotate, rotation);
+
+ float translate_origin[16];
+ wlr_matrix_translate(&translate_origin, -width/2, -height/2, 0);
+
+ wlr_matrix_mul(mat, &translate_center, mat);
+ wlr_matrix_mul(mat, &rotate, mat);
+ wlr_matrix_mul(mat, &translate_origin, mat);
+ }
+
+ float scale[16];
+ wlr_matrix_scale(&scale, width, height, 1);
+
+ wlr_matrix_mul(mat, &scale, mat);
+
+ if (transform != WL_OUTPUT_TRANSFORM_NORMAL) {
+ float surface_translate_center[16];
+ wlr_matrix_translate(&surface_translate_center, 0.5, 0.5, 0);
+
+ float surface_transform[16];
+ wlr_matrix_transform(surface_transform, transform);
+
+ float surface_translate_origin[16];
+ wlr_matrix_translate(&surface_translate_origin, -0.5, -0.5, 0);
+
+ wlr_matrix_mul(mat, &surface_translate_center, mat);
+ wlr_matrix_mul(mat, &surface_transform, mat);
+ wlr_matrix_mul(mat, &surface_translate_origin, mat);
+ }
+
+ wlr_matrix_mul(projection, mat, mat);
+}