[cairo] Pango/Cairo integration thoughts
Owen Taylor
otaylor at redhat.com
Thu Sep 23 14:45:30 PDT 2004
I spent some time thinking about what Pango needs from the Cairo font
interface.
For background, the paper/slides at:
http://people.redhat.com/~otaylor/guadec5/
explain how I see the Pango/Cairo API working from the user perspective.
Also, possible useful background is the (previously referenced here)
paper:
http://people.redhat.com/otaylor/grid-fitting/
Which explains why a layout engine might want to get both device-independent
and device-dependent metrics for the same font.
Quick summary of Pango/Cairo integration
========================================
Simple:
PangoLayout *layout = pango_cairo_create_layout (cr);
pango_layout_set_text (layout, "Hello world");
pango_cairo_show_layout (cr);
g_object_unref (layout);
Complex:
/* Fontmaps and context can be used with any cairo_t */
PangoFontMap *font_map = pango_cairo_get_default_font_map ();
PangoContext *context = pango_cairo_font_map_create_context (font_map);
PangoLayout *layout = pango_layout_new (context);
int width, height;
/* But we need to copy information (like the CTM) from the cairo_t
* into the the context in order to get correct layout */
pango_cairo_context_update (context, cr);
pango_layout_set_text (layout, "Hello world");
pango_cairo_show_layout (cr);
/* Layout is done in user space coordinates */
pango_layout_get_size (layout, &width, &height);
cairo_rmoveto (cr, 0, (double)height / PANGO_SCALE);
g_object_unref (layout);
g_object_unref (context);
Operation A: Getting metrics
============================
Given:
FcPattern + {size/font_matrix} + user_to_device_matrix
Get:
Device-dependent font metrics
Device-independent font metrics
Device-dependent glyph metrics
Device-independent glyph metrics
Notes:
* All of the above quantities can be computed given the FT_Face set up
with the appropriate FT_Set_Char_Size/FT_Set_Transform. So, a
"XftLockFace" call is sufficient. However, for glyph metrics,
sharing cached information with Cairo and/or hooking glyph-metric
caches to the glyph image caches may be useful.
* Currently Pango never uses a font matrix that isn't a straightforward size,
but I've written {size/font_matrix} since the ability to distort fonts
is already in the current Cairo API. (Interaction with changes to the
matrix done out of fonts.conf needs to be investigated)
* The metrics that Pango is interested in (both device-independent
and device dependent) are the metrics in the *user* coordinate
system. So, the device independent metrics are affected by the
{size/font_matrix} but independent of the user_to_device_matrix.
These are different from the metrics that Xft returns for transformed
fonts.
* Hinting doesn't make sense except for transformation matrices which
are pure scale+multiple-of-90-degree rotation. For all other transformations,
device-dependent and device-independent metrics should be the same.
(Hinting for 90-degree-multiple rotated fonts isn't currently implemented
in FreeType, it may be useful to actually do glyph images unrotated then
rotate. On the other hand, perhaps FreeType just needs to be fixed.)
Operation B: Drawing
====================
Given:
FcPattern + {size/font_matrix} + [user_to_device_matrix] + cairo_t
Draw:
list of glyphs to the context
Notes:
* The [user_to_device_matrix] is in parentheses above because Pango
will have it and be able to pass it, however, it's fine if the
results when it doesn't match the CTM of the cairo_t are
unpredictable.
* The combination
FcPattern + {size/font_matrix} + user_to_device_matrix
shared between the two operations has two properties:
- It corresponds to the PangoFont object, Pango creates this
when doing layout and saves it bewteen computing metrics
and drawing.
- It corresponds to the key of the the glyph metrics cache
in Cairo.
So, it might be useful to actually have an exported object
from the Cairo API for this.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : http://lists.freedesktop.org/archives/cairo/attachments/20040923/20d185a4/attachment.pgp
More information about the cairo
mailing list