From 7c6f2d4f24f89ea6a46fb54e838f986c0aeeccdf Mon Sep 17 00:00:00 2001 From: Adrian Johnson Date: Fri, 30 Jul 2021 10:36:08 +0930 Subject: [PATCH] Add ft-color-font test --- .gitlab-ci.yml | 3 +- test/Makefile.sources | 1 + test/ft-color-font.c | 108 ++++++++++++++++++ test/meson.build | 1 + test/reference/ft-color-font.image16.ref.png | Bin 0 -> 1151 bytes test/reference/ft-color-font.ref.png | Bin 0 -> 1578 bytes test/reference/ft-color-font.script.xfail.png | Bin 0 -> 1976 bytes 7 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 test/ft-color-font.c create mode 100644 test/reference/ft-color-font.image16.ref.png create mode 100644 test/reference/ft-color-font.ref.png create mode 100644 test/reference/ft-color-font.script.xfail.png diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ddfdeb773..cf065fe9f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -8,7 +8,7 @@ include: variables: FDO_UPSTREAM_REPO: 'cairo/cairo' FDO_DISTRIBUTION_VERSION: '34' - FDO_DISTRIBUTION_TAG: '2021-05-04.2' + FDO_DISTRIBUTION_TAG: '2021-07-31.0' # TODO: should probably get its own image at some point instead of reusing the GStreamer one. WINDOWS_IMAGE: "registry.freedesktop.org/gstreamer/gst-ci/amd64/windows:v16-master" @@ -94,6 +94,7 @@ fedora image: dejavu-sans-fonts dejavu-sans-mono-fonts dejavu-serif-fonts + google-noto-emoji-color-fonts fedora autotools build: extends: diff --git a/test/Makefile.sources b/test/Makefile.sources index 0c8d4923d..b887b054d 100644 --- a/test/Makefile.sources +++ b/test/Makefile.sources @@ -411,6 +411,7 @@ ft_font_test_sources = \ fc_font_test_sources = \ bitmap-font.c \ + ft-color-font.c \ ft-font-create-for-ft-face.c \ ft-show-glyphs-positioning.c \ ft-show-glyphs-table.c \ diff --git a/test/ft-color-font.c b/test/ft-color-font.c new file mode 100644 index 000000000..58a1dc3ca --- /dev/null +++ b/test/ft-color-font.c @@ -0,0 +1,108 @@ +/* + * Copyright © 2021 Adrian Johnson + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, copy, + * modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * Author: Adrian Johnson + */ + +#include "cairo-test.h" +#include + +#define WIDTH 50 +#define HEIGHT WIDTH + +#define FONT "Noto Color Emoji" + +static const char smiley_face_utf8[] = { 0xf0, 0x9f, 0x99, 0x82, 0x00 }; /* U+1F642 */ + +static cairo_test_status_t +set_color_emoji_font (cairo_t *cr) +{ + cairo_font_options_t *font_options; + cairo_font_face_t *font_face; + FcPattern *pattern; + FcPattern *resolved; + FcChar8 *font_name; + FcResult result; + + pattern = FcPatternCreate (); + if (pattern == NULL) + return CAIRO_TEST_NO_MEMORY; + + FcPatternAddString (pattern, FC_FAMILY, (FcChar8 *) FONT); + FcConfigSubstitute (NULL, pattern, FcMatchPattern); + + font_options = cairo_font_options_create (); + cairo_get_font_options (cr, font_options); + cairo_ft_font_options_substitute (font_options, pattern); + + FcDefaultSubstitute (pattern); + resolved = FcFontMatch (NULL, pattern, &result); + if (resolved == NULL) { + FcPatternDestroy (pattern); + return CAIRO_TEST_NO_MEMORY; + } + + if (FcPatternGetString (resolved, FC_FAMILY, 0, &font_name) == FcResultMatch) { + if (strcmp((char*)font_name, FONT) != 0) { + const cairo_test_context_t *ctx = cairo_test_get_context (cr); + cairo_test_log (ctx, "Could not find %s font\n", FONT); + return CAIRO_TEST_UNTESTED; + } + } else { + return CAIRO_TEST_FAILURE; + } + + font_face = cairo_ft_font_face_create_for_pattern (resolved); + cairo_set_font_face (cr, font_face); + + cairo_font_options_destroy (font_options); + cairo_font_face_destroy (font_face); + FcPatternDestroy (pattern); + FcPatternDestroy (resolved); + + return CAIRO_TEST_SUCCESS; +} + +static cairo_test_status_t +draw (cairo_t *cr, int width, int height) +{ + cairo_test_status_t result; + + result = set_color_emoji_font (cr); + if (result != CAIRO_TEST_SUCCESS) + return result; + + cairo_set_font_size (cr, HEIGHT/2); + cairo_move_to (cr, width/4, 3*height/4); + + cairo_show_text(cr, smiley_face_utf8); + + return CAIRO_TEST_SUCCESS; +} + +CAIRO_TEST (ft_color_font, + "Test color font", + "ft, font", /* keywords */ + NULL, /* requirements */ + WIDTH, HEIGHT, + NULL, draw) diff --git a/test/meson.build b/test/meson.build index 6b5eba754..9d84d048d 100644 --- a/test/meson.build +++ b/test/meson.build @@ -412,6 +412,7 @@ test_pthread_sources = [ test_ft_font_sources = [ 'font-variations.c', 'bitmap-font.c', + 'ft-color-font.c', 'ft-font-create-for-ft-face.c', 'ft-show-glyphs-positioning.c', 'ft-show-glyphs-table.c', diff --git a/test/reference/ft-color-font.image16.ref.png b/test/reference/ft-color-font.image16.ref.png new file mode 100644 index 0000000000000000000000000000000000000000..579cd69c9ea76d2f2313d7205fd02a9e41a3d3f9 GIT binary patch literal 1151 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