[v2 PATCH 3/3] dwrite: Add support for IDWriteTextFormat3 for text layout object.

Nikolay Sivov nsivov at codeweavers.com
Fri Nov 29 03:54:27 CST 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/dwrite/layout.c       | 456 ++++++++++++++++++++++---------------
 dlls/dwrite/tests/layout.c |  16 +-
 2 files changed, 282 insertions(+), 190 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 6ff4dd12a4..6f166b03f7 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -246,7 +246,7 @@ enum layout_recompute_mask {
 struct dwrite_textlayout
 {
     IDWriteTextLayout4 IDWriteTextLayout4_iface;
-    IDWriteTextFormat2 IDWriteTextFormat2_iface;
+    IDWriteTextFormat3 IDWriteTextFormat3_iface;
     IDWriteTextAnalysisSink1 IDWriteTextAnalysisSink1_iface;
     IDWriteTextAnalysisSource1 IDWriteTextAnalysisSource1_iface;
     LONG refcount;
@@ -330,9 +330,9 @@ static inline struct dwrite_textlayout *impl_from_IDWriteTextLayout4(IDWriteText
     return CONTAINING_RECORD(iface, struct dwrite_textlayout, IDWriteTextLayout4_iface);
 }
 
-static inline struct dwrite_textlayout *impl_layout_from_IDWriteTextFormat2(IDWriteTextFormat2 *iface)
+static inline struct dwrite_textlayout *impl_layout_from_IDWriteTextFormat3(IDWriteTextFormat3 *iface)
 {
-    return CONTAINING_RECORD(iface, struct dwrite_textlayout, IDWriteTextFormat2_iface);
+    return CONTAINING_RECORD(iface, struct dwrite_textlayout, IDWriteTextFormat3_iface);
 }
 
 static inline struct dwrite_textlayout *impl_from_IDWriteTextAnalysisSink1(IDWriteTextAnalysisSink1 *iface)
@@ -2806,10 +2806,13 @@ static HRESULT WINAPI dwritetextlayout_QueryInterface(IDWriteTextLayout4 *iface,
     {
         *obj = iface;
     }
-    else if (IsEqualIID(riid, &IID_IDWriteTextFormat2) ||
+    else if (IsEqualIID(riid, &IID_IDWriteTextFormat3) ||
+             IsEqualIID(riid, &IID_IDWriteTextFormat2) ||
              IsEqualIID(riid, &IID_IDWriteTextFormat1) ||
              IsEqualIID(riid, &IID_IDWriteTextFormat))
-        *obj = &layout->IDWriteTextFormat2_iface;
+    {
+        *obj = &layout->IDWriteTextFormat3_iface;
+    }
 
     if (*obj) {
         IDWriteTextLayout4_AddRef(iface);
@@ -2860,158 +2863,159 @@ static ULONG WINAPI dwritetextlayout_Release(IDWriteTextLayout4 *iface)
 static HRESULT WINAPI dwritetextlayout_SetTextAlignment(IDWriteTextLayout4 *iface, DWRITE_TEXT_ALIGNMENT alignment)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_SetTextAlignment(&layout->IDWriteTextFormat2_iface, alignment);
+    return IDWriteTextFormat3_SetTextAlignment(&layout->IDWriteTextFormat3_iface, alignment);
 }
 
 static HRESULT WINAPI dwritetextlayout_SetParagraphAlignment(IDWriteTextLayout4 *iface,
         DWRITE_PARAGRAPH_ALIGNMENT alignment)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_SetParagraphAlignment(&layout->IDWriteTextFormat2_iface, alignment);
+    return IDWriteTextFormat3_SetParagraphAlignment(&layout->IDWriteTextFormat3_iface, alignment);
 }
 
 static HRESULT WINAPI dwritetextlayout_SetWordWrapping(IDWriteTextLayout4 *iface, DWRITE_WORD_WRAPPING wrapping)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_SetWordWrapping(&layout->IDWriteTextFormat2_iface, wrapping);
+    return IDWriteTextFormat3_SetWordWrapping(&layout->IDWriteTextFormat3_iface, wrapping);
 }
 
-static HRESULT WINAPI dwritetextlayout_SetReadingDirection(IDWriteTextLayout4 *iface, DWRITE_READING_DIRECTION direction)
+static HRESULT WINAPI dwritetextlayout_SetReadingDirection(IDWriteTextLayout4 *iface,
+        DWRITE_READING_DIRECTION direction)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_SetReadingDirection(&layout->IDWriteTextFormat2_iface, direction);
+    return IDWriteTextFormat3_SetReadingDirection(&layout->IDWriteTextFormat3_iface, direction);
 }
 
 static HRESULT WINAPI dwritetextlayout_SetFlowDirection(IDWriteTextLayout4 *iface, DWRITE_FLOW_DIRECTION direction)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_SetFlowDirection(&layout->IDWriteTextFormat2_iface, direction);
+    return IDWriteTextFormat3_SetFlowDirection(&layout->IDWriteTextFormat3_iface, direction);
 }
 
 static HRESULT WINAPI dwritetextlayout_SetIncrementalTabStop(IDWriteTextLayout4 *iface, FLOAT tabstop)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_SetIncrementalTabStop(&layout->IDWriteTextFormat2_iface, tabstop);
