[cairo] Cairo vs. Xft glyph rendering
Vladimir Vukicevic
vladimir at pobox.com
Fri Dec 8 07:04:35 PST 2006
Xan Lopez wrote:
> The GTK+ 2.6 call, coming from libXft, looks pretty much ok to my
> untrained eyes. You can even recognize the glyph codes from each
> character in the timetext[2] program. The GTK+ 2.10 call looks like an
> abuse of the API :)
>
> If you compare the code from xftrender.c:XftGlyphSpecRender() and
> cairo-xlib-surface.c:_cairo_xlib_surface_show_glyph8() it seems that
> this the intended behaviour and not a bug. My question is: is this ok?
> what is the reason of the divergence?
The main reason is that for XftGlyphSpecRender only a destination origin
point and an array of glyph indicies is given. For cairo's show_glyphs,
each glyph has its own x/y coordinate. So, one element in the call to
Render per glyph is used. Cairo could probably generate better runs by
comparing the x/y delta from the previous glyph with the cached glyph
offsets, but that data currently isn't available in the functions used
and would require a hash lookup per glyph.
Maybe one of the X folks here could let us know whether doing this could
result in a performance gain? We already have to do the lookup per
glyph to make sure that it's sent to the server, so we could always
change the data structure that's used to pass things down to
xlib_show_glyphs{8,16,32} so that it sends the right info, instead of
just sending down the cairo_glyph_t array. That is, either pass down
cairo_glyph_t + per-glyph offsets, or even do the run computation ahead
of time and pass down some structure that can be trivially converted to
the appropriate size XGlyphElt array.
Now that I think about it, the right thing is probably to always create
an XGlyphElt32 array in xlib_surface_show_glyphs, because we have all
the data needed to do so. Then for the 8-bit and 16-bit case, we'd just
do a conversion from xGlyphElt32 to XGlyphElt8/16 to cut down on the
data size (and could probably do all this in xlib_surface_show_glyphs,
instead of going through a function call to show_glyphs8/16/32).
- Vlad
More information about the cairo
mailing list