Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(664)

Side by Side Diff: third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh

Issue 1408003004: Roll harfbuzz-ng to 1.0.5 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2526
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright © 2007,2008,2009,2010 Red Hat, Inc. 2 * Copyright © 2007,2008,2009,2010 Red Hat, Inc.
3 * Copyright © 2010,2012,2013 Google, Inc. 3 * Copyright © 2010,2012,2013 Google, Inc.
4 * 4 *
5 * This is part of HarfBuzz, a text shaping library. 5 * This is part of HarfBuzz, a text shaping library.
6 * 6 *
7 * Permission is hereby granted, without written agreement and without 7 * Permission is hereby granted, without written agreement and without
8 * license or royalty fees, to use, copy, modify, and distribute this 8 * license or royalty fees, to use, copy, modify, and distribute this
9 * software and its documentation for any purpose, provided that the 9 * software and its documentation for any purpose, provided that the
10 * above copyright notice and the following two paragraphs appear in 10 * above copyright notice and the following two paragraphs appear in
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
60 } 60 }
61 61
62 inline const Coverage &get_coverage (void) const 62 inline const Coverage &get_coverage (void) const
63 { 63 {
64 return this+coverage; 64 return this+coverage;
65 } 65 }
66 66
67 inline bool would_apply (hb_would_apply_context_t *c) const 67 inline bool would_apply (hb_would_apply_context_t *c) const
68 { 68 {
69 TRACE_WOULD_APPLY (this); 69 TRACE_WOULD_APPLY (this);
70 return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[ 0]) != NOT_COVERED); 70 return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
71 } 71 }
72 72
73 inline bool apply (hb_apply_context_t *c) const 73 inline bool apply (hb_apply_context_t *c) const
74 { 74 {
75 TRACE_APPLY (this); 75 TRACE_APPLY (this);
76 hb_codepoint_t glyph_id = c->buffer->cur().codepoint; 76 hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
77 unsigned int index = (this+coverage).get_coverage (glyph_id); 77 unsigned int index = (this+coverage).get_coverage (glyph_id);
78 if (likely (index == NOT_COVERED)) return TRACE_RETURN (false); 78 if (likely (index == NOT_COVERED)) return_trace (false);
79 79
80 /* According to the Adobe Annotated OpenType Suite, result is always 80 /* According to the Adobe Annotated OpenType Suite, result is always
81 * limited to 16bit. */ 81 * limited to 16bit. */
82 glyph_id = (glyph_id + deltaGlyphID) & 0xFFFFu; 82 glyph_id = (glyph_id + deltaGlyphID) & 0xFFFFu;
83 c->replace_glyph (glyph_id); 83 c->replace_glyph (glyph_id);
84 84
85 return TRACE_RETURN (true); 85 return_trace (true);
86 } 86 }
87 87
88 inline bool serialize (hb_serialize_context_t *c, 88 inline bool serialize (hb_serialize_context_t *c,
89 Supplier<GlyphID> &glyphs, 89 Supplier<GlyphID> &glyphs,
90 unsigned int num_glyphs, 90 unsigned int num_glyphs,
91 int delta) 91 int delta)
92 { 92 {
93 TRACE_SERIALIZE (this); 93 TRACE_SERIALIZE (this);
94 if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false); 94 if (unlikely (!c->extend_min (*this))) return_trace (false);
95 if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs ))) return TRACE_RETURN (false); 95 if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs ))) return_trace (false);
96 deltaGlyphID.set (delta); /* TODO(serilaize) overflow? */ 96 deltaGlyphID.set (delta); /* TODO(serilaize) overflow? */
97 return TRACE_RETURN (true); 97 return_trace (true);
98 } 98 }
99 99
100 inline bool sanitize (hb_sanitize_context_t *c) const 100 inline bool sanitize (hb_sanitize_context_t *c) const
101 { 101 {
102 TRACE_SANITIZE (this); 102 TRACE_SANITIZE (this);
103 return TRACE_RETURN (coverage.sanitize (c, this) && deltaGlyphID.sanitize (c )); 103 return_trace (coverage.sanitize (c, this) && deltaGlyphID.sanitize (c));
104 } 104 }
105 105
106 protected: 106 protected:
107 USHORT format; /* Format identifier--format = 1 */ 107 USHORT format; /* Format identifier--format = 1 */
108 OffsetTo<Coverage> 108 OffsetTo<Coverage>
109 coverage; /* Offset to Coverage table--from 109 coverage; /* Offset to Coverage table--from
110 * beginning of Substitution table */ 110 * beginning of Substitution table */
111 SHORT deltaGlyphID; /* Add to original GlyphID to get 111 SHORT deltaGlyphID; /* Add to original GlyphID to get
112 * substitute GlyphID */ 112 * substitute GlyphID */
113 public: 113 public:
(...skipping 23 matching lines...) Expand all
137 } 137 }
138 138
139 inline const Coverage &get_coverage (void) const 139 inline const Coverage &get_coverage (void) const
140 { 140 {
141 return this+coverage; 141 return this+coverage;
142 } 142 }
143 143
144 inline bool would_apply (hb_would_apply_context_t *c) const 144 inline bool would_apply (hb_would_apply_context_t *c) const
145 { 145 {
146 TRACE_WOULD_APPLY (this); 146 TRACE_WOULD_APPLY (this);
147 return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[ 0]) != NOT_COVERED); 147 return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
148 } 148 }
149 149
150 inline bool apply (hb_apply_context_t *c) const 150 inline bool apply (hb_apply_context_t *c) const
151 { 151 {
152 TRACE_APPLY (this); 152 TRACE_APPLY (this);
153 hb_codepoint_t glyph_id = c->buffer->cur().codepoint; 153 hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
154 unsigned int index = (this+coverage).get_coverage (glyph_id); 154 unsigned int index = (this+coverage).get_coverage (glyph_id);
155 if (likely (index == NOT_COVERED)) return TRACE_RETURN (false); 155 if (likely (index == NOT_COVERED)) return_trace (false);
156 156
157 if (unlikely (index >= substitute.len)) return TRACE_RETURN (false); 157 if (unlikely (index >= substitute.len)) return_trace (false);
158 158
159 glyph_id = substitute[index]; 159 glyph_id = substitute[index];
160 c->replace_glyph (glyph_id); 160 c->replace_glyph (glyph_id);
161 161
162 return TRACE_RETURN (true); 162 return_trace (true);
163 } 163 }
164 164
165 inline bool serialize (hb_serialize_context_t *c, 165 inline bool serialize (hb_serialize_context_t *c,
166 Supplier<GlyphID> &glyphs, 166 Supplier<GlyphID> &glyphs,
167 Supplier<GlyphID> &substitutes, 167 Supplier<GlyphID> &substitutes,
168 unsigned int num_glyphs) 168 unsigned int num_glyphs)
169 { 169 {
170 TRACE_SERIALIZE (this); 170 TRACE_SERIALIZE (this);
171 if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false); 171 if (unlikely (!c->extend_min (*this))) return_trace (false);
172 if (unlikely (!substitute.serialize (c, substitutes, num_glyphs))) return TR ACE_RETURN (false); 172 if (unlikely (!substitute.serialize (c, substitutes, num_glyphs))) return_tr ace (false);
173 if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs ))) return TRACE_RETURN (false); 173 if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs ))) return_trace (false);
174 return TRACE_RETURN (true); 174 return_trace (true);
175 } 175 }
176 176
177 inline bool sanitize (hb_sanitize_context_t *c) const 177 inline bool sanitize (hb_sanitize_context_t *c) const
178 { 178 {
179 TRACE_SANITIZE (this); 179 TRACE_SANITIZE (this);
180 return TRACE_RETURN (coverage.sanitize (c, this) && substitute.sanitize (c)) ; 180 return_trace (coverage.sanitize (c, this) && substitute.sanitize (c));
181 } 181 }
182 182
183 protected: 183 protected:
184 USHORT format; /* Format identifier--format = 2 */ 184 USHORT format; /* Format identifier--format = 2 */
185 OffsetTo<Coverage> 185 OffsetTo<Coverage>
186 coverage; /* Offset to Coverage table--from 186 coverage; /* Offset to Coverage table--from
187 * beginning of Substitution table */ 187 * beginning of Substitution table */
188 ArrayOf<GlyphID> 188 ArrayOf<GlyphID>
189 substitute; /* Array of substitute 189 substitute; /* Array of substitute
190 * GlyphIDs--ordered by Coverage Index * / 190 * GlyphIDs--ordered by Coverage Index * /
191 public: 191 public:
192 DEFINE_SIZE_ARRAY (6, substitute); 192 DEFINE_SIZE_ARRAY (6, substitute);
193 }; 193 };
194 194
195 struct SingleSubst 195 struct SingleSubst
196 { 196 {
197 inline bool serialize (hb_serialize_context_t *c, 197 inline bool serialize (hb_serialize_context_t *c,
198 Supplier<GlyphID> &glyphs, 198 Supplier<GlyphID> &glyphs,
199 Supplier<GlyphID> &substitutes, 199 Supplier<GlyphID> &substitutes,
200 unsigned int num_glyphs) 200 unsigned int num_glyphs)
201 { 201 {
202 TRACE_SERIALIZE (this); 202 TRACE_SERIALIZE (this);
203 if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false); 203 if (unlikely (!c->extend_min (u.format))) return_trace (false);
204 unsigned int format = 2; 204 unsigned int format = 2;
205 int delta = 0; 205 int delta = 0;
206 if (num_glyphs) { 206 if (num_glyphs) {
207 format = 1; 207 format = 1;
208 /* TODO(serialize) check for wrap-around */ 208 /* TODO(serialize) check for wrap-around */
209 delta = substitutes[0] - glyphs[0]; 209 delta = substitutes[0] - glyphs[0];
210 for (unsigned int i = 1; i < num_glyphs; i++) 210 for (unsigned int i = 1; i < num_glyphs; i++)
211 if (delta != substitutes[i] - glyphs[i]) { 211 if (delta != substitutes[i] - glyphs[i]) {
212 format = 2; 212 format = 2;
213 break; 213 break;
214 } 214 }
215 } 215 }
216 u.format.set (format); 216 u.format.set (format);
217 switch (u.format) { 217 switch (u.format) {
218 case 1: return TRACE_RETURN (u.format1.serialize (c, glyphs, num_glyphs, del ta)); 218 case 1: return_trace (u.format1.serialize (c, glyphs, num_glyphs, delta));
219 case 2: return TRACE_RETURN (u.format2.serialize (c, glyphs, substitutes, nu m_glyphs)); 219 case 2: return_trace (u.format2.serialize (c, glyphs, substitutes, num_glyph s));
220 default:return TRACE_RETURN (false); 220 default:return_trace (false);
221 } 221 }
222 } 222 }
223 223
224 template <typename context_t> 224 template <typename context_t>
225 inline typename context_t::return_t dispatch (context_t *c) const 225 inline typename context_t::return_t dispatch (context_t *c) const
226 { 226 {
227 TRACE_DISPATCH (this, u.format); 227 TRACE_DISPATCH (this, u.format);
228 if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_ return_value ()); 228 if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispa tch_return_value ());
229 switch (u.format) { 229 switch (u.format) {
230 case 1: return TRACE_RETURN (c->dispatch (u.format1)); 230 case 1: return_trace (c->dispatch (u.format1));
231 case 2: return TRACE_RETURN (c->dispatch (u.format2)); 231 case 2: return_trace (c->dispatch (u.format2));
232 default:return TRACE_RETURN (c->default_return_value ()); 232 default:return_trace (c->default_return_value ());
233 } 233 }
234 } 234 }
235 235
236 protected: 236 protected:
237 union { 237 union {
238 USHORT format; /* Format identifier */ 238 USHORT format; /* Format identifier */
239 SingleSubstFormat1 format1; 239 SingleSubstFormat1 format1;
240 SingleSubstFormat2 format2; 240 SingleSubstFormat2 format2;
241 } u; 241 } u;
242 }; 242 };
(...skipping 23 matching lines...) Expand all
266 unsigned int count = substitute.len; 266 unsigned int count = substitute.len;
267 267
268 /* TODO: 268 /* TODO:
269 * Testing shows that Uniscribe actually allows zero-len susbstitute, 269 * Testing shows that Uniscribe actually allows zero-len susbstitute,
270 * which essentially deletes a glyph. We don't allow for now. It 270 * which essentially deletes a glyph. We don't allow for now. It
271 * can be confusing to the client since the cluster from the deleted 271 * can be confusing to the client since the cluster from the deleted
272 * glyph won't be merged with any output cluster... Also, currently 272 * glyph won't be merged with any output cluster... Also, currently
273 * buffer->move_to() makes assumptions about this too. Perhaps fix 273 * buffer->move_to() makes assumptions about this too. Perhaps fix
274 * in the future after figuring out what to do with the clusters. 274 * in the future after figuring out what to do with the clusters.
275 */ 275 */
276 if (unlikely (!count)) return TRACE_RETURN (false); 276 if (unlikely (!count)) return_trace (false);
277 277
278 /* Special-case to make it in-place and not consider this 278 /* Special-case to make it in-place and not consider this
279 * as a "multiplied" substitution. */ 279 * as a "multiplied" substitution. */
280 if (unlikely (count == 1)) 280 if (unlikely (count == 1))
281 { 281 {
282 c->replace_glyph (substitute.array[0]); 282 c->replace_glyph (substitute.array[0]);
283 return TRACE_RETURN (true); 283 return_trace (true);
284 } 284 }
285 285
286 unsigned int klass = _hb_glyph_info_is_ligature (&c->buffer->cur()) ? 286 unsigned int klass = _hb_glyph_info_is_ligature (&c->buffer->cur()) ?
287 HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : 0; 287 HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : 0;
288 288
289 for (unsigned int i = 0; i < count; i++) { 289 for (unsigned int i = 0; i < count; i++) {
290 _hb_glyph_info_set_lig_props_for_component (&c->buffer->cur(), i); 290 _hb_glyph_info_set_lig_props_for_component (&c->buffer->cur(), i);
291 c->output_glyph_for_component (substitute.array[i], klass); 291 c->output_glyph_for_component (substitute.array[i], klass);
292 } 292 }
293 c->buffer->skip_glyph (); 293 c->buffer->skip_glyph ();
294 294
295 return TRACE_RETURN (true); 295 return_trace (true);
296 } 296 }
297 297
298 inline bool serialize (hb_serialize_context_t *c, 298 inline bool serialize (hb_serialize_context_t *c,
299 Supplier<GlyphID> &glyphs, 299 Supplier<GlyphID> &glyphs,
300 unsigned int num_glyphs) 300 unsigned int num_glyphs)
301 { 301 {
302 TRACE_SERIALIZE (this); 302 TRACE_SERIALIZE (this);
303 if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false); 303 if (unlikely (!c->extend_min (*this))) return_trace (false);
304 if (unlikely (!substitute.serialize (c, glyphs, num_glyphs))) return TRACE_R ETURN (false); 304 if (unlikely (!substitute.serialize (c, glyphs, num_glyphs))) return_trace ( false);
305 return TRACE_RETURN (true); 305 return_trace (true);
306 } 306 }
307 307
308 inline bool sanitize (hb_sanitize_context_t *c) const 308 inline bool sanitize (hb_sanitize_context_t *c) const
309 { 309 {
310 TRACE_SANITIZE (this); 310 TRACE_SANITIZE (this);
311 return TRACE_RETURN (substitute.sanitize (c)); 311 return_trace (substitute.sanitize (c));
312 } 312 }
313 313
314 protected: 314 protected:
315 ArrayOf<GlyphID> 315 ArrayOf<GlyphID>
316 substitute; /* String of GlyphIDs to substitute */ 316 substitute; /* String of GlyphIDs to substitute */
317 public: 317 public:
318 DEFINE_SIZE_ARRAY (2, substitute); 318 DEFINE_SIZE_ARRAY (2, substitute);
319 }; 319 };
320 320
321 struct MultipleSubstFormat1 321 struct MultipleSubstFormat1
(...skipping 18 matching lines...) Expand all
340 } 340 }
341 341
342 inline const Coverage &get_coverage (void) const 342 inline const Coverage &get_coverage (void) const
343 { 343 {
344 return this+coverage; 344 return this+coverage;
345 } 345 }
346 346
347 inline bool would_apply (hb_would_apply_context_t *c) const 347 inline bool would_apply (hb_would_apply_context_t *c) const
348 { 348 {
349 TRACE_WOULD_APPLY (this); 349 TRACE_WOULD_APPLY (this);
350 return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[ 0]) != NOT_COVERED); 350 return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
351 } 351 }
352 352
353 inline bool apply (hb_apply_context_t *c) const 353 inline bool apply (hb_apply_context_t *c) const
354 { 354 {
355 TRACE_APPLY (this); 355 TRACE_APPLY (this);
356 356
357 unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoin t); 357 unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoin t);
358 if (likely (index == NOT_COVERED)) return TRACE_RETURN (false); 358 if (likely (index == NOT_COVERED)) return_trace (false);
359 359
360 return TRACE_RETURN ((this+sequence[index]).apply (c)); 360 return_trace ((this+sequence[index]).apply (c));
361 } 361 }
362 362
363 inline bool serialize (hb_serialize_context_t *c, 363 inline bool serialize (hb_serialize_context_t *c,
364 Supplier<GlyphID> &glyphs, 364 Supplier<GlyphID> &glyphs,
365 Supplier<unsigned int> &substitute_len_list, 365 Supplier<unsigned int> &substitute_len_list,
366 unsigned int num_glyphs, 366 unsigned int num_glyphs,
367 Supplier<GlyphID> &substitute_glyphs_list) 367 Supplier<GlyphID> &substitute_glyphs_list)
368 { 368 {
369 TRACE_SERIALIZE (this); 369 TRACE_SERIALIZE (this);
370 if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false); 370 if (unlikely (!c->extend_min (*this))) return_trace (false);
371 if (unlikely (!sequence.serialize (c, num_glyphs))) return TRACE_RETURN (fal se); 371 if (unlikely (!sequence.serialize (c, num_glyphs))) return_trace (false);
372 for (unsigned int i = 0; i < num_glyphs; i++) 372 for (unsigned int i = 0; i < num_glyphs; i++)
373 if (unlikely (!sequence[i].serialize (c, this).serialize (c, 373 if (unlikely (!sequence[i].serialize (c, this).serialize (c,
374 substitute_glyph s_list, 374 substitute_glyph s_list,
375 » » » » » » » » substitute_len_l ist[i]))) return TRACE_RETURN (false); 375 » » » » » » » » substitute_len_l ist[i]))) return_trace (false);
376 substitute_len_list.advance (num_glyphs); 376 substitute_len_list.advance (num_glyphs);
377 if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs ))) return TRACE_RETURN (false); 377 if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs ))) return_trace (false);
378 return TRACE_RETURN (true); 378 return_trace (true);
379 } 379 }
380 380
381 inline bool sanitize (hb_sanitize_context_t *c) const 381 inline bool sanitize (hb_sanitize_context_t *c) const
382 { 382 {
383 TRACE_SANITIZE (this); 383 TRACE_SANITIZE (this);
384 return TRACE_RETURN (coverage.sanitize (c, this) && sequence.sanitize (c, th is)); 384 return_trace (coverage.sanitize (c, this) && sequence.sanitize (c, this));
385 } 385 }
386 386
387 protected: 387 protected:
388 USHORT format; /* Format identifier--format = 1 */ 388 USHORT format; /* Format identifier--format = 1 */
389 OffsetTo<Coverage> 389 OffsetTo<Coverage>
390 coverage; /* Offset to Coverage table--from 390 coverage; /* Offset to Coverage table--from
391 * beginning of Substitution table */ 391 * beginning of Substitution table */
392 OffsetArrayOf<Sequence> 392 OffsetArrayOf<Sequence>
393 sequence; /* Array of Sequence tables 393 sequence; /* Array of Sequence tables
394 * ordered by Coverage Index */ 394 * ordered by Coverage Index */
395 public: 395 public:
396 DEFINE_SIZE_ARRAY (6, sequence); 396 DEFINE_SIZE_ARRAY (6, sequence);
397 }; 397 };
398 398
399 struct MultipleSubst 399 struct MultipleSubst
400 { 400 {
401 inline bool serialize (hb_serialize_context_t *c, 401 inline bool serialize (hb_serialize_context_t *c,
402 Supplier<GlyphID> &glyphs, 402 Supplier<GlyphID> &glyphs,
403 Supplier<unsigned int> &substitute_len_list, 403 Supplier<unsigned int> &substitute_len_list,
404 unsigned int num_glyphs, 404 unsigned int num_glyphs,
405 Supplier<GlyphID> &substitute_glyphs_list) 405 Supplier<GlyphID> &substitute_glyphs_list)
406 { 406 {
407 TRACE_SERIALIZE (this); 407 TRACE_SERIALIZE (this);
408 if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false); 408 if (unlikely (!c->extend_min (u.format))) return_trace (false);
409 unsigned int format = 1; 409 unsigned int format = 1;
410 u.format.set (format); 410 u.format.set (format);
411 switch (u.format) { 411 switch (u.format) {
412 case 1: return TRACE_RETURN (u.format1.serialize (c, glyphs, substitute_len_ list, num_glyphs, substitute_glyphs_list)); 412 case 1: return_trace (u.format1.serialize (c, glyphs, substitute_len_list, n um_glyphs, substitute_glyphs_list));
413 default:return TRACE_RETURN (false); 413 default:return_trace (false);
414 } 414 }
415 } 415 }
416 416
417 template <typename context_t> 417 template <typename context_t>
418 inline typename context_t::return_t dispatch (context_t *c) const 418 inline typename context_t::return_t dispatch (context_t *c) const
419 { 419 {
420 TRACE_DISPATCH (this, u.format); 420 TRACE_DISPATCH (this, u.format);
421 if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_ return_value ()); 421 if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispa tch_return_value ());
422 switch (u.format) { 422 switch (u.format) {
423 case 1: return TRACE_RETURN (c->dispatch (u.format1)); 423 case 1: return_trace (c->dispatch (u.format1));
424 default:return TRACE_RETURN (c->default_return_value ()); 424 default:return_trace (c->default_return_value ());
425 } 425 }
426 } 426 }
427 427
428 protected: 428 protected:
429 union { 429 union {
430 USHORT format; /* Format identifier */ 430 USHORT format; /* Format identifier */
431 MultipleSubstFormat1 format1; 431 MultipleSubstFormat1 format1;
432 } u; 432 } u;
433 }; 433 };
434 434
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 } 466 }
467 467
468 inline const Coverage &get_coverage (void) const 468 inline const Coverage &get_coverage (void) const
469 { 469 {
470 return this+coverage; 470 return this+coverage;
471 } 471 }
472 472
473 inline bool would_apply (hb_would_apply_context_t *c) const 473 inline bool would_apply (hb_would_apply_context_t *c) const
474 { 474 {
475 TRACE_WOULD_APPLY (this); 475 TRACE_WOULD_APPLY (this);
476 return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[ 0]) != NOT_COVERED); 476 return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
477 } 477 }
478 478
479 inline bool apply (hb_apply_context_t *c) const 479 inline bool apply (hb_apply_context_t *c) const
480 { 480 {
481 TRACE_APPLY (this); 481 TRACE_APPLY (this);
482 hb_codepoint_t glyph_id = c->buffer->cur().codepoint; 482 hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
483 483
484 unsigned int index = (this+coverage).get_coverage (glyph_id); 484 unsigned int index = (this+coverage).get_coverage (glyph_id);
485 if (likely (index == NOT_COVERED)) return TRACE_RETURN (false); 485 if (likely (index == NOT_COVERED)) return_trace (false);
486 486
487 const AlternateSet &alt_set = this+alternateSet[index]; 487 const AlternateSet &alt_set = this+alternateSet[index];
488 488
489 if (unlikely (!alt_set.len)) return TRACE_RETURN (false); 489 if (unlikely (!alt_set.len)) return_trace (false);
490 490
491 hb_mask_t glyph_mask = c->buffer->cur().mask; 491 hb_mask_t glyph_mask = c->buffer->cur().mask;
492 hb_mask_t lookup_mask = c->lookup_mask; 492 hb_mask_t lookup_mask = c->lookup_mask;
493 493
494 /* Note: This breaks badly if two features enabled this lookup together. */ 494 /* Note: This breaks badly if two features enabled this lookup together. */
495 unsigned int shift = _hb_ctz (lookup_mask); 495 unsigned int shift = _hb_ctz (lookup_mask);
496 unsigned int alt_index = ((lookup_mask & glyph_mask) >> shift); 496 unsigned int alt_index = ((lookup_mask & glyph_mask) >> shift);
497 497
498 if (unlikely (alt_index > alt_set.len || alt_index == 0)) return TRACE_RETUR N (false); 498 if (unlikely (alt_index > alt_set.len || alt_index == 0)) return_trace (fals e);
499 499
500 glyph_id = alt_set[alt_index - 1]; 500 glyph_id = alt_set[alt_index - 1];
501 501
502 c->replace_glyph (glyph_id); 502 c->replace_glyph (glyph_id);
503 503
504 return TRACE_RETURN (true); 504 return_trace (true);
505 } 505 }
506 506
507 inline bool serialize (hb_serialize_context_t *c, 507 inline bool serialize (hb_serialize_context_t *c,
508 Supplier<GlyphID> &glyphs, 508 Supplier<GlyphID> &glyphs,
509 Supplier<unsigned int> &alternate_len_list, 509 Supplier<unsigned int> &alternate_len_list,
510 unsigned int num_glyphs, 510 unsigned int num_glyphs,
511 Supplier<GlyphID> &alternate_glyphs_list) 511 Supplier<GlyphID> &alternate_glyphs_list)
512 { 512 {
513 TRACE_SERIALIZE (this); 513 TRACE_SERIALIZE (this);
514 if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false); 514 if (unlikely (!c->extend_min (*this))) return_trace (false);
515 if (unlikely (!alternateSet.serialize (c, num_glyphs))) return TRACE_RETURN (false); 515 if (unlikely (!alternateSet.serialize (c, num_glyphs))) return_trace (false) ;
516 for (unsigned int i = 0; i < num_glyphs; i++) 516 for (unsigned int i = 0; i < num_glyphs; i++)
517 if (unlikely (!alternateSet[i].serialize (c, this).serialize (c, 517 if (unlikely (!alternateSet[i].serialize (c, this).serialize (c,
518 alternate_gl yphs_list, 518 alternate_gl yphs_list,
519 » » » » » » » » alternate_le n_list[i]))) return TRACE_RETURN (false); 519 » » » » » » » » alternate_le n_list[i]))) return_trace (false);
520 alternate_len_list.advance (num_glyphs); 520 alternate_len_list.advance (num_glyphs);
521 if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs ))) return TRACE_RETURN (false); 521 if (unlikely (!coverage.serialize (c, this).serialize (c, glyphs, num_glyphs ))) return_trace (false);
522 return TRACE_RETURN (true); 522 return_trace (true);
523 } 523 }
524 524
525 inline bool sanitize (hb_sanitize_context_t *c) const 525 inline bool sanitize (hb_sanitize_context_t *c) const
526 { 526 {
527 TRACE_SANITIZE (this); 527 TRACE_SANITIZE (this);
528 return TRACE_RETURN (coverage.sanitize (c, this) && alternateSet.sanitize (c , this)); 528 return_trace (coverage.sanitize (c, this) && alternateSet.sanitize (c, this) );
529 } 529 }
530 530
531 protected: 531 protected:
532 USHORT format; /* Format identifier--format = 1 */ 532 USHORT format; /* Format identifier--format = 1 */
533 OffsetTo<Coverage> 533 OffsetTo<Coverage>
534 coverage; /* Offset to Coverage table--from 534 coverage; /* Offset to Coverage table--from
535 * beginning of Substitution table */ 535 * beginning of Substitution table */
536 OffsetArrayOf<AlternateSet> 536 OffsetArrayOf<AlternateSet>
537 alternateSet; /* Array of AlternateSet tables 537 alternateSet; /* Array of AlternateSet tables
538 * ordered by Coverage Index */ 538 * ordered by Coverage Index */
539 public: 539 public:
540 DEFINE_SIZE_ARRAY (6, alternateSet); 540 DEFINE_SIZE_ARRAY (6, alternateSet);
541 }; 541 };
542 542
543 struct AlternateSubst 543 struct AlternateSubst
544 { 544 {
545 inline bool serialize (hb_serialize_context_t *c, 545 inline bool serialize (hb_serialize_context_t *c,
546 Supplier<GlyphID> &glyphs, 546 Supplier<GlyphID> &glyphs,
547 Supplier<unsigned int> &alternate_len_list, 547 Supplier<unsigned int> &alternate_len_list,
548 unsigned int num_glyphs, 548 unsigned int num_glyphs,
549 Supplier<GlyphID> &alternate_glyphs_list) 549 Supplier<GlyphID> &alternate_glyphs_list)
550 { 550 {
551 TRACE_SERIALIZE (this); 551 TRACE_SERIALIZE (this);
552 if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false); 552 if (unlikely (!c->extend_min (u.format))) return_trace (false);
553 unsigned int format = 1; 553 unsigned int format = 1;
554 u.format.set (format); 554 u.format.set (format);
555 switch (u.format) { 555 switch (u.format) {
556 case 1: return TRACE_RETURN (u.format1.serialize (c, glyphs, alternate_len_l ist, num_glyphs, alternate_glyphs_list)); 556 case 1: return_trace (u.format1.serialize (c, glyphs, alternate_len_list, nu m_glyphs, alternate_glyphs_list));
557 default:return TRACE_RETURN (false); 557 default:return_trace (false);
558 } 558 }
559 } 559 }
560 560
561 template <typename context_t> 561 template <typename context_t>
562 inline typename context_t::return_t dispatch (context_t *c) const 562 inline typename context_t::return_t dispatch (context_t *c) const
563 { 563 {
564 TRACE_DISPATCH (this, u.format); 564 TRACE_DISPATCH (this, u.format);
565 if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_ return_value ()); 565 if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispa tch_return_value ());
566 switch (u.format) { 566 switch (u.format) {
567 case 1: return TRACE_RETURN (c->dispatch (u.format1)); 567 case 1: return_trace (c->dispatch (u.format1));
568 default:return TRACE_RETURN (c->default_return_value ()); 568 default:return_trace (c->default_return_value ());
569 } 569 }
570 } 570 }
571 571
572 protected: 572 protected:
573 union { 573 union {
574 USHORT format; /* Format identifier */ 574 USHORT format; /* Format identifier */
575 AlternateSubstFormat1 format1; 575 AlternateSubstFormat1 format1;
576 } u; 576 } u;
577 }; 577 };
578 578
(...skipping 16 matching lines...) Expand all
595 unsigned int count = component.len; 595 unsigned int count = component.len;
596 for (unsigned int i = 1; i < count; i++) 596 for (unsigned int i = 1; i < count; i++)
597 c->input->add (component[i]); 597 c->input->add (component[i]);
598 c->output->add (ligGlyph); 598 c->output->add (ligGlyph);
599 } 599 }
600 600
601 inline bool would_apply (hb_would_apply_context_t *c) const 601 inline bool would_apply (hb_would_apply_context_t *c) const
602 { 602 {
603 TRACE_WOULD_APPLY (this); 603 TRACE_WOULD_APPLY (this);
604 if (c->len != component.len) 604 if (c->len != component.len)
605 return TRACE_RETURN (false); 605 return_trace (false);
606 606
607 for (unsigned int i = 1; i < c->len; i++) 607 for (unsigned int i = 1; i < c->len; i++)
608 if (likely (c->glyphs[i] != component[i])) 608 if (likely (c->glyphs[i] != component[i]))
609 » return TRACE_RETURN (false); 609 » return_trace (false);
610 610
611 return TRACE_RETURN (true); 611 return_trace (true);
612 } 612 }
613 613
614 inline bool apply (hb_apply_context_t *c) const 614 inline bool apply (hb_apply_context_t *c) const
615 { 615 {
616 TRACE_APPLY (this); 616 TRACE_APPLY (this);
617 unsigned int count = component.len; 617 unsigned int count = component.len;
618 618
619 if (unlikely (!count)) return TRACE_RETURN (false); 619 if (unlikely (!count)) return_trace (false);
620 620
621 /* Special-case to make it in-place and not consider this 621 /* Special-case to make it in-place and not consider this
622 * as a "ligated" substitution. */ 622 * as a "ligated" substitution. */
623 if (unlikely (count == 1)) 623 if (unlikely (count == 1))
624 { 624 {
625 c->replace_glyph (ligGlyph); 625 c->replace_glyph (ligGlyph);
626 return TRACE_RETURN (true); 626 return_trace (true);
627 } 627 }
628 628
629 bool is_mark_ligature = false; 629 bool is_mark_ligature = false;
630 unsigned int total_component_count = 0; 630 unsigned int total_component_count = 0;
631 631
632 unsigned int match_length = 0; 632 unsigned int match_length = 0;
633 unsigned int match_positions[MAX_CONTEXT_LENGTH]; 633 unsigned int match_positions[MAX_CONTEXT_LENGTH];
634 634
635 if (likely (!match_input (c, count, 635 if (likely (!match_input (c, count,
636 &component[1], 636 &component[1],
637 match_glyph, 637 match_glyph,
638 NULL, 638 NULL,
639 &match_length, 639 &match_length,
640 match_positions, 640 match_positions,
641 &is_mark_ligature, 641 &is_mark_ligature,
642 &total_component_count))) 642 &total_component_count)))
643 return TRACE_RETURN (false); 643 return_trace (false);
644 644
645 ligate_input (c, 645 ligate_input (c,
646 count, 646 count,
647 match_positions, 647 match_positions,
648 match_length, 648 match_length,
649 ligGlyph, 649 ligGlyph,
650 is_mark_ligature, 650 is_mark_ligature,
651 total_component_count); 651 total_component_count);
652 652
653 return TRACE_RETURN (true); 653 return_trace (true);
654 } 654 }
655 655
656 inline bool serialize (hb_serialize_context_t *c, 656 inline bool serialize (hb_serialize_context_t *c,
657 GlyphID ligature, 657 GlyphID ligature,
658 Supplier<GlyphID> &components, /* Starting from second */ 658 Supplier<GlyphID> &components, /* Starting from second */
659 unsigned int num_components /* Including first componen t */) 659 unsigned int num_components /* Including first componen t */)
660 { 660 {
661 TRACE_SERIALIZE (this); 661 TRACE_SERIALIZE (this);
662 if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false); 662 if (unlikely (!c->extend_min (*this))) return_trace (false);
663 ligGlyph = ligature; 663 ligGlyph = ligature;
664 if (unlikely (!component.serialize (c, components, num_components))) return TRACE_RETURN (false); 664 if (unlikely (!component.serialize (c, components, num_components))) return_ trace (false);
665 return TRACE_RETURN (true); 665 return_trace (true);
666 } 666 }
667 667
668 public: 668 public:
669 inline bool sanitize (hb_sanitize_context_t *c) const 669 inline bool sanitize (hb_sanitize_context_t *c) const
670 { 670 {
671 TRACE_SANITIZE (this); 671 TRACE_SANITIZE (this);
672 return TRACE_RETURN (ligGlyph.sanitize (c) && component.sanitize (c)); 672 return_trace (ligGlyph.sanitize (c) && component.sanitize (c));
673 } 673 }
674 674
675 protected: 675 protected:
676 GlyphID ligGlyph; /* GlyphID of ligature to substitute */ 676 GlyphID ligGlyph; /* GlyphID of ligature to substitute */
677 HeadlessArrayOf<GlyphID> 677 HeadlessArrayOf<GlyphID>
678 component; /* Array of component GlyphIDs--start 678 component; /* Array of component GlyphIDs--start
679 * with the second component--ordered 679 * with the second component--ordered
680 * in writing direction */ 680 * in writing direction */
681 public: 681 public:
682 DEFINE_SIZE_ARRAY (4, component); 682 DEFINE_SIZE_ARRAY (4, component);
(...skipping 18 matching lines...) Expand all
701 } 701 }
702 702
703 inline bool would_apply (hb_would_apply_context_t *c) const 703 inline bool would_apply (hb_would_apply_context_t *c) const
704 { 704 {
705 TRACE_WOULD_APPLY (this); 705 TRACE_WOULD_APPLY (this);
706 unsigned int num_ligs = ligature.len; 706 unsigned int num_ligs = ligature.len;
707 for (unsigned int i = 0; i < num_ligs; i++) 707 for (unsigned int i = 0; i < num_ligs; i++)
708 { 708 {
709 const Ligature &lig = this+ligature[i]; 709 const Ligature &lig = this+ligature[i];
710 if (lig.would_apply (c)) 710 if (lig.would_apply (c))
711 return TRACE_RETURN (true); 711 return_trace (true);
712 } 712 }
713 return TRACE_RETURN (false); 713 return_trace (false);
714 } 714 }
715 715
716 inline bool apply (hb_apply_context_t *c) const 716 inline bool apply (hb_apply_context_t *c) const
717 { 717 {
718 TRACE_APPLY (this); 718 TRACE_APPLY (this);
719 unsigned int num_ligs = ligature.len; 719 unsigned int num_ligs = ligature.len;
720 for (unsigned int i = 0; i < num_ligs; i++) 720 for (unsigned int i = 0; i < num_ligs; i++)
721 { 721 {
722 const Ligature &lig = this+ligature[i]; 722 const Ligature &lig = this+ligature[i];
723 if (lig.apply (c)) return TRACE_RETURN (true); 723 if (lig.apply (c)) return_trace (true);
724 } 724 }
725 725
726 return TRACE_RETURN (false); 726 return_trace (false);
727 } 727 }
728 728
729 inline bool serialize (hb_serialize_context_t *c, 729 inline bool serialize (hb_serialize_context_t *c,
730 Supplier<GlyphID> &ligatures, 730 Supplier<GlyphID> &ligatures,
731 Supplier<unsigned int> &component_count_list, 731 Supplier<unsigned int> &component_count_list,
732 unsigned int num_ligatures, 732 unsigned int num_ligatures,
733 Supplier<GlyphID> &component_list /* Starting from seco nd for each ligature */) 733 Supplier<GlyphID> &component_list /* Starting from seco nd for each ligature */)
734 { 734 {
735 TRACE_SERIALIZE (this); 735 TRACE_SERIALIZE (this);
736 if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false); 736 if (unlikely (!c->extend_min (*this))) return_trace (false);
737 if (unlikely (!ligature.serialize (c, num_ligatures))) return TRACE_RETURN ( false); 737 if (unlikely (!ligature.serialize (c, num_ligatures))) return_trace (false);
738 for (unsigned int i = 0; i < num_ligatures; i++) 738 for (unsigned int i = 0; i < num_ligatures; i++)
739 if (unlikely (!ligature[i].serialize (c, this).serialize (c, 739 if (unlikely (!ligature[i].serialize (c, this).serialize (c,
740 ligatures[i], 740 ligatures[i],
741 component_list, 741 component_list,
742 » » » » » » » » component_count_ list[i]))) return TRACE_RETURN (false); 742 » » » » » » » » component_count_ list[i]))) return_trace (false);
743 ligatures.advance (num_ligatures); 743 ligatures.advance (num_ligatures);
744 component_count_list.advance (num_ligatures); 744 component_count_list.advance (num_ligatures);
745 return TRACE_RETURN (true); 745 return_trace (true);
746 } 746 }
747 747
748 inline bool sanitize (hb_sanitize_context_t *c) const 748 inline bool sanitize (hb_sanitize_context_t *c) const
749 { 749 {
750 TRACE_SANITIZE (this); 750 TRACE_SANITIZE (this);
751 return TRACE_RETURN (ligature.sanitize (c, this)); 751 return_trace (ligature.sanitize (c, this));
752 } 752 }
753 753
754 protected: 754 protected:
755 OffsetArrayOf<Ligature> 755 OffsetArrayOf<Ligature>
756 ligature; /* Array LigatureSet tables 756 ligature; /* Array LigatureSet tables
757 * ordered by preference */ 757 * ordered by preference */
758 public: 758 public:
759 DEFINE_SIZE_ARRAY (2, ligature); 759 DEFINE_SIZE_ARRAY (2, ligature);
760 }; 760 };
761 761
(...skipping 21 matching lines...) Expand all
783 783
784 inline const Coverage &get_coverage (void) const 784 inline const Coverage &get_coverage (void) const
785 { 785 {
786 return this+coverage; 786 return this+coverage;
787 } 787 }
788 788
789 inline bool would_apply (hb_would_apply_context_t *c) const 789 inline bool would_apply (hb_would_apply_context_t *c) const
790 { 790 {
791 TRACE_WOULD_APPLY (this); 791 TRACE_WOULD_APPLY (this);
792 unsigned int index = (this+coverage).get_coverage (c->glyphs[0]); 792 unsigned int index = (this+coverage).get_coverage (c->glyphs[0]);
793 if (likely (index == NOT_COVERED)) return TRACE_RETURN (false); 793 if (likely (index == NOT_COVERED)) return_trace (false);
794 794
795 const LigatureSet &lig_set = this+ligatureSet[index]; 795 const LigatureSet &lig_set = this+ligatureSet[index];
796 return TRACE_RETURN (lig_set.would_apply (c)); 796 return_trace (lig_set.would_apply (c));
797 } 797 }
798 798
799 inline bool apply (hb_apply_context_t *c) const 799 inline bool apply (hb_apply_context_t *c) const
800 { 800 {
801 TRACE_APPLY (this); 801 TRACE_APPLY (this);
802 hb_codepoint_t glyph_id = c->buffer->cur().codepoint; 802 hb_codepoint_t glyph_id = c->buffer->cur().codepoint;
803 803
804 unsigned int index = (this+coverage).get_coverage (glyph_id); 804 unsigned int index = (this+coverage).get_coverage (glyph_id);
805 if (likely (index == NOT_COVERED)) return TRACE_RETURN (false); 805 if (likely (index == NOT_COVERED)) return_trace (false);
806 806
807 const LigatureSet &lig_set = this+ligatureSet[index]; 807 const LigatureSet &lig_set = this+ligatureSet[index];
808 return TRACE_RETURN (lig_set.apply (c)); 808 return_trace (lig_set.apply (c));
809 } 809 }
810 810
811 inline bool serialize (hb_serialize_context_t *c, 811 inline bool serialize (hb_serialize_context_t *c,
812 Supplier<GlyphID> &first_glyphs, 812 Supplier<GlyphID> &first_glyphs,
813 Supplier<unsigned int> &ligature_per_first_glyph_count_ list, 813 Supplier<unsigned int> &ligature_per_first_glyph_count_ list,
814 unsigned int num_first_glyphs, 814 unsigned int num_first_glyphs,
815 Supplier<GlyphID> &ligatures_list, 815 Supplier<GlyphID> &ligatures_list,
816 Supplier<unsigned int> &component_count_list, 816 Supplier<unsigned int> &component_count_list,
817 Supplier<GlyphID> &component_list /* Starting from seco nd for each ligature */) 817 Supplier<GlyphID> &component_list /* Starting from seco nd for each ligature */)
818 { 818 {
819 TRACE_SERIALIZE (this); 819 TRACE_SERIALIZE (this);
820 if (unlikely (!c->extend_min (*this))) return TRACE_RETURN (false); 820 if (unlikely (!c->extend_min (*this))) return_trace (false);
821 if (unlikely (!ligatureSet.serialize (c, num_first_glyphs))) return TRACE_RE TURN (false); 821 if (unlikely (!ligatureSet.serialize (c, num_first_glyphs))) return_trace (f alse);
822 for (unsigned int i = 0; i < num_first_glyphs; i++) 822 for (unsigned int i = 0; i < num_first_glyphs; i++)
823 if (unlikely (!ligatureSet[i].serialize (c, this).serialize (c, 823 if (unlikely (!ligatureSet[i].serialize (c, this).serialize (c,
824 ligatures_lis t, 824 ligatures_lis t,
825 component_cou nt_list, 825 component_cou nt_list,
826 ligature_per_ first_glyph_count_list[i], 826 ligature_per_ first_glyph_count_list[i],
827 » » » » » » » » component_lis t))) return TRACE_RETURN (false); 827 » » » » » » » » component_lis t))) return_trace (false);
828 ligature_per_first_glyph_count_list.advance (num_first_glyphs); 828 ligature_per_first_glyph_count_list.advance (num_first_glyphs);
829 if (unlikely (!coverage.serialize (c, this).serialize (c, first_glyphs, num_ first_glyphs))) return TRACE_RETURN (false); 829 if (unlikely (!coverage.serialize (c, this).serialize (c, first_glyphs, num_ first_glyphs))) return_trace (false);
830 return TRACE_RETURN (true); 830 return_trace (true);
831 } 831 }
832 832
833 inline bool sanitize (hb_sanitize_context_t *c) const 833 inline bool sanitize (hb_sanitize_context_t *c) const
834 { 834 {
835 TRACE_SANITIZE (this); 835 TRACE_SANITIZE (this);
836 return TRACE_RETURN (coverage.sanitize (c, this) && ligatureSet.sanitize (c, this)); 836 return_trace (coverage.sanitize (c, this) && ligatureSet.sanitize (c, this)) ;
837 } 837 }
838 838
839 protected: 839 protected:
840 USHORT format; /* Format identifier--format = 1 */ 840 USHORT format; /* Format identifier--format = 1 */
841 OffsetTo<Coverage> 841 OffsetTo<Coverage>
842 coverage; /* Offset to Coverage table--from 842 coverage; /* Offset to Coverage table--from
843 * beginning of Substitution table */ 843 * beginning of Substitution table */
844 OffsetArrayOf<LigatureSet> 844 OffsetArrayOf<LigatureSet>
845 ligatureSet; /* Array LigatureSet tables 845 ligatureSet; /* Array LigatureSet tables
846 * ordered by Coverage Index */ 846 * ordered by Coverage Index */
847 public: 847 public:
848 DEFINE_SIZE_ARRAY (6, ligatureSet); 848 DEFINE_SIZE_ARRAY (6, ligatureSet);
849 }; 849 };
850 850
851 struct LigatureSubst 851 struct LigatureSubst
852 { 852 {
853 inline bool serialize (hb_serialize_context_t *c, 853 inline bool serialize (hb_serialize_context_t *c,
854 Supplier<GlyphID> &first_glyphs, 854 Supplier<GlyphID> &first_glyphs,
855 Supplier<unsigned int> &ligature_per_first_glyph_count_ list, 855 Supplier<unsigned int> &ligature_per_first_glyph_count_ list,
856 unsigned int num_first_glyphs, 856 unsigned int num_first_glyphs,
857 Supplier<GlyphID> &ligatures_list, 857 Supplier<GlyphID> &ligatures_list,
858 Supplier<unsigned int> &component_count_list, 858 Supplier<unsigned int> &component_count_list,
859 Supplier<GlyphID> &component_list /* Starting from seco nd for each ligature */) 859 Supplier<GlyphID> &component_list /* Starting from seco nd for each ligature */)
860 { 860 {
861 TRACE_SERIALIZE (this); 861 TRACE_SERIALIZE (this);
862 if (unlikely (!c->extend_min (u.format))) return TRACE_RETURN (false); 862 if (unlikely (!c->extend_min (u.format))) return_trace (false);
863 unsigned int format = 1; 863 unsigned int format = 1;
864 u.format.set (format); 864 u.format.set (format);
865 switch (u.format) { 865 switch (u.format) {
866 case 1: return TRACE_RETURN (u.format1.serialize (c, first_glyphs, ligature_ per_first_glyph_count_list, num_first_glyphs, 866 case 1: return_trace (u.format1.serialize (c,
867 » » » » » » ligatures_list, component_ count_list, component_list)); 867 » » » » » first_glyphs,
868 default:return TRACE_RETURN (false); 868 » » » » » ligature_per_first_glyph_count_li st,
869 » » » » » num_first_glyphs,
870 » » » » » ligatures_list,
871 » » » » » component_count_list,
872 » » » » » component_list));
873 default:return_trace (false);
869 } 874 }
870 } 875 }
871 876
872 template <typename context_t> 877 template <typename context_t>
873 inline typename context_t::return_t dispatch (context_t *c) const 878 inline typename context_t::return_t dispatch (context_t *c) const
874 { 879 {
875 TRACE_DISPATCH (this, u.format); 880 TRACE_DISPATCH (this, u.format);
876 if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_ return_value ()); 881 if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispa tch_return_value ());
877 switch (u.format) { 882 switch (u.format) {
878 case 1: return TRACE_RETURN (c->dispatch (u.format1)); 883 case 1: return_trace (c->dispatch (u.format1));
879 default:return TRACE_RETURN (c->default_return_value ()); 884 default:return_trace (c->default_return_value ());
880 } 885 }
881 } 886 }
882 887
883 protected: 888 protected:
884 union { 889 union {
885 USHORT format; /* Format identifier */ 890 USHORT format; /* Format identifier */
886 LigatureSubstFormat1 format1; 891 LigatureSubstFormat1 format1;
887 } u; 892 } u;
888 }; 893 };
889 894
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 } 957 }
953 958
954 inline const Coverage &get_coverage (void) const 959 inline const Coverage &get_coverage (void) const
955 { 960 {
956 return this+coverage; 961 return this+coverage;
957 } 962 }
958 963
959 inline bool would_apply (hb_would_apply_context_t *c) const 964 inline bool would_apply (hb_would_apply_context_t *c) const
960 { 965 {
961 TRACE_WOULD_APPLY (this); 966 TRACE_WOULD_APPLY (this);
962 return TRACE_RETURN (c->len == 1 && (this+coverage).get_coverage (c->glyphs[ 0]) != NOT_COVERED); 967 return_trace (c->len == 1 && (this+coverage).get_coverage (c->glyphs[0]) != NOT_COVERED);
963 } 968 }
964 969
965 inline bool apply (hb_apply_context_t *c) const 970 inline bool apply (hb_apply_context_t *c) const
966 { 971 {
967 TRACE_APPLY (this); 972 TRACE_APPLY (this);
968 if (unlikely (c->nesting_level_left != MAX_NESTING_LEVEL)) 973 if (unlikely (c->nesting_level_left != MAX_NESTING_LEVEL))
969 return TRACE_RETURN (false); /* No chaining to this type */ 974 return_trace (false); /* No chaining to this type */
970 975
971 unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoin t); 976 unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoin t);
972 if (likely (index == NOT_COVERED)) return TRACE_RETURN (false); 977 if (likely (index == NOT_COVERED)) return_trace (false);
973 978
974 const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverag e> > (backtrack); 979 const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverag e> > (backtrack);
975 const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahe ad); 980 const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahe ad);
976 981
977 if (match_backtrack (c, 982 if (match_backtrack (c,
978 backtrack.len, (USHORT *) backtrack.array, 983 backtrack.len, (USHORT *) backtrack.array,
979 match_coverage, this) && 984 match_coverage, this) &&
980 match_lookahead (c, 985 match_lookahead (c,
981 lookahead.len, (USHORT *) lookahead.array, 986 lookahead.len, (USHORT *) lookahead.array,
982 match_coverage, this, 987 match_coverage, this,
983 1)) 988 1))
984 { 989 {
985 c->replace_glyph_inplace (substitute[index]); 990 c->replace_glyph_inplace (substitute[index]);
986 /* Note: We DON'T decrease buffer->idx. The main loop does it 991 /* Note: We DON'T decrease buffer->idx. The main loop does it
987 * for us. This is useful for preventing surprises if someone 992 * for us. This is useful for preventing surprises if someone
988 * calls us through a Context lookup. */ 993 * calls us through a Context lookup. */
989 return TRACE_RETURN (true); 994 return_trace (true);
990 } 995 }
991 996
992 return TRACE_RETURN (false); 997 return_trace (false);
993 } 998 }
994 999
995 inline bool sanitize (hb_sanitize_context_t *c) const 1000 inline bool sanitize (hb_sanitize_context_t *c) const
996 { 1001 {
997 TRACE_SANITIZE (this); 1002 TRACE_SANITIZE (this);
998 if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this))) 1003 if (!(coverage.sanitize (c, this) && backtrack.sanitize (c, this)))
999 return TRACE_RETURN (false); 1004 return_trace (false);
1000 const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverag e> > (backtrack); 1005 const OffsetArrayOf<Coverage> &lookahead = StructAfter<OffsetArrayOf<Coverag e> > (backtrack);
1001 if (!lookahead.sanitize (c, this)) 1006 if (!lookahead.sanitize (c, this))
1002 return TRACE_RETURN (false); 1007 return_trace (false);
1003 const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahe ad); 1008 const ArrayOf<GlyphID> &substitute = StructAfter<ArrayOf<GlyphID> > (lookahe ad);
1004 return TRACE_RETURN (substitute.sanitize (c)); 1009 return_trace (substitute.sanitize (c));
1005 } 1010 }
1006 1011
1007 protected: 1012 protected:
1008 USHORT format; /* Format identifier--format = 1 */ 1013 USHORT format; /* Format identifier--format = 1 */
1009 OffsetTo<Coverage> 1014 OffsetTo<Coverage>
1010 coverage; /* Offset to Coverage table--from 1015 coverage; /* Offset to Coverage table--from
1011 * beginning of table */ 1016 * beginning of table */
1012 OffsetArrayOf<Coverage> 1017 OffsetArrayOf<Coverage>
1013 backtrack; /* Array of coverage tables 1018 backtrack; /* Array of coverage tables
1014 * in backtracking sequence, in glyph 1019 * in backtracking sequence, in glyph
1015 * sequence order */ 1020 * sequence order */
1016 OffsetArrayOf<Coverage> 1021 OffsetArrayOf<Coverage>
1017 lookaheadX; /* Array of coverage tables 1022 lookaheadX; /* Array of coverage tables
1018 * in lookahead sequence, in glyph 1023 * in lookahead sequence, in glyph
1019 * sequence order */ 1024 * sequence order */
1020 ArrayOf<GlyphID> 1025 ArrayOf<GlyphID>
1021 substituteX; /* Array of substitute 1026 substituteX; /* Array of substitute
1022 * GlyphIDs--ordered by Coverage Index * / 1027 * GlyphIDs--ordered by Coverage Index * /
1023 public: 1028 public:
1024 DEFINE_SIZE_MIN (10); 1029 DEFINE_SIZE_MIN (10);
1025 }; 1030 };
1026 1031
1027 struct ReverseChainSingleSubst 1032 struct ReverseChainSingleSubst
1028 { 1033 {
1029 template <typename context_t> 1034 template <typename context_t>
1030 inline typename context_t::return_t dispatch (context_t *c) const 1035 inline typename context_t::return_t dispatch (context_t *c) const
1031 { 1036 {
1032 TRACE_DISPATCH (this, u.format); 1037 TRACE_DISPATCH (this, u.format);
1033 if (unlikely (!c->may_dispatch (this, &u.format))) TRACE_RETURN (c->default_ return_value ()); 1038 if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispa tch_return_value ());
1034 switch (u.format) { 1039 switch (u.format) {
1035 case 1: return TRACE_RETURN (c->dispatch (u.format1)); 1040 case 1: return_trace (c->dispatch (u.format1));
1036 default:return TRACE_RETURN (c->default_return_value ()); 1041 default:return_trace (c->default_return_value ());
1037 } 1042 }
1038 } 1043 }
1039 1044
1040 protected: 1045 protected:
1041 union { 1046 union {
1042 USHORT format; /* Format identifier */ 1047 USHORT format; /* Format identifier */
1043 ReverseChainSingleSubstFormat1 format1; 1048 ReverseChainSingleSubstFormat1 format1;
1044 } u; 1049 } u;
1045 }; 1050 };
1046 1051
(...skipping 15 matching lines...) Expand all
1062 Context = 5, 1067 Context = 5,
1063 ChainContext = 6, 1068 ChainContext = 6,
1064 Extension = 7, 1069 Extension = 7,
1065 ReverseChainSingle = 8 1070 ReverseChainSingle = 8
1066 }; 1071 };
1067 1072
1068 template <typename context_t> 1073 template <typename context_t>
1069 inline typename context_t::return_t dispatch (context_t *c, unsigned int looku p_type) const 1074 inline typename context_t::return_t dispatch (context_t *c, unsigned int looku p_type) const
1070 { 1075 {
1071 TRACE_DISPATCH (this, lookup_type); 1076 TRACE_DISPATCH (this, lookup_type);
1072 /* The sub_format passed to may_dispatch is unnecessary but harmless. */ 1077 if (unlikely (!c->may_dispatch (this, &u.sub_format))) return_trace (c->no_d ispatch_return_value ());
1073 if (unlikely (!c->may_dispatch (this, &u.sub_format))) TRACE_RETURN (c->defa ult_return_value ());
1074 switch (lookup_type) { 1078 switch (lookup_type) {
1075 case Single:» » return TRACE_RETURN (u.single.dispatch (c)); 1079 case Single:» » return_trace (u.single.dispatch (c));
1076 case Multiple:» » return TRACE_RETURN (u.multiple.dispatch (c)); 1080 case Multiple:» » return_trace (u.multiple.dispatch (c));
1077 case Alternate:» » return TRACE_RETURN (u.alternate.dispatch (c)); 1081 case Alternate:» » return_trace (u.alternate.dispatch (c));
1078 case Ligature:» » return TRACE_RETURN (u.ligature.dispatch (c)); 1082 case Ligature:» » return_trace (u.ligature.dispatch (c));
1079 case Context:» » return TRACE_RETURN (u.context.dispatch (c)); 1083 case Context:» » return_trace (u.context.dispatch (c));
1080 case ChainContext:» » return TRACE_RETURN (u.chainContext.dispatch (c) ); 1084 case ChainContext:» » return_trace (u.chainContext.dispatch (c));
1081 case Extension:» » return TRACE_RETURN (u.extension.dispatch (c)); 1085 case Extension:» » return_trace (u.extension.dispatch (c));
1082 case ReverseChainSingle:» return TRACE_RETURN (u.reverseChainContextSingle .dispatch (c)); 1086 case ReverseChainSingle:» return_trace (u.reverseChainContextSingle.dispat ch (c));
1083 default:» » » return TRACE_RETURN (c->default_return_value ()) ; 1087 default:» » » return_trace (c->default_return_value ());
1084 } 1088 }
1085 } 1089 }
1086 1090
1087 protected: 1091 protected:
1088 union { 1092 union {
1089 USHORT sub_format; 1093 USHORT sub_format;
1090 SingleSubst single; 1094 SingleSubst single;
1091 MultipleSubst multiple; 1095 MultipleSubst multiple;
1092 AlternateSubst alternate; 1096 AlternateSubst alternate;
1093 LigatureSubst ligature; 1097 LigatureSubst ligature;
(...skipping 19 matching lines...) Expand all
1113 { 1117 {
1114 unsigned int type = get_type (); 1118 unsigned int type = get_type ();
1115 if (unlikely (type == SubstLookupSubTable::Extension)) 1119 if (unlikely (type == SubstLookupSubTable::Extension))
1116 return CastR<ExtensionSubst> (get_subtable(0)).is_reverse (); 1120 return CastR<ExtensionSubst> (get_subtable(0)).is_reverse ();
1117 return lookup_type_is_reverse (type); 1121 return lookup_type_is_reverse (type);
1118 } 1122 }
1119 1123
1120 inline bool apply (hb_apply_context_t *c) const 1124 inline bool apply (hb_apply_context_t *c) const
1121 { 1125 {
1122 TRACE_APPLY (this); 1126 TRACE_APPLY (this);
1123 return TRACE_RETURN (dispatch (c)); 1127 return_trace (dispatch (c));
1124 } 1128 }
1125 1129
1126 inline hb_closure_context_t::return_t closure (hb_closure_context_t *c) const 1130 inline hb_closure_context_t::return_t closure (hb_closure_context_t *c) const
1127 { 1131 {
1128 TRACE_CLOSURE (this); 1132 TRACE_CLOSURE (this);
1129 c->set_recurse_func (dispatch_recurse_func<hb_closure_context_t>); 1133 c->set_recurse_func (dispatch_recurse_func<hb_closure_context_t>);
1130 return TRACE_RETURN (dispatch (c)); 1134 return_trace (dispatch (c));
1131 } 1135 }
1132 1136
1133 inline hb_collect_glyphs_context_t::return_t collect_glyphs (hb_collect_glyphs _context_t *c) const 1137 inline hb_collect_glyphs_context_t::return_t collect_glyphs (hb_collect_glyphs _context_t *c) const
1134 { 1138 {
1135 TRACE_COLLECT_GLYPHS (this); 1139 TRACE_COLLECT_GLYPHS (this);
1136 c->set_recurse_func (dispatch_recurse_func<hb_collect_glyphs_context_t>); 1140 c->set_recurse_func (dispatch_recurse_func<hb_collect_glyphs_context_t>);
1137 return TRACE_RETURN (dispatch (c)); 1141 return_trace (dispatch (c));
1138 } 1142 }
1139 1143
1140 template <typename set_t> 1144 template <typename set_t>
1141 inline void add_coverage (set_t *glyphs) const 1145 inline void add_coverage (set_t *glyphs) const
1142 { 1146 {
1143 hb_add_coverage_context_t<set_t> c (glyphs); 1147 hb_add_coverage_context_t<set_t> c (glyphs);
1144 dispatch (&c); 1148 dispatch (&c);
1145 } 1149 }
1146 1150
1147 inline bool would_apply (hb_would_apply_context_t *c, 1151 inline bool would_apply (hb_would_apply_context_t *c,
1148 const hb_ot_layout_lookup_accelerator_t *accel) const 1152 const hb_ot_layout_lookup_accelerator_t *accel) const
1149 { 1153 {
1150 TRACE_WOULD_APPLY (this); 1154 TRACE_WOULD_APPLY (this);
1151 if (unlikely (!c->len)) return TRACE_RETURN (false); 1155 if (unlikely (!c->len)) return_trace (false);
1152 if (!accel->may_have (c->glyphs[0])) return TRACE_RETURN (false); 1156 if (!accel->may_have (c->glyphs[0])) return_trace (false);
1153 return TRACE_RETURN (dispatch (c)); 1157 return_trace (dispatch (c));
1154 } 1158 }
1155 1159
1156 static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_ind ex); 1160 static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_ind ex);
1157 1161
1158 inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c, 1162 inline SubstLookupSubTable& serialize_subtable (hb_serialize_context_t *c,
1159 unsigned int i) 1163 unsigned int i)
1160 { return get_subtables<SubstLookupSubTable> ()[i].serialize (c, this); } 1164 { return get_subtables<SubstLookupSubTable> ()[i].serialize (c, this); }
1161 1165
1162 inline bool serialize_single (hb_serialize_context_t *c, 1166 inline bool serialize_single (hb_serialize_context_t *c,
1163 uint32_t lookup_props, 1167 uint32_t lookup_props,
1164 Supplier<GlyphID> &glyphs, 1168 Supplier<GlyphID> &glyphs,
1165 Supplier<GlyphID> &substitutes, 1169 Supplier<GlyphID> &substitutes,
1166 unsigned int num_glyphs) 1170 unsigned int num_glyphs)
1167 { 1171 {
1168 TRACE_SERIALIZE (this); 1172 TRACE_SERIALIZE (this);
1169 if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Single, lookup_pro ps, 1))) return TRACE_RETURN (false); 1173 if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Single, lookup_pro ps, 1))) return_trace (false);
1170 return TRACE_RETURN (serialize_subtable (c, 0).u.single.serialize (c, glyphs , substitutes, num_glyphs)); 1174 return_trace (serialize_subtable (c, 0).u.single.serialize (c, glyphs, subst itutes, num_glyphs));
1171 } 1175 }
1172 1176
1173 inline bool serialize_multiple (hb_serialize_context_t *c, 1177 inline bool serialize_multiple (hb_serialize_context_t *c,
1174 uint32_t lookup_props, 1178 uint32_t lookup_props,
1175 Supplier<GlyphID> &glyphs, 1179 Supplier<GlyphID> &glyphs,
1176 Supplier<unsigned int> &substitute_len_list, 1180 Supplier<unsigned int> &substitute_len_list,
1177 unsigned int num_glyphs, 1181 unsigned int num_glyphs,
1178 Supplier<GlyphID> &substitute_glyphs_list) 1182 Supplier<GlyphID> &substitute_glyphs_list)
1179 { 1183 {
1180 TRACE_SERIALIZE (this); 1184 TRACE_SERIALIZE (this);
1181 if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Multiple, lookup_p rops, 1))) return TRACE_RETURN (false); 1185 if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Multiple, lookup_p rops, 1))) return_trace (false);
1182 return TRACE_RETURN (serialize_subtable (c, 0).u.multiple.serialize (c, glyp hs, substitute_len_list, num_glyphs, 1186 return_trace (serialize_subtable (c, 0).u.multiple.serialize (c,
1183 » » » » » » » » » substit ute_glyphs_list)); 1187 » » » » » » » » glyphs,
1188 » » » » » » » » substitute_len _list,
1189 » » » » » » » » num_glyphs,
1190 » » » » » » » » substitute_gly phs_list));
1184 } 1191 }
1185 1192
1186 inline bool serialize_alternate (hb_serialize_context_t *c, 1193 inline bool serialize_alternate (hb_serialize_context_t *c,
1187 uint32_t lookup_props, 1194 uint32_t lookup_props,
1188 Supplier<GlyphID> &glyphs, 1195 Supplier<GlyphID> &glyphs,
1189 Supplier<unsigned int> &alternate_len_list, 1196 Supplier<unsigned int> &alternate_len_list,
1190 unsigned int num_glyphs, 1197 unsigned int num_glyphs,
1191 Supplier<GlyphID> &alternate_glyphs_list) 1198 Supplier<GlyphID> &alternate_glyphs_list)
1192 { 1199 {
1193 TRACE_SERIALIZE (this); 1200 TRACE_SERIALIZE (this);
1194 if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Alternate, lookup_ props, 1))) return TRACE_RETURN (false); 1201 if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Alternate, lookup_ props, 1))) return_trace (false);
1195 return TRACE_RETURN (serialize_subtable (c, 0).u.alternate.serialize (c, gly phs, alternate_len_list, num_glyphs, 1202 return_trace (serialize_subtable (c, 0).u.alternate.serialize (c,
1196 » » » » » » » » » altern ate_glyphs_list)); 1203 » » » » » » » » glyphs,
1204 » » » » » » » » alternate_len _list,
1205 » » » » » » » » num_glyphs,
1206 » » » » » » » » alternate_gly phs_list));
1197 } 1207 }
1198 1208
1199 inline bool serialize_ligature (hb_serialize_context_t *c, 1209 inline bool serialize_ligature (hb_serialize_context_t *c,
1200 uint32_t lookup_props, 1210 uint32_t lookup_props,
1201 Supplier<GlyphID> &first_glyphs, 1211 Supplier<GlyphID> &first_glyphs,
1202 Supplier<unsigned int> &ligature_per_first_gly ph_count_list, 1212 Supplier<unsigned int> &ligature_per_first_gly ph_count_list,
1203 unsigned int num_first_glyphs, 1213 unsigned int num_first_glyphs,
1204 Supplier<GlyphID> &ligatures_list, 1214 Supplier<GlyphID> &ligatures_list,
1205 Supplier<unsigned int> &component_count_list, 1215 Supplier<unsigned int> &component_count_list,
1206 Supplier<GlyphID> &component_list /* Starting from second for each ligature */) 1216 Supplier<GlyphID> &component_list /* Starting from second for each ligature */)
1207 { 1217 {
1208 TRACE_SERIALIZE (this); 1218 TRACE_SERIALIZE (this);
1209 if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Ligature, lookup_p rops, 1))) return TRACE_RETURN (false); 1219 if (unlikely (!Lookup::serialize (c, SubstLookupSubTable::Ligature, lookup_p rops, 1))) return_trace (false);
1210 return TRACE_RETURN (serialize_subtable (c, 0).u.ligature.serialize (c, firs t_glyphs, ligature_per_first_glyph_count_list, num_first_glyphs, 1220 return_trace (serialize_subtable (c, 0).u.ligature.serialize (c,
1211 » » » » » » » » » ligatur es_list, component_count_list, component_list)); 1221 » » » » » » » » first_glyphs,
1222 » » » » » » » » ligature_per_f irst_glyph_count_list,
1223 » » » » » » » » num_first_glyp hs,
1224 » » » » » » » » ligatures_list ,
1225 » » » » » » » » component_coun t_list,
1226 » » » » » » » » component_list ));
1212 } 1227 }
1213 1228
1214 template <typename context_t> 1229 template <typename context_t>
1215 static inline typename context_t::return_t dispatch_recurse_func (context_t *c , unsigned int lookup_index); 1230 static inline typename context_t::return_t dispatch_recurse_func (context_t *c , unsigned int lookup_index);
1216 1231
1217 template <typename context_t> 1232 template <typename context_t>
1218 inline typename context_t::return_t dispatch (context_t *c) const 1233 inline typename context_t::return_t dispatch (context_t *c) const
1219 { return Lookup::dispatch<SubstLookupSubTable> (c); } 1234 { return Lookup::dispatch<SubstLookupSubTable> (c); }
1220 1235
1221 inline bool sanitize (hb_sanitize_context_t *c) const 1236 inline bool sanitize (hb_sanitize_context_t *c) const
1222 { 1237 {
1223 TRACE_SANITIZE (this); 1238 TRACE_SANITIZE (this);
1224 if (unlikely (!Lookup::sanitize (c))) return TRACE_RETURN (false); 1239 if (unlikely (!Lookup::sanitize (c))) return_trace (false);
1225 if (unlikely (!dispatch (c))) return TRACE_RETURN (false); 1240 if (unlikely (!dispatch (c))) return_trace (false);
1226 1241
1227 if (unlikely (get_type () == SubstLookupSubTable::Extension)) 1242 if (unlikely (get_type () == SubstLookupSubTable::Extension))
1228 { 1243 {
1229 /* The spec says all subtables of an Extension lookup should 1244 /* The spec says all subtables of an Extension lookup should
1230 * have the same type. This is specially important if one has 1245 * have the same type. This is specially important if one has
1231 * a reverse type! */ 1246 * a reverse type! */
1232 unsigned int type = get_subtable (0).u.extension.get_type (); 1247 unsigned int type = get_subtable (0).u.extension.get_type ();
1233 unsigned int count = get_subtable_count (); 1248 unsigned int count = get_subtable_count ();
1234 for (unsigned int i = 1; i < count; i++) 1249 for (unsigned int i = 1; i < count; i++)
1235 if (get_subtable (i).u.extension.get_type () != type) 1250 if (get_subtable (i).u.extension.get_type () != type)
1236 » return TRACE_RETURN (false); 1251 » return_trace (false);
1237 } 1252 }
1238 return TRACE_RETURN (true); 1253 return_trace (true);
1239 } 1254 }
1240 }; 1255 };
1241 1256
1242 typedef OffsetListOf<SubstLookup> SubstLookupList; 1257 typedef OffsetListOf<SubstLookup> SubstLookupList;
1243 1258
1244 /* 1259 /*
1245 * GSUB -- The Glyph Substitution Table 1260 * GSUB -- The Glyph Substitution Table
1246 */ 1261 */
1247 1262
1248 struct GSUB : GSUBGPOS 1263 struct GSUB : GSUBGPOS
1249 { 1264 {
1250 static const hb_tag_t tableTag = HB_OT_TAG_GSUB; 1265 static const hb_tag_t tableTag = HB_OT_TAG_GSUB;
1251 1266
1252 inline const SubstLookup& get_lookup (unsigned int i) const 1267 inline const SubstLookup& get_lookup (unsigned int i) const
1253 { return CastR<SubstLookup> (GSUBGPOS::get_lookup (i)); } 1268 { return CastR<SubstLookup> (GSUBGPOS::get_lookup (i)); }
1254 1269
1255 static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer); 1270 static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer);
1256 static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer); 1271 static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer);
1257 1272
1258 inline bool sanitize (hb_sanitize_context_t *c) const 1273 inline bool sanitize (hb_sanitize_context_t *c) const
1259 { 1274 {
1260 TRACE_SANITIZE (this); 1275 TRACE_SANITIZE (this);
1261 if (unlikely (!GSUBGPOS::sanitize (c))) return TRACE_RETURN (false); 1276 if (unlikely (!GSUBGPOS::sanitize (c))) return_trace (false);
1262 const OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (l ookupList); 1277 const OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (l ookupList);
1263 return TRACE_RETURN (list.sanitize (c, this)); 1278 return_trace (list.sanitize (c, this));
1264 } 1279 }
1265 public: 1280 public:
1266 DEFINE_SIZE_STATIC (10); 1281 DEFINE_SIZE_STATIC (10);
1267 }; 1282 };
1268 1283
1269 1284
1270 void 1285 void
1271 GSUB::substitute_start (hb_font_t *font, hb_buffer_t *buffer) 1286 GSUB::substitute_start (hb_font_t *font, hb_buffer_t *buffer)
1272 { 1287 {
1273 _hb_buffer_assert_gsubgpos_vars (buffer); 1288 _hb_buffer_assert_gsubgpos_vars (buffer);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1318 c->set_lookup_index (saved_lookup_index); 1333 c->set_lookup_index (saved_lookup_index);
1319 c->set_lookup_props (saved_lookup_props); 1334 c->set_lookup_props (saved_lookup_props);
1320 return ret; 1335 return ret;
1321 } 1336 }
1322 1337
1323 1338
1324 } /* namespace OT */ 1339 } /* namespace OT */
1325 1340
1326 1341
1327 #endif /* HB_OT_LAYOUT_GSUB_TABLE_HH */ 1342 #endif /* HB_OT_LAYOUT_GSUB_TABLE_HH */
OLDNEW
« no previous file with comments | « third_party/harfbuzz-ng/src/hb-ot-layout-gpos-table.hh ('k') | third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698