+    return IDWriteTextFormat3_SetIncrementalTabStop(&layout->IDWriteTextFormat3_iface, tabstop);
 }
 
 static HRESULT WINAPI dwritetextlayout_SetTrimming(IDWriteTextLayout4 *iface, DWRITE_TRIMMING const *trimming,
     IDWriteInlineObject *trimming_sign)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_SetTrimming(&layout->IDWriteTextFormat2_iface, trimming, trimming_sign);
+    return IDWriteTextFormat3_SetTrimming(&layout->IDWriteTextFormat3_iface, trimming, trimming_sign);
 }
 
 static HRESULT WINAPI dwritetextlayout_SetLineSpacing(IDWriteTextLayout4 *iface, DWRITE_LINE_SPACING_METHOD spacing,
     FLOAT line_spacing, FLOAT baseline)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat1_SetLineSpacing((IDWriteTextFormat1 *)&layout->IDWriteTextFormat2_iface, spacing,
+    return IDWriteTextFormat1_SetLineSpacing((IDWriteTextFormat1 *)&layout->IDWriteTextFormat3_iface, spacing,
             line_spacing, baseline);
 }
 
 static DWRITE_TEXT_ALIGNMENT WINAPI dwritetextlayout_GetTextAlignment(IDWriteTextLayout4 *iface)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetTextAlignment(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetTextAlignment(&layout->IDWriteTextFormat3_iface);
 }
 
 static DWRITE_PARAGRAPH_ALIGNMENT WINAPI dwritetextlayout_GetParagraphAlignment(IDWriteTextLayout4 *iface)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetParagraphAlignment(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetParagraphAlignment(&layout->IDWriteTextFormat3_iface);
 }
 
 static DWRITE_WORD_WRAPPING WINAPI dwritetextlayout_GetWordWrapping(IDWriteTextLayout4 *iface)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetWordWrapping(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetWordWrapping(&layout->IDWriteTextFormat3_iface);
 }
 
 static DWRITE_READING_DIRECTION WINAPI dwritetextlayout_GetReadingDirection(IDWriteTextLayout4 *iface)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetReadingDirection(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetReadingDirection(&layout->IDWriteTextFormat3_iface);
 }
 
 static DWRITE_FLOW_DIRECTION WINAPI dwritetextlayout_GetFlowDirection(IDWriteTextLayout4 *iface)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetFlowDirection(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetFlowDirection(&layout->IDWriteTextFormat3_iface);
 }
 
 static FLOAT WINAPI dwritetextlayout_GetIncrementalTabStop(IDWriteTextLayout4 *iface)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetIncrementalTabStop(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetIncrementalTabStop(&layout->IDWriteTextFormat3_iface);
 }
 
 static HRESULT WINAPI dwritetextlayout_GetTrimming(IDWriteTextLayout4 *iface, DWRITE_TRIMMING *options,
     IDWriteInlineObject **trimming_sign)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetTrimming(&layout->IDWriteTextFormat2_iface, options, trimming_sign);
+    return IDWriteTextFormat3_GetTrimming(&layout->IDWriteTextFormat3_iface, options, trimming_sign);
 }
 
 static HRESULT WINAPI dwritetextlayout_GetLineSpacing(IDWriteTextLayout4 *iface, DWRITE_LINE_SPACING_METHOD *method,
     FLOAT *spacing, FLOAT *baseline)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat_GetLineSpacing((IDWriteTextFormat *)&layout->IDWriteTextFormat2_iface, method,
+    return IDWriteTextFormat_GetLineSpacing((IDWriteTextFormat *)&layout->IDWriteTextFormat3_iface, method,
             spacing, baseline);
 }
 
 static HRESULT WINAPI dwritetextlayout_GetFontCollection(IDWriteTextLayout4 *iface, IDWriteFontCollection **collection)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetFontCollection(&layout->IDWriteTextFormat2_iface, collection);
+    return IDWriteTextFormat3_GetFontCollection(&layout->IDWriteTextFormat3_iface, collection);
 }
 
 static UINT32 WINAPI dwritetextlayout_GetFontFamilyNameLength(IDWriteTextLayout4 *iface)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetFontFamilyNameLength(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetFontFamilyNameLength(&layout->IDWriteTextFormat3_iface);
 }
 
 static HRESULT WINAPI dwritetextlayout_GetFontFamilyName(IDWriteTextLayout4 *iface, WCHAR *name, UINT32 size)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetFontFamilyName(&layout->IDWriteTextFormat2_iface, name, size);
