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

Side by Side Diff: third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh

Issue 2858683002: Roll HarfBuzz to 1.4.6 (Closed)
Patch Set: Rebase Created 3 years, 7 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 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 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
335 uint8_t syllable; 335 uint8_t syllable;
336 match_func_t match_func; 336 match_func_t match_func;
337 const void *match_data; 337 const void *match_data;
338 }; 338 };
339 339
340 struct skipping_iterator_t 340 struct skipping_iterator_t
341 { 341 {
342 inline void init (hb_apply_context_t *c_, bool context_match = false) 342 inline void init (hb_apply_context_t *c_, bool context_match = false)
343 { 343 {
344 c = c_; 344 c = c_;
345 match_glyph_data = NULL, 345 match_glyph_data = NULL;
346 matcher.set_match_func (NULL, NULL); 346 matcher.set_match_func (NULL, NULL);
347 matcher.set_lookup_props (c->lookup_props); 347 matcher.set_lookup_props (c->lookup_props);
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 {
(...skipping 596 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 static inline bool apply_lookup (hb_apply_context_t *c, 952 static inline bool apply_lookup (hb_apply_context_t *c,
953 unsigned int count, /* Including the first glyp h */ 953 unsigned int count, /* Including the first glyp h */
954 unsigned int match_positions[HB_MAX_CONTEXT_LEN GTH], /* Including the first glyph */ 954 unsigned int match_positions[HB_MAX_CONTEXT_LEN GTH], /* Including the first glyph */
955 unsigned int lookupCount, 955 unsigned int lookupCount,
956 const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */ 956 const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */
957 unsigned int match_length) 957 unsigned int match_length)
958 { 958 {
959 TRACE_APPLY (NULL); 959 TRACE_APPLY (NULL);
960 960
961 hb_buffer_t *buffer = c->buffer; 961 hb_buffer_t *buffer = c->buffer;
962 unsigned int end; 962 int end;
963 963
964 /* All positions are distance from beginning of *output* buffer. 964 /* All positions are distance from beginning of *output* buffer.
965 * Adjust. */ 965 * Adjust. */
966 { 966 {
967 unsigned int bl = buffer->backtrack_len (); 967 unsigned int bl = buffer->backtrack_len ();
968 end = bl + match_length; 968 end = bl + match_length;
969 969
970 int delta = bl - buffer->idx; 970 int delta = bl - buffer->idx;
971 /* Convert positions to new indexing. */ 971 /* Convert positions to new indexing. */
972 for (unsigned int j = 0; j < count; j++) 972 for (unsigned int j = 0; j < count; j++)
(...skipping 16 matching lines...) Expand all
989 unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len (); 989 unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len ();
990 if (!c->recurse (lookupRecord[i].lookupListIndex)) 990 if (!c->recurse (lookupRecord[i].lookupListIndex))
991 continue; 991 continue;
992 992
993 unsigned int new_len = buffer->backtrack_len () + buffer->lookahead_len (); 993 unsigned int new_len = buffer->backtrack_len () + buffer->lookahead_len ();
994 int delta = new_len - orig_len; 994 int delta = new_len - orig_len;
995 995
996 if (!delta) 996 if (!delta)
997 continue; 997 continue;
998 998
999 /* Recursed lookup changed buffer len. Adjust. */ 999 /* Recursed lookup changed buffer len. Adjust.
1000 *
1001 * TODO:
1002 *
1003 * Right now, if buffer length increased by n, we assume n new glyphs
1004 * were added right after the current position, and if buffer length
1005 * was decreased by n, we assume n match positions after the current
1006 * one where removed. The former (buffer length increased) case is
1007 * fine, but the decrease case can be improved in at least two ways,
1008 * both of which are significant:
1009 *
1010 * - If recursed-to lookup is MultipleSubst and buffer length
1011 * decreased, then it's current match position that was deleted,
1012 * NOT the one after it.
1013 *
1014 * - If buffer length was decreased by n, it does not necessarily
1015 * mean that n match positions where removed, as there might
1016 * have been marks and default-ignorables in the sequence. We
1017 * should instead drop match positions between current-position
1018 * and current-position + n instead.
1019 *
1020 * It should be possible to construct tests for both of these cases.
1021 */
1000 1022
1001 end = int (end) + delta; 1023 end += delta;
1002 if (end <= match_positions[idx]) 1024 if (end <= int (match_positions[idx]))
1003 { 1025 {
1004 /* End might end up being smaller than match_positions[idx] if the recurse d 1026 /* End might end up being smaller than match_positions[idx] if the recurse d
1005 * lookup ended up removing many items, more than we have had matched. 1027 * lookup ended up removing many items, more than we have had matched.
1006 * Just never rewind end back and get out of here. 1028 * Just never rewind end back and get out of here.
1007 * https://bugs.chromium.org/p/chromium/issues/detail?id=659496 */ 1029 * https://bugs.chromium.org/p/chromium/issues/detail?id=659496 */
1008 end = match_positions[idx]; 1030 end = match_positions[idx];
1009 /* There can't be any further changes. */ 1031 /* There can't be any further changes. */
1010 break; 1032 break;
1011 } 1033 }
1012 1034
(...skipping 1307 matching lines...) Expand 10 before | Expand all | Expand 10 after
2320 * in version 0x00010001. */ 2342 * in version 0x00010001. */
2321 public: 2343 public:
2322 DEFINE_SIZE_MIN (10); 2344 DEFINE_SIZE_MIN (10);
2323 }; 2345 };
2324 2346
2325 2347
2326 } /* namespace OT */ 2348 } /* namespace OT */
2327 2349
2328 2350
2329 #endif /* HB_OT_LAYOUT_GSUBGPOS_PRIVATE_HH */ 2351 #endif /* HB_OT_LAYOUT_GSUBGPOS_PRIVATE_HH */
OLDNEW
« no previous file with comments | « third_party/harfbuzz-ng/src/hb-ot-layout.cc ('k') | third_party/harfbuzz-ng/src/hb-ot-layout-private.hh » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698