[Cairo] Re: [xsvg] cairo_text_extents ?
christof at petig-baender.de
Thu Dec 4 00:46:34 PST 2003
Bill Spitzak schrieb:
> For backwards text, I believe my scheme would also allow you to send a
> font_matrix that mirrors horizontally. Similar to the rotation changing the
> origin and x_advance to the vertical sizes, this must alter the position of
> the letters and negate the x_advance (so it is positive again) so when you
> draw glyphs in reading-order you get a mirror-image of the Hebrew/Arabic
> text. You can then use a text_transform that mirrors it back and get proper
The only problem I might feign is a mixture of right to left and left to
right characters (e.g. numbers in hebrew text IIRC). ;-)
> Alternatively you can just send the glyphs in backwards order. I think this
> is a common solution already and will be very popular, one advantage is that
> "stupid" programs (like cat) will produce readable output, it also makes it a
> lot easier to mix languages, or to format bi-directional fonts, because you
> don't have to change the text_matrix. Notice that the x_advance of
> Hebrew/Arabic letters is positive in all cases.
This solves the problem (and seems to be not that alien for right to
left users). Though I susect problems with said Nastaliq.
IMHO you should only make sure that a decent solution will not need a
redesign of the API. Everything else should be left to the point where
arabic programmers voice concrete problems/solutions.
> If the advance vector is plotted on the unrotated letter and moved so the
> origins all lined up, what I described is a circular arc that passes through
> dx,0 and dx,dy and 0,dy and the maximum advance is the point at dx,dy.
I have some problems to imagine a circular arc which passes dx,0 dx,dy
and 0,dy and has it's maximum distance at dx,dy.
How do you calculate dy for a normal font?
> What you descirbe I think is an axis-aligned quarter ellipse, with the center
> at the origin and passing through dx,0 and 0,dy. The maximum advance is at
> either the horiztonal or vertical, all other advances are between these
Perhaps a rect is even better than an ellipse.
> Another alternative is a straight line between dx,0 and 0,dy.
Easier to implement but will perhaps overlap glyphs more likely.
> Your idea may be best. Or something between any of these ideas, or a more
> complex shape. However I think also the decision can be left up to the fonts,
> each can make it's own rules.
I did not know that a horizontal font can provide a vertical advance
(for drawing it vertically). And I suspect the most common fonts do not
provide it (e.g. Helvetica,Vera).
So my proposal was to stack them according to their bounding box (plus
some space inbetween) which should give a reasonable look. Perhaps
constant 1.6 ex even looks more reasonable. But using x_advance to stack
letters atop will suck (circular approach).
More information about the cairo