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 Google, Inc. | 3 * Copyright © 2010,2012 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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 } | 67 } |
68 | 68 |
69 hb_face_t *face; | 69 hb_face_t *face; |
70 hb_set_t *glyphs; | 70 hb_set_t *glyphs; |
71 recurse_func_t recurse_func; | 71 recurse_func_t recurse_func; |
72 unsigned int nesting_level_left; | 72 unsigned int nesting_level_left; |
73 unsigned int debug_depth; | 73 unsigned int debug_depth; |
74 | 74 |
75 hb_closure_context_t (hb_face_t *face_, | 75 hb_closure_context_t (hb_face_t *face_, |
76 hb_set_t *glyphs_, | 76 hb_set_t *glyphs_, |
77 » » unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) : | 77 » » unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL)
: |
78 face (face_), | 78 face (face_), |
79 glyphs (glyphs_), | 79 glyphs (glyphs_), |
80 recurse_func (NULL), | 80 recurse_func (NULL), |
81 nesting_level_left (nesting_level_left_), | 81 nesting_level_left (nesting_level_left_), |
82 debug_depth (0) {} | 82 debug_depth (0) {} |
83 | 83 |
84 void set_recurse_func (recurse_func_t func) { recurse_func = func; } | 84 void set_recurse_func (recurse_func_t func) { recurse_func = func; } |
85 }; | 85 }; |
86 | 86 |
87 | 87 |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 recurse_func_t recurse_func; | 189 recurse_func_t recurse_func; |
190 hb_set_t recursed_lookups; | 190 hb_set_t recursed_lookups; |
191 unsigned int nesting_level_left; | 191 unsigned int nesting_level_left; |
192 unsigned int debug_depth; | 192 unsigned int debug_depth; |
193 | 193 |
194 hb_collect_glyphs_context_t (hb_face_t *face_, | 194 hb_collect_glyphs_context_t (hb_face_t *face_, |
195 hb_set_t *glyphs_before, /* OUT. May be NULL */ | 195 hb_set_t *glyphs_before, /* OUT. May be NULL */ |
196 hb_set_t *glyphs_input, /* OUT. May be NULL */ | 196 hb_set_t *glyphs_input, /* OUT. May be NULL */ |
197 hb_set_t *glyphs_after, /* OUT. May be NULL */ | 197 hb_set_t *glyphs_after, /* OUT. May be NULL */ |
198 hb_set_t *glyphs_output, /* OUT. May be NULL */ | 198 hb_set_t *glyphs_output, /* OUT. May be NULL */ |
199 » » » unsigned int nesting_level_left_ = MAX_NESTING_LE
VEL) : | 199 » » » unsigned int nesting_level_left_ = HB_MAX_NESTING
_LEVEL) : |
200 face (face_), | 200 face (face_), |
201 before (glyphs_before ? glyphs_before : hb_set_get
_empty ()), | 201 before (glyphs_before ? glyphs_before : hb_set_get
_empty ()), |
202 input (glyphs_input ? glyphs_input : hb_set_get
_empty ()), | 202 input (glyphs_input ? glyphs_input : hb_set_get
_empty ()), |
203 after (glyphs_after ? glyphs_after : hb_set_get
_empty ()), | 203 after (glyphs_after ? glyphs_after : hb_set_get
_empty ()), |
204 output (glyphs_output ? glyphs_output : hb_set_get
_empty ()), | 204 output (glyphs_output ? glyphs_output : hb_set_get
_empty ()), |
205 recurse_func (NULL), | 205 recurse_func (NULL), |
206 recursed_lookups (), | 206 recursed_lookups (), |
207 nesting_level_left (nesting_level_left_), | 207 nesting_level_left (nesting_level_left_), |
208 debug_depth (0) | 208 debug_depth (0) |
209 { | 209 { |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
348 /* Ignore ZWNJ if we are matching GSUB context, or matching GPOS. */ | 348 /* Ignore ZWNJ if we are matching GSUB context, or matching GPOS. */ |
349 matcher.set_ignore_zwnj (context_match || c->table_index == 1); | 349 matcher.set_ignore_zwnj (context_match || c->table_index == 1); |
350 /* Ignore ZWJ if we are matching GSUB context, or matching GPOS, or if ask
ed to. */ | 350 /* Ignore ZWJ if we are matching GSUB context, or matching GPOS, or if ask
ed to. */ |
351 matcher.set_ignore_zwj (context_match || c->table_index == 1 || c->auto_zw
j); | 351 matcher.set_ignore_zwj (context_match || c->table_index == 1 || c->auto_zw
j); |
352 matcher.set_mask (context_match ? -1 : c->lookup_mask); | 352 matcher.set_mask (context_match ? -1 : c->lookup_mask); |
353 } | 353 } |
354 inline void set_lookup_props (unsigned int lookup_props) | 354 inline void set_lookup_props (unsigned int lookup_props) |
355 { | 355 { |
356 matcher.set_lookup_props (lookup_props); | 356 matcher.set_lookup_props (lookup_props); |
357 } | 357 } |
358 inline void set_match_func (matcher_t::match_func_t match_func, | 358 inline void set_match_func (matcher_t::match_func_t match_func_, |
359 » » » » const void *match_data, | 359 » » » » const void *match_data_, |
360 const USHORT glyph_data[]) | 360 const USHORT glyph_data[]) |
361 { | 361 { |
362 matcher.set_match_func (match_func, match_data); | 362 matcher.set_match_func (match_func_, match_data_); |
363 match_glyph_data = glyph_data; | 363 match_glyph_data = glyph_data; |
364 } | 364 } |
365 | 365 |
366 inline void reset (unsigned int start_index_, | 366 inline void reset (unsigned int start_index_, |
367 unsigned int num_items_) | 367 unsigned int num_items_) |
368 { | 368 { |
369 idx = start_index_; | 369 idx = start_index_; |
370 num_items = num_items_; | 370 num_items = num_items_; |
371 end = c->buffer->len; | 371 end = c->buffer->len; |
372 matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().sy
llable () : 0); | 372 matcher.set_syllable (start_index_ == c->buffer->idx ? c->buffer->cur().sy
llable () : 0); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 | 476 |
477 hb_apply_context_t (unsigned int table_index_, | 477 hb_apply_context_t (unsigned int table_index_, |
478 hb_font_t *font_, | 478 hb_font_t *font_, |
479 hb_buffer_t *buffer_) : | 479 hb_buffer_t *buffer_) : |
480 table_index (table_index_), | 480 table_index (table_index_), |
481 font (font_), face (font->face), buffer (buffer_), | 481 font (font_), face (font->face), buffer (buffer_), |
482 direction (buffer_->props.direction), | 482 direction (buffer_->props.direction), |
483 lookup_mask (1), | 483 lookup_mask (1), |
484 auto_zwj (true), | 484 auto_zwj (true), |
485 recurse_func (NULL), | 485 recurse_func (NULL), |
486 » » » nesting_level_left (MAX_NESTING_LEVEL), | 486 » » » nesting_level_left (HB_MAX_NESTING_LEVEL), |
487 lookup_props (0), | 487 lookup_props (0), |
488 gdef (*hb_ot_layout_from_face (face)->gdef), | 488 gdef (*hb_ot_layout_from_face (face)->gdef), |
489 has_glyph_classes (gdef.has_glyph_classes ()), | 489 has_glyph_classes (gdef.has_glyph_classes ()), |
490 iter_input (), | 490 iter_input (), |
491 iter_context (), | 491 iter_context (), |
492 lookup_index ((unsigned int) -1), | 492 lookup_index ((unsigned int) -1), |
493 debug_depth (0) {} | 493 debug_depth (0) {} |
494 | 494 |
495 inline void set_lookup_mask (hb_mask_t mask) { lookup_mask = mask; } | 495 inline void set_lookup_mask (hb_mask_t mask) { lookup_mask = mask; } |
496 inline void set_auto_zwj (bool auto_zwj_) { auto_zwj = auto_zwj_; } | 496 inline void set_auto_zwj (bool auto_zwj_) { auto_zwj = auto_zwj_; } |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
697 return false; | 697 return false; |
698 | 698 |
699 return true; | 699 return true; |
700 } | 700 } |
701 static inline bool match_input (hb_apply_context_t *c, | 701 static inline bool match_input (hb_apply_context_t *c, |
702 unsigned int count, /* Including the first glyph
(not matched) */ | 702 unsigned int count, /* Including the first glyph
(not matched) */ |
703 const USHORT input[], /* Array of input values--
start with second glyph */ | 703 const USHORT input[], /* Array of input values--
start with second glyph */ |
704 match_func_t match_func, | 704 match_func_t match_func, |
705 const void *match_data, | 705 const void *match_data, |
706 unsigned int *end_offset, | 706 unsigned int *end_offset, |
707 » » » » unsigned int match_positions[MAX_CONTEXT_LENGTH]
, | 707 » » » » unsigned int match_positions[HB_MAX_CONTEXT_LENG
TH], |
708 bool *p_is_mark_ligature = NULL, | 708 bool *p_is_mark_ligature = NULL, |
709 unsigned int *p_total_component_count = NULL) | 709 unsigned int *p_total_component_count = NULL) |
710 { | 710 { |
711 TRACE_APPLY (NULL); | 711 TRACE_APPLY (NULL); |
712 | 712 |
713 if (unlikely (count > MAX_CONTEXT_LENGTH)) return_trace (false); | 713 if (unlikely (count > HB_MAX_CONTEXT_LENGTH)) return_trace (false); |
714 | 714 |
715 hb_buffer_t *buffer = c->buffer; | 715 hb_buffer_t *buffer = c->buffer; |
716 | 716 |
717 hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; | 717 hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; |
718 skippy_iter.reset (buffer->idx, count - 1); | 718 skippy_iter.reset (buffer->idx, count - 1); |
719 skippy_iter.set_match_func (match_func, match_data, input); | 719 skippy_iter.set_match_func (match_func, match_data, input); |
720 | 720 |
721 /* | 721 /* |
722 * This is perhaps the trickiest part of OpenType... Remarks: | 722 * This is perhaps the trickiest part of OpenType... Remarks: |
723 * | 723 * |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 if (p_is_mark_ligature) | 777 if (p_is_mark_ligature) |
778 *p_is_mark_ligature = is_mark_ligature; | 778 *p_is_mark_ligature = is_mark_ligature; |
779 | 779 |
780 if (p_total_component_count) | 780 if (p_total_component_count) |
781 *p_total_component_count = total_component_count; | 781 *p_total_component_count = total_component_count; |
782 | 782 |
783 return_trace (true); | 783 return_trace (true); |
784 } | 784 } |
785 static inline bool ligate_input (hb_apply_context_t *c, | 785 static inline bool ligate_input (hb_apply_context_t *c, |
786 unsigned int count, /* Including the first glyp
h */ | 786 unsigned int count, /* Including the first glyp
h */ |
787 » » » » unsigned int match_positions[MAX_CONTEXT_LENGTH
], /* Including the first glyph */ | 787 » » » » unsigned int match_positions[HB_MAX_CONTEXT_LEN
GTH], /* Including the first glyph */ |
788 unsigned int match_length, | 788 unsigned int match_length, |
789 hb_codepoint_t lig_glyph, | 789 hb_codepoint_t lig_glyph, |
790 bool is_mark_ligature, | 790 bool is_mark_ligature, |
791 unsigned int total_component_count) | 791 unsigned int total_component_count) |
792 { | 792 { |
793 TRACE_APPLY (NULL); | 793 TRACE_APPLY (NULL); |
794 | 794 |
795 hb_buffer_t *buffer = c->buffer; | 795 hb_buffer_t *buffer = c->buffer; |
796 | 796 |
797 buffer->merge_clusters (buffer->idx, buffer->idx + match_length); | 797 buffer->merge_clusters (buffer->idx, buffer->idx + match_length); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
829 unsigned int last_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur()); | 829 unsigned int last_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur()); |
830 unsigned int last_num_components = _hb_glyph_info_get_lig_num_comps (&buffer->
cur()); | 830 unsigned int last_num_components = _hb_glyph_info_get_lig_num_comps (&buffer->
cur()); |
831 unsigned int components_so_far = last_num_components; | 831 unsigned int components_so_far = last_num_components; |
832 | 832 |
833 if (!is_mark_ligature) | 833 if (!is_mark_ligature) |
834 { | 834 { |
835 _hb_glyph_info_set_lig_props_for_ligature (&buffer->cur(), lig_id, total_com
ponent_count); | 835 _hb_glyph_info_set_lig_props_for_ligature (&buffer->cur(), lig_id, total_com
ponent_count); |
836 if (_hb_glyph_info_get_general_category (&buffer->cur()) == HB_UNICODE_GENER
AL_CATEGORY_NON_SPACING_MARK) | 836 if (_hb_glyph_info_get_general_category (&buffer->cur()) == HB_UNICODE_GENER
AL_CATEGORY_NON_SPACING_MARK) |
837 { | 837 { |
838 _hb_glyph_info_set_general_category (&buffer->cur(), HB_UNICODE_GENERAL_CA
TEGORY_OTHER_LETTER); | 838 _hb_glyph_info_set_general_category (&buffer->cur(), HB_UNICODE_GENERAL_CA
TEGORY_OTHER_LETTER); |
839 _hb_glyph_info_set_modified_combining_class (&buffer->cur(), 0); | |
840 } | 839 } |
841 } | 840 } |
842 c->replace_glyph_with_ligature (lig_glyph, klass); | 841 c->replace_glyph_with_ligature (lig_glyph, klass); |
843 | 842 |
844 for (unsigned int i = 1; i < count; i++) | 843 for (unsigned int i = 1; i < count; i++) |
845 { | 844 { |
846 while (buffer->idx < match_positions[i]) | 845 while (buffer->idx < match_positions[i] && !buffer->in_error) |
847 { | 846 { |
848 if (!is_mark_ligature) { | 847 if (!is_mark_ligature) { |
849 unsigned int new_lig_comp = components_so_far - last_num_components + | 848 unsigned int new_lig_comp = components_so_far - last_num_components + |
850 MIN (MAX (_hb_glyph_info_get_lig_comp (&buff
er->cur()), 1u), last_num_components); | 849 MIN (MAX (_hb_glyph_info_get_lig_comp (&buff
er->cur()), 1u), last_num_components); |
851 _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_c
omp); | 850 _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_c
omp); |
852 } | 851 } |
853 buffer->next_glyph (); | 852 buffer->next_glyph (); |
854 } | 853 } |
855 | 854 |
856 last_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur()); | 855 last_lig_id = _hb_glyph_info_get_lig_id (&buffer->cur()); |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
937 static inline void recurse_lookups (context_t *c, | 936 static inline void recurse_lookups (context_t *c, |
938 unsigned int lookupCount, | 937 unsigned int lookupCount, |
939 const LookupRecord lookupRecord[] /* Array o
f LookupRecords--in design order */) | 938 const LookupRecord lookupRecord[] /* Array o
f LookupRecords--in design order */) |
940 { | 939 { |
941 for (unsigned int i = 0; i < lookupCount; i++) | 940 for (unsigned int i = 0; i < lookupCount; i++) |
942 c->recurse (lookupRecord[i].lookupListIndex); | 941 c->recurse (lookupRecord[i].lookupListIndex); |
943 } | 942 } |
944 | 943 |
945 static inline bool apply_lookup (hb_apply_context_t *c, | 944 static inline bool apply_lookup (hb_apply_context_t *c, |
946 unsigned int count, /* Including the first glyp
h */ | 945 unsigned int count, /* Including the first glyp
h */ |
947 » » » » unsigned int match_positions[MAX_CONTEXT_LENGTH
], /* Including the first glyph */ | 946 » » » » unsigned int match_positions[HB_MAX_CONTEXT_LEN
GTH], /* Including the first glyph */ |
948 unsigned int lookupCount, | 947 unsigned int lookupCount, |
949 const LookupRecord lookupRecord[], /* Array of
LookupRecords--in design order */ | 948 const LookupRecord lookupRecord[], /* Array of
LookupRecords--in design order */ |
950 unsigned int match_length) | 949 unsigned int match_length) |
951 { | 950 { |
952 TRACE_APPLY (NULL); | 951 TRACE_APPLY (NULL); |
953 | 952 |
954 hb_buffer_t *buffer = c->buffer; | 953 hb_buffer_t *buffer = c->buffer; |
955 unsigned int end; | 954 unsigned int end; |
956 | 955 |
957 /* All positions are distance from beginning of *output* buffer. | 956 /* All positions are distance from beginning of *output* buffer. |
958 * Adjust. */ | 957 * Adjust. */ |
959 { | 958 { |
960 unsigned int bl = buffer->backtrack_len (); | 959 unsigned int bl = buffer->backtrack_len (); |
961 end = bl + match_length; | 960 end = bl + match_length; |
962 | 961 |
963 int delta = bl - buffer->idx; | 962 int delta = bl - buffer->idx; |
964 /* Convert positions to new indexing. */ | 963 /* Convert positions to new indexing. */ |
965 for (unsigned int j = 0; j < count; j++) | 964 for (unsigned int j = 0; j < count; j++) |
966 match_positions[j] += delta; | 965 match_positions[j] += delta; |
967 } | 966 } |
968 | 967 |
969 for (unsigned int i = 0; i < lookupCount; i++) | 968 for (unsigned int i = 0; i < lookupCount; i++) |
970 { | 969 { |
971 unsigned int idx = lookupRecord[i].sequenceIndex; | 970 unsigned int idx = lookupRecord[i].sequenceIndex; |
972 if (idx >= count) | 971 if (idx >= count) |
973 continue; | 972 continue; |
974 | 973 |
| 974 /* Don't recurse to ourself at same position. |
| 975 * Note that this test is too naive, it doesn't catch longer loops. */ |
| 976 if (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index) |
| 977 continue; |
| 978 |
975 buffer->move_to (match_positions[idx]); | 979 buffer->move_to (match_positions[idx]); |
976 | 980 |
977 unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len (); | 981 unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len (); |
978 if (!c->recurse (lookupRecord[i].lookupListIndex)) | 982 if (!c->recurse (lookupRecord[i].lookupListIndex)) |
979 continue; | 983 continue; |
980 | 984 |
981 unsigned int new_len = buffer->backtrack_len () + buffer->lookahead_len (); | 985 unsigned int new_len = buffer->backtrack_len () + buffer->lookahead_len (); |
982 int delta = new_len - orig_len; | 986 int delta = new_len - orig_len; |
983 | 987 |
984 if (!delta) | 988 if (!delta) |
985 continue; | 989 continue; |
986 | 990 |
987 /* Recursed lookup changed buffer len. Adjust. */ | 991 /* Recursed lookup changed buffer len. Adjust. */ |
988 | 992 |
989 /* end can't go back past the current match position. | 993 /* end can't go back past the current match position. |
990 * Note: this is only true because we do NOT allow MultipleSubst | 994 * Note: this is only true because we do NOT allow MultipleSubst |
991 * with zero sequence len. */ | 995 * with zero sequence len. */ |
992 end = MAX ((int) match_positions[idx] + 1, int (end) + delta); | 996 end = MAX (MIN((int) match_positions[idx] + 1, (int) new_len), int (end) + d
elta); |
993 | 997 |
994 unsigned int next = idx + 1; /* next now is the position after the recursed
lookup. */ | 998 unsigned int next = idx + 1; /* next now is the position after the recursed
lookup. */ |
995 | 999 |
996 if (delta > 0) | 1000 if (delta > 0) |
997 { | 1001 { |
998 if (unlikely (delta + count > MAX_CONTEXT_LENGTH)) | 1002 if (unlikely (delta + count > HB_MAX_CONTEXT_LENGTH)) |
999 break; | 1003 break; |
1000 } | 1004 } |
1001 else | 1005 else |
1002 { | 1006 { |
1003 /* NOTE: delta is negative. */ | 1007 /* NOTE: delta is negative. */ |
1004 delta = MAX (delta, (int) next - (int) count); | 1008 delta = MAX (delta, (int) next - (int) count); |
1005 next -= delta; | 1009 next -= delta; |
1006 } | 1010 } |
1007 | 1011 |
1008 /* Shift! */ | 1012 /* Shift! */ |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1087 lookup_context.funcs.match, lookup_context.match_dat
a); | 1091 lookup_context.funcs.match, lookup_context.match_dat
a); |
1088 } | 1092 } |
1089 static inline bool context_apply_lookup (hb_apply_context_t *c, | 1093 static inline bool context_apply_lookup (hb_apply_context_t *c, |
1090 unsigned int inputCount, /* Including t
he first glyph (not matched) */ | 1094 unsigned int inputCount, /* Including t
he first glyph (not matched) */ |
1091 const USHORT input[], /* Array of input
values--start with second glyph */ | 1095 const USHORT input[], /* Array of input
values--start with second glyph */ |
1092 unsigned int lookupCount, | 1096 unsigned int lookupCount, |
1093 const LookupRecord lookupRecord[], | 1097 const LookupRecord lookupRecord[], |
1094 ContextApplyLookupContext &lookup_conte
xt) | 1098 ContextApplyLookupContext &lookup_conte
xt) |
1095 { | 1099 { |
1096 unsigned int match_length = 0; | 1100 unsigned int match_length = 0; |
1097 unsigned int match_positions[MAX_CONTEXT_LENGTH]; | 1101 unsigned int match_positions[HB_MAX_CONTEXT_LENGTH]; |
1098 return match_input (c, | 1102 return match_input (c, |
1099 inputCount, input, | 1103 inputCount, input, |
1100 lookup_context.funcs.match, lookup_context.match_data, | 1104 lookup_context.funcs.match, lookup_context.match_data, |
1101 &match_length, match_positions) | 1105 &match_length, match_positions) |
1102 && apply_lookup (c, | 1106 && apply_lookup (c, |
1103 inputCount, match_positions, | 1107 inputCount, match_positions, |
1104 lookupCount, lookupRecord, | 1108 lookupCount, lookupRecord, |
1105 match_length); | 1109 match_length); |
1106 } | 1110 } |
1107 | 1111 |
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1614 const USHORT backtrack[], | 1618 const USHORT backtrack[], |
1615 unsigned int inputCount, /* Inclu
ding the first glyph (not matched) */ | 1619 unsigned int inputCount, /* Inclu
ding the first glyph (not matched) */ |
1616 const USHORT input[], /* Array of
input values--start with second glyph */ | 1620 const USHORT input[], /* Array of
input values--start with second glyph */ |
1617 unsigned int lookaheadCount, | 1621 unsigned int lookaheadCount, |
1618 const USHORT lookahead[], | 1622 const USHORT lookahead[], |
1619 unsigned int lookupCount, | 1623 unsigned int lookupCount, |
1620 const LookupRecord lookupRecord[]
, | 1624 const LookupRecord lookupRecord[]
, |
1621 ChainContextApplyLookupContext &l
ookup_context) | 1625 ChainContextApplyLookupContext &l
ookup_context) |
1622 { | 1626 { |
1623 unsigned int match_length = 0; | 1627 unsigned int match_length = 0; |
1624 unsigned int match_positions[MAX_CONTEXT_LENGTH]; | 1628 unsigned int match_positions[HB_MAX_CONTEXT_LENGTH]; |
1625 return match_input (c, | 1629 return match_input (c, |
1626 inputCount, input, | 1630 inputCount, input, |
1627 lookup_context.funcs.match, lookup_context.match_data[1], | 1631 lookup_context.funcs.match, lookup_context.match_data[1], |
1628 &match_length, match_positions) | 1632 &match_length, match_positions) |
1629 && match_backtrack (c, | 1633 && match_backtrack (c, |
1630 backtrackCount, backtrack, | 1634 backtrackCount, backtrack, |
1631 lookup_context.funcs.match, lookup_context.match_data[
0]) | 1635 lookup_context.funcs.match, lookup_context.match_data[
0]) |
1632 && match_lookahead (c, | 1636 && match_lookahead (c, |
1633 lookaheadCount, lookahead, | 1637 lookaheadCount, lookahead, |
1634 lookup_context.funcs.match, lookup_context.match_data[
2], | 1638 lookup_context.funcs.match, lookup_context.match_data[
2], |
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2277 lookupList; /* LookupList table */ | 2281 lookupList; /* LookupList table */ |
2278 public: | 2282 public: |
2279 DEFINE_SIZE_STATIC (10); | 2283 DEFINE_SIZE_STATIC (10); |
2280 }; | 2284 }; |
2281 | 2285 |
2282 | 2286 |
2283 } /* namespace OT */ | 2287 } /* namespace OT */ |
2284 | 2288 |
2285 | 2289 |
2286 #endif /* HB_OT_LAYOUT_GSUBGPOS_PRIVATE_HH */ | 2290 #endif /* HB_OT_LAYOUT_GSUBGPOS_PRIVATE_HH */ |
OLD | NEW |