[gtk/ngl-color-nineslice: 2/2] wip: Do nine-slicing for color nodes on the cpu
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/ngl-color-nineslice: 2/2] wip: Do nine-slicing for color nodes on the cpu
- Date: Tue, 9 Mar 2021 17:55:28 +0000 (UTC)
commit b94daba0f5082e9b4e6cb012ca1c816a9e26ae30
Author: Matthias Clasen <mclasen redhat com>
Date: Tue Mar 9 12:54:24 2021 -0500
wip: Do nine-slicing for color nodes on the cpu
This lets us use the clipless shader for all the
non-corner pixels.
There's still some rendering errors with this.
gsk/ngl/gsknglrenderjob.c | 94 ++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 88 insertions(+), 6 deletions(-)
---
diff --git a/gsk/ngl/gsknglrenderjob.c b/gsk/ngl/gsknglrenderjob.c
index bb91c336d8..349cfe8743 100644
--- a/gsk/ngl/gsknglrenderjob.c
+++ b/gsk/ngl/gsknglrenderjob.c
@@ -1380,12 +1380,94 @@ static inline void
gsk_ngl_render_job_visit_color_node (GskNglRenderJob *job,
const GskRenderNode *node)
{
- gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
- gsk_ngl_program_set_uniform_color (job->current_program,
- UNIFORM_COLOR_COLOR, 0,
- gsk_color_node_get_color (node));
- gsk_ngl_render_job_draw_rect (job, &node->bounds);
- gsk_ngl_render_job_end_draw (job);
+ if (gsk_rounded_rect_is_rectilinear (&job->current_clip->rect))
+ {
+ gsk_ngl_render_job_begin_draw (job, CHOOSE_PROGRAM (job, color));
+ gsk_ngl_program_set_uniform_color (job->current_program,
+ UNIFORM_COLOR_COLOR, 0,
+ gsk_color_node_get_color (node));
+ gsk_ngl_render_job_draw_rect (job, &node->bounds);
+ gsk_ngl_render_job_end_draw (job);
+ }
+ else
+ {
+ const graphene_rect_t *outer;
+ graphene_rect_t inner;
+ graphene_rect_t rect;
+
+ outer = &job->current_clip->rect.bounds;
+ rounded_rect_get_inner (&job->current_clip->rect, &inner);
+
+ gsk_ngl_render_job_begin_draw (job, job->driver->color);
+ gsk_ngl_program_set_uniform_color (job->current_program,
+ UNIFORM_COLOR_COLOR, 0,
+ gsk_color_node_get_color (node));
+
+ /* top left */
+ rect.origin.x = outer->origin.x;
+ rect.origin.y = outer->origin.y;
+ rect.size.width = inner.origin.x - outer->origin.x;
+ rect.size.height = inner.origin.y - outer->origin.y;
+ if (graphene_rect_intersection (&node->bounds, &rect, &rect))
+ gsk_ngl_render_job_draw_rect (job, &rect);
+
+ /* top right */
+ rect.origin.x = inner.origin.x + inner.size.width;
+ rect.origin.y = outer->origin.y;
+ rect.size.width = outer->origin.x + outer->size.width - (inner.origin.x + inner.size.width);
+ rect.size.height = inner.origin.y - outer->origin.y;
+ if (graphene_rect_intersection (&node->bounds, &rect, &rect))
+ gsk_ngl_render_job_draw_rect (job, &rect);
+
+ /* bottom right */
+ rect.origin.x = inner.origin.x + inner.size.width;
+ rect.origin.y = inner.origin.y + inner.size.height;
+ rect.size.width = outer->origin.x + outer->size.width - (inner.origin.x + inner.size.width);
+ rect.size.height = outer->origin.y + outer->size.height - (inner.origin.y + inner.size.height);
+ if (graphene_rect_intersection (&node->bounds, &rect, &rect))
+ gsk_ngl_render_job_draw_rect (job, &rect);
+
+ /* bottom left */
+ rect.origin.x = outer->origin.x;
+ rect.origin.y = inner.origin.y + inner.size.height;
+ rect.size.width = inner.origin.x - outer->origin.x;
+ rect.size.height = outer->origin.y + outer->size.height - (inner.origin.y + inner.size.height);
+ if (graphene_rect_intersection (&node->bounds, &rect, &rect))
+ gsk_ngl_render_job_draw_rect (job, &rect);
+
+ gsk_ngl_render_job_end_draw (job);
+
+ gsk_ngl_render_job_begin_draw (job, job->driver->color_no_clip);
+ gsk_ngl_program_set_uniform_color (job->current_program,
+ UNIFORM_COLOR_COLOR, 0,
+ gsk_color_node_get_color (node));
+
+ /* left side */
+ rect.origin.x = outer->origin.x;
+ rect.origin.y = inner.origin.y;
+ rect.size.width = inner.origin.x - outer->origin.x;
+ rect.size.height = inner.size.height;
+ if (graphene_rect_intersection (&node->bounds, &rect, &rect))
+ gsk_ngl_render_job_draw_rect (job, &rect);
+
+ /* center */
+ rect.origin.x = inner.origin.x;
+ rect.origin.y = outer->origin.y;
+ rect.size.width = inner.size.width;
+ rect.size.height = outer->size.height;
+ if (graphene_rect_intersection (&node->bounds, &rect, &rect))
+ gsk_ngl_render_job_draw_rect (job, &rect);
+
+ /* right side */
+ rect.origin.x = inner.origin.x + inner.size.width;
+ rect.origin.y = inner.origin.y;
+ rect.size.width = outer->origin.x + outer->size.width - (inner.origin.x + inner.size.width);
+ rect.size.height = inner.size.height;
+ if (graphene_rect_intersection (&node->bounds, &rect, &rect))
+ gsk_ngl_render_job_draw_rect (job, &rect);
+
+ gsk_ngl_render_job_end_draw (job);
+ }
}
static inline void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]