void _cairo_clip_init (cairo_clip_t *clip, cairo_surface_t *target) { clip->mode = _cairo_surface_get_clip_mode (target); clip->surface = NULL; clip->surface_rect.x = 0; clip->surface_rect.y = 0; clip->surface_rect.width = 0; clip->surface_rect.height = 0; clip->serial = 0; clip->region = NULL; clip->path = NULL; }
void _cairo_clip_init (cairo_clip_t *clip, cairo_surface_t *target) { if (target) clip->mode = _cairo_surface_get_clip_mode (target); else clip->mode = CAIRO_CLIP_MODE_MASK; clip->all_clipped = FALSE; clip->surface = NULL; clip->surface_rect.x = 0; clip->surface_rect.y = 0; clip->surface_rect.width = 0; clip->surface_rect.height = 0; clip->serial = 0; _cairo_region_init (&clip->region); clip->has_region = FALSE; clip->path = NULL; }
/* Composites a region representing a set of trapezoids. */ static cairo_status_t _composite_trap_region (cairo_clip_t *clip, cairo_pattern_t *src, cairo_operator_t op, cairo_surface_t *dst, cairo_region_t *trap_region, cairo_rectangle_int_t *extents) { cairo_status_t status; cairo_pattern_union_t solid_pattern; cairo_pattern_union_t mask; int num_rects = _cairo_region_num_boxes (trap_region); unsigned int clip_serial; cairo_surface_t *clip_surface = clip ? clip->surface : NULL; if (clip_surface && op == CAIRO_OPERATOR_CLEAR) { _cairo_pattern_init_solid (&solid_pattern.solid, CAIRO_COLOR_WHITE, CAIRO_CONTENT_COLOR); src = &solid_pattern.base; op = CAIRO_OPERATOR_DEST_OUT; } if (num_rects == 0) return CAIRO_STATUS_SUCCESS; if (num_rects > 1) { if (_cairo_surface_get_clip_mode (dst) != CAIRO_CLIP_MODE_REGION) return CAIRO_INT_STATUS_UNSUPPORTED; clip_serial = _cairo_surface_allocate_clip_serial (dst); status = _cairo_surface_set_clip_region (dst, trap_region, clip_serial); if (status) return status; } if (clip_surface) _cairo_pattern_init_for_surface (&mask.surface, clip_surface); status = _cairo_surface_composite (op, src, clip_surface ? &mask.base : NULL, dst, extents->x, extents->y, extents->x - (clip_surface ? clip->surface_rect.x : 0), extents->y - (clip_surface ? clip->surface_rect.y : 0), extents->x, extents->y, extents->width, extents->height); /* Restore the original clip if we modified it temporarily. */ if (num_rects > 1) { cairo_status_t status2 = _cairo_surface_set_clip (dst, clip); if (status == CAIRO_STATUS_SUCCESS) status = status2; } if (clip_surface) _cairo_pattern_fini (&mask.base); if (src == &solid_pattern.base) _cairo_pattern_fini (&solid_pattern.base); return status; }