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 STATIC_ARRAY_SIZE 255
31*2d1272b8SAndroid Build Coastguard Worker
32*2d1272b8SAndroid Build Coastguard Worker static void
test_ot_layout_table_get_script_tags(void)33*2d1272b8SAndroid Build Coastguard Worker test_ot_layout_table_get_script_tags (void)
34*2d1272b8SAndroid Build Coastguard Worker {
35*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/NotoNastaliqUrdu-Regular.ttf");
36*2d1272b8SAndroid Build Coastguard Worker
37*2d1272b8SAndroid Build Coastguard Worker unsigned int total = 0;
38*2d1272b8SAndroid Build Coastguard Worker unsigned int count = STATIC_ARRAY_SIZE;
39*2d1272b8SAndroid Build Coastguard Worker unsigned int offset = 0;
40*2d1272b8SAndroid Build Coastguard Worker hb_tag_t tags[STATIC_ARRAY_SIZE];
41*2d1272b8SAndroid Build Coastguard Worker while (count == STATIC_ARRAY_SIZE)
42*2d1272b8SAndroid Build Coastguard Worker {
43*2d1272b8SAndroid Build Coastguard Worker total = hb_ot_layout_table_get_script_tags (face, HB_OT_TAG_GSUB, offset, &count, tags);
44*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (3, ==, total);
45*2d1272b8SAndroid Build Coastguard Worker offset += count;
46*2d1272b8SAndroid Build Coastguard Worker if (count)
47*2d1272b8SAndroid Build Coastguard Worker {
48*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (3, ==, count);
49*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('a','r','a','b'), ==, tags[0]);
50*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('d','f','l','t'), ==, tags[1]);
51*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('l','a','t','n'), ==, tags[2]);
52*2d1272b8SAndroid Build Coastguard Worker }
53*2d1272b8SAndroid Build Coastguard Worker }
54*2d1272b8SAndroid Build Coastguard Worker count = STATIC_ARRAY_SIZE;
55*2d1272b8SAndroid Build Coastguard Worker offset = 0;
56*2d1272b8SAndroid Build Coastguard Worker while (count == STATIC_ARRAY_SIZE)
57*2d1272b8SAndroid Build Coastguard Worker {
58*2d1272b8SAndroid Build Coastguard Worker total = hb_ot_layout_table_get_script_tags (face, HB_OT_TAG_GPOS, offset, &count, tags);
59*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (1, ==, total);
60*2d1272b8SAndroid Build Coastguard Worker offset += count;
61*2d1272b8SAndroid Build Coastguard Worker if (count)
62*2d1272b8SAndroid Build Coastguard Worker {
63*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (1, ==, count);
64*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('a','r','a','b'), ==, tags[0]);
65*2d1272b8SAndroid Build Coastguard Worker }
66*2d1272b8SAndroid Build Coastguard Worker }
67*2d1272b8SAndroid Build Coastguard Worker
68*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
69*2d1272b8SAndroid Build Coastguard Worker }
70*2d1272b8SAndroid Build Coastguard Worker
71*2d1272b8SAndroid Build Coastguard Worker static void
test_ot_layout_table_find_script(void)72*2d1272b8SAndroid Build Coastguard Worker test_ot_layout_table_find_script (void)
73*2d1272b8SAndroid Build Coastguard Worker {
74*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/NotoNastaliqUrdu-Regular.ttf");
75*2d1272b8SAndroid Build Coastguard Worker unsigned int index;
76*2d1272b8SAndroid Build Coastguard Worker
77*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_ot_layout_table_find_script (face, HB_OT_TAG_GSUB, HB_TAG ('a','r','a','b'), &index));
78*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (0, ==, index);
79*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_ot_layout_table_find_script (face, HB_OT_TAG_GSUB, HB_TAG ('d','f','l','t'), &index));
80*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (1, ==, index);
81*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_ot_layout_table_find_script (face, HB_OT_TAG_GSUB, HB_TAG ('l','a','t','n'), &index));
82*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (2, ==, index);
83*2d1272b8SAndroid Build Coastguard Worker
84*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_ot_layout_table_find_script (face, HB_OT_TAG_GPOS, HB_TAG ('a','r','a','b'), &index));
85*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (0, ==, index);
86*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_ot_layout_table_find_script (face, HB_OT_TAG_GPOS, HB_TAG ('d','f','l','t'), &index));
87*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (0xFFFF, ==, index);
88*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_ot_layout_table_find_script (face, HB_OT_TAG_GPOS, HB_TAG ('l','a','t','n'), &index));
89*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (0xFFFF, ==, index);
90*2d1272b8SAndroid Build Coastguard Worker
91*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
92*2d1272b8SAndroid Build Coastguard Worker }
93*2d1272b8SAndroid Build Coastguard Worker
94*2d1272b8SAndroid Build Coastguard Worker static void
test_ot_layout_table_get_feature_tags(void)95*2d1272b8SAndroid Build Coastguard Worker test_ot_layout_table_get_feature_tags (void)
96*2d1272b8SAndroid Build Coastguard Worker {
97*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/NotoNastaliqUrdu-Regular.ttf");
98*2d1272b8SAndroid Build Coastguard Worker
99*2d1272b8SAndroid Build Coastguard Worker unsigned int total = 0;
100*2d1272b8SAndroid Build Coastguard Worker unsigned int count = STATIC_ARRAY_SIZE;
101*2d1272b8SAndroid Build Coastguard Worker unsigned int offset = 0;
102*2d1272b8SAndroid Build Coastguard Worker hb_tag_t tags[STATIC_ARRAY_SIZE];
103*2d1272b8SAndroid Build Coastguard Worker while (count == STATIC_ARRAY_SIZE)
104*2d1272b8SAndroid Build Coastguard Worker {
105*2d1272b8SAndroid Build Coastguard Worker total = hb_ot_layout_table_get_feature_tags (face, HB_OT_TAG_GSUB, offset, &count, tags);
106*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (14, ==, total);
107*2d1272b8SAndroid Build Coastguard Worker offset += count;
108*2d1272b8SAndroid Build Coastguard Worker if (count)
109*2d1272b8SAndroid Build Coastguard Worker {
110*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (14, ==, count);
111*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('c','c','m','p'), ==, tags[0]);
112*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('i','s','o','l'), ==, tags[10]);
113*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('r','l','i','g'), ==, tags[13]);
114*2d1272b8SAndroid Build Coastguard Worker }
115*2d1272b8SAndroid Build Coastguard Worker }
116*2d1272b8SAndroid Build Coastguard Worker count = STATIC_ARRAY_SIZE;
117*2d1272b8SAndroid Build Coastguard Worker offset = 0;
118*2d1272b8SAndroid Build Coastguard Worker while (count == STATIC_ARRAY_SIZE)
119*2d1272b8SAndroid Build Coastguard Worker {
120*2d1272b8SAndroid Build Coastguard Worker total = hb_ot_layout_table_get_feature_tags (face, HB_OT_TAG_GPOS, offset, &count, tags);
121*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (3, ==, total);
122*2d1272b8SAndroid Build Coastguard Worker offset += count;
123*2d1272b8SAndroid Build Coastguard Worker if (count)
124*2d1272b8SAndroid Build Coastguard Worker {
125*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (3, ==, count);
126*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('c','u','r','s'), ==, tags[0]);
127*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('m','a','r','k'), ==, tags[1]);
128*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('m','k','m','k'), ==, tags[2]);
129*2d1272b8SAndroid Build Coastguard Worker }
130*2d1272b8SAndroid Build Coastguard Worker }
131*2d1272b8SAndroid Build Coastguard Worker
132*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
133*2d1272b8SAndroid Build Coastguard Worker }
134*2d1272b8SAndroid Build Coastguard Worker
135*2d1272b8SAndroid Build Coastguard Worker static void
test_ot_layout_script_get_language_tags(void)136*2d1272b8SAndroid Build Coastguard Worker test_ot_layout_script_get_language_tags (void)
137*2d1272b8SAndroid Build Coastguard Worker {
138*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/Estedad-VF.ttf");
139*2d1272b8SAndroid Build Coastguard Worker
140*2d1272b8SAndroid Build Coastguard Worker unsigned int total = 0;
141*2d1272b8SAndroid Build Coastguard Worker unsigned int count = STATIC_ARRAY_SIZE;
142*2d1272b8SAndroid Build Coastguard Worker unsigned int offset = 0;
143*2d1272b8SAndroid Build Coastguard Worker hb_tag_t tags[STATIC_ARRAY_SIZE];
144*2d1272b8SAndroid Build Coastguard Worker while (count == STATIC_ARRAY_SIZE)
145*2d1272b8SAndroid Build Coastguard Worker {
146*2d1272b8SAndroid Build Coastguard Worker total = hb_ot_layout_script_get_language_tags (face, HB_OT_TAG_GSUB, 0, offset, &count, tags);
147*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (2, ==, total);
148*2d1272b8SAndroid Build Coastguard Worker offset += count;
149*2d1272b8SAndroid Build Coastguard Worker if (count)
150*2d1272b8SAndroid Build Coastguard Worker {
151*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (2, ==, count);
152*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('F','A','R',' '), ==, tags[0]);
153*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('K','U','R',' '), ==, tags[1]);
154*2d1272b8SAndroid Build Coastguard Worker }
155*2d1272b8SAndroid Build Coastguard Worker }
156*2d1272b8SAndroid Build Coastguard Worker count = STATIC_ARRAY_SIZE;
157*2d1272b8SAndroid Build Coastguard Worker offset = 0;
158*2d1272b8SAndroid Build Coastguard Worker while (count == STATIC_ARRAY_SIZE)
159*2d1272b8SAndroid Build Coastguard Worker {
160*2d1272b8SAndroid Build Coastguard Worker total = hb_ot_layout_script_get_language_tags (face, HB_OT_TAG_GPOS, 1, offset, &count, tags);
161*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (2, ==, total);
162*2d1272b8SAndroid Build Coastguard Worker offset += count;
163*2d1272b8SAndroid Build Coastguard Worker if (count)
164*2d1272b8SAndroid Build Coastguard Worker {
165*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (2, ==, count);
166*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('F','A','R',' '), ==, tags[0]);
167*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('K','U','R',' '), ==, tags[1]);
168*2d1272b8SAndroid Build Coastguard Worker }
169*2d1272b8SAndroid Build Coastguard Worker }
170*2d1272b8SAndroid Build Coastguard Worker
171*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
172*2d1272b8SAndroid Build Coastguard Worker }
173*2d1272b8SAndroid Build Coastguard Worker
174*2d1272b8SAndroid Build Coastguard Worker static void
test_ot_layout_language_get_feature_tags(void)175*2d1272b8SAndroid Build Coastguard Worker test_ot_layout_language_get_feature_tags (void)
176*2d1272b8SAndroid Build Coastguard Worker {
177*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/Estedad-VF.ttf");
178*2d1272b8SAndroid Build Coastguard Worker
179*2d1272b8SAndroid Build Coastguard Worker unsigned int total = 0;
180*2d1272b8SAndroid Build Coastguard Worker unsigned int count = STATIC_ARRAY_SIZE;
181*2d1272b8SAndroid Build Coastguard Worker unsigned int offset = 0;
182*2d1272b8SAndroid Build Coastguard Worker hb_tag_t tags[STATIC_ARRAY_SIZE];
183*2d1272b8SAndroid Build Coastguard Worker while (count == STATIC_ARRAY_SIZE)
184*2d1272b8SAndroid Build Coastguard Worker {
185*2d1272b8SAndroid Build Coastguard Worker total = hb_ot_layout_language_get_feature_tags (face, HB_OT_TAG_GSUB, 0, 0, offset, &count, tags);
186*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (6, ==, total);
187*2d1272b8SAndroid Build Coastguard Worker offset += count;
188*2d1272b8SAndroid Build Coastguard Worker if (count)
189*2d1272b8SAndroid Build Coastguard Worker {
190*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (6, ==, count);
191*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('c','a','l','t'), ==, tags[0]);
192*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('f','i','n','a'), ==, tags[1]);
193*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('i','n','i','t'), ==, tags[2]);
194*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('l','i','g','a'), ==, tags[3]);
195*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('m','e','d','i'), ==, tags[4]);
196*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('r','l','i','g'), ==, tags[5]);
197*2d1272b8SAndroid Build Coastguard Worker }
198*2d1272b8SAndroid Build Coastguard Worker }
199*2d1272b8SAndroid Build Coastguard Worker count = STATIC_ARRAY_SIZE;
200*2d1272b8SAndroid Build Coastguard Worker offset = 0;
201*2d1272b8SAndroid Build Coastguard Worker while (count == STATIC_ARRAY_SIZE)
202*2d1272b8SAndroid Build Coastguard Worker {
203*2d1272b8SAndroid Build Coastguard Worker total = hb_ot_layout_language_get_feature_tags (face, HB_OT_TAG_GPOS, 1, 0, offset, &count, tags);
204*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (3, ==, total);
205*2d1272b8SAndroid Build Coastguard Worker offset += count;
206*2d1272b8SAndroid Build Coastguard Worker if (count)
207*2d1272b8SAndroid Build Coastguard Worker {
208*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (3, ==, count);
209*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('k','e','r','n'), ==, tags[0]);
210*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('m','a','r','k'), ==, tags[1]);
211*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (HB_TAG ('m','k','m','k'), ==, tags[2]);
212*2d1272b8SAndroid Build Coastguard Worker }
213*2d1272b8SAndroid Build Coastguard Worker }
214*2d1272b8SAndroid Build Coastguard Worker
215*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
216*2d1272b8SAndroid Build Coastguard Worker }
217*2d1272b8SAndroid Build Coastguard Worker
218*2d1272b8SAndroid Build Coastguard Worker int
main(int argc,char ** argv)219*2d1272b8SAndroid Build Coastguard Worker main (int argc, char **argv)
220*2d1272b8SAndroid Build Coastguard Worker {
221*2d1272b8SAndroid Build Coastguard Worker hb_test_init (&argc, &argv);
222*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_ot_layout_table_get_script_tags);
223*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_ot_layout_table_find_script);
224*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_ot_layout_script_get_language_tags);
225*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_ot_layout_table_get_feature_tags);
226*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_ot_layout_language_get_feature_tags);
227*2d1272b8SAndroid Build Coastguard Worker return hb_test_run ();
228*2d1272b8SAndroid Build Coastguard Worker }
229