Nikolay Sivov : riched20: Implement GetSize().

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 20 10:04:12 CDT 2015


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed May 20 10:26:21 2015 +0300

riched20: Implement GetSize().

---

 dlls/riched20/richole.c       | 98 ++++++++++++++++++++++++++++++++++++-------
 dlls/riched20/tests/richole.c | 17 +++++++-
 2 files changed, 98 insertions(+), 17 deletions(-)

diff --git a/dlls/riched20/richole.c b/dlls/riched20/richole.c
index aa2a6e3..95a92fe 100644
--- a/dlls/riched20/richole.c
+++ b/dlls/riched20/richole.c
@@ -208,7 +208,47 @@ static const DWORD textfont_prop_masks[] = {
     CFM_WEIGHT
 };
 
-static HRESULT get_textfont_prop_for_pos(const IRichEditOleImpl *reole, int pos, enum textfont_prop_id propid, LONG *value)
+typedef union {
+    FLOAT f;
+    LONG l;
+} textfont_prop_val;
+
+static inline BOOL is_equal_textfont_prop_value(enum textfont_prop_id propid, textfont_prop_val *left,
+    textfont_prop_val *right)
+{
+    switch (propid)
+    {
+    case FONT_BOLD:
+    case FONT_ITALIC:
+        return left->l == right->l;
+    case FONT_SIZE:
+       return left->f == right->f;
+    default:
+        FIXME("unhandled font property %d\n", propid);
+        return FALSE;
+    }
+}
+
+static inline void init_textfont_prop_value(enum textfont_prop_id propid, textfont_prop_val *v)
+{
+    switch (propid)
+    {
+    case FONT_BOLD:
+    case FONT_ITALIC:
+        v->l = tomUndefined;
+        return;
+    case FONT_SIZE:
+        v->f = tomUndefined;
+        return;
+    default:
+        FIXME("unhandled font property %d\n", propid);
+        v->l = tomUndefined;
+        return;
+    }
+}
+
+static HRESULT get_textfont_prop_for_pos(const IRichEditOleImpl *reole, int pos, enum textfont_prop_id propid,
+    textfont_prop_val *value)
 {
     ME_Cursor from, to;
     CHARFORMAT2W fmt;
@@ -225,10 +265,13 @@ static HRESULT get_textfont_prop_for_pos(const IRichEditOleImpl *reole, int pos,
     switch (propid)
     {
     case FONT_BOLD:
-        *value = fmt.dwEffects & CFE_BOLD ? tomTrue : tomFalse;
+        value->l = fmt.dwEffects & CFE_BOLD ? tomTrue : tomFalse;
         break;
     case FONT_ITALIC:
-        *value = fmt.dwEffects & CFE_ITALIC ? tomTrue : tomFalse;
+        value->l = fmt.dwEffects & CFE_ITALIC ? tomTrue : tomFalse;
+        break;
+    case FONT_SIZE:
+        value->f = fmt.yHeight;
         break;
     default:
         FIXME("unhandled font property %d\n", propid);
@@ -238,34 +281,31 @@ static HRESULT get_textfont_prop_for_pos(const IRichEditOleImpl *reole, int pos,
     return S_OK;
 }
 
-static HRESULT get_textfont_prop(ITextRange *range, enum textfont_prop_id propid, LONG *value)
+static HRESULT get_textfont_prop(ITextRange *range, enum textfont_prop_id propid, textfont_prop_val *value)
 {
     ITextRangeImpl *rng = impl_from_ITextRange(range);
+    textfont_prop_val v;
     HRESULT hr;
-    LONG v;
     int i;
 
-    if (!value)
-        return E_INVALIDARG;
-
-    *value = tomUndefined;
-
     if (!rng->reOle)
         return CO_E_RELEASED;
 
+    init_textfont_prop_value(propid, value);
+
     /* iterate trough a range to see if property value is consistent */
     hr = get_textfont_prop_for_pos(rng->reOle, rng->start, propid, &v);
     if (FAILED(hr))
         return hr;
 
     for (i = rng->start + 1; i < rng->end; i++) {
-        LONG cur;
+        textfont_prop_val cur;
 
         hr = get_textfont_prop_for_pos(rng->reOle, i, propid, &cur);
         if (FAILED(hr))
             return hr;
 
-        if (cur != v)
+        if (!is_equal_textfont_prop_value(propid, &v, &cur))
             return S_OK;
     }
 
@@ -273,6 +313,32 @@ static HRESULT get_textfont_prop(ITextRange *range, enum textfont_prop_id propid
     return S_OK;
 }
 
+static HRESULT get_textfont_propf(ITextRange *range, enum textfont_prop_id propid, FLOAT *value)
+{
+    textfont_prop_val v;
+    HRESULT hr;
+
+    if (!value)
+        return E_INVALIDARG;
+
+    hr = get_textfont_prop(range, propid, &v);
+    *value = v.f;
+    return hr;
+}
+
+static HRESULT get_textfont_propl(ITextRange *range, enum textfont_prop_id propid, LONG *value)
+{
+    textfont_prop_val v;
+    HRESULT hr;
+
+    if (!value)
+        return E_INVALIDARG;
+
+    hr = get_textfont_prop(range, propid, &v);
+    *value = v.l;
+    return hr;
+}
+
 static HRESULT WINAPI IRichEditOleImpl_inner_fnQueryInterface(IUnknown *iface, REFIID riid, LPVOID *ppvObj)
 {
     IRichEditOleImpl *This = impl_from_IUnknown(iface);
@@ -1770,7 +1836,7 @@ static HRESULT WINAPI TextFont_GetBold(ITextFont *iface, LONG *value)
 {
     ITextFontImpl *This = impl_from_ITextFont(iface);
     TRACE("(%p)->(%p)\n", This, value);
-    return get_textfont_prop(This->range, FONT_BOLD, value);
+    return get_textfont_propl(This->range, FONT_BOLD, value);
 }
 
 static HRESULT WINAPI TextFont_SetBold(ITextFont *iface, LONG value)
@@ -1840,7 +1906,7 @@ static HRESULT WINAPI TextFont_GetItalic(ITextFont *iface, LONG *value)
 {
     ITextFontImpl *This = impl_from_ITextFont(iface);
     TRACE("(%p)->(%p)\n", This, value);
-    return get_textfont_prop(This->range, FONT_ITALIC, value);
+    return get_textfont_propl(This->range, FONT_ITALIC, value);
 }
 
 static HRESULT WINAPI TextFont_SetItalic(ITextFont *iface, LONG value)
@@ -1951,8 +2017,8 @@ static HRESULT WINAPI TextFont_SetShadow(ITextFont *iface, LONG value)
 static HRESULT WINAPI TextFont_GetSize(ITextFont *iface, FLOAT *value)
 {
     ITextFontImpl *This = impl_from_ITextFont(iface);
-    FIXME("(%p)->(%p): stub\n", This, value);
-    return E_NOTIMPL;
+    TRACE("(%p)->(%p)\n", This, value);
+    return get_textfont_propf(This->range, FONT_SIZE, value);
 }
 
 static HRESULT WINAPI TextFont_SetSize(ITextFont *iface, FLOAT value)
diff --git a/dlls/riched20/tests/richole.c b/dlls/riched20/tests/richole.c
index 6e80fd9..a85f485 100644
--- a/dlls/riched20/tests/richole.c
+++ b/dlls/riched20/tests/richole.c
@@ -1219,6 +1219,7 @@ static void test_GetFont(void)
   ITextFont *font, *font2;
   CHARFORMAT2A cf;
   LONG value;
+  float size;
   HRESULT hr;
   HWND hwnd;
   BOOL ret;
@@ -1263,6 +1264,14 @@ static void test_GetFont(void)
   hr = ITextFont_GetItalic(font, NULL);
   ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
 
+  hr = ITextFont_GetSize(font, NULL);
+  ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
+
+  size = 0.0;
+  hr = ITextFont_GetSize(font, &size);
+  ok(hr == S_OK, "got 0x%08x\n", hr);
+  ok(size > 0.0, "size %.2f\n", size);
+
   /* range is non-italic */
   value = tomTrue;
   hr = ITextFont_GetItalic(font, &value);
@@ -1270,8 +1279,9 @@ static void test_GetFont(void)
   ok(value == tomFalse, "got %d\n", value);
 
   cf.cbSize = sizeof(CHARFORMAT2A);
-  cf.dwMask = CFM_ITALIC;
+  cf.dwMask = CFM_ITALIC|CFM_SIZE;
   cf.dwEffects = CFE_ITALIC;
+  cf.yHeight = 24.0;
 
   SendMessageA(hwnd, EM_SETSEL, 2, 3);
   ret = SendMessageA(hwnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf);
@@ -1283,6 +1293,11 @@ static void test_GetFont(void)
   ok(hr == S_OK, "got 0x%08x\n", hr);
   ok(value == tomUndefined, "got %d\n", value);
 
+  size = 0.0;
+  hr = ITextFont_GetSize(font, &size);
+  ok(hr == S_OK, "got 0x%08x\n", hr);
+  ok(size == tomUndefined, "size %.2f\n", size);
+
   ITextFont_Release(font);
   ITextRange_Release(range);
   release_interfaces(&hwnd, &reOle, &doc, NULL);




More information about the wine-cvs mailing list