From: समीर सिंह Sameer Singh <lumarzeli30@gmail.com> Previously mark_invalid_combinations() only marked a combination as invalid when two adjacent characters shared the same context type. Change the condition to trigger for any character with a non zero context type, and extend the loop to cover all characters instead of only interior ones. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=59680 --- dlls/gdi32/uniscribe/shape.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/dlls/gdi32/uniscribe/shape.c b/dlls/gdi32/uniscribe/shape.c index a6f7fcfccd6..93fa8e08534 100644 --- a/dlls/gdi32/uniscribe/shape.c +++ b/dlls/gdi32/uniscribe/shape.c @@ -902,17 +902,16 @@ static HRESULT insert_glyph(WORD *pwGlyphs, INT *pcGlyphs, INT cChars, INT write pwGlyphs[i+1] = pwGlyphs[i]; pwGlyphs[index] = glyph; *pcGlyphs = *pcGlyphs+1; - if (write_dir < 0) - UpdateClusters(index-3, 1, write_dir, cChars, pwLogClust); - else - UpdateClusters(index, 1, write_dir, cChars, pwLogClust); + for (i=0; i < cChars; i++) + if (pwLogClust[i] >= index) + pwLogClust[i]++; return S_OK; } static HRESULT mark_invalid_combinations(HDC hdc, const WCHAR* pwcChars, INT cChars, WORD *pwGlyphs, INT *pcGlyphs, INT write_dir, WORD *pwLogClust, INT maxGlyphs, combining_lexical_function lex) { CHAR *context_type; - int i,g; + int i,target_glyph_idx,insert_pos; WCHAR invalid = 0x25cc; WORD invalid_glyph; HRESULT hr = S_OK; @@ -933,14 +932,16 @@ static HRESULT mark_invalid_combinations(HDC hdc, const WCHAR* pwcChars, INT cCh invalid = 0x0020; NtGdiGetGlyphIndicesW(hdc, &invalid, 1, &invalid_glyph, 0); } - for (i = 1, g=1; i < cChars - 1; i++, g++) + for (i=0; i < cChars; i++) { - if (context_type[i] != 0 && context_type[i+write_dir]==context_type[i]) + if (context_type[i] != 0) { - hr = insert_glyph(pwGlyphs, pcGlyphs, cChars, write_dir, invalid_glyph, g, pwLogClust, maxGlyphs); + target_glyph_idx = pwLogClust[i]; + insert_pos = (write_dir > 0) ? target_glyph_idx : target_glyph_idx+1; + hr = insert_glyph(pwGlyphs, pcGlyphs, cChars, write_dir, invalid_glyph, insert_pos, pwLogClust, maxGlyphs); if (FAILED(hr)) break; - g++; + pwLogClust[i] = target_glyph_idx; } } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10998