[cairo-commit] [cairo-www] src/cairo_rsvg_and_python_in_windows.mdwn
Carl Worth
cworth at freedesktop.org
Mon Dec 8 16:21:51 PST 2008
src/cairo_rsvg_and_python_in_windows.mdwn | 63 ++++++++++++++++++++++++++++++
1 file changed, 63 insertions(+)
New commits:
commit 08ccb2fe0be9ad0f4f54955873605883c2cecbba
Author: Carl Worth <cworth at freedesktop.org>
Date: Mon Dec 8 16:21:48 2008 -0800
web commit by siefkenj
diff --git a/src/cairo_rsvg_and_python_in_windows.mdwn b/src/cairo_rsvg_and_python_in_windows.mdwn
new file mode 100644
index 0000000..6edcd1c
--- /dev/null
+++ b/src/cairo_rsvg_and_python_in_windows.mdwn
@@ -0,0 +1,63 @@
+An extremely minimal wrapper for rsvg that can be used in windows as a drop-in replacement for rsvg might go as follows:
+
+ #some code to give rsvg.render_cairo(ctx) ability
+ #on windows.
+ import os
+ try:
+ import rsvg
+ WINDOWS=False
+ except ImportError:
+ print"Warning, could not import 'rsvg'"
+ if os.name == 'nt':
+ print "Detected windows, creating rsvg."
+ #some workarounds for windows
+
+ from ctypes import *
+
+ l=CDLL('librsvg-2-2.dll')
+ g=CDLL('libgobject-2.0-0.dll')
+ g.g_type_init()
+
+ class rsvgHandle():
+ class RsvgDimensionData(Structure):
+ _fields_ = [("width", c_int),
+ ("height", c_int),
+ ("em",c_double),
+ ("ex",c_double)]
+
+ class PycairoContext(Structure):
+ _fields_ = [("PyObject_HEAD", c_byte * object.__basicsize__),
+ ("ctx", c_void_p),
+ ("base", c_void_p)]
+
+ def __init__(self, path):
+ self.path = path
+ error = ''
+ self.handle = l.rsvg_handle_new_from_file(self.path,error)
+
+
+ def get_dimension_data(self):
+ svgDim = self.RsvgDimensionData()
+ l.rsvg_handle_get_dimensions(self.handle,byref(svgDim))
+ return (svgDim.width,svgDim.height)
+
+ def render_cairo(self, ctx):
+ ctx.save()
+ z = self.PycairoContext.from_address(id(ctx))
+ l.rsvg_handle_render_cairo(self.handle, z.ctx)
+ ctx.restore()
+
+
+
+ class rsvgClass():
+ def Handle(self,file):
+ return rsvgHandle(file)
+
+ rsvg = rsvgClass()
+
+This wrapper may be used to render svg's with the same syntax as rsvg. i.e.:
+
+ h = rsvg.Handle("box.svg")
+ s = cario.ImageSurface(cairo.FORMAT_ARGB32, 100, 100)
+ ctx = cairo.Context(s)
+ h.render_cairo(ctx)
More information about the cairo-commit
mailing list