[cairo] API Proposal: cairo_font_metrics_t

Behdad Esfahbod behdad at behdad.org
Mon Jan 29 13:11:52 PST 2007

There is a historical mistake in cairo's API, that
cairo_font_extents_t is not opaque.  This makes it impossible to
add new members to it.  A transparent struct makes sense for
cairo_glyph_extents_t which should be fast to work with, but for
font extents, an approach like cairo_font_options_t is more

Anyway, to fix this without breaking and deprecating API, I
suggest a new type: cairo_font_metrics_t.  I want to propose the
following new API (for 1.6):

typedef struct _cairo_font_metrics cairo_font_metrics_t;




The cairo_font_metrics() and cairo_scaled_font_metrics() names
are chosen to match cairo_font_extents() and
cairo_scaled_font_extents().  This is in contrast to names like
cairo_scaled_font_get_font_options().  This distinction makes
sense when you note that font_extents and font_metrics are
readonly objects that can only be get and never set.

The individual members and their accessors are directly borrowed
from Pango, except for get_slope() which I've wanted to add to
Pango for long.  Pango has code to extract the
underline/strikethrough properties from FreeType/Win32/....

The major difference to the Pango API is that the Pango API for
font metrics is per-language.  This is the reason I left
approximate_char_width and approximate_digit_width out.  So I'm
assuming that a font has constant underline/strikethrough
position/thickness, and any per-language adjustments are done in
other layers, like the OpenType BASE table.  I'm fairly confident
that this is the case for all font formats that provide these
data.  Owen?


"Those who would give up Essential Liberty to purchase a little
 Temporary Safety, deserve neither Liberty nor Safety."
        -- Benjamin Franklin, 1759

More information about the cairo mailing list