diff options
author | Erik Reider <[email protected]> | 2024-01-09 17:09:42 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2024-01-09 17:09:42 +0100 |
commit | 5b6862c981eb5541888f625cd93e7775cabe06b0 (patch) | |
tree | 9316ff7b43d8296da3ab49b78ca2fd9926196fc7 | |
parent | b875d712407115b381915495e50875cfc523b76d (diff) | |
parent | 2e8de445a4131ced3581b8aee081dbc17a00b38a (diff) |
Merge pull request #29 from wlrfx/fix-shadows
Fix shadows being wonky
-rw-r--r-- | types/scene/wlr_scene.c | 31 |
1 files changed, 17 insertions, 14 deletions
diff --git a/types/scene/wlr_scene.c b/types/scene/wlr_scene.c index e9f765c..266dc63 100644 --- a/types/scene/wlr_scene.c +++ b/types/scene/wlr_scene.c @@ -1,6 +1,7 @@ #define _POSIX_C_SOURCE 200809L #include <assert.h> #include <stdlib.h> +#include <scenefx/types/fx/shadow_data.h> #include <scenefx/types/wlr_scene.h> #include <string.h> #include <wlr/backend.h> @@ -259,6 +260,10 @@ static void scene_node_opaque_region(struct wlr_scene_node *node, int x, int y, return; } + if (scene_buffer_has_shadow(&scene_buffer->shadow_data)) { + return; + } + if (!buffer_is_opaque(scene_buffer->buffer)) { pixman_region32_copy(opaque, &scene_buffer->opaque_region); pixman_region32_intersect_rect(opaque, opaque, 0, 0, width, height); @@ -474,7 +479,6 @@ static bool scene_node_update_iterator(struct wlr_scene_node *node, struct shadow_data *shadow_data = &buffer->shadow_data; if (scene_buffer_has_shadow(shadow_data)) { wlr_region_expand(&node->visible, &node->visible, shadow_data->blur_sigma); - wlr_region_expand(data->visible, data->visible, shadow_data->blur_sigma); } } @@ -1168,6 +1172,7 @@ static void clip_xdg(struct wlr_scene_node *node, break; } + // Don't clip if the scene buffer doesn't have any effects if (!scene_buffer || (scene_buffer->corner_radius == 0 && !scene_buffer_has_shadow(&scene_buffer->shadow_data))) { return; @@ -1223,19 +1228,23 @@ static void scene_entry_render(struct render_list_entry *entry, const struct ren scene_node_get_size(node, &dst_box.width, &dst_box.height); scale_box(&dst_box, data->scale); + // Tries to clip the node to the xdg geometry size, clipping CSD + struct wlr_box xdg_box = dst_box; + pixman_region32_t geometry_region; // The actual geometry region excluding CSD + pixman_region32_init(&geometry_region); + pixman_region32_copy(&geometry_region, &render_region); + clip_xdg(node, &geometry_region, &xdg_box, dst_box.x, dst_box.y, data->scale); + pixman_region32_t opaque; pixman_region32_init(&opaque); scene_node_opaque_region(node, dst_box.x, dst_box.y, &opaque); scale_output_damage(&opaque, data->scale); pixman_region32_subtract(&opaque, &render_region, &opaque); - struct wlr_box xdg_box = dst_box; - // Tries to clip - clip_xdg(node, &render_region, &xdg_box, dst_box.x, dst_box.y, data->scale); - transform_output_box(&dst_box, data); transform_output_box(&xdg_box, data); transform_output_damage(&render_region, data); + transform_output_damage(&geometry_region, data); switch (node->type) { case WLR_SCENE_NODE_TREE: @@ -1275,23 +1284,16 @@ static void scene_entry_render(struct render_list_entry *entry, const struct ren // Shadow if (scene_buffer_has_shadow(&scene_buffer->shadow_data)) { - // TODO: Compensate for SSD borders here - pixman_region32_t shadow_clip; - pixman_region32_init(&shadow_clip); - // Extend the size of the clip box - wlr_region_expand(&shadow_clip, &render_region, - scene_buffer->shadow_data.blur_sigma * data->scale); struct fx_render_rect_options shadow_options = { .base = { .box = xdg_box, - .clip = &shadow_clip, + .clip = &render_region, // Render with the original extended clip region }, .scale = data->scale, }; fx_render_pass_add_box_shadow(data->render_pass, &shadow_options, scene_buffer->corner_radius * data->scale, &scene_buffer->shadow_data); - pixman_region32_fini(&shadow_clip); } struct fx_render_texture_options tex_options = { @@ -1300,7 +1302,7 @@ static void scene_entry_render(struct render_list_entry *entry, const struct ren .src_box = scene_buffer->src_box, .dst_box = dst_box, .transform = transform, - .clip = &render_region, + .clip = &geometry_region, // Render with the smaller region, clipping CSD .alpha = &scene_buffer->opacity, .filter_mode = scene_buffer->filter_mode, .blend_mode = pixman_region32_not_empty(&opaque) ? @@ -1321,6 +1323,7 @@ static void scene_entry_render(struct render_list_entry *entry, const struct ren } pixman_region32_fini(&opaque); + pixman_region32_fini(&geometry_region); pixman_region32_fini(&render_region); } |