diff options
author | emersion <contact@emersion.fr> | 2018-01-29 23:21:30 +0100 |
---|---|---|
committer | emersion <contact@emersion.fr> | 2018-01-29 23:21:30 +0100 |
commit | 2cc989e09716eed5974dc9a76b7b6dbee9c3d730 (patch) | |
tree | 5a3e28dba16420e77997c4d2093ad4410e831700 | |
parent | 4cc58288cb75bd7fdeec1ef04bd4fc6cce55d09f (diff) |
output: restrict provided damage to output bounds
-rw-r--r-- | types/wlr_output.c | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/types/wlr_output.c b/types/wlr_output.c index 8995ef5f..f2bb6bfc 100644 --- a/types/wlr_output.c +++ b/types/wlr_output.c @@ -474,14 +474,16 @@ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when, pixman_region32_t *damage) { wl_signal_emit(&output->events.swap_buffers, damage); - pixman_region32_t *render_damage = damage; - if (damage == NULL) { - // Damage tracking not supported, repaint the whole output - pixman_region32_t output_damage; - pixman_region32_init(&output_damage); - pixman_region32_union_rect(&output_damage, &output_damage, - 0, 0, output->width, output->height); - render_damage = &output_damage; + int width, height; + output_get_transformed_size(output, &width, &height); + + pixman_region32_t render_damage; + pixman_region32_init(&render_damage); + pixman_region32_union_rect(&render_damage, &render_damage, 0, 0, + width, height); + if (damage != NULL) { + // Damage tracking supported + pixman_region32_intersect(&render_damage, &render_damage, damage); } if (when == NULL) { @@ -490,10 +492,10 @@ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when, when = &now; } - if (pixman_region32_not_empty(render_damage)) { + if (pixman_region32_not_empty(&render_damage)) { if (output->fullscreen_surface != NULL) { output_fullscreen_surface_render(output, output->fullscreen_surface, - when, render_damage); + when, &render_damage); } struct wlr_output_cursor *cursor; @@ -502,7 +504,7 @@ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when, output->hardware_cursor == cursor) { continue; } - output_cursor_render(cursor, when, render_damage); + output_cursor_render(cursor, when, &render_damage); } } @@ -515,10 +517,7 @@ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when, output->needs_swap = false; pixman_region32_clear(&output->damage); - if (damage == NULL) { - pixman_region32_fini(render_damage); - } - + pixman_region32_fini(&render_damage); return true; } |