SVG rendering in a PyGame application
This is a complete example which combines hints by other people here.It should render a file called test.svg from the current directory. It was tested on Ubuntu 10.10, python-cairo 1.8.8, python-pygame 1.9.1, python-rsvg 2.30.0.
#!/usr/bin/pythonimport arrayimport mathimport cairoimport pygameimport rsvgWIDTH = 512HEIGHT = 512data = array.array('c', chr(0) * WIDTH * HEIGHT * 4)surface = cairo.ImageSurface.create_for_data( data, cairo.FORMAT_ARGB32, WIDTH, HEIGHT, WIDTH * 4)pygame.init()window = pygame.display.set_mode((WIDTH, HEIGHT))svg = rsvg.Handle(file="test.svg")ctx = cairo.Context(surface)svg.render_cairo(ctx)screen = pygame.display.get_surface()image = pygame.image.frombuffer(data.tostring(), (WIDTH, HEIGHT),"ARGB")screen.blit(image, (0, 0)) pygame.display.flip() clock = pygame.time.Clock()while True: clock.tick(15) for event in pygame.event.get(): if event.type == pygame.QUIT: raise SystemExit
The question is quite old but 10 years passed and there is new possibility that works and does not require librsvg
anymore. There is Cython wrapper over nanosvg library and it works:
from svg import Parser, Rasterizerdef load_svg(filename, surface, position, size=None): if size is None: w = surface.get_width() h = surface.get_height() else: w, h = size svg = Parser.parse_file(filename) rast = Rasterizer() buff = rast.rasterize(svg, w, h) image = pygame.image.frombuffer(buff, (w, h), 'ARGB') surface.blit(image, position)
I found Cairo/rsvg solution too complicated to get to work because of dependencies are quite obscure to install.