void _cairo_debug_print_boxes (FILE *stream, const cairo_boxes_t *boxes) { const struct _cairo_boxes_chunk *chunk; cairo_box_t extents; int i; _cairo_boxes_extents (boxes, &extents); fprintf (stream, "boxes x %d: (%f, %f) x (%f, %f)\n", boxes->num_boxes, _cairo_fixed_to_double (extents.p1.x), _cairo_fixed_to_double (extents.p1.y), _cairo_fixed_to_double (extents.p2.x), _cairo_fixed_to_double (extents.p2.y)); for (chunk = &boxes->chunks; chunk != NULL; chunk = chunk->next) { for (i = 0; i < chunk->count; i++) { fprintf (stderr, " box[%d]: (%f, %f), (%f, %f)\n", i, _cairo_fixed_to_double (chunk->base[i].p1.x), _cairo_fixed_to_double (chunk->base[i].p1.y), _cairo_fixed_to_double (chunk->base[i].p2.x), _cairo_fixed_to_double (chunk->base[i].p2.y)); } } }
static cairo_int_status_t trim_extents_to_boxes (cairo_composite_rectangles_t *extents, cairo_boxes_t *boxes) { cairo_box_t box; _cairo_boxes_extents (boxes, &box); return _cairo_composite_rectangles_intersect_mask_extents (extents, &box); }
cairo_int_status_t _cairo_composite_rectangles_init_for_boxes (cairo_composite_rectangles_t *extents, cairo_surface_t *surface, cairo_operator_t op, const cairo_pattern_t *source, const cairo_boxes_t *boxes, const cairo_clip_t *clip) { cairo_box_t box; if (! _cairo_composite_rectangles_init (extents, surface, op, source, clip)) { return CAIRO_INT_STATUS_NOTHING_TO_DO; } _cairo_boxes_extents (boxes, &box); _cairo_box_round_to_rectangle (&box, &extents->mask); return _cairo_composite_rectangles_intersect (extents, clip); }
cairo_clip_t * _cairo_clip_from_boxes (const cairo_boxes_t *boxes) { cairo_box_t extents; cairo_clip_t *clip = _cairo_clip_create (); if (clip == NULL) return _cairo_clip_set_all_clipped (clip); /* XXX cow-boxes? */ if(boxes->num_boxes == 1) { clip->boxes = &clip->embedded_box; clip->boxes[0] = boxes->chunks.base[0]; clip->num_boxes = 1; } else { clip->boxes = _cairo_boxes_to_array (boxes, &clip->num_boxes, TRUE); if (clip->boxes == NULL) return _cairo_clip_set_all_clipped (clip); } _cairo_boxes_extents (boxes, &extents); _cairo_box_round_to_rectangle (&extents, &clip->extents); return clip; }
cairo_clip_t * _cairo_clip_intersect_boxes (cairo_clip_t *clip, const cairo_boxes_t *boxes) { cairo_boxes_t clip_boxes; cairo_box_t limits; cairo_rectangle_int_t extents; if (_cairo_clip_is_all_clipped (clip)) return clip; if (boxes->num_boxes == 0) return _cairo_clip_set_all_clipped (clip); if (boxes->num_boxes == 1) return _cairo_clip_intersect_box (clip, boxes->chunks.base); if (clip == NULL) clip = _cairo_clip_create (); if (clip->num_boxes) { _cairo_boxes_init_for_array (&clip_boxes, clip->boxes, clip->num_boxes); if (unlikely (_cairo_boxes_intersect (&clip_boxes, boxes, &clip_boxes))) { clip = _cairo_clip_set_all_clipped (clip); goto out; } if (clip->boxes != &clip->embedded_box) free (clip->boxes); clip->boxes = NULL; boxes = &clip_boxes; } if (boxes->num_boxes == 0) { clip = _cairo_clip_set_all_clipped (clip); goto out; } else if (boxes->num_boxes == 1) { clip->boxes = &clip->embedded_box; clip->boxes[0] = boxes->chunks.base[0]; clip->num_boxes = 1; } else { clip->boxes = _cairo_boxes_to_array (boxes, &clip->num_boxes, TRUE); } _cairo_boxes_extents (boxes, &limits); _cairo_box_round_to_rectangle (&limits, &extents); if (clip->path == NULL) clip->extents = extents; else if (! _cairo_rectangle_intersect (&clip->extents, &extents)) clip = _cairo_clip_set_all_clipped (clip); if (clip->region) { cairo_region_destroy (clip->region); clip->region = NULL; } clip->is_region = FALSE; out: if (boxes == &clip_boxes) _cairo_boxes_fini (&clip_boxes); return clip; }