diff options
author | Benjamin Otte <otte@redhat.com> | 2023-05-15 01:56:10 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2023-05-17 02:25:32 +0200 |
commit | fef7529b6c2c9a0f48a8ce2e62d84c22763c4380 (patch) | |
tree | 4edd3a0dc6556f376f0fd520a28202535d037d42 | |
parent | ad40e5f63bf8a726ce292871fa9ee9df316da159 (diff) | |
download | gtk+-fef7529b6c2c9a0f48a8ce2e62d84c22763c4380.tar.gz |
vulkan: Use rounded rect APIs to improve clips
There are a bunch of intersection APIs available these days.
Let's use them.
-rw-r--r-- | gsk/vulkan/gskvulkanclip.c | 68 |
1 files changed, 34 insertions, 34 deletions
diff --git a/gsk/vulkan/gskvulkanclip.c b/gsk/vulkan/gskvulkanclip.c index 61e02bbf6f..a66bfaa261 100644 --- a/gsk/vulkan/gskvulkanclip.c +++ b/gsk/vulkan/gskvulkanclip.c @@ -29,11 +29,32 @@ gsk_vulkan_clip_init_copy (GskVulkanClip *self, gsk_rounded_rect_init_copy (&self->rect, &src->rect); } +static gboolean +gsk_vulkan_clip_init_after_intersection (GskVulkanClip *self, + GskRoundedRectIntersection res) +{ + if (res == GSK_INTERSECTION_NOT_REPRESENTABLE) + return FALSE; + + if (res == GSK_INTERSECTION_EMPTY) + self->type = GSK_VULKAN_CLIP_ALL_CLIPPED; + else if (gsk_rounded_rect_is_rectilinear (&self->rect)) + self->type = GSK_VULKAN_CLIP_RECT; + else if (gsk_rounded_rect_is_circular (&self->rect)) + self->type = GSK_VULKAN_CLIP_ROUNDED_CIRCULAR; + else + self->type = GSK_VULKAN_CLIP_ROUNDED; + + return TRUE; +} + gboolean gsk_vulkan_clip_intersect_rect (GskVulkanClip *dest, const GskVulkanClip *src, const graphene_rect_t *rect) { + GskRoundedRectIntersection res; + if (graphene_rect_contains_rect (rect, &src->rect.bounds)) { gsk_vulkan_clip_init_copy (dest, src); @@ -67,20 +88,9 @@ gsk_vulkan_clip_intersect_rect (GskVulkanClip *dest, case GSK_VULKAN_CLIP_ROUNDED_CIRCULAR: case GSK_VULKAN_CLIP_ROUNDED: - if (gsk_rounded_rect_contains_rect (&src->rect, rect)) - { - dest->type = GSK_VULKAN_CLIP_RECT; - gsk_rounded_rect_init_from_rect (&dest->rect, rect, 0); - } - else - { - /* some points of rect are inside src's rounded rect, - * some are outside. */ - /* XXX: If the 2 rects don't intersect on rounded corners, - * we could actually compute a new clip here. - */ - return FALSE; - } + res = gsk_rounded_rect_intersect_with_rect (&src->rect, rect, &dest->rect); + if (!gsk_vulkan_clip_init_after_intersection (dest, res)) + return FALSE; break; default: @@ -96,6 +106,8 @@ gsk_vulkan_clip_intersect_rounded_rect (GskVulkanClip *dest, const GskVulkanClip *src, const GskRoundedRect *rounded) { + GskRoundedRectIntersection res; + if (gsk_rounded_rect_contains_rect (rounded, &src->rect.bounds)) { gsk_vulkan_clip_init_copy (dest, src); @@ -119,29 +131,17 @@ gsk_vulkan_clip_intersect_rounded_rect (GskVulkanClip *dest, break; case GSK_VULKAN_CLIP_RECT: - if (graphene_rect_contains_rect (&src->rect.bounds, &rounded->bounds)) - { - dest->type = gsk_rounded_rect_is_circular (rounded) ? GSK_VULKAN_CLIP_ROUNDED_CIRCULAR : GSK_VULKAN_CLIP_ROUNDED; - gsk_rounded_rect_init_copy (&dest->rect, rounded); - return TRUE; - } - /* some points of rect are inside src's rounded rect, - * some are outside. */ - /* XXX: If the 2 rects don't intersect on rounded corners, - * we could actually compute a new clip here. - */ - return FALSE; + res = gsk_rounded_rect_intersect_with_rect (rounded, &src->rect.bounds, &dest->rect); + if (!gsk_vulkan_clip_init_after_intersection (dest, res)) + return FALSE; + break; case GSK_VULKAN_CLIP_ROUNDED_CIRCULAR: case GSK_VULKAN_CLIP_ROUNDED: - if (gsk_rounded_rect_contains_rect (&src->rect, &rounded->bounds)) - { - dest->type = gsk_rounded_rect_is_circular (rounded) ? GSK_VULKAN_CLIP_ROUNDED_CIRCULAR : GSK_VULKAN_CLIP_ROUNDED; - gsk_rounded_rect_init_copy (&dest->rect, rounded); - return TRUE; - } - /* XXX: Can be improved for the case where one of the rects is a slightly shrunk version of the other */ - return FALSE; + res = gsk_rounded_rect_intersection (&src->rect, rounded, &dest->rect); + if (!gsk_vulkan_clip_init_after_intersection (dest, res)) + return FALSE; + break; default: g_assert_not_reached (); |