xref: /aosp_15_r20/external/harfbuzz_ng/test/api/test-ot-layout.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 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