[cairo-commit] [cairo-www] src/pyrsvg.mdwn
Carl Worth
cworth at freedesktop.org
Sun Nov 11 07:55:10 PST 2007
src/pyrsvg.mdwn | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 126 insertions(+)
New commits:
commit 5ceb44bd27501ded824595654011c94a24645dc0
Author: Donn <donn.ingle at gmail.com>
Date: Sun Nov 11 07:55:10 2007 -0800
pyrsvg demos
diff --git a/src/pyrsvg.mdwn b/src/pyrsvg.mdwn
new file mode 100644
index 0000000..cf2a081
--- /dev/null
+++ b/src/pyrsvg.mdwn
@@ -0,0 +1,126 @@
+## How to use librsvg from Python
+
+It finally took me an entire installation of a new O/S and "locate .py | grep rsvg"(*) on my drive to find what I could not find via google : how to open an SVG file and draw it from PyCairo.
+
+I had to upgrade my O/S (to Gnu/Linux Kubuntu 7.10) in order to get the latest Python-gnome2-* packages for, buried in there, is a Python wrapper for librsvg. I don't know why it's not a stand-alone wrapper like PyCairo, but that's the way it is.
+
+The first demo is directly from the example I found on my drive.
+
+(*) You can find this demo in /usr/share/doc/python-gnome2-desktop/examples/rsvg on *buntu Gutsy 7.10
+
+ #!/usr/bin/env python
+
+ import sys
+ import cairo
+ import rsvg
+ import gtk
+
+
+ BORDER_WIDTH = 10
+
+
+ def delete_cb(win, event):
+ gtk.main_quit()
+
+
+ def expose_cairo(win, event, svg):
+
+ x, y, w, h = win.allocation
+ cr = win.window.cairo_create()
+ cr.set_source_color(win.style.fg[win.state])
+ cr.rectangle(BORDER_WIDTH, BORDER_WIDTH,
+ w - 2*BORDER_WIDTH, h - 2*BORDER_WIDTH)
+ cr.set_line_width(5.0)
+ cr.set_line_join(cairo.LINE_JOIN_ROUND)
+ cr.stroke()
+
+ if svg != None:
+ matrix = cairo.Matrix(3,0,0,3,0, 0)
+ #cairo.Matrix.rotate( matrix, prop.rot )
+ cr.transform (matrix)
+ svg.render_cairo(cr)
+
+ return True
+
+ def main():
+ win = gtk.Window ()
+ win.connect("delete-event", delete_cb)
+
+ svg = None
+ if (len (sys.argv) > 1):
+ svg = rsvg.Handle(file=sys.argv[1])
+ else:
+ raise SystemExit("need svg file")
+
+ win.connect("expose-event", expose_cairo, svg)
+
+ print svg.props.width, svg.props.height, svg.props.em, svg.props.ex
+
+ win.show_all()
+ win.connect("destroy", lambda w: gtk.main_quit())
+ gtk.main()
+
+ if __name__ == '__main__':
+ main()
+
+##Writing an SVG file
+
+I thought I'd see how writing **out** an SVG file from Cairo works, this is a short example.
+
+
+ import cairo
+ import rsvg
+ import math
+
+ fo = file('test.svg', 'w')
+
+ WIDTH, HEIGHT = 256, 256
+
+ ## Prepare a destination surface -> out to an SVG file!
+ surface = cairo.SVGSurface (fo, WIDTH, HEIGHT)
+
+ ## draw something - this taken from the web.
+ ctx = cairo.Context (surface)
+ ctx.scale (WIDTH/1.0, HEIGHT/1.0) # Normalizing the canvas
+ pat = cairo.LinearGradient (0.0, 0.0, 0.0, 1.0)
+ pat.add_color_stop_rgba (1, 0.7, 0, 0, 0.5) # First stop, 50% opacity
+ pat.add_color_stop_rgba (0, 0.9, 0.7, 0.2, 1) # Last stop, 100% opacity
+ ctx.rectangle (0, 0, 1, 1) # Rectangle(x0, y0, x1, y1)
+ ctx.set_source (pat)
+ ctx.fill ()
+ ctx.translate (0.1, 0.1) # Changing the current transformation matrix
+ ctx.move_to (0, 0)
+ ctx.arc (0.2, 0.1, 0.1, -math.pi/2, 0) # Arc(cx, cy, radius, start_angle, stop_angle)
+ ctx.line_to (0.5, 0.1) # Line to (x,y)
+ ctx.curve_to (0.5, 0.2, 0.5, 0.4, 0.2, 0.8) # Curve(x1, y1, x2, y2, x3, y3)
+ ctx.close_path ()
+ ctx.set_source_rgb (0.3, 0.2, 0.5) # Solid color
+ ctx.set_line_width (0.02)
+ ctx.stroke ()
+
+ ## Do the deed.
+ surface.finish()
+
+You can use 'svgdisplay' (if you have the binary), Inkscape, Firefox or the first demo app to view test.svg
+
+##A feedback loop
+
+What happens when you feed the snake it's tail?
+
+ import cairo
+ import rsvg
+
+ fo = file('test.svg', 'w')
+
+ WIDTH, HEIGHT = 256, 256
+ surface = cairo.SVGSurface (fo, WIDTH, HEIGHT)
+
+ ctx = cairo.Context (surface)
+
+ svg = rsvg.Handle(file="test2.svg")
+ svg.render_cairo(ctx)
+
+ surface.finish()
+
+Well, it works! test.svg comes in and comes out as test2.svg. I don't think it proves anything, but it's fun.
+
More information about the cairo-commit
mailing list