static inline cairo_bool_t _cairo_composite_rectangles_init (cairo_composite_rectangles_t *extents, int width, int height, cairo_operator_t op, const cairo_pattern_t *source, cairo_clip_t *clip) { extents->unbounded.x = extents->unbounded.y = 0; extents->unbounded.width = width; extents->unbounded.height = height; if (clip != NULL) { const cairo_rectangle_int_t *clip_extents; clip_extents = _cairo_clip_get_extents (clip); if (clip_extents == NULL) return FALSE; if (! _cairo_rectangle_intersect (&extents->unbounded, clip_extents)) return FALSE; } extents->bounded = extents->unbounded; extents->is_bounded = _cairo_operator_bounded_by_either (op); _cairo_pattern_get_extents (source, &extents->source); if (extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_SOURCE) { if (! _cairo_rectangle_intersect (&extents->bounded, &extents->source)) return FALSE; } return TRUE; }
static inline cairo_bool_t _cairo_composite_rectangles_init (cairo_composite_rectangles_t *extents, cairo_surface_t *surface, cairo_operator_t op, const cairo_pattern_t *source, const cairo_clip_t *clip, cairo_bool_t *should_be_lazy) { if (_cairo_clip_is_all_clipped (clip)) return FALSE; extents->surface = surface; extents->op = op; _cairo_surface_get_extents (surface, &extents->destination); extents->clip = NULL; extents->unbounded = extents->destination; extents->is_bounded = _cairo_operator_bounded_by_either (op); if (*should_be_lazy) *should_be_lazy = _cairo_composite_rectangles_check_lazy_init (extents, surface, source); if ((! *should_be_lazy) && (clip && ! _cairo_rectangle_intersect (&extents->unbounded, _cairo_clip_get_extents (clip)))) return FALSE; extents->bounded = extents->unbounded; extents->original_source_pattern = source; if (! *should_be_lazy) { _cairo_composite_reduce_pattern (source, &extents->source_pattern); _cairo_pattern_get_extents (&extents->source_pattern.base, &extents->source); } else _cairo_pattern_get_extents (extents->original_source_pattern, &extents->source); if (extents->is_bounded & CAIRO_OPERATOR_BOUND_BY_SOURCE) { if (! _cairo_rectangle_intersect (&extents->bounded, &extents->source)) return FALSE; } extents->original_mask_pattern = NULL; extents->mask_pattern.base.type = CAIRO_PATTERN_TYPE_SOLID; extents->mask_pattern.solid.color.alpha = 1.; /* XXX full initialisation? */ extents->mask_pattern.solid.color.alpha_short = 0xffff; return TRUE; }