Module: wine Branch: master Commit: 4b2bfb4a8b887a149276e52005bc3004bfa550bb URL: http://source.winehq.org/git/wine.git/?a=commit;h=4b2bfb4a8b887a149276e52005...
Author: Aric Stewart aric@codeweavers.com Date: Tue Jun 14 08:36:00 2011 -0500
usp10: Correct an endless loop in Chaining Contextual Substitution if it is a dead rule.
---
dlls/usp10/shape.c | 24 ++++++++++++++---------- 1 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/dlls/usp10/shape.c b/dlls/usp10/shape.c index 03d97f4..32833c9 100644 --- a/dlls/usp10/shape.c +++ b/dlls/usp10/shape.c @@ -1026,20 +1026,24 @@ static INT GSUB_apply_ChainContextSubst(const GSUB_LookupList* lookup, const GSU
ccsf3_4 = (const GSUB_ChainContextSubstFormat3_4 *)(((LPBYTE)ccsf3_3)+sizeof(GSUB_ChainContextSubstFormat3_3) + (sizeof(WORD) * (GET_BE_WORD(ccsf3_3->LookaheadGlyphCount)-1)));
- for (k = 0; k < GET_BE_WORD(ccsf3_4->SubstCount); k++) + if (GET_BE_WORD(ccsf3_4->SubstCount)) { - int lookupIndex = GET_BE_WORD(ccsf3_4->SubstLookupRecord[k].LookupListIndex); - int SequenceIndex = GET_BE_WORD(ccsf3_4->SubstLookupRecord[k].SequenceIndex) * write_dir; - - TRACE("SUBST: %i -> %i %i\n",k, SequenceIndex, lookupIndex); - newIndex = GSUB_apply_lookup(lookup, lookupIndex, glyphs, glyph_index + SequenceIndex, write_dir, glyph_count); - if (newIndex == -1) + for (k = 0; k < GET_BE_WORD(ccsf3_4->SubstCount); k++) { - ERR("Chain failed to generate a glyph\n"); - continue; + int lookupIndex = GET_BE_WORD(ccsf3_4->SubstLookupRecord[k].LookupListIndex); + int SequenceIndex = GET_BE_WORD(ccsf3_4->SubstLookupRecord[k].SequenceIndex) * write_dir; + + TRACE("SUBST: %i -> %i %i\n",k, SequenceIndex, lookupIndex); + newIndex = GSUB_apply_lookup(lookup, lookupIndex, glyphs, glyph_index + SequenceIndex, write_dir, glyph_count); + if (newIndex == -1) + { + ERR("Chain failed to generate a glyph\n"); + continue; + } } + return newIndex; } - return newIndex; + else return GSUB_E_NOGLYPH; } } return -1;