From efe11bd37f3272d5a016ae5876b10f43376b9e03 Mon Sep 17 00:00:00 2001 From: Will McKinnon Date: Sat, 24 Dec 2022 18:43:07 -0500 Subject: [PATCH] small refactor + better damage tracking --- sway/desktop/render.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/sway/desktop/render.c b/sway/desktop/render.c index d37ce36e..0604ec57 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c @@ -341,10 +341,26 @@ void render_box_shadow(struct sway_output *output, pixman_region32_t *output_dam box.x -= output->lx * wlr_output->scale; box.y -= output->ly * wlr_output->scale; + box.x -= blur_sigma; + box.y -= blur_sigma; + box.width += 2 * blur_sigma; + box.height += 2 * blur_sigma; + pixman_region32_t damage; pixman_region32_init(&damage); pixman_region32_union_rect(&damage, &damage, box.x, box.y, box.width, box.height); + + pixman_region32_t inner_damage; + pixman_region32_init(&inner_damage); + pixman_region32_union_rect(&inner_damage, &inner_damage, + box.x + blur_sigma + corner_radius, + box.y + blur_sigma + corner_radius, + box.width - (blur_sigma + corner_radius) * 2.0, + box.height - (blur_sigma + corner_radius) * 2.0); + + pixman_region32_subtract(&damage, &damage, &inner_damage); + pixman_region32_fini(&inner_damage); pixman_region32_intersect(&damage, &damage, output_damage); bool damaged = pixman_region32_not_empty(&damage); if (!damaged) { @@ -1003,14 +1019,8 @@ static void render_containers_linear(struct sway_output *output, // render shadow const float color[4] = {0.0, 0.0, 0.0, 0.5}; - // Mimic how a CSS box-shadow works by using blur_sigma as the shadow width float blur_sigma = 20; - struct wlr_box box = { - state->x - blur_sigma, - state->y - blur_sigma, - state->width + blur_sigma * 2, - state->height + blur_sigma * 2 - }; + struct wlr_box box = { state->x, state->y, state->width, state->height }; scale_box(&box, output->wlr_output->scale); render_box_shadow(output, damage, &box, color, blur_sigma, deco_data.corner_radius); } else {