[apply-lookup] Try to fix the logic for contextual lookups

Fixes https://github.com/harfbuzz/harfbuzz/issues/1611

Notably, this fixes Myles's AdditionFont:
https://litherum.blogspot.com/2019/03/addition-font.html

Test with AdditionFont, eg.:
$ util/hb-view AdditionFont.otf =1112112+1113134=
This commit is contained in:
Behdad Esfahbod 2022-03-24 13:10:48 -06:00
parent fa15fc44bb
commit ccd9161bfd
3 changed files with 16 additions and 7 deletions

View File

@ -1415,13 +1415,18 @@ static inline void apply_lookup (hb_ot_apply_context_t *c,
if (unlikely (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index)) if (unlikely (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index))
continue; continue;
unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len ();
/* This can happen if earlier recursed lookups deleted many entries. */
if (unlikely (match_positions[idx] >= orig_len))
continue;
if (unlikely (!buffer->move_to (match_positions[idx]))) if (unlikely (!buffer->move_to (match_positions[idx])))
break; break;
if (unlikely (buffer->max_ops <= 0)) if (unlikely (buffer->max_ops <= 0))
break; break;
unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len ();
if (!c->recurse (lookupRecord[i].lookupListIndex)) if (!c->recurse (lookupRecord[i].lookupListIndex))
continue; continue;
@ -1457,15 +1462,18 @@ static inline void apply_lookup (hb_ot_apply_context_t *c,
*/ */
end += delta; end += delta;
if (end <= int (match_positions[idx])) if (end < int (match_positions[idx]))
{ {
/* End might end up being smaller than match_positions[idx] if the recursed /* 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. * lookup ended up removing many items.
* Just never rewind end back and get out of here. * Just never rewind end beyond start of current position, since that is
* https://bugs.chromium.org/p/chromium/issues/detail?id=659496 */ * not possible in the recursed lookup. Also adjust delta as such.
*
* https://bugs.chromium.org/p/chromium/issues/detail?id=659496
* https://github.com/harfbuzz/harfbuzz/issues/1611
*/
delta += match_positions[idx] - end;
end = match_positions[idx]; end = match_positions[idx];
/* There can't be any further changes. */
break;
} }
unsigned int next = idx + 1; /* next now is the position after the recursed lookup. */ unsigned int next = idx + 1; /* next now is the position after the recursed lookup. */

View File

@ -1,3 +1,4 @@
../fonts/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf;;U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63;[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+0|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212] ../fonts/4cce528e99f600ed9c25a2b69e32eb94a03b4ae8.ttf;;U+1A48,U+1A58,U+1A25,U+1A48,U+1A58,U+1A25,U+1A6E,U+1A63;[uni1A48=0+1212|uni1A25=0+1912|uni1A58=0+0|uni1A48=3+1212|uni1A6E=3+0|uni1A25=3+1912|uni1A58=3+0|uni1A63=3+1212]
../fonts/d629e7fedc0b350222d7987345fe61613fa3929a.ttf;;U+0915,U+093F,U+0915,U+093F;[ivowelsign03deva=0+530|kadeva=0+1561|ivowelsign03deva=2+530|kadeva=2+1561] ../fonts/d629e7fedc0b350222d7987345fe61613fa3929a.ttf;;U+0915,U+093F,U+0915,U+093F;[ivowelsign03deva=0+530|kadeva=0+1561|ivowelsign03deva=2+530|kadeva=2+1561]
../fonts/f499fbc23865022234775c43503bba2e63978fe1.ttf;;U+09B0,U+09CD,U+09A5,U+09CD,U+09AF,U+09C0;[gid1=0+1320|gid13=0+523|gid18=0+545] ../fonts/f499fbc23865022234775c43503bba2e63978fe1.ttf;;U+09B0,U+09CD,U+09A5,U+09CD,U+09AF,U+09C0;[gid1=0+1320|gid13=0+523|gid18=0+545]
../fonts/5bbf3712e6f79775c66a4407837a90e591efbef2.ttf;;U+1F1FA,U+1F1FC;[gid3=0+2550]