[gtk/matthiasc/for-master: 4/5] ngl: Small optimization for shadows
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/matthiasc/for-master: 4/5] ngl: Small optimization for shadows
- Date: Sun, 11 Apr 2021 16:54:45 +0000 (UTC)
commit 6bfb57db16850b229f4c8339b9306de5ca3a7650
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Apr 10 11:23:06 2021 -0400
ngl: Small optimization for shadows
When 9-slicing shadows, omit the center tile when it is
entirely contained in the outline (that is not always
the case, depending on corners and offsets).
gsk/ngl/gsknglrenderjob.c | 100 +++++++++++++++++++++++++---------------------
1 file changed, 54 insertions(+), 46 deletions(-)
---
diff --git a/gsk/ngl/gsknglrenderjob.c b/gsk/ngl/gsknglrenderjob.c
index 7c684164f3..24af932e1f 100644
--- a/gsk/ngl/gsknglrenderjob.c
+++ b/gsk/ngl/gsknglrenderjob.c
@@ -2458,6 +2458,8 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
return;
}
+ /* slicing */
+
gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, outset_shadow));
gsk_ngl_program_set_uniform_texture (job->current_program,
UNIFORM_SHARED_SOURCE, 0,
@@ -2476,6 +2478,8 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
float max_y = ceilf (outline->bounds.origin.y + outline->bounds.size.height +
half_blur_extra + dy + spread);
const GskNglTextureNineSlice *slices;
+ float left_width, center_width, right_width;
+ float top_height, center_height, bottom_height;
GskNglTexture *texture;
texture = gsk_ngl_driver_get_texture_by_id (job->driver, blurred_texture_id);
@@ -2486,14 +2490,23 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
/* Our texture coordinates MUST be scaled, while the actual vertex coords
* MUST NOT be scaled. */
+ left_width = slices[NINE_SLICE_TOP_LEFT].rect.width / scale_x;
+ right_width = slices[NINE_SLICE_TOP_RIGHT].rect.width / scale_x;
+ center_width = (max_x - min_x) - (left_width + right_width);
+
+ top_height = slices[NINE_SLICE_TOP_LEFT].rect.height / scale_y;
+ bottom_height = slices[NINE_SLICE_BOTTOM_LEFT].rect.height / scale_y;
+ center_height = (max_y - min_y) - (top_height + bottom_height);
+
/* Top left */
if (nine_slice_is_visible (&slices[NINE_SLICE_TOP_LEFT]))
{
memcpy (&offscreen.area, &slices[NINE_SLICE_TOP_LEFT].area, sizeof offscreen.area);
gsk_ngl_render_job_draw_offscreen_with_color (job,
- &GRAPHENE_RECT_INIT (min_x, min_y,
-
slices[NINE_SLICE_TOP_LEFT].rect.width / scale_x,
-
slices[NINE_SLICE_TOP_LEFT].rect.height / scale_y),
+ &GRAPHENE_RECT_INIT (min_x,
+ min_y,
+ left_width,
+ top_height),
&offscreen,
color);
}
@@ -2502,13 +2515,11 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
if (nine_slice_is_visible (&slices[NINE_SLICE_TOP_CENTER]))
{
memcpy (&offscreen.area, &slices[NINE_SLICE_TOP_CENTER].area, sizeof offscreen.area);
- float width = (max_x - min_x) - (slices[NINE_SLICE_TOP_LEFT].rect.width / scale_x +
- slices[NINE_SLICE_TOP_RIGHT].rect.width / scale_x);
gsk_ngl_render_job_draw_offscreen_with_color (job,
- &GRAPHENE_RECT_INIT (min_x +
(slices[NINE_SLICE_TOP_LEFT].rect.width / scale_x),
+ &GRAPHENE_RECT_INIT (min_x + left_width,
min_y,
- width,
-
slices[NINE_SLICE_TOP_CENTER].rect.height / scale_y),
+ center_width,
+ top_height),
&offscreen,
color);
}
@@ -2518,10 +2529,10 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
{
memcpy (&offscreen.area, &slices[NINE_SLICE_TOP_RIGHT].area, sizeof offscreen.area);
gsk_ngl_render_job_draw_offscreen_with_color (job,
- &GRAPHENE_RECT_INIT (max_x -
(slices[NINE_SLICE_TOP_RIGHT].rect.width / scale_x),
+ &GRAPHENE_RECT_INIT (max_x - right_width,
min_y,
-
slices[NINE_SLICE_TOP_RIGHT].rect.width / scale_x,
-
slices[NINE_SLICE_TOP_RIGHT].rect.height / scale_y),
+ right_width,
+ top_height),
&offscreen,
color);
}
@@ -2531,10 +2542,10 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
{
memcpy (&offscreen.area, &slices[NINE_SLICE_BOTTOM_RIGHT].area, sizeof offscreen.area);
gsk_ngl_render_job_draw_offscreen_with_color (job,
- &GRAPHENE_RECT_INIT (max_x -
(slices[NINE_SLICE_BOTTOM_RIGHT].rect.width / scale_x),
- max_y -
(slices[NINE_SLICE_BOTTOM_RIGHT].rect.height / scale_y),
-
slices[NINE_SLICE_BOTTOM_RIGHT].rect.width / scale_x,
-
slices[NINE_SLICE_BOTTOM_RIGHT].rect.height / scale_y),
+ &GRAPHENE_RECT_INIT (max_x - right_width,
+ max_y - bottom_height,
+ right_width,
+ bottom_height),
&offscreen,
color);
}
@@ -2545,9 +2556,9 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
memcpy (&offscreen.area, &slices[NINE_SLICE_BOTTOM_LEFT].area, sizeof offscreen.area);
gsk_ngl_render_job_draw_offscreen_with_color (job,
&GRAPHENE_RECT_INIT (min_x,
- max_y -
(slices[NINE_SLICE_BOTTOM_LEFT].rect.height / scale_y),
-
slices[NINE_SLICE_BOTTOM_LEFT].rect.width / scale_x,
-
slices[NINE_SLICE_BOTTOM_LEFT].rect.height / scale_y),
+ max_y - bottom_height,
+ left_width,
+ bottom_height),
&offscreen,
color);
}
@@ -2556,13 +2567,11 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
if (nine_slice_is_visible (&slices[NINE_SLICE_LEFT_CENTER]))
{
memcpy (&offscreen.area, &slices[NINE_SLICE_LEFT_CENTER].area, sizeof offscreen.area);
- float height = (max_y - min_y) - (slices[NINE_SLICE_TOP_LEFT].rect.height / scale_y +
- slices[NINE_SLICE_BOTTOM_LEFT].rect.height / scale_y);
gsk_ngl_render_job_draw_offscreen_with_color (job,
&GRAPHENE_RECT_INIT (min_x,
- min_y +
(slices[NINE_SLICE_TOP_LEFT].rect.height / scale_y),
-
slices[NINE_SLICE_LEFT_CENTER].rect.width / scale_x,
- height),
+ min_y + top_height,
+ left_width,
+ center_height),
&offscreen,
color);
}
@@ -2571,13 +2580,11 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
if (nine_slice_is_visible (&slices[NINE_SLICE_RIGHT_CENTER]))
{
memcpy (&offscreen.area, &slices[NINE_SLICE_RIGHT_CENTER].area, sizeof offscreen.area);
- float height = (max_y - min_y) - (slices[NINE_SLICE_TOP_RIGHT].rect.height / scale_y +
- slices[NINE_SLICE_BOTTOM_RIGHT].rect.height / scale_y);
gsk_ngl_render_job_draw_offscreen_with_color (job,
- &GRAPHENE_RECT_INIT (max_x -
(slices[NINE_SLICE_RIGHT_CENTER].rect.width / scale_x),
- min_y +
(slices[NINE_SLICE_TOP_LEFT].rect.height / scale_y),
-
slices[NINE_SLICE_RIGHT_CENTER].rect.width / scale_x,
- height),
+ &GRAPHENE_RECT_INIT (max_x - right_width,
+ min_y + top_height,
+ right_width,
+ center_height),
&offscreen,
color);
}
@@ -2586,13 +2593,11 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
if (nine_slice_is_visible (&slices[NINE_SLICE_BOTTOM_CENTER]))
{
memcpy (&offscreen.area, &slices[NINE_SLICE_BOTTOM_CENTER].area, sizeof offscreen.area);
- float width = (max_x - min_x) - (slices[NINE_SLICE_BOTTOM_LEFT].rect.width / scale_x +
- slices[NINE_SLICE_BOTTOM_RIGHT].rect.width / scale_x);
gsk_ngl_render_job_draw_offscreen_with_color (job,
- &GRAPHENE_RECT_INIT (min_x +
(slices[NINE_SLICE_BOTTOM_LEFT].rect.width / scale_x),
- max_y -
(slices[NINE_SLICE_BOTTOM_CENTER].rect.height / scale_y),
- width,
-
slices[NINE_SLICE_BOTTOM_CENTER].rect.height / scale_y),
+ &GRAPHENE_RECT_INIT (min_x + left_width,
+ max_y - bottom_height,
+ center_width,
+ bottom_height),
&offscreen,
color);
}
@@ -2600,17 +2605,20 @@ gsk_ngl_render_job_visit_blurred_outset_shadow_node (GskNglRenderJob *job,
/* Middle */
if (nine_slice_is_visible (&slices[NINE_SLICE_CENTER]))
{
- memcpy (&offscreen.area, &slices[NINE_SLICE_CENTER].area, sizeof offscreen.area);
- float width = (max_x - min_x) - (slices[NINE_SLICE_LEFT_CENTER].rect.width / scale_x +
- slices[NINE_SLICE_RIGHT_CENTER].rect.width / scale_x);
- float height = (max_y - min_y) - (slices[NINE_SLICE_TOP_CENTER].rect.height / scale_y +
- slices[NINE_SLICE_BOTTOM_CENTER].rect.height / scale_y);
- gsk_ngl_render_job_draw_offscreen_with_color (job,
- &GRAPHENE_RECT_INIT (min_x +
(slices[NINE_SLICE_LEFT_CENTER].rect.width / scale_x),
- min_y +
(slices[NINE_SLICE_TOP_CENTER].rect.height / scale_y),
- width, height),
- &offscreen,
- color);
+ if (!gsk_rounded_rect_contains_rect (outline, &GRAPHENE_RECT_INIT (min_x + left_width,
+ min_y + top_height,
+ center_width,
+ center_height)))
+ {
+ memcpy (&offscreen.area, &slices[NINE_SLICE_CENTER].area, sizeof offscreen.area);
+ gsk_ngl_render_job_draw_offscreen_with_color (job,
+ &GRAPHENE_RECT_INIT (min_x + left_width,
+ min_y + top_height,
+ center_width,
+ center_height),
+ &offscreen,
+ color);
+ }
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]