static cairo_status_t _cairo_toy_font_face_scaled_font_get_implementation (void *abstract_font_face, cairo_font_face_t **font_face_out) { cairo_toy_font_face_t *font_face = abstract_font_face; cairo_status_t status; if (font_face->base.status) return font_face->base.status; if (CAIRO_SCALED_FONT_BACKEND_DEFAULT != &_cairo_user_scaled_font_backend) { const cairo_scaled_font_backend_t * backend = CAIRO_SCALED_FONT_BACKEND_DEFAULT; if (backend->get_implementation == NULL) { *font_face_out = &font_face->base; return CAIRO_STATUS_SUCCESS; } status = backend->get_implementation (font_face, font_face_out); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return _cairo_font_face_set_error (&font_face->base, status); } status = _cairo_user_scaled_font_backend.get_implementation (font_face, font_face_out); return _cairo_font_face_set_error (&font_face->base, status); }
static cairo_font_face_t * _cairo_toy_font_face_create_impl_face (cairo_toy_font_face_t *font_face) { const cairo_font_face_backend_t * backend = CAIRO_FONT_FACE_BACKEND_DEFAULT; cairo_font_face_t *impl_font_face; cairo_int_status_t status = CAIRO_INT_STATUS_UNSUPPORTED; if (font_face->base.status) return NULL; if (backend->create_for_toy != NULL && 0 != strncmp (font_face->family, CAIRO_USER_FONT_FAMILY_DEFAULT, strlen (CAIRO_USER_FONT_FAMILY_DEFAULT))) { status = backend->create_for_toy (font_face, &impl_font_face); } if (status == CAIRO_INT_STATUS_UNSUPPORTED) { backend = &_cairo_user_font_face_backend; status = backend->create_for_toy (font_face, &impl_font_face); } if (_cairo_font_face_set_error (&font_face->base, status)) return NULL; if (_cairo_font_face_set_error (&font_face->base, impl_font_face->status)) { cairo_font_face_destroy (impl_font_face); return NULL; } return impl_font_face; }
/** * cairo_user_font_face_set_unicode_to_glyph_func: * @font_face: A user font face * @unicode_to_glyph_func: The unicode_to_glyph callback, or %NULL * * Sets the unicode-to-glyph conversion function of a user-font. * See #cairo_user_scaled_font_unicode_to_glyph_func_t for details of how the callback * works. * * The font-face should not be immutable or a %CAIRO_STATUS_USER_FONT_IMMUTABLE * error will occur. A user font-face is immutable as soon as a scaled-font * is created from it. * * Since: 1.8 **/ void cairo_user_font_face_set_unicode_to_glyph_func (cairo_font_face_t *font_face, cairo_user_scaled_font_unicode_to_glyph_func_t unicode_to_glyph_func) { cairo_user_font_face_t *user_font_face = (cairo_user_font_face_t *) font_face; if (! _cairo_font_face_is_user (font_face)) { if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) return; } if (user_font_face->immutable) { if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_USER_FONT_IMMUTABLE)) return; } user_font_face->scaled_font_methods.unicode_to_glyph = unicode_to_glyph_func; }
/** * cairo_user_font_face_get_unicode_to_glyph_func: * @font_face: A user font face * * Gets the unicode-to-glyph conversion function of a user-font. * * Return value: The unicode_to_glyph callback of @font_face * or %NULL if none set. * * Since: 1.8 **/ cairo_user_scaled_font_unicode_to_glyph_func_t cairo_user_font_face_get_unicode_to_glyph_func (cairo_font_face_t *font_face) { cairo_user_font_face_t *user_font_face = (cairo_user_font_face_t *) font_face; if (! _cairo_font_face_is_user (font_face)) { if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) return NULL; } return user_font_face->scaled_font_methods.unicode_to_glyph; }
/** * cairo_toy_font_face_get_weight: * @font_face: A toy font face * * Gets the weight a toy font. * * Return value: The weight value * * Since: 1.8 **/ cairo_font_weight_t cairo_toy_font_face_get_weight (cairo_font_face_t *font_face) { cairo_toy_font_face_t *toy_font_face = (cairo_toy_font_face_t *) font_face; if (! _cairo_font_face_is_toy (font_face)) { if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) return CAIRO_FONT_WEIGHT_DEFAULT; } return toy_font_face->weight; }
static cairo_status_t _cairo_toy_font_face_scaled_font_create (void *abstract_font_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, cairo_scaled_font_t **scaled_font) { cairo_toy_font_face_t *font_face = abstract_font_face; cairo_status_t status; if (font_face->base.status) return font_face->base.status; status = cairo_font_options_status ((cairo_font_options_t *) options); if (status) return status; if (CAIRO_SCALED_FONT_BACKEND_DEFAULT != &_cairo_user_scaled_font_backend) { const cairo_scaled_font_backend_t * backend = CAIRO_SCALED_FONT_BACKEND_DEFAULT; *scaled_font = NULL; status = backend->create_toy (font_face, font_matrix, ctm, options, scaled_font); if (status != CAIRO_INT_STATUS_UNSUPPORTED) return _cairo_font_face_set_error (&font_face->base, status); if (*scaled_font) cairo_scaled_font_destroy (*scaled_font); } status = _cairo_user_scaled_font_backend.create_toy (font_face, font_matrix, ctm, options, scaled_font); return _cairo_font_face_set_error (&font_face->base, status); }
/** * cairo_toy_font_face_get_family: * @font_face: A toy font face * * Gets the familly name of a toy font. * * Return value: The family name. This string is owned by the font face * and remains valid as long as the font face is alive (referenced). * * Since: 1.8 **/ const char * cairo_toy_font_face_get_family (cairo_font_face_t *font_face) { cairo_toy_font_face_t *toy_font_face = (cairo_toy_font_face_t *) font_face; if (! _cairo_font_face_is_toy (font_face)) { if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) return CAIRO_FONT_FAMILY_DEFAULT; } assert (toy_font_face->owns_family); return toy_font_face->family; }
/** * cairo_user_font_face_set_init_func: * @font_face: A user font face * @init_func: The init callback, or %NULL * * Sets the scaled-font initialization function of a user-font. * See #cairo_user_scaled_font_init_func_t for details of how the callback * works. * * The font-face should not be immutable or a %CAIRO_STATUS_USER_FONT_IMMUTABLE * error will occur. A user font-face is immutable as soon as a scaled-font * is created from it. * * Since: 1.8 **/ void cairo_user_font_face_set_init_func (cairo_font_face_t *font_face, cairo_user_scaled_font_init_func_t init_func) { cairo_user_font_face_t *user_font_face; if (font_face->status) return; if (! _cairo_font_face_is_user (font_face)) { if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) return; } user_font_face = (cairo_user_font_face_t *) font_face; if (user_font_face->immutable) { if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_USER_FONT_IMMUTABLE)) return; } user_font_face->scaled_font_methods.init = init_func; }
static cairo_status_t _cairo_toy_font_face_scaled_font_create (void *abstract_font_face, const cairo_matrix_t *font_matrix, const cairo_matrix_t *ctm, const cairo_font_options_t *options, cairo_scaled_font_t **scaled_font) { cairo_toy_font_face_t *font_face = (cairo_toy_font_face_t *) abstract_font_face; ASSERT_NOT_REACHED; return _cairo_font_face_set_error (&font_face->base, CAIRO_STATUS_FONT_TYPE_MISMATCH); }
/** * cairo_toy_font_face_get_slant: * @font_face: A toy font face * * Gets the slant a toy font. * * Return value: The slant value * * Since: 1.8 **/ cairo_font_slant_t cairo_toy_font_face_get_slant (cairo_font_face_t *font_face) { cairo_toy_font_face_t *toy_font_face; if (font_face->status) return CAIRO_FONT_SLANT_DEFAULT; toy_font_face = (cairo_toy_font_face_t *) font_face; if (! _cairo_font_face_is_toy (font_face)) { if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) return CAIRO_FONT_SLANT_DEFAULT; } return toy_font_face->slant; }
cairo_font_face_t * _cairo_toy_font_face_get_implementation (cairo_font_face_t *font_face) { cairo_toy_font_face_t *toy_font_face; if (font_face->status) return NULL; toy_font_face = (cairo_toy_font_face_t *) font_face; if (! _cairo_font_face_is_toy (font_face)) { if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) return NULL; } return toy_font_face->impl_face ? toy_font_face->impl_face : font_face; }
/** * cairo_user_font_face_get_text_to_glyphs_func: * @font_face: A user font face * * Gets the text-to-glyphs conversion function of a user-font. * * Return value: The text_to_glyphs callback of @font_face * or %NULL if none set or an error occurred. * * Since: 1.8 **/ cairo_user_scaled_font_text_to_glyphs_func_t cairo_user_font_face_get_text_to_glyphs_func (cairo_font_face_t *font_face) { cairo_user_font_face_t *user_font_face; if (font_face->status) return NULL; if (! _cairo_font_face_is_user (font_face)) { if (_cairo_font_face_set_error (font_face, CAIRO_STATUS_FONT_TYPE_MISMATCH)) return NULL; } user_font_face = (cairo_user_font_face_t *) font_face; return user_font_face->scaled_font_methods.text_to_glyphs; }