From 30cd66fe9a017af9ab2e5b25a13ff70b66b62d17 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Wed, 16 Aug 2006 19:43:55 -0400 Subject: [PATCH] [test] Add ft-text-vertical-layout-truetype. --- test/ft-text-vertical-layout-truetype-ref.png | Bin 0 -> 3933 bytes ...-text-vertical-layout-truetype-svg-ref.png | Bin 0 -> 3956 bytes test/ft-text-vertical-layout-truetype.c | 154 ++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 test/ft-text-vertical-layout-truetype-ref.png create mode 100644 test/ft-text-vertical-layout-truetype-svg-ref.png create mode 100644 test/ft-text-vertical-layout-truetype.c diff --git a/test/ft-text-vertical-layout-truetype-ref.png b/test/ft-text-vertical-layout-truetype-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..eaee4f0059934f2f3f83f23c3428ac419e300877 GIT binary patch literal 3933 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 literal 0 HcmV?d00001 diff --git a/test/ft-text-vertical-layout-truetype-svg-ref.png b/test/ft-text-vertical-layout-truetype-svg-ref.png new file mode 100644 index 0000000000000000000000000000000000000000..a01c9d3b0cfe626beacbb8ed2d368148106b6278 GIT binary patch literal 3956 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 ctFMNgr-qz~1r)^UybFJ612ssI20 literal 0 HcmV?d00001 diff --git a/test/ft-text-vertical-layout-truetype.c b/test/ft-text-vertical-layout-truetype.c new file mode 100644 index 000000000..2b2e9cb58 --- /dev/null +++ b/test/ft-text-vertical-layout-truetype.c @@ -0,0 +1,154 @@ +/* + * Copyright © 2006 Jinghua Luo + * + * 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. + * + * JINGHUA LUO 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: Jinghua Luo + * Derived from: + * text-antialias-none.c, + * ft-font-create-for-ft-face.c. + * Original Author: Carl D. Worth + */ +#include "cairo-test.h" +#include + +#define WIDTH 80 +#define HEIGHT 200 +#define TEXT_SIZE 30 + +static cairo_test_draw_function_t draw; + +cairo_test_t test = { + "ft-text-vertical-layout-truetype", + "Tests text rendering for vertical layout with TrueType fonts", + WIDTH, HEIGHT, + draw +}; + +static cairo_scaled_font_t * +create_scaled_font (cairo_t * cr) +{ + FcPattern *pattern, *resolved; + FcResult result; + cairo_font_face_t *font_face; + cairo_scaled_font_t *scaled_font; + cairo_font_options_t *font_options; + cairo_matrix_t font_matrix, ctm; + double pixel_size; + + font_options = cairo_font_options_create (); + + cairo_get_font_options (cr, font_options); + + pattern = FcPatternCreate (); + + FcPatternAddString (pattern, FC_FAMILY, (FcChar8 *)"Bitstream Vera Sans"); + FcPatternAddDouble (pattern, FC_PIXEL_SIZE, TEXT_SIZE); + FcConfigSubstitute (NULL, pattern, FcMatchPattern); + + cairo_ft_font_options_substitute (font_options, pattern); + + FcDefaultSubstitute (pattern); + resolved = FcFontMatch (NULL, pattern, &result); + + /* set layout to vertical */ + FcPatternDel (resolved, FC_VERTICAL_LAYOUT); + FcPatternAddBool (resolved, FC_VERTICAL_LAYOUT, FcTrue); + + FcPatternGetDouble (resolved, FC_PIXEL_SIZE, 0, &pixel_size); + + font_face = cairo_ft_font_face_create_for_pattern (resolved); + + cairo_matrix_init_translate (&font_matrix, 10, 30); + cairo_matrix_rotate (&font_matrix, M_PI_2/3); + cairo_matrix_scale (&font_matrix, pixel_size, pixel_size); + + cairo_get_matrix (cr, &ctm); + + scaled_font = cairo_scaled_font_create (font_face, + &font_matrix, + &ctm, + font_options); + + cairo_font_options_destroy (font_options); + cairo_font_face_destroy (font_face); + FcPatternDestroy (pattern); + FcPatternDestroy (resolved); + + return scaled_font; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_text_extents_t extents; + cairo_scaled_font_t * scaled_font; + static char text[] = "i-W"; + double line_width, x, y; + + line_width = cairo_get_line_width (cr); + + /* We draw in the default black, so paint white first. */ + cairo_save (cr); + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */ + cairo_paint (cr); + cairo_restore (cr); + + scaled_font = create_scaled_font (cr); + cairo_set_scaled_font (cr, scaled_font); + + cairo_set_line_width (cr, 1.0); + cairo_set_source_rgb (cr, 0, 0, 0); /* black */ + cairo_text_extents (cr, text, &extents); + x = width - (extents.width + extents.x_bearing) - 5; + y = height - (extents.height + extents.y_bearing) - 5; + cairo_move_to (cr, x, y); + cairo_show_text (cr, text); + cairo_rectangle (cr, + x + extents.x_bearing - line_width / 2, + y + extents.y_bearing - line_width / 2, + extents.width + line_width, + extents.height + line_width); + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 0, 0, 1); /* blue */ + cairo_text_extents (cr, text, &extents); + x = -extents.x_bearing + 5; + y = -extents.y_bearing + 5; + cairo_move_to (cr, x, y); + cairo_text_path (cr, text); + cairo_fill (cr); + cairo_rectangle (cr, + x + extents.x_bearing - line_width / 2, + y + extents.y_bearing - line_width / 2, + extents.width + line_width, + extents.height + line_width); + cairo_stroke (cr); + + cairo_scaled_font_destroy (scaled_font); + + return CAIRO_TEST_SUCCESS; +} + +int +main (void) +{ + return cairo_test (&test); +}