1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2020 Google, Inc.
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 * Google Author(s): Garret Rieger
25*2d1272b8SAndroid Build Coastguard Worker */
26*2d1272b8SAndroid Build Coastguard Worker
27*2d1272b8SAndroid Build Coastguard Worker #include <string>
28*2d1272b8SAndroid Build Coastguard Worker
29*2d1272b8SAndroid Build Coastguard Worker #include "hb-repacker.hh"
30*2d1272b8SAndroid Build Coastguard Worker #include "hb-open-type.hh"
31*2d1272b8SAndroid Build Coastguard Worker #include "graph/serialize.hh"
32*2d1272b8SAndroid Build Coastguard Worker
extend(const char * value,unsigned len,hb_serialize_context_t * c)33*2d1272b8SAndroid Build Coastguard Worker static void extend (const char* value,
34*2d1272b8SAndroid Build Coastguard Worker unsigned len,
35*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
36*2d1272b8SAndroid Build Coastguard Worker {
37*2d1272b8SAndroid Build Coastguard Worker char* obj = c->allocate_size<char> (len);
38*2d1272b8SAndroid Build Coastguard Worker hb_memcpy (obj, value, len);
39*2d1272b8SAndroid Build Coastguard Worker }
40*2d1272b8SAndroid Build Coastguard Worker
start_object(const char * tag,unsigned len,hb_serialize_context_t * c)41*2d1272b8SAndroid Build Coastguard Worker static void start_object(const char* tag,
42*2d1272b8SAndroid Build Coastguard Worker unsigned len,
43*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
44*2d1272b8SAndroid Build Coastguard Worker {
45*2d1272b8SAndroid Build Coastguard Worker c->push ();
46*2d1272b8SAndroid Build Coastguard Worker extend (tag, len, c);
47*2d1272b8SAndroid Build Coastguard Worker }
48*2d1272b8SAndroid Build Coastguard Worker
add_object(const char * tag,unsigned len,hb_serialize_context_t * c)49*2d1272b8SAndroid Build Coastguard Worker static unsigned add_object(const char* tag,
50*2d1272b8SAndroid Build Coastguard Worker unsigned len,
51*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
52*2d1272b8SAndroid Build Coastguard Worker {
53*2d1272b8SAndroid Build Coastguard Worker start_object (tag, len, c);
54*2d1272b8SAndroid Build Coastguard Worker return c->pop_pack (false);
55*2d1272b8SAndroid Build Coastguard Worker }
56*2d1272b8SAndroid Build Coastguard Worker
57*2d1272b8SAndroid Build Coastguard Worker
add_offset(unsigned id,hb_serialize_context_t * c)58*2d1272b8SAndroid Build Coastguard Worker static void add_offset (unsigned id,
59*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
60*2d1272b8SAndroid Build Coastguard Worker {
61*2d1272b8SAndroid Build Coastguard Worker OT::Offset16* offset = c->start_embed<OT::Offset16> ();
62*2d1272b8SAndroid Build Coastguard Worker c->extend_min (offset);
63*2d1272b8SAndroid Build Coastguard Worker c->add_link (*offset, id);
64*2d1272b8SAndroid Build Coastguard Worker }
65*2d1272b8SAndroid Build Coastguard Worker
add_24_offset(unsigned id,hb_serialize_context_t * c)66*2d1272b8SAndroid Build Coastguard Worker static void add_24_offset (unsigned id,
67*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
68*2d1272b8SAndroid Build Coastguard Worker {
69*2d1272b8SAndroid Build Coastguard Worker OT::Offset24* offset = c->start_embed<OT::Offset24> ();
70*2d1272b8SAndroid Build Coastguard Worker c->extend_min (offset);
71*2d1272b8SAndroid Build Coastguard Worker c->add_link (*offset, id);
72*2d1272b8SAndroid Build Coastguard Worker }
73*2d1272b8SAndroid Build Coastguard Worker
add_wide_offset(unsigned id,hb_serialize_context_t * c)74*2d1272b8SAndroid Build Coastguard Worker static void add_wide_offset (unsigned id,
75*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
76*2d1272b8SAndroid Build Coastguard Worker {
77*2d1272b8SAndroid Build Coastguard Worker OT::Offset32* offset = c->start_embed<OT::Offset32> ();
78*2d1272b8SAndroid Build Coastguard Worker c->extend_min (offset);
79*2d1272b8SAndroid Build Coastguard Worker c->add_link (*offset, id);
80*2d1272b8SAndroid Build Coastguard Worker }
81*2d1272b8SAndroid Build Coastguard Worker
add_gsubgpos_header(unsigned lookup_list,hb_serialize_context_t * c)82*2d1272b8SAndroid Build Coastguard Worker static void add_gsubgpos_header (unsigned lookup_list,
83*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
84*2d1272b8SAndroid Build Coastguard Worker {
85*2d1272b8SAndroid Build Coastguard Worker char header[] = {
86*2d1272b8SAndroid Build Coastguard Worker 0, 1, // major
87*2d1272b8SAndroid Build Coastguard Worker 0, 0, // minor
88*2d1272b8SAndroid Build Coastguard Worker 0, 0, // script list
89*2d1272b8SAndroid Build Coastguard Worker 0, 0, // feature list
90*2d1272b8SAndroid Build Coastguard Worker };
91*2d1272b8SAndroid Build Coastguard Worker
92*2d1272b8SAndroid Build Coastguard Worker start_object (header, 8, c);
93*2d1272b8SAndroid Build Coastguard Worker add_offset (lookup_list, c);
94*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
95*2d1272b8SAndroid Build Coastguard Worker }
96*2d1272b8SAndroid Build Coastguard Worker
add_lookup_list(const unsigned * lookups,char count,hb_serialize_context_t * c)97*2d1272b8SAndroid Build Coastguard Worker static unsigned add_lookup_list (const unsigned* lookups,
98*2d1272b8SAndroid Build Coastguard Worker char count,
99*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
100*2d1272b8SAndroid Build Coastguard Worker {
101*2d1272b8SAndroid Build Coastguard Worker char lookup_count[] = {0, count};
102*2d1272b8SAndroid Build Coastguard Worker start_object ((char *) &lookup_count, 2, c);
103*2d1272b8SAndroid Build Coastguard Worker
104*2d1272b8SAndroid Build Coastguard Worker for (int i = 0; i < count; i++)
105*2d1272b8SAndroid Build Coastguard Worker add_offset (lookups[i], c);
106*2d1272b8SAndroid Build Coastguard Worker
107*2d1272b8SAndroid Build Coastguard Worker return c->pop_pack (false);
108*2d1272b8SAndroid Build Coastguard Worker }
109*2d1272b8SAndroid Build Coastguard Worker
start_lookup(int8_t type,int8_t num_subtables,hb_serialize_context_t * c)110*2d1272b8SAndroid Build Coastguard Worker static void start_lookup (int8_t type,
111*2d1272b8SAndroid Build Coastguard Worker int8_t num_subtables,
112*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
113*2d1272b8SAndroid Build Coastguard Worker {
114*2d1272b8SAndroid Build Coastguard Worker char lookup[] = {
115*2d1272b8SAndroid Build Coastguard Worker 0, (char)type, // type
116*2d1272b8SAndroid Build Coastguard Worker 0, 0, // flag
117*2d1272b8SAndroid Build Coastguard Worker 0, (char)num_subtables, // num subtables
118*2d1272b8SAndroid Build Coastguard Worker };
119*2d1272b8SAndroid Build Coastguard Worker
120*2d1272b8SAndroid Build Coastguard Worker start_object (lookup, 6, c);
121*2d1272b8SAndroid Build Coastguard Worker }
122*2d1272b8SAndroid Build Coastguard Worker
finish_lookup(hb_serialize_context_t * c)123*2d1272b8SAndroid Build Coastguard Worker static unsigned finish_lookup (hb_serialize_context_t* c)
124*2d1272b8SAndroid Build Coastguard Worker {
125*2d1272b8SAndroid Build Coastguard Worker char filter[] = {0, 0};
126*2d1272b8SAndroid Build Coastguard Worker extend (filter, 2, c);
127*2d1272b8SAndroid Build Coastguard Worker return c->pop_pack (false);
128*2d1272b8SAndroid Build Coastguard Worker }
129*2d1272b8SAndroid Build Coastguard Worker
add_extension(unsigned child,uint8_t type,hb_serialize_context_t * c)130*2d1272b8SAndroid Build Coastguard Worker static unsigned add_extension (unsigned child,
131*2d1272b8SAndroid Build Coastguard Worker uint8_t type,
132*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
133*2d1272b8SAndroid Build Coastguard Worker {
134*2d1272b8SAndroid Build Coastguard Worker char ext[] = {
135*2d1272b8SAndroid Build Coastguard Worker 0, 1,
136*2d1272b8SAndroid Build Coastguard Worker 0, (char) type,
137*2d1272b8SAndroid Build Coastguard Worker };
138*2d1272b8SAndroid Build Coastguard Worker
139*2d1272b8SAndroid Build Coastguard Worker start_object (ext, 4, c);
140*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (child, c);
141*2d1272b8SAndroid Build Coastguard Worker
142*2d1272b8SAndroid Build Coastguard Worker return c->pop_pack (false);
143*2d1272b8SAndroid Build Coastguard Worker
144*2d1272b8SAndroid Build Coastguard Worker }
145*2d1272b8SAndroid Build Coastguard Worker
146*2d1272b8SAndroid Build Coastguard Worker // Adds coverage table fro [start, end]
add_coverage(unsigned start,unsigned end,hb_serialize_context_t * c)147*2d1272b8SAndroid Build Coastguard Worker static unsigned add_coverage (unsigned start, unsigned end,
148*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
149*2d1272b8SAndroid Build Coastguard Worker {
150*2d1272b8SAndroid Build Coastguard Worker if (end - start == 1)
151*2d1272b8SAndroid Build Coastguard Worker {
152*2d1272b8SAndroid Build Coastguard Worker uint8_t coverage[] = {
153*2d1272b8SAndroid Build Coastguard Worker 0, 1, // format
154*2d1272b8SAndroid Build Coastguard Worker 0, 2, // count
155*2d1272b8SAndroid Build Coastguard Worker
156*2d1272b8SAndroid Build Coastguard Worker (uint8_t) ((start >> 8) & 0xFF),
157*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (start & 0xFF), // glyph[0]
158*2d1272b8SAndroid Build Coastguard Worker
159*2d1272b8SAndroid Build Coastguard Worker (uint8_t) ((end >> 8) & 0xFF),
160*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (end & 0xFF), // glyph[1]
161*2d1272b8SAndroid Build Coastguard Worker };
162*2d1272b8SAndroid Build Coastguard Worker return add_object ((char*) coverage, 8, c);
163*2d1272b8SAndroid Build Coastguard Worker }
164*2d1272b8SAndroid Build Coastguard Worker
165*2d1272b8SAndroid Build Coastguard Worker uint8_t coverage[] = {
166*2d1272b8SAndroid Build Coastguard Worker 0, 2, // format
167*2d1272b8SAndroid Build Coastguard Worker 0, 1, // range count
168*2d1272b8SAndroid Build Coastguard Worker
169*2d1272b8SAndroid Build Coastguard Worker (uint8_t) ((start >> 8) & 0xFF),
170*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (start & 0xFF), // start
171*2d1272b8SAndroid Build Coastguard Worker
172*2d1272b8SAndroid Build Coastguard Worker (uint8_t) ((end >> 8) & 0xFF),
173*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (end & 0xFF), // end
174*2d1272b8SAndroid Build Coastguard Worker
175*2d1272b8SAndroid Build Coastguard Worker 0, 0,
176*2d1272b8SAndroid Build Coastguard Worker };
177*2d1272b8SAndroid Build Coastguard Worker return add_object ((char*) coverage, 10, c);
178*2d1272b8SAndroid Build Coastguard Worker }
179*2d1272b8SAndroid Build Coastguard Worker
180*2d1272b8SAndroid Build Coastguard Worker
181*2d1272b8SAndroid Build Coastguard Worker template<typename It>
add_coverage(It it,hb_serialize_context_t * c)182*2d1272b8SAndroid Build Coastguard Worker static unsigned add_coverage (It it,
183*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
184*2d1272b8SAndroid Build Coastguard Worker {
185*2d1272b8SAndroid Build Coastguard Worker c->push ();
186*2d1272b8SAndroid Build Coastguard Worker OT::Layout::Common::Coverage_serialize (c, it);
187*2d1272b8SAndroid Build Coastguard Worker return c->pop_pack (false);
188*2d1272b8SAndroid Build Coastguard Worker }
189*2d1272b8SAndroid Build Coastguard Worker
190*2d1272b8SAndroid Build Coastguard Worker // Adds a class that maps glyphs from [start_glyph, end_glyph)
191*2d1272b8SAndroid Build Coastguard Worker // to classes 1...n
add_class_def(uint16_t start_glyph,uint16_t end_glyph,hb_serialize_context_t * c)192*2d1272b8SAndroid Build Coastguard Worker static unsigned add_class_def (uint16_t start_glyph,
193*2d1272b8SAndroid Build Coastguard Worker uint16_t end_glyph,
194*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
195*2d1272b8SAndroid Build Coastguard Worker {
196*2d1272b8SAndroid Build Coastguard Worker unsigned count = end_glyph - start_glyph;
197*2d1272b8SAndroid Build Coastguard Worker uint8_t header[] = {
198*2d1272b8SAndroid Build Coastguard Worker 0, 1, // format
199*2d1272b8SAndroid Build Coastguard Worker
200*2d1272b8SAndroid Build Coastguard Worker (uint8_t) ((start_glyph >> 8) & 0xFF),
201*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (start_glyph & 0xFF), // start_glyph
202*2d1272b8SAndroid Build Coastguard Worker
203*2d1272b8SAndroid Build Coastguard Worker (uint8_t) ((count >> 8) & 0xFF),
204*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (count & 0xFF), // count
205*2d1272b8SAndroid Build Coastguard Worker };
206*2d1272b8SAndroid Build Coastguard Worker
207*2d1272b8SAndroid Build Coastguard Worker start_object ((char*) header, 6, c);
208*2d1272b8SAndroid Build Coastguard Worker for (uint16_t i = 1; i <= count; i++)
209*2d1272b8SAndroid Build Coastguard Worker {
210*2d1272b8SAndroid Build Coastguard Worker uint8_t class_value[] = {
211*2d1272b8SAndroid Build Coastguard Worker (uint8_t) ((i >> 8) & 0xFF),
212*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (i & 0xFF), // count
213*2d1272b8SAndroid Build Coastguard Worker };
214*2d1272b8SAndroid Build Coastguard Worker extend ((char*) class_value, 2, c);
215*2d1272b8SAndroid Build Coastguard Worker }
216*2d1272b8SAndroid Build Coastguard Worker
217*2d1272b8SAndroid Build Coastguard Worker return c->pop_pack (false);
218*2d1272b8SAndroid Build Coastguard Worker }
219*2d1272b8SAndroid Build Coastguard Worker
add_pair_pos_1(unsigned * pair_sets,char count,unsigned coverage,hb_serialize_context_t * c)220*2d1272b8SAndroid Build Coastguard Worker static unsigned add_pair_pos_1 (unsigned* pair_sets,
221*2d1272b8SAndroid Build Coastguard Worker char count,
222*2d1272b8SAndroid Build Coastguard Worker unsigned coverage,
223*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
224*2d1272b8SAndroid Build Coastguard Worker {
225*2d1272b8SAndroid Build Coastguard Worker char format[] = {
226*2d1272b8SAndroid Build Coastguard Worker 0, 1
227*2d1272b8SAndroid Build Coastguard Worker };
228*2d1272b8SAndroid Build Coastguard Worker
229*2d1272b8SAndroid Build Coastguard Worker start_object (format, 2, c);
230*2d1272b8SAndroid Build Coastguard Worker add_offset (coverage, c);
231*2d1272b8SAndroid Build Coastguard Worker
232*2d1272b8SAndroid Build Coastguard Worker char value_format[] = {
233*2d1272b8SAndroid Build Coastguard Worker 0, 0,
234*2d1272b8SAndroid Build Coastguard Worker 0, 0,
235*2d1272b8SAndroid Build Coastguard Worker 0, count,
236*2d1272b8SAndroid Build Coastguard Worker };
237*2d1272b8SAndroid Build Coastguard Worker extend (value_format, 6, c);
238*2d1272b8SAndroid Build Coastguard Worker
239*2d1272b8SAndroid Build Coastguard Worker for (char i = 0; i < count; i++)
240*2d1272b8SAndroid Build Coastguard Worker add_offset (pair_sets[(unsigned) i], c);
241*2d1272b8SAndroid Build Coastguard Worker
242*2d1272b8SAndroid Build Coastguard Worker return c->pop_pack (false);
243*2d1272b8SAndroid Build Coastguard Worker }
244*2d1272b8SAndroid Build Coastguard Worker
add_pair_pos_2(unsigned starting_class,unsigned coverage,unsigned class_def_1,uint16_t class_def_1_count,unsigned class_def_2,uint16_t class_def_2_count,unsigned * device_tables,hb_serialize_context_t * c)245*2d1272b8SAndroid Build Coastguard Worker static unsigned add_pair_pos_2 (unsigned starting_class,
246*2d1272b8SAndroid Build Coastguard Worker unsigned coverage,
247*2d1272b8SAndroid Build Coastguard Worker unsigned class_def_1, uint16_t class_def_1_count,
248*2d1272b8SAndroid Build Coastguard Worker unsigned class_def_2, uint16_t class_def_2_count,
249*2d1272b8SAndroid Build Coastguard Worker unsigned* device_tables,
250*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
251*2d1272b8SAndroid Build Coastguard Worker {
252*2d1272b8SAndroid Build Coastguard Worker uint8_t format[] = {
253*2d1272b8SAndroid Build Coastguard Worker 0, 2
254*2d1272b8SAndroid Build Coastguard Worker };
255*2d1272b8SAndroid Build Coastguard Worker
256*2d1272b8SAndroid Build Coastguard Worker start_object ((char*) format, 2, c);
257*2d1272b8SAndroid Build Coastguard Worker add_offset (coverage, c);
258*2d1272b8SAndroid Build Coastguard Worker
259*2d1272b8SAndroid Build Coastguard Worker unsigned num_values = 4;
260*2d1272b8SAndroid Build Coastguard Worker uint8_t format1 = 0x01 | 0x02 | 0x08;
261*2d1272b8SAndroid Build Coastguard Worker uint8_t format2 = 0x04;
262*2d1272b8SAndroid Build Coastguard Worker if (device_tables) {
263*2d1272b8SAndroid Build Coastguard Worker format2 |= 0x20;
264*2d1272b8SAndroid Build Coastguard Worker num_values += 1;
265*2d1272b8SAndroid Build Coastguard Worker }
266*2d1272b8SAndroid Build Coastguard Worker uint8_t value_format[] = {
267*2d1272b8SAndroid Build Coastguard Worker 0, format1,
268*2d1272b8SAndroid Build Coastguard Worker 0, format2,
269*2d1272b8SAndroid Build Coastguard Worker };
270*2d1272b8SAndroid Build Coastguard Worker
271*2d1272b8SAndroid Build Coastguard Worker extend ((char*) value_format, 4, c);
272*2d1272b8SAndroid Build Coastguard Worker
273*2d1272b8SAndroid Build Coastguard Worker add_offset (class_def_1, c);
274*2d1272b8SAndroid Build Coastguard Worker add_offset (class_def_2, c);
275*2d1272b8SAndroid Build Coastguard Worker
276*2d1272b8SAndroid Build Coastguard Worker uint8_t class_counts[] = {
277*2d1272b8SAndroid Build Coastguard Worker (uint8_t) ((class_def_1_count >> 8) & 0xFF),
278*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (class_def_1_count & 0xFF),
279*2d1272b8SAndroid Build Coastguard Worker (uint8_t) ((class_def_2_count >> 8) & 0xFF),
280*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (class_def_2_count & 0xFF),
281*2d1272b8SAndroid Build Coastguard Worker };
282*2d1272b8SAndroid Build Coastguard Worker extend ((char*) class_counts, 4, c);
283*2d1272b8SAndroid Build Coastguard Worker
284*2d1272b8SAndroid Build Coastguard Worker unsigned num_bytes_per_record = class_def_2_count * num_values * 2;
285*2d1272b8SAndroid Build Coastguard Worker uint8_t* record = (uint8_t*) calloc (1, num_bytes_per_record);
286*2d1272b8SAndroid Build Coastguard Worker int device_index = 0;
287*2d1272b8SAndroid Build Coastguard Worker for (uint16_t i = 0; i < class_def_1_count; i++)
288*2d1272b8SAndroid Build Coastguard Worker {
289*2d1272b8SAndroid Build Coastguard Worker
290*2d1272b8SAndroid Build Coastguard Worker for (uint16_t j = 0; j < class_def_2_count; j++)
291*2d1272b8SAndroid Build Coastguard Worker {
292*2d1272b8SAndroid Build Coastguard Worker for (int k = 0; k < 4; k++) {
293*2d1272b8SAndroid Build Coastguard Worker uint8_t value[] = {
294*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (i + starting_class),
295*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (i + starting_class),
296*2d1272b8SAndroid Build Coastguard Worker };
297*2d1272b8SAndroid Build Coastguard Worker extend ((char*) value, 2, c);
298*2d1272b8SAndroid Build Coastguard Worker }
299*2d1272b8SAndroid Build Coastguard Worker
300*2d1272b8SAndroid Build Coastguard Worker if (device_tables) {
301*2d1272b8SAndroid Build Coastguard Worker add_offset (device_tables[device_index++], c);
302*2d1272b8SAndroid Build Coastguard Worker }
303*2d1272b8SAndroid Build Coastguard Worker }
304*2d1272b8SAndroid Build Coastguard Worker }
305*2d1272b8SAndroid Build Coastguard Worker free (record);
306*2d1272b8SAndroid Build Coastguard Worker
307*2d1272b8SAndroid Build Coastguard Worker return c->pop_pack (false);
308*2d1272b8SAndroid Build Coastguard Worker }
309*2d1272b8SAndroid Build Coastguard Worker
add_mark_base_pos_1(unsigned mark_coverage,unsigned base_coverage,unsigned mark_array,unsigned base_array,unsigned class_count,hb_serialize_context_t * c)310*2d1272b8SAndroid Build Coastguard Worker static unsigned add_mark_base_pos_1 (unsigned mark_coverage,
311*2d1272b8SAndroid Build Coastguard Worker unsigned base_coverage,
312*2d1272b8SAndroid Build Coastguard Worker unsigned mark_array,
313*2d1272b8SAndroid Build Coastguard Worker unsigned base_array,
314*2d1272b8SAndroid Build Coastguard Worker unsigned class_count,
315*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
316*2d1272b8SAndroid Build Coastguard Worker {
317*2d1272b8SAndroid Build Coastguard Worker uint8_t format[] = {
318*2d1272b8SAndroid Build Coastguard Worker 0, 1
319*2d1272b8SAndroid Build Coastguard Worker };
320*2d1272b8SAndroid Build Coastguard Worker
321*2d1272b8SAndroid Build Coastguard Worker start_object ((char*) format, 2, c);
322*2d1272b8SAndroid Build Coastguard Worker add_offset (mark_coverage, c);
323*2d1272b8SAndroid Build Coastguard Worker add_offset (base_coverage, c);
324*2d1272b8SAndroid Build Coastguard Worker
325*2d1272b8SAndroid Build Coastguard Worker uint8_t count[] = {
326*2d1272b8SAndroid Build Coastguard Worker (uint8_t) ((class_count >> 8) & 0xFF),
327*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (class_count & 0xFF),
328*2d1272b8SAndroid Build Coastguard Worker };
329*2d1272b8SAndroid Build Coastguard Worker extend ((char*) count, 2, c);
330*2d1272b8SAndroid Build Coastguard Worker
331*2d1272b8SAndroid Build Coastguard Worker add_offset (mark_array, c);
332*2d1272b8SAndroid Build Coastguard Worker add_offset (base_array, c);
333*2d1272b8SAndroid Build Coastguard Worker
334*2d1272b8SAndroid Build Coastguard Worker return c->pop_pack (false);
335*2d1272b8SAndroid Build Coastguard Worker }
336*2d1272b8SAndroid Build Coastguard Worker
337*2d1272b8SAndroid Build Coastguard Worker template<int mark_count,
338*2d1272b8SAndroid Build Coastguard Worker int class_count,
339*2d1272b8SAndroid Build Coastguard Worker int base_count,
340*2d1272b8SAndroid Build Coastguard Worker int table_count>
341*2d1272b8SAndroid Build Coastguard Worker struct MarkBasePosBuffers
342*2d1272b8SAndroid Build Coastguard Worker {
343*2d1272b8SAndroid Build Coastguard Worker unsigned base_anchors[class_count * base_count];
344*2d1272b8SAndroid Build Coastguard Worker unsigned mark_anchors[mark_count];
345*2d1272b8SAndroid Build Coastguard Worker uint8_t anchor_buffers[class_count * base_count + 100];
346*2d1272b8SAndroid Build Coastguard Worker uint8_t class_buffer[class_count * 2];
347*2d1272b8SAndroid Build Coastguard Worker
MarkBasePosBuffersMarkBasePosBuffers348*2d1272b8SAndroid Build Coastguard Worker MarkBasePosBuffers(hb_serialize_context_t* c)
349*2d1272b8SAndroid Build Coastguard Worker {
350*2d1272b8SAndroid Build Coastguard Worker for (unsigned i = 0; i < sizeof(anchor_buffers) / 2; i++)
351*2d1272b8SAndroid Build Coastguard Worker {
352*2d1272b8SAndroid Build Coastguard Worker OT::HBUINT16* value = (OT::HBUINT16*) (&anchor_buffers[2*i]);
353*2d1272b8SAndroid Build Coastguard Worker *value = i;
354*2d1272b8SAndroid Build Coastguard Worker }
355*2d1272b8SAndroid Build Coastguard Worker
356*2d1272b8SAndroid Build Coastguard Worker for (unsigned i = 0; i < class_count * base_count; i++)
357*2d1272b8SAndroid Build Coastguard Worker {
358*2d1272b8SAndroid Build Coastguard Worker base_anchors[i] = add_object ((char*) &anchor_buffers[i], 100, c);
359*2d1272b8SAndroid Build Coastguard Worker if (i < class_count) {
360*2d1272b8SAndroid Build Coastguard Worker class_buffer[i*2] = (uint8_t) ((i >> 8) & 0xFF);
361*2d1272b8SAndroid Build Coastguard Worker class_buffer[i*2 + 1] = (uint8_t) (i & 0xFF);
362*2d1272b8SAndroid Build Coastguard Worker }
363*2d1272b8SAndroid Build Coastguard Worker }
364*2d1272b8SAndroid Build Coastguard Worker
365*2d1272b8SAndroid Build Coastguard Worker for (unsigned i = 0; i < mark_count; i++)
366*2d1272b8SAndroid Build Coastguard Worker {
367*2d1272b8SAndroid Build Coastguard Worker mark_anchors[i] = add_object ((char*) &anchor_buffers[i], 4, c);
368*2d1272b8SAndroid Build Coastguard Worker }
369*2d1272b8SAndroid Build Coastguard Worker }
370*2d1272b8SAndroid Build Coastguard Worker
create_mark_base_pos_1MarkBasePosBuffers371*2d1272b8SAndroid Build Coastguard Worker unsigned create_mark_base_pos_1 (unsigned table_index, hb_serialize_context_t* c)
372*2d1272b8SAndroid Build Coastguard Worker {
373*2d1272b8SAndroid Build Coastguard Worker unsigned class_per_table = class_count / table_count;
374*2d1272b8SAndroid Build Coastguard Worker unsigned mark_per_class = mark_count / class_count;
375*2d1272b8SAndroid Build Coastguard Worker unsigned start_class = class_per_table * table_index;
376*2d1272b8SAndroid Build Coastguard Worker unsigned end_class = class_per_table * (table_index + 1) - 1;
377*2d1272b8SAndroid Build Coastguard Worker
378*2d1272b8SAndroid Build Coastguard Worker // baseArray
379*2d1272b8SAndroid Build Coastguard Worker uint8_t base_count_buffer[] = {
380*2d1272b8SAndroid Build Coastguard Worker (uint8_t) ((base_count >> 8) & 0xFF),
381*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (base_count & 0xFF),
382*2d1272b8SAndroid Build Coastguard Worker
383*2d1272b8SAndroid Build Coastguard Worker };
384*2d1272b8SAndroid Build Coastguard Worker start_object ((char*) base_count_buffer, 2, c);
385*2d1272b8SAndroid Build Coastguard Worker for (unsigned base = 0; base < base_count; base++)
386*2d1272b8SAndroid Build Coastguard Worker {
387*2d1272b8SAndroid Build Coastguard Worker for (unsigned klass = start_class; klass <= end_class; klass++)
388*2d1272b8SAndroid Build Coastguard Worker {
389*2d1272b8SAndroid Build Coastguard Worker unsigned i = base * class_count + klass;
390*2d1272b8SAndroid Build Coastguard Worker add_offset (base_anchors[i], c);
391*2d1272b8SAndroid Build Coastguard Worker }
392*2d1272b8SAndroid Build Coastguard Worker }
393*2d1272b8SAndroid Build Coastguard Worker unsigned base_array = c->pop_pack (false);
394*2d1272b8SAndroid Build Coastguard Worker
395*2d1272b8SAndroid Build Coastguard Worker // markArray
396*2d1272b8SAndroid Build Coastguard Worker unsigned num_marks = class_per_table * mark_per_class;
397*2d1272b8SAndroid Build Coastguard Worker uint8_t mark_count_buffer[] = {
398*2d1272b8SAndroid Build Coastguard Worker (uint8_t) ((num_marks >> 8) & 0xFF),
399*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (num_marks & 0xFF),
400*2d1272b8SAndroid Build Coastguard Worker };
401*2d1272b8SAndroid Build Coastguard Worker start_object ((char*) mark_count_buffer, 2, c);
402*2d1272b8SAndroid Build Coastguard Worker for (unsigned mark = 0; mark < mark_count; mark++)
403*2d1272b8SAndroid Build Coastguard Worker {
404*2d1272b8SAndroid Build Coastguard Worker unsigned klass = mark % class_count;
405*2d1272b8SAndroid Build Coastguard Worker if (klass < start_class || klass > end_class) continue;
406*2d1272b8SAndroid Build Coastguard Worker klass -= start_class;
407*2d1272b8SAndroid Build Coastguard Worker
408*2d1272b8SAndroid Build Coastguard Worker extend ((char*) &class_buffer[2 * klass], 2, c);
409*2d1272b8SAndroid Build Coastguard Worker add_offset (mark_anchors[mark], c);
410*2d1272b8SAndroid Build Coastguard Worker }
411*2d1272b8SAndroid Build Coastguard Worker unsigned mark_array = c->pop_pack (false);
412*2d1272b8SAndroid Build Coastguard Worker
413*2d1272b8SAndroid Build Coastguard Worker // markCoverage
414*2d1272b8SAndroid Build Coastguard Worker auto it =
415*2d1272b8SAndroid Build Coastguard Worker + hb_range ((hb_codepoint_t) mark_count)
416*2d1272b8SAndroid Build Coastguard Worker | hb_filter ([&] (hb_codepoint_t mark) {
417*2d1272b8SAndroid Build Coastguard Worker unsigned klass = mark % class_count;
418*2d1272b8SAndroid Build Coastguard Worker return klass >= class_per_table * table_index &&
419*2d1272b8SAndroid Build Coastguard Worker klass < class_per_table * (table_index + 1);
420*2d1272b8SAndroid Build Coastguard Worker })
421*2d1272b8SAndroid Build Coastguard Worker ;
422*2d1272b8SAndroid Build Coastguard Worker unsigned mark_coverage = add_coverage (it, c);
423*2d1272b8SAndroid Build Coastguard Worker
424*2d1272b8SAndroid Build Coastguard Worker // baseCoverage
425*2d1272b8SAndroid Build Coastguard Worker unsigned base_coverage = add_coverage (10, 10 + base_count - 1, c);
426*2d1272b8SAndroid Build Coastguard Worker
427*2d1272b8SAndroid Build Coastguard Worker return add_mark_base_pos_1 (mark_coverage,
428*2d1272b8SAndroid Build Coastguard Worker base_coverage,
429*2d1272b8SAndroid Build Coastguard Worker mark_array,
430*2d1272b8SAndroid Build Coastguard Worker base_array,
431*2d1272b8SAndroid Build Coastguard Worker class_per_table,
432*2d1272b8SAndroid Build Coastguard Worker c);
433*2d1272b8SAndroid Build Coastguard Worker }
434*2d1272b8SAndroid Build Coastguard Worker };
435*2d1272b8SAndroid Build Coastguard Worker
run_resolve_overflow_test(const char * name,hb_serialize_context_t & overflowing,hb_serialize_context_t & expected,unsigned num_iterations=0,bool recalculate_extensions=false,hb_tag_t tag=HB_TAG ('G','S','U','B'),bool check_binary_equivalence=false)436*2d1272b8SAndroid Build Coastguard Worker static void run_resolve_overflow_test (const char* name,
437*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t& overflowing,
438*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t& expected,
439*2d1272b8SAndroid Build Coastguard Worker unsigned num_iterations = 0,
440*2d1272b8SAndroid Build Coastguard Worker bool recalculate_extensions = false,
441*2d1272b8SAndroid Build Coastguard Worker hb_tag_t tag = HB_TAG ('G', 'S', 'U', 'B'),
442*2d1272b8SAndroid Build Coastguard Worker bool check_binary_equivalence = false)
443*2d1272b8SAndroid Build Coastguard Worker {
444*2d1272b8SAndroid Build Coastguard Worker printf (">>> Testing overflowing resolution for %s\n",
445*2d1272b8SAndroid Build Coastguard Worker name);
446*2d1272b8SAndroid Build Coastguard Worker
447*2d1272b8SAndroid Build Coastguard Worker graph_t graph (overflowing.object_graph ());
448*2d1272b8SAndroid Build Coastguard Worker
449*2d1272b8SAndroid Build Coastguard Worker graph_t expected_graph (expected.object_graph ());
450*2d1272b8SAndroid Build Coastguard Worker if (graph::will_overflow (expected_graph))
451*2d1272b8SAndroid Build Coastguard Worker {
452*2d1272b8SAndroid Build Coastguard Worker if (check_binary_equivalence) {
453*2d1272b8SAndroid Build Coastguard Worker printf("when binary equivalence checking is enabled, the expected graph cannot overflow.");
454*2d1272b8SAndroid Build Coastguard Worker assert(!check_binary_equivalence);
455*2d1272b8SAndroid Build Coastguard Worker }
456*2d1272b8SAndroid Build Coastguard Worker expected_graph.assign_spaces ();
457*2d1272b8SAndroid Build Coastguard Worker expected_graph.sort_shortest_distance ();
458*2d1272b8SAndroid Build Coastguard Worker }
459*2d1272b8SAndroid Build Coastguard Worker
460*2d1272b8SAndroid Build Coastguard Worker // Check that overflow resolution succeeds
461*2d1272b8SAndroid Build Coastguard Worker assert (overflowing.offset_overflow ());
462*2d1272b8SAndroid Build Coastguard Worker assert (hb_resolve_graph_overflows (tag,
463*2d1272b8SAndroid Build Coastguard Worker num_iterations,
464*2d1272b8SAndroid Build Coastguard Worker recalculate_extensions,
465*2d1272b8SAndroid Build Coastguard Worker graph));
466*2d1272b8SAndroid Build Coastguard Worker
467*2d1272b8SAndroid Build Coastguard Worker // Check the graphs can be serialized.
468*2d1272b8SAndroid Build Coastguard Worker hb_blob_t* out1 = graph::serialize (graph);
469*2d1272b8SAndroid Build Coastguard Worker assert (out1);
470*2d1272b8SAndroid Build Coastguard Worker hb_blob_t* out2 = graph::serialize (expected_graph);
471*2d1272b8SAndroid Build Coastguard Worker assert (out2);
472*2d1272b8SAndroid Build Coastguard Worker if (check_binary_equivalence) {
473*2d1272b8SAndroid Build Coastguard Worker unsigned l1, l2;
474*2d1272b8SAndroid Build Coastguard Worker const char* d1 = hb_blob_get_data(out1, &l1);
475*2d1272b8SAndroid Build Coastguard Worker const char* d2 = hb_blob_get_data(out2, &l2);
476*2d1272b8SAndroid Build Coastguard Worker
477*2d1272b8SAndroid Build Coastguard Worker bool match = (l1 == l2) && (memcmp(d1, d2, l1) == 0);
478*2d1272b8SAndroid Build Coastguard Worker if (!match) {
479*2d1272b8SAndroid Build Coastguard Worker printf("## Result:\n");
480*2d1272b8SAndroid Build Coastguard Worker graph.print();
481*2d1272b8SAndroid Build Coastguard Worker printf("## Expected:\n");
482*2d1272b8SAndroid Build Coastguard Worker expected_graph.print();
483*2d1272b8SAndroid Build Coastguard Worker assert(match);
484*2d1272b8SAndroid Build Coastguard Worker }
485*2d1272b8SAndroid Build Coastguard Worker }
486*2d1272b8SAndroid Build Coastguard Worker
487*2d1272b8SAndroid Build Coastguard Worker hb_blob_destroy (out1);
488*2d1272b8SAndroid Build Coastguard Worker hb_blob_destroy (out2);
489*2d1272b8SAndroid Build Coastguard Worker
490*2d1272b8SAndroid Build Coastguard Worker // Check the graphs are equivalent
491*2d1272b8SAndroid Build Coastguard Worker graph.normalize ();
492*2d1272b8SAndroid Build Coastguard Worker expected_graph.normalize ();
493*2d1272b8SAndroid Build Coastguard Worker if (!(graph == expected_graph)) {
494*2d1272b8SAndroid Build Coastguard Worker printf("## Expected:\n");
495*2d1272b8SAndroid Build Coastguard Worker expected_graph.print();
496*2d1272b8SAndroid Build Coastguard Worker printf("## Result:\n");
497*2d1272b8SAndroid Build Coastguard Worker graph.print();
498*2d1272b8SAndroid Build Coastguard Worker }
499*2d1272b8SAndroid Build Coastguard Worker assert (graph == expected_graph);
500*2d1272b8SAndroid Build Coastguard Worker }
501*2d1272b8SAndroid Build Coastguard Worker
add_virtual_offset(unsigned id,hb_serialize_context_t * c)502*2d1272b8SAndroid Build Coastguard Worker static void add_virtual_offset (unsigned id,
503*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t* c)
504*2d1272b8SAndroid Build Coastguard Worker {
505*2d1272b8SAndroid Build Coastguard Worker c->add_virtual_link (id);
506*2d1272b8SAndroid Build Coastguard Worker }
507*2d1272b8SAndroid Build Coastguard Worker
508*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_simple(hb_serialize_context_t * c)509*2d1272b8SAndroid Build Coastguard Worker populate_serializer_simple (hb_serialize_context_t* c)
510*2d1272b8SAndroid Build Coastguard Worker {
511*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
512*2d1272b8SAndroid Build Coastguard Worker
513*2d1272b8SAndroid Build Coastguard Worker unsigned obj_1 = add_object ("ghi", 3, c);
514*2d1272b8SAndroid Build Coastguard Worker unsigned obj_2 = add_object ("def", 3, c);
515*2d1272b8SAndroid Build Coastguard Worker
516*2d1272b8SAndroid Build Coastguard Worker start_object ("abc", 3, c);
517*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_2, c);
518*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_1, c);
519*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
520*2d1272b8SAndroid Build Coastguard Worker
521*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
522*2d1272b8SAndroid Build Coastguard Worker }
523*2d1272b8SAndroid Build Coastguard Worker
524*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_overflow(hb_serialize_context_t * c)525*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_overflow (hb_serialize_context_t* c)
526*2d1272b8SAndroid Build Coastguard Worker {
527*2d1272b8SAndroid Build Coastguard Worker std::string large_string(50000, 'a');
528*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
529*2d1272b8SAndroid Build Coastguard Worker
530*2d1272b8SAndroid Build Coastguard Worker unsigned obj_1 = add_object (large_string.c_str(), 10000, c);
531*2d1272b8SAndroid Build Coastguard Worker unsigned obj_2 = add_object (large_string.c_str(), 20000, c);
532*2d1272b8SAndroid Build Coastguard Worker unsigned obj_3 = add_object (large_string.c_str(), 50000, c);
533*2d1272b8SAndroid Build Coastguard Worker
534*2d1272b8SAndroid Build Coastguard Worker start_object ("abc", 3, c);
535*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_3, c);
536*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_2, c);
537*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_1, c);
538*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
539*2d1272b8SAndroid Build Coastguard Worker
540*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
541*2d1272b8SAndroid Build Coastguard Worker }
542*2d1272b8SAndroid Build Coastguard Worker
543*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_priority_overflow(hb_serialize_context_t * c)544*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_priority_overflow (hb_serialize_context_t* c)
545*2d1272b8SAndroid Build Coastguard Worker {
546*2d1272b8SAndroid Build Coastguard Worker std::string large_string(50000, 'a');
547*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
548*2d1272b8SAndroid Build Coastguard Worker
549*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = add_object ("e", 1, c);
550*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = add_object ("d", 1, c);
551*2d1272b8SAndroid Build Coastguard Worker
552*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 50000, c);
553*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
554*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
555*2d1272b8SAndroid Build Coastguard Worker
556*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 20000, c);
557*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d, c);
558*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
559*2d1272b8SAndroid Build Coastguard Worker
560*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
561*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_b, c);
562*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_c, c);
563*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
564*2d1272b8SAndroid Build Coastguard Worker
565*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
566*2d1272b8SAndroid Build Coastguard Worker }
567*2d1272b8SAndroid Build Coastguard Worker
568*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_priority_overflow_expected(hb_serialize_context_t * c)569*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_priority_overflow_expected (hb_serialize_context_t* c)
570*2d1272b8SAndroid Build Coastguard Worker {
571*2d1272b8SAndroid Build Coastguard Worker std::string large_string(50000, 'a');
572*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
573*2d1272b8SAndroid Build Coastguard Worker
574*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = add_object ("e", 1, c);
575*2d1272b8SAndroid Build Coastguard Worker
576*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 50000, c);
577*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
578*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
579*2d1272b8SAndroid Build Coastguard Worker
580*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = add_object ("d", 1, c);
581*2d1272b8SAndroid Build Coastguard Worker
582*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 20000, c);
583*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d, c);
584*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
585*2d1272b8SAndroid Build Coastguard Worker
586*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
587*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_b, c);
588*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_c, c);
589*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
590*2d1272b8SAndroid Build Coastguard Worker
591*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
592*2d1272b8SAndroid Build Coastguard Worker }
593*2d1272b8SAndroid Build Coastguard Worker
594*2d1272b8SAndroid Build Coastguard Worker
595*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_dedup_overflow(hb_serialize_context_t * c)596*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_dedup_overflow (hb_serialize_context_t* c)
597*2d1272b8SAndroid Build Coastguard Worker {
598*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
599*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
600*2d1272b8SAndroid Build Coastguard Worker
601*2d1272b8SAndroid Build Coastguard Worker unsigned obj_1 = add_object ("def", 3, c);
602*2d1272b8SAndroid Build Coastguard Worker
603*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 60000, c);
604*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_1, c);
605*2d1272b8SAndroid Build Coastguard Worker unsigned obj_2 = c->pop_pack (false);
606*2d1272b8SAndroid Build Coastguard Worker
607*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 10000, c);
608*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_2, c);
609*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_1, c);
610*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
611*2d1272b8SAndroid Build Coastguard Worker
612*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
613*2d1272b8SAndroid Build Coastguard Worker }
614*2d1272b8SAndroid Build Coastguard Worker
615*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_multiple_dedup_overflow(hb_serialize_context_t * c)616*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_multiple_dedup_overflow (hb_serialize_context_t* c)
617*2d1272b8SAndroid Build Coastguard Worker {
618*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
619*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
620*2d1272b8SAndroid Build Coastguard Worker
621*2d1272b8SAndroid Build Coastguard Worker unsigned leaf = add_object("def", 3, c);
622*2d1272b8SAndroid Build Coastguard Worker
623*2d1272b8SAndroid Build Coastguard Worker constexpr unsigned num_mid_nodes = 20;
624*2d1272b8SAndroid Build Coastguard Worker unsigned mid_nodes[num_mid_nodes];
625*2d1272b8SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_mid_nodes; i++) {
626*2d1272b8SAndroid Build Coastguard Worker start_object(large_string.c_str(), 10000 + i, c);
627*2d1272b8SAndroid Build Coastguard Worker add_offset(leaf, c);
628*2d1272b8SAndroid Build Coastguard Worker mid_nodes[i] = c->pop_pack(false);
629*2d1272b8SAndroid Build Coastguard Worker }
630*2d1272b8SAndroid Build Coastguard Worker
631*2d1272b8SAndroid Build Coastguard Worker start_object("abc", 3, c);
632*2d1272b8SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_mid_nodes; i++) {
633*2d1272b8SAndroid Build Coastguard Worker add_wide_offset(mid_nodes[i], c);
634*2d1272b8SAndroid Build Coastguard Worker }
635*2d1272b8SAndroid Build Coastguard Worker c->pop_pack(false);
636*2d1272b8SAndroid Build Coastguard Worker
637*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
638*2d1272b8SAndroid Build Coastguard Worker }
639*2d1272b8SAndroid Build Coastguard Worker
640*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_isolation_overflow(hb_serialize_context_t * c)641*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_isolation_overflow (hb_serialize_context_t* c)
642*2d1272b8SAndroid Build Coastguard Worker {
643*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
644*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
645*2d1272b8SAndroid Build Coastguard Worker
646*2d1272b8SAndroid Build Coastguard Worker unsigned obj_4 = add_object ("4", 1, c);
647*2d1272b8SAndroid Build Coastguard Worker
648*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 60000, c);
649*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_4, c);
650*2d1272b8SAndroid Build Coastguard Worker unsigned obj_3 = c->pop_pack (false);
651*2d1272b8SAndroid Build Coastguard Worker
652*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 10000, c);
653*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_4, c);
654*2d1272b8SAndroid Build Coastguard Worker unsigned obj_2 = c->pop_pack (false);
655*2d1272b8SAndroid Build Coastguard Worker
656*2d1272b8SAndroid Build Coastguard Worker start_object ("1", 1, c);
657*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_3, c);
658*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_2, c);
659*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
660*2d1272b8SAndroid Build Coastguard Worker
661*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
662*2d1272b8SAndroid Build Coastguard Worker }
663*2d1272b8SAndroid Build Coastguard Worker
664*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_isolation_overflow_complex(hb_serialize_context_t * c)665*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_isolation_overflow_complex (hb_serialize_context_t* c)
666*2d1272b8SAndroid Build Coastguard Worker {
667*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
668*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
669*2d1272b8SAndroid Build Coastguard Worker
670*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f = add_object ("f", 1, c);
671*2d1272b8SAndroid Build Coastguard Worker
672*2d1272b8SAndroid Build Coastguard Worker start_object ("e", 1, c);
673*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f, c);
674*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = c->pop_pack (false);
675*2d1272b8SAndroid Build Coastguard Worker
676*2d1272b8SAndroid Build Coastguard Worker start_object ("c", 1, c);
677*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
678*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
679*2d1272b8SAndroid Build Coastguard Worker
680*2d1272b8SAndroid Build Coastguard Worker start_object ("d", 1, c);
681*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
682*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = c->pop_pack (false);
683*2d1272b8SAndroid Build Coastguard Worker
684*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 60000, c);
685*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d, c);
686*2d1272b8SAndroid Build Coastguard Worker unsigned obj_h = c->pop_pack (false);
687*2d1272b8SAndroid Build Coastguard Worker
688*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 60000, c);
689*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_c, c);
690*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_h, c);
691*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
692*2d1272b8SAndroid Build Coastguard Worker
693*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 10000, c);
694*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d, c);
695*2d1272b8SAndroid Build Coastguard Worker unsigned obj_g = c->pop_pack (false);
696*2d1272b8SAndroid Build Coastguard Worker
697*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 11000, c);
698*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d, c);
699*2d1272b8SAndroid Build Coastguard Worker unsigned obj_i = c->pop_pack (false);
700*2d1272b8SAndroid Build Coastguard Worker
701*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
702*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_b, c);
703*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_g, c);
704*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_i, c);
705*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
706*2d1272b8SAndroid Build Coastguard Worker
707*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
708*2d1272b8SAndroid Build Coastguard Worker }
709*2d1272b8SAndroid Build Coastguard Worker
710*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_isolation_overflow_complex_expected(hb_serialize_context_t * c)711*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_isolation_overflow_complex_expected (hb_serialize_context_t* c)
712*2d1272b8SAndroid Build Coastguard Worker {
713*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
714*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
715*2d1272b8SAndroid Build Coastguard Worker
716*2d1272b8SAndroid Build Coastguard Worker
717*2d1272b8SAndroid Build Coastguard Worker // space 1
718*2d1272b8SAndroid Build Coastguard Worker
719*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f_prime = add_object ("f", 1, c);
720*2d1272b8SAndroid Build Coastguard Worker
721*2d1272b8SAndroid Build Coastguard Worker start_object ("e", 1, c);
722*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f_prime, c);
723*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e_prime = c->pop_pack (false);
724*2d1272b8SAndroid Build Coastguard Worker
725*2d1272b8SAndroid Build Coastguard Worker start_object ("d", 1, c);
726*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e_prime, c);
727*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d_prime = c->pop_pack (false);
728*2d1272b8SAndroid Build Coastguard Worker
729*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 60000, c);
730*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d_prime, c);
731*2d1272b8SAndroid Build Coastguard Worker unsigned obj_h = c->pop_pack (false);
732*2d1272b8SAndroid Build Coastguard Worker
733*2d1272b8SAndroid Build Coastguard Worker start_object ("c", 1, c);
734*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e_prime, c);
735*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
736*2d1272b8SAndroid Build Coastguard Worker
737*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 60000, c);
738*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_c, c);
739*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_h, c);
740*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
741*2d1272b8SAndroid Build Coastguard Worker
742*2d1272b8SAndroid Build Coastguard Worker // space 0
743*2d1272b8SAndroid Build Coastguard Worker
744*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f = add_object ("f", 1, c);
745*2d1272b8SAndroid Build Coastguard Worker
746*2d1272b8SAndroid Build Coastguard Worker start_object ("e", 1, c);
747*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f, c);
748*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = c->pop_pack (false);
749*2d1272b8SAndroid Build Coastguard Worker
750*2d1272b8SAndroid Build Coastguard Worker
751*2d1272b8SAndroid Build Coastguard Worker start_object ("d", 1, c);
752*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
753*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = c->pop_pack (false);
754*2d1272b8SAndroid Build Coastguard Worker
755*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 11000, c);
756*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d, c);
757*2d1272b8SAndroid Build Coastguard Worker unsigned obj_i = c->pop_pack (false);
758*2d1272b8SAndroid Build Coastguard Worker
759*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 10000, c);
760*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d, c);
761*2d1272b8SAndroid Build Coastguard Worker unsigned obj_g = c->pop_pack (false);
762*2d1272b8SAndroid Build Coastguard Worker
763*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
764*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_b, c);
765*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_g, c);
766*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_i, c);
767*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
768*2d1272b8SAndroid Build Coastguard Worker
769*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
770*2d1272b8SAndroid Build Coastguard Worker }
771*2d1272b8SAndroid Build Coastguard Worker
772*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_isolation_overflow_spaces(hb_serialize_context_t * c)773*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_isolation_overflow_spaces (hb_serialize_context_t* c)
774*2d1272b8SAndroid Build Coastguard Worker {
775*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
776*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
777*2d1272b8SAndroid Build Coastguard Worker
778*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = add_object ("f", 1, c);
779*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = add_object ("f", 1, c);
780*2d1272b8SAndroid Build Coastguard Worker
781*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 60000, c);
782*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d, c);
783*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack ();
784*2d1272b8SAndroid Build Coastguard Worker
785*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 60000, c);
786*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
787*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack ();
788*2d1272b8SAndroid Build Coastguard Worker
789*2d1272b8SAndroid Build Coastguard Worker
790*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
791*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_b, c);
792*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_c, c);
793*2d1272b8SAndroid Build Coastguard Worker c->pop_pack ();
794*2d1272b8SAndroid Build Coastguard Worker
795*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
796*2d1272b8SAndroid Build Coastguard Worker }
797*2d1272b8SAndroid Build Coastguard Worker
798*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_repack_last(hb_serialize_context_t * c,bool with_overflow)799*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_repack_last (hb_serialize_context_t* c, bool with_overflow)
800*2d1272b8SAndroid Build Coastguard Worker {
801*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'c');
802*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
803*2d1272b8SAndroid Build Coastguard Worker c->push();
804*2d1272b8SAndroid Build Coastguard Worker
805*2d1272b8SAndroid Build Coastguard Worker // Obj E
806*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e_1, obj_e_2;
807*2d1272b8SAndroid Build Coastguard Worker if (with_overflow) {
808*2d1272b8SAndroid Build Coastguard Worker obj_e_1 = add_object("a", 1, c);
809*2d1272b8SAndroid Build Coastguard Worker obj_e_2 = obj_e_1;
810*2d1272b8SAndroid Build Coastguard Worker } else {
811*2d1272b8SAndroid Build Coastguard Worker obj_e_2 = add_object("a", 1, c);
812*2d1272b8SAndroid Build Coastguard Worker }
813*2d1272b8SAndroid Build Coastguard Worker
814*2d1272b8SAndroid Build Coastguard Worker // Obj D
815*2d1272b8SAndroid Build Coastguard Worker c->push();
816*2d1272b8SAndroid Build Coastguard Worker add_offset(obj_e_2, c);
817*2d1272b8SAndroid Build Coastguard Worker extend(large_string.c_str(), 30000, c);
818*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = c->pop_pack(false);
819*2d1272b8SAndroid Build Coastguard Worker
820*2d1272b8SAndroid Build Coastguard Worker add_offset(obj_d, c);
821*2d1272b8SAndroid Build Coastguard Worker assert(c->last_added_child_index() == obj_d);
822*2d1272b8SAndroid Build Coastguard Worker
823*2d1272b8SAndroid Build Coastguard Worker if (!with_overflow) {
824*2d1272b8SAndroid Build Coastguard Worker obj_e_1 = add_object("a", 1, c);
825*2d1272b8SAndroid Build Coastguard Worker }
826*2d1272b8SAndroid Build Coastguard Worker
827*2d1272b8SAndroid Build Coastguard Worker // Obj C
828*2d1272b8SAndroid Build Coastguard Worker c->push();
829*2d1272b8SAndroid Build Coastguard Worker add_offset(obj_e_1, c);
830*2d1272b8SAndroid Build Coastguard Worker extend(large_string.c_str(), 40000, c);
831*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack(false);
832*2d1272b8SAndroid Build Coastguard Worker
833*2d1272b8SAndroid Build Coastguard Worker add_offset(obj_c, c);
834*2d1272b8SAndroid Build Coastguard Worker
835*2d1272b8SAndroid Build Coastguard Worker // Obj B
836*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = add_object("b", 1, c);
837*2d1272b8SAndroid Build Coastguard Worker add_offset(obj_b, c);
838*2d1272b8SAndroid Build Coastguard Worker
839*2d1272b8SAndroid Build Coastguard Worker // Obj A
840*2d1272b8SAndroid Build Coastguard Worker c->repack_last(obj_d);
841*2d1272b8SAndroid Build Coastguard Worker c->pop_pack(false);
842*2d1272b8SAndroid Build Coastguard Worker
843*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
844*2d1272b8SAndroid Build Coastguard Worker }
845*2d1272b8SAndroid Build Coastguard Worker
846*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_spaces(hb_serialize_context_t * c,bool with_overflow)847*2d1272b8SAndroid Build Coastguard Worker populate_serializer_spaces (hb_serialize_context_t* c, bool with_overflow)
848*2d1272b8SAndroid Build Coastguard Worker {
849*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
850*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
851*2d1272b8SAndroid Build Coastguard Worker
852*2d1272b8SAndroid Build Coastguard Worker unsigned obj_i;
853*2d1272b8SAndroid Build Coastguard Worker
854*2d1272b8SAndroid Build Coastguard Worker if (with_overflow)
855*2d1272b8SAndroid Build Coastguard Worker obj_i = add_object ("i", 1, c);
856*2d1272b8SAndroid Build Coastguard Worker
857*2d1272b8SAndroid Build Coastguard Worker // Space 2
858*2d1272b8SAndroid Build Coastguard Worker unsigned obj_h = add_object ("h", 1, c);
859*2d1272b8SAndroid Build Coastguard Worker
860*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 30000, c);
861*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_h, c);
862*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = c->pop_pack (false);
863*2d1272b8SAndroid Build Coastguard Worker
864*2d1272b8SAndroid Build Coastguard Worker start_object ("b", 1, c);
865*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
866*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
867*2d1272b8SAndroid Build Coastguard Worker
868*2d1272b8SAndroid Build Coastguard Worker // Space 1
869*2d1272b8SAndroid Build Coastguard Worker if (!with_overflow)
870*2d1272b8SAndroid Build Coastguard Worker obj_i = add_object ("i", 1, c);
871*2d1272b8SAndroid Build Coastguard Worker
872*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 30000, c);
873*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_i, c);
874*2d1272b8SAndroid Build Coastguard Worker unsigned obj_g = c->pop_pack (false);
875*2d1272b8SAndroid Build Coastguard Worker
876*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 30000, c);
877*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_i, c);
878*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f = c->pop_pack (false);
879*2d1272b8SAndroid Build Coastguard Worker
880*2d1272b8SAndroid Build Coastguard Worker start_object ("d", 1, c);
881*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_g, c);
882*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = c->pop_pack (false);
883*2d1272b8SAndroid Build Coastguard Worker
884*2d1272b8SAndroid Build Coastguard Worker start_object ("c", 1, c);
885*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f, c);
886*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
887*2d1272b8SAndroid Build Coastguard Worker
888*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
889*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_b, c);
890*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_c, c);
891*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_d, c);
892*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
893*2d1272b8SAndroid Build Coastguard Worker
894*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
895*2d1272b8SAndroid Build Coastguard Worker }
896*2d1272b8SAndroid Build Coastguard Worker
897*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_spaces_16bit_connection(hb_serialize_context_t * c)898*2d1272b8SAndroid Build Coastguard Worker populate_serializer_spaces_16bit_connection (hb_serialize_context_t* c)
899*2d1272b8SAndroid Build Coastguard Worker {
900*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
901*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
902*2d1272b8SAndroid Build Coastguard Worker
903*2d1272b8SAndroid Build Coastguard Worker unsigned obj_g = add_object ("g", 1, c);
904*2d1272b8SAndroid Build Coastguard Worker unsigned obj_h = add_object ("h", 1, c);
905*2d1272b8SAndroid Build Coastguard Worker
906*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
907*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_g, c);
908*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = c->pop_pack (false);
909*2d1272b8SAndroid Build Coastguard Worker
910*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
911*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_h, c);
912*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f = c->pop_pack (false);
913*2d1272b8SAndroid Build Coastguard Worker
914*2d1272b8SAndroid Build Coastguard Worker start_object ("c", 1, c);
915*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
916*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
917*2d1272b8SAndroid Build Coastguard Worker
918*2d1272b8SAndroid Build Coastguard Worker start_object ("d", 1, c);
919*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f, c);
920*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = c->pop_pack (false);
921*2d1272b8SAndroid Build Coastguard Worker
922*2d1272b8SAndroid Build Coastguard Worker start_object ("b", 1, c);
923*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
924*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_h, c);
925*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
926*2d1272b8SAndroid Build Coastguard Worker
927*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
928*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_b, c);
929*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_c, c);
930*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_d, c);
931*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
932*2d1272b8SAndroid Build Coastguard Worker
933*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
934*2d1272b8SAndroid Build Coastguard Worker }
935*2d1272b8SAndroid Build Coastguard Worker
936*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_spaces_16bit_connection_expected(hb_serialize_context_t * c)937*2d1272b8SAndroid Build Coastguard Worker populate_serializer_spaces_16bit_connection_expected (hb_serialize_context_t* c)
938*2d1272b8SAndroid Build Coastguard Worker {
939*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
940*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
941*2d1272b8SAndroid Build Coastguard Worker
942*2d1272b8SAndroid Build Coastguard Worker unsigned obj_g_prime = add_object ("g", 1, c);
943*2d1272b8SAndroid Build Coastguard Worker
944*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
945*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_g_prime, c);
946*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e_prime = c->pop_pack (false);
947*2d1272b8SAndroid Build Coastguard Worker
948*2d1272b8SAndroid Build Coastguard Worker start_object ("c", 1, c);
949*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e_prime, c);
950*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
951*2d1272b8SAndroid Build Coastguard Worker
952*2d1272b8SAndroid Build Coastguard Worker unsigned obj_h_prime = add_object ("h", 1, c);
953*2d1272b8SAndroid Build Coastguard Worker
954*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
955*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_h_prime, c);
956*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f = c->pop_pack (false);
957*2d1272b8SAndroid Build Coastguard Worker
958*2d1272b8SAndroid Build Coastguard Worker start_object ("d", 1, c);
959*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f, c);
960*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = c->pop_pack (false);
961*2d1272b8SAndroid Build Coastguard Worker
962*2d1272b8SAndroid Build Coastguard Worker unsigned obj_g = add_object ("g", 1, c);
963*2d1272b8SAndroid Build Coastguard Worker
964*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
965*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_g, c);
966*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = c->pop_pack (false);
967*2d1272b8SAndroid Build Coastguard Worker
968*2d1272b8SAndroid Build Coastguard Worker unsigned obj_h = add_object ("h", 1, c);
969*2d1272b8SAndroid Build Coastguard Worker
970*2d1272b8SAndroid Build Coastguard Worker start_object ("b", 1, c);
971*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
972*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_h, c);
973*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
974*2d1272b8SAndroid Build Coastguard Worker
975*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
976*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_b, c);
977*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_c, c);
978*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_d, c);
979*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
980*2d1272b8SAndroid Build Coastguard Worker
981*2d1272b8SAndroid Build Coastguard Worker c->end_serialize ();
982*2d1272b8SAndroid Build Coastguard Worker }
983*2d1272b8SAndroid Build Coastguard Worker
984*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_short_and_wide_subgraph_root(hb_serialize_context_t * c)985*2d1272b8SAndroid Build Coastguard Worker populate_serializer_short_and_wide_subgraph_root (hb_serialize_context_t* c)
986*2d1272b8SAndroid Build Coastguard Worker {
987*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
988*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
989*2d1272b8SAndroid Build Coastguard Worker
990*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = add_object ("e", 1, c);
991*2d1272b8SAndroid Build Coastguard Worker
992*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
993*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
994*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
995*2d1272b8SAndroid Build Coastguard Worker
996*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
997*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_c, c);
998*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = c->pop_pack (false);
999*2d1272b8SAndroid Build Coastguard Worker
1000*2d1272b8SAndroid Build Coastguard Worker start_object ("b", 1, c);
1001*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_c, c);
1002*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
1003*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
1004*2d1272b8SAndroid Build Coastguard Worker
1005*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
1006*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_b, c);
1007*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_c, c);
1008*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_d, c);
1009*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
1010*2d1272b8SAndroid Build Coastguard Worker
1011*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1012*2d1272b8SAndroid Build Coastguard Worker }
1013*2d1272b8SAndroid Build Coastguard Worker
1014*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_short_and_wide_subgraph_root_expected(hb_serialize_context_t * c)1015*2d1272b8SAndroid Build Coastguard Worker populate_serializer_short_and_wide_subgraph_root_expected (hb_serialize_context_t* c)
1016*2d1272b8SAndroid Build Coastguard Worker {
1017*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
1018*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
1019*2d1272b8SAndroid Build Coastguard Worker
1020*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e_prime = add_object ("e", 1, c);
1021*2d1272b8SAndroid Build Coastguard Worker
1022*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
1023*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e_prime, c);
1024*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c_prime = c->pop_pack (false);
1025*2d1272b8SAndroid Build Coastguard Worker
1026*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
1027*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_c_prime, c);
1028*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = c->pop_pack (false);
1029*2d1272b8SAndroid Build Coastguard Worker
1030*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = add_object ("e", 1, c);
1031*2d1272b8SAndroid Build Coastguard Worker
1032*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
1033*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
1034*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
1035*2d1272b8SAndroid Build Coastguard Worker
1036*2d1272b8SAndroid Build Coastguard Worker
1037*2d1272b8SAndroid Build Coastguard Worker start_object ("b", 1, c);
1038*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_c, c);
1039*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
1040*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
1041*2d1272b8SAndroid Build Coastguard Worker
1042*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
1043*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_b, c);
1044*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_c_prime, c);
1045*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_d, c);
1046*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
1047*2d1272b8SAndroid Build Coastguard Worker
1048*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1049*2d1272b8SAndroid Build Coastguard Worker }
1050*2d1272b8SAndroid Build Coastguard Worker
1051*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_split_spaces(hb_serialize_context_t * c)1052*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_split_spaces (hb_serialize_context_t* c)
1053*2d1272b8SAndroid Build Coastguard Worker {
1054*2d1272b8SAndroid Build Coastguard Worker // Overflow needs to be resolved by splitting the single space
1055*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
1056*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
1057*2d1272b8SAndroid Build Coastguard Worker
1058*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f = add_object ("f", 1, c);
1059*2d1272b8SAndroid Build Coastguard Worker
1060*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 40000, c);
1061*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f, c);
1062*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = c->pop_pack (false);
1063*2d1272b8SAndroid Build Coastguard Worker
1064*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 40000, c);
1065*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f, c);
1066*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = c->pop_pack (false);
1067*2d1272b8SAndroid Build Coastguard Worker
1068*2d1272b8SAndroid Build Coastguard Worker start_object ("b", 1, c);
1069*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d, c);
1070*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
1071*2d1272b8SAndroid Build Coastguard Worker
1072*2d1272b8SAndroid Build Coastguard Worker start_object ("c", 1, c);
1073*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
1074*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
1075*2d1272b8SAndroid Build Coastguard Worker
1076*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
1077*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_b, c);
1078*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_c, c);
1079*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
1080*2d1272b8SAndroid Build Coastguard Worker
1081*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1082*2d1272b8SAndroid Build Coastguard Worker }
1083*2d1272b8SAndroid Build Coastguard Worker
1084*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_split_spaces_2(hb_serialize_context_t * c)1085*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_split_spaces_2 (hb_serialize_context_t* c)
1086*2d1272b8SAndroid Build Coastguard Worker {
1087*2d1272b8SAndroid Build Coastguard Worker // Overflow needs to be resolved by splitting the single space
1088*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
1089*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
1090*2d1272b8SAndroid Build Coastguard Worker
1091*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f = add_object ("f", 1, c);
1092*2d1272b8SAndroid Build Coastguard Worker
1093*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 40000, c);
1094*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f, c);
1095*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = c->pop_pack (false);
1096*2d1272b8SAndroid Build Coastguard Worker
1097*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 40000, c);
1098*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f, c);
1099*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = c->pop_pack (false);
1100*2d1272b8SAndroid Build Coastguard Worker
1101*2d1272b8SAndroid Build Coastguard Worker start_object ("b", 1, c);
1102*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d, c);
1103*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
1104*2d1272b8SAndroid Build Coastguard Worker
1105*2d1272b8SAndroid Build Coastguard Worker start_object ("c", 1, c);
1106*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
1107*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
1108*2d1272b8SAndroid Build Coastguard Worker
1109*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
1110*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_b, c);
1111*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_b, c);
1112*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_c, c);
1113*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
1114*2d1272b8SAndroid Build Coastguard Worker
1115*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1116*2d1272b8SAndroid Build Coastguard Worker }
1117*2d1272b8SAndroid Build Coastguard Worker
1118*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_split_spaces_expected(hb_serialize_context_t * c)1119*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_split_spaces_expected (hb_serialize_context_t* c)
1120*2d1272b8SAndroid Build Coastguard Worker {
1121*2d1272b8SAndroid Build Coastguard Worker // Overflow needs to be resolved by splitting the single space
1122*2d1272b8SAndroid Build Coastguard Worker
1123*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
1124*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
1125*2d1272b8SAndroid Build Coastguard Worker
1126*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f_prime = add_object ("f", 1, c);
1127*2d1272b8SAndroid Build Coastguard Worker
1128*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 40000, c);
1129*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f_prime, c);
1130*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = c->pop_pack (false);
1131*2d1272b8SAndroid Build Coastguard Worker
1132*2d1272b8SAndroid Build Coastguard Worker start_object ("b", 1, c);
1133*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d, c);
1134*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
1135*2d1272b8SAndroid Build Coastguard Worker
1136*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f = add_object ("f", 1, c);
1137*2d1272b8SAndroid Build Coastguard Worker
1138*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 40000, c);
1139*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f, c);
1140*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = c->pop_pack (false);
1141*2d1272b8SAndroid Build Coastguard Worker
1142*2d1272b8SAndroid Build Coastguard Worker start_object ("c", 1, c);
1143*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
1144*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
1145*2d1272b8SAndroid Build Coastguard Worker
1146*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
1147*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_b, c);
1148*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_c, c);
1149*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
1150*2d1272b8SAndroid Build Coastguard Worker
1151*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1152*2d1272b8SAndroid Build Coastguard Worker }
1153*2d1272b8SAndroid Build Coastguard Worker
1154*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_split_spaces_expected_2(hb_serialize_context_t * c)1155*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_split_spaces_expected_2 (hb_serialize_context_t* c)
1156*2d1272b8SAndroid Build Coastguard Worker {
1157*2d1272b8SAndroid Build Coastguard Worker // Overflow needs to be resolved by splitting the single space
1158*2d1272b8SAndroid Build Coastguard Worker
1159*2d1272b8SAndroid Build Coastguard Worker std::string large_string(70000, 'a');
1160*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
1161*2d1272b8SAndroid Build Coastguard Worker
1162*2d1272b8SAndroid Build Coastguard Worker // Space 2
1163*2d1272b8SAndroid Build Coastguard Worker
1164*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f_double_prime = add_object ("f", 1, c);
1165*2d1272b8SAndroid Build Coastguard Worker
1166*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 40000, c);
1167*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f_double_prime, c);
1168*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d_prime = c->pop_pack (false);
1169*2d1272b8SAndroid Build Coastguard Worker
1170*2d1272b8SAndroid Build Coastguard Worker start_object ("b", 1, c);
1171*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d_prime, c);
1172*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b_prime = c->pop_pack (false);
1173*2d1272b8SAndroid Build Coastguard Worker
1174*2d1272b8SAndroid Build Coastguard Worker // Space 1
1175*2d1272b8SAndroid Build Coastguard Worker
1176*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f_prime = add_object ("f", 1, c);
1177*2d1272b8SAndroid Build Coastguard Worker
1178*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 40000, c);
1179*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f_prime, c);
1180*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = c->pop_pack (false);
1181*2d1272b8SAndroid Build Coastguard Worker
1182*2d1272b8SAndroid Build Coastguard Worker start_object ("c", 1, c);
1183*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
1184*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
1185*2d1272b8SAndroid Build Coastguard Worker
1186*2d1272b8SAndroid Build Coastguard Worker // Space 0
1187*2d1272b8SAndroid Build Coastguard Worker
1188*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f = add_object ("f", 1, c);
1189*2d1272b8SAndroid Build Coastguard Worker
1190*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str(), 40000, c);
1191*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f, c);
1192*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = c->pop_pack (false);
1193*2d1272b8SAndroid Build Coastguard Worker
1194*2d1272b8SAndroid Build Coastguard Worker start_object ("b", 1, c);
1195*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d, c);
1196*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
1197*2d1272b8SAndroid Build Coastguard Worker
1198*2d1272b8SAndroid Build Coastguard Worker // Root
1199*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
1200*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_b, c);
1201*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_b_prime, c);
1202*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_c, c);
1203*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
1204*2d1272b8SAndroid Build Coastguard Worker
1205*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1206*2d1272b8SAndroid Build Coastguard Worker }
1207*2d1272b8SAndroid Build Coastguard Worker
1208*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_complex_2(hb_serialize_context_t * c)1209*2d1272b8SAndroid Build Coastguard Worker populate_serializer_complex_2 (hb_serialize_context_t* c)
1210*2d1272b8SAndroid Build Coastguard Worker {
1211*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
1212*2d1272b8SAndroid Build Coastguard Worker
1213*2d1272b8SAndroid Build Coastguard Worker unsigned obj_5 = add_object ("mn", 2, c);
1214*2d1272b8SAndroid Build Coastguard Worker
1215*2d1272b8SAndroid Build Coastguard Worker unsigned obj_4 = add_object ("jkl", 3, c);
1216*2d1272b8SAndroid Build Coastguard Worker
1217*2d1272b8SAndroid Build Coastguard Worker start_object ("ghi", 3, c);
1218*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_4, c);
1219*2d1272b8SAndroid Build Coastguard Worker unsigned obj_3 = c->pop_pack (false);
1220*2d1272b8SAndroid Build Coastguard Worker
1221*2d1272b8SAndroid Build Coastguard Worker start_object ("def", 3, c);
1222*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_3, c);
1223*2d1272b8SAndroid Build Coastguard Worker unsigned obj_2 = c->pop_pack (false);
1224*2d1272b8SAndroid Build Coastguard Worker
1225*2d1272b8SAndroid Build Coastguard Worker start_object ("abc", 3, c);
1226*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_2, c);
1227*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_4, c);
1228*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_5, c);
1229*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
1230*2d1272b8SAndroid Build Coastguard Worker
1231*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1232*2d1272b8SAndroid Build Coastguard Worker }
1233*2d1272b8SAndroid Build Coastguard Worker
1234*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_complex_3(hb_serialize_context_t * c)1235*2d1272b8SAndroid Build Coastguard Worker populate_serializer_complex_3 (hb_serialize_context_t* c)
1236*2d1272b8SAndroid Build Coastguard Worker {
1237*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
1238*2d1272b8SAndroid Build Coastguard Worker
1239*2d1272b8SAndroid Build Coastguard Worker unsigned obj_6 = add_object ("opqrst", 6, c);
1240*2d1272b8SAndroid Build Coastguard Worker
1241*2d1272b8SAndroid Build Coastguard Worker unsigned obj_5 = add_object ("mn", 2, c);
1242*2d1272b8SAndroid Build Coastguard Worker
1243*2d1272b8SAndroid Build Coastguard Worker start_object ("jkl", 3, c);
1244*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_6, c);
1245*2d1272b8SAndroid Build Coastguard Worker unsigned obj_4 = c->pop_pack (false);
1246*2d1272b8SAndroid Build Coastguard Worker
1247*2d1272b8SAndroid Build Coastguard Worker start_object ("ghi", 3, c);
1248*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_4, c);
1249*2d1272b8SAndroid Build Coastguard Worker unsigned obj_3 = c->pop_pack (false);
1250*2d1272b8SAndroid Build Coastguard Worker
1251*2d1272b8SAndroid Build Coastguard Worker start_object ("def", 3, c);
1252*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_3, c);
1253*2d1272b8SAndroid Build Coastguard Worker unsigned obj_2 = c->pop_pack (false);
1254*2d1272b8SAndroid Build Coastguard Worker
1255*2d1272b8SAndroid Build Coastguard Worker start_object ("abc", 3, c);
1256*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_2, c);
1257*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_4, c);
1258*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_5, c);
1259*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
1260*2d1272b8SAndroid Build Coastguard Worker
1261*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1262*2d1272b8SAndroid Build Coastguard Worker }
1263*2d1272b8SAndroid Build Coastguard Worker
1264*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_virtual_link(hb_serialize_context_t * c)1265*2d1272b8SAndroid Build Coastguard Worker populate_serializer_virtual_link (hb_serialize_context_t* c)
1266*2d1272b8SAndroid Build Coastguard Worker {
1267*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
1268*2d1272b8SAndroid Build Coastguard Worker
1269*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = add_object ("d", 1, c);
1270*2d1272b8SAndroid Build Coastguard Worker
1271*2d1272b8SAndroid Build Coastguard Worker start_object ("b", 1, c);
1272*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d, c);
1273*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
1274*2d1272b8SAndroid Build Coastguard Worker
1275*2d1272b8SAndroid Build Coastguard Worker start_object ("e", 1, c);
1276*2d1272b8SAndroid Build Coastguard Worker add_virtual_offset (obj_b, c);
1277*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = c->pop_pack (false);
1278*2d1272b8SAndroid Build Coastguard Worker
1279*2d1272b8SAndroid Build Coastguard Worker start_object ("c", 1, c);
1280*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_e, c);
1281*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
1282*2d1272b8SAndroid Build Coastguard Worker
1283*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
1284*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_b, c);
1285*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_c, c);
1286*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
1287*2d1272b8SAndroid Build Coastguard Worker
1288*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1289*2d1272b8SAndroid Build Coastguard Worker }
1290*2d1272b8SAndroid Build Coastguard Worker
1291*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_24_and_32_bit_offsets(hb_serialize_context_t * c)1292*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_24_and_32_bit_offsets (hb_serialize_context_t* c)
1293*2d1272b8SAndroid Build Coastguard Worker {
1294*2d1272b8SAndroid Build Coastguard Worker std::string large_string(60000, 'a');
1295*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
1296*2d1272b8SAndroid Build Coastguard Worker
1297*2d1272b8SAndroid Build Coastguard Worker unsigned obj_f = add_object ("f", 1, c);
1298*2d1272b8SAndroid Build Coastguard Worker unsigned obj_g = add_object ("g", 1, c);
1299*2d1272b8SAndroid Build Coastguard Worker unsigned obj_j = add_object ("j", 1, c);
1300*2d1272b8SAndroid Build Coastguard Worker unsigned obj_k = add_object ("k", 1, c);
1301*2d1272b8SAndroid Build Coastguard Worker
1302*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
1303*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_f, c);
1304*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = c->pop_pack (false);
1305*2d1272b8SAndroid Build Coastguard Worker
1306*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
1307*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_g, c);
1308*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d = c->pop_pack (false);
1309*2d1272b8SAndroid Build Coastguard Worker
1310*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
1311*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_j, c);
1312*2d1272b8SAndroid Build Coastguard Worker unsigned obj_h = c->pop_pack (false);
1313*2d1272b8SAndroid Build Coastguard Worker
1314*2d1272b8SAndroid Build Coastguard Worker start_object (large_string.c_str (), 40000, c);
1315*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_k, c);
1316*2d1272b8SAndroid Build Coastguard Worker unsigned obj_i = c->pop_pack (false);
1317*2d1272b8SAndroid Build Coastguard Worker
1318*2d1272b8SAndroid Build Coastguard Worker start_object ("e", 1, c);
1319*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_h, c);
1320*2d1272b8SAndroid Build Coastguard Worker add_wide_offset (obj_i, c);
1321*2d1272b8SAndroid Build Coastguard Worker unsigned obj_e = c->pop_pack (false);
1322*2d1272b8SAndroid Build Coastguard Worker
1323*2d1272b8SAndroid Build Coastguard Worker start_object ("b", 1, c);
1324*2d1272b8SAndroid Build Coastguard Worker add_24_offset (obj_c, c);
1325*2d1272b8SAndroid Build Coastguard Worker add_24_offset (obj_d, c);
1326*2d1272b8SAndroid Build Coastguard Worker add_24_offset (obj_e, c);
1327*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = c->pop_pack (false);
1328*2d1272b8SAndroid Build Coastguard Worker
1329*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, c);
1330*2d1272b8SAndroid Build Coastguard Worker add_24_offset (obj_b, c);
1331*2d1272b8SAndroid Build Coastguard Worker c->pop_pack (false);
1332*2d1272b8SAndroid Build Coastguard Worker
1333*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1334*2d1272b8SAndroid Build Coastguard Worker }
1335*2d1272b8SAndroid Build Coastguard Worker
1336*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_extension_promotion(hb_serialize_context_t * c,int num_extensions=0,bool shared_subtables=false)1337*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_extension_promotion (hb_serialize_context_t* c,
1338*2d1272b8SAndroid Build Coastguard Worker int num_extensions = 0,
1339*2d1272b8SAndroid Build Coastguard Worker bool shared_subtables = false)
1340*2d1272b8SAndroid Build Coastguard Worker {
1341*2d1272b8SAndroid Build Coastguard Worker constexpr int num_lookups = 5;
1342*2d1272b8SAndroid Build Coastguard Worker constexpr int num_subtables = num_lookups * 2;
1343*2d1272b8SAndroid Build Coastguard Worker unsigned int lookups[num_lookups];
1344*2d1272b8SAndroid Build Coastguard Worker unsigned int subtables[num_subtables];
1345*2d1272b8SAndroid Build Coastguard Worker unsigned int extensions[num_subtables];
1346*2d1272b8SAndroid Build Coastguard Worker
1347*2d1272b8SAndroid Build Coastguard Worker std::string large_string(60000, 'a');
1348*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
1349*2d1272b8SAndroid Build Coastguard Worker
1350*2d1272b8SAndroid Build Coastguard Worker
1351*2d1272b8SAndroid Build Coastguard Worker for (int i = num_subtables - 1; i >= 0; i--)
1352*2d1272b8SAndroid Build Coastguard Worker subtables[i] = add_object(large_string.c_str (), 15000 + i, c);
1353*2d1272b8SAndroid Build Coastguard Worker
1354*2d1272b8SAndroid Build Coastguard Worker for (int i = num_subtables - 1;
1355*2d1272b8SAndroid Build Coastguard Worker i >= (num_lookups - num_extensions) * 2;
1356*2d1272b8SAndroid Build Coastguard Worker i--)
1357*2d1272b8SAndroid Build Coastguard Worker {
1358*2d1272b8SAndroid Build Coastguard Worker extensions[i] = add_extension (subtables[i], 5, c);
1359*2d1272b8SAndroid Build Coastguard Worker }
1360*2d1272b8SAndroid Build Coastguard Worker
1361*2d1272b8SAndroid Build Coastguard Worker for (int i = num_lookups - 1; i >= 0; i--)
1362*2d1272b8SAndroid Build Coastguard Worker {
1363*2d1272b8SAndroid Build Coastguard Worker bool is_ext = (i >= (num_lookups - num_extensions));
1364*2d1272b8SAndroid Build Coastguard Worker
1365*2d1272b8SAndroid Build Coastguard Worker start_lookup (is_ext ? (char) 7 : (char) 5,
1366*2d1272b8SAndroid Build Coastguard Worker shared_subtables && i > 2 ? 3 : 2,
1367*2d1272b8SAndroid Build Coastguard Worker c);
1368*2d1272b8SAndroid Build Coastguard Worker
1369*2d1272b8SAndroid Build Coastguard Worker if (is_ext) {
1370*2d1272b8SAndroid Build Coastguard Worker if (shared_subtables && i > 2) {
1371*2d1272b8SAndroid Build Coastguard Worker add_offset (extensions[i * 2 - 1], c);
1372*2d1272b8SAndroid Build Coastguard Worker }
1373*2d1272b8SAndroid Build Coastguard Worker add_offset (extensions[i * 2], c);
1374*2d1272b8SAndroid Build Coastguard Worker add_offset (extensions[i * 2 + 1], c);
1375*2d1272b8SAndroid Build Coastguard Worker } else {
1376*2d1272b8SAndroid Build Coastguard Worker if (shared_subtables && i > 2) {
1377*2d1272b8SAndroid Build Coastguard Worker add_offset (subtables[i * 2 - 1], c);
1378*2d1272b8SAndroid Build Coastguard Worker }
1379*2d1272b8SAndroid Build Coastguard Worker add_offset (subtables[i * 2], c);
1380*2d1272b8SAndroid Build Coastguard Worker add_offset (subtables[i * 2 + 1], c);
1381*2d1272b8SAndroid Build Coastguard Worker }
1382*2d1272b8SAndroid Build Coastguard Worker
1383*2d1272b8SAndroid Build Coastguard Worker lookups[i] = finish_lookup (c);
1384*2d1272b8SAndroid Build Coastguard Worker }
1385*2d1272b8SAndroid Build Coastguard Worker
1386*2d1272b8SAndroid Build Coastguard Worker unsigned lookup_list = add_lookup_list (lookups, num_lookups, c);
1387*2d1272b8SAndroid Build Coastguard Worker
1388*2d1272b8SAndroid Build Coastguard Worker add_gsubgpos_header (lookup_list, c);
1389*2d1272b8SAndroid Build Coastguard Worker
1390*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1391*2d1272b8SAndroid Build Coastguard Worker }
1392*2d1272b8SAndroid Build Coastguard Worker
1393*2d1272b8SAndroid Build Coastguard Worker template<int num_pair_pos_1, int num_pair_set>
1394*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_large_pair_pos_1(hb_serialize_context_t * c,bool as_extension=false)1395*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_pair_pos_1 (hb_serialize_context_t* c,
1396*2d1272b8SAndroid Build Coastguard Worker bool as_extension = false)
1397*2d1272b8SAndroid Build Coastguard Worker {
1398*2d1272b8SAndroid Build Coastguard Worker std::string large_string(60000, 'a');
1399*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
1400*2d1272b8SAndroid Build Coastguard Worker
1401*2d1272b8SAndroid Build Coastguard Worker constexpr int total_pair_set = num_pair_pos_1 * num_pair_set;
1402*2d1272b8SAndroid Build Coastguard Worker unsigned pair_set[total_pair_set];
1403*2d1272b8SAndroid Build Coastguard Worker unsigned coverage[num_pair_pos_1];
1404*2d1272b8SAndroid Build Coastguard Worker unsigned pair_pos_1[num_pair_pos_1];
1405*2d1272b8SAndroid Build Coastguard Worker
1406*2d1272b8SAndroid Build Coastguard Worker for (int i = num_pair_pos_1 - 1; i >= 0; i--)
1407*2d1272b8SAndroid Build Coastguard Worker {
1408*2d1272b8SAndroid Build Coastguard Worker for (int j = (i + 1) * num_pair_set - 1; j >= i * num_pair_set; j--)
1409*2d1272b8SAndroid Build Coastguard Worker pair_set[j] = add_object (large_string.c_str (), 30000 + j, c);
1410*2d1272b8SAndroid Build Coastguard Worker
1411*2d1272b8SAndroid Build Coastguard Worker coverage[i] = add_coverage (i * num_pair_set,
1412*2d1272b8SAndroid Build Coastguard Worker (i + 1) * num_pair_set - 1, c);
1413*2d1272b8SAndroid Build Coastguard Worker
1414*2d1272b8SAndroid Build Coastguard Worker pair_pos_1[i] = add_pair_pos_1 (&pair_set[i * num_pair_set],
1415*2d1272b8SAndroid Build Coastguard Worker num_pair_set,
1416*2d1272b8SAndroid Build Coastguard Worker coverage[i],
1417*2d1272b8SAndroid Build Coastguard Worker c);
1418*2d1272b8SAndroid Build Coastguard Worker }
1419*2d1272b8SAndroid Build Coastguard Worker
1420*2d1272b8SAndroid Build Coastguard Worker unsigned pair_pos_2 = add_object (large_string.c_str(), 200, c);
1421*2d1272b8SAndroid Build Coastguard Worker
1422*2d1272b8SAndroid Build Coastguard Worker if (as_extension) {
1423*2d1272b8SAndroid Build Coastguard Worker pair_pos_2 = add_extension (pair_pos_2, 2, c);
1424*2d1272b8SAndroid Build Coastguard Worker for (int i = num_pair_pos_1 - 1; i >= 0; i--)
1425*2d1272b8SAndroid Build Coastguard Worker pair_pos_1[i] = add_extension (pair_pos_1[i], 2, c);
1426*2d1272b8SAndroid Build Coastguard Worker }
1427*2d1272b8SAndroid Build Coastguard Worker
1428*2d1272b8SAndroid Build Coastguard Worker start_lookup (as_extension ? 9 : 2, 1 + num_pair_pos_1, c);
1429*2d1272b8SAndroid Build Coastguard Worker
1430*2d1272b8SAndroid Build Coastguard Worker for (int i = 0; i < num_pair_pos_1; i++)
1431*2d1272b8SAndroid Build Coastguard Worker add_offset (pair_pos_1[i], c);
1432*2d1272b8SAndroid Build Coastguard Worker add_offset (pair_pos_2, c);
1433*2d1272b8SAndroid Build Coastguard Worker
1434*2d1272b8SAndroid Build Coastguard Worker unsigned lookup = finish_lookup (c);
1435*2d1272b8SAndroid Build Coastguard Worker
1436*2d1272b8SAndroid Build Coastguard Worker unsigned lookup_list = add_lookup_list (&lookup, 1, c);
1437*2d1272b8SAndroid Build Coastguard Worker
1438*2d1272b8SAndroid Build Coastguard Worker add_gsubgpos_header (lookup_list, c);
1439*2d1272b8SAndroid Build Coastguard Worker
1440*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1441*2d1272b8SAndroid Build Coastguard Worker }
1442*2d1272b8SAndroid Build Coastguard Worker
1443*2d1272b8SAndroid Build Coastguard Worker template<int num_pair_pos_2, int num_class_1, int num_class_2>
1444*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_large_pair_pos_2(hb_serialize_context_t * c,bool as_extension=false,bool with_device_tables=false,bool extra_table=true)1445*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_pair_pos_2 (hb_serialize_context_t* c,
1446*2d1272b8SAndroid Build Coastguard Worker bool as_extension = false,
1447*2d1272b8SAndroid Build Coastguard Worker bool with_device_tables = false,
1448*2d1272b8SAndroid Build Coastguard Worker bool extra_table = true)
1449*2d1272b8SAndroid Build Coastguard Worker {
1450*2d1272b8SAndroid Build Coastguard Worker std::string large_string(100000, 'a');
1451*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
1452*2d1272b8SAndroid Build Coastguard Worker
1453*2d1272b8SAndroid Build Coastguard Worker unsigned coverage[num_pair_pos_2];
1454*2d1272b8SAndroid Build Coastguard Worker unsigned class_def_1[num_pair_pos_2];
1455*2d1272b8SAndroid Build Coastguard Worker unsigned class_def_2[num_pair_pos_2];
1456*2d1272b8SAndroid Build Coastguard Worker unsigned pair_pos_2[num_pair_pos_2];
1457*2d1272b8SAndroid Build Coastguard Worker
1458*2d1272b8SAndroid Build Coastguard Worker unsigned* device_tables = (unsigned*) calloc (num_pair_pos_2 * num_class_1 * num_class_2,
1459*2d1272b8SAndroid Build Coastguard Worker sizeof(unsigned));
1460*2d1272b8SAndroid Build Coastguard Worker
1461*2d1272b8SAndroid Build Coastguard Worker // Total glyphs = num_class_1 * num_pair_pos_2
1462*2d1272b8SAndroid Build Coastguard Worker for (int i = num_pair_pos_2 - 1; i >= 0; i--)
1463*2d1272b8SAndroid Build Coastguard Worker {
1464*2d1272b8SAndroid Build Coastguard Worker unsigned start_glyph = 5 + i * num_class_1;
1465*2d1272b8SAndroid Build Coastguard Worker if (num_class_2 >= num_class_1)
1466*2d1272b8SAndroid Build Coastguard Worker {
1467*2d1272b8SAndroid Build Coastguard Worker class_def_2[i] = add_class_def (11,
1468*2d1272b8SAndroid Build Coastguard Worker 10 + num_class_2, c);
1469*2d1272b8SAndroid Build Coastguard Worker class_def_1[i] = add_class_def (start_glyph + 1,
1470*2d1272b8SAndroid Build Coastguard Worker start_glyph + num_class_1,
1471*2d1272b8SAndroid Build Coastguard Worker c);
1472*2d1272b8SAndroid Build Coastguard Worker } else {
1473*2d1272b8SAndroid Build Coastguard Worker class_def_1[i] = add_class_def (start_glyph + 1,
1474*2d1272b8SAndroid Build Coastguard Worker start_glyph + num_class_1,
1475*2d1272b8SAndroid Build Coastguard Worker c);
1476*2d1272b8SAndroid Build Coastguard Worker class_def_2[i] = add_class_def (11,
1477*2d1272b8SAndroid Build Coastguard Worker 10 + num_class_2, c);
1478*2d1272b8SAndroid Build Coastguard Worker }
1479*2d1272b8SAndroid Build Coastguard Worker
1480*2d1272b8SAndroid Build Coastguard Worker coverage[i] = add_coverage (start_glyph,
1481*2d1272b8SAndroid Build Coastguard Worker start_glyph + num_class_1 - 1,
1482*2d1272b8SAndroid Build Coastguard Worker c);
1483*2d1272b8SAndroid Build Coastguard Worker
1484*2d1272b8SAndroid Build Coastguard Worker if (with_device_tables)
1485*2d1272b8SAndroid Build Coastguard Worker {
1486*2d1272b8SAndroid Build Coastguard Worker for(int j = (i + 1) * num_class_1 * num_class_2 - 1;
1487*2d1272b8SAndroid Build Coastguard Worker j >= i * num_class_1 * num_class_2;
1488*2d1272b8SAndroid Build Coastguard Worker j--)
1489*2d1272b8SAndroid Build Coastguard Worker {
1490*2d1272b8SAndroid Build Coastguard Worker uint8_t table[] = {
1491*2d1272b8SAndroid Build Coastguard Worker (uint8_t) ((j >> 8) & 0xFF),
1492*2d1272b8SAndroid Build Coastguard Worker (uint8_t) (j & 0xFF),
1493*2d1272b8SAndroid Build Coastguard Worker };
1494*2d1272b8SAndroid Build Coastguard Worker device_tables[j] = add_object ((char*) table, 2, c);
1495*2d1272b8SAndroid Build Coastguard Worker }
1496*2d1272b8SAndroid Build Coastguard Worker }
1497*2d1272b8SAndroid Build Coastguard Worker
1498*2d1272b8SAndroid Build Coastguard Worker pair_pos_2[i] = add_pair_pos_2 (1 + i * num_class_1,
1499*2d1272b8SAndroid Build Coastguard Worker coverage[i],
1500*2d1272b8SAndroid Build Coastguard Worker class_def_1[i], num_class_1,
1501*2d1272b8SAndroid Build Coastguard Worker class_def_2[i], num_class_2,
1502*2d1272b8SAndroid Build Coastguard Worker with_device_tables
1503*2d1272b8SAndroid Build Coastguard Worker ? &device_tables[i * num_class_1 * num_class_2]
1504*2d1272b8SAndroid Build Coastguard Worker : nullptr,
1505*2d1272b8SAndroid Build Coastguard Worker c);
1506*2d1272b8SAndroid Build Coastguard Worker }
1507*2d1272b8SAndroid Build Coastguard Worker
1508*2d1272b8SAndroid Build Coastguard Worker
1509*2d1272b8SAndroid Build Coastguard Worker unsigned pair_pos_1 = 0;
1510*2d1272b8SAndroid Build Coastguard Worker if (extra_table) pair_pos_1 = add_object (large_string.c_str(), 100000, c);
1511*2d1272b8SAndroid Build Coastguard Worker
1512*2d1272b8SAndroid Build Coastguard Worker if (as_extension) {
1513*2d1272b8SAndroid Build Coastguard Worker for (int i = num_pair_pos_2 - 1; i >= 0; i--)
1514*2d1272b8SAndroid Build Coastguard Worker pair_pos_2[i] = add_extension (pair_pos_2[i], 2, c);
1515*2d1272b8SAndroid Build Coastguard Worker
1516*2d1272b8SAndroid Build Coastguard Worker if (extra_table)
1517*2d1272b8SAndroid Build Coastguard Worker pair_pos_1 = add_extension (pair_pos_1, 2, c);
1518*2d1272b8SAndroid Build Coastguard Worker }
1519*2d1272b8SAndroid Build Coastguard Worker
1520*2d1272b8SAndroid Build Coastguard Worker start_lookup (as_extension ? 9 : 2, 1 + num_pair_pos_2, c);
1521*2d1272b8SAndroid Build Coastguard Worker
1522*2d1272b8SAndroid Build Coastguard Worker if (extra_table)
1523*2d1272b8SAndroid Build Coastguard Worker add_offset (pair_pos_1, c);
1524*2d1272b8SAndroid Build Coastguard Worker
1525*2d1272b8SAndroid Build Coastguard Worker for (int i = 0; i < num_pair_pos_2; i++)
1526*2d1272b8SAndroid Build Coastguard Worker add_offset (pair_pos_2[i], c);
1527*2d1272b8SAndroid Build Coastguard Worker
1528*2d1272b8SAndroid Build Coastguard Worker unsigned lookup = finish_lookup (c);
1529*2d1272b8SAndroid Build Coastguard Worker
1530*2d1272b8SAndroid Build Coastguard Worker unsigned lookup_list = add_lookup_list (&lookup, 1, c);
1531*2d1272b8SAndroid Build Coastguard Worker
1532*2d1272b8SAndroid Build Coastguard Worker add_gsubgpos_header (lookup_list, c);
1533*2d1272b8SAndroid Build Coastguard Worker
1534*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1535*2d1272b8SAndroid Build Coastguard Worker
1536*2d1272b8SAndroid Build Coastguard Worker free (device_tables);
1537*2d1272b8SAndroid Build Coastguard Worker }
1538*2d1272b8SAndroid Build Coastguard Worker
1539*2d1272b8SAndroid Build Coastguard Worker template<int mark_count,
1540*2d1272b8SAndroid Build Coastguard Worker int class_count,
1541*2d1272b8SAndroid Build Coastguard Worker int base_count,
1542*2d1272b8SAndroid Build Coastguard Worker int table_count>
1543*2d1272b8SAndroid Build Coastguard Worker static void
populate_serializer_with_large_mark_base_pos_1(hb_serialize_context_t * c)1544*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_mark_base_pos_1 (hb_serialize_context_t* c)
1545*2d1272b8SAndroid Build Coastguard Worker {
1546*2d1272b8SAndroid Build Coastguard Worker c->start_serialize<char> ();
1547*2d1272b8SAndroid Build Coastguard Worker
1548*2d1272b8SAndroid Build Coastguard Worker MarkBasePosBuffers<mark_count, class_count, base_count, table_count> buffers (c);
1549*2d1272b8SAndroid Build Coastguard Worker
1550*2d1272b8SAndroid Build Coastguard Worker unsigned mark_base_pos[table_count];
1551*2d1272b8SAndroid Build Coastguard Worker for (unsigned i = 0; i < table_count; i++)
1552*2d1272b8SAndroid Build Coastguard Worker mark_base_pos[i] = buffers.create_mark_base_pos_1 (i, c);
1553*2d1272b8SAndroid Build Coastguard Worker
1554*2d1272b8SAndroid Build Coastguard Worker for (int i = 0; i < table_count; i++)
1555*2d1272b8SAndroid Build Coastguard Worker mark_base_pos[i] = add_extension (mark_base_pos[i], 4, c);
1556*2d1272b8SAndroid Build Coastguard Worker
1557*2d1272b8SAndroid Build Coastguard Worker start_lookup (9, table_count, c);
1558*2d1272b8SAndroid Build Coastguard Worker
1559*2d1272b8SAndroid Build Coastguard Worker for (int i = 0; i < table_count; i++)
1560*2d1272b8SAndroid Build Coastguard Worker add_offset (mark_base_pos[i], c);
1561*2d1272b8SAndroid Build Coastguard Worker
1562*2d1272b8SAndroid Build Coastguard Worker unsigned lookup = finish_lookup (c);
1563*2d1272b8SAndroid Build Coastguard Worker
1564*2d1272b8SAndroid Build Coastguard Worker unsigned lookup_list = add_lookup_list (&lookup, 1, c);
1565*2d1272b8SAndroid Build Coastguard Worker
1566*2d1272b8SAndroid Build Coastguard Worker add_gsubgpos_header (lookup_list, c);
1567*2d1272b8SAndroid Build Coastguard Worker
1568*2d1272b8SAndroid Build Coastguard Worker c->end_serialize();
1569*2d1272b8SAndroid Build Coastguard Worker }
1570*2d1272b8SAndroid Build Coastguard Worker
test_sort_shortest()1571*2d1272b8SAndroid Build Coastguard Worker static void test_sort_shortest ()
1572*2d1272b8SAndroid Build Coastguard Worker {
1573*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 100;
1574*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1575*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1576*2d1272b8SAndroid Build Coastguard Worker populate_serializer_complex_2 (&c);
1577*2d1272b8SAndroid Build Coastguard Worker
1578*2d1272b8SAndroid Build Coastguard Worker graph_t graph (c.object_graph ());
1579*2d1272b8SAndroid Build Coastguard Worker graph.sort_shortest_distance ();
1580*2d1272b8SAndroid Build Coastguard Worker assert (!graph.in_error ());
1581*2d1272b8SAndroid Build Coastguard Worker
1582*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (4).head, "abc", 3) == 0);
1583*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (4).real_links.length == 3);
1584*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (4).real_links[0].objidx == 2);
1585*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (4).real_links[1].objidx == 0);
1586*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (4).real_links[2].objidx == 3);
1587*2d1272b8SAndroid Build Coastguard Worker
1588*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (3).head, "mn", 2) == 0);
1589*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (3).real_links.length == 0);
1590*2d1272b8SAndroid Build Coastguard Worker
1591*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (2).head, "def", 3) == 0);
1592*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (2).real_links.length == 1);
1593*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (2).real_links[0].objidx == 1);
1594*2d1272b8SAndroid Build Coastguard Worker
1595*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (1).head, "ghi", 3) == 0);
1596*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (1).real_links.length == 1);
1597*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (1).real_links[0].objidx == 0);
1598*2d1272b8SAndroid Build Coastguard Worker
1599*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (0).head, "jkl", 3) == 0);
1600*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (0).real_links.length == 0);
1601*2d1272b8SAndroid Build Coastguard Worker
1602*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1603*2d1272b8SAndroid Build Coastguard Worker }
1604*2d1272b8SAndroid Build Coastguard Worker
test_duplicate_leaf()1605*2d1272b8SAndroid Build Coastguard Worker static void test_duplicate_leaf ()
1606*2d1272b8SAndroid Build Coastguard Worker {
1607*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 100;
1608*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1609*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1610*2d1272b8SAndroid Build Coastguard Worker populate_serializer_complex_2 (&c);
1611*2d1272b8SAndroid Build Coastguard Worker
1612*2d1272b8SAndroid Build Coastguard Worker graph_t graph (c.object_graph ());
1613*2d1272b8SAndroid Build Coastguard Worker graph.duplicate (4, 1);
1614*2d1272b8SAndroid Build Coastguard Worker
1615*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (5).head, "abc", 3) == 0);
1616*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (5).real_links.length == 3);
1617*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (5).real_links[0].objidx == 3);
1618*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (5).real_links[1].objidx == 4);
1619*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (5).real_links[2].objidx == 0);
1620*2d1272b8SAndroid Build Coastguard Worker
1621*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (4).head, "jkl", 3) == 0);
1622*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (4).real_links.length == 0);
1623*2d1272b8SAndroid Build Coastguard Worker
1624*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (3).head, "def", 3) == 0);
1625*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (3).real_links.length == 1);
1626*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (3).real_links[0].objidx == 2);
1627*2d1272b8SAndroid Build Coastguard Worker
1628*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (2).head, "ghi", 3) == 0);
1629*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (2).real_links.length == 1);
1630*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (2).real_links[0].objidx == 1);
1631*2d1272b8SAndroid Build Coastguard Worker
1632*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (1).head, "jkl", 3) == 0);
1633*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (1).real_links.length == 0);
1634*2d1272b8SAndroid Build Coastguard Worker
1635*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (0).head, "mn", 2) == 0);
1636*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (0).real_links.length == 0);
1637*2d1272b8SAndroid Build Coastguard Worker
1638*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1639*2d1272b8SAndroid Build Coastguard Worker }
1640*2d1272b8SAndroid Build Coastguard Worker
test_duplicate_interior()1641*2d1272b8SAndroid Build Coastguard Worker static void test_duplicate_interior ()
1642*2d1272b8SAndroid Build Coastguard Worker {
1643*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 100;
1644*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1645*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1646*2d1272b8SAndroid Build Coastguard Worker populate_serializer_complex_3 (&c);
1647*2d1272b8SAndroid Build Coastguard Worker
1648*2d1272b8SAndroid Build Coastguard Worker graph_t graph (c.object_graph ());
1649*2d1272b8SAndroid Build Coastguard Worker graph.duplicate (3, 2);
1650*2d1272b8SAndroid Build Coastguard Worker
1651*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (6).head, "abc", 3) == 0);
1652*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (6).real_links.length == 3);
1653*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (6).real_links[0].objidx == 4);
1654*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (6).real_links[1].objidx == 2);
1655*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (6).real_links[2].objidx == 1);
1656*2d1272b8SAndroid Build Coastguard Worker
1657*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (5).head, "jkl", 3) == 0);
1658*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (5).real_links.length == 1);
1659*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (5).real_links[0].objidx == 0);
1660*2d1272b8SAndroid Build Coastguard Worker
1661*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (4).head, "def", 3) == 0);
1662*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (4).real_links.length == 1);
1663*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (4).real_links[0].objidx == 3);
1664*2d1272b8SAndroid Build Coastguard Worker
1665*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (3).head, "ghi", 3) == 0);
1666*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (3).real_links.length == 1);
1667*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (3).real_links[0].objidx == 5);
1668*2d1272b8SAndroid Build Coastguard Worker
1669*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (2).head, "jkl", 3) == 0);
1670*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (2).real_links.length == 1);
1671*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (2).real_links[0].objidx == 0);
1672*2d1272b8SAndroid Build Coastguard Worker
1673*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (1).head, "mn", 2) == 0);
1674*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (1).real_links.length == 0);
1675*2d1272b8SAndroid Build Coastguard Worker
1676*2d1272b8SAndroid Build Coastguard Worker assert(strncmp (graph.object (0).head, "opqrst", 6) == 0);
1677*2d1272b8SAndroid Build Coastguard Worker assert(graph.object (0).real_links.length == 0);
1678*2d1272b8SAndroid Build Coastguard Worker
1679*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1680*2d1272b8SAndroid Build Coastguard Worker }
1681*2d1272b8SAndroid Build Coastguard Worker
1682*2d1272b8SAndroid Build Coastguard Worker static void
test_serialize()1683*2d1272b8SAndroid Build Coastguard Worker test_serialize ()
1684*2d1272b8SAndroid Build Coastguard Worker {
1685*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 100;
1686*2d1272b8SAndroid Build Coastguard Worker void* buffer_1 = malloc (buffer_size);
1687*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c1 (buffer_1, buffer_size);
1688*2d1272b8SAndroid Build Coastguard Worker populate_serializer_simple (&c1);
1689*2d1272b8SAndroid Build Coastguard Worker hb_bytes_t expected = c1.copy_bytes ();
1690*2d1272b8SAndroid Build Coastguard Worker
1691*2d1272b8SAndroid Build Coastguard Worker graph_t graph (c1.object_graph ());
1692*2d1272b8SAndroid Build Coastguard Worker hb_blob_t* out = graph::serialize (graph);
1693*2d1272b8SAndroid Build Coastguard Worker free (buffer_1);
1694*2d1272b8SAndroid Build Coastguard Worker
1695*2d1272b8SAndroid Build Coastguard Worker hb_bytes_t actual = out->as_bytes ();
1696*2d1272b8SAndroid Build Coastguard Worker assert (actual == expected);
1697*2d1272b8SAndroid Build Coastguard Worker expected.fini ();
1698*2d1272b8SAndroid Build Coastguard Worker hb_blob_destroy (out);
1699*2d1272b8SAndroid Build Coastguard Worker }
1700*2d1272b8SAndroid Build Coastguard Worker
test_will_overflow_1()1701*2d1272b8SAndroid Build Coastguard Worker static void test_will_overflow_1 ()
1702*2d1272b8SAndroid Build Coastguard Worker {
1703*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 100;
1704*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1705*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1706*2d1272b8SAndroid Build Coastguard Worker populate_serializer_complex_2 (&c);
1707*2d1272b8SAndroid Build Coastguard Worker graph_t graph (c.object_graph ());
1708*2d1272b8SAndroid Build Coastguard Worker
1709*2d1272b8SAndroid Build Coastguard Worker assert (!graph::will_overflow (graph, nullptr));
1710*2d1272b8SAndroid Build Coastguard Worker
1711*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1712*2d1272b8SAndroid Build Coastguard Worker }
1713*2d1272b8SAndroid Build Coastguard Worker
test_will_overflow_2()1714*2d1272b8SAndroid Build Coastguard Worker static void test_will_overflow_2 ()
1715*2d1272b8SAndroid Build Coastguard Worker {
1716*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 160000;
1717*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1718*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1719*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_overflow (&c);
1720*2d1272b8SAndroid Build Coastguard Worker graph_t graph (c.object_graph ());
1721*2d1272b8SAndroid Build Coastguard Worker
1722*2d1272b8SAndroid Build Coastguard Worker assert (graph::will_overflow (graph, nullptr));
1723*2d1272b8SAndroid Build Coastguard Worker
1724*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1725*2d1272b8SAndroid Build Coastguard Worker }
1726*2d1272b8SAndroid Build Coastguard Worker
test_will_overflow_3()1727*2d1272b8SAndroid Build Coastguard Worker static void test_will_overflow_3 ()
1728*2d1272b8SAndroid Build Coastguard Worker {
1729*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 160000;
1730*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1731*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1732*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_dedup_overflow (&c);
1733*2d1272b8SAndroid Build Coastguard Worker graph_t graph (c.object_graph ());
1734*2d1272b8SAndroid Build Coastguard Worker
1735*2d1272b8SAndroid Build Coastguard Worker assert (graph::will_overflow (graph, nullptr));
1736*2d1272b8SAndroid Build Coastguard Worker
1737*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1738*2d1272b8SAndroid Build Coastguard Worker }
1739*2d1272b8SAndroid Build Coastguard Worker
test_resolve_overflows_via_sort()1740*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_overflows_via_sort ()
1741*2d1272b8SAndroid Build Coastguard Worker {
1742*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 160000;
1743*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1744*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1745*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_overflow (&c);
1746*2d1272b8SAndroid Build Coastguard Worker graph_t graph (c.object_graph ());
1747*2d1272b8SAndroid Build Coastguard Worker
1748*2d1272b8SAndroid Build Coastguard Worker hb_blob_t* out = hb_resolve_overflows (c.object_graph (), HB_TAG_NONE);
1749*2d1272b8SAndroid Build Coastguard Worker assert (out);
1750*2d1272b8SAndroid Build Coastguard Worker hb_bytes_t result = out->as_bytes ();
1751*2d1272b8SAndroid Build Coastguard Worker assert (result.length == (80000 + 3 + 3 * 2));
1752*2d1272b8SAndroid Build Coastguard Worker
1753*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1754*2d1272b8SAndroid Build Coastguard Worker hb_blob_destroy (out);
1755*2d1272b8SAndroid Build Coastguard Worker }
1756*2d1272b8SAndroid Build Coastguard Worker
test_resolve_overflows_via_duplication()1757*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_overflows_via_duplication ()
1758*2d1272b8SAndroid Build Coastguard Worker {
1759*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 160000;
1760*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1761*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1762*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_dedup_overflow (&c);
1763*2d1272b8SAndroid Build Coastguard Worker graph_t graph (c.object_graph ());
1764*2d1272b8SAndroid Build Coastguard Worker
1765*2d1272b8SAndroid Build Coastguard Worker hb_blob_t* out = hb_resolve_overflows (c.object_graph (), HB_TAG_NONE);
1766*2d1272b8SAndroid Build Coastguard Worker assert (out);
1767*2d1272b8SAndroid Build Coastguard Worker hb_bytes_t result = out->as_bytes ();
1768*2d1272b8SAndroid Build Coastguard Worker assert (result.length == (10000 + 2 * 2 + 60000 + 2 + 3 * 2));
1769*2d1272b8SAndroid Build Coastguard Worker
1770*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1771*2d1272b8SAndroid Build Coastguard Worker hb_blob_destroy (out);
1772*2d1272b8SAndroid Build Coastguard Worker }
1773*2d1272b8SAndroid Build Coastguard Worker
test_resolve_overflows_via_multiple_duplications()1774*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_overflows_via_multiple_duplications ()
1775*2d1272b8SAndroid Build Coastguard Worker {
1776*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 300000;
1777*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1778*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1779*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_multiple_dedup_overflow (&c);
1780*2d1272b8SAndroid Build Coastguard Worker graph_t graph (c.object_graph ());
1781*2d1272b8SAndroid Build Coastguard Worker
1782*2d1272b8SAndroid Build Coastguard Worker hb_blob_t* out = hb_resolve_overflows (c.object_graph (), HB_TAG_NONE, 5);
1783*2d1272b8SAndroid Build Coastguard Worker assert (out);
1784*2d1272b8SAndroid Build Coastguard Worker
1785*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1786*2d1272b8SAndroid Build Coastguard Worker hb_blob_destroy (out);
1787*2d1272b8SAndroid Build Coastguard Worker }
1788*2d1272b8SAndroid Build Coastguard Worker
test_resolve_overflows_via_space_assignment()1789*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_overflows_via_space_assignment ()
1790*2d1272b8SAndroid Build Coastguard Worker {
1791*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 160000;
1792*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1793*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1794*2d1272b8SAndroid Build Coastguard Worker populate_serializer_spaces (&c, true);
1795*2d1272b8SAndroid Build Coastguard Worker
1796*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
1797*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
1798*2d1272b8SAndroid Build Coastguard Worker populate_serializer_spaces (&e, false);
1799*2d1272b8SAndroid Build Coastguard Worker
1800*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_overflows_via_space_assignment",
1801*2d1272b8SAndroid Build Coastguard Worker c,
1802*2d1272b8SAndroid Build Coastguard Worker e);
1803*2d1272b8SAndroid Build Coastguard Worker
1804*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1805*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
1806*2d1272b8SAndroid Build Coastguard Worker }
1807*2d1272b8SAndroid Build Coastguard Worker
test_resolve_overflows_via_isolation()1808*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_overflows_via_isolation ()
1809*2d1272b8SAndroid Build Coastguard Worker {
1810*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 160000;
1811*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1812*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1813*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_isolation_overflow (&c);
1814*2d1272b8SAndroid Build Coastguard Worker graph_t graph (c.object_graph ());
1815*2d1272b8SAndroid Build Coastguard Worker
1816*2d1272b8SAndroid Build Coastguard Worker assert (c.offset_overflow ());
1817*2d1272b8SAndroid Build Coastguard Worker hb_blob_t* out = hb_resolve_overflows (c.object_graph (), HB_TAG ('G', 'S', 'U', 'B'), 0);
1818*2d1272b8SAndroid Build Coastguard Worker assert (out);
1819*2d1272b8SAndroid Build Coastguard Worker hb_bytes_t result = out->as_bytes ();
1820*2d1272b8SAndroid Build Coastguard Worker assert (result.length == (1 + 10000 + 60000 + 1 + 1
1821*2d1272b8SAndroid Build Coastguard Worker + 4 + 3 * 2));
1822*2d1272b8SAndroid Build Coastguard Worker
1823*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1824*2d1272b8SAndroid Build Coastguard Worker hb_blob_destroy (out);
1825*2d1272b8SAndroid Build Coastguard Worker }
1826*2d1272b8SAndroid Build Coastguard Worker
test_resolve_overflows_via_isolation_with_recursive_duplication()1827*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_overflows_via_isolation_with_recursive_duplication ()
1828*2d1272b8SAndroid Build Coastguard Worker {
1829*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 160000;
1830*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1831*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1832*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_isolation_overflow_complex (&c);
1833*2d1272b8SAndroid Build Coastguard Worker
1834*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
1835*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
1836*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_isolation_overflow_complex_expected (&e);
1837*2d1272b8SAndroid Build Coastguard Worker
1838*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_overflows_via_isolation_with_recursive_duplication",
1839*2d1272b8SAndroid Build Coastguard Worker c,
1840*2d1272b8SAndroid Build Coastguard Worker e);
1841*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1842*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
1843*2d1272b8SAndroid Build Coastguard Worker }
1844*2d1272b8SAndroid Build Coastguard Worker
test_resolve_overflows_via_isolating_16bit_space()1845*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_overflows_via_isolating_16bit_space ()
1846*2d1272b8SAndroid Build Coastguard Worker {
1847*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 160000;
1848*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1849*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1850*2d1272b8SAndroid Build Coastguard Worker populate_serializer_spaces_16bit_connection (&c);
1851*2d1272b8SAndroid Build Coastguard Worker
1852*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
1853*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
1854*2d1272b8SAndroid Build Coastguard Worker populate_serializer_spaces_16bit_connection_expected (&e);
1855*2d1272b8SAndroid Build Coastguard Worker
1856*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_overflows_via_isolating_16bit_space",
1857*2d1272b8SAndroid Build Coastguard Worker c,
1858*2d1272b8SAndroid Build Coastguard Worker e);
1859*2d1272b8SAndroid Build Coastguard Worker
1860*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1861*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
1862*2d1272b8SAndroid Build Coastguard Worker }
1863*2d1272b8SAndroid Build Coastguard Worker
test_resolve_overflows_via_isolating_16bit_space_2()1864*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_overflows_via_isolating_16bit_space_2 ()
1865*2d1272b8SAndroid Build Coastguard Worker {
1866*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 160000;
1867*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1868*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1869*2d1272b8SAndroid Build Coastguard Worker populate_serializer_short_and_wide_subgraph_root (&c);
1870*2d1272b8SAndroid Build Coastguard Worker
1871*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
1872*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
1873*2d1272b8SAndroid Build Coastguard Worker populate_serializer_short_and_wide_subgraph_root_expected (&e);
1874*2d1272b8SAndroid Build Coastguard Worker
1875*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_overflows_via_isolating_16bit_space_2",
1876*2d1272b8SAndroid Build Coastguard Worker c,
1877*2d1272b8SAndroid Build Coastguard Worker e);
1878*2d1272b8SAndroid Build Coastguard Worker
1879*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1880*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
1881*2d1272b8SAndroid Build Coastguard Worker }
1882*2d1272b8SAndroid Build Coastguard Worker
test_resolve_overflows_via_isolation_spaces()1883*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_overflows_via_isolation_spaces ()
1884*2d1272b8SAndroid Build Coastguard Worker {
1885*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 160000;
1886*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1887*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1888*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_isolation_overflow_spaces (&c);
1889*2d1272b8SAndroid Build Coastguard Worker graph_t graph (c.object_graph ());
1890*2d1272b8SAndroid Build Coastguard Worker
1891*2d1272b8SAndroid Build Coastguard Worker assert (c.offset_overflow ());
1892*2d1272b8SAndroid Build Coastguard Worker hb_blob_t* out = hb_resolve_overflows (c.object_graph (), HB_TAG ('G', 'S', 'U', 'B'), 0);
1893*2d1272b8SAndroid Build Coastguard Worker assert (out);
1894*2d1272b8SAndroid Build Coastguard Worker hb_bytes_t result = out->as_bytes ();
1895*2d1272b8SAndroid Build Coastguard Worker
1896*2d1272b8SAndroid Build Coastguard Worker unsigned expected_length = 3 + 2 * 60000; // objects
1897*2d1272b8SAndroid Build Coastguard Worker expected_length += 2 * 4 + 2 * 2; // links
1898*2d1272b8SAndroid Build Coastguard Worker assert (result.length == expected_length);
1899*2d1272b8SAndroid Build Coastguard Worker
1900*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1901*2d1272b8SAndroid Build Coastguard Worker hb_blob_destroy (out);
1902*2d1272b8SAndroid Build Coastguard Worker }
1903*2d1272b8SAndroid Build Coastguard Worker
test_resolve_mixed_overflows_via_isolation_spaces()1904*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_mixed_overflows_via_isolation_spaces ()
1905*2d1272b8SAndroid Build Coastguard Worker {
1906*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 200000;
1907*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1908*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1909*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_24_and_32_bit_offsets (&c);
1910*2d1272b8SAndroid Build Coastguard Worker graph_t graph (c.object_graph ());
1911*2d1272b8SAndroid Build Coastguard Worker
1912*2d1272b8SAndroid Build Coastguard Worker assert (c.offset_overflow ());
1913*2d1272b8SAndroid Build Coastguard Worker hb_blob_t* out = hb_resolve_overflows (c.object_graph (), HB_TAG ('G', 'S', 'U', 'B'), 0);
1914*2d1272b8SAndroid Build Coastguard Worker assert (out);
1915*2d1272b8SAndroid Build Coastguard Worker hb_bytes_t result = out->as_bytes ();
1916*2d1272b8SAndroid Build Coastguard Worker
1917*2d1272b8SAndroid Build Coastguard Worker unsigned expected_length =
1918*2d1272b8SAndroid Build Coastguard Worker // Objects
1919*2d1272b8SAndroid Build Coastguard Worker 7 +
1920*2d1272b8SAndroid Build Coastguard Worker 4 * 40000;
1921*2d1272b8SAndroid Build Coastguard Worker
1922*2d1272b8SAndroid Build Coastguard Worker expected_length +=
1923*2d1272b8SAndroid Build Coastguard Worker // Links
1924*2d1272b8SAndroid Build Coastguard Worker 2 * 4 + // 32
1925*2d1272b8SAndroid Build Coastguard Worker 4 * 3 + // 24
1926*2d1272b8SAndroid Build Coastguard Worker 4 * 2; // 16
1927*2d1272b8SAndroid Build Coastguard Worker
1928*2d1272b8SAndroid Build Coastguard Worker assert (result.length == expected_length);
1929*2d1272b8SAndroid Build Coastguard Worker
1930*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1931*2d1272b8SAndroid Build Coastguard Worker hb_blob_destroy (out);
1932*2d1272b8SAndroid Build Coastguard Worker }
1933*2d1272b8SAndroid Build Coastguard Worker
test_resolve_with_extension_promotion()1934*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_with_extension_promotion ()
1935*2d1272b8SAndroid Build Coastguard Worker {
1936*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 200000;
1937*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1938*2d1272b8SAndroid Build Coastguard Worker assert (buffer);
1939*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1940*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_extension_promotion (&c);
1941*2d1272b8SAndroid Build Coastguard Worker
1942*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
1943*2d1272b8SAndroid Build Coastguard Worker assert (expected_buffer);
1944*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
1945*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_extension_promotion (&e, 3);
1946*2d1272b8SAndroid Build Coastguard Worker
1947*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_with_extension_promotion",
1948*2d1272b8SAndroid Build Coastguard Worker c,
1949*2d1272b8SAndroid Build Coastguard Worker e,
1950*2d1272b8SAndroid Build Coastguard Worker 20,
1951*2d1272b8SAndroid Build Coastguard Worker true);
1952*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1953*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
1954*2d1272b8SAndroid Build Coastguard Worker }
1955*2d1272b8SAndroid Build Coastguard Worker
test_resolve_with_shared_extension_promotion()1956*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_with_shared_extension_promotion ()
1957*2d1272b8SAndroid Build Coastguard Worker {
1958*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 200000;
1959*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1960*2d1272b8SAndroid Build Coastguard Worker assert (buffer);
1961*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1962*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_extension_promotion (&c, 0, true);
1963*2d1272b8SAndroid Build Coastguard Worker
1964*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
1965*2d1272b8SAndroid Build Coastguard Worker assert (expected_buffer);
1966*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
1967*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_extension_promotion (&e, 3, true);
1968*2d1272b8SAndroid Build Coastguard Worker
1969*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_with_extension_promotion",
1970*2d1272b8SAndroid Build Coastguard Worker c,
1971*2d1272b8SAndroid Build Coastguard Worker e,
1972*2d1272b8SAndroid Build Coastguard Worker 20,
1973*2d1272b8SAndroid Build Coastguard Worker true);
1974*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1975*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
1976*2d1272b8SAndroid Build Coastguard Worker }
1977*2d1272b8SAndroid Build Coastguard Worker
test_resolve_with_basic_pair_pos_1_split()1978*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_with_basic_pair_pos_1_split ()
1979*2d1272b8SAndroid Build Coastguard Worker {
1980*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 200000;
1981*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
1982*2d1272b8SAndroid Build Coastguard Worker assert (buffer);
1983*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
1984*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_pair_pos_1 <1, 4>(&c);
1985*2d1272b8SAndroid Build Coastguard Worker
1986*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
1987*2d1272b8SAndroid Build Coastguard Worker assert (expected_buffer);
1988*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
1989*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_pair_pos_1 <2, 2>(&e, true);
1990*2d1272b8SAndroid Build Coastguard Worker
1991*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_with_basic_pair_pos_1_split",
1992*2d1272b8SAndroid Build Coastguard Worker c,
1993*2d1272b8SAndroid Build Coastguard Worker e,
1994*2d1272b8SAndroid Build Coastguard Worker 20,
1995*2d1272b8SAndroid Build Coastguard Worker true,
1996*2d1272b8SAndroid Build Coastguard Worker HB_TAG('G', 'P', 'O', 'S'));
1997*2d1272b8SAndroid Build Coastguard Worker free (buffer);
1998*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
1999*2d1272b8SAndroid Build Coastguard Worker }
2000*2d1272b8SAndroid Build Coastguard Worker
test_resolve_with_extension_pair_pos_1_split()2001*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_with_extension_pair_pos_1_split ()
2002*2d1272b8SAndroid Build Coastguard Worker {
2003*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 200000;
2004*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
2005*2d1272b8SAndroid Build Coastguard Worker assert (buffer);
2006*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
2007*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_pair_pos_1 <1, 4>(&c, true);
2008*2d1272b8SAndroid Build Coastguard Worker
2009*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
2010*2d1272b8SAndroid Build Coastguard Worker assert (expected_buffer);
2011*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
2012*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_pair_pos_1 <2, 2>(&e, true);
2013*2d1272b8SAndroid Build Coastguard Worker
2014*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_with_extension_pair_pos_1_split",
2015*2d1272b8SAndroid Build Coastguard Worker c,
2016*2d1272b8SAndroid Build Coastguard Worker e,
2017*2d1272b8SAndroid Build Coastguard Worker 20,
2018*2d1272b8SAndroid Build Coastguard Worker true,
2019*2d1272b8SAndroid Build Coastguard Worker HB_TAG('G', 'P', 'O', 'S'));
2020*2d1272b8SAndroid Build Coastguard Worker free (buffer);
2021*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
2022*2d1272b8SAndroid Build Coastguard Worker }
2023*2d1272b8SAndroid Build Coastguard Worker
test_resolve_with_basic_pair_pos_2_split()2024*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_with_basic_pair_pos_2_split ()
2025*2d1272b8SAndroid Build Coastguard Worker {
2026*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 300000;
2027*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
2028*2d1272b8SAndroid Build Coastguard Worker assert (buffer);
2029*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
2030*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_pair_pos_2 <1, 4, 3000>(&c);
2031*2d1272b8SAndroid Build Coastguard Worker
2032*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
2033*2d1272b8SAndroid Build Coastguard Worker assert (expected_buffer);
2034*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
2035*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_pair_pos_2 <2, 2, 3000>(&e, true);
2036*2d1272b8SAndroid Build Coastguard Worker
2037*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_with_basic_pair_pos_2_split",
2038*2d1272b8SAndroid Build Coastguard Worker c,
2039*2d1272b8SAndroid Build Coastguard Worker e,
2040*2d1272b8SAndroid Build Coastguard Worker 20,
2041*2d1272b8SAndroid Build Coastguard Worker true,
2042*2d1272b8SAndroid Build Coastguard Worker HB_TAG('G', 'P', 'O', 'S'));
2043*2d1272b8SAndroid Build Coastguard Worker free (buffer);
2044*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
2045*2d1272b8SAndroid Build Coastguard Worker }
2046*2d1272b8SAndroid Build Coastguard Worker
test_resolve_with_close_to_limit_pair_pos_2_split()2047*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_with_close_to_limit_pair_pos_2_split ()
2048*2d1272b8SAndroid Build Coastguard Worker {
2049*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 300000;
2050*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
2051*2d1272b8SAndroid Build Coastguard Worker assert (buffer);
2052*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
2053*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_pair_pos_2 <1, 1636, 10>(&c, true, false, false);
2054*2d1272b8SAndroid Build Coastguard Worker
2055*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
2056*2d1272b8SAndroid Build Coastguard Worker assert (expected_buffer);
2057*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
2058*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_pair_pos_2 <2, 818, 10>(&e, true, false, false);
2059*2d1272b8SAndroid Build Coastguard Worker
2060*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_with_close_to_limit_pair_pos_2_split",
2061*2d1272b8SAndroid Build Coastguard Worker c,
2062*2d1272b8SAndroid Build Coastguard Worker e,
2063*2d1272b8SAndroid Build Coastguard Worker 20,
2064*2d1272b8SAndroid Build Coastguard Worker true,
2065*2d1272b8SAndroid Build Coastguard Worker HB_TAG('G', 'P', 'O', 'S'));
2066*2d1272b8SAndroid Build Coastguard Worker free (buffer);
2067*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
2068*2d1272b8SAndroid Build Coastguard Worker }
2069*2d1272b8SAndroid Build Coastguard Worker
test_resolve_with_pair_pos_2_split_with_device_tables()2070*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_with_pair_pos_2_split_with_device_tables ()
2071*2d1272b8SAndroid Build Coastguard Worker {
2072*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 300000;
2073*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
2074*2d1272b8SAndroid Build Coastguard Worker assert (buffer);
2075*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
2076*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_pair_pos_2 <1, 4, 2000>(&c, false, true);
2077*2d1272b8SAndroid Build Coastguard Worker
2078*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
2079*2d1272b8SAndroid Build Coastguard Worker assert (expected_buffer);
2080*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
2081*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_pair_pos_2 <2, 2, 2000>(&e, true, true);
2082*2d1272b8SAndroid Build Coastguard Worker
2083*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_with_pair_pos_2_split_with_device_tables",
2084*2d1272b8SAndroid Build Coastguard Worker c,
2085*2d1272b8SAndroid Build Coastguard Worker e,
2086*2d1272b8SAndroid Build Coastguard Worker 20,
2087*2d1272b8SAndroid Build Coastguard Worker true,
2088*2d1272b8SAndroid Build Coastguard Worker HB_TAG('G', 'P', 'O', 'S'));
2089*2d1272b8SAndroid Build Coastguard Worker free (buffer);
2090*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
2091*2d1272b8SAndroid Build Coastguard Worker }
2092*2d1272b8SAndroid Build Coastguard Worker
test_resolve_with_basic_mark_base_pos_1_split()2093*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_with_basic_mark_base_pos_1_split ()
2094*2d1272b8SAndroid Build Coastguard Worker {
2095*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 200000;
2096*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
2097*2d1272b8SAndroid Build Coastguard Worker assert (buffer);
2098*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
2099*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_mark_base_pos_1 <40, 10, 110, 1>(&c);
2100*2d1272b8SAndroid Build Coastguard Worker
2101*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
2102*2d1272b8SAndroid Build Coastguard Worker assert (expected_buffer);
2103*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
2104*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_large_mark_base_pos_1 <40, 10, 110, 2>(&e);
2105*2d1272b8SAndroid Build Coastguard Worker
2106*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_with_basic_mark_base_pos_1_split",
2107*2d1272b8SAndroid Build Coastguard Worker c,
2108*2d1272b8SAndroid Build Coastguard Worker e,
2109*2d1272b8SAndroid Build Coastguard Worker 20,
2110*2d1272b8SAndroid Build Coastguard Worker true,
2111*2d1272b8SAndroid Build Coastguard Worker HB_TAG('G', 'P', 'O', 'S'));
2112*2d1272b8SAndroid Build Coastguard Worker free (buffer);
2113*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
2114*2d1272b8SAndroid Build Coastguard Worker }
2115*2d1272b8SAndroid Build Coastguard Worker
test_resolve_overflows_via_splitting_spaces()2116*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_overflows_via_splitting_spaces ()
2117*2d1272b8SAndroid Build Coastguard Worker {
2118*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 160000;
2119*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
2120*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
2121*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_split_spaces (&c);
2122*2d1272b8SAndroid Build Coastguard Worker
2123*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
2124*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
2125*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_split_spaces_expected (&e);
2126*2d1272b8SAndroid Build Coastguard Worker
2127*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_overflows_via_splitting_spaces",
2128*2d1272b8SAndroid Build Coastguard Worker c,
2129*2d1272b8SAndroid Build Coastguard Worker e,
2130*2d1272b8SAndroid Build Coastguard Worker 1);
2131*2d1272b8SAndroid Build Coastguard Worker
2132*2d1272b8SAndroid Build Coastguard Worker free (buffer);
2133*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
2134*2d1272b8SAndroid Build Coastguard Worker
2135*2d1272b8SAndroid Build Coastguard Worker }
2136*2d1272b8SAndroid Build Coastguard Worker
test_resolve_overflows_via_splitting_spaces_2()2137*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_overflows_via_splitting_spaces_2 ()
2138*2d1272b8SAndroid Build Coastguard Worker {
2139*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 160000;
2140*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
2141*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
2142*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_split_spaces_2 (&c);
2143*2d1272b8SAndroid Build Coastguard Worker
2144*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
2145*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
2146*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_split_spaces_expected_2 (&e);
2147*2d1272b8SAndroid Build Coastguard Worker
2148*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_overflows_via_splitting_spaces_2",
2149*2d1272b8SAndroid Build Coastguard Worker c,
2150*2d1272b8SAndroid Build Coastguard Worker e,
2151*2d1272b8SAndroid Build Coastguard Worker 1);
2152*2d1272b8SAndroid Build Coastguard Worker free (buffer);
2153*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
2154*2d1272b8SAndroid Build Coastguard Worker }
2155*2d1272b8SAndroid Build Coastguard Worker
test_resolve_overflows_via_priority()2156*2d1272b8SAndroid Build Coastguard Worker static void test_resolve_overflows_via_priority ()
2157*2d1272b8SAndroid Build Coastguard Worker {
2158*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 160000;
2159*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
2160*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
2161*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_priority_overflow (&c);
2162*2d1272b8SAndroid Build Coastguard Worker
2163*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
2164*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
2165*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_priority_overflow_expected (&e);
2166*2d1272b8SAndroid Build Coastguard Worker
2167*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_resolve_overflows_via_priority",
2168*2d1272b8SAndroid Build Coastguard Worker c,
2169*2d1272b8SAndroid Build Coastguard Worker e,
2170*2d1272b8SAndroid Build Coastguard Worker 3);
2171*2d1272b8SAndroid Build Coastguard Worker free (buffer);
2172*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
2173*2d1272b8SAndroid Build Coastguard Worker }
2174*2d1272b8SAndroid Build Coastguard Worker
2175*2d1272b8SAndroid Build Coastguard Worker
test_virtual_link()2176*2d1272b8SAndroid Build Coastguard Worker static void test_virtual_link ()
2177*2d1272b8SAndroid Build Coastguard Worker {
2178*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 100;
2179*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
2180*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
2181*2d1272b8SAndroid Build Coastguard Worker populate_serializer_virtual_link (&c);
2182*2d1272b8SAndroid Build Coastguard Worker
2183*2d1272b8SAndroid Build Coastguard Worker hb_blob_t* out = hb_resolve_overflows (c.object_graph (), HB_TAG_NONE);
2184*2d1272b8SAndroid Build Coastguard Worker assert (out);
2185*2d1272b8SAndroid Build Coastguard Worker
2186*2d1272b8SAndroid Build Coastguard Worker hb_bytes_t result = out->as_bytes ();
2187*2d1272b8SAndroid Build Coastguard Worker assert (result.length == 5 + 4 * 2);
2188*2d1272b8SAndroid Build Coastguard Worker assert (result[0] == 'a');
2189*2d1272b8SAndroid Build Coastguard Worker assert (result[5] == 'c');
2190*2d1272b8SAndroid Build Coastguard Worker assert (result[8] == 'e');
2191*2d1272b8SAndroid Build Coastguard Worker assert (result[9] == 'b');
2192*2d1272b8SAndroid Build Coastguard Worker assert (result[12] == 'd');
2193*2d1272b8SAndroid Build Coastguard Worker
2194*2d1272b8SAndroid Build Coastguard Worker free (buffer);
2195*2d1272b8SAndroid Build Coastguard Worker hb_blob_destroy (out);
2196*2d1272b8SAndroid Build Coastguard Worker }
2197*2d1272b8SAndroid Build Coastguard Worker
2198*2d1272b8SAndroid Build Coastguard Worker static void
test_shared_node_with_virtual_links()2199*2d1272b8SAndroid Build Coastguard Worker test_shared_node_with_virtual_links ()
2200*2d1272b8SAndroid Build Coastguard Worker {
2201*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 100;
2202*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
2203*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
2204*2d1272b8SAndroid Build Coastguard Worker
2205*2d1272b8SAndroid Build Coastguard Worker c.start_serialize<char> ();
2206*2d1272b8SAndroid Build Coastguard Worker
2207*2d1272b8SAndroid Build Coastguard Worker unsigned obj_b = add_object ("b", 1, &c);
2208*2d1272b8SAndroid Build Coastguard Worker unsigned obj_c = add_object ("c", 1, &c);
2209*2d1272b8SAndroid Build Coastguard Worker
2210*2d1272b8SAndroid Build Coastguard Worker start_object ("d", 1, &c);
2211*2d1272b8SAndroid Build Coastguard Worker add_virtual_offset (obj_b, &c);
2212*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d_1 = c.pop_pack ();
2213*2d1272b8SAndroid Build Coastguard Worker
2214*2d1272b8SAndroid Build Coastguard Worker start_object ("d", 1, &c);
2215*2d1272b8SAndroid Build Coastguard Worker add_virtual_offset (obj_c, &c);
2216*2d1272b8SAndroid Build Coastguard Worker unsigned obj_d_2 = c.pop_pack ();
2217*2d1272b8SAndroid Build Coastguard Worker
2218*2d1272b8SAndroid Build Coastguard Worker assert (obj_d_1 == obj_d_2);
2219*2d1272b8SAndroid Build Coastguard Worker
2220*2d1272b8SAndroid Build Coastguard Worker start_object ("a", 1, &c);
2221*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_b, &c);
2222*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_c, &c);
2223*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d_1, &c);
2224*2d1272b8SAndroid Build Coastguard Worker add_offset (obj_d_2, &c);
2225*2d1272b8SAndroid Build Coastguard Worker c.pop_pack ();
2226*2d1272b8SAndroid Build Coastguard Worker c.end_serialize ();
2227*2d1272b8SAndroid Build Coastguard Worker
2228*2d1272b8SAndroid Build Coastguard Worker assert(c.object_graph() [obj_d_1]->virtual_links.length == 2);
2229*2d1272b8SAndroid Build Coastguard Worker assert(c.object_graph() [obj_d_1]->virtual_links[0].objidx == obj_b);
2230*2d1272b8SAndroid Build Coastguard Worker assert(c.object_graph() [obj_d_1]->virtual_links[1].objidx == obj_c);
2231*2d1272b8SAndroid Build Coastguard Worker free(buffer);
2232*2d1272b8SAndroid Build Coastguard Worker }
2233*2d1272b8SAndroid Build Coastguard Worker
2234*2d1272b8SAndroid Build Coastguard Worker static void
test_repack_last()2235*2d1272b8SAndroid Build Coastguard Worker test_repack_last ()
2236*2d1272b8SAndroid Build Coastguard Worker {
2237*2d1272b8SAndroid Build Coastguard Worker size_t buffer_size = 200000;
2238*2d1272b8SAndroid Build Coastguard Worker void* buffer = malloc (buffer_size);
2239*2d1272b8SAndroid Build Coastguard Worker assert (buffer);
2240*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t c (buffer, buffer_size);
2241*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_repack_last (&c, true);
2242*2d1272b8SAndroid Build Coastguard Worker
2243*2d1272b8SAndroid Build Coastguard Worker void* expected_buffer = malloc (buffer_size);
2244*2d1272b8SAndroid Build Coastguard Worker assert (expected_buffer);
2245*2d1272b8SAndroid Build Coastguard Worker hb_serialize_context_t e (expected_buffer, buffer_size);
2246*2d1272b8SAndroid Build Coastguard Worker populate_serializer_with_repack_last (&e, false);
2247*2d1272b8SAndroid Build Coastguard Worker
2248*2d1272b8SAndroid Build Coastguard Worker run_resolve_overflow_test ("test_repack_last",
2249*2d1272b8SAndroid Build Coastguard Worker c,
2250*2d1272b8SAndroid Build Coastguard Worker e,
2251*2d1272b8SAndroid Build Coastguard Worker 20,
2252*2d1272b8SAndroid Build Coastguard Worker false,
2253*2d1272b8SAndroid Build Coastguard Worker HB_TAG('a', 'b', 'c', 'd'),
2254*2d1272b8SAndroid Build Coastguard Worker true);
2255*2d1272b8SAndroid Build Coastguard Worker
2256*2d1272b8SAndroid Build Coastguard Worker free (buffer);
2257*2d1272b8SAndroid Build Coastguard Worker free (expected_buffer);
2258*2d1272b8SAndroid Build Coastguard Worker }
2259*2d1272b8SAndroid Build Coastguard Worker
2260*2d1272b8SAndroid Build Coastguard Worker // TODO(garretrieger): update will_overflow tests to check the overflows array.
2261*2d1272b8SAndroid Build Coastguard Worker // TODO(garretrieger): add tests for priority raising.
2262*2d1272b8SAndroid Build Coastguard Worker
2263*2d1272b8SAndroid Build Coastguard Worker int
main(int argc,char ** argv)2264*2d1272b8SAndroid Build Coastguard Worker main (int argc, char **argv)
2265*2d1272b8SAndroid Build Coastguard Worker {
2266*2d1272b8SAndroid Build Coastguard Worker test_serialize ();
2267*2d1272b8SAndroid Build Coastguard Worker test_sort_shortest ();
2268*2d1272b8SAndroid Build Coastguard Worker test_will_overflow_1 ();
2269*2d1272b8SAndroid Build Coastguard Worker test_will_overflow_2 ();
2270*2d1272b8SAndroid Build Coastguard Worker test_will_overflow_3 ();
2271*2d1272b8SAndroid Build Coastguard Worker test_resolve_overflows_via_sort ();
2272*2d1272b8SAndroid Build Coastguard Worker test_resolve_overflows_via_duplication ();
2273*2d1272b8SAndroid Build Coastguard Worker test_resolve_overflows_via_multiple_duplications ();
2274*2d1272b8SAndroid Build Coastguard Worker test_resolve_overflows_via_priority ();
2275*2d1272b8SAndroid Build Coastguard Worker test_resolve_overflows_via_space_assignment ();
2276*2d1272b8SAndroid Build Coastguard Worker test_resolve_overflows_via_isolation ();
2277*2d1272b8SAndroid Build Coastguard Worker test_resolve_overflows_via_isolation_with_recursive_duplication ();
2278*2d1272b8SAndroid Build Coastguard Worker test_resolve_overflows_via_isolation_spaces ();
2279*2d1272b8SAndroid Build Coastguard Worker test_resolve_overflows_via_isolating_16bit_space ();
2280*2d1272b8SAndroid Build Coastguard Worker test_resolve_overflows_via_isolating_16bit_space_2 ();
2281*2d1272b8SAndroid Build Coastguard Worker test_resolve_overflows_via_splitting_spaces ();
2282*2d1272b8SAndroid Build Coastguard Worker test_resolve_overflows_via_splitting_spaces_2 ();
2283*2d1272b8SAndroid Build Coastguard Worker test_resolve_mixed_overflows_via_isolation_spaces ();
2284*2d1272b8SAndroid Build Coastguard Worker test_duplicate_leaf ();
2285*2d1272b8SAndroid Build Coastguard Worker test_duplicate_interior ();
2286*2d1272b8SAndroid Build Coastguard Worker test_virtual_link ();
2287*2d1272b8SAndroid Build Coastguard Worker test_repack_last();
2288*2d1272b8SAndroid Build Coastguard Worker test_shared_node_with_virtual_links ();
2289*2d1272b8SAndroid Build Coastguard Worker test_resolve_with_extension_promotion ();
2290*2d1272b8SAndroid Build Coastguard Worker test_resolve_with_shared_extension_promotion ();
2291*2d1272b8SAndroid Build Coastguard Worker test_resolve_with_basic_pair_pos_1_split ();
2292*2d1272b8SAndroid Build Coastguard Worker test_resolve_with_extension_pair_pos_1_split ();
2293*2d1272b8SAndroid Build Coastguard Worker test_resolve_with_basic_pair_pos_2_split ();
2294*2d1272b8SAndroid Build Coastguard Worker test_resolve_with_pair_pos_2_split_with_device_tables ();
2295*2d1272b8SAndroid Build Coastguard Worker test_resolve_with_close_to_limit_pair_pos_2_split ();
2296*2d1272b8SAndroid Build Coastguard Worker test_resolve_with_basic_mark_base_pos_1_split ();
2297*2d1272b8SAndroid Build Coastguard Worker
2298*2d1272b8SAndroid Build Coastguard Worker // TODO(grieger): have run overflow tests compare graph equality not final packed binary.
2299*2d1272b8SAndroid Build Coastguard Worker // TODO(grieger): split test where multiple subtables in one lookup are split to test link ordering.
2300*2d1272b8SAndroid Build Coastguard Worker // TODO(grieger): split test where coverage table in subtable that is being split is shared.
2301*2d1272b8SAndroid Build Coastguard Worker // TODO(grieger): test with extensions already mixed in as well.
2302*2d1272b8SAndroid Build Coastguard Worker // TODO(grieger): test two layer ext promotion setup.
2303*2d1272b8SAndroid Build Coastguard Worker // TODO(grieger): test sorting by subtables per byte in ext. promotion.
2304*2d1272b8SAndroid Build Coastguard Worker }
2305