[Cairo] Re: [xsvg] cairo_text_extents ?

Carl Worth cworth at east.isi.edu
Tue Dec 16 07:49:55 PST 2003

On Nov 26, John Ellson wrote:
 > It is true that the left_side_bearing, right_side_bearing, ascent,
 > and descent describe a bounding box.  However the terms are
 > clearly with reference to the origin of the (first) character.
 > x,y,width,height kind of looses that for me.

I find that argument somewhat compelling. I would like the names to
indicate the fact that the metrics are with reference to the origin of
the first character. So, I'm leaning toward x_bearing,y_bearing rather
than the x,y that I proposed before.

In fact, I'm leaning far enough that I just committed the following:

	typedef struct {
	    double x_bearing;
	    double y_bearing;
	    double width;
	    double height;
	    double x_advance;
	    double y_advance;
	} cairo_text_extents_t;

There was some discussion about defining the box as two points rather
than point+width/height, but I found that to be rather awkward with
interfaces such as cairo_rectangle, (see how the code in
cairo-demo/png/text.c was simplified with the change).

The interface above has the advantage of matching the freetype
interface quite closely, (other than slightly different naming
conventions such as x_bearing rather than BearingX).

One significant difference is that freetype actually provides only a
single advance value. Freetype does have separate horiAdvance and
vertAdvance values, but also separate horiBearingX and horiBearingY

We already have a plan for teaching cairo how to know whether it
should get the horizontal or vertical set of metrics from
freetype. So, it's conceivable that we could provide a single advance
value rather than x_advance and y_advance, (at least as far as
freetype is concerned).

Would that actually be useful? Would it limit things somewhere?

I haven't written much text manipulation code, but the little bit of
code I have written in libsvg-cairo actually suggests to me that
having separate x_advance/y_advance values actually makes things
easier, (even if at most one of the values will be non-zero). It seems
to allow me to write code that can correctly align text without having
to check whether the font is vertical or horizontal.


More information about the cairo mailing list