xref: /aosp_15_r20/external/harfbuzz_ng/test/api/test-ot-math.c (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker  * Copyright © 2016  Igalia S.L.
3*2d1272b8SAndroid Build Coastguard Worker  *
4*2d1272b8SAndroid Build Coastguard Worker  *  This is part of HarfBuzz, a text shaping library.
5*2d1272b8SAndroid Build Coastguard Worker  *
6*2d1272b8SAndroid Build Coastguard Worker  * Permission is hereby granted, without written agreement and without
7*2d1272b8SAndroid Build Coastguard Worker  * license or royalty fees, to use, copy, modify, and distribute this
8*2d1272b8SAndroid Build Coastguard Worker  * software and its documentation for any purpose, provided that the
9*2d1272b8SAndroid Build Coastguard Worker  * above copyright notice and the following two paragraphs appear in
10*2d1272b8SAndroid Build Coastguard Worker  * all copies of this software.
11*2d1272b8SAndroid Build Coastguard Worker  *
12*2d1272b8SAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13*2d1272b8SAndroid Build Coastguard Worker  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14*2d1272b8SAndroid Build Coastguard Worker  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15*2d1272b8SAndroid Build Coastguard Worker  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16*2d1272b8SAndroid Build Coastguard Worker  * DAMAGE.
17*2d1272b8SAndroid Build Coastguard Worker  *
18*2d1272b8SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19*2d1272b8SAndroid Build Coastguard Worker  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20*2d1272b8SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
21*2d1272b8SAndroid Build Coastguard Worker  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22*2d1272b8SAndroid Build Coastguard Worker  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23*2d1272b8SAndroid Build Coastguard Worker  *
24*2d1272b8SAndroid Build Coastguard Worker  * Igalia Author(s): Frédéric Wang
25*2d1272b8SAndroid Build Coastguard Worker  */
26*2d1272b8SAndroid Build Coastguard Worker 
27*2d1272b8SAndroid Build Coastguard Worker 
28*2d1272b8SAndroid Build Coastguard Worker #include "hb-test.h"
29*2d1272b8SAndroid Build Coastguard Worker 
30*2d1272b8SAndroid Build Coastguard Worker #include "hb-ft.h"
31*2d1272b8SAndroid Build Coastguard Worker #include "hb-ot.h"
32*2d1272b8SAndroid Build Coastguard Worker 
33*2d1272b8SAndroid Build Coastguard Worker /* Unit tests for hb-ot-math.h - OpenType MATH table  */
34*2d1272b8SAndroid Build Coastguard Worker 
35*2d1272b8SAndroid Build Coastguard Worker static FT_Library ft_library;
36*2d1272b8SAndroid Build Coastguard Worker static FT_Face ft_face;
37*2d1272b8SAndroid Build Coastguard Worker static hb_font_t *hb_font;
38*2d1272b8SAndroid Build Coastguard Worker static hb_face_t *hb_face;
39*2d1272b8SAndroid Build Coastguard Worker 
40*2d1272b8SAndroid Build Coastguard Worker static inline void
initFreeType(void)41*2d1272b8SAndroid Build Coastguard Worker initFreeType (void)
42*2d1272b8SAndroid Build Coastguard Worker {
43*2d1272b8SAndroid Build Coastguard Worker   FT_Error ft_error;
44*2d1272b8SAndroid Build Coastguard Worker   if ((ft_error = FT_Init_FreeType (&ft_library)))
45*2d1272b8SAndroid Build Coastguard Worker     abort();
46*2d1272b8SAndroid Build Coastguard Worker }
47*2d1272b8SAndroid Build Coastguard Worker 
48*2d1272b8SAndroid Build Coastguard Worker static inline void
cleanupFreeType(void)49*2d1272b8SAndroid Build Coastguard Worker cleanupFreeType (void)
50*2d1272b8SAndroid Build Coastguard Worker {
51*2d1272b8SAndroid Build Coastguard Worker   FT_Done_FreeType (ft_library);
52*2d1272b8SAndroid Build Coastguard Worker }
53*2d1272b8SAndroid Build Coastguard Worker 
54*2d1272b8SAndroid Build Coastguard Worker static void
openFont(const char * fontFile)55*2d1272b8SAndroid Build Coastguard Worker openFont(const char* fontFile)
56*2d1272b8SAndroid Build Coastguard Worker {
57*2d1272b8SAndroid Build Coastguard Worker #if GLIB_CHECK_VERSION(2,37,2)
58*2d1272b8SAndroid Build Coastguard Worker   gchar* path = g_test_build_filename(G_TEST_DIST, fontFile, NULL);
59*2d1272b8SAndroid Build Coastguard Worker #else
60*2d1272b8SAndroid Build Coastguard Worker   gchar* path = g_strdup(fontFile);
61*2d1272b8SAndroid Build Coastguard Worker #endif
62*2d1272b8SAndroid Build Coastguard Worker 
63*2d1272b8SAndroid Build Coastguard Worker   FT_Error ft_error;
64*2d1272b8SAndroid Build Coastguard Worker   if ((ft_error = FT_New_Face (ft_library, path, 0, &ft_face))) {
65*2d1272b8SAndroid Build Coastguard Worker     g_free(path);
66*2d1272b8SAndroid Build Coastguard Worker     abort();
67*2d1272b8SAndroid Build Coastguard Worker   }
68*2d1272b8SAndroid Build Coastguard Worker   g_free(path);
69*2d1272b8SAndroid Build Coastguard Worker 
70*2d1272b8SAndroid Build Coastguard Worker   if ((ft_error = FT_Set_Char_Size (ft_face, 2000, 1000, 0, 0)))
71*2d1272b8SAndroid Build Coastguard Worker     abort();
72*2d1272b8SAndroid Build Coastguard Worker   hb_font = hb_ft_font_create (ft_face, NULL);
73*2d1272b8SAndroid Build Coastguard Worker   hb_face = hb_face_reference (hb_font_get_face (hb_font));
74*2d1272b8SAndroid Build Coastguard Worker }
75*2d1272b8SAndroid Build Coastguard Worker 
76*2d1272b8SAndroid Build Coastguard Worker static inline void
closeFont(void)77*2d1272b8SAndroid Build Coastguard Worker closeFont (void)
78*2d1272b8SAndroid Build Coastguard Worker {
79*2d1272b8SAndroid Build Coastguard Worker   hb_face_destroy (hb_face);
80*2d1272b8SAndroid Build Coastguard Worker   hb_font_destroy (hb_font);
81*2d1272b8SAndroid Build Coastguard Worker   FT_Done_Face (ft_face);
82*2d1272b8SAndroid Build Coastguard Worker   hb_face = NULL;
83*2d1272b8SAndroid Build Coastguard Worker   hb_font = NULL;
84*2d1272b8SAndroid Build Coastguard Worker   ft_face = NULL;
85*2d1272b8SAndroid Build Coastguard Worker }
86*2d1272b8SAndroid Build Coastguard Worker 
87*2d1272b8SAndroid Build Coastguard Worker static void
test_has_data(void)88*2d1272b8SAndroid Build Coastguard Worker test_has_data (void)
89*2d1272b8SAndroid Build Coastguard Worker {
90*2d1272b8SAndroid Build Coastguard Worker   initFreeType();
91*2d1272b8SAndroid Build Coastguard Worker 
92*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontNone.otf");
93*2d1272b8SAndroid Build Coastguard Worker   g_assert(!hb_ot_math_has_data (hb_face)); // MATH table not available
94*2d1272b8SAndroid Build Coastguard Worker   closeFont();
95*2d1272b8SAndroid Build Coastguard Worker 
96*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontEmpty.otf");
97*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_ot_math_has_data (hb_face)); // MATH table available
98*2d1272b8SAndroid Build Coastguard Worker   closeFont();
99*2d1272b8SAndroid Build Coastguard Worker 
100*2d1272b8SAndroid Build Coastguard Worker   hb_face = hb_face_get_empty ();
101*2d1272b8SAndroid Build Coastguard Worker   hb_font = hb_font_create (hb_face);
102*2d1272b8SAndroid Build Coastguard Worker   g_assert(!hb_ot_math_has_data (hb_face)); // MATH table not available
103*2d1272b8SAndroid Build Coastguard Worker   hb_font_destroy (hb_font);
104*2d1272b8SAndroid Build Coastguard Worker   hb_face_destroy (hb_face);
105*2d1272b8SAndroid Build Coastguard Worker 
106*2d1272b8SAndroid Build Coastguard Worker   hb_font = hb_font_get_empty ();
107*2d1272b8SAndroid Build Coastguard Worker   hb_face = hb_font_get_face (hb_font);
108*2d1272b8SAndroid Build Coastguard Worker   g_assert(!hb_ot_math_has_data (hb_face)); // MATH table not available
109*2d1272b8SAndroid Build Coastguard Worker   hb_font_destroy (hb_font);
110*2d1272b8SAndroid Build Coastguard Worker   hb_face_destroy (hb_face);
111*2d1272b8SAndroid Build Coastguard Worker 
112*2d1272b8SAndroid Build Coastguard Worker   cleanupFreeType();
113*2d1272b8SAndroid Build Coastguard Worker }
114*2d1272b8SAndroid Build Coastguard Worker 
115*2d1272b8SAndroid Build Coastguard Worker static void
test_get_constant(void)116*2d1272b8SAndroid Build Coastguard Worker test_get_constant (void)
117*2d1272b8SAndroid Build Coastguard Worker {
118*2d1272b8SAndroid Build Coastguard Worker   initFreeType();
119*2d1272b8SAndroid Build Coastguard Worker 
120*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontEmpty.otf");
121*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT), ==, 0); // MathConstants not available
122*2d1272b8SAndroid Build Coastguard Worker   closeFont();
123*2d1272b8SAndroid Build Coastguard Worker 
124*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontFull.otf");
125*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_DELIMITED_SUB_FORMULA_MIN_HEIGHT)), ==, 100);
126*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_DISPLAY_OPERATOR_MIN_HEIGHT)), ==, 200);
127*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_MATH_LEADING)), ==, 300);
128*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_AXIS_HEIGHT)), ==, 400);
129*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_ACCENT_BASE_HEIGHT)), ==, 500);
130*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FLATTENED_ACCENT_BASE_HEIGHT)), ==, 600);
131*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUBSCRIPT_SHIFT_DOWN)), ==, 700);
132*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUBSCRIPT_TOP_MAX)), ==, 800);
133*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUBSCRIPT_BASELINE_DROP_MIN)), ==, 900);
134*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP)), ==, 1100);
135*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUPERSCRIPT_SHIFT_UP_CRAMPED)), ==, 1200);
136*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MIN)), ==, 1300);
137*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUPERSCRIPT_BASELINE_DROP_MAX)), ==, 1400);
138*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUB_SUPERSCRIPT_GAP_MIN)), ==, 1500);
139*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SUPERSCRIPT_BOTTOM_MAX_WITH_SUBSCRIPT)), ==, 1600);
140*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SPACE_AFTER_SCRIPT)), ==, 3400);
141*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_UPPER_LIMIT_GAP_MIN)), ==, 1800);
142*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_UPPER_LIMIT_BASELINE_RISE_MIN)), ==, 1900);
143*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_LOWER_LIMIT_GAP_MIN)), ==, 2200);
144*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_LOWER_LIMIT_BASELINE_DROP_MIN)), ==, 2300);
145*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STACK_TOP_SHIFT_UP)), ==, 2400);
146*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STACK_TOP_DISPLAY_STYLE_SHIFT_UP)), ==, 2500);
147*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STACK_BOTTOM_SHIFT_DOWN)), ==, 2600);
148*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STACK_BOTTOM_DISPLAY_STYLE_SHIFT_DOWN)), ==, 2700);
149*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STACK_GAP_MIN)), ==, 2800);
150*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STACK_DISPLAY_STYLE_GAP_MIN)), ==, 2900);
151*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STRETCH_STACK_TOP_SHIFT_UP)), ==, 3000);
152*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STRETCH_STACK_BOTTOM_SHIFT_DOWN)), ==, 3100);
153*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_ABOVE_MIN)), ==, 3200);
154*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_STRETCH_STACK_GAP_BELOW_MIN)), ==, 3300);
155*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_SHIFT_UP)), ==, 3400);
156*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_DISPLAY_STYLE_SHIFT_UP)), ==, 3500);
157*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_SHIFT_DOWN)), ==, 3600);
158*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_DISPLAY_STYLE_SHIFT_DOWN)), ==, 3700);
159*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_NUMERATOR_GAP_MIN)), ==, 3800);
160*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_NUM_DISPLAY_STYLE_GAP_MIN)), ==, 3900);
161*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_RULE_THICKNESS)), ==, 4000);
162*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_DENOMINATOR_GAP_MIN)), ==, 4100);
163*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_FRACTION_DENOM_DISPLAY_STYLE_GAP_MIN)), ==, 4200);
164*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SKEWED_FRACTION_HORIZONTAL_GAP)), ==, 8600);
165*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SKEWED_FRACTION_VERTICAL_GAP)), ==, 4400);
166*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_OVERBAR_VERTICAL_GAP)), ==, 4500);
167*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_OVERBAR_RULE_THICKNESS)), ==, 4600);
168*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_OVERBAR_EXTRA_ASCENDER)), ==, 4700);
169*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_UNDERBAR_VERTICAL_GAP)), ==, 4800);
170*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_UNDERBAR_RULE_THICKNESS)), ==, 4900);
171*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_UNDERBAR_EXTRA_DESCENDER)), ==, 5000);
172*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_VERTICAL_GAP)), ==, 5100);
173*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_DISPLAY_STYLE_VERTICAL_GAP)), ==, 5200);
174*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_RULE_THICKNESS)), ==, 5300);
175*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_EXTRA_ASCENDER)), ==, 5400);
176*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_KERN_BEFORE_DEGREE)), ==, 11000);
177*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_KERN_AFTER_DEGREE)), ==, 11200);
178*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SCRIPT_PERCENT_SCALE_DOWN)), ==, 87);
179*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_SCRIPT_SCRIPT_PERCENT_SCALE_DOWN)), ==, 76);
180*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint((hb_ot_math_get_constant (hb_font, HB_OT_MATH_CONSTANT_RADICAL_DEGREE_BOTTOM_RAISE_PERCENT)), ==, 65);
181*2d1272b8SAndroid Build Coastguard Worker   closeFont();
182*2d1272b8SAndroid Build Coastguard Worker 
183*2d1272b8SAndroid Build Coastguard Worker   cleanupFreeType();
184*2d1272b8SAndroid Build Coastguard Worker }
185*2d1272b8SAndroid Build Coastguard Worker 
186*2d1272b8SAndroid Build Coastguard Worker static void
test_get_glyph_italics_correction(void)187*2d1272b8SAndroid Build Coastguard Worker test_get_glyph_italics_correction (void)
188*2d1272b8SAndroid Build Coastguard Worker {
189*2d1272b8SAndroid Build Coastguard Worker   hb_codepoint_t glyph;
190*2d1272b8SAndroid Build Coastguard Worker   initFreeType();
191*2d1272b8SAndroid Build Coastguard Worker 
192*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontEmpty.otf");
193*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
194*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 0); // MathGlyphInfo not available
195*2d1272b8SAndroid Build Coastguard Worker   closeFont();
196*2d1272b8SAndroid Build Coastguard Worker 
197*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial1.otf");
198*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
199*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 0); // MathGlyphInfo empty
200*2d1272b8SAndroid Build Coastguard Worker   closeFont();
201*2d1272b8SAndroid Build Coastguard Worker 
202*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial2.otf");
203*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
204*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 0); // MathItalicsCorrectionInfo empty
205*2d1272b8SAndroid Build Coastguard Worker   closeFont();
206*2d1272b8SAndroid Build Coastguard Worker 
207*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontFull.otf");
208*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
209*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 0); // Glyph without italic correction.
210*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "A", -1, &glyph));
211*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 394);
212*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "B", -1, &glyph));
213*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 300);
214*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "C", -1, &glyph));
215*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_italics_correction (hb_font, glyph), ==, 904);
216*2d1272b8SAndroid Build Coastguard Worker   closeFont();
217*2d1272b8SAndroid Build Coastguard Worker 
218*2d1272b8SAndroid Build Coastguard Worker   cleanupFreeType();
219*2d1272b8SAndroid Build Coastguard Worker }
220*2d1272b8SAndroid Build Coastguard Worker 
221*2d1272b8SAndroid Build Coastguard Worker static void
test_get_glyph_top_accent_attachment(void)222*2d1272b8SAndroid Build Coastguard Worker test_get_glyph_top_accent_attachment (void)
223*2d1272b8SAndroid Build Coastguard Worker {
224*2d1272b8SAndroid Build Coastguard Worker   hb_codepoint_t glyph;
225*2d1272b8SAndroid Build Coastguard Worker   initFreeType();
226*2d1272b8SAndroid Build Coastguard Worker 
227*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontEmpty.otf");
228*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
229*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 1000); // MathGlyphInfo not available
230*2d1272b8SAndroid Build Coastguard Worker   closeFont();
231*2d1272b8SAndroid Build Coastguard Worker 
232*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial1.otf");
233*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
234*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 1000); // MathGlyphInfo empty
235*2d1272b8SAndroid Build Coastguard Worker   closeFont();
236*2d1272b8SAndroid Build Coastguard Worker 
237*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial2.otf");
238*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
239*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 1000); // MathTopAccentAttachment empty
240*2d1272b8SAndroid Build Coastguard Worker   closeFont();
241*2d1272b8SAndroid Build Coastguard Worker 
242*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontFull.otf");
243*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
244*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 1000); // Glyph without top accent attachment.
245*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "D", -1, &glyph));
246*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 748);
247*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "E", -1, &glyph));
248*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 692);
249*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "F", -1, &glyph));
250*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_top_accent_attachment (hb_font, glyph), ==, 636);
251*2d1272b8SAndroid Build Coastguard Worker   closeFont();
252*2d1272b8SAndroid Build Coastguard Worker 
253*2d1272b8SAndroid Build Coastguard Worker   cleanupFreeType();
254*2d1272b8SAndroid Build Coastguard Worker }
255*2d1272b8SAndroid Build Coastguard Worker 
256*2d1272b8SAndroid Build Coastguard Worker static void
test_is_glyph_extended_shape(void)257*2d1272b8SAndroid Build Coastguard Worker test_is_glyph_extended_shape (void)
258*2d1272b8SAndroid Build Coastguard Worker {
259*2d1272b8SAndroid Build Coastguard Worker   hb_codepoint_t glyph;
260*2d1272b8SAndroid Build Coastguard Worker   initFreeType();
261*2d1272b8SAndroid Build Coastguard Worker 
262*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontEmpty.otf");
263*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
264*2d1272b8SAndroid Build Coastguard Worker   g_assert(!hb_ot_math_is_glyph_extended_shape (hb_face, glyph)); // MathGlyphInfo not available
265*2d1272b8SAndroid Build Coastguard Worker   closeFont();
266*2d1272b8SAndroid Build Coastguard Worker 
267*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial1.otf");
268*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
269*2d1272b8SAndroid Build Coastguard Worker   g_assert(!hb_ot_math_is_glyph_extended_shape (hb_face, glyph)); // MathGlyphInfo empty
270*2d1272b8SAndroid Build Coastguard Worker   closeFont();
271*2d1272b8SAndroid Build Coastguard Worker 
272*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontFull.otf");
273*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "G", -1, &glyph));
274*2d1272b8SAndroid Build Coastguard Worker   g_assert(!hb_ot_math_is_glyph_extended_shape (hb_face, glyph));
275*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "H", -1, &glyph));
276*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_ot_math_is_glyph_extended_shape (hb_face, glyph));
277*2d1272b8SAndroid Build Coastguard Worker   closeFont();
278*2d1272b8SAndroid Build Coastguard Worker 
279*2d1272b8SAndroid Build Coastguard Worker   cleanupFreeType();
280*2d1272b8SAndroid Build Coastguard Worker }
281*2d1272b8SAndroid Build Coastguard Worker 
282*2d1272b8SAndroid Build Coastguard Worker static void
test_get_glyph_kerning(void)283*2d1272b8SAndroid Build Coastguard Worker test_get_glyph_kerning (void)
284*2d1272b8SAndroid Build Coastguard Worker {
285*2d1272b8SAndroid Build Coastguard Worker   hb_codepoint_t glyph;
286*2d1272b8SAndroid Build Coastguard Worker   initFreeType();
287*2d1272b8SAndroid Build Coastguard Worker 
288*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontEmpty.otf");
289*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
290*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0), ==, 0); // MathGlyphInfo not available
291*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0), ==, 0); // MathGlyphInfo not available
292*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0), ==, 0); // MathGlyphInfo not available
293*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0), ==, 0); // MathGlyphInfo not available
294*2d1272b8SAndroid Build Coastguard Worker   closeFont();
295*2d1272b8SAndroid Build Coastguard Worker 
296*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial2.otf");
297*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
298*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0), ==, 0); // MathKernInfo empty
299*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0), ==, 0); // MathKernInfo empty
300*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0), ==, 0); // MathKernInfo empty
301*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0), ==, 0); // MathKernInfo empty
302*2d1272b8SAndroid Build Coastguard Worker   closeFont();
303*2d1272b8SAndroid Build Coastguard Worker 
304*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial3.otf");
305*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
306*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0), ==, 0); // MathKernInfoRecords empty
307*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0), ==, 0); // MathKernInfoRecords empty
308*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0), ==, 0); // MathKernInfoRecords empty
309*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0), ==, 0); // MathKernInfoRecords empty
310*2d1272b8SAndroid Build Coastguard Worker   closeFont();
311*2d1272b8SAndroid Build Coastguard Worker 
312*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontFull.otf");
313*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "I", -1, &glyph));
314*2d1272b8SAndroid Build Coastguard Worker 
315*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 7), ==, 62); // lower than min height
316*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 14), ==, 104); // equal to min height
317*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 20), ==, 104);
318*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 23), ==, 146);
319*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 31), ==, 146);
320*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 32), ==, 188);
321*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 86), ==, 440); // equal to max height
322*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 91), ==, 440); // larger than max height
323*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 96), ==, 440); // larger than max height
324*2d1272b8SAndroid Build Coastguard Worker 
325*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 39), ==, 188); // top right
326*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 39), ==, 110); // top left
327*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 39), ==, 44); // bottom right
328*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kerning (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 39), ==, 100); // bottom left
329*2d1272b8SAndroid Build Coastguard Worker 
330*2d1272b8SAndroid Build Coastguard Worker   closeFont();
331*2d1272b8SAndroid Build Coastguard Worker 
332*2d1272b8SAndroid Build Coastguard Worker   cleanupFreeType();
333*2d1272b8SAndroid Build Coastguard Worker }
334*2d1272b8SAndroid Build Coastguard Worker 
335*2d1272b8SAndroid Build Coastguard Worker static void
test_get_glyph_kernings(void)336*2d1272b8SAndroid Build Coastguard Worker test_get_glyph_kernings (void)
337*2d1272b8SAndroid Build Coastguard Worker {
338*2d1272b8SAndroid Build Coastguard Worker   hb_codepoint_t glyph;
339*2d1272b8SAndroid Build Coastguard Worker   hb_ot_math_kern_entry_t entries[20];
340*2d1272b8SAndroid Build Coastguard Worker   const unsigned entries_size = sizeof (entries) / sizeof (entries[0]);
341*2d1272b8SAndroid Build Coastguard Worker   unsigned int count;
342*2d1272b8SAndroid Build Coastguard Worker 
343*2d1272b8SAndroid Build Coastguard Worker   initFreeType();
344*2d1272b8SAndroid Build Coastguard Worker 
345*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontEmpty.otf");
346*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
347*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0, NULL, NULL), ==, 0); // MathGlyphInfo not available
348*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0, NULL, NULL), ==, 0); // MathGlyphInfo not available
349*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0, NULL, NULL), ==, 0); // MathGlyphInfo not available
350*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0, NULL, NULL), ==, 0); // MathGlyphInfo not available
351*2d1272b8SAndroid Build Coastguard Worker   closeFont();
352*2d1272b8SAndroid Build Coastguard Worker 
353*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial2.otf");
354*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
355*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0, NULL, NULL), ==, 0); // MathKernInfo empty
356*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0, NULL, NULL), ==, 0); // MathKernInfo empty
357*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0, NULL, NULL), ==, 0); // MathKernInfo empty
358*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0, NULL, NULL), ==, 0); // MathKernInfo empty
359*2d1272b8SAndroid Build Coastguard Worker   closeFont();
360*2d1272b8SAndroid Build Coastguard Worker 
361*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial3.otf");
362*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
363*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0, NULL, NULL), ==, 0); // MathKernInfoRecords empty
364*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0, NULL, NULL), ==, 0); // MathKernInfoRecords empty
365*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0, NULL, NULL), ==, 0); // MathKernInfoRecords empty
366*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0, NULL, NULL), ==, 0); // MathKernInfoRecords empty
367*2d1272b8SAndroid Build Coastguard Worker   closeFont();
368*2d1272b8SAndroid Build Coastguard Worker 
369*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontFull.otf");
370*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "I", -1, &glyph));
371*2d1272b8SAndroid Build Coastguard Worker 
372*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0, NULL, NULL), ==, 10);
373*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0, NULL, NULL), ==, 3);
374*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_RIGHT, 0, NULL, NULL), ==, 9);
375*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_BOTTOM_LEFT, 0, NULL, NULL), ==, 7);
376*2d1272b8SAndroid Build Coastguard Worker 
377*2d1272b8SAndroid Build Coastguard Worker   count = entries_size;
378*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_RIGHT, 0, &count, entries), ==, 10);
379*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(count, ==, 10);
380*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[0].max_correction_height, ==, 14);
381*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[0].kern_value, ==, 62);
382*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[1].max_correction_height, ==, 23);
383*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[1].kern_value, ==, 104);
384*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[2].max_correction_height, ==, 32);
385*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[2].kern_value, ==, 146);
386*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[3].max_correction_height, ==, 41);
387*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[3].kern_value, ==, 188);
388*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[4].max_correction_height, ==, 50);
389*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[4].kern_value, ==, 230);
390*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[5].max_correction_height, ==, 59);
391*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[5].kern_value, ==, 272);
392*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[6].max_correction_height, ==, 68);
393*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[6].kern_value, ==, 314);
394*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[7].max_correction_height, ==, 77);
395*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[7].kern_value, ==, 356);
396*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[8].max_correction_height, ==, 86);
397*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[8].kern_value, ==, 398);
398*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[9].max_correction_height, ==, INT32_MAX);
399*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[9].kern_value, ==, 440);
400*2d1272b8SAndroid Build Coastguard Worker 
401*2d1272b8SAndroid Build Coastguard Worker   count = entries_size;
402*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_kernings (hb_font, glyph, HB_OT_MATH_KERN_TOP_LEFT, 0, &count, entries), ==, 3);
403*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(count, ==, 3);
404*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[0].max_correction_height, ==, 20);
405*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[0].kern_value, ==, 50);
406*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[1].max_correction_height, ==, 35);
407*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[1].kern_value, ==, 80);
408*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[2].max_correction_height, ==, INT32_MAX);
409*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(entries[2].kern_value, ==, 110);
410*2d1272b8SAndroid Build Coastguard Worker 
411*2d1272b8SAndroid Build Coastguard Worker   closeFont();
412*2d1272b8SAndroid Build Coastguard Worker 
413*2d1272b8SAndroid Build Coastguard Worker   cleanupFreeType();
414*2d1272b8SAndroid Build Coastguard Worker }
415*2d1272b8SAndroid Build Coastguard Worker 
416*2d1272b8SAndroid Build Coastguard Worker 
417*2d1272b8SAndroid Build Coastguard Worker static hb_position_t
get_glyph_assembly_italics_correction(hb_font_t * font,hb_codepoint_t glyph,hb_bool_t horizontal)418*2d1272b8SAndroid Build Coastguard Worker get_glyph_assembly_italics_correction (hb_font_t *font,
419*2d1272b8SAndroid Build Coastguard Worker 				       hb_codepoint_t glyph,
420*2d1272b8SAndroid Build Coastguard Worker 				       hb_bool_t horizontal)
421*2d1272b8SAndroid Build Coastguard Worker {
422*2d1272b8SAndroid Build Coastguard Worker   hb_position_t corr;
423*2d1272b8SAndroid Build Coastguard Worker   hb_ot_math_get_glyph_assembly (font, glyph,
424*2d1272b8SAndroid Build Coastguard Worker 				 horizontal ? HB_DIRECTION_LTR : HB_DIRECTION_TTB,
425*2d1272b8SAndroid Build Coastguard Worker 				 0, NULL, NULL,
426*2d1272b8SAndroid Build Coastguard Worker 				 &corr);
427*2d1272b8SAndroid Build Coastguard Worker   return corr;
428*2d1272b8SAndroid Build Coastguard Worker }
429*2d1272b8SAndroid Build Coastguard Worker 
430*2d1272b8SAndroid Build Coastguard Worker static void
test_get_glyph_assembly_italics_correction(void)431*2d1272b8SAndroid Build Coastguard Worker test_get_glyph_assembly_italics_correction (void)
432*2d1272b8SAndroid Build Coastguard Worker {
433*2d1272b8SAndroid Build Coastguard Worker   hb_codepoint_t glyph;
434*2d1272b8SAndroid Build Coastguard Worker   initFreeType();
435*2d1272b8SAndroid Build Coastguard Worker 
436*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontEmpty.otf");
437*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
438*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 0); // MathVariants not available
439*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 0); // MathVariants not available
440*2d1272b8SAndroid Build Coastguard Worker   closeFont();
441*2d1272b8SAndroid Build Coastguard Worker 
442*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial1.otf");
443*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
444*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 0); // VertGlyphCoverage and HorizGlyphCoverage absent
445*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 0); // VertGlyphCoverage and HorizGlyphCoverage absent
446*2d1272b8SAndroid Build Coastguard Worker   closeFont();
447*2d1272b8SAndroid Build Coastguard Worker 
448*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial2.otf");
449*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
450*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 0); // VertGlyphCoverage and HorizGlyphCoverage empty
451*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 0); // VertGlyphCoverage and HorizGlyphCoverage empty
452*2d1272b8SAndroid Build Coastguard Worker   closeFont();
453*2d1272b8SAndroid Build Coastguard Worker 
454*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial3.otf");
455*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
456*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 0); // HorizGlyphConstruction and VertGlyphConstruction empty
457*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 0);  // HorizGlyphConstruction and VertGlyphConstruction empty
458*2d1272b8SAndroid Build Coastguard Worker   closeFont();
459*2d1272b8SAndroid Build Coastguard Worker 
460*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial4.otf");
461*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
462*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 0);
463*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 0);
464*2d1272b8SAndroid Build Coastguard Worker   closeFont();
465*2d1272b8SAndroid Build Coastguard Worker 
466*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontFull.otf");
467*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "arrowleft", -1, &glyph));
468*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 248);
469*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 0);
470*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "arrowup", -1, &glyph));
471*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, TRUE), ==, 0);
472*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(get_glyph_assembly_italics_correction (hb_font, glyph, FALSE), ==, 662);
473*2d1272b8SAndroid Build Coastguard Worker   closeFont();
474*2d1272b8SAndroid Build Coastguard Worker 
475*2d1272b8SAndroid Build Coastguard Worker   cleanupFreeType();
476*2d1272b8SAndroid Build Coastguard Worker }
477*2d1272b8SAndroid Build Coastguard Worker 
478*2d1272b8SAndroid Build Coastguard Worker static void
test_get_min_connector_overlap(void)479*2d1272b8SAndroid Build Coastguard Worker test_get_min_connector_overlap (void)
480*2d1272b8SAndroid Build Coastguard Worker {
481*2d1272b8SAndroid Build Coastguard Worker   initFreeType();
482*2d1272b8SAndroid Build Coastguard Worker 
483*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontEmpty.otf");
484*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_min_connector_overlap(hb_font, HB_DIRECTION_LTR), ==, 0); // MathVariants not available
485*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_min_connector_overlap(hb_font, HB_DIRECTION_TTB), ==, 0); // MathVariants not available
486*2d1272b8SAndroid Build Coastguard Worker   closeFont();
487*2d1272b8SAndroid Build Coastguard Worker 
488*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial1.otf");
489*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_min_connector_overlap(hb_font, HB_DIRECTION_LTR), ==, 108);
490*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_min_connector_overlap(hb_font, HB_DIRECTION_TTB), ==, 54);
491*2d1272b8SAndroid Build Coastguard Worker   closeFont();
492*2d1272b8SAndroid Build Coastguard Worker 
493*2d1272b8SAndroid Build Coastguard Worker   cleanupFreeType();
494*2d1272b8SAndroid Build Coastguard Worker }
495*2d1272b8SAndroid Build Coastguard Worker 
496*2d1272b8SAndroid Build Coastguard Worker static void
test_get_glyph_variants(void)497*2d1272b8SAndroid Build Coastguard Worker test_get_glyph_variants (void)
498*2d1272b8SAndroid Build Coastguard Worker {
499*2d1272b8SAndroid Build Coastguard Worker   hb_codepoint_t glyph;
500*2d1272b8SAndroid Build Coastguard Worker   hb_ot_math_glyph_variant_t variants[20];
501*2d1272b8SAndroid Build Coastguard Worker   unsigned variantsSize = sizeof (variants) / sizeof (variants[0]);
502*2d1272b8SAndroid Build Coastguard Worker   unsigned int count;
503*2d1272b8SAndroid Build Coastguard Worker   unsigned int offset = 0;
504*2d1272b8SAndroid Build Coastguard Worker 
505*2d1272b8SAndroid Build Coastguard Worker   initFreeType();
506*2d1272b8SAndroid Build Coastguard Worker 
507*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontEmpty.otf");
508*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
509*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL), ==, 0);
510*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL), ==, 0);
511*2d1272b8SAndroid Build Coastguard Worker   closeFont();
512*2d1272b8SAndroid Build Coastguard Worker 
513*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial1.otf");
514*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
515*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL), ==, 0);
516*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL), ==, 0);
517*2d1272b8SAndroid Build Coastguard Worker   closeFont();
518*2d1272b8SAndroid Build Coastguard Worker 
519*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial2.otf");
520*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
521*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL), ==, 0);
522*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL), ==, 0);
523*2d1272b8SAndroid Build Coastguard Worker   closeFont();
524*2d1272b8SAndroid Build Coastguard Worker 
525*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial3.otf");
526*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
527*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL), ==, 0);
528*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL), ==, 0);
529*2d1272b8SAndroid Build Coastguard Worker   closeFont();
530*2d1272b8SAndroid Build Coastguard Worker 
531*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial4.otf");
532*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
533*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL), ==, 0);
534*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL), ==, 0);
535*2d1272b8SAndroid Build Coastguard Worker   closeFont();
536*2d1272b8SAndroid Build Coastguard Worker 
537*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontFull.otf");
538*2d1272b8SAndroid Build Coastguard Worker 
539*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "arrowleft", -1, &glyph));
540*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font,
541*2d1272b8SAndroid Build Coastguard Worker 						 glyph,
542*2d1272b8SAndroid Build Coastguard Worker 						 HB_DIRECTION_BTT,
543*2d1272b8SAndroid Build Coastguard Worker 						 0,
544*2d1272b8SAndroid Build Coastguard Worker 						 NULL,
545*2d1272b8SAndroid Build Coastguard Worker 						 NULL), ==, 0);
546*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font,
547*2d1272b8SAndroid Build Coastguard Worker 						 glyph,
548*2d1272b8SAndroid Build Coastguard Worker 						 HB_DIRECTION_RTL,
549*2d1272b8SAndroid Build Coastguard Worker 						 0,
550*2d1272b8SAndroid Build Coastguard Worker 						 NULL,
551*2d1272b8SAndroid Build Coastguard Worker 						 NULL), ==, 3);
552*2d1272b8SAndroid Build Coastguard Worker 
553*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "arrowup", -1, &glyph));
554*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font,
555*2d1272b8SAndroid Build Coastguard Worker 						 glyph,
556*2d1272b8SAndroid Build Coastguard Worker 						 HB_DIRECTION_BTT,
557*2d1272b8SAndroid Build Coastguard Worker 						 0,
558*2d1272b8SAndroid Build Coastguard Worker 						 NULL,
559*2d1272b8SAndroid Build Coastguard Worker 						 NULL), ==, 4);
560*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_variants (hb_font,
561*2d1272b8SAndroid Build Coastguard Worker 						 glyph,
562*2d1272b8SAndroid Build Coastguard Worker 						 HB_DIRECTION_RTL,
563*2d1272b8SAndroid Build Coastguard Worker 						 0,
564*2d1272b8SAndroid Build Coastguard Worker 						 NULL,
565*2d1272b8SAndroid Build Coastguard Worker 						 NULL), ==, 0);
566*2d1272b8SAndroid Build Coastguard Worker 
567*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "arrowleft", -1, &glyph));
568*2d1272b8SAndroid Build Coastguard Worker   do {
569*2d1272b8SAndroid Build Coastguard Worker     count = variantsSize;
570*2d1272b8SAndroid Build Coastguard Worker     hb_ot_math_get_glyph_variants (hb_font,
571*2d1272b8SAndroid Build Coastguard Worker 				   glyph,
572*2d1272b8SAndroid Build Coastguard Worker 				   HB_DIRECTION_RTL,
573*2d1272b8SAndroid Build Coastguard Worker 				   offset,
574*2d1272b8SAndroid Build Coastguard Worker 				   &count,
575*2d1272b8SAndroid Build Coastguard Worker 				   variants);
576*2d1272b8SAndroid Build Coastguard Worker     offset += count;
577*2d1272b8SAndroid Build Coastguard Worker   } while (count == variantsSize);
578*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(offset, ==, 3);
579*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "uni2190_size2", -1, &glyph));
580*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[0].glyph, ==, glyph);
581*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[0].advance, ==, 4302);
582*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "uni2190_size3", -1, &glyph));
583*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[1].glyph, ==, glyph);
584*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[1].advance, ==, 4802);
585*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "uni2190_size4", -1, &glyph));
586*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[2].glyph, ==, glyph);
587*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[2].advance, ==, 5802);
588*2d1272b8SAndroid Build Coastguard Worker 
589*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "arrowup", -1, &glyph));
590*2d1272b8SAndroid Build Coastguard Worker   offset = 0;
591*2d1272b8SAndroid Build Coastguard Worker   do {
592*2d1272b8SAndroid Build Coastguard Worker     count = variantsSize;
593*2d1272b8SAndroid Build Coastguard Worker     hb_ot_math_get_glyph_variants (hb_font,
594*2d1272b8SAndroid Build Coastguard Worker 				   glyph,
595*2d1272b8SAndroid Build Coastguard Worker 				   HB_DIRECTION_BTT,
596*2d1272b8SAndroid Build Coastguard Worker 				   offset,
597*2d1272b8SAndroid Build Coastguard Worker 				   &count,
598*2d1272b8SAndroid Build Coastguard Worker 				   variants);
599*2d1272b8SAndroid Build Coastguard Worker     offset += count;
600*2d1272b8SAndroid Build Coastguard Worker   } while (count == variantsSize);
601*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(offset, ==, 4);
602*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "uni2191_size2", -1, &glyph));
603*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[0].glyph, ==, glyph);
604*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[0].advance, ==, 2251);
605*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "uni2191_size3", -1, &glyph));
606*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[1].glyph, ==, glyph);
607*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[1].advance, ==, 2501);
608*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "uni2191_size4", -1, &glyph));
609*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[2].glyph, ==, glyph);
610*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[2].advance, ==, 3001);
611*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "uni2191_size5", -1, &glyph));
612*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[3].glyph, ==, glyph);
613*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(variants[3].advance, ==, 3751);
614*2d1272b8SAndroid Build Coastguard Worker 
615*2d1272b8SAndroid Build Coastguard Worker   closeFont();
616*2d1272b8SAndroid Build Coastguard Worker 
617*2d1272b8SAndroid Build Coastguard Worker   cleanupFreeType();
618*2d1272b8SAndroid Build Coastguard Worker }
619*2d1272b8SAndroid Build Coastguard Worker 
620*2d1272b8SAndroid Build Coastguard Worker static void
test_get_glyph_assembly(void)621*2d1272b8SAndroid Build Coastguard Worker test_get_glyph_assembly (void)
622*2d1272b8SAndroid Build Coastguard Worker {
623*2d1272b8SAndroid Build Coastguard Worker   hb_codepoint_t glyph;
624*2d1272b8SAndroid Build Coastguard Worker   hb_ot_math_glyph_part_t parts[20];
625*2d1272b8SAndroid Build Coastguard Worker   unsigned partsSize = sizeof (parts) / sizeof (parts[0]);
626*2d1272b8SAndroid Build Coastguard Worker   unsigned int count;
627*2d1272b8SAndroid Build Coastguard Worker   unsigned int offset = 0;
628*2d1272b8SAndroid Build Coastguard Worker 
629*2d1272b8SAndroid Build Coastguard Worker   initFreeType();
630*2d1272b8SAndroid Build Coastguard Worker 
631*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontEmpty.otf");
632*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
633*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL, NULL), ==, 0);
634*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL, NULL), ==, 0);
635*2d1272b8SAndroid Build Coastguard Worker   closeFont();
636*2d1272b8SAndroid Build Coastguard Worker 
637*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial1.otf");
638*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
639*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL, NULL), ==, 0);
640*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL, NULL), ==, 0);
641*2d1272b8SAndroid Build Coastguard Worker   closeFont();
642*2d1272b8SAndroid Build Coastguard Worker 
643*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial2.otf");
644*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
645*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL, NULL), ==, 0);
646*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL, NULL), ==, 0);
647*2d1272b8SAndroid Build Coastguard Worker   closeFont();
648*2d1272b8SAndroid Build Coastguard Worker 
649*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial3.otf");
650*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
651*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL, NULL), ==, 0);
652*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL, NULL), ==, 0);
653*2d1272b8SAndroid Build Coastguard Worker   closeFont();
654*2d1272b8SAndroid Build Coastguard Worker 
655*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontPartial4.otf");
656*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "space", -1, &glyph));
657*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_RTL, 0, NULL, NULL, NULL), ==, 0);
658*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font, glyph, HB_DIRECTION_BTT, 0, NULL, NULL, NULL), ==, 0);
659*2d1272b8SAndroid Build Coastguard Worker   closeFont();
660*2d1272b8SAndroid Build Coastguard Worker 
661*2d1272b8SAndroid Build Coastguard Worker   openFont("fonts/MathTestFontFull.otf");
662*2d1272b8SAndroid Build Coastguard Worker 
663*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "arrowright", -1, &glyph));
664*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font,
665*2d1272b8SAndroid Build Coastguard Worker 						 glyph,
666*2d1272b8SAndroid Build Coastguard Worker 						 HB_DIRECTION_BTT,
667*2d1272b8SAndroid Build Coastguard Worker 						 0,
668*2d1272b8SAndroid Build Coastguard Worker 						 NULL,
669*2d1272b8SAndroid Build Coastguard Worker 						 NULL,
670*2d1272b8SAndroid Build Coastguard Worker 						 NULL), ==, 0);
671*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font,
672*2d1272b8SAndroid Build Coastguard Worker 						 glyph,
673*2d1272b8SAndroid Build Coastguard Worker 						 HB_DIRECTION_RTL,
674*2d1272b8SAndroid Build Coastguard Worker 						 0,
675*2d1272b8SAndroid Build Coastguard Worker 						 NULL,
676*2d1272b8SAndroid Build Coastguard Worker 						 NULL,
677*2d1272b8SAndroid Build Coastguard Worker 						 NULL), ==, 3);
678*2d1272b8SAndroid Build Coastguard Worker 
679*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "arrowdown", -1, &glyph));
680*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font,
681*2d1272b8SAndroid Build Coastguard Worker 						 glyph,
682*2d1272b8SAndroid Build Coastguard Worker 						 HB_DIRECTION_BTT,
683*2d1272b8SAndroid Build Coastguard Worker 						 0,
684*2d1272b8SAndroid Build Coastguard Worker 						 NULL,
685*2d1272b8SAndroid Build Coastguard Worker 						 NULL,
686*2d1272b8SAndroid Build Coastguard Worker 						 NULL), ==, 5);
687*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(hb_ot_math_get_glyph_assembly (hb_font,
688*2d1272b8SAndroid Build Coastguard Worker 						 glyph,
689*2d1272b8SAndroid Build Coastguard Worker 						 HB_DIRECTION_RTL,
690*2d1272b8SAndroid Build Coastguard Worker 						 0,
691*2d1272b8SAndroid Build Coastguard Worker 						 NULL,
692*2d1272b8SAndroid Build Coastguard Worker 						 NULL,
693*2d1272b8SAndroid Build Coastguard Worker 						 NULL), ==, 0);
694*2d1272b8SAndroid Build Coastguard Worker 
695*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "arrowright", -1, &glyph));
696*2d1272b8SAndroid Build Coastguard Worker   do {
697*2d1272b8SAndroid Build Coastguard Worker     count = partsSize;
698*2d1272b8SAndroid Build Coastguard Worker     hb_ot_math_get_glyph_assembly (hb_font,
699*2d1272b8SAndroid Build Coastguard Worker 				   glyph,
700*2d1272b8SAndroid Build Coastguard Worker 				   HB_DIRECTION_RTL,
701*2d1272b8SAndroid Build Coastguard Worker 				   offset,
702*2d1272b8SAndroid Build Coastguard Worker 				   &count,
703*2d1272b8SAndroid Build Coastguard Worker 				   parts,
704*2d1272b8SAndroid Build Coastguard Worker 				   NULL);
705*2d1272b8SAndroid Build Coastguard Worker     offset += count;
706*2d1272b8SAndroid Build Coastguard Worker   } while (count == partsSize);
707*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(offset, ==, 3);
708*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "left", -1, &glyph));
709*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[0].glyph, ==, glyph);
710*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[0].start_connector_length, ==, 800);
711*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[0].end_connector_length, ==, 384);
712*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[0].full_advance, ==, 2000);
713*2d1272b8SAndroid Build Coastguard Worker   g_assert(!(parts[0].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER));
714*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "horizontal", -1, &glyph));
715*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[1].glyph, ==, glyph);
716*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[1].start_connector_length, ==, 524);
717*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[1].end_connector_length, ==, 800);
718*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[1].full_advance, ==, 2000);
719*2d1272b8SAndroid Build Coastguard Worker   g_assert(parts[1].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER);
720*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "right", -1, &glyph));
721*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[2].glyph, ==, glyph);
722*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[2].start_connector_length, ==, 316);
723*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[2].end_connector_length, ==, 454);
724*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[2].full_advance, ==, 2000);
725*2d1272b8SAndroid Build Coastguard Worker   g_assert(!(parts[2].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER));
726*2d1272b8SAndroid Build Coastguard Worker 
727*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "arrowdown", -1, &glyph));
728*2d1272b8SAndroid Build Coastguard Worker   offset = 0;
729*2d1272b8SAndroid Build Coastguard Worker   do {
730*2d1272b8SAndroid Build Coastguard Worker     count = partsSize;
731*2d1272b8SAndroid Build Coastguard Worker     hb_ot_math_get_glyph_assembly (hb_font,
732*2d1272b8SAndroid Build Coastguard Worker 				   glyph,
733*2d1272b8SAndroid Build Coastguard Worker 				   HB_DIRECTION_BTT,
734*2d1272b8SAndroid Build Coastguard Worker 				   offset,
735*2d1272b8SAndroid Build Coastguard Worker 				   &count,
736*2d1272b8SAndroid Build Coastguard Worker 				   parts,
737*2d1272b8SAndroid Build Coastguard Worker 				   NULL);
738*2d1272b8SAndroid Build Coastguard Worker     offset += count;
739*2d1272b8SAndroid Build Coastguard Worker   } while (count == partsSize);
740*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(offset, ==, 5);
741*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "bottom", -1, &glyph));
742*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[0].glyph, ==, glyph);
743*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[0].start_connector_length, ==, 365);
744*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[0].end_connector_length, ==, 158);
745*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[0].full_advance, ==, 1000);
746*2d1272b8SAndroid Build Coastguard Worker   g_assert(!(parts[0].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER));
747*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "vertical", -1, &glyph));
748*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[1].glyph, ==, glyph);
749*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[1].start_connector_length, ==, 227);
750*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[1].end_connector_length, ==, 365);
751*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[1].full_advance, ==, 1000);
752*2d1272b8SAndroid Build Coastguard Worker   g_assert(parts[1].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER);
753*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "center", -1, &glyph));
754*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[2].glyph, ==, glyph);
755*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[2].start_connector_length, ==, 54);
756*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[2].end_connector_length, ==, 158);
757*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[2].full_advance, ==, 1000);
758*2d1272b8SAndroid Build Coastguard Worker   g_assert(!(parts[2].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER));
759*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "vertical", -1, &glyph));
760*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[3].glyph, ==, glyph);
761*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[3].start_connector_length, ==, 400);
762*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[3].end_connector_length, ==, 296);
763*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[3].full_advance, ==, 1000);
764*2d1272b8SAndroid Build Coastguard Worker   g_assert(parts[1].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER);
765*2d1272b8SAndroid Build Coastguard Worker   g_assert(hb_font_get_glyph_from_name (hb_font, "top", -1, &glyph));
766*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[4].glyph, ==, glyph);
767*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[4].start_connector_length, ==, 123);
768*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[4].end_connector_length, ==, 192);
769*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpint(parts[4].full_advance, ==, 1000);
770*2d1272b8SAndroid Build Coastguard Worker   g_assert(!(parts[4].flags & HB_OT_MATH_GLYPH_PART_FLAG_EXTENDER));
771*2d1272b8SAndroid Build Coastguard Worker 
772*2d1272b8SAndroid Build Coastguard Worker   closeFont();
773*2d1272b8SAndroid Build Coastguard Worker 
774*2d1272b8SAndroid Build Coastguard Worker   cleanupFreeType();
775*2d1272b8SAndroid Build Coastguard Worker }
776*2d1272b8SAndroid Build Coastguard Worker 
777*2d1272b8SAndroid Build Coastguard Worker int
main(int argc,char ** argv)778*2d1272b8SAndroid Build Coastguard Worker main (int argc, char **argv)
779*2d1272b8SAndroid Build Coastguard Worker {
780*2d1272b8SAndroid Build Coastguard Worker   hb_test_init (&argc, &argv);
781*2d1272b8SAndroid Build Coastguard Worker 
782*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_has_data);
783*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_get_constant);
784*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_get_glyph_italics_correction);
785*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_get_glyph_top_accent_attachment);
786*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_is_glyph_extended_shape);
787*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_get_glyph_kerning);
788*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_get_glyph_kernings);
789*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_get_glyph_assembly_italics_correction);
790*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_get_min_connector_overlap);
791*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_get_glyph_variants);
792*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_get_glyph_assembly);
793*2d1272b8SAndroid Build Coastguard Worker 
794*2d1272b8SAndroid Build Coastguard Worker   return hb_test_run();
795*2d1272b8SAndroid Build Coastguard Worker }
796