+    return IDWriteTextFormat3_GetFontFamilyName(&layout->IDWriteTextFormat3_iface, name, size);
 }
 
 static DWRITE_FONT_WEIGHT WINAPI dwritetextlayout_GetFontWeight(IDWriteTextLayout4 *iface)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetFontWeight(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetFontWeight(&layout->IDWriteTextFormat3_iface);
 }
 
 static DWRITE_FONT_STYLE WINAPI dwritetextlayout_GetFontStyle(IDWriteTextLayout4 *iface)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetFontStyle(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetFontStyle(&layout->IDWriteTextFormat3_iface);
 }
 
 static DWRITE_FONT_STRETCH WINAPI dwritetextlayout_GetFontStretch(IDWriteTextLayout4 *iface)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetFontStretch(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetFontStretch(&layout->IDWriteTextFormat3_iface);
 }
 
 static FLOAT WINAPI dwritetextlayout_GetFontSize(IDWriteTextLayout4 *iface)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetFontSize(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetFontSize(&layout->IDWriteTextFormat3_iface);
 }
 
 static UINT32 WINAPI dwritetextlayout_GetLocaleNameLength(IDWriteTextLayout4 *iface)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetLocaleNameLength(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetLocaleNameLength(&layout->IDWriteTextFormat3_iface);
 }
 
 static HRESULT WINAPI dwritetextlayout_GetLocaleName(IDWriteTextLayout4 *iface, WCHAR *name, UINT32 size)
 {
     struct dwrite_textlayout *layout = impl_from_IDWriteTextLayout4(iface);
-    return IDWriteTextFormat2_GetLocaleName(&layout->IDWriteTextFormat2_iface, name, size);
+    return IDWriteTextFormat3_GetLocaleName(&layout->IDWriteTextFormat3_iface, name, size);
 }
 
 static HRESULT WINAPI dwritetextlayout_SetMaxWidth(IDWriteTextLayout4 *iface, FLOAT maxWidth)
@@ -3992,7 +3996,7 @@ static HRESULT WINAPI dwritetextlayout2_SetLastLineWrapping(IDWriteTextLayout4 *
 
     TRACE("%p, %d.\n", iface, lastline_wrapping_enabled);
 
-    return IDWriteTextFormat2_SetLastLineWrapping(&layout->IDWriteTextFormat2_iface, lastline_wrapping_enabled);
+    return IDWriteTextFormat3_SetLastLineWrapping(&layout->IDWriteTextFormat3_iface, lastline_wrapping_enabled);
 }
 
 static BOOL WINAPI dwritetextlayout2_GetLastLineWrapping(IDWriteTextLayout4 *iface)
