[sugar] Cairo tile engine, and accessing 565 buffers from cairo and C

Don Hopkins dhopkins at DonHopkins.com
Mon Apr 16 19:59:18 EDT 2007


Thanks for all the great explanations! That's very helpful.

I want to draw RGB tiles (alpha is not necessary) on the screen as fast 
as possible, double buffering them in 16 bit X images, so I can 
incrementally update the tiles, then blit them to a composition surface 
in the server, then draw sprites and cairo graphics over them, them blit 
the resulting image to the screen, all in 16 bits 565 in the server (or 
24 bits 888 once that's supported).

I am loading in the tile set from a png file, so it comes in as a 24 bit 
RGB surface.
Currently I am making a bunch of small tiles in individual surfaces, and 
drawing those individually with Cairo.
An alternative would be to keep all tiles in one surface, and translate 
and clip the surface appropriately to draw each tile, which would save 
memory (because of the memory fragmentation and overhead of having 
hundreds of small surfaces versus one big surface). But I am afraid the 
overhead of drawing the rectangle, clipping to it, and blitting the 
large image through it would be slower than simply drawing a bunch of 
small surfaces without any clipping. Is that a valid assumption, or is 
there a fast path for drawing a surface clipped through a rectangle? I'm 
writing the tile drawing code that calls cairo in C, so the Python 
interpreter overhead is not an issue.

Currently the tile surfaces are 24 bit RGB surfaces, that I create by 
calling create_similar on the 24 bit RGB tile set I read in from a png 
file.
But I would rather make all those tile surfaces (or the one tile set 
surface that I clip) in the X server, so they will blit faster.

xHow do I create an cairo xlib surface from Python? Is there a supported 
way to call cairo_xlib_surface_create from Python?
When I call the cairo.XlibSurface constructor, it throws an exception 
that says the surface cannot be directly instantiated.
The only factory method I can find on cairo.XlibSurface is 
create_similar, but I have no idea how to get ahold of an original 
cairo.XlibSurface instance to call create_similar on.
The closest thing I can find is a C method on the gdk drawable object, 
called ref_cairo_surface, that does what I need, but I don't know how to 
call that directly from Python, either.
Maybe I could add a special purpose method to my Python module called 
RefCairoSurface that takes a PyGObject, pulls out the GObject, and calls 
GDK_DRAWABLE_GET_CLASS on that to get the drawable, then calls 
ref_cairo_surface on that to get the cairo surface.

Is there an easy way to get ahold of the cairo surface from a cairo 
context, or from a gdk drawable, from Python?

    -Don



More information about the Sugar mailing list