OLD | NEW |
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 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 public: | 338 public: |
339 DEFINE_SIZE_UNION (2, format); | 339 DEFINE_SIZE_UNION (2, format); |
340 }; | 340 }; |
341 | 341 |
342 | 342 |
343 struct AnchorMatrix | 343 struct AnchorMatrix |
344 { | 344 { |
345 inline const Anchor& get_anchor (unsigned int row, unsigned int col, unsigned
int cols, bool *found) const { | 345 inline const Anchor& get_anchor (unsigned int row, unsigned int col, unsigned
int cols, bool *found) const { |
346 *found = false; | 346 *found = false; |
347 if (unlikely (row >= rows || col >= cols)) return Null(Anchor); | 347 if (unlikely (row >= rows || col >= cols)) return Null(Anchor); |
348 *found = !matrix[row * cols + col].is_null (); | 348 *found = !matrixZ[row * cols + col].is_null (); |
349 return this+matrix[row * cols + col]; | 349 return this+matrixZ[row * cols + col]; |
350 } | 350 } |
351 | 351 |
352 inline bool sanitize (hb_sanitize_context_t *c, unsigned int cols) { | 352 inline bool sanitize (hb_sanitize_context_t *c, unsigned int cols) { |
353 TRACE_SANITIZE (this); | 353 TRACE_SANITIZE (this); |
354 if (!c->check_struct (this)) return TRACE_RETURN (false); | 354 if (!c->check_struct (this)) return TRACE_RETURN (false); |
355 if (unlikely (rows > 0 && cols >= ((unsigned int) -1) / rows)) return TRACE_
RETURN (false); | 355 if (unlikely (rows > 0 && cols >= ((unsigned int) -1) / rows)) return TRACE_
RETURN (false); |
356 unsigned int count = rows * cols; | 356 unsigned int count = rows * cols; |
357 if (!c->check_array (matrix, matrix[0].static_size, count)) return TRACE_RET
URN (false); | 357 if (!c->check_array (matrixZ, matrixZ[0].static_size, count)) return TRACE_R
ETURN (false); |
358 for (unsigned int i = 0; i < count; i++) | 358 for (unsigned int i = 0; i < count; i++) |
359 if (!matrix[i].sanitize (c, this)) return TRACE_RETURN (false); | 359 if (!matrixZ[i].sanitize (c, this)) return TRACE_RETURN (false); |
360 return TRACE_RETURN (true); | 360 return TRACE_RETURN (true); |
361 } | 361 } |
362 | 362 |
363 USHORT rows; /* Number of rows */ | 363 USHORT rows; /* Number of rows */ |
364 protected: | 364 protected: |
365 OffsetTo<Anchor> | 365 OffsetTo<Anchor> |
366 » » matrix[VAR];» » /* Matrix of offsets to Anchor tables-- | 366 » » matrixZ[VAR];» » /* Matrix of offsets to Anchor tables-- |
367 * from beginning of AnchorMatrix table
*/ | 367 * from beginning of AnchorMatrix table
*/ |
368 public: | 368 public: |
369 DEFINE_SIZE_ARRAY (2, matrix); | 369 DEFINE_SIZE_ARRAY (2, matrixZ); |
370 }; | 370 }; |
371 | 371 |
372 | 372 |
373 struct MarkRecord | 373 struct MarkRecord |
374 { | 374 { |
375 friend struct MarkArray; | 375 friend struct MarkArray; |
376 | 376 |
377 inline bool sanitize (hb_sanitize_context_t *c, void *base) { | 377 inline bool sanitize (hb_sanitize_context_t *c, void *base) { |
378 TRACE_SANITIZE (this); | 378 TRACE_SANITIZE (this); |
379 return TRACE_RETURN (c->check_struct (this) && markAnchor.sanitize (c, base)
); | 379 return TRACE_RETURN (c->check_struct (this) && markAnchor.sanitize (c, base)
); |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 * values applied to glyphs */ | 523 * values applied to glyphs */ |
524 public: | 524 public: |
525 DEFINE_SIZE_ARRAY (8, values); | 525 DEFINE_SIZE_ARRAY (8, values); |
526 }; | 526 }; |
527 | 527 |
528 struct SinglePos | 528 struct SinglePos |
529 { | 529 { |
530 template <typename context_t> | 530 template <typename context_t> |
531 inline typename context_t::return_t dispatch (context_t *c) const | 531 inline typename context_t::return_t dispatch (context_t *c) const |
532 { | 532 { |
533 TRACE_DISPATCH (this); | 533 TRACE_DISPATCH (this, u.format); |
534 switch (u.format) { | 534 switch (u.format) { |
535 case 1: return TRACE_RETURN (c->dispatch (u.format1)); | 535 case 1: return TRACE_RETURN (c->dispatch (u.format1)); |
536 case 2: return TRACE_RETURN (c->dispatch (u.format2)); | 536 case 2: return TRACE_RETURN (c->dispatch (u.format2)); |
537 default:return TRACE_RETURN (c->default_return_value ()); | 537 default:return TRACE_RETURN (c->default_return_value ()); |
538 } | 538 } |
539 } | 539 } |
540 | 540 |
541 inline bool sanitize (hb_sanitize_context_t *c) { | 541 inline bool sanitize (hb_sanitize_context_t *c) { |
542 TRACE_SANITIZE (this); | 542 TRACE_SANITIZE (this); |
543 if (!u.format.sanitize (c)) return TRACE_RETURN (false); | 543 if (!u.format.sanitize (c)) return TRACE_RETURN (false); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 friend struct PairPosFormat1; | 576 friend struct PairPosFormat1; |
577 | 577 |
578 inline void collect_glyphs (hb_collect_glyphs_context_t *c, | 578 inline void collect_glyphs (hb_collect_glyphs_context_t *c, |
579 const ValueFormat *valueFormats) const | 579 const ValueFormat *valueFormats) const |
580 { | 580 { |
581 TRACE_COLLECT_GLYPHS (this); | 581 TRACE_COLLECT_GLYPHS (this); |
582 unsigned int len1 = valueFormats[0].get_len (); | 582 unsigned int len1 = valueFormats[0].get_len (); |
583 unsigned int len2 = valueFormats[1].get_len (); | 583 unsigned int len2 = valueFormats[1].get_len (); |
584 unsigned int record_size = USHORT::static_size * (1 + len1 + len2); | 584 unsigned int record_size = USHORT::static_size * (1 + len1 + len2); |
585 | 585 |
586 const PairValueRecord *record = CastP<PairValueRecord> (array); | 586 const PairValueRecord *record = CastP<PairValueRecord> (arrayZ); |
587 unsigned int count = len; | 587 unsigned int count = len; |
588 for (unsigned int i = 0; i < count; i++) | 588 for (unsigned int i = 0; i < count; i++) |
589 { | 589 { |
590 c->input->add (record->secondGlyph); | 590 c->input->add (record->secondGlyph); |
591 record = &StructAtOffset<PairValueRecord> (record, record_size); | 591 record = &StructAtOffset<PairValueRecord> (record, record_size); |
592 } | 592 } |
593 } | 593 } |
594 | 594 |
595 inline bool apply (hb_apply_context_t *c, | 595 inline bool apply (hb_apply_context_t *c, |
596 const ValueFormat *valueFormats, | 596 const ValueFormat *valueFormats, |
597 unsigned int pos) const | 597 unsigned int pos) const |
598 { | 598 { |
599 TRACE_APPLY (this); | 599 TRACE_APPLY (this); |
600 hb_buffer_t *buffer = c->buffer; | 600 hb_buffer_t *buffer = c->buffer; |
601 unsigned int len1 = valueFormats[0].get_len (); | 601 unsigned int len1 = valueFormats[0].get_len (); |
602 unsigned int len2 = valueFormats[1].get_len (); | 602 unsigned int len2 = valueFormats[1].get_len (); |
603 unsigned int record_size = USHORT::static_size * (1 + len1 + len2); | 603 unsigned int record_size = USHORT::static_size * (1 + len1 + len2); |
604 | 604 |
605 const PairValueRecord *record = CastP<PairValueRecord> (array); | 605 const PairValueRecord *record = CastP<PairValueRecord> (arrayZ); |
606 unsigned int count = len; | 606 unsigned int count = len; |
607 for (unsigned int i = 0; i < count; i++) | 607 for (unsigned int i = 0; i < count; i++) |
608 { | 608 { |
609 /* TODO bsearch */ | 609 /* TODO bsearch */ |
610 if (buffer->info[pos].codepoint == record->secondGlyph) | 610 if (buffer->info[pos].codepoint == record->secondGlyph) |
611 { | 611 { |
612 valueFormats[0].apply_value (c->font, c->direction, this, | 612 valueFormats[0].apply_value (c->font, c->direction, this, |
613 &record->values[0], buffer->cur_pos()); | 613 &record->values[0], buffer->cur_pos()); |
614 valueFormats[1].apply_value (c->font, c->direction, this, | 614 valueFormats[1].apply_value (c->font, c->direction, this, |
615 &record->values[len1], buffer->pos[pos]); | 615 &record->values[len1], buffer->pos[pos]); |
(...skipping 11 matching lines...) Expand all Loading... |
627 struct sanitize_closure_t { | 627 struct sanitize_closure_t { |
628 void *base; | 628 void *base; |
629 ValueFormat *valueFormats; | 629 ValueFormat *valueFormats; |
630 unsigned int len1; /* valueFormats[0].get_len() */ | 630 unsigned int len1; /* valueFormats[0].get_len() */ |
631 unsigned int stride; /* 1 + len1 + len2 */ | 631 unsigned int stride; /* 1 + len1 + len2 */ |
632 }; | 632 }; |
633 | 633 |
634 inline bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *clos
ure) { | 634 inline bool sanitize (hb_sanitize_context_t *c, const sanitize_closure_t *clos
ure) { |
635 TRACE_SANITIZE (this); | 635 TRACE_SANITIZE (this); |
636 if (!(c->check_struct (this) | 636 if (!(c->check_struct (this) |
637 && c->check_array (array, USHORT::static_size * closure->stride, len))) r
eturn TRACE_RETURN (false); | 637 && c->check_array (arrayZ, USHORT::static_size * closure->stride, len)))
return TRACE_RETURN (false); |
638 | 638 |
639 unsigned int count = len; | 639 unsigned int count = len; |
640 PairValueRecord *record = CastP<PairValueRecord> (array); | 640 PairValueRecord *record = CastP<PairValueRecord> (arrayZ); |
641 return TRACE_RETURN (closure->valueFormats[0].sanitize_values_stride_unsafe
(c, closure->base, &record->values[0], count, closure->stride) | 641 return TRACE_RETURN (closure->valueFormats[0].sanitize_values_stride_unsafe
(c, closure->base, &record->values[0], count, closure->stride) |
642 && closure->valueFormats[1].sanitize_values_stride_unsafe
(c, closure->base, &record->values[closure->len1], count, closure->stride)); | 642 && closure->valueFormats[1].sanitize_values_stride_unsafe
(c, closure->base, &record->values[closure->len1], count, closure->stride)); |
643 } | 643 } |
644 | 644 |
645 protected: | 645 protected: |
646 USHORT len; /* Number of PairValueRecords */ | 646 USHORT len; /* Number of PairValueRecords */ |
647 USHORT» array[VAR];» » /* Array of PairValueRecords--ordered | 647 USHORT» arrayZ[VAR];» » /* Array of PairValueRecords--ordered |
648 * by GlyphID of the second glyph */ | 648 * by GlyphID of the second glyph */ |
649 public: | 649 public: |
650 DEFINE_SIZE_ARRAY (2, array); | 650 DEFINE_SIZE_ARRAY (2, arrayZ); |
651 }; | 651 }; |
652 | 652 |
653 struct PairPosFormat1 | 653 struct PairPosFormat1 |
654 { | 654 { |
655 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const | 655 inline void collect_glyphs (hb_collect_glyphs_context_t *c) const |
656 { | 656 { |
657 TRACE_COLLECT_GLYPHS (this); | 657 TRACE_COLLECT_GLYPHS (this); |
658 (this+coverage).add_coverage (c->input); | 658 (this+coverage).add_coverage (c->input); |
659 unsigned int count = pairSet.len; | 659 unsigned int count = pairSet.len; |
660 for (unsigned int i = 0; i < count; i++) | 660 for (unsigned int i = 0; i < count; i++) |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
815 * Each entry has value1 and value2 */ | 815 * Each entry has value1 and value2 */ |
816 public: | 816 public: |
817 DEFINE_SIZE_ARRAY (16, values); | 817 DEFINE_SIZE_ARRAY (16, values); |
818 }; | 818 }; |
819 | 819 |
820 struct PairPos | 820 struct PairPos |
821 { | 821 { |
822 template <typename context_t> | 822 template <typename context_t> |
823 inline typename context_t::return_t dispatch (context_t *c) const | 823 inline typename context_t::return_t dispatch (context_t *c) const |
824 { | 824 { |
825 TRACE_DISPATCH (this); | 825 TRACE_DISPATCH (this, u.format); |
826 switch (u.format) { | 826 switch (u.format) { |
827 case 1: return TRACE_RETURN (c->dispatch (u.format1)); | 827 case 1: return TRACE_RETURN (c->dispatch (u.format1)); |
828 case 2: return TRACE_RETURN (c->dispatch (u.format2)); | 828 case 2: return TRACE_RETURN (c->dispatch (u.format2)); |
829 default:return TRACE_RETURN (c->default_return_value ()); | 829 default:return TRACE_RETURN (c->default_return_value ()); |
830 } | 830 } |
831 } | 831 } |
832 | 832 |
833 inline bool sanitize (hb_sanitize_context_t *c) { | 833 inline bool sanitize (hb_sanitize_context_t *c) { |
834 TRACE_SANITIZE (this); | 834 TRACE_SANITIZE (this); |
835 if (!u.format.sanitize (c)) return TRACE_RETURN (false); | 835 if (!u.format.sanitize (c)) return TRACE_RETURN (false); |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
982 * Coverage Index order */ | 982 * Coverage Index order */ |
983 public: | 983 public: |
984 DEFINE_SIZE_ARRAY (6, entryExitRecord); | 984 DEFINE_SIZE_ARRAY (6, entryExitRecord); |
985 }; | 985 }; |
986 | 986 |
987 struct CursivePos | 987 struct CursivePos |
988 { | 988 { |
989 template <typename context_t> | 989 template <typename context_t> |
990 inline typename context_t::return_t dispatch (context_t *c) const | 990 inline typename context_t::return_t dispatch (context_t *c) const |
991 { | 991 { |
992 TRACE_DISPATCH (this); | 992 TRACE_DISPATCH (this, u.format); |
993 switch (u.format) { | 993 switch (u.format) { |
994 case 1: return TRACE_RETURN (c->dispatch (u.format1)); | 994 case 1: return TRACE_RETURN (c->dispatch (u.format1)); |
995 default:return TRACE_RETURN (c->default_return_value ()); | 995 default:return TRACE_RETURN (c->default_return_value ()); |
996 } | 996 } |
997 } | 997 } |
998 | 998 |
999 inline bool sanitize (hb_sanitize_context_t *c) { | 999 inline bool sanitize (hb_sanitize_context_t *c) { |
1000 TRACE_SANITIZE (this); | 1000 TRACE_SANITIZE (this); |
1001 if (!u.format.sanitize (c)) return TRACE_RETURN (false); | 1001 if (!u.format.sanitize (c)) return TRACE_RETURN (false); |
1002 switch (u.format) { | 1002 switch (u.format) { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1081 * beginning of MarkBasePos subtable */ | 1081 * beginning of MarkBasePos subtable */ |
1082 public: | 1082 public: |
1083 DEFINE_SIZE_STATIC (12); | 1083 DEFINE_SIZE_STATIC (12); |
1084 }; | 1084 }; |
1085 | 1085 |
1086 struct MarkBasePos | 1086 struct MarkBasePos |
1087 { | 1087 { |
1088 template <typename context_t> | 1088 template <typename context_t> |
1089 inline typename context_t::return_t dispatch (context_t *c) const | 1089 inline typename context_t::return_t dispatch (context_t *c) const |
1090 { | 1090 { |
1091 TRACE_DISPATCH (this); | 1091 TRACE_DISPATCH (this, u.format); |
1092 switch (u.format) { | 1092 switch (u.format) { |
1093 case 1: return TRACE_RETURN (c->dispatch (u.format1)); | 1093 case 1: return TRACE_RETURN (c->dispatch (u.format1)); |
1094 default:return TRACE_RETURN (c->default_return_value ()); | 1094 default:return TRACE_RETURN (c->default_return_value ()); |
1095 } | 1095 } |
1096 } | 1096 } |
1097 | 1097 |
1098 inline bool sanitize (hb_sanitize_context_t *c) { | 1098 inline bool sanitize (hb_sanitize_context_t *c) { |
1099 TRACE_SANITIZE (this); | 1099 TRACE_SANITIZE (this); |
1100 if (!u.format.sanitize (c)) return TRACE_RETURN (false); | 1100 if (!u.format.sanitize (c)) return TRACE_RETURN (false); |
1101 switch (u.format) { | 1101 switch (u.format) { |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1202 * beginning of MarkLigPos subtable */ | 1202 * beginning of MarkLigPos subtable */ |
1203 public: | 1203 public: |
1204 DEFINE_SIZE_STATIC (12); | 1204 DEFINE_SIZE_STATIC (12); |
1205 }; | 1205 }; |
1206 | 1206 |
1207 struct MarkLigPos | 1207 struct MarkLigPos |
1208 { | 1208 { |
1209 template <typename context_t> | 1209 template <typename context_t> |
1210 inline typename context_t::return_t dispatch (context_t *c) const | 1210 inline typename context_t::return_t dispatch (context_t *c) const |
1211 { | 1211 { |
1212 TRACE_DISPATCH (this); | 1212 TRACE_DISPATCH (this, u.format); |
1213 switch (u.format) { | 1213 switch (u.format) { |
1214 case 1: return TRACE_RETURN (c->dispatch (u.format1)); | 1214 case 1: return TRACE_RETURN (c->dispatch (u.format1)); |
1215 default:return TRACE_RETURN (c->default_return_value ()); | 1215 default:return TRACE_RETURN (c->default_return_value ()); |
1216 } | 1216 } |
1217 } | 1217 } |
1218 | 1218 |
1219 inline bool sanitize (hb_sanitize_context_t *c) { | 1219 inline bool sanitize (hb_sanitize_context_t *c) { |
1220 TRACE_SANITIZE (this); | 1220 TRACE_SANITIZE (this); |
1221 if (!u.format.sanitize (c)) return TRACE_RETURN (false); | 1221 if (!u.format.sanitize (c)) return TRACE_RETURN (false); |
1222 switch (u.format) { | 1222 switch (u.format) { |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1321 * beginning of MarkMarkPos subtable */ | 1321 * beginning of MarkMarkPos subtable */ |
1322 public: | 1322 public: |
1323 DEFINE_SIZE_STATIC (12); | 1323 DEFINE_SIZE_STATIC (12); |
1324 }; | 1324 }; |
1325 | 1325 |
1326 struct MarkMarkPos | 1326 struct MarkMarkPos |
1327 { | 1327 { |
1328 template <typename context_t> | 1328 template <typename context_t> |
1329 inline typename context_t::return_t dispatch (context_t *c) const | 1329 inline typename context_t::return_t dispatch (context_t *c) const |
1330 { | 1330 { |
1331 TRACE_DISPATCH (this); | 1331 TRACE_DISPATCH (this, u.format); |
1332 switch (u.format) { | 1332 switch (u.format) { |
1333 case 1: return TRACE_RETURN (c->dispatch (u.format1)); | 1333 case 1: return TRACE_RETURN (c->dispatch (u.format1)); |
1334 default:return TRACE_RETURN (c->default_return_value ()); | 1334 default:return TRACE_RETURN (c->default_return_value ()); |
1335 } | 1335 } |
1336 } | 1336 } |
1337 | 1337 |
1338 inline bool sanitize (hb_sanitize_context_t *c) { | 1338 inline bool sanitize (hb_sanitize_context_t *c) { |
1339 TRACE_SANITIZE (this); | 1339 TRACE_SANITIZE (this); |
1340 if (!u.format.sanitize (c)) return TRACE_RETURN (false); | 1340 if (!u.format.sanitize (c)) return TRACE_RETURN (false); |
1341 switch (u.format) { | 1341 switch (u.format) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1380 MarkLig = 5, | 1380 MarkLig = 5, |
1381 MarkMark = 6, | 1381 MarkMark = 6, |
1382 Context = 7, | 1382 Context = 7, |
1383 ChainContext = 8, | 1383 ChainContext = 8, |
1384 Extension = 9 | 1384 Extension = 9 |
1385 }; | 1385 }; |
1386 | 1386 |
1387 template <typename context_t> | 1387 template <typename context_t> |
1388 inline typename context_t::return_t dispatch (context_t *c, unsigned int looku
p_type) const | 1388 inline typename context_t::return_t dispatch (context_t *c, unsigned int looku
p_type) const |
1389 { | 1389 { |
1390 TRACE_DISPATCH (this); | 1390 TRACE_DISPATCH (this, lookup_type); |
1391 switch (lookup_type) { | 1391 switch (lookup_type) { |
1392 case Single: return TRACE_RETURN (u.single.dispatch (c)); | 1392 case Single: return TRACE_RETURN (u.single.dispatch (c)); |
1393 case Pair: return TRACE_RETURN (u.pair.dispatch (c)); | 1393 case Pair: return TRACE_RETURN (u.pair.dispatch (c)); |
1394 case Cursive: return TRACE_RETURN (u.cursive.dispatch (c)); | 1394 case Cursive: return TRACE_RETURN (u.cursive.dispatch (c)); |
1395 case MarkBase: return TRACE_RETURN (u.markBase.dispatch (c)); | 1395 case MarkBase: return TRACE_RETURN (u.markBase.dispatch (c)); |
1396 case MarkLig: return TRACE_RETURN (u.markLig.dispatch (c)); | 1396 case MarkLig: return TRACE_RETURN (u.markLig.dispatch (c)); |
1397 case MarkMark: return TRACE_RETURN (u.markMark.dispatch (c)); | 1397 case MarkMark: return TRACE_RETURN (u.markMark.dispatch (c)); |
1398 case Context: return TRACE_RETURN (u.context.dispatch (c)); | 1398 case Context: return TRACE_RETURN (u.context.dispatch (c)); |
1399 case ChainContext: return TRACE_RETURN (u.chainContext.dispatch (c)
); | 1399 case ChainContext: return TRACE_RETURN (u.chainContext.dispatch (c)
); |
1400 case Extension: return TRACE_RETURN (u.extension.dispatch (c)); | 1400 case Extension: return TRACE_RETURN (u.extension.dispatch (c)); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1481 } | 1481 } |
1482 | 1482 |
1483 static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_ind
ex); | 1483 static bool apply_recurse_func (hb_apply_context_t *c, unsigned int lookup_ind
ex); |
1484 | 1484 |
1485 template <typename context_t> | 1485 template <typename context_t> |
1486 static inline typename context_t::return_t dispatch_recurse_func (context_t *c
, unsigned int lookup_index); | 1486 static inline typename context_t::return_t dispatch_recurse_func (context_t *c
, unsigned int lookup_index); |
1487 | 1487 |
1488 template <typename context_t> | 1488 template <typename context_t> |
1489 inline typename context_t::return_t dispatch (context_t *c) const | 1489 inline typename context_t::return_t dispatch (context_t *c) const |
1490 { | 1490 { |
1491 TRACE_DISPATCH (this); | |
1492 unsigned int lookup_type = get_type (); | 1491 unsigned int lookup_type = get_type (); |
| 1492 TRACE_DISPATCH (this, lookup_type); |
1493 unsigned int count = get_subtable_count (); | 1493 unsigned int count = get_subtable_count (); |
1494 for (unsigned int i = 0; i < count; i++) { | 1494 for (unsigned int i = 0; i < count; i++) { |
1495 typename context_t::return_t r = get_subtable (i).dispatch (c, lookup_type
); | 1495 typename context_t::return_t r = get_subtable (i).dispatch (c, lookup_type
); |
1496 if (c->stop_sublookup_iteration (r)) | 1496 if (c->stop_sublookup_iteration (r)) |
1497 return TRACE_RETURN (r); | 1497 return TRACE_RETURN (r); |
1498 } | 1498 } |
1499 return TRACE_RETURN (c->default_return_value ()); | 1499 return TRACE_RETURN (c->default_return_value ()); |
1500 } | 1500 } |
1501 | 1501 |
1502 inline bool sanitize (hb_sanitize_context_t *c) { | 1502 inline bool sanitize (hb_sanitize_context_t *c) { |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1628 | 1628 |
1629 | 1629 |
1630 #undef attach_lookback | 1630 #undef attach_lookback |
1631 #undef cursive_chain | 1631 #undef cursive_chain |
1632 | 1632 |
1633 | 1633 |
1634 } /* namespace OT */ | 1634 } /* namespace OT */ |
1635 | 1635 |
1636 | 1636 |
1637 #endif /* HB_OT_LAYOUT_GPOS_TABLE_HH */ | 1637 #endif /* HB_OT_LAYOUT_GPOS_TABLE_HH */ |
OLD | NEW |