Use vector graphics as patterns in SVG. (Originally pycairo #328 )
This was reported against pycairo by 10maurycy10 here: https://github.com/pygobject/pycairo/issues/328 porting the code to C reproduces it in Cairo itself.
Original bug report by 10maurycy10:
Currently creating a SurfacePattern from an SVGSurface and using it to draw to another SVGSurface rendered to a SVG file results in a rasterized version of the pattern, however SVG supports vector fill patterns.
Is this a bug or am I doing something wrong? [snipped]
import cairo
# Create a simple pattern cosisting of a horsisontal line
pattern_surface = cairo.SVGSurface(None, 16, 16)
pattern_context = cairo.Context(pattern_surface)
pattern_context.line_to(0, 0)
pattern_context.line_to(16, 16)
pattern_context.stroke()
# Paint a surface with the pattern
pattern = cairo.SurfacePattern(pattern_surface)
surface = cairo.SVGSurface("test.svg", 16, 16)
context = cairo.Context(surface)
context.set_source(pattern)
context.paint()
C port of the above python code
#include <cairo.h>
#include <cairo-svg.h>
#include <stdlib.h>
int main() {
cairo_surface_t *pattern_surface = cairo_svg_surface_create(NULL, 16, 16);
cairo_t *pattern_context = cairo_create(pattern_surface);
cairo_move_to(pattern_context, 0, 0);
cairo_line_to(pattern_context, 16, 16);
cairo_stroke(pattern_context);
cairo_pattern_t *pattern = cairo_pattern_create_for_surface(pattern_surface);
cairo_surface_t *surface = cairo_svg_surface_create("test.svg", 16, 16);
cairo_t *context = cairo_create(surface);
cairo_set_source(context, pattern);
cairo_paint(context);
cairo_destroy(context);
cairo_surface_destroy(surface);
cairo_pattern_destroy(pattern);
cairo_destroy(pattern_context);
cairo_surface_destroy(pattern_surface);
return 0;
}