dwrite: Handle inline object GetMetrics() failure.
This commit is contained in:
parent
fe2f6b77a8
commit
10ff42097f
|
@ -603,11 +603,11 @@ static HRESULT layout_compute_runs(struct dwrite_textlayout *layout)
|
||||||
c->position = 0; /* there's always one cluster per inline object, so 0 is valid value */
|
c->position = 0; /* there's always one cluster per inline object, so 0 is valid value */
|
||||||
cluster++;
|
cluster++;
|
||||||
|
|
||||||
/* TODO: is it fatal if GetMetrics() fails? */
|
/* it's not fatal if GetMetrics() fails, all returned metrics are ignored */
|
||||||
hr = IDWriteInlineObject_GetMetrics(r->u.object.object, &inlinemetrics);
|
hr = IDWriteInlineObject_GetMetrics(r->u.object.object, &inlinemetrics);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
FIXME("failed to get inline object metrics, 0x%08x\n", hr);
|
memset(&inlinemetrics, 0, sizeof(inlinemetrics));
|
||||||
continue;
|
hr = S_OK;
|
||||||
}
|
}
|
||||||
metrics->width = inlinemetrics.width;
|
metrics->width = inlinemetrics.width;
|
||||||
|
|
||||||
|
|
|
@ -496,6 +496,68 @@ static const IDWriteTextRendererVtbl testrenderervtbl = {
|
||||||
|
|
||||||
static IDWriteTextRenderer testrenderer = { &testrenderervtbl };
|
static IDWriteTextRenderer testrenderer = { &testrenderervtbl };
|
||||||
|
|
||||||
|
/* test IDWriteInlineObject */
|
||||||
|
static HRESULT WINAPI testinlineobj_QI(IDWriteInlineObject *iface, REFIID riid, void **obj)
|
||||||
|
{
|
||||||
|
if (IsEqualIID(riid, &IID_IDWriteInlineObject) || IsEqualIID(riid, &IID_IUnknown)) {
|
||||||
|
*obj = iface;
|
||||||
|
IDWriteInlineObject_AddRef(iface);
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
*obj = NULL;
|
||||||
|
return E_NOINTERFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI testinlineobj_AddRef(IDWriteInlineObject *iface)
|
||||||
|
{
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ULONG WINAPI testinlineobj_Release(IDWriteInlineObject *iface)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI testinlineobj_Draw(IDWriteInlineObject *iface,
|
||||||
|
void* client_drawingontext, IDWriteTextRenderer* renderer,
|
||||||
|
FLOAT originX, FLOAT originY, BOOL is_sideways, BOOL is_rtl, IUnknown *drawing_effect)
|
||||||
|
{
|
||||||
|
ok(0, "unexpected call\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI testinlineobj_GetMetrics(IDWriteInlineObject *iface, DWRITE_INLINE_OBJECT_METRICS *metrics)
|
||||||
|
{
|
||||||
|
metrics->width = 123.0;
|
||||||
|
return 0x8faecafe;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI testinlineobj_GetOverhangMetrics(IDWriteInlineObject *iface, DWRITE_OVERHANG_METRICS *overhangs)
|
||||||
|
{
|
||||||
|
ok(0, "unexpected call\n");
|
||||||
|
return E_NOTIMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HRESULT WINAPI testinlineobj_GetBreakConditions(IDWriteInlineObject *iface, DWRITE_BREAK_CONDITION *before,
|
||||||
|
DWRITE_BREAK_CONDITION *after)
|
||||||
|
{
|
||||||
|
*before = *after = DWRITE_BREAK_CONDITION_NEUTRAL;
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static IDWriteInlineObjectVtbl testinlineobjvtbl = {
|
||||||
|
testinlineobj_QI,
|
||||||
|
testinlineobj_AddRef,
|
||||||
|
testinlineobj_Release,
|
||||||
|
testinlineobj_Draw,
|
||||||
|
testinlineobj_GetMetrics,
|
||||||
|
testinlineobj_GetOverhangMetrics,
|
||||||
|
testinlineobj_GetBreakConditions
|
||||||
|
};
|
||||||
|
|
||||||
|
static IDWriteInlineObject testinlineobj = { &testinlineobjvtbl };
|
||||||
|
|
||||||
static void test_CreateTextLayout(void)
|
static void test_CreateTextLayout(void)
|
||||||
{
|
{
|
||||||
static const WCHAR strW[] = {'s','t','r','i','n','g',0};
|
static const WCHAR strW[] = {'s','t','r','i','n','g',0};
|
||||||
|
@ -1336,6 +1398,32 @@ todo_wine
|
||||||
|
|
||||||
IDWriteTextLayout_Release(layout);
|
IDWriteTextLayout_Release(layout);
|
||||||
|
|
||||||
|
/* single inline object that fails to report its metrics */
|
||||||
|
hr = IDWriteFactory_CreateTextLayout(factory, strW, 4, format, 1000.0, 1000.0, &layout);
|
||||||
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
|
range.startPosition = 0;
|
||||||
|
range.length = 4;
|
||||||
|
hr = IDWriteTextLayout_SetInlineObject(layout, &testinlineobj, 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 == 1, "got %u\n", count);
|
||||||
|
|
||||||
|
/* object sets a width to 123.0, but returns failure from GetMetrics() */
|
||||||
|
ok(metrics[0].width == 0.0, "got %.2f\n", metrics[0].width);
|
||||||
|
ok(metrics[0].length == 4, "got %d\n", metrics[0].length);
|
||||||
|
todo_wine
|
||||||
|
ok(metrics[0].canWrapLineAfter == 1, "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);
|
||||||
|
IDWriteTextLayout_Release(layout);
|
||||||
|
|
||||||
IDWriteInlineObject_Release(trimm);
|
IDWriteInlineObject_Release(trimm);
|
||||||
IDWriteTextFormat_Release(format);
|
IDWriteTextFormat_Release(format);
|
||||||
IDWriteFactory_Release(factory);
|
IDWriteFactory_Release(factory);
|
||||||
|
|
Loading…
Reference in New Issue