From 30a6fd04d00624129b13b20fb755d6c1c4982637 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 17 Dec 2022 18:20:00 -0500 Subject: [PATCH] [colr] Add some tests --- .../fonts/noto_handwriting-cff2_colr_1.otf | Bin 0 -> 4172 bytes test/api/fonts/test_glyphs-glyf_colr_1.ttf | Bin 0 -> 16704 bytes test/api/results/hand-20-0-10.txt | 79 +++++ test/api/results/hand-20-0.2-10.txt | 79 +++++ test/api/results/test-20-0-10.txt | 12 + test/api/results/test-20-0-106.txt | 18 + test/api/results/test-20-0-116.txt | 14 + test/api/results/test-20-0-123.txt | 31 ++ test/api/results/test-20-0-165.txt | 12 + test/api/results/test-20-0-175.txt | 22 ++ test/api/results/test-20-0-6.txt | 11 + test/api/results/test-20-0-92.txt | 11 + test/api/test-ot-color.c | 312 ++++++++++++++++++ 13 files changed, 601 insertions(+) create mode 100644 test/api/fonts/noto_handwriting-cff2_colr_1.otf create mode 100644 test/api/fonts/test_glyphs-glyf_colr_1.ttf create mode 100644 test/api/results/hand-20-0-10.txt create mode 100644 test/api/results/hand-20-0.2-10.txt create mode 100644 test/api/results/test-20-0-10.txt create mode 100644 test/api/results/test-20-0-106.txt create mode 100644 test/api/results/test-20-0-116.txt create mode 100644 test/api/results/test-20-0-123.txt create mode 100644 test/api/results/test-20-0-165.txt create mode 100644 test/api/results/test-20-0-175.txt create mode 100644 test/api/results/test-20-0-6.txt create mode 100644 test/api/results/test-20-0-92.txt diff --git a/test/api/fonts/noto_handwriting-cff2_colr_1.otf b/test/api/fonts/noto_handwriting-cff2_colr_1.otf new file mode 100644 index 0000000000000000000000000000000000000000..dfb30588e79ab24dfbbfd07dc98931d6cb115729 GIT binary patch literal 4172 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 CSdVZ3 literal 0 HcmV?d00001 diff --git a/test/api/fonts/test_glyphs-glyf_colr_1.ttf b/test/api/fonts/test_glyphs-glyf_colr_1.ttf new file mode 100644 index 0000000000000000000000000000000000000000..982ccc0a115ee9d58959eb54c27aa5a5a7491e0a GIT binary patch literal 16704 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 literal 0 HcmV?d00001 diff --git a/test/api/results/hand-20-0-10.txt b/test/api/results/hand-20-0-10.txt new file mode 100644 index 000000000..4a9c0c8d4 --- /dev/null +++ b/test/api/results/hand-20-0-10.txt @@ -0,0 +1,79 @@ +start transform 0.019531 0.000000 0.000000 0.019531 0.000000 0.000000 + push group + start clip glyph 13 + start transform 1.000000 0.000000 0.000000 0.976807 0.000000 0.000000 + radial gradient + p0 280.000000 440.000000 radius 0.000000 + p1 280.000000 440.000000 radius 467.000000 + colors + 0.000000 16 1.000000 + 0.448792 15 1.000000 + 0.808594 14 1.000000 + 1.000000 12 1.000000 + end transform + end clip + pop group mode 3 + push group + start clip glyph 14 + linear gradient + p0 231.000000 -27.000000 + p1 1019.000000 -27.000000 + p2 231.000000 -815.000000 + colors + 0.000000 12 1.000000 + 1.000000 12 1.000000 + end clip + pop group mode 3 + push group + start clip glyph 15 + solid 9 1.000000 + end clip + pop group mode 3 + push group + start clip glyph 16 + solid 0 1.000000 + end clip + pop group mode 3 + push group + start clip glyph 21 + solid 9 1.000000 + end clip + pop group mode 3 + push group + push group + start clip glyph 16 + linear gradient + p0 669.000000 776.000000 + p1 180.000000 -106.000000 + p2 -212.000000 1265.000000 + colors + 0.000000 5 1.000000 + 1.000000 1 1.000000 + end clip + pop group mode 3 + push group + start clip glyph 18 + solid 2 0.200012 + end clip + pop group mode 3 + pop group mode 3 + push group + start clip glyph 19 + start transform 1.000000 0.000000 0.000000 0.969116 0.000000 0.000000 + radial gradient + p0 588.000000 198.000000 radius 0.000000 + p1 588.000000 198.000000 radius 342.000000 + colors + 0.000000 16 1.000000 + 0.448792 15 1.000000 + 0.808594 14 1.000000 + 1.000000 12 1.000000 + end transform + end clip + pop group mode 3 + push group + start clip glyph 20 + solid 9 1.000000 + end clip + pop group mode 3 +end transform diff --git a/test/api/results/hand-20-0.2-10.txt b/test/api/results/hand-20-0.2-10.txt new file mode 100644 index 000000000..f6e342b32 --- /dev/null +++ b/test/api/results/hand-20-0.2-10.txt @@ -0,0 +1,79 @@ +start transform 0.019531 0.000000 0.003906 0.019531 0.000000 0.000000 + push group + start clip glyph 13 + start transform 1.000000 0.000000 0.000000 0.976807 0.000000 0.000000 + radial gradient + p0 280.000000 440.000000 radius 0.000000 + p1 280.000000 440.000000 radius 467.000000 + colors + 0.000000 16 1.000000 + 0.448792 15 1.000000 + 0.808594 14 1.000000 + 1.000000 12 1.000000 + end transform + end clip + pop group mode 3 + push group + start clip glyph 14 + linear gradient + p0 231.000000 -27.000000 + p1 1019.000000 -27.000000 + p2 231.000000 -815.000000 + colors + 0.000000 12 1.000000 + 1.000000 12 1.000000 + end clip + pop group mode 3 + push group + start clip glyph 15 + solid 9 1.000000 + end clip + pop group mode 3 + push group + start clip glyph 16 + solid 0 1.000000 + end clip + pop group mode 3 + push group + start clip glyph 21 + solid 9 1.000000 + end clip + pop group mode 3 + push group + push group + start clip glyph 16 + linear gradient + p0 669.000000 776.000000 + p1 180.000000 -106.000000 + p2 -212.000000 1265.000000 + colors + 0.000000 5 1.000000 + 1.000000 1 1.000000 + end clip + pop group mode 3 + push group + start clip glyph 18 + solid 2 0.200012 + end clip + pop group mode 3 + pop group mode 3 + push group + start clip glyph 19 + start transform 1.000000 0.000000 0.000000 0.969116 0.000000 0.000000 + radial gradient + p0 588.000000 198.000000 radius 0.000000 + p1 588.000000 198.000000 radius 342.000000 + colors + 0.000000 16 1.000000 + 0.448792 15 1.000000 + 0.808594 14 1.000000 + 1.000000 12 1.000000 + end transform + end clip + pop group mode 3 + push group + start clip glyph 20 + solid 9 1.000000 + end clip + pop group mode 3 +end transform diff --git a/test/api/results/test-20-0-10.txt b/test/api/results/test-20-0-10.txt new file mode 100644 index 000000000..79ae162f3 --- /dev/null +++ b/test/api/results/test-20-0-10.txt @@ -0,0 +1,12 @@ +start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000 + start clip glyph 174 + sweep gradient + center 500.000000 600.000000 + angles 0.000000 6.283185 + colors + 0.250000 7 1.000000 + 0.416687 4 1.000000 + 0.583313 0 1.000000 + 0.750000 8 1.000000 + end clip +end transform diff --git a/test/api/results/test-20-0-106.txt b/test/api/results/test-20-0-106.txt new file mode 100644 index 000000000..0377d9513 --- /dev/null +++ b/test/api/results/test-20-0-106.txt @@ -0,0 +1,18 @@ +start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000 + push group + start clip glyph 3 + solid 4 0.500000 + end clip + push group + start transform 0.000000 0.000000 0.000000 0.000000 1000.000000 1000.000000 + start transform 1.000000 -0.363874 -0.176283 1.000000 0.000000 0.000000 + start transform 0.000000 0.000000 0.000000 0.000000 -1000.000000 -1000.000000 + start clip glyph 3 + solid 1 0.700012 + end clip + end transform + end transform + end transform + pop group mode 4 + pop group mode 3 +end transform diff --git a/test/api/results/test-20-0-116.txt b/test/api/results/test-20-0-116.txt new file mode 100644 index 000000000..01fbef52a --- /dev/null +++ b/test/api/results/test-20-0-116.txt @@ -0,0 +1,14 @@ +start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000 + push group + start clip glyph 3 + solid 4 0.500000 + end clip + push group + start transform 1.000000 0.000000 0.000000 1.000000 200.000000 200.000000 + start clip glyph 3 + solid 1 0.700012 + end clip + end transform + pop group mode 4 + pop group mode 3 +end transform diff --git a/test/api/results/test-20-0-123.txt b/test/api/results/test-20-0-123.txt new file mode 100644 index 000000000..f99ee44f6 --- /dev/null +++ b/test/api/results/test-20-0-123.txt @@ -0,0 +1,31 @@ +start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000 + push group + start clip glyph 3 + solid 10 1.000000 + end clip + pop group mode 3 + push group + push group + start transform 0.000000 0.000000 0.000000 0.000000 333.000000 667.000000 + start transform 8192.000000 0.000000 0.000000 8192.000000 0.000000 0.000000 + start transform 0.000000 0.000000 0.000000 0.000000 -333.000000 -667.000000 + start clip glyph 2 + solid 12 1.000000 + end clip + end transform + end transform + end transform + push group + start transform 0.000000 0.000000 0.000000 0.000000 667.000000 333.000000 + start transform 8192.000000 0.000000 0.000000 8192.000000 0.000000 0.000000 + start transform 0.000000 0.000000 0.000000 0.000000 -667.000000 -333.000000 + start clip glyph 2 + solid 11 1.000000 + end clip + end transform + end transform + end transform + pop group mode 5 + pop group mode 3 + pop group mode 3 +end transform diff --git a/test/api/results/test-20-0-165.txt b/test/api/results/test-20-0-165.txt new file mode 100644 index 000000000..8db60bfbd --- /dev/null +++ b/test/api/results/test-20-0-165.txt @@ -0,0 +1,12 @@ +start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000 + start clip glyph 165 + linear gradient + p0 100.000000 950.000000 + p1 2300.000000 950.000000 + p2 -1000.000000 250.000000 + colors + 0.000000 0 1.000000 + 0.500000 4 1.000000 + 1.000000 2 1.000000 + end clip +end transform diff --git a/test/api/results/test-20-0-175.txt b/test/api/results/test-20-0-175.txt new file mode 100644 index 000000000..1c3a2f56c --- /dev/null +++ b/test/api/results/test-20-0-175.txt @@ -0,0 +1,22 @@ +start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000 + push group + start transform 1.000000 0.000000 0.000000 1.000000 150.000000 0.000000 + start clip glyph 174 + solid 3 1.000000 + end clip + end transform + pop group mode 3 + push group + start transform 1.000000 0.000000 0.000000 1.000000 -150.000000 0.000000 + start clip glyph 174 + linear gradient + p0 500.000000 250.000000 + p1 500.000000 950.000000 + p2 600.000000 250.000000 + colors + 0.000000 0 1.000000 + 1.000000 4 1.000000 + end clip + end transform + pop group mode 3 +end transform diff --git a/test/api/results/test-20-0-6.txt b/test/api/results/test-20-0-6.txt new file mode 100644 index 000000000..90b842ad5 --- /dev/null +++ b/test/api/results/test-20-0-6.txt @@ -0,0 +1,11 @@ +start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000 + start clip glyph 6 + linear gradient + p0 100.000000 250.000000 + p1 900.000000 250.000000 + p2 100.000000 300.000000 + colors + 0.000000 0 1.000000 + 1.000000 4 1.000000 + end clip +end transform diff --git a/test/api/results/test-20-0-92.txt b/test/api/results/test-20-0-92.txt new file mode 100644 index 000000000..f099bdd82 --- /dev/null +++ b/test/api/results/test-20-0-92.txt @@ -0,0 +1,11 @@ +start transform 0.020000 0.000000 0.000000 0.020000 0.000000 0.000000 + start clip glyph 2 + radial gradient + p0 166.000000 768.000000 radius 0.000000 + p1 166.000000 768.000000 radius 256.000000 + colors + 0.000000 3 1.000000 + 0.500000 9 1.000000 + 1.000000 0 1.000000 + end clip +end transform diff --git a/test/api/test-ot-color.c b/test/api/test-ot-color.c index c2bbad2d5..b98b8da68 100644 --- a/test/api/test-ot-color.c +++ b/test/api/test-ot-color.c @@ -103,6 +103,9 @@ static hb_face_t *sbix = NULL; static hb_face_t *svg = NULL; static hb_face_t *empty = NULL; +static hb_face_t *colr_v1 = NULL; +static hb_face_t *colr_v1_2 = NULL; + #define assert_color_rgba(colors, i, r, g, b, a) G_STMT_START { \ const hb_color_t *_colors = (colors); \ const size_t _i = (i); \ @@ -452,6 +455,304 @@ test_hb_ot_color_png (void) hb_font_destroy (cbdt_font); } +/* ---- */ + +typedef struct { + int level; + GString *string; +} paint_data_t; + +static void +print (paint_data_t *data, + const char *format, + ...) +{ + va_list args; + + g_string_append_printf (data->string, "%*s", 2 * data->level, ""); + + va_start (args, format); + g_string_append_vprintf (data->string, format, args); + va_end (args); + + g_string_append (data->string, "\n"); +} + +static void +push_transform (hb_paint_funcs_t *funcs, + void *paint_data, + float xx, float yx, + float xy, float yy, + float dx, float dy, + void *user_data) +{ + paint_data_t *data = user_data; + + print (data, "start transform %f %f %f %f %f %f", xx, yx, xy, yy, dx, dy); + data->level++; +} + +static void +pop_transform (hb_paint_funcs_t *funcs, + void *paint_data, + void *user_data) +{ + paint_data_t *data = user_data; + + data->level--; + print (data, "end transform"); +} + +static void +push_clip_glyph (hb_paint_funcs_t *funcs, + void *paint_data, + hb_codepoint_t glyph, + void *user_data) +{ + paint_data_t *data = user_data; + + print (data, "start clip glyph %u", glyph); + data->level++; +} + +static void +push_clip_rectangle (hb_paint_funcs_t *funcs, + void *paint_data, + float xmin, float ymin, float xmax, float ymax, + void *user_data) +{ + paint_data_t *data = user_data; + + print (data, "start clip rectangle %f %f %f %f", xmin, ymin, xmax, ymax); + data->level++; +} + +static void +pop_clip (hb_paint_funcs_t *funcs, + void *paint_data, + void *user_data) +{ + paint_data_t *data = user_data; + + data->level--; + print (data, "end clip"); +} + +static void +paint_color (hb_paint_funcs_t *funcs, + void *paint_data, + unsigned int color_index, + float alpha, + void *user_data) +{ + paint_data_t *data = user_data; + + print (data, "solid %u %f", color_index, alpha); +} + +static void +paint_image (hb_paint_funcs_t *funcs, + void *paint_data, + hb_blob_t *blob, + hb_tag_t format, + hb_glyph_extents_t *extents, + void *user_data) +{ + paint_data_t *data = user_data; + char buf[5] = { 0, }; + + hb_tag_to_string (format, buf); + print (data, "image type %s extents %d %d %d %d\n", + buf, extents->x_bearing, extents->y_bearing, extents->width, extents->height); +} + +static void +print_color_line (paint_data_t *data, + hb_color_line_t *color_line) +{ + hb_color_stop_t *stops; + unsigned int len; + + len = hb_color_line_get_color_stops (color_line, 0, NULL, NULL); + stops = alloca (len * sizeof (hb_color_stop_t)); + hb_color_line_get_color_stops (color_line, 0, &len, stops); + + print (data, "colors"); + data->level += 1; + for (unsigned int i = 0; i < len; i++) + print (data, "%f %u %f", stops[i].offset, stops[i].color_index, stops[i].alpha); + data->level -= 1; +} + +static void +paint_linear_gradient (hb_paint_funcs_t *funcs, + void *paint_data, + hb_color_line_t *color_line, + float x0, float y0, + float x1, float y1, + float x2, float y2, + void *user_data) +{ + paint_data_t *data = user_data; + + print (data, "linear gradient"); + data->level += 1; + print (data, "p0 %f %f", x0, y0); + print (data, "p1 %f %f", x1, y1); + print (data, "p2 %f %f", x2, y2); + + print_color_line (data, color_line); + data->level -= 1; +} + +static void +paint_radial_gradient (hb_paint_funcs_t *funcs, + void *paint_data, + hb_color_line_t *color_line, + float x0, float y0, float r0, + float x1, float y1, float r1, + void *user_data) +{ + paint_data_t *data = user_data; + + print (data, "radial gradient"); + data->level += 1; + print (data, "p0 %f %f radius %f", x0, y0, r0); + print (data, "p1 %f %f radius %f", x1, y1, r1); + + print_color_line (data, color_line); + data->level -= 1; +} + +static void +paint_sweep_gradient (hb_paint_funcs_t *funcs, + void *paint_data, + hb_color_line_t *color_line, + float cx, float cy, + float start_angle, + float end_angle, + void *user_data) +{ + paint_data_t *data = user_data; + + print (data, "sweep gradient"); + data->level++; + print (data, "center %f %f", cx, cy); + print (data, "angles %f %f", start_angle, end_angle); + + print_color_line (data, color_line); + data->level -= 1; +} + +static void +push_group (hb_paint_funcs_t *funcs, + void *paint_data, + void *user_data) +{ + paint_data_t *data = user_data; + print (data, "push group"); + data->level++; +} + +static void +pop_group (hb_paint_funcs_t *funcs, + void *paint_data, + hb_paint_composite_mode_t mode, + void *user_data) +{ + paint_data_t *data = user_data; + data->level--; + print (data, "pop group mode %d", mode); +} + +typedef struct { + const char *font_file; + int scale; + float slant; + hb_codepoint_t glyph; + const char *output; +} colrv1_test_t; + +#define NOTO_HAND "fonts/noto_handwriting-cff2_colr_1.otf" +#define TEST_GLYPHS "fonts/test_glyphs-glyf_colr_1.ttf" + +static colrv1_test_t colrv1_tests[] = { + { NOTO_HAND, 20, 0., 10, "results/hand-20-0-10.txt" }, + { NOTO_HAND, 20, 0.2, 10, "results/hand-20-0.2-10.txt" }, + { TEST_GLYPHS, 20, 0, 6, "results/test-20-0-6.txt" }, + { TEST_GLYPHS, 20, 0, 10, "results/test-20-0-10.txt" }, + { TEST_GLYPHS, 20, 0, 92, "results/test-20-0-92.txt" }, + { TEST_GLYPHS, 20, 0, 106, "results/test-20-0-106.txt" }, + { TEST_GLYPHS, 20, 0, 116, "results/test-20-0-116.txt" }, + { TEST_GLYPHS, 20, 0, 123, "results/test-20-0-123.txt" }, + { TEST_GLYPHS, 20, 0, 165, "results/test-20-0-165.txt" }, + { TEST_GLYPHS, 20, 0, 175, "results/test-20-0-175.txt" }, +}; + +static void +test_hb_ot_color_colr_v1 (gconstpointer d) +{ + const colrv1_test_t *test = d; + hb_face_t *face; + hb_font_t *font; + hb_paint_funcs_t *funcs; + paint_data_t data; + char *file; + char *buffer; + gsize len; + GError *error = NULL; + + face = hb_test_open_font_file (test->font_file); + font = hb_font_create (face); + hb_font_set_scale (font, test->scale, test->scale); + hb_font_set_synthetic_slant (font, test->slant); + + funcs = hb_paint_funcs_create (); + hb_paint_funcs_set_push_transform_func (funcs, push_transform, &data, NULL); + hb_paint_funcs_set_pop_transform_func (funcs, pop_transform, &data, NULL); + hb_paint_funcs_set_push_clip_glyph_func (funcs, push_clip_glyph, &data, NULL); + hb_paint_funcs_set_push_clip_rectangle_func (funcs, push_clip_rectangle, &data, NULL); + hb_paint_funcs_set_pop_clip_func (funcs, pop_clip, &data, NULL); + hb_paint_funcs_set_push_group_func (funcs, push_group, &data, NULL); + hb_paint_funcs_set_pop_group_func (funcs, pop_group, &data, NULL); + hb_paint_funcs_set_color_func (funcs, paint_color, &data, NULL); + hb_paint_funcs_set_image_func (funcs, paint_image, &data, NULL); + hb_paint_funcs_set_linear_gradient_func (funcs, paint_linear_gradient, &data, NULL); + hb_paint_funcs_set_radial_gradient_func (funcs, paint_radial_gradient, &data, NULL); + hb_paint_funcs_set_sweep_gradient_func (funcs, paint_sweep_gradient, &data, NULL); + + data.string = g_string_new (""); + data.level = 0; + + hb_font_paint_glyph (font, test->glyph, funcs, &data); + + if (getenv ("GENERATE_DATA")) + { + g_print ("%s\n", data.string->str); + exit (0); + } + + file = g_test_build_filename (G_TEST_DIST, test->output, NULL); + if (!g_file_get_contents (file, &buffer, &len, &error)) + { + g_test_fail_printf ("%s", error->message); + return; + } + + if (strcmp (buffer, data.string->str) != 0) + { + g_test_fail_printf ("did not get the expected result"); + } + + g_free (buffer); + g_free (file); + + g_string_free (data.string, TRUE); + + hb_font_destroy (font); + hb_face_destroy (face); +} + int main (int argc, char **argv) { @@ -464,6 +765,8 @@ main (int argc, char **argv) cbdt = hb_test_open_font_file ("fonts/chromacheck-cbdt.ttf"); sbix = hb_test_open_font_file ("fonts/chromacheck-sbix.ttf"); svg = hb_test_open_font_file ("fonts/chromacheck-svg.ttf"); + colr_v1 = hb_test_open_font_file ("fonts/noto_handwriting-cff2_colr_1.otf"); + colr_v1_2 = hb_test_open_font_file ("fonts/test_glyphs-glyf_colr_1.ttf"); empty = hb_face_get_empty (); hb_test_add (test_hb_ot_color_palette_get_count); hb_test_add (test_hb_ot_color_palette_get_name_id_empty); @@ -480,6 +783,13 @@ main (int argc, char **argv) hb_test_add (test_hb_ot_color_has_data); hb_test_add (test_hb_ot_color_png); hb_test_add (test_hb_ot_color_svg); + for (unsigned int i = 0; i < G_N_ELEMENTS (colrv1_tests); i++) + { + char buf[10] = { 0, }; + g_snprintf (buf, 10, "%d", i); + hb_test_add_data_flavor (&colrv1_tests[i], buf, test_hb_ot_color_colr_v1); + } + status = hb_test_run(); hb_face_destroy (cpal_v0); hb_face_destroy (cpal_v1); @@ -487,5 +797,7 @@ main (int argc, char **argv) hb_face_destroy (cbdt); hb_face_destroy (sbix); hb_face_destroy (svg); + hb_face_destroy (colr_v1); + hb_face_destroy (colr_v1_2); return status; }