Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/dwrite/layout.c | 79 +++++++++++++++++++++++++++++++-------
dlls/dwrite/tests/layout.c | 38 ++++++++++++++++--
include/dwrite_3.idl | 2 +-
3 files changed, 100 insertions(+), 19 deletions(-)
diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 38be4eeb2da..99048b97a3c 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -62,6 +62,9 @@ struct dwrite_textformat_data
IDWriteFontCollection *collection;
IDWriteFontFallback *fallback;
+
+ DWRITE_FONT_AXIS_VALUE *axis_values;
+ unsigned int axis_values_count;
};
enum layout_range_attr_kind {
@@ -328,6 +331,7 @@ static void release_format_data(struct dwrite_textformat_data *data)
if (data->trimmingsign) IDWriteInlineObject_Release(data->trimmingsign);
heap_free(data->family_name);
heap_free(data->locale);
+ heap_free(data->axis_values);
}
static inline struct dwrite_textlayout *impl_from_IDWriteTextLayout4(IDWriteTextLayout4 *iface)
@@ -465,6 +469,41 @@ static inline HRESULT format_set_linespacing(struct dwrite_textformat_data *form
return S_OK;
}
+static HRESULT format_set_font_axisvalues(struct dwrite_textformat_data *format,
+ DWRITE_FONT_AXIS_VALUE const *axis_values, unsigned int num_values)
+{
+ heap_free(format->axis_values);
+ format->axis_values = NULL;
+ format->axis_values_count = 0;
+
+ if (num_values)
+ {
+ if (!(format->axis_values = heap_calloc(num_values, sizeof(*axis_values))))
+ return E_OUTOFMEMORY;
+ memcpy(format->axis_values, axis_values, num_values * sizeof(*axis_values));
+ format->axis_values_count = num_values;
+ }
+
+ return S_OK;
+}
+
+static HRESULT format_get_font_axisvalues(struct dwrite_textformat_data *format,
+ DWRITE_FONT_AXIS_VALUE *axis_values, unsigned int num_values)
+{
+ if (!format->axis_values_count)
+ {
+ if (num_values) memset(axis_values, 0, num_values * sizeof(*axis_values));
+ return S_OK;
+ }
+
+ if (num_values < format->axis_values_count)
+ return E_NOT_SUFFICIENT_BUFFER;
+
+ memcpy(axis_values, format->axis_values, min(num_values, format->axis_values_count) * sizeof(*axis_values));
+
+ return S_OK;
+}
+
static HRESULT get_fontfallback_from_format(const struct dwrite_textformat_data *format, IDWriteFontFallback **fallback)
{
*fallback = format->fallback;
@@ -4922,24 +4961,30 @@ static HRESULT WINAPI dwritetextformat2_layout_GetLineSpacing(IDWriteTextFormat3
static HRESULT WINAPI dwritetextformat3_layout_SetFontAxisValues(IDWriteTextFormat3 *iface,
DWRITE_FONT_AXIS_VALUE const *axis_values, UINT32 num_values)
{
- FIXME("%p, %p, %u.\n", iface, axis_values, num_values);
+ struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
- return E_NOTIMPL;
+ TRACE("%p, %p, %u.\n", iface, axis_values, num_values);
+
+ return format_set_font_axisvalues(&layout->format, axis_values, num_values);
}
static UINT32 WINAPI dwritetextformat3_layout_GetFontAxisValueCount(IDWriteTextFormat3 *iface)
{
- FIXME("%p.\n", iface);
+ struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
- return 0;
+ TRACE("%p.\n", iface);
+
+ return layout->format.axis_values_count;
}
static HRESULT WINAPI dwritetextformat3_layout_GetFontAxisValues(IDWriteTextFormat3 *iface,
- DWRITE_FONT_AXIS_VALUE const *axis_values, UINT32 num_values)
+ DWRITE_FONT_AXIS_VALUE *axis_values, UINT32 num_values)
{
- FIXME("%p, %p, %u.\n", iface, axis_values, num_values);
+ struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
- return E_NOTIMPL;
+ TRACE("%p, %p, %u.\n", iface, axis_values, num_values);
+
+ return format_get_font_axisvalues(&layout->format, axis_values, num_values);
}
static DWRITE_AUTOMATIC_FONT_AXES WINAPI dwritetextformat3_layout_GetAutomaticFontAxes(IDWriteTextFormat3 *iface)
@@ -6042,24 +6087,30 @@ static HRESULT WINAPI dwritetextformat2_GetLineSpacing(IDWriteTextFormat3 *iface
static HRESULT WINAPI dwritetextformat3_SetFontAxisValues(IDWriteTextFormat3 *iface,
DWRITE_FONT_AXIS_VALUE const *axis_values, UINT32 num_values)
{
- FIXME("%p, %p, %u.\n", iface, axis_values, num_values);
+ struct dwrite_textformat *format = impl_from_IDWriteTextFormat3(iface);
- return E_NOTIMPL;
+ TRACE("%p, %p, %u.\n", iface, axis_values, num_values);
+
+ return format_set_font_axisvalues(&format->format, axis_values, num_values);
}
static UINT32 WINAPI dwritetextformat3_GetFontAxisValueCount(IDWriteTextFormat3 *iface)
{
- FIXME("%p.\n", iface);
+ struct dwrite_textformat *format = impl_from_IDWriteTextFormat3(iface);
- return 0;
+ TRACE("%p.\n", iface);
+
+ return format->format.axis_values_count;
}
static HRESULT WINAPI dwritetextformat3_GetFontAxisValues(IDWriteTextFormat3 *iface,
- DWRITE_FONT_AXIS_VALUE const *axis_values, UINT32 num_values)
+ DWRITE_FONT_AXIS_VALUE *axis_values, UINT32 num_values)
{
- FIXME("%p, %p, %u.\n", iface, axis_values, num_values);
+ struct dwrite_textformat *format = impl_from_IDWriteTextFormat3(iface);
- return E_NOTIMPL;
+ TRACE("%p, %p, %u.\n", iface, axis_values, num_values);
+
+ return format_get_font_axisvalues(&format->format, axis_values, num_values);
}
static DWRITE_AUTOMATIC_FONT_AXES WINAPI dwritetextformat3_GetAutomaticFontAxes(IDWriteTextFormat3 *iface)
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 43e62a39956..cc4079faa14 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -5894,7 +5894,7 @@ static void test_text_format_axes(void)
{
IDWriteFontCollection *collection;
IDWriteFontCollection2 *collection2;
- DWRITE_FONT_AXIS_VALUE axis;
+ DWRITE_FONT_AXIS_VALUE axes[2];
IDWriteTextFormat3 *format3;
DWRITE_FONT_STRETCH stretch;
DWRITE_FONT_WEIGHT weight;
@@ -5944,9 +5944,9 @@ if (SUCCEEDED(hr))
ok(weight == DWRITE_FONT_WEIGHT_NORMAL, "Unexpected font weight %d.\n", weight);
/* Regular properties are not set from axis values. */
- axis.axisTag = DWRITE_FONT_AXIS_TAG_WEIGHT;
- axis.value = 200.0f;
- hr = IDWriteTextFormat3_SetFontAxisValues(format3, &axis, 1);
+ axes[0].axisTag = DWRITE_FONT_AXIS_TAG_WEIGHT;
+ axes[0].value = 200.0f;
+ hr = IDWriteTextFormat3_SetFontAxisValues(format3, axes, 1);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
weight = IDWriteTextFormat3_GetFontWeight(format3);
@@ -5965,6 +5965,36 @@ if (SUCCEEDED(hr))
count = IDWriteTextFormat3_GetFontAxisValueCount(format3);
ok(!count, "Unexpected axis count %u.\n", count);
+ axes[0].axisTag = DWRITE_FONT_AXIS_TAG_WEIGHT;
+ hr = IDWriteTextFormat3_GetFontAxisValues(format3, axes, 1);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ ok(axes[0].axisTag == 0 && axes[0].value == 0.0f, "Unexpected value.\n");
+
+ axes[0].axisTag = DWRITE_FONT_AXIS_TAG_WEIGHT;
+ axes[0].value = 200.0f;
+ axes[1].axisTag = DWRITE_FONT_AXIS_TAG_WIDTH;
+ axes[1].value = 2.0f;
+ hr = IDWriteTextFormat3_SetFontAxisValues(format3, axes, 2);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ count = IDWriteTextFormat3_GetFontAxisValueCount(format3);
+ ok(count == 2, "Unexpected axis count %u.\n", count);
+
+ hr = IDWriteTextFormat3_GetFontAxisValues(format3, axes, 1);
+ ok(hr == E_NOT_SUFFICIENT_BUFFER, "Unexpected hr %#x.\n", hr);
+
+ hr = IDWriteTextFormat3_GetFontAxisValues(format3, axes, 0);
+ ok(hr == E_NOT_SUFFICIENT_BUFFER, "Unexpected hr %#x.\n", hr);
+
+ hr = IDWriteTextFormat3_GetFontAxisValues(format3, axes, 2);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IDWriteTextFormat3_SetFontAxisValues(format3, axes, 0);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ count = IDWriteTextFormat3_GetFontAxisValueCount(format3);
+ ok(!count, "Unexpected axis count %u.\n", count);
+
IDWriteTextFormat3_Release(format3);
IDWriteTextFormat_Release(format);
diff --git a/include/dwrite_3.idl b/include/dwrite_3.idl
index 1b10454ec60..0db2de71cf1 100644
--- a/include/dwrite_3.idl
+++ b/include/dwrite_3.idl
@@ -562,7 +562,7 @@ interface IDWriteTextFormat3 : IDWriteTextFormat2
UINT32 num_values);
UINT32 GetFontAxisValueCount();
HRESULT GetFontAxisValues(
- DWRITE_FONT_AXIS_VALUE const *axis_values,
+ DWRITE_FONT_AXIS_VALUE *axis_values,
UINT32 num_values);
DWRITE_AUTOMATIC_FONT_AXES GetAutomaticFontAxes();
HRESULT SetAutomaticFontAxes(DWRITE_AUTOMATIC_FONT_AXES axes);
--
2.30.1