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