Nikolay Sivov : dwrite: Store pair kerning range attribute.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Mar 13 08:44:25 CDT 2015


Module: wine
Branch: master
Commit: 672aae654ee687affb11d5a43fe4e1fc549894ca
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=672aae654ee687affb11d5a43fe4e1fc549894ca

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Mar 13 11:25:18 2015 +0300

dwrite: Store pair kerning range attribute.

---

 dlls/dwrite/layout.c       | 35 ++++++++++++++++++++++++-----
 dlls/dwrite/tests/layout.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 85 insertions(+), 5 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 2665664..d26751e 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -67,6 +67,7 @@ enum layout_range_attr_kind {
     LAYOUT_RANGE_ATTR_INLINE,
     LAYOUT_RANGE_ATTR_UNDERLINE,
     LAYOUT_RANGE_ATTR_STRIKETHROUGH,
+    LAYOUT_RANGE_ATTR_PAIR_KERNING,
     LAYOUT_RANGE_ATTR_FONTCOLL,
     LAYOUT_RANGE_ATTR_LOCALE,
     LAYOUT_RANGE_ATTR_FONTFAMILY
@@ -83,6 +84,7 @@ struct layout_range_attr_value {
         IUnknown *effect;
         BOOL underline;
         BOOL strikethrough;
+        BOOL pair_kerning;
         IDWriteFontCollection *collection;
         const WCHAR *locale;
         const WCHAR *fontfamily;
@@ -100,6 +102,7 @@ struct layout_range {
     IUnknown *effect;
     BOOL underline;
     BOOL strikethrough;
+    BOOL pair_kerning;
     IDWriteFontCollection *collection;
     WCHAR locale[LOCALE_NAME_MAX_LENGTH];
     WCHAR *fontfamily;
@@ -628,6 +631,8 @@ static BOOL is_same_layout_attrvalue(struct layout_range const *range, enum layo
         return range->underline == value->u.underline;
     case LAYOUT_RANGE_ATTR_STRIKETHROUGH:
         return range->strikethrough == value->u.strikethrough;
+    case LAYOUT_RANGE_ATTR_PAIR_KERNING:
+        return range->pair_kerning == value->u.pair_kerning;
     case LAYOUT_RANGE_ATTR_FONTCOLL:
         return range->collection == value->u.collection;
     case LAYOUT_RANGE_ATTR_LOCALE:
@@ -651,6 +656,7 @@ static inline BOOL is_same_layout_attributes(struct layout_range const *left, st
            left->effect == right->effect &&
            left->underline == right->underline &&
            left->strikethrough == right->strikethrough &&
+           left->pair_kerning == right->pair_kerning &&
            left->collection == right->collection &&
           !strcmpW(left->locale, right->locale) &&
           !strcmpW(left->fontfamily, right->fontfamily);
@@ -678,6 +684,7 @@ static struct layout_range *alloc_layout_range(struct dwrite_textlayout *layout,
     range->effect = NULL;
     range->underline = FALSE;
     range->strikethrough = FALSE;
+    range->pair_kerning = FALSE;
 
     range->fontfamily = heap_strdupW(layout->format.family_name);
     if (!range->fontfamily) {
@@ -823,6 +830,10 @@ static BOOL set_layout_range_attrval(struct layout_range *dest, enum layout_rang
         changed = dest->strikethrough != value->u.strikethrough;
         dest->strikethrough = value->u.strikethrough;
         break;
+    case LAYOUT_RANGE_ATTR_PAIR_KERNING:
+        changed = dest->pair_kerning != value->u.pair_kerning;
+        dest->pair_kerning = value->u.pair_kerning;
+        break;
     case LAYOUT_RANGE_ATTR_FONTCOLL:
         changed = set_layout_range_iface_attr((IUnknown**)&dest->collection, (IUnknown*)value->u.collection);
         break;
@@ -1758,16 +1769,30 @@ static HRESULT WINAPI dwritetextlayout1_SetPairKerning(IDWriteTextLayout2 *iface
         DWRITE_TEXT_RANGE range)
 {
     struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface);
-    FIXME("(%p)->(%d %s): stub\n", This, is_pairkerning_enabled, debugstr_range(&range));
-    return E_NOTIMPL;
+    struct layout_range_attr_value value;
+
+    TRACE("(%p)->(%d %s)\n", This, is_pairkerning_enabled, debugstr_range(&range));
+
+    value.range = range;
+    value.u.pair_kerning = !!is_pairkerning_enabled;
+    return set_layout_range_attr(This, LAYOUT_RANGE_ATTR_PAIR_KERNING, &value);
 }
 
 static HRESULT WINAPI dwritetextlayout1_GetPairKerning(IDWriteTextLayout2 *iface, UINT32 position, BOOL *is_pairkerning_enabled,
-        DWRITE_TEXT_RANGE *range)
+        DWRITE_TEXT_RANGE *r)
 {
     struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface);
-    FIXME("(%p)->(%p %p): stub\n", This, is_pairkerning_enabled, range);
-    return E_NOTIMPL;
+    struct layout_range *range;
+
+    TRACE("(%p)->(%u %p %p)\n", This, position, is_pairkerning_enabled, r);
+
+    if (position >= This->len)
+        return S_OK;
+
+    range = get_layout_range_by_pos(This, position);
+    *is_pairkerning_enabled = range->pair_kerning;
+
+    return return_range(range, r);
 }
 
 static HRESULT WINAPI dwritetextlayout1_SetCharacterSpacing(IDWriteTextLayout2 *iface, FLOAT leading_spacing, FLOAT trailing_spacing,
diff --git a/dlls/dwrite/tests/layout.c b/dlls/dwrite/tests/layout.c
index 89c96e4..c796c12 100644
--- a/dlls/dwrite/tests/layout.c
+++ b/dlls/dwrite/tests/layout.c
@@ -1035,6 +1035,60 @@ if (0) /* crashes on native */
     IDWriteTextFormat_Release(format);
 }
 
+static void test_SetPairKerning(void)
+{
+    static const WCHAR strW[] = {'a','b','c','d',0};
+    IDWriteTextLayout1 *layout1;
+    IDWriteTextFormat *format;
+    IDWriteTextLayout *layout;
+    DWRITE_TEXT_RANGE range;
+    BOOL kerning;
+    HRESULT hr;
+
+    hr = IDWriteFactory_CreateTextFormat(factory, tahomaW, NULL, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL,
+        DWRITE_FONT_STRETCH_NORMAL, 10.0, enusW, &format);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    hr = IDWriteFactory_CreateTextLayout(factory, strW, 4, format, 1000.0, 1000.0, &layout);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    IDWriteTextFormat_Release(format);
+
+    hr = IDWriteTextLayout_QueryInterface(layout, &IID_IDWriteTextLayout1, (void**)&layout1);
+    IDWriteTextLayout_Release(layout);
+
+    if (hr != S_OK) {
+        win_skip("SetPairKerning() is not supported.\n");
+        return;
+    }
+
+if (0) { /* crashes on native */
+    hr = IDWriteTextLayout1_GetPairKerning(layout1, 0, NULL, NULL);
+    hr = IDWriteTextLayout1_GetPairKerning(layout1, 0, NULL, &range);
+}
+
+    hr = IDWriteTextLayout1_GetPairKerning(layout1, 0, &kerning, NULL);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    range.startPosition = 0;
+    range.length = 0;
+    kerning = TRUE;
+    hr = IDWriteTextLayout1_GetPairKerning(layout1, 0, &kerning, &range);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(!kerning, "got %d\n", kerning);
+
+    range.startPosition = 0;
+    range.length = 1;
+    hr = IDWriteTextLayout1_SetPairKerning(layout1, 2, range);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+
+    kerning = FALSE;
+    hr = IDWriteTextLayout1_GetPairKerning(layout1, 0, &kerning, &range);
+    ok(hr == S_OK, "got 0x%08x\n", hr);
+    ok(kerning == TRUE, "got %d\n", kerning);
+
+    IDWriteTextLayout1_Release(layout1);
+}
+
 START_TEST(layout)
 {
     HRESULT hr;
@@ -1061,6 +1115,7 @@ START_TEST(layout)
     test_typography();
     test_GetClusterMetrics();
     test_SetLocaleName();
+    test_SetPairKerning();
 
     IDWriteFactory_Release(factory);
 }




More information about the wine-cvs mailing list