[cairo] Announcing OpenVG backend
pippin at gimp.org
Thu Jan 24 15:34:56 PST 2008
Announcing an OpenVG backend for cairo.
OpenVG is a royalty-free, cross-platform API providing low-level hardware
acceleration for vector graphics drawing primarily targeting mobile devices..
At OpenedHand I have developed a proof of concept cairo backend that renders
using OpenVG. It isn't complete yet but it renders something sensible for most
input I've been able to throw at it and is thus probably useful for experiments
for others as well.
This backend can be used to use OpenGL for acceleration on the Desktop
an OpenVG implementation that uses OpenGL like for instance the LGPL
Ivan Leben. The backend shuld in theory work with any OpenVG implementation but
has only been tested with ShivaVG and AmanithVG.
Performance and todo
The performance and rendering quality depends on the specific OpenVG backend in
use, when using OpenVG as the backend cairo ideally acts mostly as a middle man
translating between the APIs. That being said with one test case where
I am careful
to only use the well translated parts of the API I am seeing a 2x-4x increase
in performance depending on which OpenVG over GL implementation I used.
Most aspects of cairo map closely to OpenVG, but some like the ability to
specify a clipping path does not. Another thing that is problematic is drawing
to in memory images by filling/stroking paths using only OpenVG APIs (and not
using EGL FBOs). Going down this route could potentially have solved the
clipping path issue as well by using the mask as the clipping path. At the
moment the OpenVG backend falls back to rendering things in software and
uploading the resulting rendering as part of the drawing commands to OpenVG,
this can have severe impact on performance.
I am going to experiment a bit with the internal meta-surface of cairo to work
around the vector based source pattern issue. If this works out well the next
step will be some sanity checking on the use of the vgMask for the clipping
path. Here it will probably be neccesary to keep track of a stack of paths to
be applied/reapplied to the mask.
There is one addition to the OpenVG API that potentially could be sufficient to
be more fully accelerated which would look something like:
VG_API_CALL void vgMaskPath(VGPath mask, VGFillRule fill_rule,
VGint x, VGint y, VGint width, VGint height);
This API call doesn't exist though, but could perhaps be added to ShivsVG, or
somehow be added on top of OpenVG + OpenGL ES to enable passing vector data
from cairo to OpenVG instead of using cairo's image backend to rasterise masks
for the clipping path.
OpenVG has handles for paths as well as patterns. Multiple paths and
can exist in OpenVG, at the moment the backend is uploading paths each
time they are
used. One of the things that could be kept in a cache of path handles
is the glyphs
of fonts, making the operation to render text much cheaper, as well as
advantage of potential tessellation caches or similar on the OpenVG side.
Getting and testing it
The backend is available for download from: http://cgit.freedesktop.org/
To add my sources as a remote in git issue:
$ git remote add pippin people.freedesktop.org:~pippin/cairo.git
The main file of interest is the backend itself this file can be examined
through the gitweb interface on freedesktop.
I've also made a small demo  for comparison purposes which also can
serve as an example on the OpenVG backend can be used in conjunction with
setting up an OpenVG context with ShivaVG/AmanithVG from a glut base.
«The future is already here. It's just not very evenly distributed»
-- William Gibson
More information about the cairo