@@ -4001,7 +4005,7 @@ static BOOL WINAPI dwritetextlayout2_GetLastLineWrapping(IDWriteTextLayout4 *ifa
 
     TRACE("%p.\n", iface);
 
-    return IDWriteTextFormat2_GetLastLineWrapping(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetLastLineWrapping(&layout->IDWriteTextFormat3_iface);
 }
 
 static HRESULT WINAPI dwritetextlayout2_SetOpticalAlignment(IDWriteTextLayout4 *iface,
@@ -4011,7 +4015,7 @@ static HRESULT WINAPI dwritetextlayout2_SetOpticalAlignment(IDWriteTextLayout4 *
 
     TRACE("%p, %d.\n", iface, alignment);
 
-    return IDWriteTextFormat2_SetOpticalAlignment(&layout->IDWriteTextFormat2_iface, alignment);
+    return IDWriteTextFormat3_SetOpticalAlignment(&layout->IDWriteTextFormat3_iface, alignment);
 }
 
 static DWRITE_OPTICAL_ALIGNMENT WINAPI dwritetextlayout2_GetOpticalAlignment(IDWriteTextLayout4 *iface)
@@ -4020,7 +4024,7 @@ static DWRITE_OPTICAL_ALIGNMENT WINAPI dwritetextlayout2_GetOpticalAlignment(IDW
 
     TRACE("%p.\n", iface);
 
-    return IDWriteTextFormat2_GetOpticalAlignment(&layout->IDWriteTextFormat2_iface);
+    return IDWriteTextFormat3_GetOpticalAlignment(&layout->IDWriteTextFormat3_iface);
 }
 
 static HRESULT WINAPI dwritetextlayout2_SetFontFallback(IDWriteTextLayout4 *iface, IDWriteFontFallback *fallback)
@@ -4246,163 +4250,165 @@ static const IDWriteTextLayout4Vtbl dwritetextlayoutvtbl =
     dwritetextlayout4_SetAutomaticFontAxes,
 };
 
-static HRESULT WINAPI dwritetextformat_layout_QueryInterface(IDWriteTextFormat2 *iface, REFIID riid, void **obj)
+static HRESULT WINAPI dwritetextformat_layout_QueryInterface(IDWriteTextFormat3 *iface, REFIID riid, void **obj)
 {
-    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
 
     TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
 
     return IDWriteTextLayout4_QueryInterface(&layout->IDWriteTextLayout4_iface, riid, obj);
 }
 
-static ULONG WINAPI dwritetextformat_layout_AddRef(IDWriteTextFormat2 *iface)
+static ULONG WINAPI dwritetextformat_layout_AddRef(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
     return IDWriteTextLayout4_AddRef(&layout->IDWriteTextLayout4_iface);
 }
 
-static ULONG WINAPI dwritetextformat_layout_Release(IDWriteTextFormat2 *iface)
+static ULONG WINAPI dwritetextformat_layout_Release(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
     return IDWriteTextLayout4_Release(&layout->IDWriteTextLayout4_iface);
 }
 
-static HRESULT WINAPI dwritetextformat_layout_SetTextAlignment(IDWriteTextFormat2 *iface,
+static HRESULT WINAPI dwritetextformat_layout_SetTextAlignment(IDWriteTextFormat3 *iface,
         DWRITE_TEXT_ALIGNMENT alignment)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
     BOOL changed;
     HRESULT hr;
 
-    TRACE("(%p)->(%d)\n", This, alignment);
+    TRACE("%p, %d.\n", iface, alignment);
 
-    hr = format_set_textalignment(&This->format, alignment, &changed);
+    hr = format_set_textalignment(&layout->format, alignment, &changed);
     if (FAILED(hr))
         return hr;
 
-    if (changed) {
+    if (changed)
+    {
         /* if layout is not ready there's nothing to align */
-        if (!(This->recompute & RECOMPUTE_LINES))
-            layout_apply_text_alignment(This);
-        This->recompute |= RECOMPUTE_OVERHANGS;
+        if (!(layout->recompute & RECOMPUTE_LINES))
+            layout_apply_text_alignment(layout);
+        layout->recompute |= RECOMPUTE_OVERHANGS;
     }
 
     return S_OK;
 }
 
-static HRESULT WINAPI dwritetextformat_layout_SetParagraphAlignment(IDWriteTextFormat2 *iface,
+static HRESULT WINAPI dwritetextformat_layout_SetParagraphAlignment(IDWriteTextFormat3 *iface,
         DWRITE_PARAGRAPH_ALIGNMENT alignment)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
     BOOL changed;
     HRESULT hr;
 
-    TRACE("(%p)->(%d)\n", This, alignment);
+    TRACE("%p, %d.\n", iface, alignment);
 
-    hr = format_set_paralignment(&This->format, alignment, &changed);
+    hr = format_set_paralignment(&layout->format, alignment, &changed);
     if (FAILED(hr))
         return hr;
 
-    if (changed) {
+    if (changed)
+    {
         /* if layout is not ready there's nothing to align */
-        if (!(This->recompute & RECOMPUTE_LINES))
-            layout_apply_par_alignment(This);
-        This->recompute |= RECOMPUTE_OVERHANGS;
+        if (!(layout->recompute & RECOMPUTE_LINES))
+            layout_apply_par_alignment(layout);
+        layout->recompute |= RECOMPUTE_OVERHANGS;
     }
 
     return S_OK;
 }
 
-static HRESULT WINAPI dwritetextformat_layout_SetWordWrapping(IDWriteTextFormat2 *iface, DWRITE_WORD_WRAPPING wrapping)
+static HRESULT WINAPI dwritetextformat_layout_SetWordWrapping(IDWriteTextFormat3 *iface, DWRITE_WORD_WRAPPING wrapping)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
     BOOL changed;
     HRESULT hr;
 
-    TRACE("(%p)->(%d)\n", This, wrapping);
+    TRACE("%p, %d.\n", iface, wrapping);
 
-    hr = format_set_wordwrapping(&This->format, wrapping, &changed);
+    hr = format_set_wordwrapping(&layout->format, wrapping, &changed);
     if (FAILED(hr))
         return hr;
 
     if (changed)
-        This->recompute |= RECOMPUTE_LINES_AND_OVERHANGS;
+        layout->recompute |= RECOMPUTE_LINES_AND_OVERHANGS;
 
     return S_OK;
 }
 
-static HRESULT WINAPI dwritetextformat_layout_SetReadingDirection(IDWriteTextFormat2 *iface,
+static HRESULT WINAPI dwritetextformat_layout_SetReadingDirection(IDWriteTextFormat3 *iface,
         DWRITE_READING_DIRECTION direction)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
     BOOL changed;
     HRESULT hr;
 
-    TRACE("(%p)->(%d)\n", This, direction);
+    TRACE("%p, %d.\n", iface, direction);
 
-    hr = format_set_readingdirection(&This->format, direction, &changed);
+    hr = format_set_readingdirection(&layout->format, direction, &changed);
     if (FAILED(hr))
         return hr;
 
     if (changed)
-        This->recompute = RECOMPUTE_EVERYTHING;
+        layout->recompute = RECOMPUTE_EVERYTHING;
 
     return S_OK;
 }
 
-static HRESULT WINAPI dwritetextformat_layout_SetFlowDirection(IDWriteTextFormat2 *iface,
+static HRESULT WINAPI dwritetextformat_layout_SetFlowDirection(IDWriteTextFormat3 *iface,
         DWRITE_FLOW_DIRECTION direction)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
     BOOL changed;
     HRESULT hr;
 
-    TRACE("(%p)->(%d)\n", This, direction);
+    TRACE("%p, %d.\n", iface, direction);
 
-    hr = format_set_flowdirection(&This->format, direction, &changed);
+    hr = format_set_flowdirection(&layout->format, direction, &changed);
     if (FAILED(hr))
         return hr;
 
     if (changed)
-        This->recompute = RECOMPUTE_EVERYTHING;
+        layout->recompute = RECOMPUTE_EVERYTHING;
 
     return S_OK;
 }
 
-static HRESULT WINAPI dwritetextformat_layout_SetIncrementalTabStop(IDWriteTextFormat2 *iface, FLOAT tabstop)
+static HRESULT WINAPI dwritetextformat_layout_SetIncrementalTabStop(IDWriteTextFormat3 *iface, FLOAT tabstop)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
 
-    TRACE("(%p)->(%f)\n", This, tabstop);
+    TRACE("%p, %.8e.\n", iface, tabstop);
 
     if (tabstop <= 0.0f)
         return E_INVALIDARG;
 
-    This->format.tabstop = tabstop;
+    layout->format.tabstop = tabstop;
     return S_OK;
 }
 
-static HRESULT WINAPI dwritetextformat_layout_SetTrimming(IDWriteTextFormat2 *iface, DWRITE_TRIMMING const *trimming,
+static HRESULT WINAPI dwritetextformat_layout_SetTrimming(IDWriteTextFormat3 *iface, DWRITE_TRIMMING const *trimming,
     IDWriteInlineObject *trimming_sign)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
     BOOL changed;
     HRESULT hr;
 
-    TRACE("(%p)->(%p %p)\n", This, trimming, trimming_sign);
+    TRACE("%p, %p, %p.\n", iface, trimming, trimming_sign);
 
-    hr = format_set_trimming(&This->format, trimming, trimming_sign, &changed);
+    hr = format_set_trimming(&layout->format, trimming, trimming_sign, &changed);
 
     if (changed)
-        This->recompute |= RECOMPUTE_LINES_AND_OVERHANGS;
+        layout->recompute |= RECOMPUTE_LINES_AND_OVERHANGS;
 
     return hr;
 }
 
-static HRESULT WINAPI dwritetextformat_layout_SetLineSpacing(IDWriteTextFormat2 *iface,
+static HRESULT WINAPI dwritetextformat_layout_SetLineSpacing(IDWriteTextFormat3 *iface,
         DWRITE_LINE_SPACING_METHOD method, FLOAT height, FLOAT baseline)
 {
-    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
     DWRITE_LINE_SPACING spacing;
 
     TRACE("%p, %d, %.8e, %.8e.\n", iface, method, height, baseline);
@@ -4414,234 +4420,303 @@ static HRESULT WINAPI dwritetextformat_layout_SetLineSpacing(IDWriteTextFormat2
     return IDWriteTextLayout4_SetLineSpacing(&layout->IDWriteTextLayout4_iface, &spacing);
 }
 
-static DWRITE_TEXT_ALIGNMENT WINAPI dwritetextformat_layout_GetTextAlignment(IDWriteTextFormat2 *iface)
+static DWRITE_TEXT_ALIGNMENT WINAPI dwritetextformat_layout_GetTextAlignment(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.textalignment;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.textalignment;
 }
 
-static DWRITE_PARAGRAPH_ALIGNMENT WINAPI dwritetextformat_layout_GetParagraphAlignment(IDWriteTextFormat2 *iface)
+static DWRITE_PARAGRAPH_ALIGNMENT WINAPI dwritetextformat_layout_GetParagraphAlignment(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.paralign;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.paralign;
 }
 
-static DWRITE_WORD_WRAPPING WINAPI dwritetextformat_layout_GetWordWrapping(IDWriteTextFormat2 *iface)
+static DWRITE_WORD_WRAPPING WINAPI dwritetextformat_layout_GetWordWrapping(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.wrapping;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.wrapping;
 }
 
-static DWRITE_READING_DIRECTION WINAPI dwritetextformat_layout_GetReadingDirection(IDWriteTextFormat2 *iface)
+static DWRITE_READING_DIRECTION WINAPI dwritetextformat_layout_GetReadingDirection(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.readingdir;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.readingdir;
 }
 
-static DWRITE_FLOW_DIRECTION WINAPI dwritetextformat_layout_GetFlowDirection(IDWriteTextFormat2 *iface)
+static DWRITE_FLOW_DIRECTION WINAPI dwritetextformat_layout_GetFlowDirection(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.flow;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.flow;
 }
 
-static FLOAT WINAPI dwritetextformat_layout_GetIncrementalTabStop(IDWriteTextFormat2 *iface)
+static FLOAT WINAPI dwritetextformat_layout_GetIncrementalTabStop(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.tabstop;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.tabstop;
 }
 
-static HRESULT WINAPI dwritetextformat_layout_GetTrimming(IDWriteTextFormat2 *iface, DWRITE_TRIMMING *options,
+static HRESULT WINAPI dwritetextformat_layout_GetTrimming(IDWriteTextFormat3 *iface, DWRITE_TRIMMING *options,
     IDWriteInlineObject **trimming_sign)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
 
-    TRACE("(%p)->(%p %p)\n", This, options, trimming_sign);
+    TRACE("%p, %p, %p.\n", iface, options, trimming_sign);
 
-    *options = This->format.trimming;
-    *trimming_sign = This->format.trimmingsign;
+    *options = layout->format.trimming;
+    *trimming_sign = layout->format.trimmingsign;
     if (*trimming_sign)
         IDWriteInlineObject_AddRef(*trimming_sign);
     return S_OK;
 }
 
-static HRESULT WINAPI dwritetextformat_layout_GetLineSpacing(IDWriteTextFormat2 *iface,
+static HRESULT WINAPI dwritetextformat_layout_GetLineSpacing(IDWriteTextFormat3 *iface,
         DWRITE_LINE_SPACING_METHOD *method, FLOAT *spacing, FLOAT *baseline)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
 
-    TRACE("(%p)->(%p %p %p)\n", This, method, spacing, baseline);
+    TRACE("%p, %p, %p, %p.\n", iface, method, spacing, baseline);
 
-    *method = This->format.spacing.method;
-    *spacing = This->format.spacing.height;
-    *baseline = This->format.spacing.baseline;
+    *method = layout->format.spacing.method;
+    *spacing = layout->format.spacing.height;
+    *baseline = layout->format.spacing.baseline;
     return S_OK;
 }
 
-static HRESULT WINAPI dwritetextformat_layout_GetFontCollection(IDWriteTextFormat2 *iface,
+static HRESULT WINAPI dwritetextformat_layout_GetFontCollection(IDWriteTextFormat3 *iface,
         IDWriteFontCollection **collection)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
 
-    TRACE("(%p)->(%p)\n", This, collection);
+    TRACE("%p, %p.\n", iface, collection);
 
-    *collection = This->format.collection;
+    *collection = layout->format.collection;
     if (*collection)
         IDWriteFontCollection_AddRef(*collection);
     return S_OK;
 }
 
-static UINT32 WINAPI dwritetextformat_layout_GetFontFamilyNameLength(IDWriteTextFormat2 *iface)
+static UINT32 WINAPI dwritetextformat_layout_GetFontFamilyNameLength(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.family_len;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.family_len;
 }
 
-static HRESULT WINAPI dwritetextformat_layout_GetFontFamilyName(IDWriteTextFormat2 *iface, WCHAR *name, UINT32 size)
+static HRESULT WINAPI dwritetextformat_layout_GetFontFamilyName(IDWriteTextFormat3 *iface, WCHAR *name, UINT32 size)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
 
-    TRACE("(%p)->(%p %u)\n", This, name, size);
+    TRACE("%p, %p, %u.\n", iface, name, size);
 
-    if (size <= This->format.family_len) return E_NOT_SUFFICIENT_BUFFER;
-    strcpyW(name, This->format.family_name);
+    if (size <= layout->format.family_len) return E_NOT_SUFFICIENT_BUFFER;
+    strcpyW(name, layout->format.family_name);
     return S_OK;
 }
 
-static DWRITE_FONT_WEIGHT WINAPI dwritetextformat_layout_GetFontWeight(IDWriteTextFormat2 *iface)
+static DWRITE_FONT_WEIGHT WINAPI dwritetextformat_layout_GetFontWeight(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.weight;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.weight;
 }
 
-static DWRITE_FONT_STYLE WINAPI dwritetextformat_layout_GetFontStyle(IDWriteTextFormat2 *iface)
+static DWRITE_FONT_STYLE WINAPI dwritetextformat_layout_GetFontStyle(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.style;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.style;
 }
 
-static DWRITE_FONT_STRETCH WINAPI dwritetextformat_layout_GetFontStretch(IDWriteTextFormat2 *iface)
+static DWRITE_FONT_STRETCH WINAPI dwritetextformat_layout_GetFontStretch(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.stretch;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.stretch;
 }
 
-static FLOAT WINAPI dwritetextformat_layout_GetFontSize(IDWriteTextFormat2 *iface)
+static FLOAT WINAPI dwritetextformat_layout_GetFontSize(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.fontsize;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.fontsize;
 }
 
-static UINT32 WINAPI dwritetextformat_layout_GetLocaleNameLength(IDWriteTextFormat2 *iface)
+static UINT32 WINAPI dwritetextformat_layout_GetLocaleNameLength(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.locale_len;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.locale_len;
 }
 
-static HRESULT WINAPI dwritetextformat_layout_GetLocaleName(IDWriteTextFormat2 *iface, WCHAR *name, UINT32 size)
+static HRESULT WINAPI dwritetextformat_layout_GetLocaleName(IDWriteTextFormat3 *iface, WCHAR *name, UINT32 size)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
 
-    TRACE("(%p)->(%p %u)\n", This, name, size);
+    TRACE("%p, %p, %u.\n", iface, name, size);
 
-    if (size <= This->format.locale_len) return E_NOT_SUFFICIENT_BUFFER;
-    strcpyW(name, This->format.locale);
+    if (size <= layout->format.locale_len) return E_NOT_SUFFICIENT_BUFFER;
+    strcpyW(name, layout->format.locale);
     return S_OK;
 }
 
-static HRESULT WINAPI dwritetextformat1_layout_SetVerticalGlyphOrientation(IDWriteTextFormat2 *iface,
+static HRESULT WINAPI dwritetextformat1_layout_SetVerticalGlyphOrientation(IDWriteTextFormat3 *iface,
         DWRITE_VERTICAL_GLYPH_ORIENTATION orientation)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    FIXME("(%p)->(%d): stub\n", This, orientation);
+    FIXME("%p, %d: stub\n", iface, orientation);
+
     return E_NOTIMPL;
 }
 
-static DWRITE_VERTICAL_GLYPH_ORIENTATION WINAPI dwritetextformat1_layout_GetVerticalGlyphOrientation(IDWriteTextFormat2 *iface)
+static DWRITE_VERTICAL_GLYPH_ORIENTATION WINAPI dwritetextformat1_layout_GetVerticalGlyphOrientation(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    FIXME("(%p): stub\n", This);
+    FIXME("%p: stub\n", iface);
+
     return DWRITE_VERTICAL_GLYPH_ORIENTATION_DEFAULT;
 }
 
-static HRESULT WINAPI dwritetextformat1_layout_SetLastLineWrapping(IDWriteTextFormat2 *iface,
+static HRESULT WINAPI dwritetextformat1_layout_SetLastLineWrapping(IDWriteTextFormat3 *iface,
         BOOL lastline_wrapping_enabled)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
 
-    TRACE("(%p)->(%d)\n", This, lastline_wrapping_enabled);
+    TRACE("%p, %d.\n", iface, lastline_wrapping_enabled);
 
-    This->format.last_line_wrapping = !!lastline_wrapping_enabled;
+    layout->format.last_line_wrapping = !!lastline_wrapping_enabled;
     return S_OK;
 }
 
-static BOOL WINAPI dwritetextformat1_layout_GetLastLineWrapping(IDWriteTextFormat2 *iface)
+static BOOL WINAPI dwritetextformat1_layout_GetLastLineWrapping(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.last_line_wrapping;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.last_line_wrapping;
 }
 
-static HRESULT WINAPI dwritetextformat1_layout_SetOpticalAlignment(IDWriteTextFormat2 *iface,
+static HRESULT WINAPI dwritetextformat1_layout_SetOpticalAlignment(IDWriteTextFormat3 *iface,
         DWRITE_OPTICAL_ALIGNMENT alignment)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)->(%d)\n", This, alignment);
-    return format_set_optical_alignment(&This->format, alignment);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p, %d.\n", iface, alignment);
+
+    return format_set_optical_alignment(&layout->format, alignment);
 }
 
