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