1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2024 Behdad Esfahbod
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 #include <math.h>
27*2d1272b8SAndroid Build Coastguard Worker
28*2d1272b8SAndroid Build Coastguard Worker #include <hb.h>
29*2d1272b8SAndroid Build Coastguard Worker
30*2d1272b8SAndroid Build Coastguard Worker typedef struct draw_data_t
31*2d1272b8SAndroid Build Coastguard Worker {
32*2d1272b8SAndroid Build Coastguard Worker unsigned move_to_count;
33*2d1272b8SAndroid Build Coastguard Worker unsigned line_to_count;
34*2d1272b8SAndroid Build Coastguard Worker unsigned quad_to_count;
35*2d1272b8SAndroid Build Coastguard Worker unsigned cubic_to_count;
36*2d1272b8SAndroid Build Coastguard Worker unsigned close_path_count;
37*2d1272b8SAndroid Build Coastguard Worker } draw_data_t;
38*2d1272b8SAndroid Build Coastguard Worker
39*2d1272b8SAndroid Build Coastguard Worker /* Our modified itoa, why not using libc's? it is going to be used
40*2d1272b8SAndroid Build Coastguard Worker in harfbuzzjs where libc isn't available */
_hb_reverse(char * buf,unsigned int len)41*2d1272b8SAndroid Build Coastguard Worker static void _hb_reverse (char *buf, unsigned int len)
42*2d1272b8SAndroid Build Coastguard Worker {
43*2d1272b8SAndroid Build Coastguard Worker unsigned start = 0, end = len - 1;
44*2d1272b8SAndroid Build Coastguard Worker while (start < end)
45*2d1272b8SAndroid Build Coastguard Worker {
46*2d1272b8SAndroid Build Coastguard Worker char c = buf[end];
47*2d1272b8SAndroid Build Coastguard Worker buf[end] = buf[start];
48*2d1272b8SAndroid Build Coastguard Worker buf[start] = c;
49*2d1272b8SAndroid Build Coastguard Worker start++; end--;
50*2d1272b8SAndroid Build Coastguard Worker }
51*2d1272b8SAndroid Build Coastguard Worker }
_hb_itoa(float fnum,char * buf)52*2d1272b8SAndroid Build Coastguard Worker static unsigned _hb_itoa (float fnum, char *buf)
53*2d1272b8SAndroid Build Coastguard Worker {
54*2d1272b8SAndroid Build Coastguard Worker int32_t num = (int32_t) floorf (fnum + .5f);
55*2d1272b8SAndroid Build Coastguard Worker unsigned int i = 0;
56*2d1272b8SAndroid Build Coastguard Worker hb_bool_t is_negative = num < 0;
57*2d1272b8SAndroid Build Coastguard Worker if (is_negative) num = -num;
58*2d1272b8SAndroid Build Coastguard Worker do
59*2d1272b8SAndroid Build Coastguard Worker {
60*2d1272b8SAndroid Build Coastguard Worker buf[i++] = '0' + num % 10;
61*2d1272b8SAndroid Build Coastguard Worker num /= 10;
62*2d1272b8SAndroid Build Coastguard Worker } while (num);
63*2d1272b8SAndroid Build Coastguard Worker if (is_negative) buf[i++] = '-';
64*2d1272b8SAndroid Build Coastguard Worker _hb_reverse (buf, i);
65*2d1272b8SAndroid Build Coastguard Worker buf[i] = '\0';
66*2d1272b8SAndroid Build Coastguard Worker return i;
67*2d1272b8SAndroid Build Coastguard Worker }
68*2d1272b8SAndroid Build Coastguard Worker
69*2d1272b8SAndroid Build Coastguard Worker #define ITOA_BUF_SIZE 12 // 10 digits in int32, 1 for negative sign, 1 for \0
70*2d1272b8SAndroid Build Coastguard Worker
71*2d1272b8SAndroid Build Coastguard Worker static void
test_itoa(void)72*2d1272b8SAndroid Build Coastguard Worker test_itoa (void)
73*2d1272b8SAndroid Build Coastguard Worker {
74*2d1272b8SAndroid Build Coastguard Worker char s[] = "12345";
75*2d1272b8SAndroid Build Coastguard Worker _hb_reverse (s, 5);
76*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (s, 5, "54321", 5);
77*2d1272b8SAndroid Build Coastguard Worker
78*2d1272b8SAndroid Build Coastguard Worker {
79*2d1272b8SAndroid Build Coastguard Worker unsigned num = 12345;
80*2d1272b8SAndroid Build Coastguard Worker char buf[ITOA_BUF_SIZE];
81*2d1272b8SAndroid Build Coastguard Worker unsigned len = _hb_itoa (num, buf);
82*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (buf, len, "12345", 5);
83*2d1272b8SAndroid Build Coastguard Worker }
84*2d1272b8SAndroid Build Coastguard Worker
85*2d1272b8SAndroid Build Coastguard Worker {
86*2d1272b8SAndroid Build Coastguard Worker unsigned num = 3152;
87*2d1272b8SAndroid Build Coastguard Worker char buf[ITOA_BUF_SIZE];
88*2d1272b8SAndroid Build Coastguard Worker unsigned len = _hb_itoa (num, buf);
89*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (buf, len, "3152", 4);
90*2d1272b8SAndroid Build Coastguard Worker }
91*2d1272b8SAndroid Build Coastguard Worker
92*2d1272b8SAndroid Build Coastguard Worker {
93*2d1272b8SAndroid Build Coastguard Worker int num = -6457;
94*2d1272b8SAndroid Build Coastguard Worker char buf[ITOA_BUF_SIZE];
95*2d1272b8SAndroid Build Coastguard Worker unsigned len = _hb_itoa (num, buf);
96*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (buf, len, "-6457", 5);
97*2d1272b8SAndroid Build Coastguard Worker }
98*2d1272b8SAndroid Build Coastguard Worker }
99*2d1272b8SAndroid Build Coastguard Worker
100*2d1272b8SAndroid Build Coastguard Worker static void
move_to(HB_UNUSED hb_draw_funcs_t * dfuncs,draw_data_t * draw_data,HB_UNUSED hb_draw_state_t * st,HB_UNUSED float to_x,HB_UNUSED float to_y,HB_UNUSED void * user_data)101*2d1272b8SAndroid Build Coastguard Worker move_to (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
102*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED hb_draw_state_t *st,
103*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED float to_x, HB_UNUSED float to_y,
104*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED void *user_data)
105*2d1272b8SAndroid Build Coastguard Worker {
106*2d1272b8SAndroid Build Coastguard Worker draw_data->move_to_count++;
107*2d1272b8SAndroid Build Coastguard Worker }
108*2d1272b8SAndroid Build Coastguard Worker
109*2d1272b8SAndroid Build Coastguard Worker static void
line_to(HB_UNUSED hb_draw_funcs_t * dfuncs,draw_data_t * draw_data,HB_UNUSED hb_draw_state_t * st,HB_UNUSED float to_x,HB_UNUSED float to_y,HB_UNUSED void * user_data)110*2d1272b8SAndroid Build Coastguard Worker line_to (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
111*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED hb_draw_state_t *st,
112*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED float to_x, HB_UNUSED float to_y,
113*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED void *user_data)
114*2d1272b8SAndroid Build Coastguard Worker {
115*2d1272b8SAndroid Build Coastguard Worker draw_data->line_to_count++;
116*2d1272b8SAndroid Build Coastguard Worker }
117*2d1272b8SAndroid Build Coastguard Worker
118*2d1272b8SAndroid Build Coastguard Worker static void
quadratic_to(HB_UNUSED hb_draw_funcs_t * dfuncs,draw_data_t * draw_data,HB_UNUSED hb_draw_state_t * st,HB_UNUSED float control_x,HB_UNUSED float control_y,HB_UNUSED float to_x,HB_UNUSED float to_y,HB_UNUSED void * user_data)119*2d1272b8SAndroid Build Coastguard Worker quadratic_to (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
120*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED hb_draw_state_t *st,
121*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED float control_x, HB_UNUSED float control_y,
122*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED float to_x, HB_UNUSED float to_y,
123*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED void *user_data)
124*2d1272b8SAndroid Build Coastguard Worker {
125*2d1272b8SAndroid Build Coastguard Worker draw_data->quad_to_count++;
126*2d1272b8SAndroid Build Coastguard Worker }
127*2d1272b8SAndroid Build Coastguard Worker
128*2d1272b8SAndroid Build Coastguard Worker static void
cubic_to(HB_UNUSED hb_draw_funcs_t * dfuncs,draw_data_t * draw_data,HB_UNUSED hb_draw_state_t * st,HB_UNUSED float control1_x,HB_UNUSED float control1_y,HB_UNUSED float control2_x,HB_UNUSED float control2_y,HB_UNUSED float to_x,HB_UNUSED float to_y,HB_UNUSED void * user_data)129*2d1272b8SAndroid Build Coastguard Worker cubic_to (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
130*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED hb_draw_state_t *st,
131*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED float control1_x, HB_UNUSED float control1_y,
132*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED float control2_x, HB_UNUSED float control2_y,
133*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED float to_x, HB_UNUSED float to_y,
134*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED void *user_data)
135*2d1272b8SAndroid Build Coastguard Worker {
136*2d1272b8SAndroid Build Coastguard Worker draw_data->cubic_to_count++;
137*2d1272b8SAndroid Build Coastguard Worker }
138*2d1272b8SAndroid Build Coastguard Worker
139*2d1272b8SAndroid Build Coastguard Worker static void
close_path(HB_UNUSED hb_draw_funcs_t * dfuncs,draw_data_t * draw_data,HB_UNUSED hb_draw_state_t * st,HB_UNUSED void * user_data)140*2d1272b8SAndroid Build Coastguard Worker close_path (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
141*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED hb_draw_state_t *st,
142*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED void *user_data)
143*2d1272b8SAndroid Build Coastguard Worker {
144*2d1272b8SAndroid Build Coastguard Worker draw_data->close_path_count++;
145*2d1272b8SAndroid Build Coastguard Worker }
146*2d1272b8SAndroid Build Coastguard Worker
147*2d1272b8SAndroid Build Coastguard Worker static hb_draw_funcs_t *funcs;
148*2d1272b8SAndroid Build Coastguard Worker
149*2d1272b8SAndroid Build Coastguard Worker #ifdef HB_EXPERIMENTAL_API
150*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_varc_simple_hangul(void)151*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_varc_simple_hangul (void)
152*2d1272b8SAndroid Build Coastguard Worker {
153*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/varc-ac00-ac01.ttf");
154*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
155*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
156*2d1272b8SAndroid Build Coastguard Worker
157*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data0 = {0};
158*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data;;
159*2d1272b8SAndroid Build Coastguard Worker unsigned gid = 0;
160*2d1272b8SAndroid Build Coastguard Worker
161*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyph (font, 0xAC00u, &gid);
162*2d1272b8SAndroid Build Coastguard Worker draw_data = draw_data0;
163*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, gid, funcs, &draw_data);
164*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (draw_data.move_to_count, ==, 3);
165*2d1272b8SAndroid Build Coastguard Worker
166*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyph (font, 0xAC01u, &gid);
167*2d1272b8SAndroid Build Coastguard Worker draw_data = draw_data0;
168*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, gid, funcs, &draw_data);
169*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (draw_data.move_to_count, ==, 4);
170*2d1272b8SAndroid Build Coastguard Worker
171*2d1272b8SAndroid Build Coastguard Worker hb_variation_t var;
172*2d1272b8SAndroid Build Coastguard Worker var.tag = HB_TAG ('w','g','h','t');
173*2d1272b8SAndroid Build Coastguard Worker var.value = 800;
174*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (font, &var, 1);
175*2d1272b8SAndroid Build Coastguard Worker
176*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyph (font, 0xAC00u, &gid);
177*2d1272b8SAndroid Build Coastguard Worker draw_data = draw_data0;
178*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, gid, funcs, &draw_data);
179*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (draw_data.move_to_count, ==, 3);
180*2d1272b8SAndroid Build Coastguard Worker
181*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyph (font, 0xAC01u, &gid);
182*2d1272b8SAndroid Build Coastguard Worker draw_data = draw_data0;
183*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, gid, funcs, &draw_data);
184*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (draw_data.move_to_count, ==, 4);
185*2d1272b8SAndroid Build Coastguard Worker
186*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
187*2d1272b8SAndroid Build Coastguard Worker }
188*2d1272b8SAndroid Build Coastguard Worker
189*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_varc_simple_hanzi(void)190*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_varc_simple_hanzi (void)
191*2d1272b8SAndroid Build Coastguard Worker {
192*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/varc-6868.ttf");
193*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
194*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
195*2d1272b8SAndroid Build Coastguard Worker
196*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data0 = {0};
197*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data;;
198*2d1272b8SAndroid Build Coastguard Worker unsigned gid = 0;
199*2d1272b8SAndroid Build Coastguard Worker
200*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyph (font, 0x6868u, &gid);
201*2d1272b8SAndroid Build Coastguard Worker draw_data = draw_data0;
202*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, gid, funcs, &draw_data);
203*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (draw_data.move_to_count, ==, 11);
204*2d1272b8SAndroid Build Coastguard Worker
205*2d1272b8SAndroid Build Coastguard Worker hb_variation_t var;
206*2d1272b8SAndroid Build Coastguard Worker var.tag = HB_TAG ('w','g','h','t');
207*2d1272b8SAndroid Build Coastguard Worker var.value = 800;
208*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (font, &var, 1);
209*2d1272b8SAndroid Build Coastguard Worker
210*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyph (font, 0x6868u, &gid);
211*2d1272b8SAndroid Build Coastguard Worker draw_data = draw_data0;
212*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, gid, funcs, &draw_data);
213*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (draw_data.move_to_count, ==, 11);
214*2d1272b8SAndroid Build Coastguard Worker
215*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
216*2d1272b8SAndroid Build Coastguard Worker }
217*2d1272b8SAndroid Build Coastguard Worker
218*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_varc_conditional(void)219*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_varc_conditional (void)
220*2d1272b8SAndroid Build Coastguard Worker {
221*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/varc-ac01-conditional.ttf");
222*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
223*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
224*2d1272b8SAndroid Build Coastguard Worker
225*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data0 = {0};
226*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data;;
227*2d1272b8SAndroid Build Coastguard Worker unsigned gid = 0;
228*2d1272b8SAndroid Build Coastguard Worker
229*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyph (font, 0xAC01u, &gid);
230*2d1272b8SAndroid Build Coastguard Worker draw_data = draw_data0;
231*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, gid, funcs, &draw_data);
232*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (draw_data.move_to_count, ==, 2);
233*2d1272b8SAndroid Build Coastguard Worker
234*2d1272b8SAndroid Build Coastguard Worker hb_variation_t var;
235*2d1272b8SAndroid Build Coastguard Worker var.tag = HB_TAG ('w','g','h','t');
236*2d1272b8SAndroid Build Coastguard Worker var.value = 800;
237*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (font, &var, 1);
238*2d1272b8SAndroid Build Coastguard Worker
239*2d1272b8SAndroid Build Coastguard Worker hb_font_get_nominal_glyph (font, 0xAC01u, &gid);
240*2d1272b8SAndroid Build Coastguard Worker draw_data = draw_data0;
241*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, gid, funcs, &draw_data);
242*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpuint (draw_data.move_to_count, ==, 4);
243*2d1272b8SAndroid Build Coastguard Worker
244*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
245*2d1272b8SAndroid Build Coastguard Worker }
246*2d1272b8SAndroid Build Coastguard Worker #endif
247*2d1272b8SAndroid Build Coastguard Worker
248*2d1272b8SAndroid Build Coastguard Worker int
main(int argc,char ** argv)249*2d1272b8SAndroid Build Coastguard Worker main (int argc, char **argv)
250*2d1272b8SAndroid Build Coastguard Worker {
251*2d1272b8SAndroid Build Coastguard Worker funcs = hb_draw_funcs_create ();
252*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_move_to_func (funcs, (hb_draw_move_to_func_t) move_to, NULL, NULL);
253*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_line_to_func (funcs, (hb_draw_line_to_func_t) line_to, NULL, NULL);
254*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_quadratic_to_func (funcs, (hb_draw_quadratic_to_func_t) quadratic_to, NULL, NULL);
255*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_cubic_to_func (funcs, (hb_draw_cubic_to_func_t) cubic_to, NULL, NULL);
256*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_close_path_func (funcs, (hb_draw_close_path_func_t) close_path, NULL, NULL);
257*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_make_immutable (funcs);
258*2d1272b8SAndroid Build Coastguard Worker
259*2d1272b8SAndroid Build Coastguard Worker hb_test_init (&argc, &argv);
260*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_itoa);
261*2d1272b8SAndroid Build Coastguard Worker #ifdef HB_EXPERIMENTAL_API
262*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_varc_simple_hangul);
263*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_varc_simple_hanzi);
264*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_varc_conditional);
265*2d1272b8SAndroid Build Coastguard Worker #endif
266*2d1272b8SAndroid Build Coastguard Worker unsigned result = hb_test_run ();
267*2d1272b8SAndroid Build Coastguard Worker
268*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_destroy (funcs);
269*2d1272b8SAndroid Build Coastguard Worker return result;
270*2d1272b8SAndroid Build Coastguard Worker }
271