From 7e57892983bbc639fe4a402a427b255e4d4ab746 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 6 Aug 2008 21:37:36 -0400 Subject: [PATCH] Add toy font constructor and getters New public API: cairo_toy_font_face_create() cairo_toy_font_face_get_family() cairo_toy_font_face_get_slant() cairo_toy_font_face_get_weight() --- doc/public/cairo-sections.txt | 4 + doc/public/tmpl/cairo-status.sgml | 2 + doc/public/tmpl/cairo-text.sgml | 38 ++++++ src/cairo-font-face.c | 196 ++++++++++++++++++++++++++++-- src/cairo-gstate.c | 4 +- src/cairo-misc.c | 4 + src/cairo-surface.c | 2 + src/cairo.c | 6 +- src/cairo.h | 24 +++- src/cairoint.h | 10 +- test/.gitignore | 1 + test/Makefile.am | 3 + test/toy-font-face.c | 129 ++++++++++++++++++++ test/user-font-proxy-pdf-ref.png | Bin 0 -> 10174 bytes test/user-font-proxy-ps-ref.png | Bin 8452 -> 7227 bytes test/user-font-proxy.c | 45 +++---- 16 files changed, 422 insertions(+), 46 deletions(-) create mode 100644 test/toy-font-face.c create mode 100644 test/user-font-proxy-pdf-ref.png diff --git a/doc/public/cairo-sections.txt b/doc/public/cairo-sections.txt index 3954c45b4..4b9cdc577 100644 --- a/doc/public/cairo-sections.txt +++ b/doc/public/cairo-sections.txt @@ -408,6 +408,10 @@ cairo_show_text_glyphs cairo_font_extents cairo_text_extents cairo_glyph_extents +cairo_toy_font_face_create +cairo_toy_font_face_get_family +cairo_toy_font_face_get_slant +cairo_toy_font_face_get_weight
diff --git a/doc/public/tmpl/cairo-status.sgml b/doc/public/tmpl/cairo-status.sgml index 37b5898c8..7d65bd543 100644 --- a/doc/public/tmpl/cairo-status.sgml +++ b/doc/public/tmpl/cairo-status.sgml @@ -68,6 +68,8 @@ code is required before or after each individual cairo function call. @CAIRO_STATUS_USER_FONT_ERROR: @CAIRO_STATUS_NEGATIVE_COUNT: @CAIRO_STATUS_INVALID_CLUSTERS: +@CAIRO_STATUS_INVALID_SLANT: +@CAIRO_STATUS_INVALID_WEIGHT: diff --git a/doc/public/tmpl/cairo-text.sgml b/doc/public/tmpl/cairo-text.sgml index 06e365ce1..3e5c6bb96 100644 --- a/doc/public/tmpl/cairo-text.sgml +++ b/doc/public/tmpl/cairo-text.sgml @@ -244,3 +244,41 @@ Cairo has two sets of text rendering capabilities: @extents: + + + + + +@family: +@slant: +@weight: +@Returns: + + + + + + + +@font_face: +@Returns: + + + + + + + +@font_face: +@Returns: + + + + + + + +@font_face: +@Returns: + + diff --git a/src/cairo-font-face.c b/src/cairo-font-face.c index 1d6739823..4f822a21c 100644 --- a/src/cairo-font-face.c +++ b/src/cairo-font-face.c @@ -41,19 +41,78 @@ #define _BSD_SOURCE /* for strdup() */ #include "cairoint.h" -/* Forward declare so we can use it as an arbitrary backend for - * _cairo_font_face_nil. - */ static const cairo_font_face_backend_t _cairo_toy_font_face_backend; /* #cairo_font_face_t */ -const cairo_font_face_t _cairo_font_face_nil = { - { 0 }, /* hash_entry */ - CAIRO_STATUS_NO_MEMORY, /* status */ +const cairo_toy_font_face_t _cairo_font_face_nil = { + { + { 0 }, /* hash_entry */ + CAIRO_STATUS_NO_MEMORY, /* status */ CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ - { 0, 0, 0, NULL }, /* user_data */ + { 0, 0, 0, NULL }, /* user_data */ &_cairo_toy_font_face_backend + }, + CAIRO_FONT_FAMILY_DEFAULT, /* family */ + TRUE, /* owns_family */ + CAIRO_FONT_SLANT_DEFAULT, /* slant */ + CAIRO_FONT_WEIGHT_DEFAULT /* weight */ +}; + +static const cairo_toy_font_face_t _cairo_font_face_null_pointer = { + { + { 0 }, /* hash_entry */ + CAIRO_STATUS_NULL_POINTER, /* status */ + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + { 0, 0, 0, NULL }, /* user_data */ + &_cairo_toy_font_face_backend + }, + CAIRO_FONT_FAMILY_DEFAULT, /* family */ + TRUE, /* owns_family */ + CAIRO_FONT_SLANT_DEFAULT, /* slant */ + CAIRO_FONT_WEIGHT_DEFAULT /* weight */ +}; + +static const cairo_toy_font_face_t _cairo_font_face_invalid_string = { + { + { 0 }, /* hash_entry */ + CAIRO_STATUS_INVALID_STRING, /* status */ + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + { 0, 0, 0, NULL }, /* user_data */ + &_cairo_toy_font_face_backend + }, + CAIRO_FONT_FAMILY_DEFAULT, /* family */ + TRUE, /* owns_family */ + CAIRO_FONT_SLANT_DEFAULT, /* slant */ + CAIRO_FONT_WEIGHT_DEFAULT /* weight */ +}; + +static const cairo_toy_font_face_t _cairo_font_face_invalid_slant = { + { + { 0 }, /* hash_entry */ + CAIRO_STATUS_INVALID_SLANT, /* status */ + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + { 0, 0, 0, NULL }, /* user_data */ + &_cairo_toy_font_face_backend + }, + CAIRO_FONT_FAMILY_DEFAULT, /* family */ + TRUE, /* owns_family */ + CAIRO_FONT_SLANT_DEFAULT, /* slant */ + CAIRO_FONT_WEIGHT_DEFAULT /* weight */ +}; + +static const cairo_toy_font_face_t _cairo_font_face_invalid_weight = { + { + { 0 }, /* hash_entry */ + CAIRO_STATUS_INVALID_WEIGHT, /* status */ + CAIRO_REFERENCE_COUNT_INVALID, /* ref_count */ + { 0, 0, 0, NULL }, /* user_data */ + &_cairo_toy_font_face_backend + }, + CAIRO_FONT_FAMILY_DEFAULT, /* family */ + TRUE, /* owns_family */ + CAIRO_FONT_SLANT_DEFAULT, /* slant */ + CAIRO_FONT_WEIGHT_DEFAULT /* weight */ }; cairo_status_t @@ -371,7 +430,7 @@ _cairo_toy_font_face_keys_equal (const void *key_a, } /** - * _cairo_toy_font_face_create: + * cairo_toy_font_face_create: * @family: a font family name, encoded in UTF-8 * @slant: the slant for the font * @weight: the weight for the font @@ -380,18 +439,57 @@ _cairo_toy_font_face_keys_equal (const void *key_a, * These font faces are used in implementation of the the #cairo_t "toy" * font API. * - * Return value: a newly created #cairo_font_face_t, destroy with - * cairo_font_face_destroy() + * If @family is the zero-length string "", the platform-specific default + * family is assumed. The default family then can be queried using + * cairo_toy_font_face_get_family(). + * + * The cairo_select_font_face() function uses this to create font faces. + * See that function for limitations of toy font faces. + * + * Return value: a newly created #cairo_font_face_t. Free with + * cairo_font_face_destroy() when you are done using it. + * + * Since: 1.8 **/ cairo_font_face_t * -_cairo_toy_font_face_create (const char *family, - cairo_font_slant_t slant, - cairo_font_weight_t weight) +cairo_toy_font_face_create (const char *family, + cairo_font_slant_t slant, + cairo_font_weight_t weight) { cairo_status_t status; cairo_toy_font_face_t key, *font_face; cairo_hash_table_t *hash_table; + if (family == NULL) + return (cairo_font_face_t*) &_cairo_font_face_null_pointer; + + /* Make sure we've got valid UTF-8 for the family */ + status = _cairo_utf8_to_ucs4 (family, -1, NULL, NULL); + if (status == CAIRO_STATUS_INVALID_STRING) + return (cairo_font_face_t*) &_cairo_font_face_invalid_string; + else if (status) + return (cairo_font_face_t*) &_cairo_font_face_nil; + + switch (slant) { + case CAIRO_FONT_SLANT_NORMAL: + case CAIRO_FONT_SLANT_ITALIC: + case CAIRO_FONT_SLANT_OBLIQUE: + break; + default: + return (cairo_font_face_t*) &_cairo_font_face_invalid_slant; + } + + switch (weight) { + case CAIRO_FONT_WEIGHT_NORMAL: + case CAIRO_FONT_WEIGHT_BOLD: + break; + default: + return (cairo_font_face_t*) &_cairo_font_face_invalid_weight; + } + + if (*family == '\0') + family = CAIRO_FONT_FAMILY_DEFAULT; + hash_table = _cairo_toy_font_face_hash_table_lock (); if (hash_table == NULL) goto UNWIND; @@ -444,6 +542,7 @@ _cairo_toy_font_face_create (const char *family, UNWIND: return (cairo_font_face_t*) &_cairo_font_face_nil; } +slim_hidden_def (cairo_toy_font_face_create); static void _cairo_toy_font_face_destroy (void *abstract_face) @@ -493,6 +592,77 @@ _cairo_toy_font_face_scaled_font_create (void *abstract_font_face scaled_font)); } +static cairo_bool_t +_cairo_font_face_is_toy (cairo_font_face_t *font_face) +{ + return font_face->backend == &_cairo_toy_font_face_backend; +} + +/** + * 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_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 = (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_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 const cairo_font_face_backend_t _cairo_toy_font_face_backend = { CAIRO_FONT_TYPE_TOY, _cairo_toy_font_face_destroy, diff --git a/src/cairo-gstate.c b/src/cairo-gstate.c index b9d59d3da..b23d0b69e 100644 --- a/src/cairo-gstate.c +++ b/src/cairo-gstate.c @@ -1215,7 +1215,7 @@ _cairo_gstate_select_font_face (cairo_gstate_t *gstate, cairo_font_face_t *font_face; cairo_status_t status; - font_face = _cairo_toy_font_face_create (family, slant, weight); + font_face = cairo_toy_font_face_create (family, slant, weight); if (font_face->status) return font_face->status; @@ -1389,7 +1389,7 @@ _cairo_gstate_ensure_font_face (cairo_gstate_t *gstate) return gstate->font_face->status; - font_face = _cairo_toy_font_face_create (CAIRO_FONT_FAMILY_DEFAULT, + font_face = cairo_toy_font_face_create (CAIRO_FONT_FAMILY_DEFAULT, CAIRO_FONT_SLANT_DEFAULT, CAIRO_FONT_WEIGHT_DEFAULT); if (font_face->status) diff --git a/src/cairo-misc.c b/src/cairo-misc.c index 71338bffe..3432e501f 100644 --- a/src/cairo-misc.c +++ b/src/cairo-misc.c @@ -113,6 +113,10 @@ cairo_status_to_string (cairo_status_t status) return "negative number used where it is not allowed"; case CAIRO_STATUS_INVALID_CLUSTERS: return "input clusters do not represent the accompanying text and glyph arrays"; + case CAIRO_STATUS_INVALID_SLANT: + return "invalid value for an input #cairo_font_slant_t"; + case CAIRO_STATUS_INVALID_WEIGHT: + return "input value for an input #cairo_font_weight_t"; } return ""; diff --git a/src/cairo-surface.c b/src/cairo-surface.c index ca703aa6a..3eca6fc34 100644 --- a/src/cairo-surface.c +++ b/src/cairo-surface.c @@ -2632,6 +2632,8 @@ _cairo_surface_create_in_error (cairo_status_t status) case CAIRO_STATUS_USER_FONT_ERROR: case CAIRO_STATUS_NEGATIVE_COUNT: case CAIRO_STATUS_INVALID_CLUSTERS: + case CAIRO_STATUS_INVALID_SLANT: + case CAIRO_STATUS_INVALID_WEIGHT: default: _cairo_error_throw (CAIRO_STATUS_NO_MEMORY); return (cairo_surface_t *) &_cairo_surface_nil; diff --git a/src/cairo.c b/src/cairo.c index 46e587b1e..4151eedf1 100644 --- a/src/cairo.c +++ b/src/cairo.c @@ -2641,8 +2641,12 @@ cairo_copy_clip_rectangle_list (cairo_t *cr) * * If text is drawn without a call to cairo_select_font_face(), (nor * cairo_set_font_face() nor cairo_set_scaled_font()), the default - * family is "sans", slant is %CAIRO_FONT_SLANT_NORMAL, and weight is + * family is platform-specific, but is essentially "sans-serif". + * Default slant is %CAIRO_FONT_SLANT_NORMAL, and default weight is * %CAIRO_FONT_WEIGHT_NORMAL. + * + * This function is equivalent to a call to cairo_toy_font_face_create() + * followed by cairo_set_font_face(). **/ void cairo_select_font_face (cairo_t *cr, diff --git a/src/cairo.h b/src/cairo.h index 0829591e8..1be31ab9a 100644 --- a/src/cairo.h +++ b/src/cairo.h @@ -208,6 +208,8 @@ typedef struct _cairo_user_data_key { * @CAIRO_STATUS_USER_FONT_ERROR: error occurred in a user-font callback function (Since 1.8) * @CAIRO_STATUS_NEGATIVE_COUNT: negative number used where it is not allowed (Since 1.8) * @CAIRO_STATUS_INVALID_CLUSTERS: input clusters do not represent the accompanying text and glyph array (Since 1.8) + * @CAIRO_STATUS_INVALID_SLANT: invalid value for an input #cairo_font_slant_t (Since 1.8) + * @CAIRO_STATUS_INVALID_CLUSTERS: input value for an input #cairo_font_weight_t (Since 1.8) * * #cairo_status_t is used to indicate errors that can occur when * using Cairo. In some cases it is returned directly by functions. @@ -247,7 +249,9 @@ typedef enum _cairo_status { CAIRO_STATUS_USER_FONT_IMMUTABLE, CAIRO_STATUS_USER_FONT_ERROR, CAIRO_STATUS_NEGATIVE_COUNT, - CAIRO_STATUS_INVALID_CLUSTERS + CAIRO_STATUS_INVALID_CLUSTERS, + CAIRO_STATUS_INVALID_SLANT, + CAIRO_STATUS_INVALID_WEIGHT /* after adding a new error: update CAIRO_STATUS_LAST_STATUS in cairoint.h */ } cairo_status_t; @@ -1333,6 +1337,24 @@ cairo_public void cairo_scaled_font_get_font_options (cairo_scaled_font_t *scaled_font, cairo_font_options_t *options); + +/* Toy fonts */ + +cairo_public cairo_font_face_t * +cairo_toy_font_face_create (const char *family, + cairo_font_slant_t slant, + cairo_font_weight_t weight); + +cairo_public const char * +cairo_toy_font_face_get_family (cairo_font_face_t *font_face); + +cairo_public cairo_font_slant_t +cairo_toy_font_face_get_slant (cairo_font_face_t *font_face); + +cairo_public cairo_font_weight_t +cairo_toy_font_face_get_weight (cairo_font_face_t *font_face); + + /* User fonts */ cairo_public cairo_font_face_t * diff --git a/src/cairoint.h b/src/cairoint.h index 0f2177694..486a164db 100644 --- a/src/cairoint.h +++ b/src/cairoint.h @@ -110,7 +110,7 @@ _cairo_win32_tmpfile (void); * a bit of a pain, but it should be easy to always catch as long as * one adds a new test case to test a trigger of the new status value. */ -#define CAIRO_STATUS_LAST_STATUS CAIRO_STATUS_INVALID_CLUSTERS +#define CAIRO_STATUS_LAST_STATUS CAIRO_STATUS_INVALID_SLANT /* Size in bytes of buffer to use off the stack per functions. @@ -1304,7 +1304,7 @@ _cairo_color_equal (const cairo_color_t *color_a, /* cairo-font-face.c */ -extern const cairo_private cairo_font_face_t _cairo_font_face_nil; +extern const cairo_private cairo_toy_font_face_t _cairo_font_face_nil; cairo_private void _cairo_font_face_init (cairo_font_face_t *font_face, @@ -1314,11 +1314,6 @@ cairo_private cairo_status_t _cairo_font_face_set_error (cairo_font_face_t *font_face, cairo_status_t status); -cairo_private cairo_font_face_t * -_cairo_toy_font_face_create (const char *family, - cairo_font_slant_t slant, - cairo_font_weight_t weight); - cairo_private void _cairo_unscaled_font_init (cairo_unscaled_font_t *font, const cairo_unscaled_font_backend_t *backend); @@ -2447,6 +2442,7 @@ slim_hidden_proto (cairo_surface_set_fallback_resolution); slim_hidden_proto (cairo_surface_copy_page); slim_hidden_proto (cairo_surface_show_page); slim_hidden_proto (cairo_surface_status); +slim_hidden_proto (cairo_toy_font_face_create); slim_hidden_proto (cairo_version_string); #if CAIRO_HAS_PNG_FUNCTIONS diff --git a/test/.gitignore b/test/.gitignore index 4a72553dc..1edaff3d4 100644 --- a/test/.gitignore +++ b/test/.gitignore @@ -197,6 +197,7 @@ text-pattern text-rotate text-transform text-zero-len +toy-font-face transforms translate-show-surface trap-clip diff --git a/test/Makefile.am b/test/Makefile.am index f9ab75d44..5af7c0860 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -158,6 +158,7 @@ text-pattern$(EXEEXT) \ text-rotate$(EXEEXT) \ text-transform$(EXEEXT) \ text-zero-len$(EXEEXT) \ +toy-font-face$(EXEEXT) \ transforms$(EXEEXT) \ translate-show-surface$(EXEEXT) \ trap-clip$(EXEEXT) \ @@ -715,6 +716,7 @@ REFERENCE_IMAGES = \ user-font-pdf-ref.png \ user-font-svg-ref.png \ user-font-proxy-ref.png \ + user-font-proxy-pdf-ref.png \ user-font-proxy-ps-ref.png \ user-font-proxy-svg-ref.png \ unbounded-operator-quartz-ref.png \ @@ -764,6 +766,7 @@ png \ ps-features \ svg-clip \ svg-surface \ +toy-font-face \ user-data # A hook that summarises the failures diff --git a/test/toy-font-face.c b/test/toy-font-face.c new file mode 100644 index 000000000..262f7ce5f --- /dev/null +++ b/test/toy-font-face.c @@ -0,0 +1,129 @@ +/* + * Copyright © 2005,2008 Red Hat, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without + * fee, provided that the above copyright notice appear in all copies + * and that both that copyright notice and this permission notice + * appear in supporting documentation, and that the name of + * Red Hat, Inc. not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Red Hat, Inc. makes no representations about the + * suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Carl D. Worth + * Behdad Esfahbod + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +#if HAVE_FCFINI +#include +#endif + +int +main (void) +{ + cairo_t *cr; + cairo_surface_t *surface; + cairo_font_face_t *font_face; + + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, 0, 0); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + + font_face = cairo_font_face_reference (cairo_get_font_face (cr)); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (cairo_toy_font_face_get_family (font_face) != NULL); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_NORMAL); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_NORMAL); + assert (cairo_font_face_status(font_face) == CAIRO_STATUS_SUCCESS); + cairo_font_face_destroy (font_face); + + cairo_select_font_face (cr, + "bizarre", + CAIRO_FONT_SLANT_OBLIQUE, + CAIRO_FONT_WEIGHT_BOLD); + font_face = cairo_font_face_reference (cairo_get_font_face (cr)); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (0 == (strcmp) (cairo_toy_font_face_get_family (font_face), "bizarre")); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_OBLIQUE); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_BOLD); + assert (cairo_font_face_status(font_face) == CAIRO_STATUS_SUCCESS); + cairo_font_face_destroy (font_face); + + font_face = cairo_toy_font_face_create ("bozarre", + CAIRO_FONT_SLANT_OBLIQUE, + CAIRO_FONT_WEIGHT_BOLD); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (0 == (strcmp) (cairo_toy_font_face_get_family (font_face), "bozarre")); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_OBLIQUE); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_BOLD); + assert (cairo_font_face_status(font_face) == CAIRO_STATUS_SUCCESS); + cairo_font_face_destroy (font_face); + + font_face = cairo_toy_font_face_create (NULL, + CAIRO_FONT_SLANT_OBLIQUE, + CAIRO_FONT_WEIGHT_BOLD); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (0 == (strcmp) (cairo_toy_font_face_get_family (font_face), "")); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_NORMAL); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_NORMAL); + assert (cairo_font_face_status(font_face) == CAIRO_STATUS_NULL_POINTER); + cairo_font_face_destroy (font_face); + + font_face = cairo_toy_font_face_create ("\xff", + CAIRO_FONT_SLANT_OBLIQUE, + CAIRO_FONT_WEIGHT_BOLD); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (0 == (strcmp) (cairo_toy_font_face_get_family (font_face), "")); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_NORMAL); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_NORMAL); + assert (cairo_font_face_status(font_face) == CAIRO_STATUS_INVALID_STRING); + cairo_font_face_destroy (font_face); + + font_face = cairo_toy_font_face_create ("sans", + -1, + CAIRO_FONT_WEIGHT_BOLD); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (0 == (strcmp) (cairo_toy_font_face_get_family (font_face), "")); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_NORMAL); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_NORMAL); + assert (cairo_font_face_status(font_face) == CAIRO_STATUS_INVALID_SLANT); + cairo_font_face_destroy (font_face); + + font_face = cairo_toy_font_face_create ("sans", + CAIRO_FONT_SLANT_OBLIQUE, + -1); + assert (cairo_font_face_get_type (font_face) == CAIRO_FONT_TYPE_TOY); + assert (0 == (strcmp) (cairo_toy_font_face_get_family (font_face), "")); + assert (cairo_toy_font_face_get_slant (font_face) == CAIRO_FONT_SLANT_NORMAL); + assert (cairo_toy_font_face_get_weight (font_face) == CAIRO_FONT_WEIGHT_NORMAL); + assert (cairo_font_face_status(font_face) == CAIRO_STATUS_INVALID_WEIGHT); + cairo_font_face_destroy (font_face); + + cairo_destroy (cr); + + cairo_debug_reset_static_data (); +#if HAVE_FCFINI + FcFini (); +#endif + + return 0; +} diff --git a/test/user-font-proxy-pdf-ref.png b/test/user-font-proxy-pdf-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..0eda0f4207c4566095ff1160b8d3ab16e5236da9 GIT binary patch literal 10174 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 kxfhSsW&i*H literal 0 HcmV?d00001 diff --git a/test/user-font-proxy-ps-ref.png b/test/user-font-proxy-ps-ref.png index 78bee6c05c2ed9299f5097cb871f01ab9f3664f2..4305411b90b7528d6396956afb7a1b9f2b7afbbf 100644 GIT binary patch literal 7227 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 literal 8452 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 F{}+>frSSj& diff --git a/test/user-font-proxy.c b/test/user-font-proxy.c index f54139cee..c7b29abdf 100644 --- a/test/user-font-proxy.c +++ b/test/user-font-proxy.c @@ -51,42 +51,43 @@ cairo_test_t test = { draw }; -static cairo_user_data_key_t fallback_scaled_font_key; +static cairo_user_data_key_t fallback_font_face_key; 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_face_t *font_face; + cairo_matrix_t font_matrix, 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); + font_face = cairo_toy_font_face_create ("", + CAIRO_FONT_SLANT_NORMAL, + CAIRO_FONT_WEIGHT_NORMAL); - cairo_set_font_size (cr, 1.); + cairo_matrix_init_identity (&font_matrix); 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); + + fallback_scaled_font = cairo_scaled_font_create (font_face, + &font_matrix, + &ctm, + 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, - &fallback_scaled_font_key, - fallback_scaled_font, - cairo_scaled_font_destroy); - - cairo_destroy (cr); - cairo_scaled_font_extents (fallback_scaled_font, extents); + cairo_scaled_font_destroy (fallback_scaled_font); + + cairo_scaled_font_set_user_data (scaled_font, + &fallback_font_face_key, + font_face, + cairo_font_face_destroy); + return CAIRO_STATUS_SUCCESS; } @@ -101,9 +102,9 @@ test_scaled_font_render_glyph (cairo_scaled_font_t *scaled_font, /* 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, - &fallback_scaled_font_key)); + cairo_set_font_face (cr, + cairo_scaled_font_get_user_data (scaled_font, + &fallback_font_face_key)); cairo_show_text (cr, text); cairo_text_extents (cr, text, extents);