-static DWRITE_OPTICAL_ALIGNMENT WINAPI dwritetextformat1_layout_GetOpticalAlignment(IDWriteTextFormat2 *iface)
+static DWRITE_OPTICAL_ALIGNMENT WINAPI dwritetextformat1_layout_GetOpticalAlignment(IDWriteTextFormat3 *iface)
 {
-    struct dwrite_textlayout *This = impl_layout_from_IDWriteTextFormat2(iface);
-    TRACE("(%p)\n", This);
-    return This->format.optical_alignment;
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
+
+    TRACE("%p.\n", iface);
+
+    return layout->format.optical_alignment;
 }
 
-static HRESULT WINAPI dwritetextformat1_layout_SetFontFallback(IDWriteTextFormat2 *iface,
+static HRESULT WINAPI dwritetextformat1_layout_SetFontFallback(IDWriteTextFormat3 *iface,
         IDWriteFontFallback *fallback)
 {
-    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
 
     TRACE("%p, %p.\n", iface, fallback);
 
     return IDWriteTextLayout4_SetFontFallback(&layout->IDWriteTextLayout4_iface, fallback);
 }
 
-static HRESULT WINAPI dwritetextformat1_layout_GetFontFallback(IDWriteTextFormat2 *iface,
+static HRESULT WINAPI dwritetextformat1_layout_GetFontFallback(IDWriteTextFormat3 *iface,
         IDWriteFontFallback **fallback)
 {
-    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
 
     TRACE("%p, %p.\n", iface, fallback);
 
     return IDWriteTextLayout4_GetFontFallback(&layout->IDWriteTextLayout4_iface, fallback);
 }
 
-static HRESULT WINAPI dwritetextformat2_layout_SetLineSpacing(IDWriteTextFormat2 *iface,
+static HRESULT WINAPI dwritetextformat2_layout_SetLineSpacing(IDWriteTextFormat3 *iface,
         DWRITE_LINE_SPACING const *spacing)
 {
-    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
     return IDWriteTextLayout4_SetLineSpacing(&layout->IDWriteTextLayout4_iface, spacing);
 }
 
-static HRESULT WINAPI dwritetextformat2_layout_GetLineSpacing(IDWriteTextFormat2 *iface, DWRITE_LINE_SPACING *spacing)
+static HRESULT WINAPI dwritetextformat2_layout_GetLineSpacing(IDWriteTextFormat3 *iface, DWRITE_LINE_SPACING *spacing)
 {
-    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat2(iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
     return IDWriteTextLayout4_GetLineSpacing(&layout->IDWriteTextLayout4_iface, spacing);
 }
 
-static const IDWriteTextFormat2Vtbl dwritetextformat2_layout_vtbl = {
+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);
+
+    return E_NOTIMPL;
+}
+
+static UINT32 WINAPI dwritetextformat3_layout_GetFontAxisValueCount(IDWriteTextFormat3 *iface)
+{
+    FIXME("%p.\n", iface);
+
+    return 0;
+}
+
+static HRESULT WINAPI dwritetextformat3_layout_GetFontAxisValues(IDWriteTextFormat3 *iface,
+        DWRITE_FONT_AXIS_VALUE const *axis_values, UINT32 num_values)
+{
+    FIXME("%p, %p, %u.\n", iface, axis_values, num_values);
+
+    return E_NOTIMPL;
+}
+
+static DWRITE_AUTOMATIC_FONT_AXES WINAPI dwritetextformat3_layout_GetAutomaticFontAxes(IDWriteTextFormat3 *iface)
+{
+    FIXME("%p.\n", iface);
+
+    return DWRITE_AUTOMATIC_FONT_AXES_NONE;
+}
+
+static HRESULT WINAPI dwritetextformat3_layout_SetAutomaticFontAxes(IDWriteTextFormat3 *iface,
+        DWRITE_AUTOMATIC_FONT_AXES axes)
+{
+    FIXME("%p, %d.\n", iface, axes);
+
+    return E_NOTIMPL;
+}
+
+static const IDWriteTextFormat3Vtbl dwritetextformat3_layout_vtbl =
+{
     dwritetextformat_layout_QueryInterface,
     dwritetextformat_layout_AddRef,
     dwritetextformat_layout_Release,
@@ -4680,6 +4755,11 @@ static const IDWriteTextFormat2Vtbl dwritetextformat2_layout_vtbl = {
     dwritetextformat1_layout_GetFontFallback,
     dwritetextformat2_layout_SetLineSpacing,
     dwritetextformat2_layout_GetLineSpacing,
+    dwritetextformat3_layout_SetFontAxisValues,
+    dwritetextformat3_layout_GetFontAxisValueCount,
+    dwritetextformat3_layout_GetFontAxisValues,
+    dwritetextformat3_layout_GetAutomaticFontAxes,
+    dwritetextformat3_layout_SetAutomaticFontAxes,
 };
 
 static HRESULT WINAPI dwritetextlayout_sink_QueryInterface(IDWriteTextAnalysisSink1 *iface,
@@ -5055,7 +5135,7 @@ static HRESULT init_textlayout(const struct textlayout_desc *desc, struct dwrite
     HRESULT hr;
 
     layout->IDWriteTextLayout4_iface.lpVtbl = &dwritetextlayoutvtbl;
-    layout->IDWriteTextFormat2_iface.lpVtbl = &dwritetextformat2_layout_vtbl;
+    layout->IDWriteTextFormat3_iface.lpVtbl = &dwritetextformat3_layout_vtbl;
     layout->IDWriteTextAnalysisSink1_iface.lpVtbl = &dwritetextlayoutsinkvtbl;
     layout->IDWriteTextAnalysisSource1_iface.lpVtbl = &dwritetextlayoutsourcevtbl;
     layout->refcount = 1;
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index b96c0f4b37..8532555e06 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -901,8 +901,10 @@ static IUnknown *create_test_effect(void)
 static void test_CreateTextLayout(void)
 {
     static const WCHAR strW[] = {'s','t','r','i','n','g',0};
-    IDWriteTextLayout2 *layout2;
+    IDWriteTextLayout4 *layout4;
+    IDWriteTextLayout2 *layout2 = NULL;
     IDWriteTextLayout *layout;
+    IDWriteTextFormat3 *format3;
     IDWriteTextFormat *format;
     IDWriteFactory *factory;
     HRESULT hr;
@@ -991,11 +993,21 @@ static void test_CreateTextLayout(void)
 
         IDWriteTextFormat1_Release(format1);
         IDWriteTextFormat_Release(format);
-        IDWriteTextLayout2_Release(layout2);
     }
     else
         win_skip("IDWriteTextLayout2 is not supported.\n");
 
+    if (layout2 && SUCCEEDED(IDWriteTextLayout2_QueryInterface(layout2, &IID_IDWriteTextLayout4, (void **)&layout4)))
+    {
+        hr = IDWriteTextLayout4_QueryInterface(layout4, &IID_IDWriteTextFormat3, (void **)&format3);
+        ok(hr == S_OK, "Failed to get text format, hr %#x.\n", hr);
+        IDWriteTextFormat3_Release(format3);
+    }
+    else
+        win_skip("IDWriteTextLayout4 is not supported.\n");
+
+    if (layout2)
+        IDWriteTextLayout2_Release(layout2);
     IDWriteTextLayout_Release(layout);
     IDWriteTextFormat_Release(format);
     IDWriteFactory_Release(factory);
-- 
2.24.0




More information about the wine-devel mailing list