diff options
author | famfo <[email protected]> | 2023-12-22 06:08:09 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2023-12-22 01:08:09 -0500 |
commit | ca42d414536c167f951e23bfc50d5edabb6f9dc2 (patch) | |
tree | 989ef953da5cc98a826de4bf19dc2aad34d8f1be /sway/desktop | |
parent | 5e866d0345449f34ac51c6590a3aac285cb2f8bf (diff) |
Implement shadow_offset (#255)
Diffstat (limited to 'sway/desktop')
-rw-r--r-- | sway/desktop/fx_renderer/fx_renderer.c | 14 | ||||
-rw-r--r-- | sway/desktop/output.c | 4 | ||||
-rw-r--r-- | sway/desktop/render.c | 32 |
3 files changed, 25 insertions, 25 deletions
diff --git a/sway/desktop/fx_renderer/fx_renderer.c b/sway/desktop/fx_renderer/fx_renderer.c index 07758325..7196bb0e 100644 --- a/sway/desktop/fx_renderer/fx_renderer.c +++ b/sway/desktop/fx_renderer/fx_renderer.c @@ -799,8 +799,8 @@ void fx_render_stencil_mask(struct fx_renderer *renderer, const struct wlr_box * // TODO: alpha input arg? void fx_render_box_shadow(struct fx_renderer *renderer, const struct wlr_box *box, - const float color[static 4], const float matrix[static 9], int corner_radius, - float blur_sigma) { + const struct wlr_box *inner_box, const float color[static 4], + const float matrix[static 9], int corner_radius, float blur_sigma) { if (box->width == 0 || box->height == 0) { return; } @@ -821,17 +821,9 @@ void fx_render_box_shadow(struct fx_renderer *renderer, const struct wlr_box *bo wlr_matrix_transpose(gl_matrix, gl_matrix); - // Init stencil work - struct wlr_box inner_box; - memcpy(&inner_box, box, sizeof(struct wlr_box)); - inner_box.x += blur_sigma; - inner_box.y += blur_sigma; - inner_box.width -= blur_sigma * 2; - inner_box.height -= blur_sigma * 2; - fx_renderer_stencil_mask_init(); // Draw the rounded rect as a mask - fx_render_stencil_mask(renderer, &inner_box, matrix, corner_radius); + fx_render_stencil_mask(renderer, inner_box, matrix, corner_radius); fx_renderer_stencil_mask_close(false); // blending will practically always be needed (unless we have a madman diff --git a/sway/desktop/output.c b/sway/desktop/output.c index c41088ac..ca883144 100644 --- a/sway/desktop/output.c +++ b/sway/desktop/output.c @@ -758,8 +758,8 @@ void output_damage_whole_container(struct sway_output *output, // Pad the box by 1px, because the width is a double and might be a fraction struct wlr_box box = { - .x = con->current.x - output->lx - 1 - shadow_sigma, - .y = con->current.y - output->ly - 1 - shadow_sigma, + .x = con->current.x - output->lx - 1 - shadow_sigma + config->shadow_offset_x, + .y = con->current.y - output->ly - 1 - shadow_sigma + config->shadow_offset_y, .width = con->current.width + 2 + shadow_sigma * 2, .height = con->current.height + 2 + shadow_sigma * 2, }; diff --git a/sway/desktop/render.c b/sway/desktop/render.c index fba13b37..c054b3a5 100644 --- a/sway/desktop/render.c +++ b/sway/desktop/render.c @@ -342,15 +342,15 @@ damage_finish: // _box.x and .y are expected to be layout-local // _box.width and .height are expected to be output-buffer-local void render_box_shadow(struct sway_output *output, pixman_region32_t *output_damage, - const struct wlr_box *_box, const float color[static 4], - float blur_sigma, float corner_radius) { + const struct wlr_box *_box, const float color[static 4], float blur_sigma, + float corner_radius, float offset_x, float offset_y) { struct wlr_output *wlr_output = output->wlr_output; struct fx_renderer *renderer = output->renderer; struct wlr_box box; memcpy(&box, _box, sizeof(struct wlr_box)); - box.x -= blur_sigma; - box.y -= blur_sigma; + box.x -= blur_sigma - offset_x; + box.y -= blur_sigma - offset_y; box.width += 2 * blur_sigma; box.height += 2 * blur_sigma; @@ -365,6 +365,7 @@ void render_box_shadow(struct sway_output *output, pixman_region32_t *output_dam inner_box.height -= 2 * corner_radius; pixman_region32_t inner_damage = create_damage(inner_box, output_damage); pixman_region32_subtract(&damage, &damage, &inner_damage); + pixman_region32_fini(&inner_damage); bool damaged = pixman_region32_not_empty(&damage); if (!damaged) { @@ -375,20 +376,23 @@ void render_box_shadow(struct sway_output *output, pixman_region32_t *output_dam wlr_matrix_project_box(matrix, &box, WL_OUTPUT_TRANSFORM_NORMAL, 0, wlr_output->transform_matrix); - // ensure the box is updated as per the output orientation - struct wlr_box transformed_box; int width, height; wlr_output_transformed_resolution(wlr_output, &width, &height); - wlr_box_transform(&transformed_box, &box, - wlr_output_transform_invert(wlr_output->transform), width, height); + enum wl_output_transform transform = wlr_output_transform_invert(wlr_output->transform); + // ensure the shadow_box is updated as per the output orientation + struct wlr_box transformed_shadow_box; + wlr_box_transform(&transformed_shadow_box, &box, transform, width, height); + // ensure the box is updated as per the output orientation + struct wlr_box transformed_box; + wlr_box_transform(&transformed_box, _box, transform, width, height); int nrects; pixman_box32_t *rects = pixman_region32_rectangles(&damage, &nrects); for (int i = 0; i < nrects; ++i) { scissor_output(wlr_output, &rects[i]); - fx_render_box_shadow(renderer, &transformed_box, color, matrix, - corner_radius, blur_sigma); + fx_render_box_shadow(renderer, &transformed_shadow_box, &transformed_box, + color, matrix, corner_radius, blur_sigma); } damage_finish: @@ -488,9 +492,11 @@ static void render_layer_iterator(struct sway_output *output, // render shadow if (deco_data.shadow && config_should_parameters_shadow()) { int corner_radius = deco_data.corner_radius *= output->wlr_output->scale; + int offset_x = config->shadow_offset_x * output->wlr_output->scale; + int offset_y = config->shadow_offset_y * output->wlr_output->scale; scale_box(_box, output->wlr_output->scale); render_box_shadow(output, data->damage, _box, config->shadow_color, - config->shadow_blur_sigma, corner_radius); + config->shadow_blur_sigma, corner_radius, offset_x, offset_y); } } @@ -886,8 +892,10 @@ static void render_view(struct sway_output *output, pixman_region32_t *damage, 0 : (deco_data.corner_radius + state->border_thickness) * output_scale; float* shadow_color = view_is_urgent(view) || state->focused ? config->shadow_color : config->shadow_inactive_color; + int offset_x = config->shadow_offset_x * output->wlr_output->scale; + int offset_y = config->shadow_offset_y * output->wlr_output->scale; render_box_shadow(output, damage, &box, shadow_color, config->shadow_blur_sigma, - scaled_corner_radius); + scaled_corner_radius, offset_x, offset_y); } if (state->border == B_NONE || state->border == B_CSD) { |