cairo_status_t _cairo_clip_intersect_to_rectangle (cairo_clip_t *clip, cairo_rectangle_int_t *rectangle) { if (!clip) return CAIRO_STATUS_SUCCESS; if (clip->all_clipped) { *rectangle = clip->surface_rect; return CAIRO_STATUS_SUCCESS; } if (clip->path) { cairo_status_t status; status = _cairo_clip_path_intersect_to_rectangle (clip->path, rectangle); if (status) return status; } if (clip->has_region) { cairo_status_t status = CAIRO_STATUS_SUCCESS; cairo_region_t intersection; _cairo_region_init_rect (&intersection, rectangle); status = _cairo_region_intersect (&intersection, &clip->region, &intersection); if (!status) _cairo_region_get_extents (&intersection, rectangle); _cairo_region_fini (&intersection); if (status) return status; } if (clip->surface) _cairo_rectangle_intersect (rectangle, &clip->surface_rect); return CAIRO_STATUS_SUCCESS; }
cairo_status_t _cairo_clip_intersect_to_rectangle (cairo_clip_t *clip, cairo_rectangle_int_t *rectangle) { cairo_status_t status; cairo_bool_t is_empty; if (!clip) return CAIRO_STATUS_SUCCESS; if (clip->all_clipped) { *rectangle = clip->surface_rect; return CAIRO_STATUS_SUCCESS; } if (clip->path) { status = _cairo_clip_path_intersect_to_rectangle (clip->path, rectangle); if (unlikely (status)) return status; } if (clip->has_region) { cairo_rectangle_int_t extents; _cairo_region_get_extents (&clip->region, &extents); is_empty = _cairo_rectangle_intersect (rectangle, &extents); if (is_empty) return CAIRO_STATUS_SUCCESS; } if (clip->surface) is_empty = _cairo_rectangle_intersect (rectangle, &clip->surface_rect); return CAIRO_STATUS_SUCCESS; }