Working with C object of python object (pycairo,ctypes)

AngelBlaZe gerdusvanzyl at gmail.com
Tue Feb 27 04:37:00 EST 2007


Solved my own problem :-)
For future reference here is the solution:

class PycairoContext(Structure):
    _fields_ = [("PyObject_HEAD", c_byte * object.__basicsize__),
                ("ctx", c_void_p),
                ("base", c_void_p)]


z = PycairoContext.from_address(id(ctx))
print z.ctx

where ctx is the python object
and PycairoContext is the C object of ctx


Full Code : ( simple rsvg / librsvg ctypes wrapper )
------------------------------------------
def WebColour(sCol):
    #print sCol
    ic = [int(sCol[i:i+2], 16)/255.0 for i in range(1, 7, 2)]
    #print ic
    return ic

from ctypes import *

l=CDLL('librsvg-2-2.dll')
g=CDLL('libgobject-2.0-0.dll')
print g.g_type_init()


import cairo

WIDTH, HEIGHT = 800, 800

# Setup Cairo
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, WIDTH, HEIGHT)
ctx = cairo.Context(surface)



error=''
handle1 = l.rsvg_handle_new_from_file('test.svg',error)
print error
print handle1

class PycairoContext(Structure):
    _fields_ = [("PyObject_HEAD", c_byte * object.__basicsize__),
                ("ctx", c_void_p),
                ("base", c_void_p)]


z = PycairoContext.from_address(id(ctx))
print z.ctx

print '>>',l.rsvg_handle_render_cairo(handle1, z.ctx)


#add some cairo stuff on top
bg = WebColour('#FFFFFF')
ctx.set_source_rgb(bg[0],bg[1],bg[2])
# Set thickness of brush
ctx.set_line_width(15)

# Draw out the triangle using absolute coordinates
ctx.move_to(200, 100)
ctx.line_to(300, 300)
ctx.rel_line_to(-200, 0)
ctx.close_path()

# Apply the ink
ctx.stroke()

surface.write_to_png("test.png")

------------------------------------------



AngelBlaZe wrote:
> Can you access the c object of a python object directly? Can this be
> done in ctypes or directly throught python functions without reverting
> to forking the python module?
>
> scanario:
> I have pyctx object that i get in python like this:
>
> pyctx = cairo.Context(surface)
>
> defined in the python extension this:
>
> typedef struct {
>     PyObject_HEAD
>     cairo_t *ctx;
>     PyObject *base; /* base object used to create context, or NULL */
> } PycairoContext;
>
> PyObject *
> PycairoContext_FromContext(cairo_t *ctx, PyTypeObject *type, PyObject
> *base)
> {
>     PyObject *o;
>
>     assert (ctx != NULL);
>
>     if (Pycairo_Check_Status (cairo_status (ctx))) {
> 	cairo_destroy (ctx);
> 	return NULL;
>     }
>
>     if (type == NULL)
>         type = &PycairoContext_Type;
>     o = PycairoContext_Type.tp_alloc (type, 0);
>     if (o) {
> 	((PycairoContext *)o)->ctx = ctx;
> 	Py_XINCREF(base);
> 	((PycairoContext *)o)->base = base;
>     } else {
> 	cairo_destroy (ctx);
>     }
>     return o;
> }
>
> Now my question is:
> Is there any way to access/get a pointer to PycairoContext->ctx from
> python object (pyctx)?
>
> A long shot i know :-)




More information about the Python-list mailing list