1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2020 Ebrahim Byagowi
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 #ifdef HAVE_FREETYPE
30*2d1272b8SAndroid Build Coastguard Worker #include <hb-ft.h>
31*2d1272b8SAndroid Build Coastguard Worker #endif
32*2d1272b8SAndroid Build Coastguard Worker
33*2d1272b8SAndroid Build Coastguard Worker typedef struct draw_data_t
34*2d1272b8SAndroid Build Coastguard Worker {
35*2d1272b8SAndroid Build Coastguard Worker char *str;
36*2d1272b8SAndroid Build Coastguard Worker unsigned size;
37*2d1272b8SAndroid Build Coastguard Worker unsigned consumed;
38*2d1272b8SAndroid Build Coastguard Worker } draw_data_t;
39*2d1272b8SAndroid Build Coastguard Worker
40*2d1272b8SAndroid Build Coastguard Worker /* Our modified itoa, why not using libc's? it is going to be used
41*2d1272b8SAndroid Build Coastguard Worker in harfbuzzjs where libc isn't available */
_hb_reverse(char * buf,unsigned int len)42*2d1272b8SAndroid Build Coastguard Worker static void _hb_reverse (char *buf, unsigned int len)
43*2d1272b8SAndroid Build Coastguard Worker {
44*2d1272b8SAndroid Build Coastguard Worker unsigned start = 0, end = len - 1;
45*2d1272b8SAndroid Build Coastguard Worker while (start < end)
46*2d1272b8SAndroid Build Coastguard Worker {
47*2d1272b8SAndroid Build Coastguard Worker char c = buf[end];
48*2d1272b8SAndroid Build Coastguard Worker buf[end] = buf[start];
49*2d1272b8SAndroid Build Coastguard Worker buf[start] = c;
50*2d1272b8SAndroid Build Coastguard Worker start++; end--;
51*2d1272b8SAndroid Build Coastguard Worker }
52*2d1272b8SAndroid Build Coastguard Worker }
_hb_itoa(float fnum,char * buf)53*2d1272b8SAndroid Build Coastguard Worker static unsigned _hb_itoa (float fnum, char *buf)
54*2d1272b8SAndroid Build Coastguard Worker {
55*2d1272b8SAndroid Build Coastguard Worker int32_t num = (int32_t) floorf (fnum + .5f);
56*2d1272b8SAndroid Build Coastguard Worker unsigned int i = 0;
57*2d1272b8SAndroid Build Coastguard Worker hb_bool_t is_negative = num < 0;
58*2d1272b8SAndroid Build Coastguard Worker if (is_negative) num = -num;
59*2d1272b8SAndroid Build Coastguard Worker do
60*2d1272b8SAndroid Build Coastguard Worker {
61*2d1272b8SAndroid Build Coastguard Worker buf[i++] = '0' + num % 10;
62*2d1272b8SAndroid Build Coastguard Worker num /= 10;
63*2d1272b8SAndroid Build Coastguard Worker } while (num);
64*2d1272b8SAndroid Build Coastguard Worker if (is_negative) buf[i++] = '-';
65*2d1272b8SAndroid Build Coastguard Worker _hb_reverse (buf, i);
66*2d1272b8SAndroid Build Coastguard Worker buf[i] = '\0';
67*2d1272b8SAndroid Build Coastguard Worker return i;
68*2d1272b8SAndroid Build Coastguard Worker }
69*2d1272b8SAndroid Build Coastguard Worker
70*2d1272b8SAndroid Build Coastguard Worker #define ITOA_BUF_SIZE 12 // 10 digits in int32, 1 for negative sign, 1 for \0
71*2d1272b8SAndroid Build Coastguard Worker
72*2d1272b8SAndroid Build Coastguard Worker static void
test_itoa(void)73*2d1272b8SAndroid Build Coastguard Worker test_itoa (void)
74*2d1272b8SAndroid Build Coastguard Worker {
75*2d1272b8SAndroid Build Coastguard Worker char s[] = "12345";
76*2d1272b8SAndroid Build Coastguard Worker _hb_reverse (s, 5);
77*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (s, 5, "54321", 5);
78*2d1272b8SAndroid Build Coastguard Worker
79*2d1272b8SAndroid Build Coastguard Worker {
80*2d1272b8SAndroid Build Coastguard Worker unsigned num = 12345;
81*2d1272b8SAndroid Build Coastguard Worker char buf[ITOA_BUF_SIZE];
82*2d1272b8SAndroid Build Coastguard Worker unsigned len = _hb_itoa (num, buf);
83*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (buf, len, "12345", 5);
84*2d1272b8SAndroid Build Coastguard Worker }
85*2d1272b8SAndroid Build Coastguard Worker
86*2d1272b8SAndroid Build Coastguard Worker {
87*2d1272b8SAndroid Build Coastguard Worker unsigned num = 3152;
88*2d1272b8SAndroid Build Coastguard Worker char buf[ITOA_BUF_SIZE];
89*2d1272b8SAndroid Build Coastguard Worker unsigned len = _hb_itoa (num, buf);
90*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (buf, len, "3152", 4);
91*2d1272b8SAndroid Build Coastguard Worker }
92*2d1272b8SAndroid Build Coastguard Worker
93*2d1272b8SAndroid Build Coastguard Worker {
94*2d1272b8SAndroid Build Coastguard Worker int num = -6457;
95*2d1272b8SAndroid Build Coastguard Worker char buf[ITOA_BUF_SIZE];
96*2d1272b8SAndroid Build Coastguard Worker unsigned len = _hb_itoa (num, buf);
97*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (buf, len, "-6457", 5);
98*2d1272b8SAndroid Build Coastguard Worker }
99*2d1272b8SAndroid Build Coastguard Worker }
100*2d1272b8SAndroid Build Coastguard Worker
101*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,float to_x,float to_y,HB_UNUSED void * user_data)102*2d1272b8SAndroid Build Coastguard Worker move_to (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
103*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED hb_draw_state_t *st,
104*2d1272b8SAndroid Build Coastguard Worker float to_x, float to_y,
105*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED void *user_data)
106*2d1272b8SAndroid Build Coastguard Worker {
107*2d1272b8SAndroid Build Coastguard Worker /* 4 = command character space + comma + array starts with 0 index + nul character space */
108*2d1272b8SAndroid Build Coastguard Worker if (draw_data->consumed + 2 * ITOA_BUF_SIZE + 4 > draw_data->size) return;
109*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = 'M';
110*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (to_x, draw_data->str + draw_data->consumed);
111*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = ',';
112*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (to_y, draw_data->str + draw_data->consumed);
113*2d1272b8SAndroid Build Coastguard Worker }
114*2d1272b8SAndroid Build Coastguard Worker
115*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,float to_x,float to_y,HB_UNUSED void * user_data)116*2d1272b8SAndroid Build Coastguard Worker line_to (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
117*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED hb_draw_state_t *st,
118*2d1272b8SAndroid Build Coastguard Worker float to_x, float to_y,
119*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED void *user_data)
120*2d1272b8SAndroid Build Coastguard Worker {
121*2d1272b8SAndroid Build Coastguard Worker if (draw_data->consumed + 2 * ITOA_BUF_SIZE + 4 > draw_data->size) return;
122*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = 'L';
123*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (to_x, draw_data->str + draw_data->consumed);
124*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = ',';
125*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (to_y, draw_data->str + draw_data->consumed);
126*2d1272b8SAndroid Build Coastguard Worker }
127*2d1272b8SAndroid Build Coastguard Worker
128*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,float control_x,float control_y,float to_x,float to_y,HB_UNUSED void * user_data)129*2d1272b8SAndroid Build Coastguard Worker quadratic_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 float control_x, float control_y,
132*2d1272b8SAndroid Build Coastguard Worker float to_x, float to_y,
133*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED void *user_data)
134*2d1272b8SAndroid Build Coastguard Worker {
135*2d1272b8SAndroid Build Coastguard Worker
136*2d1272b8SAndroid Build Coastguard Worker if (draw_data->consumed + 4 * ITOA_BUF_SIZE + 6 > draw_data->size) return;
137*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = 'Q';
138*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (control_x, draw_data->str + draw_data->consumed);
139*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = ',';
140*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (control_y, draw_data->str + draw_data->consumed);
141*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = ' ';
142*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (to_x, draw_data->str + draw_data->consumed);
143*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = ',';
144*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (to_y, draw_data->str + draw_data->consumed);
145*2d1272b8SAndroid Build Coastguard Worker }
146*2d1272b8SAndroid Build Coastguard Worker
147*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,float control1_x,float control1_y,float control2_x,float control2_y,float to_x,float to_y,HB_UNUSED void * user_data)148*2d1272b8SAndroid Build Coastguard Worker cubic_to (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
149*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED hb_draw_state_t *st,
150*2d1272b8SAndroid Build Coastguard Worker float control1_x, float control1_y,
151*2d1272b8SAndroid Build Coastguard Worker float control2_x, float control2_y,
152*2d1272b8SAndroid Build Coastguard Worker float to_x, float to_y,
153*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED void *user_data)
154*2d1272b8SAndroid Build Coastguard Worker {
155*2d1272b8SAndroid Build Coastguard Worker if (draw_data->consumed + 6 * ITOA_BUF_SIZE + 8 > draw_data->size) return;
156*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = 'C';
157*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (control1_x, draw_data->str + draw_data->consumed);
158*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = ',';
159*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (control1_y, draw_data->str + draw_data->consumed);
160*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = ' ';
161*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (control2_x, draw_data->str + draw_data->consumed);
162*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = ',';
163*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (control2_y, draw_data->str + draw_data->consumed);
164*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = ' ';
165*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (to_x, draw_data->str + draw_data->consumed);
166*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = ',';
167*2d1272b8SAndroid Build Coastguard Worker draw_data->consumed += _hb_itoa (to_y, draw_data->str + draw_data->consumed);
168*2d1272b8SAndroid Build Coastguard Worker }
169*2d1272b8SAndroid Build Coastguard Worker
170*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)171*2d1272b8SAndroid Build Coastguard Worker close_path (HB_UNUSED hb_draw_funcs_t *dfuncs, draw_data_t *draw_data,
172*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED hb_draw_state_t *st,
173*2d1272b8SAndroid Build Coastguard Worker HB_UNUSED void *user_data)
174*2d1272b8SAndroid Build Coastguard Worker {
175*2d1272b8SAndroid Build Coastguard Worker if (draw_data->consumed + 2 > draw_data->size) return;
176*2d1272b8SAndroid Build Coastguard Worker draw_data->str[draw_data->consumed++] = 'Z';
177*2d1272b8SAndroid Build Coastguard Worker }
178*2d1272b8SAndroid Build Coastguard Worker
179*2d1272b8SAndroid Build Coastguard Worker static hb_draw_funcs_t *funcs;
180*2d1272b8SAndroid Build Coastguard Worker static hb_draw_funcs_t *funcs2; /* this one translates quadratic calls to cubic ones */
181*2d1272b8SAndroid Build Coastguard Worker
182*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_empty(void)183*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_empty (void)
184*2d1272b8SAndroid Build Coastguard Worker {
185*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (hb_font_get_empty (), 3, funcs, NULL);
186*2d1272b8SAndroid Build Coastguard Worker }
187*2d1272b8SAndroid Build Coastguard Worker
188*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_glyf(void)189*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_glyf (void)
190*2d1272b8SAndroid Build Coastguard Worker {
191*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/SourceSerifVariable-Roman-VVAR.abc.ttf");
192*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
193*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
194*2d1272b8SAndroid Build Coastguard Worker
195*2d1272b8SAndroid Build Coastguard Worker char str[1024];
196*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
197*2d1272b8SAndroid Build Coastguard Worker .str = str,
198*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str),
199*2d1272b8SAndroid Build Coastguard Worker .consumed = 0
200*2d1272b8SAndroid Build Coastguard Worker };
201*2d1272b8SAndroid Build Coastguard Worker
202*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
203*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 4, funcs, &draw_data);
204*2d1272b8SAndroid Build Coastguard Worker
205*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
206*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 3, funcs, &draw_data);
207*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M275,442Q232,442 198,420Q164,397 145,353Q126,309 126,245"
208*2d1272b8SAndroid Build Coastguard Worker "Q126,182 147,139Q167,95 204,73Q240,50 287,50Q330,50 367,70"
209*2d1272b8SAndroid Build Coastguard Worker "Q404,90 427,128L451,116Q431,54 384,21Q336,-13 266,-13"
210*2d1272b8SAndroid Build Coastguard Worker "Q198,-13 148,18Q97,48 70,104Q43,160 43,236Q43,314 76,371"
211*2d1272b8SAndroid Build Coastguard Worker "Q108,427 160,457Q212,487 272,487Q316,487 354,470Q392,453 417,424"
212*2d1272b8SAndroid Build Coastguard Worker "Q442,395 448,358Q441,321 403,321Q378,321 367,334"
213*2d1272b8SAndroid Build Coastguard Worker "Q355,347 350,366L325,454L371,417Q346,430 321,436Q296,442 275,442Z";
214*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
215*2d1272b8SAndroid Build Coastguard Worker
216*2d1272b8SAndroid Build Coastguard Worker /* Test translating quadratic calls to cubic by a _draw_funcs_t that doesn't set the callback */
217*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
218*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 3, funcs2, &draw_data);
219*2d1272b8SAndroid Build Coastguard Worker char expected2[] = "M275,442C246,442 221,435 198,420C175,405 158,382 145,353"
220*2d1272b8SAndroid Build Coastguard Worker "C132,324 126,288 126,245C126,203 133,168 147,139C160,110 179,88 204,73"
221*2d1272b8SAndroid Build Coastguard Worker "C228,58 256,50 287,50C316,50 342,57 367,70C392,83 412,103 427,128"
222*2d1272b8SAndroid Build Coastguard Worker "L451,116C438,75 415,43 384,21C352,-2 313,-13 266,-13C221,-13 181,-3 148,18"
223*2d1272b8SAndroid Build Coastguard Worker "C114,38 88,67 70,104C52,141 43,185 43,236C43,288 54,333 76,371"
224*2d1272b8SAndroid Build Coastguard Worker "C97,408 125,437 160,457C195,477 232,487 272,487C301,487 329,481 354,470"
225*2d1272b8SAndroid Build Coastguard Worker "C379,459 400,443 417,424C434,405 444,383 448,358C443,333 428,321 403,321"
226*2d1272b8SAndroid Build Coastguard Worker "C386,321 374,325 367,334C359,343 353,353 350,366L325,454L371,417"
227*2d1272b8SAndroid Build Coastguard Worker "C354,426 338,432 321,436C304,440 289,442 275,442Z";
228*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);
229*2d1272b8SAndroid Build Coastguard Worker
230*2d1272b8SAndroid Build Coastguard Worker hb_variation_t var;
231*2d1272b8SAndroid Build Coastguard Worker var.tag = HB_TAG ('w','g','h','t');
232*2d1272b8SAndroid Build Coastguard Worker var.value = 800;
233*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (font, &var, 1);
234*2d1272b8SAndroid Build Coastguard Worker
235*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
236*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 3, funcs, &draw_data);
237*2d1272b8SAndroid Build Coastguard Worker char expected3[] = "M323,448Q297,448 271,430Q244,412 226,371Q209,330 209,261"
238*2d1272b8SAndroid Build Coastguard Worker "Q209,204 225,166Q242,127 272,107Q303,86 344,86Q378,86 404,101"
239*2d1272b8SAndroid Build Coastguard Worker "Q430,115 451,137L488,103Q458,42 404,13Q350,-16 279,-16"
240*2d1272b8SAndroid Build Coastguard Worker "Q211,-16 153,13Q95,41 60,98Q25,156 25,241Q25,323 62,382"
241*2d1272b8SAndroid Build Coastguard Worker "Q99,440 163,470Q226,501 303,501Q357,501 399,480Q440,460 464,426"
242*2d1272b8SAndroid Build Coastguard Worker "Q488,392 492,352Q475,297 420,297Q390,297 366,319Q342,342 339,401"
243*2d1272b8SAndroid Build Coastguard Worker "L333,469L411,427Q387,438 367,443Q348,448 323,448Z";
244*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected3, sizeof (expected3) - 1);
245*2d1272b8SAndroid Build Coastguard Worker
246*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
247*2d1272b8SAndroid Build Coastguard Worker }
248*2d1272b8SAndroid Build Coastguard Worker
249*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_cff1(void)250*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_cff1 (void)
251*2d1272b8SAndroid Build Coastguard Worker {
252*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/cff1_seac.otf");
253*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
254*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
255*2d1272b8SAndroid Build Coastguard Worker
256*2d1272b8SAndroid Build Coastguard Worker char str[1024];
257*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
258*2d1272b8SAndroid Build Coastguard Worker .str = str,
259*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str),
260*2d1272b8SAndroid Build Coastguard Worker .consumed = 0
261*2d1272b8SAndroid Build Coastguard Worker };
262*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 3, funcs, &draw_data);
263*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M203,367C227,440 248,512 268,588L272,588C293,512 314,440 338,367L369,267L172,267L203,367Z"
264*2d1272b8SAndroid Build Coastguard Worker "M3,0L88,0L151,200L390,200L452,0L541,0L319,656L225,656L3,0Z"
265*2d1272b8SAndroid Build Coastguard Worker "M300,653L342,694L201,861L143,806L300,653Z";
266*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
267*2d1272b8SAndroid Build Coastguard Worker
268*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
269*2d1272b8SAndroid Build Coastguard Worker }
270*2d1272b8SAndroid Build Coastguard Worker
271*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_cff1_rline(void)272*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_cff1_rline (void)
273*2d1272b8SAndroid Build Coastguard Worker {
274*2d1272b8SAndroid Build Coastguard Worker /* https://github.com/harfbuzz/harfbuzz/pull/2053 */
275*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/RanaKufi-Regular.subset.otf");
276*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
277*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
278*2d1272b8SAndroid Build Coastguard Worker
279*2d1272b8SAndroid Build Coastguard Worker char str[1024];
280*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
281*2d1272b8SAndroid Build Coastguard Worker .str = str,
282*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str),
283*2d1272b8SAndroid Build Coastguard Worker .consumed = 0
284*2d1272b8SAndroid Build Coastguard Worker };
285*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 1, funcs, &draw_data);
286*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M775,400C705,400 650,343 650,274L650,250L391,250L713,572L392,893"
287*2d1272b8SAndroid Build Coastguard Worker "L287,1000C311,942 296,869 250,823C250,823 286,858 321,823L571,572"
288*2d1272b8SAndroid Build Coastguard Worker "L150,150L750,150L750,276C750,289 761,300 775,300C789,300 800,289 800,276"
289*2d1272b8SAndroid Build Coastguard Worker "L800,100L150,100C100,100 100,150 100,150C100,85 58,23 0,0L900,0L900,274"
290*2d1272b8SAndroid Build Coastguard Worker "C900,343 844,400 775,400Z";
291*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
292*2d1272b8SAndroid Build Coastguard Worker
293*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
294*2d1272b8SAndroid Build Coastguard Worker }
295*2d1272b8SAndroid Build Coastguard Worker
296*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_cff2(void)297*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_cff2 (void)
298*2d1272b8SAndroid Build Coastguard Worker {
299*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/AdobeVFPrototype.abc.otf");
300*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
301*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
302*2d1272b8SAndroid Build Coastguard Worker
303*2d1272b8SAndroid Build Coastguard Worker char str[1024];
304*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
305*2d1272b8SAndroid Build Coastguard Worker .str = str,
306*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str)
307*2d1272b8SAndroid Build Coastguard Worker };
308*2d1272b8SAndroid Build Coastguard Worker
309*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
310*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 3, funcs, &draw_data);
311*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M275,442C303,442 337,435 371,417L325,454L350,366"
312*2d1272b8SAndroid Build Coastguard Worker "C357,341 370,321 403,321C428,321 443,333 448,358"
313*2d1272b8SAndroid Build Coastguard Worker "C435,432 361,487 272,487C153,487 43,393 43,236"
314*2d1272b8SAndroid Build Coastguard Worker "C43,83 129,-13 266,-13C360,-13 424,33 451,116L427,128"
315*2d1272b8SAndroid Build Coastguard Worker "C396,78 345,50 287,50C193,50 126,119 126,245C126,373 188,442 275,442Z";
316*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
317*2d1272b8SAndroid Build Coastguard Worker
318*2d1272b8SAndroid Build Coastguard Worker hb_variation_t var;
319*2d1272b8SAndroid Build Coastguard Worker var.tag = HB_TAG ('w','g','h','t');
320*2d1272b8SAndroid Build Coastguard Worker var.value = 800;
321*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (font, &var, 1);
322*2d1272b8SAndroid Build Coastguard Worker
323*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
324*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 3, funcs, &draw_data);
325*2d1272b8SAndroid Build Coastguard Worker char expected2[] = "M323,448C356,448 380,441 411,427L333,469L339,401"
326*2d1272b8SAndroid Build Coastguard Worker "C343,322 379,297 420,297C458,297 480,314 492,352"
327*2d1272b8SAndroid Build Coastguard Worker "C486,433 412,501 303,501C148,501 25,406 25,241"
328*2d1272b8SAndroid Build Coastguard Worker "C25,70 143,-16 279,-16C374,-16 447,22 488,103L451,137"
329*2d1272b8SAndroid Build Coastguard Worker "C423,107 390,86 344,86C262,86 209,148 209,261C209,398 271,448 323,448Z";
330*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);
331*2d1272b8SAndroid Build Coastguard Worker
332*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
333*2d1272b8SAndroid Build Coastguard Worker }
334*2d1272b8SAndroid Build Coastguard Worker
335*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_ttf_parser_tests(void)336*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_ttf_parser_tests (void)
337*2d1272b8SAndroid Build Coastguard Worker {
338*2d1272b8SAndroid Build Coastguard Worker /* https://github.com/RazrFalcon/ttf-parser/blob/337e7d1c/tests/tests.rs#L50-L133 */
339*2d1272b8SAndroid Build Coastguard Worker char str[1024];
340*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
341*2d1272b8SAndroid Build Coastguard Worker .str = str,
342*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str)
343*2d1272b8SAndroid Build Coastguard Worker };
344*2d1272b8SAndroid Build Coastguard Worker {
345*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/glyphs.ttf");
346*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
347*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
348*2d1272b8SAndroid Build Coastguard Worker {
349*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
350*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 0, funcs, &draw_data);
351*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M50,0L50,750L450,750L450,0L50,0Z";
352*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
353*2d1272b8SAndroid Build Coastguard Worker }
354*2d1272b8SAndroid Build Coastguard Worker {
355*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
356*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 1, funcs, &draw_data);
357*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M56,416L56,487L514,487L514,416L56,416ZM56,217L56,288L514,288L514,217L56,217Z";
358*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
359*2d1272b8SAndroid Build Coastguard Worker }
360*2d1272b8SAndroid Build Coastguard Worker {
361*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
362*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 4, funcs, &draw_data);
363*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M332,468L197,468L197,0L109,0L109,468L15,468L15,509L109,539"
364*2d1272b8SAndroid Build Coastguard Worker "L109,570Q109,674 155,720Q201,765 283,765Q315,765 342,760"
365*2d1272b8SAndroid Build Coastguard Worker "Q368,754 387,747L364,678Q348,683 327,688Q306,693 284,693"
366*2d1272b8SAndroid Build Coastguard Worker "Q240,693 219,664Q197,634 197,571L197,536L332,536L332,468Z"
367*2d1272b8SAndroid Build Coastguard Worker "M474,737Q494,737 510,724Q525,710 525,681Q525,653 510,639"
368*2d1272b8SAndroid Build Coastguard Worker "Q494,625 474,625Q452,625 437,639Q422,653 422,681"
369*2d1272b8SAndroid Build Coastguard Worker "Q422,710 437,724Q452,737 474,737ZM517,536L517,0L429,0L429,536L517,536Z";
370*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
371*2d1272b8SAndroid Build Coastguard Worker }
372*2d1272b8SAndroid Build Coastguard Worker {
373*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
374*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 5, funcs, &draw_data);
375*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M15,0Q15,0 15,0Z";
376*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
377*2d1272b8SAndroid Build Coastguard Worker }
378*2d1272b8SAndroid Build Coastguard Worker {
379*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
380*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 6, funcs, &draw_data);
381*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M346,468L211,468L211,0L123,0L123,468L29,468L29,509L123,539"
382*2d1272b8SAndroid Build Coastguard Worker "L123,570Q123,674 169,720Q215,765 297,765Q329,765 356,760"
383*2d1272b8SAndroid Build Coastguard Worker "Q382,754 401,747L378,678Q362,683 341,688Q320,693 298,693"
384*2d1272b8SAndroid Build Coastguard Worker "Q254,693 233,664Q211,634 211,571L211,536L346,536L346,468Z"
385*2d1272b8SAndroid Build Coastguard Worker "M15,0Q15,0 15,0Z";
386*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
387*2d1272b8SAndroid Build Coastguard Worker }
388*2d1272b8SAndroid Build Coastguard Worker
389*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
390*2d1272b8SAndroid Build Coastguard Worker }
391*2d1272b8SAndroid Build Coastguard Worker {
392*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/cff1_flex.otf");
393*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
394*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
395*2d1272b8SAndroid Build Coastguard Worker
396*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
397*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 1, funcs, &draw_data);
398*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M0,0C100,0 150,-20 250,-20C350,-20 400,0 500,0C500,100 520,150 520,250"
399*2d1272b8SAndroid Build Coastguard Worker "C520,350 500,400 500,500C400,500 350,520 250,520C150,520 100,500 0,500"
400*2d1272b8SAndroid Build Coastguard Worker "C0,400 -20,350 -20,250C-20,150 0,100 0,0ZM50,50C50,130 34,170 34,250"
401*2d1272b8SAndroid Build Coastguard Worker "C34,330 50,370 50,450C130,450 170,466 250,466C330,466 370,450 450,450"
402*2d1272b8SAndroid Build Coastguard Worker "C450,370 466,330 466,250C466,170 450,130 450,50C370,50 330,34 250,34"
403*2d1272b8SAndroid Build Coastguard Worker "C170,34 130,50 50,50Z";
404*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
405*2d1272b8SAndroid Build Coastguard Worker
406*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
407*2d1272b8SAndroid Build Coastguard Worker }
408*2d1272b8SAndroid Build Coastguard Worker {
409*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/cff1_dotsect.nohints.otf");
410*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
411*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
412*2d1272b8SAndroid Build Coastguard Worker
413*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
414*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 1, funcs, &draw_data);
415*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M82,0L164,0L164,486L82,486L82,0Z"
416*2d1272b8SAndroid Build Coastguard Worker "M124,586C156,586 181,608 181,639C181,671 156,692 124,692"
417*2d1272b8SAndroid Build Coastguard Worker "C92,692 67,671 67,639C67,608 92,586 124,586Z";
418*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
419*2d1272b8SAndroid Build Coastguard Worker
420*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
421*2d1272b8SAndroid Build Coastguard Worker }
422*2d1272b8SAndroid Build Coastguard Worker }
423*2d1272b8SAndroid Build Coastguard Worker
424*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_font_kit_glyphs_tests(void)425*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_font_kit_glyphs_tests (void)
426*2d1272b8SAndroid Build Coastguard Worker {
427*2d1272b8SAndroid Build Coastguard Worker /* https://github.com/foliojs/fontkit/blob/master/test/glyphs.js */
428*2d1272b8SAndroid Build Coastguard Worker char str[2048];
429*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
430*2d1272b8SAndroid Build Coastguard Worker .str = str,
431*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str)
432*2d1272b8SAndroid Build Coastguard Worker };
433*2d1272b8SAndroid Build Coastguard Worker /* truetype glyphs */
434*2d1272b8SAndroid Build Coastguard Worker {
435*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/OpenSans-Regular.ttf");
436*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
437*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
438*2d1272b8SAndroid Build Coastguard Worker
439*2d1272b8SAndroid Build Coastguard Worker /* should get a path for the glyph */
440*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
441*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 37, funcs, &draw_data);
442*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M201,1462L614,1462Q905,1462 1035,1375Q1165,1288 1165,1100"
443*2d1272b8SAndroid Build Coastguard Worker "Q1165,970 1093,886Q1020,801 881,776L881,766Q1214,709 1214,416"
444*2d1272b8SAndroid Build Coastguard Worker "Q1214,220 1082,110Q949,0 711,0L201,0L201,1462ZM371,836L651,836"
445*2d1272b8SAndroid Build Coastguard Worker "Q831,836 910,893Q989,949 989,1083Q989,1206 901,1261"
446*2d1272b8SAndroid Build Coastguard Worker "Q813,1315 621,1315L371,1315L371,836ZM371,692L371,145L676,145"
447*2d1272b8SAndroid Build Coastguard Worker "Q853,145 943,214Q1032,282 1032,428Q1032,564 941,628Q849,692 662,692L371,692Z";
448*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
449*2d1272b8SAndroid Build Coastguard Worker
450*2d1272b8SAndroid Build Coastguard Worker /* should get a path for the glyph */
451*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
452*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 171, funcs, &draw_data);
453*2d1272b8SAndroid Build Coastguard Worker char expected2[] = "M639,-20Q396,-20 256,128Q115,276 115,539Q115,804 246,960Q376,1116 596,1116"
454*2d1272b8SAndroid Build Coastguard Worker "Q802,1116 922,981Q1042,845 1042,623L1042,518L287,518Q292,325 385,225"
455*2d1272b8SAndroid Build Coastguard Worker "Q477,125 645,125Q822,125 995,199L995,51Q907,13 829,-3Q750,-20 639,-20Z"
456*2d1272b8SAndroid Build Coastguard Worker "M594,977Q462,977 384,891Q305,805 291,653L864,653Q864,810 794,894"
457*2d1272b8SAndroid Build Coastguard Worker "Q724,977 594,977ZM471,1266Q519,1328 575,1416Q630,1504 662,1569"
458*2d1272b8SAndroid Build Coastguard Worker "L864,1569L864,1548Q820,1483 733,1388Q646,1293 582,1241L471,1241L471,1266Z";
459*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);
460*2d1272b8SAndroid Build Coastguard Worker
461*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
462*2d1272b8SAndroid Build Coastguard Worker }
463*2d1272b8SAndroid Build Coastguard Worker {
464*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/Mada-VF.ttf");
465*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
466*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
467*2d1272b8SAndroid Build Coastguard Worker
468*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer = hb_buffer_create ();
469*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t codepoint = 1610; /* ي */
470*2d1272b8SAndroid Build Coastguard Worker hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
471*2d1272b8SAndroid Build Coastguard Worker hb_buffer_set_direction (buffer, HB_DIRECTION_RTL);
472*2d1272b8SAndroid Build Coastguard Worker hb_shape (font, buffer, NULL, 0);
473*2d1272b8SAndroid Build Coastguard Worker codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
474*2d1272b8SAndroid Build Coastguard Worker hb_buffer_destroy (buffer);
475*2d1272b8SAndroid Build Coastguard Worker
476*2d1272b8SAndroid Build Coastguard Worker /* should resolve composite glyphs recursively */
477*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
478*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
479*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M581,274L443,274Q409,274 384,259Q359,243 348,219Q336,194 340,166"
480*2d1272b8SAndroid Build Coastguard Worker "Q343,138 365,111L468,-13Q470,-10 473,-6Q475,-3 477,0L253,0Q225,0 203,8"
481*2d1272b8SAndroid Build Coastguard Worker "Q180,15 168,32Q155,48 155,73L155,269L50,269L50,73Q50,24 69,-10"
482*2d1272b8SAndroid Build Coastguard Worker "Q88,-44 118,-64Q147,-85 181,-94Q214,-104 243,-104L473,-104"
483*2d1272b8SAndroid Build Coastguard Worker "Q501,-104 525,-91Q549,-78 564,-56Q578,-34 578,-8Q578,18 557,43"
484*2d1272b8SAndroid Build Coastguard Worker "L442,182Q439,179 437,176Q435,173 432,170L581,170L581,274ZM184,-194"
485*2d1272b8SAndroid Build Coastguard Worker "Q184,-216 199,-231Q214,-246 236,-246Q258,-246 273,-231Q288,-216 288,-194"
486*2d1272b8SAndroid Build Coastguard Worker "Q288,-172 273,-157Q258,-142 236,-142Q214,-142 199,-157Q184,-172 184,-194Z"
487*2d1272b8SAndroid Build Coastguard Worker "M360,-194Q360,-216 375,-231Q390,-246 412,-246Q434,-246 449,-231"
488*2d1272b8SAndroid Build Coastguard Worker "Q464,-216 464,-194Q464,-172 449,-157Q434,-142 412,-142"
489*2d1272b8SAndroid Build Coastguard Worker "Q390,-142 375,-157Q360,-172 360,-194Z";
490*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
491*2d1272b8SAndroid Build Coastguard Worker
492*2d1272b8SAndroid Build Coastguard Worker /* should transform points of a composite glyph */
493*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
494*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 2, funcs, &draw_data); /* 2 == arAlef.fina */
495*2d1272b8SAndroid Build Coastguard Worker char expected2[] = "M155,624L155,84Q150,90 146,95Q141,99 136,105"
496*2d1272b8SAndroid Build Coastguard Worker "L292,105L292,0L156,0Q128,0 104,14Q79,27 65,51"
497*2d1272b8SAndroid Build Coastguard Worker "Q50,74 50,104L50,624L155,624ZM282,105L312,105"
498*2d1272b8SAndroid Build Coastguard Worker "L312,0L282,0L282,105Z";
499*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);
500*2d1272b8SAndroid Build Coastguard Worker
501*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
502*2d1272b8SAndroid Build Coastguard Worker }
503*2d1272b8SAndroid Build Coastguard Worker /* CFF glyphs, should get a path for the glyph */
504*2d1272b8SAndroid Build Coastguard Worker {
505*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/SourceSansPro-Regular.otf");
506*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
507*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
508*2d1272b8SAndroid Build Coastguard Worker
509*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
510*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 5, funcs, &draw_data);
511*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M90,0L258,0C456,0 564,122 564,331C564,539 456,656 254,656L90,656L90,0Z"
512*2d1272b8SAndroid Build Coastguard Worker "M173,68L173,588L248,588C401,588 478,496 478,331C478,165 401,68 248,68L173,68Z";
513*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
514*2d1272b8SAndroid Build Coastguard Worker
515*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
516*2d1272b8SAndroid Build Coastguard Worker }
517*2d1272b8SAndroid Build Coastguard Worker /* CFF glyphs (CID font) */
518*2d1272b8SAndroid Build Coastguard Worker {
519*2d1272b8SAndroid Build Coastguard Worker /* replaced with a subset as the original one was 15MB */
520*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/NotoSansCJKkr-Regular-subset-colon.ttf");
521*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
522*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
523*2d1272b8SAndroid Build Coastguard Worker
524*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
525*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 1, funcs, &draw_data);
526*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M139,390C175,390 205,419 205,459C205,501 175,530 139,530C103,530 73,501 73,459"
527*2d1272b8SAndroid Build Coastguard Worker "C73,419 103,390 139,390ZM139,-13C175,-13 205,15 205,56C205,97 175,127 139,127"
528*2d1272b8SAndroid Build Coastguard Worker "C103,127 73,97 73,56C73,15 103,-13 139,-13Z";
529*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
530*2d1272b8SAndroid Build Coastguard Worker
531*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
532*2d1272b8SAndroid Build Coastguard Worker }
533*2d1272b8SAndroid Build Coastguard Worker /* Skip SBIX glyphs (empty path), COLR glyphs (empty path), WOFF ttf glyphs, WOFF2 ttf glyph */
534*2d1272b8SAndroid Build Coastguard Worker }
535*2d1272b8SAndroid Build Coastguard Worker
536*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_font_kit_variations_tests(void)537*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_font_kit_variations_tests (void)
538*2d1272b8SAndroid Build Coastguard Worker {
539*2d1272b8SAndroid Build Coastguard Worker /* https://github.com/foliojs/fontkit/blob/b310db5/test/variations.js */
540*2d1272b8SAndroid Build Coastguard Worker char str[2048];
541*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
542*2d1272b8SAndroid Build Coastguard Worker .str = str,
543*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str)
544*2d1272b8SAndroid Build Coastguard Worker };
545*2d1272b8SAndroid Build Coastguard Worker /* Skia */
546*2d1272b8SAndroid Build Coastguard Worker {
547*2d1272b8SAndroid Build Coastguard Worker /* Skipping Skia tests for now even the fact we can actually do platform specific tests using our CIs */
548*2d1272b8SAndroid Build Coastguard Worker }
549*2d1272b8SAndroid Build Coastguard Worker /* truetype variations */
550*2d1272b8SAndroid Build Coastguard Worker /* should support sharing all points */
551*2d1272b8SAndroid Build Coastguard Worker {
552*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/TestGVAROne.ttf");
553*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
554*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
555*2d1272b8SAndroid Build Coastguard Worker
556*2d1272b8SAndroid Build Coastguard Worker hb_variation_t var;
557*2d1272b8SAndroid Build Coastguard Worker var.tag = HB_TAG ('w','g','h','t');
558*2d1272b8SAndroid Build Coastguard Worker var.value = 300;
559*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (font, &var, 1);
560*2d1272b8SAndroid Build Coastguard Worker
561*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer = hb_buffer_create ();
562*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t codepoint = 24396; /* 彌 */
563*2d1272b8SAndroid Build Coastguard Worker hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
564*2d1272b8SAndroid Build Coastguard Worker hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
565*2d1272b8SAndroid Build Coastguard Worker hb_shape (font, buffer, NULL, 0);
566*2d1272b8SAndroid Build Coastguard Worker codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
567*2d1272b8SAndroid Build Coastguard Worker hb_buffer_destroy (buffer);
568*2d1272b8SAndroid Build Coastguard Worker
569*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
570*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
571*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M371,-102L371,539L914,539L914,-27Q914,-102 840,-102"
572*2d1272b8SAndroid Build Coastguard Worker "Q796,-102 755,-98L742,-59Q790,-66 836,-66Q871,-66 871,-31L871,504"
573*2d1272b8SAndroid Build Coastguard Worker "L414,504L414,-102L371,-102ZM203,-94Q138,-94 86,-90L74,-52"
574*2d1272b8SAndroid Build Coastguard Worker "Q137,-59 188,-59Q211,-59 222,-46Q233,-34 236,12Q238,58 240,135"
575*2d1272b8SAndroid Build Coastguard Worker "Q242,211 242,262L74,262L94,527L242,527L242,719L63,719L63,754"
576*2d1272b8SAndroid Build Coastguard Worker "L285,754L285,492L133,492L117,297L285,297Q285,241 284,185"
577*2d1272b8SAndroid Build Coastguard Worker "Q284,104 281,46Q278,-20 269,-49Q260,-78 242,-86Q223,-94 203,-94Z"
578*2d1272b8SAndroid Build Coastguard Worker "M461,12L434,43Q473,73 503,115Q478,150 441,188L469,211Q501,179 525,147"
579*2d1272b8SAndroid Build Coastguard Worker "Q538,172 559,230L594,211Q571,152 551,117Q577,84 602,43L566,20"
580*2d1272b8SAndroid Build Coastguard Worker "Q544,64 528,86Q500,44 461,12ZM465,258L438,285Q474,316 501,351"
581*2d1272b8SAndroid Build Coastguard Worker "Q474,388 445,418L473,441Q500,414 523,381Q546,413 563,453L598,434"
582*2d1272b8SAndroid Build Coastguard Worker "Q571,382 549,352Q576,320 598,285L563,262Q546,294 525,322Q491,280 465,258Z"
583*2d1272b8SAndroid Build Coastguard Worker "M707,12L680,43Q717,68 753,115Q731,147 691,188L719,211Q739,190 754,172"
584*2d1272b8SAndroid Build Coastguard Worker "Q769,154 774,147Q793,185 809,230L844,211Q822,155 801,117Q828,82 852,43"
585*2d1272b8SAndroid Build Coastguard Worker "L820,20Q798,58 778,87Q747,43 707,12ZM621,-94L621,730L664,730L664,-94"
586*2d1272b8SAndroid Build Coastguard Worker "L621,-94ZM348,570L324,605Q425,629 527,688L555,656Q491,621 439,601"
587*2d1272b8SAndroid Build Coastguard Worker "Q386,581 348,570ZM715,258L688,285Q727,318 753,351Q733,378 695,418L723,441"
588*2d1272b8SAndroid Build Coastguard Worker "Q754,410 775,381Q794,407 813,453L848,434Q826,387 801,352Q823,321 848,281"
589*2d1272b8SAndroid Build Coastguard Worker "L813,262Q791,301 775,323Q749,288 715,258ZM348,719L348,754L941,754L941,719"
590*2d1272b8SAndroid Build Coastguard Worker "L348,719ZM936,570Q870,602 817,622Q764,641 727,652L749,688Q852,655 957,605L936,570Z";
591*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
592*2d1272b8SAndroid Build Coastguard Worker
593*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
594*2d1272b8SAndroid Build Coastguard Worker }
595*2d1272b8SAndroid Build Coastguard Worker /* should support sharing enumerated points */
596*2d1272b8SAndroid Build Coastguard Worker {
597*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/TestGVARTwo.ttf");
598*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
599*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
600*2d1272b8SAndroid Build Coastguard Worker
601*2d1272b8SAndroid Build Coastguard Worker hb_variation_t var;
602*2d1272b8SAndroid Build Coastguard Worker var.tag = HB_TAG ('w','g','h','t');
603*2d1272b8SAndroid Build Coastguard Worker var.value = 300;
604*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (font, &var, 1);
605*2d1272b8SAndroid Build Coastguard Worker
606*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer = hb_buffer_create ();
607*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t codepoint = 24396; /* 彌 */
608*2d1272b8SAndroid Build Coastguard Worker hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
609*2d1272b8SAndroid Build Coastguard Worker hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
610*2d1272b8SAndroid Build Coastguard Worker hb_shape (font, buffer, NULL, 0);
611*2d1272b8SAndroid Build Coastguard Worker codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
612*2d1272b8SAndroid Build Coastguard Worker hb_buffer_destroy (buffer);
613*2d1272b8SAndroid Build Coastguard Worker
614*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
615*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
616*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M371,-102L371,539L914,539L914,-27Q914,-102 840,-102Q796,-102 755,-98"
617*2d1272b8SAndroid Build Coastguard Worker "L742,-59Q790,-66 836,-66Q871,-66 871,-31L871,504L414,504L414,-102"
618*2d1272b8SAndroid Build Coastguard Worker "L371,-102ZM203,-94Q138,-94 86,-90L74,-52Q137,-59 188,-59Q211,-59 222,-46"
619*2d1272b8SAndroid Build Coastguard Worker "Q233,-34 236,12Q238,58 240,135Q242,211 242,262L74,262L94,527L242,527"
620*2d1272b8SAndroid Build Coastguard Worker "L242,719L63,719L63,754L285,754L285,492L133,492L117,297L285,297"
621*2d1272b8SAndroid Build Coastguard Worker "Q285,241 284,185Q284,104 281,46Q278,-20 269,-49Q260,-78 242,-86Q223,-94 203,-94Z"
622*2d1272b8SAndroid Build Coastguard Worker "M461,12L434,43Q473,73 503,115Q478,150 441,188L469,211Q501,179 525,147"
623*2d1272b8SAndroid Build Coastguard Worker "Q538,172 559,230L594,211Q571,152 551,117Q577,84 602,43L566,20"
624*2d1272b8SAndroid Build Coastguard Worker "Q544,64 528,86Q500,44 461,12ZM465,258L438,285Q474,316 501,351"
625*2d1272b8SAndroid Build Coastguard Worker "Q474,388 445,418L473,441Q500,414 523,381Q546,413 563,453L598,434"
626*2d1272b8SAndroid Build Coastguard Worker "Q571,382 549,352Q576,320 598,285L563,262Q546,294 525,322Q491,280 465,258Z"
627*2d1272b8SAndroid Build Coastguard Worker "M707,12L680,43Q717,68 753,115Q731,147 691,188L719,211Q739,190 754,172"
628*2d1272b8SAndroid Build Coastguard Worker "Q769,154 774,147Q793,185 809,230L844,211Q822,155 801,117Q828,82 852,43L820,20"
629*2d1272b8SAndroid Build Coastguard Worker "Q798,58 778,87Q747,43 707,12ZM621,-94L621,730L664,730L664,-94L621,-94ZM348,570"
630*2d1272b8SAndroid Build Coastguard Worker "L324,605Q425,629 527,688L555,656Q491,621 439,601Q386,581 348,570ZM715,258L688,285"
631*2d1272b8SAndroid Build Coastguard Worker "Q727,318 753,351Q733,378 695,418L723,441Q754,410 775,381Q794,407 813,453"
632*2d1272b8SAndroid Build Coastguard Worker "L848,434Q826,387 801,352Q823,321 848,281L813,262Q791,301 775,323Q749,288 715,258Z"
633*2d1272b8SAndroid Build Coastguard Worker "M348,719L348,754L941,754L941,719L348,719ZM936,570Q870,602 817,622"
634*2d1272b8SAndroid Build Coastguard Worker "Q764,641 727,652L749,688Q852,655 957,605L936,570Z";
635*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
636*2d1272b8SAndroid Build Coastguard Worker
637*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
638*2d1272b8SAndroid Build Coastguard Worker }
639*2d1272b8SAndroid Build Coastguard Worker /* should support sharing no points */
640*2d1272b8SAndroid Build Coastguard Worker {
641*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/TestGVARThree.ttf");
642*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
643*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
644*2d1272b8SAndroid Build Coastguard Worker
645*2d1272b8SAndroid Build Coastguard Worker hb_variation_t var;
646*2d1272b8SAndroid Build Coastguard Worker var.tag = HB_TAG ('w','g','h','t');
647*2d1272b8SAndroid Build Coastguard Worker var.value = 300;
648*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (font, &var, 1);
649*2d1272b8SAndroid Build Coastguard Worker
650*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer = hb_buffer_create ();
651*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t codepoint = 24396; /* 彌 */
652*2d1272b8SAndroid Build Coastguard Worker hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
653*2d1272b8SAndroid Build Coastguard Worker hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
654*2d1272b8SAndroid Build Coastguard Worker hb_shape (font, buffer, NULL, 0);
655*2d1272b8SAndroid Build Coastguard Worker codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
656*2d1272b8SAndroid Build Coastguard Worker hb_buffer_destroy (buffer);
657*2d1272b8SAndroid Build Coastguard Worker
658*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
659*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
660*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M371,-102L371,539L914,539L914,-27Q914,-102 840,-102Q796,-102 755,-98"
661*2d1272b8SAndroid Build Coastguard Worker "L742,-59Q790,-66 836,-66Q871,-66 871,-31L871,504L414,504L414,-102"
662*2d1272b8SAndroid Build Coastguard Worker "L371,-102ZM203,-94Q138,-94 86,-90L74,-52Q137,-59 188,-59Q211,-59 222,-46"
663*2d1272b8SAndroid Build Coastguard Worker "Q233,-34 236,12Q238,58 240,135Q242,211 242,262L74,262L94,527L242,527L242,719"
664*2d1272b8SAndroid Build Coastguard Worker "L63,719L63,754L285,754L285,492L133,492L117,297L285,297Q285,241 284,185"
665*2d1272b8SAndroid Build Coastguard Worker "Q284,104 281,46Q278,-20 269,-49Q260,-78 242,-86Q223,-94 203,-94ZM461,12"
666*2d1272b8SAndroid Build Coastguard Worker "L434,43Q473,73 503,115Q478,150 441,188L469,211Q501,179 525,147"
667*2d1272b8SAndroid Build Coastguard Worker "Q538,172 559,230L594,211Q571,152 551,117Q577,84 602,43L566,20Q544,64 528,86"
668*2d1272b8SAndroid Build Coastguard Worker "Q500,44 461,12ZM465,258L438,285Q474,316 501,351Q474,388 445,418L473,441"
669*2d1272b8SAndroid Build Coastguard Worker "Q500,414 523,381Q546,413 563,453L598,434Q571,382 549,352Q576,320 598,285"
670*2d1272b8SAndroid Build Coastguard Worker "L563,262Q546,294 525,322Q491,280 465,258ZM707,12L680,43Q717,68 753,115"
671*2d1272b8SAndroid Build Coastguard Worker "Q731,147 691,188L719,211Q739,190 754,172Q769,154 774,147Q793,185 809,230"
672*2d1272b8SAndroid Build Coastguard Worker "L844,211Q822,155 801,117Q828,82 852,43L820,20Q798,58 778,87Q747,43 707,12Z"
673*2d1272b8SAndroid Build Coastguard Worker "M621,-94L621,730L664,730L664,-94L621,-94ZM348,570L324,605Q425,629 527,688"
674*2d1272b8SAndroid Build Coastguard Worker "L555,656Q491,621 439,601Q386,581 348,570ZM715,258L688,285Q727,318 753,351"
675*2d1272b8SAndroid Build Coastguard Worker "Q733,378 695,418L723,441Q754,410 775,381Q794,407 813,453L848,434Q826,387 801,352"
676*2d1272b8SAndroid Build Coastguard Worker "Q823,321 848,281L813,262Q791,301 775,323Q749,288 715,258ZM348,719L348,754"
677*2d1272b8SAndroid Build Coastguard Worker "L941,754L941,719L348,719ZM936,570Q870,602 817,622"
678*2d1272b8SAndroid Build Coastguard Worker "Q764,641 727,652L749,688Q852,655 957,605L936,570Z";
679*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
680*2d1272b8SAndroid Build Coastguard Worker
681*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
682*2d1272b8SAndroid Build Coastguard Worker }
683*2d1272b8SAndroid Build Coastguard Worker
684*2d1272b8SAndroid Build Coastguard Worker /* CFF2 variations */
685*2d1272b8SAndroid Build Coastguard Worker {
686*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/AdobeVFPrototype-Subset.otf");
687*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
688*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
689*2d1272b8SAndroid Build Coastguard Worker
690*2d1272b8SAndroid Build Coastguard Worker hb_variation_t var;
691*2d1272b8SAndroid Build Coastguard Worker var.tag = HB_TAG ('w','g','h','t');
692*2d1272b8SAndroid Build Coastguard Worker /* applies variations to CFF2 glyphs */
693*2d1272b8SAndroid Build Coastguard Worker {
694*2d1272b8SAndroid Build Coastguard Worker var.value = 100;
695*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (font, &var, 1);
696*2d1272b8SAndroid Build Coastguard Worker
697*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer = hb_buffer_create ();
698*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t codepoint = '$';
699*2d1272b8SAndroid Build Coastguard Worker hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
700*2d1272b8SAndroid Build Coastguard Worker hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
701*2d1272b8SAndroid Build Coastguard Worker hb_shape (font, buffer, NULL, 0);
702*2d1272b8SAndroid Build Coastguard Worker codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
703*2d1272b8SAndroid Build Coastguard Worker hb_buffer_destroy (buffer);
704*2d1272b8SAndroid Build Coastguard Worker
705*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
706*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
707*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M246,15C188,15 147,27 101,68L142,23L117,117C111,143 96,149 81,149"
708*2d1272b8SAndroid Build Coastguard Worker "C65,149 56,141 52,126C71,40 137,-13 244,-13C348,-13 436,46 436,156"
709*2d1272b8SAndroid Build Coastguard Worker "C436,229 405,295 271,349L247,359C160,393 119,439 119,506"
710*2d1272b8SAndroid Build Coastguard Worker "C119,592 178,637 262,637C311,637 346,626 390,585L348,629L373,535"
711*2d1272b8SAndroid Build Coastguard Worker "C380,510 394,503 408,503C424,503 434,510 437,526C418,614 348,665 259,665"
712*2d1272b8SAndroid Build Coastguard Worker "C161,665 78,606 78,500C78,414 128,361 224,321L261,305C367,259 395,217 395,152"
713*2d1272b8SAndroid Build Coastguard Worker "C395,65 334,15 246,15ZM267,331L267,759L240,759L240,331L267,331ZM240,-115"
714*2d1272b8SAndroid Build Coastguard Worker "L267,-115L267,331L240,331L240,-115Z";
715*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
716*2d1272b8SAndroid Build Coastguard Worker }
717*2d1272b8SAndroid Build Coastguard Worker {
718*2d1272b8SAndroid Build Coastguard Worker var.value = 500;
719*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (font, &var, 1);
720*2d1272b8SAndroid Build Coastguard Worker
721*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer = hb_buffer_create ();
722*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t codepoint = '$';
723*2d1272b8SAndroid Build Coastguard Worker hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
724*2d1272b8SAndroid Build Coastguard Worker hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
725*2d1272b8SAndroid Build Coastguard Worker hb_shape (font, buffer, NULL, 0);
726*2d1272b8SAndroid Build Coastguard Worker codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
727*2d1272b8SAndroid Build Coastguard Worker hb_buffer_destroy (buffer);
728*2d1272b8SAndroid Build Coastguard Worker
729*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
730*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
731*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M251,36C206,36 165,42 118,61L176,21L161,99C151,152 129,167 101,167"
732*2d1272b8SAndroid Build Coastguard Worker "C78,167 61,155 51,131C54,43 133,-14 247,-14C388,-14 474,64 474,171"
733*2d1272b8SAndroid Build Coastguard Worker "C474,258 430,321 294,370L257,383C188,406 150,438 150,499"
734*2d1272b8SAndroid Build Coastguard Worker "C150,571 204,606 276,606C308,606 342,601 386,582L327,621"
735*2d1272b8SAndroid Build Coastguard Worker "L343,546C355,490 382,476 408,476C428,476 448,487 455,512"
736*2d1272b8SAndroid Build Coastguard Worker "C450,597 370,656 264,656C140,656 57,576 57,474C57,373 119,318 227,279"
737*2d1272b8SAndroid Build Coastguard Worker "L263,266C345,236 379,208 379,145C379,76 329,36 251,36ZM289,320"
738*2d1272b8SAndroid Build Coastguard Worker "L289,746L242,746L242,320L289,320ZM240,-115L286,-115L286,320L240,320L240,-115Z";
739*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
740*2d1272b8SAndroid Build Coastguard Worker }
741*2d1272b8SAndroid Build Coastguard Worker /* substitutes GSUB features depending on variations */
742*2d1272b8SAndroid Build Coastguard Worker {
743*2d1272b8SAndroid Build Coastguard Worker var.value = 900;
744*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (font, &var, 1);
745*2d1272b8SAndroid Build Coastguard Worker
746*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer = hb_buffer_create ();
747*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t codepoint = '$';
748*2d1272b8SAndroid Build Coastguard Worker hb_buffer_add_codepoints (buffer, &codepoint, 1, 0, -1);
749*2d1272b8SAndroid Build Coastguard Worker hb_buffer_set_direction (buffer, HB_DIRECTION_LTR);
750*2d1272b8SAndroid Build Coastguard Worker hb_shape (font, buffer, NULL, 0);
751*2d1272b8SAndroid Build Coastguard Worker codepoint = hb_buffer_get_glyph_infos (buffer, NULL)[0].codepoint;
752*2d1272b8SAndroid Build Coastguard Worker hb_buffer_destroy (buffer);
753*2d1272b8SAndroid Build Coastguard Worker
754*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
755*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, codepoint, funcs, &draw_data);
756*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M258,38C197,38 167,48 118,71L192,19L183,103C177,155 155,174 115,174"
757*2d1272b8SAndroid Build Coastguard Worker "C89,174 64,161 51,125C52,36 124,-16 258,-16C417,-16 513,67 513,175"
758*2d1272b8SAndroid Build Coastguard Worker "C513,278 457,328 322,388L289,403C232,429 203,452 203,500C203,562 244,589 301,589"
759*2d1272b8SAndroid Build Coastguard Worker "C342,589 370,585 420,562L341,607L352,539C363,468 398,454 434,454C459,454 486,468 492,506"
760*2d1272b8SAndroid Build Coastguard Worker "C491,590 408,643 290,643C141,643 57,563 57,460C57,357 122,307 233,256L265,241"
761*2d1272b8SAndroid Build Coastguard Worker "C334,209 363,186 363,130C363,77 320,38 258,38ZM318,616L318,734L252,734L252,616"
762*2d1272b8SAndroid Build Coastguard Worker "L318,616ZM253,-115L319,-115L319,14L253,14L253,-115Z";
763*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
764*2d1272b8SAndroid Build Coastguard Worker }
765*2d1272b8SAndroid Build Coastguard Worker
766*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
767*2d1272b8SAndroid Build Coastguard Worker }
768*2d1272b8SAndroid Build Coastguard Worker }
769*2d1272b8SAndroid Build Coastguard Worker
770*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_estedad_vf(void)771*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_estedad_vf (void)
772*2d1272b8SAndroid Build Coastguard Worker {
773*2d1272b8SAndroid Build Coastguard Worker /* https://github.com/harfbuzz/harfbuzz/issues/2215 */
774*2d1272b8SAndroid Build Coastguard Worker char str[2048];
775*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
776*2d1272b8SAndroid Build Coastguard Worker .str = str,
777*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str)
778*2d1272b8SAndroid Build Coastguard Worker };
779*2d1272b8SAndroid Build Coastguard Worker {
780*2d1272b8SAndroid Build Coastguard Worker /* See https://github.com/google/skia/blob/d38f00a1/gm/stroketext.cpp#L115-L124 */
781*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/Estedad-VF.ttf");
782*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
783*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
784*2d1272b8SAndroid Build Coastguard Worker
785*2d1272b8SAndroid Build Coastguard Worker hb_variation_t var;
786*2d1272b8SAndroid Build Coastguard Worker hb_variation_from_string ("wght=100", -1, &var);
787*2d1272b8SAndroid Build Coastguard Worker hb_font_set_variations (font, &var, 1);
788*2d1272b8SAndroid Build Coastguard Worker
789*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
790*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 156, funcs, &draw_data);
791*2d1272b8SAndroid Build Coastguard Worker /* Skip empty path where all the points of a path are equal */
792*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M150,1158L182,1158Q256,1158 317,1170Q377,1182 421,1213L421,430L521,430"
793*2d1272b8SAndroid Build Coastguard Worker "L521,1490L421,1490L421,1320Q393,1279 344,1262Q294,1244 182,1244L150,1244"
794*2d1272b8SAndroid Build Coastguard Worker "L150,1158ZM1815,-122L1669,-122L1669,642L1552,642L1055,-117L1055,-206"
795*2d1272b8SAndroid Build Coastguard Worker "L1569,-206L1569,-458L1669,-458L1669,-206L1815,-206L1815,-122ZM1569,-122"
796*2d1272b8SAndroid Build Coastguard Worker "L1166,-122L1569,494L1569,-122ZM609,-79L1639,1288L1555,1334L525,-33L609,-79Z";
797*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
798*2d1272b8SAndroid Build Coastguard Worker
799*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
800*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 180, funcs, &draw_data);
801*2d1272b8SAndroid Build Coastguard Worker /* Skip empty path where all the points of a path are equal */
802*2d1272b8SAndroid Build Coastguard Worker char expected2[] = "M120,693Q120,545 177,414Q233,282 333,182Q433,81 567,24"
803*2d1272b8SAndroid Build Coastguard Worker "Q701,-33 856,-33Q1010,-33 1144,24Q1277,81 1377,182Q1477,282 1534,414"
804*2d1272b8SAndroid Build Coastguard Worker "Q1590,545 1590,693Q1590,842 1534,973Q1477,1104 1377,1205"
805*2d1272b8SAndroid Build Coastguard Worker "Q1277,1305 1144,1362Q1010,1419 856,1419Q701,1419 567,1362"
806*2d1272b8SAndroid Build Coastguard Worker "Q433,1305 333,1205Q233,1104 177,973Q120,842 120,693Z"
807*2d1272b8SAndroid Build Coastguard Worker "M220,693Q220,828 270,945Q320,1061 409,1148Q497,1235 612,1284"
808*2d1272b8SAndroid Build Coastguard Worker "Q726,1333 855,1333Q984,1333 1099,1284Q1213,1235 1302,1148"
809*2d1272b8SAndroid Build Coastguard Worker "Q1390,1061 1440,945Q1490,828 1490,693Q1490,558 1440,442"
810*2d1272b8SAndroid Build Coastguard Worker "Q1390,325 1302,237Q1213,149 1099,100Q984,51 855,51"
811*2d1272b8SAndroid Build Coastguard Worker "Q726,51 611,100Q497,149 408,237Q320,325 270,442"
812*2d1272b8SAndroid Build Coastguard Worker "Q220,558 220,693ZM690,643L690,997L886,997Q970,997 1029,949"
813*2d1272b8SAndroid Build Coastguard Worker "Q1087,901 1087,819Q1087,737 1028,690Q969,643 886,643L690,643Z"
814*2d1272b8SAndroid Build Coastguard Worker "M1165,334L973,568Q1065,591 1126,658Q1187,725 1187,819"
815*2d1272b8SAndroid Build Coastguard Worker "Q1187,896 1147,956Q1106,1015 1037,1049Q969,1083 886,1083"
816*2d1272b8SAndroid Build Coastguard Worker "L590,1083L590,310L690,310L690,557L860,557L1083,286L1165,334Z";
817*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);
818*2d1272b8SAndroid Build Coastguard Worker
819*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
820*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 262, funcs, &draw_data);
821*2d1272b8SAndroid Build Coastguard Worker /* Skip empty path where all the points of a path are equal */
822*2d1272b8SAndroid Build Coastguard Worker char expected3[] = "M422,598Q495,598 545,548Q595,498 595,426Q595,353 545,303Q494,252 422,252"
823*2d1272b8SAndroid Build Coastguard Worker "Q350,252 300,303Q250,353 250,426Q250,499 300,549Q349,598 422,598ZM422,698"
824*2d1272b8SAndroid Build Coastguard Worker "Q347,698 285,662Q223,625 187,564Q150,502 150,426Q150,351 187,289"
825*2d1272b8SAndroid Build Coastguard Worker "Q223,226 285,189Q346,152 422,152Q498,152 560,189Q622,226 658,288"
826*2d1272b8SAndroid Build Coastguard Worker "Q695,351 695,426Q695,502 658,563Q621,625 559,661Q498,698 422,698Z";
827*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected3, sizeof (expected3) - 1);
828*2d1272b8SAndroid Build Coastguard Worker
829*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
830*2d1272b8SAndroid Build Coastguard Worker }
831*2d1272b8SAndroid Build Coastguard Worker }
832*2d1272b8SAndroid Build Coastguard Worker
833*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_stroking(void)834*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_stroking (void)
835*2d1272b8SAndroid Build Coastguard Worker {
836*2d1272b8SAndroid Build Coastguard Worker /* https://skia-review.googlesource.com/c/skia/+/266945
837*2d1272b8SAndroid Build Coastguard Worker https://savannah.nongnu.org/bugs/index.php?57701 */
838*2d1272b8SAndroid Build Coastguard Worker char str[2048];
839*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
840*2d1272b8SAndroid Build Coastguard Worker .str = str,
841*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str)
842*2d1272b8SAndroid Build Coastguard Worker };
843*2d1272b8SAndroid Build Coastguard Worker {
844*2d1272b8SAndroid Build Coastguard Worker /* See https://github.com/google/skia/blob/d38f00a1/gm/stroketext.cpp#L115-L124 */
845*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/Stroking.ttf");
846*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
847*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
848*2d1272b8SAndroid Build Coastguard Worker
849*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
850*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 6, funcs, &draw_data);
851*2d1272b8SAndroid Build Coastguard Worker /* Skip empty path where all the points of a path are equal */
852*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M436,1522Q436,1280 531,1060Q625,839 784,680Q943,521 1164,427Q1384,332 1626,332"
853*2d1272b8SAndroid Build Coastguard Worker "Q1868,332 2089,427Q2309,521 2468,680Q2627,839 2722,1060Q2816,1280 2816,1522"
854*2d1272b8SAndroid Build Coastguard Worker "Q2816,1764 2722,1985Q2627,2205 2468,2364Q2309,2523 2089,2618Q1868,2712 1626,2712"
855*2d1272b8SAndroid Build Coastguard Worker "Q1384,2712 1164,2618Q943,2523 784,2364Q625,2205 531,1985Q436,1764 436,1522ZM256,1528"
856*2d1272b8SAndroid Build Coastguard Worker "Q256,1714 306,1892Q355,2069 443,2220Q531,2370 658,2497Q784,2623 935,2711"
857*2d1272b8SAndroid Build Coastguard Worker "Q1085,2799 1263,2849Q1440,2898 1626,2898Q1812,2898 1990,2849Q2167,2799 2318,2711"
858*2d1272b8SAndroid Build Coastguard Worker "Q2468,2623 2595,2497Q2721,2370 2809,2220Q2897,2069 2947,1892Q2996,1714 2996,1528"
859*2d1272b8SAndroid Build Coastguard Worker "Q2996,1342 2947,1165Q2897,987 2809,837Q2721,686 2595,560Q2468,433 2318,345"
860*2d1272b8SAndroid Build Coastguard Worker "Q2167,257 1990,208Q1812,158 1626,158Q1440,158 1263,208Q1085,257 935,345"
861*2d1272b8SAndroid Build Coastguard Worker "Q784,433 658,560Q531,686 443,837Q355,987 306,1165Q256,1342 256,1528Z";
862*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
863*2d1272b8SAndroid Build Coastguard Worker
864*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
865*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 7, funcs, &draw_data);
866*2d1272b8SAndroid Build Coastguard Worker char expected2[] = "M436,1522Q436,1280 531,1060Q625,839 784,680Q943,521 1164,427"
867*2d1272b8SAndroid Build Coastguard Worker "Q1384,332 1626,332Q1868,332 2089,427Q2309,521 2468,680"
868*2d1272b8SAndroid Build Coastguard Worker "Q2627,839 2722,1060Q2816,1280 2816,1522Q2816,1764 2722,1985"
869*2d1272b8SAndroid Build Coastguard Worker "Q2627,2205 2468,2364Q2309,2523 2089,2618Q1868,2712 1626,2712"
870*2d1272b8SAndroid Build Coastguard Worker "Q1384,2712 1164,2618Q943,2523 784,2364Q625,2205 531,1985"
871*2d1272b8SAndroid Build Coastguard Worker "Q436,1764 436,1522ZM256,1528Q256,1714 306,1892Q355,2069 443,2220"
872*2d1272b8SAndroid Build Coastguard Worker "Q531,2370 658,2497Q784,2623 935,2711Q1085,2799 1263,2849"
873*2d1272b8SAndroid Build Coastguard Worker "Q1440,2898 1626,2898Q1812,2898 1990,2849Q2167,2799 2318,2711"
874*2d1272b8SAndroid Build Coastguard Worker "Q2468,2623 2595,2497Q2721,2370 2809,2220Q2897,2069 2947,1892"
875*2d1272b8SAndroid Build Coastguard Worker "Q2996,1714 2996,1528Q2996,1342 2947,1165Q2897,987 2809,837"
876*2d1272b8SAndroid Build Coastguard Worker "Q2721,686 2595,560Q2468,433 2318,345Q2167,257 1990,208"
877*2d1272b8SAndroid Build Coastguard Worker "Q1812,158 1626,158Q1440,158 1263,208Q1085,257 935,345"
878*2d1272b8SAndroid Build Coastguard Worker "Q784,433 658,560Q531,686 443,837Q355,987 306,1165"
879*2d1272b8SAndroid Build Coastguard Worker "Q256,1342 256,1528Z";
880*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);
881*2d1272b8SAndroid Build Coastguard Worker
882*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
883*2d1272b8SAndroid Build Coastguard Worker }
884*2d1272b8SAndroid Build Coastguard Worker {
885*2d1272b8SAndroid Build Coastguard Worker /* https://github.com/google/skia/blob/d38f00a1/gm/stroketext.cpp#L131-L138 */
886*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/Stroking.otf");
887*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
888*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
889*2d1272b8SAndroid Build Coastguard Worker
890*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
891*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 4, funcs, &draw_data);
892*2d1272b8SAndroid Build Coastguard Worker /* Skip empty path in CFF */
893*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M106,372C106,532 237,662 397,662C557,662 688,532 688,372C688,212 557,81 397,81C237,81 106,212 106,372Z"
894*2d1272b8SAndroid Build Coastguard Worker "M62,373C62,188 212,39 397,39C582,39 731,188 731,373C731,558 582,708 397,708C212,708 62,558 62,373Z";
895*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
896*2d1272b8SAndroid Build Coastguard Worker
897*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
898*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 5, funcs, &draw_data);
899*2d1272b8SAndroid Build Coastguard Worker /* Fold consequent move-to commands */
900*2d1272b8SAndroid Build Coastguard Worker char expected2[] = "M106,372C106,532 237,662 397,662C557,662 688,532 688,372"
901*2d1272b8SAndroid Build Coastguard Worker "C688,212 557,81 397,81C237,81 106,212 106,372ZM62,373"
902*2d1272b8SAndroid Build Coastguard Worker "C62,188 212,39 397,39C582,39 731,188 731,373"
903*2d1272b8SAndroid Build Coastguard Worker "C731,558 582,708 397,708C212,708 62,558 62,373Z";
904*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);
905*2d1272b8SAndroid Build Coastguard Worker
906*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
907*2d1272b8SAndroid Build Coastguard Worker }
908*2d1272b8SAndroid Build Coastguard Worker }
909*2d1272b8SAndroid Build Coastguard Worker
910*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_drawing_funcs(void)911*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_drawing_funcs (void)
912*2d1272b8SAndroid Build Coastguard Worker {
913*2d1272b8SAndroid Build Coastguard Worker char str[2048];
914*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
915*2d1272b8SAndroid Build Coastguard Worker .str = str,
916*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str)
917*2d1272b8SAndroid Build Coastguard Worker };
918*2d1272b8SAndroid Build Coastguard Worker
919*2d1272b8SAndroid Build Coastguard Worker {
920*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t st = HB_DRAW_STATE_DEFAULT;
921*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
922*2d1272b8SAndroid Build Coastguard Worker hb_draw_move_to (funcs, &draw_data, &st, 90.f, 0.f);
923*2d1272b8SAndroid Build Coastguard Worker hb_draw_line_to (funcs, &draw_data, &st, 258.f, 0.f);
924*2d1272b8SAndroid Build Coastguard Worker hb_draw_cubic_to (funcs, &draw_data, &st, 456.f, 0.f, 564.f, 122.f, 564.f, 331.f);
925*2d1272b8SAndroid Build Coastguard Worker hb_draw_cubic_to (funcs, &draw_data, &st, 564.f, 539.f, 456.f, 656.f, 254.f, 656.f);
926*2d1272b8SAndroid Build Coastguard Worker hb_draw_line_to (funcs, &draw_data, &st, 90.f, 656.f);
927*2d1272b8SAndroid Build Coastguard Worker hb_draw_line_to (funcs, &draw_data, &st, 90.f, 0.f);
928*2d1272b8SAndroid Build Coastguard Worker hb_draw_close_path (funcs, &draw_data, &st);
929*2d1272b8SAndroid Build Coastguard Worker
930*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M90,0L258,0C456,0 564,122 564,331C564,539 456,656 254,656L90,656L90,0Z";
931*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
932*2d1272b8SAndroid Build Coastguard Worker }
933*2d1272b8SAndroid Build Coastguard Worker
934*2d1272b8SAndroid Build Coastguard Worker {
935*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t st = HB_DRAW_STATE_DEFAULT;
936*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
937*2d1272b8SAndroid Build Coastguard Worker hb_draw_move_to (funcs, &draw_data, &st, 155.f, 624.f);
938*2d1272b8SAndroid Build Coastguard Worker hb_draw_line_to (funcs, &draw_data, &st, 155.f, 84.f);
939*2d1272b8SAndroid Build Coastguard Worker hb_draw_quadratic_to (funcs, &draw_data, &st, 150.f, 90.f, 146.f, 95.f);
940*2d1272b8SAndroid Build Coastguard Worker hb_draw_quadratic_to (funcs, &draw_data, &st, 141.f, 99.f, 136.f, 105.f);
941*2d1272b8SAndroid Build Coastguard Worker hb_draw_line_to (funcs, &draw_data, &st, 292.f, 105.f);
942*2d1272b8SAndroid Build Coastguard Worker hb_draw_line_to (funcs, &draw_data, &st, 292.f, 0.f);
943*2d1272b8SAndroid Build Coastguard Worker hb_draw_line_to (funcs, &draw_data, &st, 156.f, 0.f);
944*2d1272b8SAndroid Build Coastguard Worker hb_draw_quadratic_to (funcs, &draw_data, &st, 128.f, 0.f, 104.f, 14.f);
945*2d1272b8SAndroid Build Coastguard Worker hb_draw_quadratic_to (funcs, &draw_data, &st, 79.f, 27.f, 65.f, 51.f);
946*2d1272b8SAndroid Build Coastguard Worker hb_draw_quadratic_to (funcs, &draw_data, &st, 50.f, 74.f, 50.f, 104.f);
947*2d1272b8SAndroid Build Coastguard Worker hb_draw_line_to (funcs, &draw_data, &st, 50.f, 624.f);
948*2d1272b8SAndroid Build Coastguard Worker hb_draw_line_to (funcs, &draw_data, &st, 155.f, 624.f);
949*2d1272b8SAndroid Build Coastguard Worker hb_draw_close_path (funcs, &draw_data, &st);
950*2d1272b8SAndroid Build Coastguard Worker
951*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M155,624L155,84Q150,90 146,95Q141,99 136,105"
952*2d1272b8SAndroid Build Coastguard Worker "L292,105L292,0L156,0Q128,0 104,14Q79,27 65,51"
953*2d1272b8SAndroid Build Coastguard Worker "Q50,74 50,104L50,624L155,624Z";
954*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
955*2d1272b8SAndroid Build Coastguard Worker }
956*2d1272b8SAndroid Build Coastguard Worker }
957*2d1272b8SAndroid Build Coastguard Worker
958*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_synthetic_slant(void)959*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_synthetic_slant (void)
960*2d1272b8SAndroid Build Coastguard Worker {
961*2d1272b8SAndroid Build Coastguard Worker char str[2048];
962*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
963*2d1272b8SAndroid Build Coastguard Worker .str = str,
964*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str)
965*2d1272b8SAndroid Build Coastguard Worker };
966*2d1272b8SAndroid Build Coastguard Worker {
967*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/OpenSans-Regular.ttf");
968*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
969*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
970*2d1272b8SAndroid Build Coastguard Worker hb_font_set_synthetic_slant (font, 0.2f);
971*2d1272b8SAndroid Build Coastguard Worker
972*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
973*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 37, funcs, &draw_data);
974*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M493,1462L906,1462Q1197,1462 1310,1375Q1423,1288 1385,1100"
975*2d1272b8SAndroid Build Coastguard Worker "Q1359,970 1270,886Q1180,801 1036,776L1034,766Q1356,709 1297,416"
976*2d1272b8SAndroid Build Coastguard Worker "Q1258,220 1104,110Q949,0 711,0L201,0L493,1462ZM538,836L818,836"
977*2d1272b8SAndroid Build Coastguard Worker "Q998,836 1089,893Q1179,949 1206,1083Q1230,1206 1153,1261"
978*2d1272b8SAndroid Build Coastguard Worker "Q1076,1315 884,1315L634,1315L538,836ZM509,692L400,145L705,145"
979*2d1272b8SAndroid Build Coastguard Worker "Q882,145 985,214Q1088,282 1118,428Q1145,564 1066,628Q987,692 800,692L509,692Z";
980*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
981*2d1272b8SAndroid Build Coastguard Worker
982*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
983*2d1272b8SAndroid Build Coastguard Worker }
984*2d1272b8SAndroid Build Coastguard Worker {
985*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/SourceSansPro-Regular.otf");
986*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
987*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
988*2d1272b8SAndroid Build Coastguard Worker hb_font_set_synthetic_slant (font, 0.2f);
989*2d1272b8SAndroid Build Coastguard Worker
990*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
991*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 5, funcs, &draw_data);
992*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M90,0L258,0C456,0 588,122 630,331C672,539 587,656 385,656L221,656L90,0Z"
993*2d1272b8SAndroid Build Coastguard Worker "M187,68L291,588L366,588C519,588 577,496 544,331C511,165 415,68 262,68L187,68Z";
994*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
995*2d1272b8SAndroid Build Coastguard Worker
996*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
997*2d1272b8SAndroid Build Coastguard Worker }
998*2d1272b8SAndroid Build Coastguard Worker }
999*2d1272b8SAndroid Build Coastguard Worker
1000*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_subfont_scale(void)1001*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_subfont_scale (void)
1002*2d1272b8SAndroid Build Coastguard Worker {
1003*2d1272b8SAndroid Build Coastguard Worker char str[2048];
1004*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
1005*2d1272b8SAndroid Build Coastguard Worker .str = str,
1006*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str)
1007*2d1272b8SAndroid Build Coastguard Worker };
1008*2d1272b8SAndroid Build Coastguard Worker signed x, y;
1009*2d1272b8SAndroid Build Coastguard Worker {
1010*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/OpenSans-Regular.ttf");
1011*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font1 = hb_font_create (face);
1012*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font2 = hb_font_create_sub_font (font1);
1013*2d1272b8SAndroid Build Coastguard Worker
1014*2d1272b8SAndroid Build Coastguard Worker hb_font_get_scale (font1, &x, &y);
1015*2d1272b8SAndroid Build Coastguard Worker hb_font_set_scale (font2, x*2, y*2);
1016*2d1272b8SAndroid Build Coastguard Worker
1017*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
1018*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font1, 37, funcs, &draw_data);
1019*2d1272b8SAndroid Build Coastguard Worker char expected1[] = "M201,1462L614,1462Q905,1462 1035,1375Q1165,1288 1165,1100"
1020*2d1272b8SAndroid Build Coastguard Worker "Q1165,970 1093,886Q1020,801 881,776L881,766Q1214,709 1214,416"
1021*2d1272b8SAndroid Build Coastguard Worker "Q1214,220 1082,110Q949,0 711,0L201,0L201,1462ZM371,836L651,836"
1022*2d1272b8SAndroid Build Coastguard Worker "Q831,836 910,893Q989,949 989,1083Q989,1206 901,1261"
1023*2d1272b8SAndroid Build Coastguard Worker "Q813,1315 621,1315L371,1315L371,836ZM371,692L371,145L676,145"
1024*2d1272b8SAndroid Build Coastguard Worker "Q853,145 943,214Q1032,282 1032,428Q1032,564 941,628Q849,692 662,692L371,692Z";
1025*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected1, sizeof (expected1) - 1);
1026*2d1272b8SAndroid Build Coastguard Worker
1027*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
1028*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font2, 37, funcs, &draw_data);
1029*2d1272b8SAndroid Build Coastguard Worker char expected2[] = "M402,2924L1228,2924Q1810,2924 2070,2750Q2330,2576 2330,2200"
1030*2d1272b8SAndroid Build Coastguard Worker "Q2330,1940 2185,1771Q2040,1602 1762,1552L1762,1532Q2428,1418 2428,832"
1031*2d1272b8SAndroid Build Coastguard Worker "Q2428,440 2163,220Q1898,0 1422,0L402,0L402,2924ZM742,1672L1302,1672"
1032*2d1272b8SAndroid Build Coastguard Worker "Q1662,1672 1820,1785Q1978,1898 1978,2166Q1978,2412 1802,2521"
1033*2d1272b8SAndroid Build Coastguard Worker "Q1626,2630 1242,2630L742,2630L742,1672ZM742,1384L742,290L1352,290"
1034*2d1272b8SAndroid Build Coastguard Worker "Q1706,290 1885,427Q2064,564 2064,856Q2064,1128 1881,1256Q1698,1384 1324,1384L742,1384Z";
1035*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);
1036*2d1272b8SAndroid Build Coastguard Worker
1037*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font1);
1038*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font2);
1039*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
1040*2d1272b8SAndroid Build Coastguard Worker }
1041*2d1272b8SAndroid Build Coastguard Worker {
1042*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/SourceSansPro-Regular.otf");
1043*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font1 = hb_font_create (face);
1044*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font2 = hb_font_create_sub_font (font1);
1045*2d1272b8SAndroid Build Coastguard Worker
1046*2d1272b8SAndroid Build Coastguard Worker hb_font_get_scale (font1, &x, &y);
1047*2d1272b8SAndroid Build Coastguard Worker hb_font_set_scale (font2, x*2, y*2);
1048*2d1272b8SAndroid Build Coastguard Worker
1049*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
1050*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font1, 5, funcs, &draw_data);
1051*2d1272b8SAndroid Build Coastguard Worker char expected1[] = "M90,0L258,0C456,0 564,122 564,331C564,539 456,656 254,656L90,656L90,0Z"
1052*2d1272b8SAndroid Build Coastguard Worker "M173,68L173,588L248,588C401,588 478,496 478,331C478,165 401,68 248,68L173,68Z";
1053*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected1, sizeof (expected1) - 1);
1054*2d1272b8SAndroid Build Coastguard Worker
1055*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
1056*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font2, 5, funcs, &draw_data);
1057*2d1272b8SAndroid Build Coastguard Worker char expected2[] = "M180,0L516,0C912,0 1128,244 1128,662C1128,1078 912,1312 508,1312L180,1312L180,0Z"
1058*2d1272b8SAndroid Build Coastguard Worker "M346,136L346,1176L496,1176C802,1176 956,992 956,662C956,330 802,136 496,136L346,136Z";
1059*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected2, sizeof (expected2) - 1);
1060*2d1272b8SAndroid Build Coastguard Worker
1061*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font1);
1062*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font2);
1063*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
1064*2d1272b8SAndroid Build Coastguard Worker }
1065*2d1272b8SAndroid Build Coastguard Worker }
1066*2d1272b8SAndroid Build Coastguard Worker
1067*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_immutable(void)1068*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_immutable (void)
1069*2d1272b8SAndroid Build Coastguard Worker {
1070*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_t *draw_funcs = hb_draw_funcs_create ();
1071*2d1272b8SAndroid Build Coastguard Worker g_assert (!hb_draw_funcs_is_immutable (draw_funcs));
1072*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_make_immutable (draw_funcs);
1073*2d1272b8SAndroid Build Coastguard Worker g_assert (hb_draw_funcs_is_immutable (draw_funcs));
1074*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_destroy (draw_funcs);
1075*2d1272b8SAndroid Build Coastguard Worker }
1076*2d1272b8SAndroid Build Coastguard Worker
1077*2d1272b8SAndroid Build Coastguard Worker #ifdef HAVE_FREETYPE
test_hb_draw_ft(void)1078*2d1272b8SAndroid Build Coastguard Worker static void test_hb_draw_ft (void)
1079*2d1272b8SAndroid Build Coastguard Worker {
1080*2d1272b8SAndroid Build Coastguard Worker char str[1024];
1081*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
1082*2d1272b8SAndroid Build Coastguard Worker .str = str,
1083*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str)
1084*2d1272b8SAndroid Build Coastguard Worker };
1085*2d1272b8SAndroid Build Coastguard Worker {
1086*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/glyphs.ttf");
1087*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
1088*2d1272b8SAndroid Build Coastguard Worker hb_ft_font_set_funcs (font);
1089*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
1090*2d1272b8SAndroid Build Coastguard Worker {
1091*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
1092*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 0, funcs, &draw_data);
1093*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M50,0L50,750L450,750L450,0L50,0Z";
1094*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
1095*2d1272b8SAndroid Build Coastguard Worker }
1096*2d1272b8SAndroid Build Coastguard Worker {
1097*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
1098*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 5, funcs, &draw_data);
1099*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M15,0Q15,0 15,0Z";
1100*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
1101*2d1272b8SAndroid Build Coastguard Worker }
1102*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
1103*2d1272b8SAndroid Build Coastguard Worker }
1104*2d1272b8SAndroid Build Coastguard Worker {
1105*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/cff1_flex.otf");
1106*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
1107*2d1272b8SAndroid Build Coastguard Worker hb_ft_font_set_funcs (font);
1108*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
1109*2d1272b8SAndroid Build Coastguard Worker
1110*2d1272b8SAndroid Build Coastguard Worker draw_data.consumed = 0;
1111*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 1, funcs, &draw_data);
1112*2d1272b8SAndroid Build Coastguard Worker char expected[] = "M0,0C100,0 150,-20 250,-20C350,-20 400,0 500,0C500,100 520,150 520,250"
1113*2d1272b8SAndroid Build Coastguard Worker "C520,350 500,400 500,500C400,500 350,520 250,520C150,520 100,500 0,500"
1114*2d1272b8SAndroid Build Coastguard Worker "C0,400 -20,350 -20,250C-20,150 0,100 0,0ZM50,50C50,130 34,170 34,250"
1115*2d1272b8SAndroid Build Coastguard Worker "C34,330 50,370 50,450C130,450 170,466 250,466C330,466 370,450 450,450"
1116*2d1272b8SAndroid Build Coastguard Worker "C450,370 466,330 466,250C466,170 450,130 450,50C370,50 330,34 250,34"
1117*2d1272b8SAndroid Build Coastguard Worker "C170,34 130,50 50,50Z";
1118*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpmem (str, draw_data.consumed, expected, sizeof (expected) - 1);
1119*2d1272b8SAndroid Build Coastguard Worker
1120*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
1121*2d1272b8SAndroid Build Coastguard Worker }
1122*2d1272b8SAndroid Build Coastguard Worker }
1123*2d1272b8SAndroid Build Coastguard Worker
1124*2d1272b8SAndroid Build Coastguard Worker static void
test_hb_draw_compare_ot_ft(void)1125*2d1272b8SAndroid Build Coastguard Worker test_hb_draw_compare_ot_ft (void)
1126*2d1272b8SAndroid Build Coastguard Worker {
1127*2d1272b8SAndroid Build Coastguard Worker char str[1024];
1128*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data = {
1129*2d1272b8SAndroid Build Coastguard Worker .str = str,
1130*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str),
1131*2d1272b8SAndroid Build Coastguard Worker .consumed = 0
1132*2d1272b8SAndroid Build Coastguard Worker };
1133*2d1272b8SAndroid Build Coastguard Worker char str2[1024];
1134*2d1272b8SAndroid Build Coastguard Worker draw_data_t draw_data2 = {
1135*2d1272b8SAndroid Build Coastguard Worker .str = str2,
1136*2d1272b8SAndroid Build Coastguard Worker .size = sizeof (str2),
1137*2d1272b8SAndroid Build Coastguard Worker .consumed = 0
1138*2d1272b8SAndroid Build Coastguard Worker };
1139*2d1272b8SAndroid Build Coastguard Worker
1140*2d1272b8SAndroid Build Coastguard Worker hb_face_t *face = hb_test_open_font_file ("fonts/cff1_flex.otf");
1141*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = hb_font_create (face);
1142*2d1272b8SAndroid Build Coastguard Worker
1143*2d1272b8SAndroid Build Coastguard Worker hb_font_set_scale (font, 100, 100);
1144*2d1272b8SAndroid Build Coastguard Worker
1145*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 1, funcs, &draw_data);
1146*2d1272b8SAndroid Build Coastguard Worker draw_data.str[draw_data.consumed] = '\0';
1147*2d1272b8SAndroid Build Coastguard Worker
1148*2d1272b8SAndroid Build Coastguard Worker hb_ft_font_set_funcs (font);
1149*2d1272b8SAndroid Build Coastguard Worker
1150*2d1272b8SAndroid Build Coastguard Worker hb_font_draw_glyph (font, 1, funcs, &draw_data2);
1151*2d1272b8SAndroid Build Coastguard Worker draw_data2.str[draw_data2.consumed] = '\0';
1152*2d1272b8SAndroid Build Coastguard Worker
1153*2d1272b8SAndroid Build Coastguard Worker g_assert_cmpstr (draw_data.str, ==, draw_data2.str);
1154*2d1272b8SAndroid Build Coastguard Worker
1155*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
1156*2d1272b8SAndroid Build Coastguard Worker hb_face_destroy (face);
1157*2d1272b8SAndroid Build Coastguard Worker }
1158*2d1272b8SAndroid Build Coastguard Worker #endif
1159*2d1272b8SAndroid Build Coastguard Worker
1160*2d1272b8SAndroid Build Coastguard Worker int
main(int argc,char ** argv)1161*2d1272b8SAndroid Build Coastguard Worker main (int argc, char **argv)
1162*2d1272b8SAndroid Build Coastguard Worker {
1163*2d1272b8SAndroid Build Coastguard Worker funcs = hb_draw_funcs_create ();
1164*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_move_to_func (funcs, (hb_draw_move_to_func_t) move_to, NULL, NULL);
1165*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_line_to_func (funcs, (hb_draw_line_to_func_t) line_to, NULL, NULL);
1166*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_quadratic_to_func (funcs, (hb_draw_quadratic_to_func_t) quadratic_to, NULL, NULL);
1167*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_cubic_to_func (funcs, (hb_draw_cubic_to_func_t) cubic_to, NULL, NULL);
1168*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_close_path_func (funcs, (hb_draw_close_path_func_t) close_path, NULL, NULL);
1169*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_make_immutable (funcs);
1170*2d1272b8SAndroid Build Coastguard Worker
1171*2d1272b8SAndroid Build Coastguard Worker funcs2 = hb_draw_funcs_create ();
1172*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_move_to_func (funcs2, (hb_draw_move_to_func_t) move_to, NULL, NULL);
1173*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_line_to_func (funcs2, (hb_draw_line_to_func_t) line_to, NULL, NULL);
1174*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_cubic_to_func (funcs2, (hb_draw_cubic_to_func_t) cubic_to, NULL, NULL);
1175*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_close_path_func (funcs2, (hb_draw_close_path_func_t) close_path, NULL, NULL);
1176*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_make_immutable (funcs2);
1177*2d1272b8SAndroid Build Coastguard Worker
1178*2d1272b8SAndroid Build Coastguard Worker hb_test_init (&argc, &argv);
1179*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_itoa);
1180*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_empty);
1181*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_glyf);
1182*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_cff1);
1183*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_cff1_rline);
1184*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_cff2);
1185*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_ttf_parser_tests);
1186*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_font_kit_glyphs_tests);
1187*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_font_kit_variations_tests);
1188*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_estedad_vf);
1189*2d1272b8SAndroid Build Coastguard Worker if(0) hb_test_add (test_hb_draw_stroking);
1190*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_drawing_funcs);
1191*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_synthetic_slant);
1192*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_subfont_scale);
1193*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_immutable);
1194*2d1272b8SAndroid Build Coastguard Worker #ifdef HAVE_FREETYPE
1195*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_ft);
1196*2d1272b8SAndroid Build Coastguard Worker hb_test_add (test_hb_draw_compare_ot_ft);
1197*2d1272b8SAndroid Build Coastguard Worker #endif
1198*2d1272b8SAndroid Build Coastguard Worker unsigned result = hb_test_run ();
1199*2d1272b8SAndroid Build Coastguard Worker
1200*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_destroy (funcs);
1201*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_destroy (funcs2);
1202*2d1272b8SAndroid Build Coastguard Worker return result;
1203*2d1272b8SAndroid Build Coastguard Worker }
1204