[cairo] Rendering line fonts
britten at caris.com
Fri Nov 21 10:57:03 PST 2008
Adrian Johnson wrote:
>> My only issue is that the fonts draw almost invisibly thin, and I'm
>> looking to get a lineweight applied to it (See screenshots).
>> We love the fact that our text is actually coming out as text in the
>> PDF (Rather than just lines, or an image), and would really like to
>> be able to keep this! [ Without having to rewrite vast amounts of
>> our existing text handling code ;) ]
> The PDF backend, when embedding font subsets of fonts that are not
> natively supported (TrueType, CFF, Type 1), will try to obtain the path
> of each glyph. If the paths are available a Type 1 font is created from
> these paths and embedded in the PDF.
That's cool! I wondered how that was being done...
[ NB - This is probably a whole different discussion, but I noticed
that when I select my text in Acroread, the highlight boxes don't
match where the glyphs are drawn (Only with these custom fonts - TT
seems ok). Looks like a font origin/baseline issue. I haven't
looked into this yet, but if anyone is interested or concerned,
speak up and I'll try to collect up more details when I get a
> The paths are always filled. If you
> want to stroke the paths you will need to make your FT driver create
> paths that when filled form the strokes.
Hmmm... Although I see what you're saying, things are never that
simple (for me... :( )
Since the thickness is a configurable attribute of the text and not
a property of the Face (Sortof like size, underline, angle, etc),
then I won't be able to compute the final polygon path until just
when it's being rendered.
> Your best option is to use the user font feature in cairo. It would take
> very little effort create a user font with a render function that
> strokes the glyph path. In the PDF/PS backends user fonts are embedded
> as a Type 3 fonts.
So, given that the entry point to all this (within our rendering
framework) passes me an FT_Face and a character, then what you're
saying is that I'll have to:
- Examine the FT_Face, and determine if it's one of my stroke fonts.
- If it's not, proceed with what I'm currently doing.
- See if it has any open lines/paths, or if it just polygons (Since
our fonts could be either).
- If it's just polygons, I can continue doing what I'm doing.
- Extract the linework from the FT_Face (Somehow - Hmmm... I wonder
if I'll have to dive into an FT_Outline_Decompose() type of draw
solution to get at them :P To be investigated...)
- Using the thickness for this text, and the just-extracted lines,
proceed to the 'user font' stuff of Cairo (Which I haven't looked
looked at closely yet - Sorry) and make up the glyph.
- Finally, render it as described by Behdad in his message:
cairo_glyph_path (cr, &cairo_glyph, 1);
[ (sigh) Doesn't really sound like something I want to get started
on on a Friday afternoon... :P Now you see why I kept pursuing
my initial (seemingly-simple) approach... ]
Again, thanks for the help and info so far! I'll probably have
a few more questions before I get this squished though. Gotta go
upgrade to 1.8.x first though...
More information about the cairo