[cairo] Creating new Backend
Carl Worth
cworth at cworth.org
Mon May 8 11:20:18 PDT 2006
On Mon, 8 May 2006 12:38:36 +0200, Wolfgang Draxinger wrote:
> Simple question:
>
> What's the best starting point for implementing own backends?
I think it depends on what you're wanting to do, so I'll sketch out
two possibilities for use cases below. For each one I'll recommend a
source file to be used as the starting point, (something minimal that
can be directly copied to start with, then built up incrementally), as
well as some more complete examples for reference.
[I'm guessing the raster/display case below is the one you're
interested in, but I'll describe both just for completeness.]
1) Vector/paginated backend
This would be for something along the lines of the SVG,
PostScript, or PDF backends in which there is support for
multiple pages of output, and it is acceptable for drawing
operations to be queued up for each page and analyzed for
fallbacks before the actual backend ever sees anything.
In this case, the recommend starting-point file is:
test-paginated-surface.c
And some more complete examples are:
cairo-pdf-surface.c
cairo-ps-surface.c
cairo-svg-surface.c
where a lot of the complexity comes in font subsetting, (which
I hope to start generalizing and pushing out into common
files---much like cairo-font-subset.c which exists but has no
current users other than cairo-pdf-surface.c).
2) Raster/display backend
This would be for something that is targeting a display
device that expects immediate results, and it is reasonable to
expect that a rasterized version of the surface will
faithfully capture its contents.
In this case, the recommended starting-point file is:
test-fallback-surface.c
And as more complete examples you can look at basically any of
the other existing surfaces, (image, xlib, glitz, quartz,
directfb, beos).
The big advantage of using the test surfaces I mention above as
starting points is that they both do a good job of implementing as few
functions as possible in the surface backend interface while still
being "complete".
And it's worth noting that other than the get_extents function, the
sets of functions that these two surfaces implement are entirely
disjoint. That does suggest that we might want to split this backend
interface up into two corresponding sets of functions, (let's call
these the high-level and the low-level functions for now).
The two test surfaces are both backed by an image surface. In the case
of test-paginated surface it implements all of the high-level
functions in the backend interface, (eg. paint, mask, stroke, fill,
show_glyphs, and the (misfit) set_clip_region). This is the minimal
set of functions necessary to guarantee that the backend will never be
required to provide or accept a rasterized version of its content,
(through the low-level acquire_source/dest_image), which these kinds
of backends may not be capable of doing at all.
On the other hand, the test-fallback-surface implements a minimal set
of functions from the opposite end, (the low-level functions). By
implementing both sets of acquire/release functions, the surface
fallback code, (cairo-surface-fallback.c), is able to provide
image-surface renderings of all operations.
Incremental improvement of the test-fallback surface would consist of
progressively implementing higher-level functions as
convenient/appropriate for the particular backend so that the
acquire/release fallback paths are used less frequently.
Incrementally improving the test-paginated surface is a slightly more
involved process. It's not likely to be necessary to implement more
functions. Instead, the analysis phase is currently indicating that
all functions are supported, (always returning CAIRO_STATUS_SUCCESS
when paginated_mode is CAIRO_PAGINATED_MODE_ANALYZE). To make this
"real" the first thing to do would be to change all of these to return
CAIRO_INT_STATUS_UNSUPPORTED, then provide an implementation of the
paint function that was capable of accepting the
image-fallback-rendered result of the entire page. After that,
individual operations could be conditionally supported and also
changed to report SUCCESS during the analysis phase.
Finally, the analysis is currently limited to doing fallbacks or not
at the page-level only, though this is expected to change in the
future.
-Carl
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
Url : http://lists.freedesktop.org/archives/cairo/attachments/20060508/9d23385d/attachment.pgp
More information about the cairo
mailing list