[gtk/ngl-cleanups] ngl: Small clipping improvements
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/ngl-cleanups] ngl: Small clipping improvements
- Date: Sun, 14 Mar 2021 06:00:55 +0000 (UTC)
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]