}
}
+gboolean
+gsk_vulkan_clip_intersects_rect (const GskVulkanClip *self,
+ const graphene_point_t *offset,
+ const graphene_rect_t *rect)
+{
+ graphene_rect_t r = *rect;
+ r.origin.x += offset->x;
+ r.origin.y += offset->y;
+
+ switch (self->type)
+ {
+ default:
+ g_assert_not_reached();
+ case GSK_VULKAN_CLIP_ALL_CLIPPED:
+ return FALSE;
+
+ case GSK_VULKAN_CLIP_NONE:
+ return TRUE;
+
+ case GSK_VULKAN_CLIP_RECT:
+ return graphene_rect_intersection (&self->rect.bounds, &r, NULL);
+
+ case GSK_VULKAN_CLIP_ROUNDED_CIRCULAR:
+ case GSK_VULKAN_CLIP_ROUNDED:
+ return gsk_rounded_rect_intersects_rect (&self->rect, &r);
+ }
+}
+
gboolean
gsk_vulkan_clip_contains_rect (const GskVulkanClip *self,
const graphene_point_t *offset,
gboolean gsk_vulkan_clip_contains_rect (const GskVulkanClip *self,
const graphene_point_t *offset,
const graphene_rect_t *rect) G_GNUC_WARN_UNUSED_RESULT;
+gboolean gsk_vulkan_clip_intersects_rect (const GskVulkanClip *self,
+ const graphene_point_t *offset,
+ const graphene_rect_t *rect) G_GNUC_WARN_UNUSED_RESULT;
G_END_DECLS
const GskVulkanParseState *state,
GskRenderNode *node)
{
+ if (!gsk_vulkan_clip_intersects_rect (&state->clip, &state->offset, &node->bounds))
+ return TRUE;
+
for (guint i = 0; i < gsk_container_node_get_n_children (node); i++)
gsk_vulkan_render_pass_add_node (self, render, state, gsk_container_node_get_child (node, i));