diff options
author | Drew DeVault <sir@cmpwn.com> | 2017-10-25 23:48:54 -0400 |
---|---|---|
committer | Drew DeVault <sir@cmpwn.com> | 2017-11-01 08:51:59 -0400 |
commit | 7f76f463181872f39356e5a4d6e2e34fd9a0a1bb (patch) | |
tree | 86042a9bfe6db098ab2d71c3deea67d0a43dc8e9 /rootston/output.c | |
parent | 8c0929cfb3e97a71a00210fc299fb7c65703e053 (diff) |
Adjust rendering to compensate for disparate scale
Something about my math is off, but I'm not certain what. Would
appreciate a second opinion.
Diffstat (limited to 'rootston/output.c')
-rw-r--r-- | rootston/output.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/rootston/output.c b/rootston/output.c index faf39e74..37af1e2d 100644 --- a/rootston/output.c +++ b/rootston/output.c @@ -20,29 +20,35 @@ static void render_surface(struct wlr_surface *surface, struct roots_desktop *desktop, struct wlr_output *wlr_output, struct timespec *when, double lx, double ly, float rotation) { if (surface->texture->valid) { - int width = surface->current->buffer_width; - int height = surface->current->buffer_height; + float scale_factor = (float)wlr_output->scale / surface->current->scale; + int width = surface->current->buffer_width * scale_factor; + int height = surface->current->buffer_height * scale_factor; double ox = lx, oy = ly; wlr_output_layout_output_coords(desktop->layout, wlr_output, &ox, &oy); if (wlr_output_layout_intersects(desktop->layout, wlr_output, lx, ly, lx + width, ly + height)) { - // TODO: accomodate for mismatched scale, which can happen, for - // example, when a view is rendered over two outputs float matrix[16]; float translate_origin[16]; wlr_matrix_translate(&translate_origin, (int)ox + width / 2, (int)oy + height / 2, 0); + float rotate[16]; wlr_matrix_rotate(&rotate, rotation); + float translate_center[16]; wlr_matrix_translate(&translate_center, -width / 2, -height / 2, 0); + + float scale[16]; + wlr_matrix_scale(&scale, width, height, 1); + float transform[16]; wlr_matrix_mul(&translate_origin, &rotate, &transform); wlr_matrix_mul(&transform, &translate_center, &transform); - wlr_surface_get_matrix(surface, &matrix, - &wlr_output->transform_matrix, &transform); + wlr_matrix_mul(&transform, &scale, &transform); + wlr_matrix_mul(&wlr_output->transform_matrix, &transform, &matrix); + wlr_render_with_matrix(desktop->server->renderer, surface->texture, &matrix); |