Example #1
0
/* 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;
}
Example #2
0
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;
}
Example #3
0
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;
}