From 37f53a42da12ece4b0024b2227a5d6dcd82b3cb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Mon, 25 Feb 2019 15:42:51 +0100 Subject: [PATCH] st: Create shadow pipeline taking resource scale in account The shadow pipeline is created doing software blurring of the texture so the shadow spec blur parameter should be scaled accordingly with the texture scaling otherwise we won't take enough pixels in account creating stronger shadows. https://bugzilla.gnome.org/show_bug.cgi?id=765011 https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/5 --- src/st/st-private.c | 11 +++++++---- src/st/st-private.h | 3 ++- src/st/st-theme-node-drawing.c | 14 +++++++++----- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/st/st-private.c b/src/st/st-private.c index a74368709..895e33b1e 100644 --- a/src/st/st-private.c +++ b/src/st/st-private.c @@ -359,7 +359,8 @@ blur_pixels (guchar *pixels_in, CoglPipeline * _st_create_shadow_pipeline (StShadow *shadow_spec, - CoglTexture *src_texture) + CoglTexture *src_texture, + float resource_scale) { ClutterBackend *backend = clutter_get_default_backend (); CoglContext *ctx = clutter_backend_get_cogl_context (backend); @@ -386,7 +387,7 @@ _st_create_shadow_pipeline (StShadow *shadow_spec, rowstride_in, pixels_in); pixels_out = blur_pixels (pixels_in, width_in, height_in, rowstride_in, - shadow_spec->blur, + shadow_spec->blur * resource_scale, &width_out, &height_out, &rowstride_out); g_free (pixels_in); @@ -456,7 +457,8 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec, if (texture && cogl_texture_get_width (texture) == width && cogl_texture_get_height (texture) == height) - shadow_pipeline = _st_create_shadow_pipeline (shadow_spec, texture); + shadow_pipeline = _st_create_shadow_pipeline (shadow_spec, texture, + resource_scale); } if (shadow_pipeline == NULL) @@ -510,7 +512,8 @@ _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec, cogl_object_unref (fb); - shadow_pipeline = _st_create_shadow_pipeline (shadow_spec, buffer); + shadow_pipeline = _st_create_shadow_pipeline (shadow_spec, buffer, + resource_scale); cogl_object_unref (buffer); } diff --git a/src/st/st-private.h b/src/st/st-private.h index f88f93009..0f3cb2f2c 100644 --- a/src/st/st-private.h +++ b/src/st/st-private.h @@ -63,7 +63,8 @@ CoglPipeline * _st_create_texture_pipeline (CoglTexture *src_texture); /* Helper for widgets which need to draw additional shadows */ CoglPipeline * _st_create_shadow_pipeline (StShadow *shadow_spec, - CoglTexture *src_texture); + CoglTexture *src_texture, + float resource_scale); CoglPipeline * _st_create_shadow_pipeline_from_actor (StShadow *shadow_spec, ClutterActor *actor); cairo_pattern_t *_st_create_shadow_cairo_pattern (StShadow *shadow_spec, diff --git a/src/st/st-theme-node-drawing.c b/src/st/st-theme-node-drawing.c index 7db928a0d..3aaba3424 100644 --- a/src/st/st-theme-node-drawing.c +++ b/src/st/st-theme-node-drawing.c @@ -1422,7 +1422,8 @@ st_theme_node_load_background_image (StThemeNode *node) if (background_image_shadow_spec) { node->background_shadow_pipeline = _st_create_shadow_pipeline (background_image_shadow_spec, - node->background_texture); + node->background_texture, + resource_scale); } } @@ -1561,10 +1562,12 @@ st_theme_node_render_resources (StThemeNodePaintState *state, { if (st_theme_node_load_border_image (node)) state->box_shadow_pipeline = _st_create_shadow_pipeline (box_shadow_spec, - node->border_slices_texture); + node->border_slices_texture, + state->resource_scale); else if (state->prerendered_texture != NULL) state->box_shadow_pipeline = _st_create_shadow_pipeline (box_shadow_spec, - state->prerendered_texture); + state->prerendered_texture, + state->resource_scale); else if (node->background_color.alpha > 0 || has_border) st_theme_node_prerender_shadow (state); } @@ -1636,7 +1639,8 @@ st_theme_node_update_resources (StThemeNodePaintState *state, if (had_box_shadow) state->box_shadow_pipeline = _st_create_shadow_pipeline (box_shadow_spec, - state->prerendered_texture); + state->prerendered_texture, + state->resource_scale); } static void @@ -2330,7 +2334,7 @@ st_theme_node_prerender_shadow (StThemeNodePaintState *state) st_theme_node_paint_borders (state, offscreen, &box, 0xFF); state->box_shadow_pipeline = _st_create_shadow_pipeline (st_theme_node_get_box_shadow (node), - buffer); + buffer, state->resource_scale); } else {