Nikolay Sivov : dwrite: Fix breakpoint update logic.

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 25 08:41:16 CDT 2015


Module: wine
Branch: master
Commit: 76577c8e4b3861957bc6165689c3e297b70737eb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=76577c8e4b3861957bc6165689c3e297b70737eb

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun May 24 13:53:49 2015 +0300

dwrite: Fix breakpoint update logic.

---

 dlls/dwrite/layout.c | 42 +++++++++++++++++++++++-------------------
 1 file changed, 23 insertions(+), 19 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 0a95c4e..8ab1ef9 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -366,32 +366,36 @@ static HRESULT layout_update_breakpoints_range(struct dwrite_textlayout *layout,
         layout->actual_breakpoints = heap_alloc(sizeof(DWRITE_LINE_BREAKPOINT)*layout->len);
         if (!layout->actual_breakpoints)
             return E_OUTOFMEMORY;
+        memcpy(layout->actual_breakpoints, layout->nominal_breakpoints, sizeof(DWRITE_LINE_BREAKPOINT)*layout->len);
     }
-    memcpy(layout->actual_breakpoints, layout->nominal_breakpoints, sizeof(DWRITE_LINE_BREAKPOINT)*layout->len);
 
     for (i = cur->range.startPosition; i < cur->range.length + cur->range.startPosition; i++) {
-        UINT32 j = i + cur->range.startPosition;
-        if (i == 0) {
-            if (j)
-                layout->actual_breakpoints[j].breakConditionBefore = layout->actual_breakpoints[j-1].breakConditionAfter =
-                    override_break_condition(layout->actual_breakpoints[j-1].breakConditionAfter, before);
+        /* for first codepoint check if there's anything before it and update accordingly */
+        if (i == cur->range.startPosition) {
+            if (i > 0)
+                layout->actual_breakpoints[i].breakConditionBefore = layout->actual_breakpoints[i-1].breakConditionAfter =
+                    override_break_condition(layout->actual_breakpoints[i-1].breakConditionAfter, before);
             else
-                layout->actual_breakpoints[j].breakConditionBefore = before;
-
-            layout->actual_breakpoints[j].breakConditionAfter = DWRITE_BREAK_CONDITION_MAY_NOT_BREAK;
+                layout->actual_breakpoints[i].breakConditionBefore = before;
+            layout->actual_breakpoints[i].breakConditionAfter = DWRITE_BREAK_CONDITION_MAY_NOT_BREAK;
         }
-
-        layout->actual_breakpoints[j].isWhitespace = 0;
-        layout->actual_breakpoints[j].isSoftHyphen = 0;
-
-        if (i == cur->range.length - 1) {
-            layout->actual_breakpoints[j].breakConditionBefore = DWRITE_BREAK_CONDITION_MAY_NOT_BREAK;
-            if (j < layout->len - 1)
-                layout->actual_breakpoints[j].breakConditionAfter = layout->actual_breakpoints[j+1].breakConditionAfter =
-                    override_break_condition(layout->actual_breakpoints[j+1].breakConditionAfter, before);
+        /* similar check for last codepoint */
+        else if (i == cur->range.startPosition + cur->range.length - 1) {
+            if (i == layout->len - 1)
+                layout->actual_breakpoints[i].breakConditionAfter = after;
             else
-                layout->actual_breakpoints[j].breakConditionAfter = before;
+                layout->actual_breakpoints[i].breakConditionAfter = layout->actual_breakpoints[i+1].breakConditionBefore =
+                    override_break_condition(layout->actual_breakpoints[i+1].breakConditionBefore, after);
+            layout->actual_breakpoints[i].breakConditionBefore = DWRITE_BREAK_CONDITION_MAY_NOT_BREAK;
         }
+        /* for all positions within a range disable breaks */
+        else {
+            layout->actual_breakpoints[i].breakConditionBefore = DWRITE_BREAK_CONDITION_MAY_NOT_BREAK;
+            layout->actual_breakpoints[i].breakConditionAfter = DWRITE_BREAK_CONDITION_MAY_NOT_BREAK;
+        }
+
+        layout->actual_breakpoints[i].isWhitespace = FALSE;
+        layout->actual_breakpoints[i].isSoftHyphen = FALSE;
     }
 
     return S_OK;




More information about the wine-cvs mailing list