Nikolay Sivov : dwrite/layout: Implement desired orientation get/set methods.

Alexandre Julliard julliard at winehq.org
Thu Feb 4 16:15:19 CST 2021


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Feb  4 13:19:47 2021 +0300

dwrite/layout: Implement desired orientation get/set methods.

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

---

 dlls/dwrite/layout.c       | 52 +++++++++++++++++++++++++++++++++-------------
 dlls/dwrite/tests/layout.c | 24 +++++++++++++++++++++
 2 files changed, 62 insertions(+), 14 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index b68daf0345b..a24752c9bff 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -492,6 +492,19 @@ static HRESULT format_set_optical_alignment(struct dwrite_textformat_data *forma
     return S_OK;
 }
 
+static HRESULT format_set_vertical_orientation(struct dwrite_textformat_data *format,
+        DWRITE_VERTICAL_GLYPH_ORIENTATION orientation, BOOL *changed)
+{
+    if ((UINT32)orientation > DWRITE_VERTICAL_GLYPH_ORIENTATION_STACKED)
+        return E_INVALIDARG;
+
+    if (changed)
+        *changed = format->vertical_orientation != orientation;
+
+    format->vertical_orientation = orientation;
+    return S_OK;
+}
+
 static BOOL is_run_rtl(const struct layout_effective_run *run)
 {
     return run->run->u.regular.run.bidiLevel & 1;
@@ -3957,6 +3970,21 @@ static HRESULT WINAPI dwritetextlayout2_GetMetrics(IDWriteTextLayout4 *iface, DW
     return hr;
 }
 
+static HRESULT layout_set_vertical_orientation(struct dwrite_textlayout *layout,
+        DWRITE_VERTICAL_GLYPH_ORIENTATION orientation)
+{
+    BOOL changed;
+    HRESULT hr;
+
+    if (FAILED(hr = format_set_vertical_orientation(&layout->format, orientation, &changed)))
+        return hr;
+
+    if (changed)
+        layout->recompute = RECOMPUTE_EVERYTHING;
+
+    return S_OK;
+}
+
 static HRESULT WINAPI dwritetextlayout2_SetVerticalGlyphOrientation(IDWriteTextLayout4 *iface,
         DWRITE_VERTICAL_GLYPH_ORIENTATION orientation)
 {
@@ -3964,11 +3992,7 @@ static HRESULT WINAPI dwritetextlayout2_SetVerticalGlyphOrientation(IDWriteTextL
 
     TRACE("%p, %d.\n", iface, orientation);
 
-    if ((UINT32)orientation > DWRITE_VERTICAL_GLYPH_ORIENTATION_STACKED)
-        return E_INVALIDARG;
-
-    layout->format.vertical_orientation = orientation;
-    return S_OK;
+    return layout_set_vertical_orientation(layout, orientation);
 }
 
 static DWRITE_VERTICAL_GLYPH_ORIENTATION WINAPI dwritetextlayout2_GetVerticalGlyphOrientation(IDWriteTextLayout4 *iface)
@@ -4591,16 +4615,20 @@ static HRESULT WINAPI dwritetextformat_layout_GetLocaleName(IDWriteTextFormat3 *
 static HRESULT WINAPI dwritetextformat1_layout_SetVerticalGlyphOrientation(IDWriteTextFormat3 *iface,
         DWRITE_VERTICAL_GLYPH_ORIENTATION orientation)
 {
-    FIXME("%p, %d: stub\n", iface, orientation);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
 
-    return E_NOTIMPL;
+    TRACE("%p, %d.\n", iface, orientation);
+
+    return layout_set_vertical_orientation(layout, orientation);
 }
 
 static DWRITE_VERTICAL_GLYPH_ORIENTATION WINAPI dwritetextformat1_layout_GetVerticalGlyphOrientation(IDWriteTextFormat3 *iface)
 {
-    FIXME("%p: stub\n", iface);
+    struct dwrite_textlayout *layout = impl_layout_from_IDWriteTextFormat3(iface);
 
-    return DWRITE_VERTICAL_GLYPH_ORIENTATION_DEFAULT;
+    TRACE("%p.\n", iface);
+
+    return layout->format.vertical_orientation;
 }
 
 static HRESULT WINAPI dwritetextformat1_layout_SetLastLineWrapping(IDWriteTextFormat3 *iface,
@@ -5709,11 +5737,7 @@ static HRESULT WINAPI dwritetextformat1_SetVerticalGlyphOrientation(IDWriteTextF
 
     TRACE("%p, %d.\n", iface, orientation);
 
-    if ((UINT32)orientation > DWRITE_VERTICAL_GLYPH_ORIENTATION_STACKED)
-        return E_INVALIDARG;
-
-    format->format.vertical_orientation = orientation;
-    return S_OK;
+    return format_set_vertical_orientation(&format->format, orientation, NULL);
 }
 
 static DWRITE_VERTICAL_GLYPH_ORIENTATION WINAPI dwritetextformat1_GetVerticalGlyphOrientation(IDWriteTextFormat3 *iface)
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index eb47997f22f..6f06e842493 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -2708,6 +2708,7 @@ static void test_SetVerticalGlyphOrientation(void)
 {
     DWRITE_VERTICAL_GLYPH_ORIENTATION orientation;
     IDWriteTextLayout2 *layout2;
+    IDWriteTextFormat1 *format1;
     IDWriteTextFormat *format;
     IDWriteTextLayout *layout;
     IDWriteFactory *factory;
@@ -2738,6 +2739,29 @@ static void test_SetVerticalGlyphOrientation(void)
     hr = IDWriteTextLayout2_SetVerticalGlyphOrientation(layout2, DWRITE_VERTICAL_GLYPH_ORIENTATION_STACKED+1);
     ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
 
+    hr = IDWriteTextLayout2_QueryInterface(layout2, &IID_IDWriteTextFormat1, (void **)&format1);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    orientation = IDWriteTextFormat1_GetVerticalGlyphOrientation(format1);
+    ok(orientation == DWRITE_VERTICAL_GLYPH_ORIENTATION_DEFAULT, "Unexpected orientation %d.\n", orientation);
+
+    hr = IDWriteTextLayout2_SetVerticalGlyphOrientation(layout2, DWRITE_VERTICAL_GLYPH_ORIENTATION_STACKED);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    orientation = IDWriteTextLayout2_GetVerticalGlyphOrientation(layout2);
+    ok(orientation == DWRITE_VERTICAL_GLYPH_ORIENTATION_STACKED, "Unexpected orientation %d.\n", orientation);
+
+    orientation = IDWriteTextFormat1_GetVerticalGlyphOrientation(format1);
+    ok(orientation == DWRITE_VERTICAL_GLYPH_ORIENTATION_STACKED, "Unexpected orientation %d.\n", orientation);
+
+    hr = IDWriteTextFormat1_SetVerticalGlyphOrientation(format1, DWRITE_VERTICAL_GLYPH_ORIENTATION_DEFAULT);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    orientation = IDWriteTextLayout2_GetVerticalGlyphOrientation(layout2);
+    ok(orientation == DWRITE_VERTICAL_GLYPH_ORIENTATION_DEFAULT, "Unexpected orientation %d.\n", orientation);
+
+    IDWriteTextFormat1_Release(format1);
+
     IDWriteTextLayout2_Release(layout2);
     IDWriteFactory_Release(factory);
 }




More information about the wine-cvs mailing list