Nikolay Sivov : dwrite/layout: Implement axis values property for the format object.

Alexandre Julliard julliard at winehq.org
Mon Mar 1 15:54:04 CST 2021


Module: wine
Branch: master
Commit: 1cbc74a3abe142c6ff9cfd8cc6d298ec38d4dd1e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=1cbc74a3abe142c6ff9cfd8cc6d298ec38d4dd1e

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Mon Mar  1 17:29:39 2021 +0300

dwrite/layout: Implement axis values property for the format object.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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);




More information about the wine-cvs mailing list