[gtk/ngl-less-shaders: 5/13] ngl: Special-case CSS backgrounds
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/ngl-less-shaders: 5/13] ngl: Special-case CSS backgrounds
- Date: Sun, 14 Mar 2021 16:35:59 +0000 (UTC)
commit c5640637b8585b950505234b68e44d6a01a0798a
Author: Matthias Clasen <mclasen redhat com>
Date: Tue Mar 9 18:54:29 2021 -0500
ngl: Special-case CSS backgrounds
Recognize the rounded-clip-with-color-inside situation
and do manual nine-slicing for it to minimize the number
of pixels send through clipping shaders.
gsk/ngl/gsknglrenderjob.c | 95 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 95 insertions(+)
---
diff --git a/gsk/ngl/gsknglrenderjob.c b/gsk/ngl/gsknglrenderjob.c
index 4ee39ca36b..a008d6ff19 100644
--- a/gsk/ngl/gsknglrenderjob.c
+++ b/gsk/ngl/gsknglrenderjob.c
@@ -1531,6 +1531,91 @@ gsk_ngl_render_job_visit_clip_node (GskNglRenderJob *job,
gsk_ngl_render_job_visit_clipped_child (job, child, clip);
}
+static inline void
+gsk_ngl_render_job_visit_rounded_color_node (GskNglRenderJob *job,
+ const GskRenderNode *node)
+{
+ const GskRenderNode *child = gsk_rounded_clip_node_get_child (node);
+ const GskRoundedRect *clip = gsk_rounded_clip_node_get_clip (node);
+ const GdkRGBA *color = gsk_color_node_get_color (child);
+ const graphene_rect_t *outer;
+ graphene_rect_t inner;
+ float x, y;
+
+ outer = &node->bounds;
+ rounded_rect_get_inner (clip, &inner);
+ graphene_rect_intersection (outer, &inner, &inner);
+
+ gsk_ngl_render_job_begin_draw (job, job->driver->color);
+
+ /* top left */
+ gsk_ngl_render_job_draw_rect_with_color (job,
+ &GRAPHENE_RECT_INIT (outer->origin.x,
+ outer->origin.y,
+ inner.origin.x - outer->origin.x,
+ inner.origin.y - outer->origin.y),
+ color);
+
+ /* top right */
+ x = inner.origin.x + inner.size.width;
+ gsk_ngl_render_job_draw_rect_with_color (job,
+ &GRAPHENE_RECT_INIT (x,
+ outer->origin.y,
+ outer->origin.x + outer->size.width - x,
+ inner.origin.y - outer->origin.y),
+ color);
+
+ /* bottom right */
+ x = inner.origin.x + inner.size.width;
+ y = inner.origin.y + inner.size.height;
+ gsk_ngl_render_job_draw_rect_with_color (job,
+ &GRAPHENE_RECT_INIT (x,
+ y,
+ outer->origin.x + outer->size.width - x,
+ outer->origin.y + outer->size.width - y),
+ color);
+
+ /* bottom left */
+ y = inner.origin.y + inner.size.height;
+ gsk_ngl_render_job_draw_rect_with_color (job,
+ &GRAPHENE_RECT_INIT (outer->origin.x,
+ y,
+ inner.origin.x - outer->origin.x,
+ outer->origin.y + outer->size.height - y),
+ color);
+
+ gsk_ngl_render_job_end_draw (job);
+
+ gsk_ngl_render_job_begin_draw (job, job->driver->color_no_clip);
+
+ /* left side */
+ gsk_ngl_render_job_draw_rect_with_color (job,
+ &GRAPHENE_RECT_INIT (outer->origin.x,
+ inner.origin.y,
+ inner.origin.x - outer->origin.x,
+ inner.size.height),
+ color);
+
+ /* center */
+ gsk_ngl_render_job_draw_rect_with_color (job,
+ &GRAPHENE_RECT_INIT (inner.origin.x,
+ outer->origin.y,
+ inner.size.width,
+ outer->size.height),
+ color);
+
+ /* right side */
+ x = inner.origin.x + inner.size.width;
+ gsk_ngl_render_job_draw_rect_with_color (job,
+ &GRAPHENE_RECT_INIT (x,
+ inner.origin.y,
+ outer->origin.x + outer->size.width - x,
+ inner.size.height),
+ color);
+
+ gsk_ngl_render_job_end_draw (job);
+}
+
static inline void
gsk_ngl_render_job_visit_rounded_clip_node (GskNglRenderJob *job,
const GskRenderNode *node)
@@ -1553,6 +1638,16 @@ gsk_ngl_render_job_visit_rounded_clip_node (GskNglRenderJob *job,
transformed_clip.corner[i].height = clip->corner[i].height * scale_y;
}
+ if (gsk_render_node_get_node_type (child) == GSK_COLOR_NODE &&
+ job->current_clip->is_fully_contained)
+ {
+ /* special-case CSS backgrounds */
+ gsk_ngl_render_job_push_clip (job, &transformed_clip);
+ gsk_ngl_render_job_visit_rounded_color_node (job, node);
+ gsk_ngl_render_job_pop_clip (job);
+ return;
+ }
+
if (job->current_clip->is_rectilinear)
{
GskRoundedRect intersected_clip;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]