Nikolay Sivov : dwrite: Handle GetBreakConditions() failure.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jun 1 07:36:59 CDT 2015
Module: wine
Branch: master
Commit: c230b327778b352b37561bde5f6d69054114ac5a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c230b327778b352b37561bde5f6d69054114ac5a
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sun May 31 11:57:37 2015 +0300
dwrite: Handle GetBreakConditions() failure.
---
dlls/dwrite/layout.c | 3 ++-
dlls/dwrite/tests/layout.c | 35 +++++++++++++++++++++++++++++++++--
2 files changed, 35 insertions(+), 3 deletions(-)
diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 8fcff86..cb191b0 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -379,9 +379,10 @@ static HRESULT layout_update_breakpoints_range(struct dwrite_textlayout *layout,
HRESULT hr;
UINT32 i;
+ /* ignore returned conditions if failed */
hr = IDWriteInlineObject_GetBreakConditions(cur->object, &before, &after);
if (FAILED(hr))
- return hr;
+ after = before = DWRITE_BREAK_CONDITION_NEUTRAL;
if (!layout->actual_breakpoints) {
layout->actual_breakpoints = heap_alloc(sizeof(DWRITE_LINE_BREAKPOINT)*layout->len);
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 1c52d69..77fa85c 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -542,8 +542,8 @@ static HRESULT WINAPI testinlineobj_GetOverhangMetrics(IDWriteInlineObject *ifac
static HRESULT WINAPI testinlineobj_GetBreakConditions(IDWriteInlineObject *iface, DWRITE_BREAK_CONDITION *before,
DWRITE_BREAK_CONDITION *after)
{
- *before = *after = DWRITE_BREAK_CONDITION_NEUTRAL;
- return S_OK;
+ *before = *after = DWRITE_BREAK_CONDITION_MUST_BREAK;
+ return 0x8feacafe;
}
static IDWriteInlineObjectVtbl testinlineobjvtbl = {
@@ -557,6 +557,7 @@ static IDWriteInlineObjectVtbl testinlineobjvtbl = {
};
static IDWriteInlineObject testinlineobj = { &testinlineobjvtbl };
+static IDWriteInlineObject testinlineobj2 = { &testinlineobjvtbl };
static void test_CreateTextLayout(void)
{
@@ -1422,6 +1423,36 @@ todo_wine
ok(metrics[0].isNewline == 0, "got %d\n", metrics[0].isNewline);
ok(metrics[0].isSoftHyphen == 0, "got %d\n", metrics[0].isSoftHyphen);
ok(metrics[0].isRightToLeft == 0, "got %d\n", metrics[0].isRightToLeft);
+
+ /* now set two inline object for [0,1] and [2,3], both fail to report break conditions */
+ range.startPosition = 2;
+ range.length = 2;
+ hr = IDWriteTextLayout_SetInlineObject(layout, &testinlineobj2, range);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+
+ count = 0;
+ memset(metrics, 0, sizeof(metrics));
+ hr = IDWriteTextLayout_GetClusterMetrics(layout, metrics, 3, &count);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ ok(count == 2, "got %u\n", count);
+
+ ok(metrics[0].width == 0.0, "got %.2f\n", metrics[0].width);
+ ok(metrics[0].length == 2, "got %d\n", metrics[0].length);
+ ok(metrics[0].canWrapLineAfter == 0, "got %d\n", metrics[0].canWrapLineAfter);
+ ok(metrics[0].isWhitespace == 0, "got %d\n", metrics[0].isWhitespace);
+ ok(metrics[0].isNewline == 0, "got %d\n", metrics[0].isNewline);
+ ok(metrics[0].isSoftHyphen == 0, "got %d\n", metrics[0].isSoftHyphen);
+ ok(metrics[0].isRightToLeft == 0, "got %d\n", metrics[0].isRightToLeft);
+
+ ok(metrics[1].width == 0.0, "got %.2f\n", metrics[1].width);
+ ok(metrics[1].length == 2, "got %d\n", metrics[1].length);
+todo_wine
+ ok(metrics[1].canWrapLineAfter == 1, "got %d\n", metrics[1].canWrapLineAfter);
+ ok(metrics[1].isWhitespace == 0, "got %d\n", metrics[1].isWhitespace);
+ ok(metrics[1].isNewline == 0, "got %d\n", metrics[1].isNewline);
+ ok(metrics[1].isSoftHyphen == 0, "got %d\n", metrics[1].isSoftHyphen);
+ ok(metrics[1].isRightToLeft == 0, "got %d\n", metrics[1].isRightToLeft);
+
IDWriteTextLayout_Release(layout);
IDWriteInlineObject_Release(trimm);
More information about the wine-cvs
mailing list