[Cairo] Recent portability improvements to cairo
cworth at east.isi.edu
Tue Nov 4 08:01:53 PST 2003
Some people have expressed interest in porting cairo to graphics
systems other than X. There have been a few recent changes to cairo
that should make this much easier:
1) There has been a large cleanup of cairo.h and all of libic to
remove unnecessary dependencies on X header files.
2) The surface_backend interface has been cleaned up considerably. At
this point, the cairo_ps_surface.c file should serve as a good
model for doing an image-based surface backend.
So, here is a suggested plan for anyone who wants to port cairo to a
new graphics system "foo":
a) copy cairo_ps_surface.c to cairo_foo_surface.c, replacing each
occurrence of cairo_ps_surface with cairo_foo_surface.
You will notice that most of the cairo_foo_surface functions simply
defer to cairo_image_surface implementations. This is what I meant
by an image-based surface backend.
b) cairo_foo_surface_create will need a new prototype and
implementation to store foo-specific data in the surface.
c) There are only three surface backend functions that do any drawing:
fill_rectangles, composite, and composite_trapezoids. The cairo_foo
versions of these functions should be made to call the cairo_image
versions, then copy the appropriate portion of the image from
surface->image to the graphics system.
d) The implementations of cairo_foo_surface_copy/show_page can be
gutted ala the cairo_image_surface versions.
That's definitely the easiest way to get something up and running on
some other system. Later, the cairo_foo support may be improved by
directly using foo-specific routines (if any) for doing the
compositing, etc. For example, an OpenGL-based backend might want to
use hardware-supported triangle rasterization rather than the
software-based rasterization in cairo_image_surface_composite_trapezoids.
If the surface backend interface needs to be modified to match a
system better, we can do that as well. This interface is intentionally
an internal implementation detail so that we can rework it as
Finally, there is some autoconf-related work that needs to be done so
that the set of backends to be compiled in can be selected by the
user. I would greatly appreciate contributions in this area from
someone knowledge about such things.
More information about the cairo