/* XXX Add me to the compositor interface. Ok, first create the compositor * interface, and then add this with associated fallback! */ cairo_status_t _cairo_surface_composite_polygon (cairo_surface_t *surface, cairo_operator_t op, const cairo_pattern_t *pattern, cairo_fill_rule_t fill_rule, cairo_antialias_t antialias, const cairo_composite_rectangles_t *rects, cairo_polygon_t *polygon, cairo_region_t *clip_region) { cairo_span_renderer_t *renderer; cairo_scan_converter_t *converter; cairo_status_t status; converter = _create_scan_converter (fill_rule, antialias, rects); status = converter->add_polygon (converter, polygon); if (unlikely (status)) goto CLEANUP_CONVERTER; renderer = _cairo_surface_create_span_renderer (op, pattern, surface, antialias, rects, clip_region); status = converter->generate (converter, renderer); if (unlikely (status)) goto CLEANUP_RENDERER; status = renderer->finish (renderer); CLEANUP_RENDERER: renderer->destroy (renderer); CLEANUP_CONVERTER: converter->destroy (converter); return status; }
cairo_status_t _cairo_path_fixed_fill_using_spans ( cairo_operator_t op, const cairo_pattern_t *pattern, cairo_path_fixed_t *path, cairo_surface_t *dst, cairo_fill_rule_t fill_rule, double tolerance, cairo_antialias_t antialias, const cairo_composite_rectangles_t *rects) { cairo_status_t status; cairo_span_renderer_t *renderer = _cairo_surface_create_span_renderer ( op, pattern, dst, antialias, rects); cairo_scan_converter_t *converter = _create_scan_converter ( fill_rule, antialias, rects); status = _cairo_path_fixed_fill_to_scan_converter ( path, tolerance, converter); if (status) goto BAIL; status = converter->generate (converter, renderer); if (status) goto BAIL; status = renderer->finish (renderer); if (status) goto BAIL; BAIL: renderer->destroy (renderer); converter->destroy (converter); return status; }
cairo_status_t _cairo_surface_composite_trapezoids_as_polygon (cairo_surface_t *surface, cairo_operator_t op, const cairo_pattern_t *pattern, cairo_antialias_t antialias, int src_x, int src_y, int dst_x, int dst_y, int width, int height, cairo_trapezoid_t *traps, int num_traps, cairo_region_t *clip_region) { cairo_span_renderer_t *renderer; cairo_scan_converter_t *converter; cairo_composite_rectangles_t rects; cairo_status_t status; rects.src.x = src_x; rects.src.y = src_y; rects.dst.x = 0; rects.dst.y = 0; rects.mask.x = dst_x; rects.mask.y = dst_y; rects.width = width; rects.height = height; converter = _create_scan_converter (CAIRO_FILL_RULE_WINDING, antialias, &rects); status = converter->status; if (unlikely (status)) goto CLEANUP_CONVERTER; while (num_traps--) { status = converter->add_edge (converter, &traps->left.p1, &traps->left.p2, traps->top, traps->bottom, 1); if (unlikely (status)) goto CLEANUP_CONVERTER; status = converter->add_edge (converter, &traps->right.p1, &traps->right.p2, traps->top, traps->bottom, -1); if (unlikely (status)) goto CLEANUP_CONVERTER; traps++; } renderer = _cairo_surface_create_span_renderer (op, pattern, surface, antialias, &rects, clip_region); status = converter->generate (converter, renderer); if (unlikely (status)) goto CLEANUP_RENDERER; status = renderer->finish (renderer); CLEANUP_RENDERER: renderer->destroy (renderer); CLEANUP_CONVERTER: converter->destroy (converter); return status; }