[PATCH 1/2] dwrite: Make SetBidiLevel() calls relative to initial text source position

Nikolay Sivov nsivov at codeweavers.com
Thu Feb 18 16:56:17 CST 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/analyzer.c | 45 +++++++++++++++++++++++++--------------------
 1 file changed, 25 insertions(+), 20 deletions(-)

diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c
index 891ace4..9dc9df3 100644
--- a/dlls/dwrite/analyzer.c
+++ b/dlls/dwrite/analyzer.c
@@ -244,19 +244,19 @@ static inline UINT16 get_char_script(WCHAR c)
     return script;
 }
 
-static HRESULT analyze_script(const WCHAR *text, UINT32 position, UINT32 len, IDWriteTextAnalysisSink *sink)
+static HRESULT analyze_script(const WCHAR *text, UINT32 position, UINT32 length, IDWriteTextAnalysisSink *sink)
 {
     DWRITE_SCRIPT_ANALYSIS sa;
-    UINT32 pos, i, length;
+    UINT32 pos, i, seq_length;
 
-    if (!len) return S_OK;
+    if (!length) return S_OK;
 
     sa.script = get_char_script(*text);
 
     pos = position;
-    length = 1;
+    seq_length = 1;
 
-    for (i = 1; i < len; i++)
+    for (i = 1; i < length; i++)
     {
         UINT16 script = get_char_script(text[i]);
 
@@ -264,24 +264,24 @@ static HRESULT analyze_script(const WCHAR *text, UINT32 position, UINT32 len, ID
         if (sa.script == Script_Unknown) sa.script = script;
         if (script == Script_Unknown && sa.script != Script_Common) script = sa.script;
         /* this is a length of a sequence to be reported next */
-        if (sa.script == script) length++;
+        if (sa.script == script) seq_length++;
 
         if (sa.script != script)
         {
             HRESULT hr;
 
             sa.shapes = sa.script != Script_Common ? DWRITE_SCRIPT_SHAPES_DEFAULT : DWRITE_SCRIPT_SHAPES_NO_VISUAL;
-            hr = IDWriteTextAnalysisSink_SetScriptAnalysis(sink, pos, length, &sa);
+            hr = IDWriteTextAnalysisSink_SetScriptAnalysis(sink, pos, seq_length, &sa);
             if (FAILED(hr)) return hr;
             pos = position + i;
-            length = 1;
+            seq_length = 1;
             sa.script = script;
         }
     }
 
-    /* 1 length case or normal completion call */
+    /* one char length case or normal completion call */
     sa.shapes = sa.script != Script_Common ? DWRITE_SCRIPT_SHAPES_DEFAULT : DWRITE_SCRIPT_SHAPES_NO_VISUAL;
-    return IDWriteTextAnalysisSink_SetScriptAnalysis(sink, pos, length, &sa);
+    return IDWriteTextAnalysisSink_SetScriptAnalysis(sink, pos, seq_length, &sa);
 }
 
 struct linebreaking_state {
@@ -793,14 +793,14 @@ static HRESULT WINAPI dwritetextanalyzer_AnalyzeBidi(IDWriteTextAnalyzer2 *iface
 {
     UINT8 *levels = NULL, *explicit = NULL;
     UINT8 baselevel, level, explicit_level;
+    UINT32 pos, i, seq_length;
     WCHAR *buff = NULL;
     const WCHAR *text;
-    UINT32 pos, i;
     HRESULT hr;
 
     TRACE("(%p %u %u %p)\n", source, position, length, sink);
 
-    if (length == 0)
+    if (!length)
         return S_OK;
 
     hr = get_text_source_ptr(source, position, length, &text, &buff);
@@ -822,20 +822,25 @@ static HRESULT WINAPI dwritetextanalyzer_AnalyzeBidi(IDWriteTextAnalyzer2 *iface
 
     level = levels[0];
     explicit_level = explicit[0];
-    pos = 0;
+    pos = position;
+    seq_length = 1;
+
     for (i = 1; i < length; i++) {
-        if (levels[i] != level || explicit[i] != explicit_level) {
-            hr = IDWriteTextAnalysisSink_SetBidiLevel(sink, pos, i - pos, explicit_level, level);
+        if (levels[i] == level && explicit[i] == explicit_level)
+            seq_length++;
+        else {
+            hr = IDWriteTextAnalysisSink_SetBidiLevel(sink, pos, seq_length, explicit_level, level);
             if (FAILED(hr))
-                break;
+                goto done;
+
+            pos += seq_length;
+            seq_length = 1;
             level = levels[i];
             explicit_level = explicit[i];
-            pos = i;
         }
-
-        if (i == length - 1)
-            hr = IDWriteTextAnalysisSink_SetBidiLevel(sink, pos, length - pos, explicit_level, level);
     }
+    /* one char length case or normal completion call */
+    hr = IDWriteTextAnalysisSink_SetBidiLevel(sink, pos, seq_length, explicit_level, level);
 
 done:
     heap_free(explicit);
-- 
2.7.0




More information about the wine-patches mailing list