summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-07-23 10:19:16 -0400
committerMatthias Clasen <mclasen@redhat.com>2021-07-24 18:48:09 -0400
commit466d33ca6981e25cb9a249c64eccd1a4a47d4905 (patch)
treea7f62e01daa9d44754fa8a509c1780fa124b0009
parentd44ce1987dbac3ca157cd4cf84bef9aa225d7ce0 (diff)
downloadgtk+-466d33ca6981e25cb9a249c64eccd1a4a47d4905.tar.gz
ngl: Speed up clipping calculations a bit
Exit as early as possible from intersect_rounded_rectilinear.
-rw-r--r--gsk/ngl/gsknglrenderjob.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/gsk/ngl/gsknglrenderjob.c b/gsk/ngl/gsknglrenderjob.c
index 72efcae92a..49ad277401 100644
--- a/gsk/ngl/gsknglrenderjob.c
+++ b/gsk/ngl/gsknglrenderjob.c
@@ -347,31 +347,38 @@ intersect_rounded_rectilinear (const graphene_rect_t *non_rounded,
corners[0] = rounded_rect_has_corner (rounded, 0) &&
rect_intersects (non_rounded,
&rounded_rect_corner (rounded, 0));
- /* top right? */
+ 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));
- /* bottom right? */
+ 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));
- /* bottom left */
+ 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[0] && !rect_contains_rect (non_rounded, &rounded_rect_corner (rounded, 0)))
- return FALSE;
- if (corners[1] && !rect_contains_rect (non_rounded, &rounded_rect_corner (rounded, 1)))
- return FALSE;
- if (corners[2] && !rect_contains_rect (non_rounded, &rounded_rect_corner (rounded, 2)))
- return FALSE;
- if (corners[3] && !rect_contains_rect (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++)