| Index: third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh
|
| diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh b/third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh
|
| index b7a0122a3b30f51877773c15103c6cce318ee00d..921859a66035724e2c574bdf54f83ec98ee83093 100644
|
| --- a/third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh
|
| +++ b/third_party/harfbuzz-ng/src/hb-ot-layout-gsubgpos-private.hh
|
| @@ -342,7 +342,7 @@ struct hb_apply_context_t :
|
| inline void init (hb_apply_context_t *c_, bool context_match = false)
|
| {
|
| c = c_;
|
| - match_glyph_data = NULL,
|
| + match_glyph_data = NULL;
|
| matcher.set_match_func (NULL, NULL);
|
| matcher.set_lookup_props (c->lookup_props);
|
| /* Ignore ZWNJ if we are matching GSUB context, or matching GPOS. */
|
| @@ -959,7 +959,7 @@ static inline bool apply_lookup (hb_apply_context_t *c,
|
| TRACE_APPLY (NULL);
|
|
|
| hb_buffer_t *buffer = c->buffer;
|
| - unsigned int end;
|
| + int end;
|
|
|
| /* All positions are distance from beginning of *output* buffer.
|
| * Adjust. */
|
| @@ -996,10 +996,32 @@ static inline bool apply_lookup (hb_apply_context_t *c,
|
| if (!delta)
|
| continue;
|
|
|
| - /* Recursed lookup changed buffer len. Adjust. */
|
| + /* Recursed lookup changed buffer len. Adjust.
|
| + *
|
| + * TODO:
|
| + *
|
| + * Right now, if buffer length increased by n, we assume n new glyphs
|
| + * were added right after the current position, and if buffer length
|
| + * was decreased by n, we assume n match positions after the current
|
| + * one where removed. The former (buffer length increased) case is
|
| + * fine, but the decrease case can be improved in at least two ways,
|
| + * both of which are significant:
|
| + *
|
| + * - If recursed-to lookup is MultipleSubst and buffer length
|
| + * decreased, then it's current match position that was deleted,
|
| + * NOT the one after it.
|
| + *
|
| + * - If buffer length was decreased by n, it does not necessarily
|
| + * mean that n match positions where removed, as there might
|
| + * have been marks and default-ignorables in the sequence. We
|
| + * should instead drop match positions between current-position
|
| + * and current-position + n instead.
|
| + *
|
| + * It should be possible to construct tests for both of these cases.
|
| + */
|
|
|
| - end = int (end) + delta;
|
| - if (end <= match_positions[idx])
|
| + end += delta;
|
| + if (end <= int (match_positions[idx]))
|
| {
|
| /* End might end up being smaller than match_positions[idx] if the recursed
|
| * lookup ended up removing many items, more than we have had matched.
|
|
|