Module: wine Branch: master Commit: fce22eadc1cfa6ced6f0f79a2b6a781c82a7916c URL: http://source.winehq.org/git/wine.git/?a=commit;h=fce22eadc1cfa6ced6f0f79a2b...
Author: Aric Stewart aric@codeweavers.com Date: Sun Nov 20 21:04:13 2011 -0700
usp10: Some unicode code points will force us into bidi mode.
---
dlls/usp10/usp10.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/dlls/usp10/usp10.c b/dlls/usp10/usp10.c index ce4dbcd..06cde93 100644 --- a/dlls/usp10/usp10.c +++ b/dlls/usp10/usp10.c @@ -844,6 +844,7 @@ HRESULT WINAPI ScriptItemizeOpenType(const WCHAR *pwcInChars, int cInChars, int BOOL new_run; WORD last_indic = -1; WORD layoutRTL = 0; + BOOL forceLevels = FALSE;
TRACE("%s,%d,%d,%p,%p,%p,%p\n", debugstr_wn(pwcInChars, cInChars), cInChars, cMaxItems, psControl, psState, pItems, pcItems); @@ -864,6 +865,11 @@ HRESULT WINAPI ScriptItemizeOpenType(const WCHAR *pwcInChars, int cInChars, int scripts[i] = last_indic; else if (is_indic(scripts[i])) last_indic = base_indic(scripts[i]); + + /* Some unicode points (Zero Width Space U+200B - + Right-to-Left Mark U+200F) will force us into bidi mode */ + if (!forceLevels && pwcInChars[i] >= 0x200B && pwcInChars[i] <= 0x200F) + forceLevels = TRUE; }
for (i = 0; i < cInChars; i++) @@ -902,7 +908,7 @@ HRESULT WINAPI ScriptItemizeOpenType(const WCHAR *pwcInChars, int cInChars, int for (i = 0; i < cInChars; i++) if (levels[i]!=levels[0]) break; - if (i >= cInChars && !odd(baselevel) && !odd(psState->uBidiLevel)) + if (i >= cInChars && !odd(baselevel) && !odd(psState->uBidiLevel) && !forceLevels) { heap_free(levels); levels = NULL;