Coverage Report

Created: 2026-10-10 06:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/harfbuzz/test/api/test-ot-face.c
Line
Count
Source
1
/*
2
 * Copyright © 2011  Google, Inc.
3
 *
4
 *  This is part of HarfBuzz, a text shaping library.
5
 *
6
 * Permission is hereby granted, without written agreement and without
7
 * license or royalty fees, to use, copy, modify, and distribute this
8
 * software and its documentation for any purpose, provided that the
9
 * above copyright notice and the following two paragraphs appear in
10
 * all copies of this software.
11
 *
12
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16
 * DAMAGE.
17
 *
18
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23
 *
24
 * Google Author(s): Behdad Esfahbod
25
 */
26
27
#ifndef TEST_OT_FACE_NO_MAIN
28
#include "hb-test.h"
29
#endif
30
#include <hb-aat.h>
31
#include <hb-ot.h>
32
33
/* Unit tests for hb-ot-*.h */
34
35
/* Return some dummy result so that compiler won't just optimize things */
36
static long long
37
test_font (hb_font_t *font, hb_codepoint_t cp)
38
44.1k
{
39
44.1k
  long long result = 0;
40
41
44.1k
  hb_face_t *face = hb_font_get_face (font);
42
44.1k
  hb_set_t *set;
43
44.1k
  hb_codepoint_t g = 0;
44
44.1k
  hb_position_t x = 0, y = 0;
45
44.1k
  char buf[5] = {0};
46
44.1k
  unsigned int len = 0;
47
44.1k
  hb_glyph_extents_t extents = {0, 0, 0, 0};
48
49
44.1k
  set = hb_set_create ();
50
44.1k
  hb_face_collect_unicodes (face, set);
51
44.1k
  hb_face_collect_variation_selectors (face, set);
52
44.1k
  hb_face_collect_variation_unicodes (face, cp, set);
53
54
44.1k
  hb_font_get_nominal_glyph (font, cp, &g);
55
44.1k
  hb_font_get_variation_glyph (font, cp, cp, &g);
56
44.1k
  hb_font_get_glyph_h_advance (font, cp);
57
44.1k
  hb_font_get_glyph_v_advance (font, cp);
58
44.1k
  hb_font_get_glyph_h_origin (font, cp, &x, &y);
59
44.1k
  hb_font_get_glyph_v_origin (font, cp, &x, &y);
60
44.1k
  hb_font_get_glyph_extents (font, cp, &extents);
61
44.1k
  hb_font_get_glyph_contour_point (font, cp, 0, &x, &y);
62
44.1k
  hb_font_get_glyph_name (font, cp, buf, sizeof (buf));
63
44.1k
  hb_font_get_glyph_from_name (font, buf, strlen (buf), &g);
64
65
44.1k
  hb_ot_color_has_palettes (face);
66
44.1k
  hb_ot_color_palette_get_count (face);
67
44.1k
  hb_ot_color_palette_get_name_id (face, cp);
68
44.1k
  hb_ot_color_palette_color_get_name_id (face, cp);
69
44.1k
  hb_ot_color_palette_get_flags (face, cp);
70
44.1k
  hb_ot_color_palette_get_colors (face, cp, 0, NULL, NULL);
71
44.1k
  hb_ot_color_has_layers (face);
72
44.1k
  hb_ot_color_glyph_get_layers (face, cp, 0, NULL, NULL);
73
44.1k
#ifndef HB_NO_SVG
74
44.1k
  hb_ot_color_has_svg (face);
75
44.1k
  hb_blob_destroy (hb_ot_color_glyph_reference_svg (face, cp));
76
44.1k
#endif
77
44.1k
  hb_ot_color_has_png (face);
78
44.1k
  hb_blob_destroy (hb_ot_color_glyph_reference_png (font, cp));
79
80
44.1k
#ifndef HB_NO_AAT
81
44.1k
  {
82
44.1k
    hb_aat_layout_feature_type_t feature = HB_AAT_LAYOUT_FEATURE_TYPE_ALL_TYPOGRAPHIC;
83
44.1k
    unsigned count = 1;
84
44.1k
    hb_aat_layout_get_feature_types (face, 0, &count, &feature);
85
44.1k
    hb_aat_layout_feature_type_get_name_id (face, HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE);
86
44.1k
    hb_aat_layout_feature_selector_info_t setting = {0, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALL_TYPE_FEATURES_ON, 0};
87
44.1k
    unsigned default_index;
88
44.1k
    count = 1;
89
44.1k
    hb_aat_layout_feature_type_get_selector_infos (face, HB_AAT_LAYOUT_FEATURE_TYPE_DESIGN_COMPLEXITY_TYPE, 0, &count, &setting, &default_index);
90
44.1k
    result += count + feature + setting.disable + setting.disable + setting.name_id + setting.reserved + default_index;
91
44.1k
  }
92
44.1k
#endif
93
94
44.1k
  hb_set_t *lookup_indexes = hb_set_create ();
95
44.1k
  hb_set_add (lookup_indexes, 0);
96
97
44.1k
  hb_map_t *lookup_mapping = hb_map_create ();
98
44.1k
  hb_map_set (lookup_mapping, 0, 0);
99
44.1k
  hb_set_t *feature_indices = hb_set_create ();
100
44.1k
  hb_set_destroy (lookup_indexes);
101
44.1k
  hb_set_destroy (feature_indices);
102
44.1k
  hb_map_destroy (lookup_mapping);
103
104
44.1k
  hb_ot_layout_get_baseline (font, HB_OT_LAYOUT_BASELINE_TAG_HANGING, HB_DIRECTION_RTL, HB_SCRIPT_HANGUL, HB_TAG_NONE, NULL);
105
106
44.1k
  hb_ot_layout_has_glyph_classes (face);
107
44.1k
  hb_ot_layout_has_substitution (face);
108
44.1k
  hb_ot_layout_has_positioning (face);
109
110
44.1k
  hb_ot_layout_get_ligature_carets (font, HB_DIRECTION_LTR, cp, 0, NULL, NULL);
111
112
44.1k
  {
113
44.1k
    unsigned temp = 0, temp2 = 0;
114
44.1k
    hb_ot_name_id_t name = HB_OT_NAME_ID_FULL_NAME;
115
44.1k
    hb_ot_layout_get_size_params (face, &temp, &temp, &name, &temp, &temp);
116
44.1k
    hb_tag_t cv01 = HB_TAG ('c','v','0','1');
117
44.1k
    unsigned feature_index = 0;
118
44.1k
    hb_ot_layout_language_find_feature (face, HB_OT_TAG_GSUB, 0,
119
44.1k
          HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX,
120
44.1k
          cv01, &feature_index);
121
44.1k
    hb_ot_layout_feature_get_name_ids (face, HB_OT_TAG_GSUB, feature_index,
122
44.1k
               &name, &name, &name, &temp, &name);
123
44.1k
    temp = 1;
124
44.1k
    hb_ot_layout_feature_get_characters (face, HB_OT_TAG_GSUB, feature_index, 0, &temp, &g);
125
44.1k
    temp = 1;
126
44.1k
    hb_ot_layout_language_get_feature_indexes (face, HB_OT_TAG_GSUB, 0, 0, 0, &temp, &temp2);
127
128
44.1k
    result += temp + name + feature_index + temp2;
129
44.1k
  }
130
131
44.1k
  hb_ot_math_has_data (face);
132
2.51M
  for (unsigned constant = HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN; constant <= HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT; constant++) {
133
2.47M
    hb_ot_math_get_constant (font, (hb_ot_math_constant_t)constant);
134
2.47M
  }
135
136
44.1k
  hb_ot_math_get_glyph_italics_correction (font, cp);
137
44.1k
  hb_ot_math_get_glyph_top_accent_attachment (font, cp);
138
44.1k
  hb_ot_math_is_glyph_extended_shape (face, cp);
139
140
44.1k
  {
141
44.1k
    hb_ot_math_get_glyph_kerning (font, cp, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0);
142
44.1k
    hb_ot_math_get_glyph_kernings (font, cp, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0, NULL, NULL);
143
44.1k
    hb_ot_math_kern_entry_t entries[5];
144
44.1k
    unsigned count = sizeof (entries) / sizeof (entries[0]);
145
44.1k
    hb_ot_math_get_glyph_kernings (font, cp, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0, &count, entries);
146
44.1k
  }
147
148
44.1k
  {
149
44.1k
    hb_ot_math_get_glyph_variants (font, cp, HB_DIRECTION_LTR, 0, NULL, NULL);
150
44.1k
    hb_ot_math_get_glyph_variants (font, cp, HB_DIRECTION_TTB, 0, NULL, NULL);
151
44.1k
    hb_ot_math_glyph_variant_t entries[5];
152
44.1k
    unsigned count = sizeof (entries) / sizeof (entries[0]);
153
44.1k
    hb_ot_math_get_glyph_variants (font, cp, HB_DIRECTION_LTR, 0, &count, entries);
154
44.1k
  }
155
156
44.1k
  {
157
44.1k
    hb_ot_math_get_min_connector_overlap (font, HB_DIRECTION_LTR);
158
44.1k
    hb_ot_math_get_glyph_assembly (font, cp, HB_DIRECTION_LTR, 0, NULL, NULL, NULL);
159
44.1k
    hb_ot_math_get_glyph_assembly (font, cp, HB_DIRECTION_TTB, 0, NULL, NULL, NULL);
160
44.1k
    hb_ot_math_glyph_part_t entries[5];
161
44.1k
    unsigned count = sizeof (entries) / sizeof (entries[0]);
162
44.1k
    hb_position_t corr;
163
44.1k
    hb_ot_math_get_glyph_assembly (font, cp, HB_DIRECTION_LTR, 0, &count, entries, &corr);
164
44.1k
  }
165
166
44.1k
  hb_ot_meta_get_entry_tags (face, 0, NULL, NULL);
167
44.1k
  hb_blob_destroy (hb_ot_meta_reference_entry (face, HB_OT_META_TAG_DESIGN_LANGUAGES));
168
169
44.1k
  hb_ot_metrics_get_position (font, HB_OT_METRICS_TAG_HORIZONTAL_ASCENDER, NULL);
170
44.1k
  hb_ot_metrics_get_variation (font, HB_OT_METRICS_TAG_UNDERLINE_OFFSET);
171
44.1k
  hb_ot_metrics_get_x_variation (font, HB_OT_METRICS_TAG_STRIKEOUT_OFFSET);
172
44.1k
  hb_ot_metrics_get_y_variation (font, HB_OT_METRICS_TAG_SUPERSCRIPT_EM_X_OFFSET);
173
174
44.1k
  len = sizeof (buf);
175
44.1k
  hb_ot_name_list_names (face, NULL);
176
44.1k
  hb_ot_name_get_utf8 (face, cp, NULL, &len, buf);
177
44.1k
  hb_ot_name_get_utf16 (face, cp, NULL, NULL, NULL);
178
44.1k
  hb_ot_name_get_utf32 (face, cp, NULL, NULL, NULL);
179
180
#if 0
181
  hb_style_get_value (font, HB_STYLE_TAG_ITALIC);
182
  hb_style_get_value (font, HB_STYLE_TAG_OPTICAL_SIZE);
183
  hb_style_get_value (font, HB_STYLE_TAG_SLANT);
184
  hb_style_get_value (font, HB_STYLE_TAG_WIDTH);
185
  hb_style_get_value (font, HB_STYLE_TAG_WEIGHT);
186
#endif
187
188
44.1k
  hb_ot_var_get_axis_count (face);
189
44.1k
  hb_ot_var_get_axis_infos (face, 0, NULL, NULL);
190
44.1k
  hb_ot_var_normalize_variations (face, NULL, 0, NULL, 0);
191
44.1k
  hb_ot_var_normalize_coords (face, 0, NULL, NULL);
192
193
44.1k
  hb_draw_funcs_t *funcs = hb_draw_funcs_create ();
194
44.1k
  hb_font_draw_glyph (font, cp, funcs, NULL);
195
44.1k
  hb_draw_funcs_destroy (funcs);
196
197
44.1k
  hb_set_destroy (set);
198
199
44.1k
  return result + g + x + y + buf[0] + buf[1] + buf[2] + buf[3] + buf[4] + len +
200
44.1k
   extents.height + extents.width + extents.x_bearing + extents.y_bearing;
201
44.1k
}
202
203
#ifndef TEST_OT_FACE_NO_MAIN
204
static void
205
test_ot_face_empty (void)
206
{
207
  test_font (hb_font_get_empty (), 0);
208
}
209
210
static void
211
test_ot_var_axis_on_zero_named_instance (void)
212
{
213
  hb_face_t *face = hb_test_open_font_file ("fonts/Zycon.ttf");
214
  g_assert_true (hb_ot_var_get_axis_count (face));
215
  hb_face_destroy (face);
216
}
217
218
#ifndef HB_NO_VERTICAL
219
static void
220
test_ot_font_v_origin_extents_overflow (void)
221
{
222
  static const char data[] = {
223
    0x00, 0x01, 0x00, 0x00, 0x00, 0x05, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
224
    0x43, 0x4f, 0x4c, 0x52, 0x20, 0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x20,
225
    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x09,
226
    0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x00,
227
    0x00, 0x22, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
228
    0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
229
    0x00, 0x00, 0x00, 0x11, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0c,
230
    0x00, 0x00, 0x17, 0x00, 0x00, 0x02, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
231
    (char) 0xff, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x1d, 0x00,
232
    0x00, 0x04, 0x20, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x04, 0x03, 0x20,
233
    0x20, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00
234
  };
235
  hb_blob_t *blob = hb_blob_create (data, sizeof (data), HB_MEMORY_MODE_READONLY,
236
            NULL, NULL);
237
  hb_face_t *face = hb_face_create (blob, 0);
238
  hb_font_t *font = hb_font_create (face);
239
  hb_position_t x, y;
240
241
  hb_font_set_scale (font, 12, 12);
242
  g_assert_true (hb_font_get_glyph_v_origin (font, 0, &x, &y));
243
  g_assert_cmpint (y, ==, -1073741719);
244
245
  hb_font_destroy (font);
246
  hb_face_destroy (face);
247
  hb_blob_destroy (blob);
248
}
249
250
static void
251
test_ot_font_v_origin_cache_invalidated_by_scale (void)
252
{
253
  hb_face_t *face = hb_test_open_font_file ("fonts/Mplus1p-Regular.660E.ttf");
254
  hb_font_t *font = hb_font_create (face);
255
  hb_codepoint_t glyph;
256
  hb_position_t x, y1, y2;
257
258
  g_assert_true (hb_font_get_nominal_glyph (font, 0x660E, &glyph));
259
260
  hb_font_set_scale (font, 1000, 1000);
261
  g_assert_true (hb_font_get_glyph_v_origin (font, glyph, &x, &y1));
262
263
  hb_font_set_scale (font, 1000, 2000);
264
  g_assert_true (hb_font_get_glyph_v_origin (font, glyph, &x, &y2));
265
266
  g_assert_cmpint (y2, ==, y1 * 2);
267
268
  hb_font_destroy (font);
269
  hb_face_destroy (face);
270
}
271
#endif
272
273
int
274
main (int argc, char **argv)
275
{
276
  hb_test_init (&argc, &argv);
277
278
  hb_test_add (test_ot_face_empty);
279
  hb_test_add (test_ot_var_axis_on_zero_named_instance);
280
#ifndef HB_NO_VERTICAL
281
  hb_test_add (test_ot_font_v_origin_extents_overflow);
282
  hb_test_add (test_ot_font_v_origin_cache_invalidated_by_scale);
283
#endif
284
285
  return hb_test_run();
286
}
287
#endif