Implement cairo_get_scaled_font()

This commit is contained in:
Behdad Esfahbod 2007-02-27 20:09:22 -05:00
parent d64b194a45
commit ed75e24898
8 changed files with 70 additions and 8 deletions

2
TODO
View file

@ -81,8 +81,6 @@ Other changes (this text used to be in RODMAP)
http://lists.freedesktop.org/archives/cairo/2007-January/009372.html
cairo_font_metrics_t
http://lists.freedesktop.org/archives/cairo/2007-January/009373.html
cairo_get_scaled_font()
http://lists.freedesktop.org/archives/cairo/2007-January/009374.html
User-font API---a couple of threads of interest:
http://lists.freedesktop.org/archives/cairo/2007-February/009539.html
http://lists.freedesktop.org/archives/cairo/2006-May/006893.html

View file

@ -322,12 +322,13 @@ cairo_set_font_matrix
cairo_get_font_matrix
cairo_set_font_options
cairo_get_font_options
cairo_set_font_face
cairo_get_font_face
cairo_set_scaled_font
cairo_get_scaled_font
cairo_show_text
cairo_show_glyphs
cairo_get_font_face
cairo_font_extents
cairo_set_font_face
cairo_set_scaled_font
cairo_text_extents
cairo_glyph_extents
</SECTION>

View file

@ -1271,6 +1271,21 @@ _cairo_gstate_get_font_face (cairo_gstate_t *gstate,
return CAIRO_STATUS_SUCCESS;
}
cairo_status_t
_cairo_gstate_get_scaled_font (cairo_gstate_t *gstate,
cairo_scaled_font_t **scaled_font)
{
cairo_status_t status;
status = _cairo_gstate_ensure_scaled_font (gstate);
if (status)
return status;
*scaled_font = gstate->scaled_font;
return CAIRO_STATUS_SUCCESS;
}
/*
* Like everything else in this file, fonts involve Too Many Coordinate Spaces;
* it is easy to get confused about what's going on.

View file

@ -71,7 +71,7 @@ _cairo_scaled_glyph_destroy (void *abstract_glyph)
free (scaled_glyph);
}
static const cairo_scaled_font_t _cairo_scaled_font_nil = {
const cairo_scaled_font_t _cairo_scaled_font_nil = {
{ 0 }, /* hash_entry */
CAIRO_STATUS_NO_MEMORY, /* status */
CAIRO_REF_COUNT_INVALID, /* ref_count */

View file

@ -2594,6 +2594,36 @@ BAIL:
_cairo_set_error (cr, cr->status);
}
/**
* cairo_get_scaled_font:
* @cr: a #cairo_t
*
* Gets the current font face for a #cairo_t.
*
* Return value: the current font object. Can return %NULL
* on out-of-memory or if the context is already in
* an error state. This object is owned by cairo. To keep
* a reference to it, you must call cairo_font_face_reference().
*
* Since: 1.4
**/
cairo_scaled_font_t *
cairo_get_scaled_font (cairo_t *cr)
{
cairo_scaled_font_t *scaled_font;
if (cr->status)
return (cairo_scaled_font_t *)&_cairo_scaled_font_nil;
cr->status = _cairo_gstate_get_scaled_font (cr->gstate, &scaled_font);
if (cr->status) {
_cairo_set_error (cr, cr->status);
return (cairo_scaled_font_t *)&_cairo_scaled_font_nil;
}
return scaled_font;
}
/**
* cairo_text_extents:
* @cr: a #cairo_t

View file

@ -950,6 +950,9 @@ cairo_public void
cairo_set_scaled_font (cairo_t *cr,
const cairo_scaled_font_t *scaled_font);
cairo_public cairo_scaled_font_t *
cairo_get_scaled_font (cairo_t *cr);
cairo_public void
cairo_show_text (cairo_t *cr, const char *utf8);

View file

@ -1498,6 +1498,10 @@ cairo_private cairo_status_t
_cairo_gstate_get_font_face (cairo_gstate_t *gstate,
cairo_font_face_t **font_face);
cairo_private cairo_status_t
_cairo_gstate_get_scaled_font (cairo_gstate_t *gstate,
cairo_scaled_font_t **scaled_font);
cairo_private cairo_status_t
_cairo_gstate_get_font_extents (cairo_gstate_t *gstate,
cairo_font_extents_t *extents);
@ -1592,6 +1596,7 @@ _cairo_scaled_font_set_error (cairo_scaled_font_t *scaled_font,
cairo_status_t status);
extern const cairo_private cairo_font_face_t _cairo_font_face_nil;
extern const cairo_private cairo_scaled_font_t _cairo_scaled_font_nil;
cairo_private void
_cairo_font_face_init (cairo_font_face_t *font_face,

View file

@ -31,6 +31,7 @@ main (void)
cairo_surface_t *surface;
cairo_t *cr;
cairo_font_face_t *font_face;
cairo_scaled_font_t *scaled_font;
cairo_test_init ("font-face-get-type");
@ -43,16 +44,25 @@ main (void)
CAIRO_FONT_SLANT_NORMAL,
CAIRO_FONT_WEIGHT_NORMAL);
font_face = cairo_get_font_face (cr);
cairo_test_log ("Testing return value of cairo_font_face_get_type\n");
font_face = cairo_get_font_face (cr);
if (cairo_font_face_get_type (font_face) != CAIRO_FONT_TYPE_TOY) {
cairo_test_log ("Unexpected value %d from cairo_font_face_get_type (expected %d)\n",
cairo_font_face_get_type (font_face), CAIRO_FONT_TYPE_TOY);
return CAIRO_TEST_FAILURE;
}
cairo_test_log ("Testing return value of cairo_get_scaled_font\n");
scaled_font = cairo_get_scaled_font (cr);
if (cairo_scaled_font_get_font_face (scaled_font) != font_face) {
cairo_test_log ("Font face returned from the scaled font is different from that returned by the context\n");
return CAIRO_TEST_FAILURE;
}
cairo_destroy (cr);
cairo_surface_destroy (surface);