Nikolay Sivov : dwrite: Support a few more range attributes.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Aug 25 15:58:17 CDT 2014


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sun Aug 24 19:24:18 2014 +0400

dwrite: Support a few more range attributes.

---

 dlls/dwrite/layout.c | 91 ++++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 78 insertions(+), 13 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 18bafed..ad9d2e4 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -61,10 +61,12 @@ struct dwrite_textformat_data {
 enum layout_range_attr_kind {
     LAYOUT_RANGE_ATTR_WEIGHT,
     LAYOUT_RANGE_ATTR_STYLE,
+    LAYOUT_RANGE_ATTR_STRETCH,
     LAYOUT_RANGE_ATTR_EFFECT,
     LAYOUT_RANGE_ATTR_INLINE,
     LAYOUT_RANGE_ATTR_UNDERLINE,
-    LAYOUT_RANGE_ATTR_STRIKETHROUGH
+    LAYOUT_RANGE_ATTR_STRIKETHROUGH,
+    LAYOUT_RANGE_ATTR_FONTCOLL
 };
 
 struct layout_range_attr_value {
@@ -72,10 +74,12 @@ struct layout_range_attr_value {
     union {
         DWRITE_FONT_WEIGHT weight;
         DWRITE_FONT_STYLE style;
+        DWRITE_FONT_STRETCH stretch;
         IDWriteInlineObject *object;
         IUnknown *effect;
         BOOL underline;
         BOOL strikethrough;
+        IDWriteFontCollection *collection;
     } u;
 };
 
@@ -84,10 +88,12 @@ struct layout_range {
     DWRITE_TEXT_RANGE range;
     DWRITE_FONT_WEIGHT weight;
     DWRITE_FONT_STYLE style;
+    DWRITE_FONT_STRETCH stretch;
     IDWriteInlineObject *object;
     IUnknown *effect;
     BOOL underline;
     BOOL strikethrough;
+    IDWriteFontCollection *collection;
 };
 
 struct dwrite_textlayout {
@@ -162,6 +168,8 @@ static BOOL is_same_layout_attrvalue(struct layout_range const *range, enum layo
         return range->weight == value->u.weight;
     case LAYOUT_RANGE_ATTR_STYLE:
         return range->style == value->u.style;
+    case LAYOUT_RANGE_ATTR_STRETCH:
+        return range->stretch == value->u.stretch;
     case LAYOUT_RANGE_ATTR_INLINE:
         return range->object == value->u.object;
     case LAYOUT_RANGE_ATTR_EFFECT:
@@ -170,6 +178,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_FONTCOLL:
+        return range->collection == value->u.collection;
     default:
         ;
     }
@@ -181,10 +191,12 @@ static inline BOOL is_same_layout_attributes(struct layout_range const *left, st
 {
     return left->weight == right->weight &&
            left->style  == right->style &&
+           left->stretch == right->stretch &&
            left->object == right->object &&
            left->effect == right->effect &&
            left->underline == right->underline &&
-           left->strikethrough == right->strikethrough;
+           left->strikethrough == right->strikethrough &&
+           left->collection == right->collection;
 }
 
 static inline BOOL is_same_text_range(const DWRITE_TEXT_RANGE *left, const DWRITE_TEXT_RANGE *right)
@@ -203,10 +215,14 @@ static struct layout_range *alloc_layout_range(struct dwrite_textlayout *layout,
     range->range = *r;
     range->weight = layout->format.weight;
     range->style  = layout->format.style;
+    range->stretch = layout->format.stretch;
     range->object = NULL;
     range->effect = NULL;
     range->underline = FALSE;
     range->strikethrough = FALSE;
+    range->collection = layout->format.collection;
+    if (range->collection)
+        IDWriteFontCollection_Release(range->collection);
 
     return range;
 }
@@ -226,6 +242,8 @@ static struct layout_range *alloc_layout_range_from(struct layout_range *from, c
         IDWriteInlineObject_AddRef(range->object);
     if (range->effect)
         IUnknown_AddRef(range->effect);
+    if (range->collection)
+        IDWriteFontCollection_AddRef(range->collection);
 
     return range;
 }
@@ -236,6 +254,8 @@ static void free_layout_range(struct layout_range *range)
         IDWriteInlineObject_Release(range->object);
     if (range->effect)
         IUnknown_Release(range->effect);
+    if (range->collection)
+        IDWriteFontCollection_Release(range->collection);
     heap_free(range);
 }
 
@@ -293,6 +313,10 @@ static BOOL set_layout_range_attrval(struct layout_range *dest, enum layout_rang
         changed = dest->style != value->u.style;
         dest->style = value->u.style;
         break;
+    case LAYOUT_RANGE_ATTR_STRETCH:
+        changed = dest->stretch != value->u.stretch;
+        dest->stretch = value->u.stretch;
+        break;
     case LAYOUT_RANGE_ATTR_INLINE:
         changed = dest->object != value->u.object;
         if (changed && dest->object)
@@ -317,6 +341,14 @@ 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_FONTCOLL:
+        changed = dest->collection != value->u.collection;
+        if (changed && dest->collection)
+            IDWriteFontCollection_Release(dest->collection);
+        dest->collection = value->u.collection;
+        if (dest->collection)
+            IDWriteFontCollection_AddRef(dest->collection);
+        break;
     default:
         ;
     }
@@ -727,8 +759,16 @@ static HRESULT WINAPI dwritetextlayout_SetMaxHeight(IDWriteTextLayout *iface, FL
 static HRESULT WINAPI dwritetextlayout_SetFontCollection(IDWriteTextLayout *iface, IDWriteFontCollection* collection, DWRITE_TEXT_RANGE range)
 {
     struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface);
-    FIXME("(%p)->(%p %s): stub\n", This, collection, debugstr_range(&range));
-    return E_NOTIMPL;
+    struct layout_range_attr_value value;
+
+    TRACE("(%p)->(%p %s)\n", This, collection, debugstr_range(&range));
+
+    if (!validate_text_range(This, &range))
+        return S_OK;
+
+    value.range = range;
+    value.u.collection = collection;
+    return set_layout_range_attr(This, LAYOUT_RANGE_ATTR_FONTCOLL, &value);
 }
 
 static HRESULT WINAPI dwritetextlayout_SetFontFamilyName(IDWriteTextLayout *iface, WCHAR const *name, DWRITE_TEXT_RANGE range)
@@ -771,8 +811,16 @@ static HRESULT WINAPI dwritetextlayout_SetFontStyle(IDWriteTextLayout *iface, DW
 static HRESULT WINAPI dwritetextlayout_SetFontStretch(IDWriteTextLayout *iface, DWRITE_FONT_STRETCH stretch, DWRITE_TEXT_RANGE range)
 {
     struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface);
-    FIXME("(%p)->(%d %s): stub\n", This, stretch, debugstr_range(&range));
-    return E_NOTIMPL;
+    struct layout_range_attr_value value;
+
+    TRACE("(%p)->(%d %s)\n", This, stretch, debugstr_range(&range));
+
+    if (!validate_text_range(This, &range))
+        return S_OK;
+
+    value.range = range;
+    value.u.stretch = stretch;
+    return set_layout_range_attr(This, LAYOUT_RANGE_ATTR_STRETCH, &value);
 }
 
 static HRESULT WINAPI dwritetextlayout_SetFontSize(IDWriteTextLayout *iface, FLOAT size, DWRITE_TEXT_RANGE range)
@@ -871,12 +919,20 @@ static FLOAT WINAPI dwritetextlayout_GetMaxHeight(IDWriteTextLayout *iface)
     return This->maxheight;
 }
 
-static HRESULT WINAPI dwritetextlayout_layout_GetFontCollection(IDWriteTextLayout *iface, UINT32 pos,
-    IDWriteFontCollection** collection, DWRITE_TEXT_RANGE *range)
+static HRESULT WINAPI dwritetextlayout_layout_GetFontCollection(IDWriteTextLayout *iface, UINT32 position,
+    IDWriteFontCollection** collection, DWRITE_TEXT_RANGE *r)
 {
     struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface);
-    FIXME("(%p)->(%p %p): stub\n", This, collection, range);
-    return E_NOTIMPL;
+    struct layout_range *range;
+
+    TRACE("(%p)->(%u %p %p)\n", This, position, collection, r);
+
+    range = get_layout_range_by_pos(This, position);
+    *collection = range ? range->collection : NULL;
+    if (*collection)
+        IDWriteFontCollection_AddRef(*collection);
+
+    return return_range(range, r);
 }
 
 static HRESULT WINAPI dwritetextlayout_layout_GetFontFamilyNameLength(IDWriteTextLayout *iface,
@@ -930,11 +986,20 @@ static HRESULT WINAPI dwritetextlayout_layout_GetFontStyle(IDWriteTextLayout *if
 }
 
 static HRESULT WINAPI dwritetextlayout_layout_GetFontStretch(IDWriteTextLayout *iface,
-    UINT32 position, DWRITE_FONT_STRETCH *stretch, DWRITE_TEXT_RANGE *range)
+    UINT32 position, DWRITE_FONT_STRETCH *stretch, DWRITE_TEXT_RANGE *r)
 {
     struct dwrite_textlayout *This = impl_from_IDWriteTextLayout(iface);
-    FIXME("(%p)->(%u %p %p): stub\n", This, position, stretch, range);
-    return E_NOTIMPL;
+    struct layout_range *range;
+
+    TRACE("(%p)->(%u %p %p)\n", This, position, stretch, r);
+
+    if (position >= This->len)
+        return S_OK;
+
+    range = get_layout_range_by_pos(This, position);
+    *stretch = range->stretch;
+
+    return return_range(range, r);
 }
 
 static HRESULT WINAPI dwritetextlayout_layout_GetFontSize(IDWriteTextLayout *iface,




More information about the wine-cvs mailing list