dwrite: Implement SetTrimming() for layout.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
e6be6283b6
commit
e5fb775142
|
@ -411,6 +411,30 @@ static inline HRESULT format_set_flowdirection(struct dwrite_textformat_data *fo
|
|||
return S_OK;
|
||||
}
|
||||
|
||||
static inline HRESULT format_set_trimming(struct dwrite_textformat_data *format,
|
||||
DWRITE_TRIMMING const *trimming, IDWriteInlineObject *trimming_sign, BOOL *changed)
|
||||
{
|
||||
if (changed)
|
||||
*changed = FALSE;
|
||||
|
||||
if ((UINT32)trimming->granularity > DWRITE_TRIMMING_GRANULARITY_WORD)
|
||||
return E_INVALIDARG;
|
||||
|
||||
if (changed) {
|
||||
*changed = !!memcmp(&format->trimming, trimming, sizeof(*trimming));
|
||||
if (format->trimmingsign != trimming_sign)
|
||||
*changed = TRUE;
|
||||
}
|
||||
|
||||
format->trimming = *trimming;
|
||||
if (format->trimmingsign)
|
||||
IDWriteInlineObject_Release(format->trimmingsign);
|
||||
format->trimmingsign = trimming_sign;
|
||||
if (format->trimmingsign)
|
||||
IDWriteInlineObject_AddRef(format->trimmingsign);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static inline HRESULT format_set_linespacing(struct dwrite_textformat_data *format,
|
||||
DWRITE_LINE_SPACING_METHOD method, FLOAT spacing, FLOAT baseline, BOOL *changed)
|
||||
{
|
||||
|
@ -3855,8 +3879,17 @@ static HRESULT WINAPI dwritetextformat_layout_SetTrimming(IDWriteTextFormat1 *if
|
|||
IDWriteInlineObject *trimming_sign)
|
||||
{
|
||||
struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat1(iface);
|
||||
FIXME("(%p)->(%p %p): stub\n", This, trimming, trimming_sign);
|
||||
return E_NOTIMPL;
|
||||
BOOL changed;
|
||||
HRESULT hr;
|
||||
|
||||
TRACE("(%p)->(%p %p)\n", This, trimming, trimming_sign);
|
||||
|
||||
hr = format_set_trimming(&This->format, trimming, trimming_sign, &changed);
|
||||
|
||||
if (changed)
|
||||
This->recompute |= RECOMPUTE_LINES;
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI dwritetextformat_layout_SetLineSpacing(IDWriteTextFormat1 *iface, DWRITE_LINE_SPACING_METHOD method,
|
||||
|
@ -4839,14 +4872,7 @@ static HRESULT WINAPI dwritetextformat_SetTrimming(IDWriteTextFormat2 *iface, DW
|
|||
{
|
||||
struct dwrite_textformat *This = impl_from_IDWriteTextFormat2(iface);
|
||||
TRACE("(%p)->(%p %p)\n", This, trimming, trimming_sign);
|
||||
|
||||
This->format.trimming = *trimming;
|
||||
if (This->format.trimmingsign)
|
||||
IDWriteInlineObject_Release(This->format.trimmingsign);
|
||||
This->format.trimmingsign = trimming_sign;
|
||||
if (This->format.trimmingsign)
|
||||
IDWriteInlineObject_AddRef(This->format.trimmingsign);
|
||||
return S_OK;
|
||||
return format_set_trimming(&This->format, trimming, trimming_sign, NULL);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI dwritetextformat_SetLineSpacing(IDWriteTextFormat2 *iface, DWRITE_LINE_SPACING_METHOD method,
|
||||
|
|
|
@ -1069,6 +1069,13 @@ if (0) /* crashes on native */
|
|||
hr = IDWriteTextFormat_SetTrimming(format, &trimming, NULL);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
|
||||
/* invalid granularity */
|
||||
trimming.granularity = 10;
|
||||
trimming.delimiter = 0;
|
||||
trimming.delimiterCount = 0;
|
||||
hr = IDWriteTextFormat_SetTrimming(format, &trimming, NULL);
|
||||
ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
|
||||
|
||||
IDWriteTextFormat_Release(format);
|
||||
IDWriteFactory_Release(factory);
|
||||
}
|
||||
|
@ -1771,13 +1778,17 @@ static void test_GetClusterMetrics(void)
|
|||
static const WCHAR str4W[] = {'a',' ',0};
|
||||
DWRITE_INLINE_OBJECT_METRICS inline_metrics;
|
||||
DWRITE_CLUSTER_METRICS metrics[22];
|
||||
DWRITE_TEXT_METRICS text_metrics;
|
||||
DWRITE_TRIMMING trimming_options;
|
||||
IDWriteTextLayout1 *layout1;
|
||||
IDWriteInlineObject *trimm;
|
||||
IDWriteTextFormat *format;
|
||||
IDWriteTextLayout *layout;
|
||||
DWRITE_LINE_METRICS line;
|
||||
DWRITE_TEXT_RANGE range;
|
||||
IDWriteFactory *factory;
|
||||
UINT32 count, i;
|
||||
FLOAT width;
|
||||
HRESULT hr;
|
||||
|
||||
factory = create_factory();
|
||||
|
@ -2121,6 +2132,47 @@ todo_wine
|
|||
|
||||
IDWriteTextLayout_Release(layout);
|
||||
|
||||
/* trigger line trimming */
|
||||
hr = IDWriteFactory_CreateTextLayout(factory, strW, lstrlenW(strW), format, 100.0f, 200.0f, &layout);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
|
||||
count = 0;
|
||||
memset(metrics, 0, sizeof(metrics));
|
||||
hr = IDWriteTextLayout_GetClusterMetrics(layout, metrics, 4, &count);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
ok(count == 4, "got %u\n", count);
|
||||
|
||||
hr = IDWriteTextLayout_GetMetrics(layout, &text_metrics);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
|
||||
width = metrics[0].width + inline_metrics.width;
|
||||
ok(width < text_metrics.width, "unexpected trimming sign width\n");
|
||||
|
||||
/* enable trimming, reduce layout width so only first cluster and trimming sign fits */
|
||||
trimming_options.granularity = DWRITE_TRIMMING_GRANULARITY_CHARACTER;
|
||||
trimming_options.delimiter = 0;
|
||||
trimming_options.delimiterCount = 0;
|
||||
hr = IDWriteTextLayout_SetTrimming(layout, &trimming_options, trimm);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
|
||||
hr = IDWriteTextLayout_SetMaxWidth(layout, width);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
|
||||
count = 0;
|
||||
memset(metrics, 0, sizeof(metrics));
|
||||
hr = IDWriteTextLayout_GetClusterMetrics(layout, metrics, 4, &count);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
ok(count == 4, "got %u\n", count);
|
||||
|
||||
hr = IDWriteTextLayout_GetLineMetrics(layout, &line, 1, &count);
|
||||
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||
ok(count == 1, "got %u\n", count);
|
||||
todo_wine
|
||||
ok(line.length == 4, "got %u\n", line.length);
|
||||
ok(line.isTrimmed, "got %d\n", line.isTrimmed);
|
||||
|
||||
IDWriteTextLayout_Release(layout);
|
||||
|
||||
IDWriteInlineObject_Release(trimm);
|
||||
IDWriteTextFormat_Release(format);
|
||||
IDWriteFactory_Release(factory);
|
||||
|
|
Loading…
Reference in New Issue