| 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 |