xref: /aosp_15_r20/external/harfbuzz_ng/test/api/test-ot-collect-glyphs.c (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker  * Copyright © 2021  Khaled Hosny
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 
25*2d1272b8SAndroid Build Coastguard Worker #include "hb-test.h"
26*2d1272b8SAndroid Build Coastguard Worker 
27*2d1272b8SAndroid Build Coastguard Worker #include <hb.h>
28*2d1272b8SAndroid Build Coastguard Worker #include <hb-ot.h>
29*2d1272b8SAndroid Build Coastguard Worker 
30*2d1272b8SAndroid Build Coastguard Worker #define BEGIN(tag, idx) \
31*2d1272b8SAndroid Build Coastguard Worker   hb_ot_layout_lookup_collect_glyphs (face, tag, idx, before, input, after, output) \
32*2d1272b8SAndroid Build Coastguard Worker 
33*2d1272b8SAndroid Build Coastguard Worker #define END() \
34*2d1272b8SAndroid Build Coastguard Worker   hb_set_clear (before); \
35*2d1272b8SAndroid Build Coastguard Worker   hb_set_clear (input); \
36*2d1272b8SAndroid Build Coastguard Worker   hb_set_clear (after); \
37*2d1272b8SAndroid Build Coastguard Worker   hb_set_clear (output)
38*2d1272b8SAndroid Build Coastguard Worker 
39*2d1272b8SAndroid Build Coastguard Worker static void
test_ot_layout_lookup_collect_glyphs_source_sans(void)40*2d1272b8SAndroid Build Coastguard Worker test_ot_layout_lookup_collect_glyphs_source_sans (void)
41*2d1272b8SAndroid Build Coastguard Worker {
42*2d1272b8SAndroid Build Coastguard Worker   hb_face_t *face = hb_test_open_font_file ("fonts/SourceSansPro-Regular.otf");
43*2d1272b8SAndroid Build Coastguard Worker 
44*2d1272b8SAndroid Build Coastguard Worker   hb_set_t *before = hb_set_create();
45*2d1272b8SAndroid Build Coastguard Worker   hb_set_t *input = hb_set_create();
46*2d1272b8SAndroid Build Coastguard Worker   hb_set_t *after = hb_set_create();
47*2d1272b8SAndroid Build Coastguard Worker   hb_set_t *output = hb_set_create();
48*2d1272b8SAndroid Build Coastguard Worker   hb_codepoint_t g = HB_SET_VALUE_INVALID;
49*2d1272b8SAndroid Build Coastguard Worker 
50*2d1272b8SAndroid Build Coastguard Worker   /* SingleSubst */
51*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 0);
52*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
53*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (684, ==, hb_set_get_population (input));
54*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
55*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
56*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (54, ==, g);
57*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
58*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (372, ==, hb_set_get_population (output));
59*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
60*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
61*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (574, ==, g);
62*2d1272b8SAndroid Build Coastguard Worker   END();
63*2d1272b8SAndroid Build Coastguard Worker 
64*2d1272b8SAndroid Build Coastguard Worker   /* AlternateSubst */
65*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 1);
66*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
67*2d1272b8SAndroid Build Coastguard Worker 
68*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (143, ==, hb_set_get_population (input));
69*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
70*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
71*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (2, ==, g);
72*2d1272b8SAndroid Build Coastguard Worker 
73*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
74*2d1272b8SAndroid Build Coastguard Worker 
75*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (319, ==, hb_set_get_population (output));
76*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
77*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
78*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (519, ==, g);
79*2d1272b8SAndroid Build Coastguard Worker   END();
80*2d1272b8SAndroid Build Coastguard Worker 
81*2d1272b8SAndroid Build Coastguard Worker   /* MultipleSubst */
82*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 7);
83*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
84*2d1272b8SAndroid Build Coastguard Worker 
85*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (10, ==, hb_set_get_population (input));
86*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
87*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
88*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (92, ==, g);
89*2d1272b8SAndroid Build Coastguard Worker 
90*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
91*2d1272b8SAndroid Build Coastguard Worker 
92*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (9, ==, hb_set_get_population (output));
93*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
94*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
95*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (6, ==, g);
96*2d1272b8SAndroid Build Coastguard Worker   END();
97*2d1272b8SAndroid Build Coastguard Worker 
98*2d1272b8SAndroid Build Coastguard Worker   /* LigatureSubst */
99*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 10);
100*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
101*2d1272b8SAndroid Build Coastguard Worker 
102*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (14, ==, hb_set_get_population (input));
103*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
104*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
105*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (1823, ==, g);
106*2d1272b8SAndroid Build Coastguard Worker 
107*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
108*2d1272b8SAndroid Build Coastguard Worker 
109*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (22, ==, hb_set_get_population (output));
110*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
111*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
112*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (1897, ==, g);
113*2d1272b8SAndroid Build Coastguard Worker   END();
114*2d1272b8SAndroid Build Coastguard Worker 
115*2d1272b8SAndroid Build Coastguard Worker   /* ChainContextSubstFormat3 */
116*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 8);
117*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
118*2d1272b8SAndroid Build Coastguard Worker 
119*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (10, ==, hb_set_get_population (input));
120*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
121*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
122*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (92, ==, g);
123*2d1272b8SAndroid Build Coastguard Worker 
124*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (2, ==, hb_set_get_population (after));
125*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
126*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (after, &g));
127*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (1826, ==, g);
128*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (after, &g));
129*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (1837, ==, g);
130*2d1272b8SAndroid Build Coastguard Worker 
131*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (9, ==, hb_set_get_population (output));
132*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
133*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
134*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (6, ==, g);
135*2d1272b8SAndroid Build Coastguard Worker   END();
136*2d1272b8SAndroid Build Coastguard Worker 
137*2d1272b8SAndroid Build Coastguard Worker   /* ChainContextSubstFormat3 */
138*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 13);
139*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (771, ==, hb_set_get_population (before));
140*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
141*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (before, &g));
142*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (2, ==, g);
143*2d1272b8SAndroid Build Coastguard Worker 
144*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (28, ==, hb_set_get_population (input));
145*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
146*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
147*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (1823, ==, g);
148*2d1272b8SAndroid Build Coastguard Worker 
149*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
150*2d1272b8SAndroid Build Coastguard Worker 
151*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (48, ==, hb_set_get_population (output));
152*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
153*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
154*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (325, ==, g);
155*2d1272b8SAndroid Build Coastguard Worker   END();
156*2d1272b8SAndroid Build Coastguard Worker 
157*2d1272b8SAndroid Build Coastguard Worker   /* MarkBasePos */
158*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GPOS, 0);
159*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
160*2d1272b8SAndroid Build Coastguard Worker 
161*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (179, ==, hb_set_get_population (input));
162*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
163*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
164*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (28, ==, g);
165*2d1272b8SAndroid Build Coastguard Worker 
166*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
167*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (output));
168*2d1272b8SAndroid Build Coastguard Worker   END();
169*2d1272b8SAndroid Build Coastguard Worker 
170*2d1272b8SAndroid Build Coastguard Worker   /* MarkMarkPos */
171*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GPOS, 9);
172*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
173*2d1272b8SAndroid Build Coastguard Worker 
174*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (48, ==, hb_set_get_population (input));
175*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
176*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
177*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (1823, ==, g);
178*2d1272b8SAndroid Build Coastguard Worker 
179*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
180*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (output));
181*2d1272b8SAndroid Build Coastguard Worker   END();
182*2d1272b8SAndroid Build Coastguard Worker 
183*2d1272b8SAndroid Build Coastguard Worker   /* PairPos */
184*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GPOS, 10);
185*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
186*2d1272b8SAndroid Build Coastguard Worker 
187*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (1426, ==, hb_set_get_population (input));
188*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
189*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
190*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (2, ==, g);
191*2d1272b8SAndroid Build Coastguard Worker 
192*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
193*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (output));
194*2d1272b8SAndroid Build Coastguard Worker   END();
195*2d1272b8SAndroid Build Coastguard Worker 
196*2d1272b8SAndroid Build Coastguard Worker   hb_face_destroy (face);
197*2d1272b8SAndroid Build Coastguard Worker   face = hb_test_open_font_file ("fonts/SourceHanSans-Regular.41,3041,4C2E.otf");
198*2d1272b8SAndroid Build Coastguard Worker 
199*2d1272b8SAndroid Build Coastguard Worker   /* SinglePosFormat2 */
200*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GPOS, 1);
201*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
202*2d1272b8SAndroid Build Coastguard Worker 
203*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (1, ==, hb_set_get_population (input));
204*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
205*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
206*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (4, ==, g);
207*2d1272b8SAndroid Build Coastguard Worker 
208*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
209*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (output));
210*2d1272b8SAndroid Build Coastguard Worker   END();
211*2d1272b8SAndroid Build Coastguard Worker 
212*2d1272b8SAndroid Build Coastguard Worker   hb_face_destroy (face);
213*2d1272b8SAndroid Build Coastguard Worker   hb_set_destroy (before);
214*2d1272b8SAndroid Build Coastguard Worker   hb_set_destroy (input);
215*2d1272b8SAndroid Build Coastguard Worker   hb_set_destroy (after);
216*2d1272b8SAndroid Build Coastguard Worker   hb_set_destroy (output);
217*2d1272b8SAndroid Build Coastguard Worker }
218*2d1272b8SAndroid Build Coastguard Worker 
219*2d1272b8SAndroid Build Coastguard Worker static void
test_ot_layout_lookup_collect_glyphs_noto_nastaliq(void)220*2d1272b8SAndroid Build Coastguard Worker test_ot_layout_lookup_collect_glyphs_noto_nastaliq (void)
221*2d1272b8SAndroid Build Coastguard Worker {
222*2d1272b8SAndroid Build Coastguard Worker   hb_face_t *face = hb_test_open_font_file ("fonts/NotoNastaliqUrdu-Regular.ttf");
223*2d1272b8SAndroid Build Coastguard Worker 
224*2d1272b8SAndroid Build Coastguard Worker   hb_set_t *before = hb_set_create();
225*2d1272b8SAndroid Build Coastguard Worker   hb_set_t *input = hb_set_create();
226*2d1272b8SAndroid Build Coastguard Worker   hb_set_t *after = hb_set_create();
227*2d1272b8SAndroid Build Coastguard Worker   hb_set_t *output = hb_set_create();
228*2d1272b8SAndroid Build Coastguard Worker   hb_codepoint_t g = HB_SET_VALUE_INVALID;
229*2d1272b8SAndroid Build Coastguard Worker 
230*2d1272b8SAndroid Build Coastguard Worker   /* ExtensionSubst -> ContextSubstFormat1 */
231*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 9);
232*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
233*2d1272b8SAndroid Build Coastguard Worker 
234*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (3, ==, hb_set_get_population (input));
235*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
236*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
237*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (228, ==, g);
238*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
239*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (416, ==, g);
240*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
241*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (441, ==, g);
242*2d1272b8SAndroid Build Coastguard Worker 
243*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
244*2d1272b8SAndroid Build Coastguard Worker 
245*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (3, ==, hb_set_get_population (output));
246*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
247*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
248*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (267, ==, g);
249*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
250*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (268, ==, g);
251*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
252*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (279, ==, g);
253*2d1272b8SAndroid Build Coastguard Worker   END();
254*2d1272b8SAndroid Build Coastguard Worker 
255*2d1272b8SAndroid Build Coastguard Worker   /* ExtensionSubst -> SingleSubst */
256*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 10);
257*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
258*2d1272b8SAndroid Build Coastguard Worker 
259*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (3, ==, hb_set_get_population (input));
260*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
261*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
262*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (228, ==, g);
263*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
264*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (416, ==, g);
265*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
266*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (441, ==, g);
267*2d1272b8SAndroid Build Coastguard Worker 
268*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
269*2d1272b8SAndroid Build Coastguard Worker 
270*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (3, ==, hb_set_get_population (output));
271*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
272*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
273*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (267, ==, g);
274*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
275*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (268, ==, g);
276*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
277*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (279, ==, g);
278*2d1272b8SAndroid Build Coastguard Worker   END();
279*2d1272b8SAndroid Build Coastguard Worker 
280*2d1272b8SAndroid Build Coastguard Worker   /* ExtensionSubst -> ChainContextSubstFormat2 */
281*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 16);
282*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (16, ==, hb_set_get_population (before));
283*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
284*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (before, &g));
285*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (74, ==, g);
286*2d1272b8SAndroid Build Coastguard Worker 
287*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (27, ==, hb_set_get_population (input));
288*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
289*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
290*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (276, ==, g);
291*2d1272b8SAndroid Build Coastguard Worker 
292*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (14, ==, hb_set_get_population (after));
293*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
294*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (after, &g));
295*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (252, ==, g);
296*2d1272b8SAndroid Build Coastguard Worker 
297*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (43, ==, hb_set_get_population (output));
298*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
299*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
300*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (74, ==, g);
301*2d1272b8SAndroid Build Coastguard Worker   END();
302*2d1272b8SAndroid Build Coastguard Worker 
303*2d1272b8SAndroid Build Coastguard Worker   /* ExtensionSubst -> ContextSubstFormat2 */
304*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 39);
305*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
306*2d1272b8SAndroid Build Coastguard Worker 
307*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (246, ==, hb_set_get_population (input));
308*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
309*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
310*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (252, ==, g);
311*2d1272b8SAndroid Build Coastguard Worker 
312*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
313*2d1272b8SAndroid Build Coastguard Worker 
314*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (258, ==, hb_set_get_population (output));
315*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
316*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
317*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (74, ==, g);
318*2d1272b8SAndroid Build Coastguard Worker   END();
319*2d1272b8SAndroid Build Coastguard Worker 
320*2d1272b8SAndroid Build Coastguard Worker 
321*2d1272b8SAndroid Build Coastguard Worker   /* CursivePos */
322*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GPOS, 0);
323*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
324*2d1272b8SAndroid Build Coastguard Worker 
325*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (616, ==, hb_set_get_population (input));
326*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
327*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
328*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (228, ==, g);
329*2d1272b8SAndroid Build Coastguard Worker 
330*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
331*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (output));
332*2d1272b8SAndroid Build Coastguard Worker   END();
333*2d1272b8SAndroid Build Coastguard Worker 
334*2d1272b8SAndroid Build Coastguard Worker   /* ExtensionSubst -> MarkLigPos */
335*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GPOS, 13);
336*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
337*2d1272b8SAndroid Build Coastguard Worker 
338*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (46, ==, hb_set_get_population (input));
339*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
340*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
341*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (1004, ==, g);
342*2d1272b8SAndroid Build Coastguard Worker 
343*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
344*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (output));
345*2d1272b8SAndroid Build Coastguard Worker   END();
346*2d1272b8SAndroid Build Coastguard Worker 
347*2d1272b8SAndroid Build Coastguard Worker   /* ExtensionSubst -> SinglePosFormat1 */
348*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GPOS, 17);
349*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
350*2d1272b8SAndroid Build Coastguard Worker 
351*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (242, ==, hb_set_get_population (input));
352*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
353*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
354*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (257, ==, g);
355*2d1272b8SAndroid Build Coastguard Worker 
356*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
357*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (output));
358*2d1272b8SAndroid Build Coastguard Worker   END();
359*2d1272b8SAndroid Build Coastguard Worker 
360*2d1272b8SAndroid Build Coastguard Worker   hb_face_destroy (face);
361*2d1272b8SAndroid Build Coastguard Worker   hb_set_destroy (before);
362*2d1272b8SAndroid Build Coastguard Worker   hb_set_destroy (input);
363*2d1272b8SAndroid Build Coastguard Worker   hb_set_destroy (after);
364*2d1272b8SAndroid Build Coastguard Worker   hb_set_destroy (output);
365*2d1272b8SAndroid Build Coastguard Worker }
366*2d1272b8SAndroid Build Coastguard Worker 
367*2d1272b8SAndroid Build Coastguard Worker static void
test_ot_layout_lookup_collect_glyphs_qahiri(void)368*2d1272b8SAndroid Build Coastguard Worker test_ot_layout_lookup_collect_glyphs_qahiri (void)
369*2d1272b8SAndroid Build Coastguard Worker {
370*2d1272b8SAndroid Build Coastguard Worker   hb_face_t *face = hb_test_open_font_file ("fonts/Qahiri-Regular.ttf");
371*2d1272b8SAndroid Build Coastguard Worker 
372*2d1272b8SAndroid Build Coastguard Worker   hb_set_t *before = hb_set_create();
373*2d1272b8SAndroid Build Coastguard Worker   hb_set_t *input = hb_set_create();
374*2d1272b8SAndroid Build Coastguard Worker   hb_set_t *after = hb_set_create();
375*2d1272b8SAndroid Build Coastguard Worker   hb_set_t *output = hb_set_create();
376*2d1272b8SAndroid Build Coastguard Worker   hb_codepoint_t g = HB_SET_VALUE_INVALID;
377*2d1272b8SAndroid Build Coastguard Worker 
378*2d1272b8SAndroid Build Coastguard Worker   /* SingleSubstFormat1 */
379*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 0);
380*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
381*2d1272b8SAndroid Build Coastguard Worker 
382*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (4, ==, hb_set_get_population (input));
383*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
384*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
385*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (52, ==, g);
386*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
387*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (60, ==, g);
388*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
389*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (62, ==, g);
390*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
391*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (159, ==, g);
392*2d1272b8SAndroid Build Coastguard Worker 
393*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
394*2d1272b8SAndroid Build Coastguard Worker 
395*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (4, ==, hb_set_get_population (output));
396*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
397*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
398*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (53, ==, g);
399*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
400*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (61, ==, g);
401*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
402*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (63, ==, g);
403*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
404*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (160, ==, g);
405*2d1272b8SAndroid Build Coastguard Worker   END();
406*2d1272b8SAndroid Build Coastguard Worker 
407*2d1272b8SAndroid Build Coastguard Worker   /* ChainContextSubstFormat1 */
408*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 11);
409*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (1, ==, hb_set_get_population (before));
410*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
411*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (before, &g));
412*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (39, ==, g);
413*2d1272b8SAndroid Build Coastguard Worker 
414*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (2, ==, hb_set_get_population (input));
415*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
416*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
417*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (154, ==, g);
418*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
419*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (159, ==, g);
420*2d1272b8SAndroid Build Coastguard Worker 
421*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (1, ==, hb_set_get_population (after));
422*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
423*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (after, &g));
424*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (179, ==, g);
425*2d1272b8SAndroid Build Coastguard Worker 
426*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (2, ==, hb_set_get_population (output));
427*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
428*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
429*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (155, ==, g);
430*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
431*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (162, ==, g);
432*2d1272b8SAndroid Build Coastguard Worker   END();
433*2d1272b8SAndroid Build Coastguard Worker 
434*2d1272b8SAndroid Build Coastguard Worker   /* ContextSubstFormat3 */
435*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 31);
436*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
437*2d1272b8SAndroid Build Coastguard Worker 
438*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (4, ==, hb_set_get_population (input));
439*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
440*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
441*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (53, ==, g);
442*2d1272b8SAndroid Build Coastguard Worker 
443*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (after));
444*2d1272b8SAndroid Build Coastguard Worker 
445*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (4, ==, hb_set_get_population (output));
446*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
447*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
448*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (52, ==, g);
449*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
450*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (60, ==, g);
451*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
452*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (62, ==, g);
453*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
454*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (159, ==, g);
455*2d1272b8SAndroid Build Coastguard Worker   END();
456*2d1272b8SAndroid Build Coastguard Worker 
457*2d1272b8SAndroid Build Coastguard Worker   /* ReverseChainSingleSubst */
458*2d1272b8SAndroid Build Coastguard Worker   BEGIN(HB_OT_TAG_GSUB, 32);
459*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (0, ==, hb_set_get_population (before));
460*2d1272b8SAndroid Build Coastguard Worker 
461*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (42, ==, hb_set_get_population (input));
462*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
463*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (input, &g));
464*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (47, ==, g);
465*2d1272b8SAndroid Build Coastguard Worker 
466*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (46, ==, hb_set_get_population (after));
467*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
468*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (after, &g));
469*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (61, ==, g);
470*2d1272b8SAndroid Build Coastguard Worker 
471*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (42, ==, hb_set_get_population (output));
472*2d1272b8SAndroid Build Coastguard Worker   g = HB_SET_VALUE_INVALID;
473*2d1272b8SAndroid Build Coastguard Worker   g_assert (hb_set_next (output, &g));
474*2d1272b8SAndroid Build Coastguard Worker   g_assert_cmpuint (463, ==, g);
475*2d1272b8SAndroid Build Coastguard Worker   END();
476*2d1272b8SAndroid Build Coastguard Worker 
477*2d1272b8SAndroid Build Coastguard Worker   hb_face_destroy (face);
478*2d1272b8SAndroid Build Coastguard Worker   hb_set_destroy (before);
479*2d1272b8SAndroid Build Coastguard Worker   hb_set_destroy (input);
480*2d1272b8SAndroid Build Coastguard Worker   hb_set_destroy (after);
481*2d1272b8SAndroid Build Coastguard Worker   hb_set_destroy (output);
482*2d1272b8SAndroid Build Coastguard Worker }
483*2d1272b8SAndroid Build Coastguard Worker 
484*2d1272b8SAndroid Build Coastguard Worker int
main(int argc,char ** argv)485*2d1272b8SAndroid Build Coastguard Worker main (int argc, char **argv)
486*2d1272b8SAndroid Build Coastguard Worker {
487*2d1272b8SAndroid Build Coastguard Worker   hb_test_init (&argc, &argv);
488*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_ot_layout_lookup_collect_glyphs_source_sans);
489*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_ot_layout_lookup_collect_glyphs_noto_nastaliq);
490*2d1272b8SAndroid Build Coastguard Worker   hb_test_add (test_ot_layout_lookup_collect_glyphs_qahiri);
491*2d1272b8SAndroid Build Coastguard Worker   return hb_test_run ();
492*2d1272b8SAndroid Build Coastguard Worker }
493