cairo_status_t _cairo_rasterise_polygon_to_boxes (cairo_polygon_t *polygon, cairo_fill_rule_t fill_rule, cairo_boxes_t *boxes) { struct cairo_box_renderer renderer; cairo_scan_converter_t *converter; cairo_int_status_t status; cairo_rectangle_int_t r; TRACE ((stderr, "%s: fill_rule=%d\n", __FUNCTION__, fill_rule)); _cairo_box_round_to_rectangle (&polygon->extents, &r); converter = _cairo_mono_scan_converter_create (r.x, r.y, r.x + r.width, r.y + r.height, fill_rule); status = _cairo_mono_scan_converter_add_polygon (converter, polygon); if (unlikely (status)) goto cleanup_converter; renderer.boxes = boxes; renderer.base.render_rows = span_to_boxes; status = converter->generate (converter, &renderer.base); cleanup_converter: converter->destroy (converter); return status; }
cairo_int_status_t _cairo_rasterise_polygon_to_traps (cairo_polygon_t *polygon, cairo_fill_rule_t fill_rule, cairo_antialias_t antialias, cairo_traps_t *traps) { struct cairo_trap_renderer renderer; cairo_scan_converter_t *converter; cairo_int_status_t status; cairo_rectangle_int_t r; TRACE ((stderr, "%s: fill_rule=%d, antialias=%d\n", __FUNCTION__, fill_rule, antialias)); assert(antialias == CAIRO_ANTIALIAS_NONE); renderer.traps = traps; renderer.base.render_rows = span_to_traps; _cairo_box_round_to_rectangle (&polygon->extents, &r); converter = _cairo_mono_scan_converter_create (r.x, r.y, r.x + r.width, r.y + r.height, fill_rule); status = _cairo_mono_scan_converter_add_polygon (converter, polygon); if (likely (status == CAIRO_INT_STATUS_SUCCESS)) status = converter->generate (converter, &renderer.base); converter->destroy (converter); return status; }
static cairo_int_status_t composite_polygon (const cairo_spans_compositor_t *compositor, cairo_composite_rectangles_t *extents, cairo_polygon_t *polygon, cairo_fill_rule_t fill_rule, cairo_antialias_t antialias) { cairo_abstract_span_renderer_t renderer; cairo_scan_converter_t *converter; cairo_bool_t needs_clip; cairo_int_status_t status; if (extents->is_bounded) needs_clip = extents->clip->path != NULL; else needs_clip = !_clip_is_region (extents->clip) || extents->clip->num_boxes > 1; TRACE ((stderr, "%s - needs_clip=%d\n", __FUNCTION__, needs_clip)); if (needs_clip) { TRACE ((stderr, "%s: unsupported clip\n", __FUNCTION__)); return CAIRO_INT_STATUS_UNSUPPORTED; converter = _cairo_clip_tor_scan_converter_create (extents->clip, polygon, fill_rule, antialias); } else { const cairo_rectangle_int_t *r = &extents->unbounded; if (antialias == CAIRO_ANTIALIAS_FAST) { converter = _cairo_tor22_scan_converter_create (r->x, r->y, r->x + r->width, r->y + r->height, fill_rule, antialias); status = _cairo_tor22_scan_converter_add_polygon (converter, polygon); } else if (antialias == CAIRO_ANTIALIAS_NONE) { converter = _cairo_mono_scan_converter_create (r->x, r->y, r->x + r->width, r->y + r->height, fill_rule); status = _cairo_mono_scan_converter_add_polygon (converter, polygon); } else { converter = _cairo_tor_scan_converter_create (r->x, r->y, r->x + r->width, r->y + r->height, fill_rule, antialias); status = _cairo_tor_scan_converter_add_polygon (converter, polygon); } } if (unlikely (status)) goto cleanup_converter; status = compositor->renderer_init (&renderer, extents, antialias, needs_clip); if (likely (status == CAIRO_INT_STATUS_SUCCESS)) status = converter->generate (converter, &renderer.base); compositor->renderer_fini (&renderer, status); cleanup_converter: converter->destroy (converter); return status; }
static cairo_int_status_t composite_polygon (const cairo_spans_compositor_t *compositor, cairo_composite_rectangles_t *extents, cairo_polygon_t *polygon, cairo_fill_rule_t fill_rule, cairo_antialias_t antialias) { cairo_abstract_span_renderer_t renderer; cairo_scan_converter_t *converter; cairo_bool_t needs_clip; cairo_int_status_t status; needs_clip = composite_needs_clip (extents, &polygon->extents); if (needs_clip) { return CAIRO_INT_STATUS_UNSUPPORTED; converter = _cairo_clip_tor_scan_converter_create (extents->clip, polygon, fill_rule, antialias); } else { const cairo_rectangle_int_t *r = &extents->bounded; if (antialias == CAIRO_ANTIALIAS_FAST) { converter = _cairo_tor22_scan_converter_create (r->x, r->y, r->x + r->width, r->y + r->height, fill_rule, antialias); status = _cairo_tor22_scan_converter_add_polygon (converter, polygon); } else if (antialias == CAIRO_ANTIALIAS_NONE) { converter = _cairo_mono_scan_converter_create (r->x, r->y, r->x + r->width, r->y + r->height, fill_rule); status = _cairo_mono_scan_converter_add_polygon (converter, polygon); } else { converter = _cairo_tor_scan_converter_create (r->x, r->y, r->x + r->width, r->y + r->height, fill_rule, antialias); status = _cairo_tor_scan_converter_add_polygon (converter, polygon); } } if (unlikely (status)) goto cleanup_converter; status = compositor->renderer_init (&renderer, extents, needs_clip); if (likely (status == CAIRO_INT_STATUS_SUCCESS)) status = converter->generate (converter, &renderer.base); compositor->renderer_fini (&renderer, status); cleanup_converter: converter->destroy (converter); return status; }