[gtk/ngl-color-nineslice: 2/2] wip: Do nine-slicing for color nodes on the cpu




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]