From 2fc468303ce41d91d9906e58e61f0f191554b2c5 Mon Sep 17 00:00:00 2001 From: Joachim Henze Date: Sat, 17 Feb 2018 19:29:24 +0100 Subject: [PATCH] [0.4.11] [USP10] Apply unfinished patch to avoid CORE-14226 Thomas linked the patch in Wine Bug 44410 A very well-working patch, that I used to apply to every release since 0.4.8. It avoids text rendering regressions in some setups like UltraISO The bug is very wide-spread in unaddressed master. like in last release (cherry picked from commit 937c2615e6ab926d7b2cff2b38fae8f0600e6ba0) --- dll/win32/usp10/usp10.c | 20 ++++++++++++-------- dll/win32/usp10/usp10_internal.h | 1 + 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/dll/win32/usp10/usp10.c b/dll/win32/usp10/usp10.c index ab3af43ba85..1d6c4473d4f 100644 --- a/dll/win32/usp10/usp10.c +++ b/dll/win32/usp10/usp10.c @@ -842,19 +842,23 @@ static inline WORD set_cache_glyph(SCRIPT_CACHE *psc, WCHAR c, WORD glyph) return ((*block)[(c % 0x10000) & GLYPH_BLOCK_MASK] = glyph); } -static inline BOOL get_cache_glyph_widths(SCRIPT_CACHE *psc, WORD glyph, ABC *abc) +static inline BOOL get_cache_glyph_widths(SCRIPT_CACHE *psc, WORD glyph, ABC *abc, BOOL no_glyph_index) { static const ABC nil; - ABC *block = ((ScriptCache *)*psc)->widths[glyph >> GLYPH_BLOCK_SHIFT]; + ABC *block = no_glyph_index ? + ((ScriptCache *)*psc)->widths[glyph >> GLYPH_BLOCK_SHIFT] : + ((ScriptCache *)*psc)->glyph_widths[glyph >> GLYPH_BLOCK_SHIFT]; if (!block || !memcmp(&block[glyph & GLYPH_BLOCK_MASK], &nil, sizeof(ABC))) return FALSE; memcpy(abc, &block[glyph & GLYPH_BLOCK_MASK], sizeof(ABC)); return TRUE; } -static inline BOOL set_cache_glyph_widths(SCRIPT_CACHE *psc, WORD glyph, ABC *abc) +static inline BOOL set_cache_glyph_widths(SCRIPT_CACHE *psc, WORD glyph, ABC *abc, BOOL no_glyph_index) { - ABC **block = &((ScriptCache *)*psc)->widths[glyph >> GLYPH_BLOCK_SHIFT]; + ABC **block = no_glyph_index ? + &((ScriptCache *)*psc)->widths[glyph >> GLYPH_BLOCK_SHIFT] : + &((ScriptCache *)*psc)->glyph_widths[glyph >> GLYPH_BLOCK_SHIFT]; if (!*block && !(*block = heap_alloc_zero(sizeof(ABC) * GLYPH_BLOCK_SIZE))) return FALSE; memcpy(&(*block)[glyph & GLYPH_BLOCK_MASK], abc, sizeof(ABC)); @@ -3421,7 +3425,7 @@ HRESULT WINAPI ScriptPlaceOpenType( HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS { abc.abcA = abc.abcB = abc.abcC = 0; } - else if (!get_cache_glyph_widths(psc, pwGlyphs[i], &abc)) + else if (!get_cache_glyph_widths(psc, pwGlyphs[i], &abc, psa->fNoGlyphIndex)) { BOOL ret; if (!hdc) return E_PENDING; @@ -3444,7 +3448,7 @@ HRESULT WINAPI ScriptPlaceOpenType( HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS abc.abcB = width; abc.abcA = abc.abcC = 0; } - set_cache_glyph_widths(psc, pwGlyphs[i], &abc); + set_cache_glyph_widths(psc, pwGlyphs[i], &abc, psa->fNoGlyphIndex); } if (pABC) { @@ -3705,7 +3709,7 @@ HRESULT WINAPI ScriptGetGlyphABCWidth(HDC hdc, SCRIPT_CACHE *psc, WORD glyph, AB if (!abc) return E_INVALIDARG; if ((hr = init_script_cache(hdc, psc)) != S_OK) return hr; - if (!get_cache_glyph_widths(psc, glyph, abc)) + if (!get_cache_glyph_widths(psc, glyph, abc, FALSE)) { if (!hdc) return E_PENDING; if ((get_cache_pitch_family(psc) & TMPF_TRUETYPE)) @@ -3719,7 +3723,7 @@ HRESULT WINAPI ScriptGetGlyphABCWidth(HDC hdc, SCRIPT_CACHE *psc, WORD glyph, AB abc->abcB = width; abc->abcA = abc->abcC = 0; } - set_cache_glyph_widths(psc, glyph, abc); + set_cache_glyph_widths(psc, glyph, abc, FALSE); } return S_OK; } diff --git a/dll/win32/usp10/usp10_internal.h b/dll/win32/usp10/usp10_internal.h index fea68918c9c..aa6f78dd9e4 100644 --- a/dll/win32/usp10/usp10_internal.h +++ b/dll/win32/usp10/usp10_internal.h @@ -201,6 +201,7 @@ typedef struct { BOOL sfnt; CacheGlyphPage *page[NUM_PAGES]; ABC *widths[GLYPH_MAX / GLYPH_BLOCK_SIZE]; + ABC *glyph_widths[GLYPH_MAX / GLYPH_BLOCK_SIZE]; void *GSUB_Table; void *GDEF_Table; void *CMAP_Table;