[cairo] user-font proxies

Behdad Esfahbod behdad at behdad.org
Sat May 24 22:30:16 PDT 2008


I added the test user-font-proxy that simply uses the default cairo toy
font to show text.  The render_glyph part is as beautiful as I wanted it
to, except for one catch:

static cairo_status_t
test_scaled_font_render_glyph (cairo_scaled_font_t  *scaled_font,
                               unsigned long         glyph,
                               cairo_t              *cr,
                               cairo_text_extents_t *extents)
    char text[2] = "\0";

    /* XXX only works for ASCII.  need ucs4_to_utf8 :( */
    text[0] = glyph;

    cairo_set_scaled_font (cr,
                           cairo_scaled_font_get_user_data (scaled_font,
    cairo_show_text (cr, text);
    cairo_text_extents (cr, text, extents);


Ughh. We get ucs4, but need UTF-8.  That's because we don't have
cairo_scaled_font_text_to_glyph() exposed publicly.  Should we finally
add that?  With user fonts that makes some sense now as it's not
necessarily toy anymore.

The create part was uglier:

static cairo_status_t
test_scaled_font_init (cairo_scaled_font_t  *scaled_font,
                       cairo_font_extents_t *extents)
  cairo_t *cr;
  cairo_surface_t *surface;
  cairo_matrix_t ctm;
  cairo_font_options_t *font_options;
  cairo_scaled_font_t *fallback_scaled_font;

  /* painful way to get default font face used by toy api */
  surface = cairo_image_surface_create (CAIRO_FORMAT_A8, 0, 0);
  cr = cairo_create (surface);
  cairo_surface_destroy (surface);

  cairo_set_font_size (cr, 1.);
  cairo_scaled_font_get_scale_matrix (scaled_font, &ctm);
  cairo_set_matrix (cr, &ctm);

  font_options = cairo_font_options_create ();
  cairo_scaled_font_get_font_options (scaled_font, font_options);
  cairo_set_font_options (cr, font_options);
  cairo_font_options_destroy (font_options);

  fallback_scaled_font = cairo_scaled_font_reference (cairo_get_scaled_font (cr)),
  cairo_scaled_font_set_user_data (scaled_font,

  cairo_destroy (cr);

  cairo_scaled_font_extents (fallback_scaled_font, extents);


Still not too bad if we correctly document the API and provide samples.
Most of the pain is in getting the default toy font face without having
a cairo_t around.

I fixed fontmap locking so this works now.

Next, add twin's stroke font to user.
Next next, write a Pango user font.


"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