[gtk/ngl-cleanups] ngl: Small clipping improvements



commit 08d97394123f920f613c880d2c65c7617446bd1d
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Mar 14 00:59:43 2021 -0500

    ngl: Small clipping improvements
    
    Handle the fully contained cases for clip nodes.
    No need to intersect the clip in this case.

 gsk/ngl/gsknglrenderjob.c | 52 +++++++++++++++++++++++++++++++----------------
 1 file changed, 35 insertions(+), 17 deletions(-)
---
diff --git a/gsk/ngl/gsknglrenderjob.c b/gsk/ngl/gsknglrenderjob.c
index 335ca960c8..de822b5a7e 100644
--- a/gsk/ngl/gsknglrenderjob.c
+++ b/gsk/ngl/gsknglrenderjob.c
@@ -326,33 +326,36 @@ intersect_rounded_rectilinear (const graphene_rect_t *non_rounded,
 
   /* Intersects with top left corner? */
   corners[0] = rounded_rect_has_corner (rounded, 0) &&
-               rect_intersects (non_rounded,
-                                &rounded_rect_corner (rounded, 0));
-  /* top right? */
-  corners[1] = rounded_rect_has_corner (rounded, 1) &&
-               rect_intersects (non_rounded,
-                                &rounded_rect_corner (rounded, 1));
-  /* bottom right? */
-  corners[2] = rounded_rect_has_corner (rounded, 2) &&
-               rect_intersects (non_rounded,
-                                &rounded_rect_corner (rounded, 2));
-  /* bottom left */
-  corners[3] = rounded_rect_has_corner (rounded, 3) &&
-               rect_intersects (non_rounded,
-                                &rounded_rect_corner (rounded, 3));
+               rect_intersects (non_rounded, &rounded_rect_corner (rounded, 0));
 
   if (corners[0] && !rect_contains_rect (non_rounded, &rounded_rect_corner (rounded, 0)))
     return FALSE;
+
+  /* top right? */
+  corners[1] = rounded_rect_has_corner (rounded, 1) &&
+               rect_intersects (non_rounded, &rounded_rect_corner (rounded, 1));
+
   if (corners[1] && !rect_contains_rect (non_rounded, &rounded_rect_corner (rounded, 1)))
     return FALSE;
+
+  /* bottom right? */
+  corners[2] = rounded_rect_has_corner (rounded, 2) &&
+               rect_intersects (non_rounded, &rounded_rect_corner (rounded, 2));
+
   if (corners[2] && !rect_contains_rect (non_rounded, &rounded_rect_corner (rounded, 2)))
     return FALSE;
+
+  /* bottom left */
+  corners[3] = rounded_rect_has_corner (rounded, 3) &&
+               rect_intersects (non_rounded, &rounded_rect_corner (rounded, 3));
+
   if (corners[3] && !rect_contains_rect (non_rounded, &rounded_rect_corner (rounded, 3)))
     return FALSE;
 
   /* We do intersect with at least one of the corners, but in such a way that the
    * intersection between the two clips can still be represented by a single rounded
-   * rect in a trivial way. do that. */
+   * rect in a trivial way. Do that.
+   */
   graphene_rect_intersection (non_rounded, &rounded->bounds, &result->bounds);
 
   for (guint i = 0; i < 4; i++)
@@ -1472,7 +1475,15 @@ gsk_ngl_render_job_visit_clipped_child (GskNglRenderJob       *job,
 
   gsk_ngl_render_job_transform_bounds (job, clip, &transformed_clip);
 
-  if (job->current_clip->is_rectilinear)
+  if (job->current_clip->is_fully_contained)
+    {
+      memset (&intersection.corner, 0, sizeof intersection.corner);
+      memcpy (&intersection.bounds, &transformed_clip, sizeof intersection.bounds);
+      gsk_ngl_render_job_push_clip (job, &intersection);
+      gsk_ngl_render_job_visit_node (job, child);
+      gsk_ngl_render_job_pop_clip (job);
+    }
+  else if (job->current_clip->is_rectilinear)
     {
       memset (&intersection.corner, 0, sizeof intersection.corner);
       graphene_rect_intersection (&transformed_clip,
@@ -1553,7 +1564,14 @@ gsk_ngl_render_job_visit_rounded_clip_node (GskNglRenderJob     *job,
       transformed_clip.corner[i].height = clip->corner[i].height * scale_y;
     }
 
-  if (job->current_clip->is_rectilinear)
+  if (job->current_clip->is_fully_contained)
+    {
+      gsk_ngl_render_job_push_clip (job, &transformed_clip);
+      gsk_ngl_render_job_visit_node (job, child);
+      gsk_ngl_render_job_pop_clip (job);
+      return;
+    }
+  else if (job->current_clip->is_rectilinear)
     {
       GskRoundedRect intersected_clip;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]