Nikolay Sivov : dwrite: Support family name attribute for ranges.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Jan 6 15:05:17 CST 2015
Module: wine
Branch: master
Commit: 9661f129e012a273c2f42f8071ef8457e1b03ce9
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9661f129e012a273c2f42f8071ef8457e1b03ce9
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Jan 2 22:22:40 2015 +0300
dwrite: Support family name attribute for ranges.
---
dlls/dwrite/layout.c | 139 +++++++++++++++++++++++++++++++++++++--------------
1 file changed, 102 insertions(+), 37 deletions(-)
diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index e8b7a10..0fbaf4a 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -68,7 +68,8 @@ enum layout_range_attr_kind {
LAYOUT_RANGE_ATTR_UNDERLINE,
LAYOUT_RANGE_ATTR_STRIKETHROUGH,
LAYOUT_RANGE_ATTR_FONTCOLL,
- LAYOUT_RANGE_ATTR_LOCALE
+ LAYOUT_RANGE_ATTR_LOCALE,
+ LAYOUT_RANGE_ATTR_FONTFAMILY
};
struct layout_range_attr_value {
@@ -84,6 +85,7 @@ struct layout_range_attr_value {
BOOL strikethrough;
IDWriteFontCollection *collection;
const WCHAR *locale;
+ const WCHAR *fontfamily;
} u;
};
@@ -100,6 +102,7 @@ struct layout_range {
BOOL strikethrough;
IDWriteFontCollection *collection;
WCHAR locale[LOCALE_NAME_MAX_LENGTH];
+ WCHAR *fontfamily;
};
struct layout_run {
@@ -407,6 +410,8 @@ static BOOL is_same_layout_attrvalue(struct layout_range const *range, enum layo
return range->collection == value->u.collection;
case LAYOUT_RANGE_ATTR_LOCALE:
return strcmpW(range->locale, value->u.locale) == 0;
+ case LAYOUT_RANGE_ATTR_FONTFAMILY:
+ return strcmpW(range->fontfamily, value->u.fontfamily) == 0;
default:
;
}
@@ -425,7 +430,8 @@ static inline BOOL is_same_layout_attributes(struct layout_range const *left, st
left->underline == right->underline &&
left->strikethrough == right->strikethrough &&
left->collection == right->collection &&
- !strcmpW(left->locale, right->locale);
+ !strcmpW(left->locale, right->locale) &&
+ !strcmpW(left->fontfamily, right->fontfamily);
}
static inline BOOL is_same_text_range(const DWRITE_TEXT_RANGE *left, const DWRITE_TEXT_RANGE *right)
@@ -450,6 +456,13 @@ static struct layout_range *alloc_layout_range(struct dwrite_textlayout *layout,
range->effect = NULL;
range->underline = FALSE;
range->strikethrough = FALSE;
+
+ range->fontfamily = heap_strdupW(layout->format.family_name);
+ if (!range->fontfamily) {
+ heap_free(range);
+ return NULL;
+ }
+
range->collection = layout->format.collection;
if (range->collection)
IDWriteFontCollection_AddRef(range->collection);
@@ -489,6 +502,7 @@ static void free_layout_range(struct layout_range *range)
IUnknown_Release(range->effect);
if (range->collection)
IDWriteFontCollection_Release(range->collection);
+ heap_free(range->fontfamily);
heap_free(range);
}
@@ -591,6 +605,13 @@ static BOOL set_layout_range_attrval(struct layout_range *dest, enum layout_rang
if (changed)
strcpyW(dest->locale, value->u.locale);
break;
+ case LAYOUT_RANGE_ATTR_FONTFAMILY:
+ changed = strcmpW(dest->fontfamily, value->u.fontfamily) != 0;
+ if (changed) {
+ heap_free(dest->fontfamily);
+ dest->fontfamily = heap_strdupW(value->u.fontfamily);
+ }
+ break;
default:
;
}
@@ -735,6 +756,63 @@ done:
return S_OK;
}
+static inline const WCHAR *get_string_attribute_ptr(struct layout_range *range, enum layout_range_attr_kind kind)
+{
+ const WCHAR *str;
+
+ switch (kind) {
+ case LAYOUT_RANGE_ATTR_LOCALE:
+ str = range->locale;
+ break;
+ case LAYOUT_RANGE_ATTR_FONTFAMILY:
+ str = range->fontfamily;
+ break;
+ default:
+ str = NULL;
+ }
+
+ return str;
+}
+
+static HRESULT get_string_attribute_length(struct dwrite_textlayout *layout, enum layout_range_attr_kind kind, UINT32 position,
+ UINT32 *length, DWRITE_TEXT_RANGE *r)
+{
+ struct layout_range *range;
+ const WCHAR *str;
+
+ range = get_layout_range_by_pos(layout, position);
+ if (!range) {
+ *length = 0;
+ return S_OK;
+ }
+
+ str = get_string_attribute_ptr(range, kind);
+ *length = strlenW(str);
+ return return_range(range, r);
+}
+
+static HRESULT get_string_attribute_value(struct dwrite_textlayout *layout, enum layout_range_attr_kind kind, UINT32 position,
+ WCHAR *ret, UINT32 length, DWRITE_TEXT_RANGE *r)
+{
+ struct layout_range *range;
+ const WCHAR *str;
+
+ if (length == 0)
+ return E_INVALIDARG;
+
+ ret[0] = 0;
+ range = get_layout_range_by_pos(layout, position);
+ if (!range)
+ return E_INVALIDARG;
+
+ str = get_string_attribute_ptr(range, kind);
+ if (length < strlenW(str) + 1)
+ return E_NOT_SUFFICIENT_BUFFER;
+
+ strcpyW(ret, str);
+ return return_range(range, r);
+}
+
static HRESULT WINAPI dwritetextlayout_QueryInterface(IDWriteTextLayout2 *iface, REFIID riid, void **obj)
{
struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface);
@@ -1030,8 +1108,20 @@ static HRESULT WINAPI dwritetextlayout_SetFontCollection(IDWriteTextLayout2 *ifa
static HRESULT WINAPI dwritetextlayout_SetFontFamilyName(IDWriteTextLayout2 *iface, WCHAR const *name, DWRITE_TEXT_RANGE range)
{
struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface);
- FIXME("(%p)->(%s %s): stub\n", This, debugstr_w(name), debugstr_range(&range));
- return E_NOTIMPL;
+ struct layout_range_attr_value value;
+
+ TRACE("(%p)->(%s %s)\n", This, debugstr_w(name), debugstr_range(&range));
+
+ if (!name)
+ return E_INVALIDARG;
+
+ if (!validate_text_range(This, &range))
+ return S_OK;
+
+ value.range = range;
+ value.u.fontfamily = name;
+
+ return set_layout_range_attr(This, LAYOUT_RANGE_ATTR_FONTFAMILY, &value);
}
static HRESULT WINAPI dwritetextlayout_SetFontWeight(IDWriteTextLayout2 *iface, DWRITE_FONT_WEIGHT weight, DWRITE_TEXT_RANGE range)
@@ -1212,19 +1302,19 @@ static HRESULT WINAPI dwritetextlayout_layout_GetFontCollection(IDWriteTextLayou
}
static HRESULT WINAPI dwritetextlayout_layout_GetFontFamilyNameLength(IDWriteTextLayout2 *iface,
- UINT32 pos, UINT32* len, DWRITE_TEXT_RANGE *range)
+ UINT32 position, UINT32 *length, DWRITE_TEXT_RANGE *r)
{
struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface);
- FIXME("(%p)->(%d %p %p): stub\n", This, pos, len, range);
- return E_NOTIMPL;
+ TRACE("(%p)->(%d %p %p)\n", This, position, length, r);
+ return get_string_attribute_length(This, LAYOUT_RANGE_ATTR_FONTFAMILY, position, length, r);
}
static HRESULT WINAPI dwritetextlayout_layout_GetFontFamilyName(IDWriteTextLayout2 *iface,
- UINT32 position, WCHAR* name, UINT32 name_size, DWRITE_TEXT_RANGE *range)
+ UINT32 position, WCHAR *name, UINT32 length, DWRITE_TEXT_RANGE *r)
{
struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface);
- FIXME("(%p)->(%u %p %u %p): stub\n", This, position, name, name_size, range);
- return E_NOTIMPL;
+ TRACE("(%p)->(%u %p %u %p)\n", This, position, name, length, r);
+ return get_string_attribute_value(This, LAYOUT_RANGE_ATTR_FONTFAMILY, position, name, length, r);
}
static HRESULT WINAPI dwritetextlayout_layout_GetFontWeight(IDWriteTextLayout2 *iface,
@@ -1376,41 +1466,16 @@ static HRESULT WINAPI dwritetextlayout_layout_GetLocaleNameLength(IDWriteTextLay
UINT32 position, UINT32* length, DWRITE_TEXT_RANGE *r)
{
struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface);
- struct layout_range *range;
-
TRACE("(%p)->(%u %p %p)\n", This, position, length, r);
-
- range = get_layout_range_by_pos(This, position);
- if (!range) {
- *length = 0;
- return S_OK;
- }
-
- *length = strlenW(range->locale);
- return return_range(range, r);
+ return get_string_attribute_length(This, LAYOUT_RANGE_ATTR_LOCALE, position, length, r);
}
static HRESULT WINAPI dwritetextlayout_layout_GetLocaleName(IDWriteTextLayout2 *iface,
UINT32 position, WCHAR* locale, UINT32 length, DWRITE_TEXT_RANGE *r)
{
struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface);
- struct layout_range *range;
-
TRACE("(%p)->(%u %p %u %p)\n", This, position, locale, length, r);
-
- if (length == 0)
- return E_INVALIDARG;
-
- locale[0] = 0;
- range = get_layout_range_by_pos(This, position);
- if (!range)
- return E_INVALIDARG;
-
- if (length < strlenW(range->locale) + 1)
- return E_NOT_SUFFICIENT_BUFFER;
-
- strcpyW(locale, range->locale);
- return return_range(range, r);
+ return get_string_attribute_value(This, LAYOUT_RANGE_ATTR_LOCALE, position, locale, length, r);
}
static HRESULT WINAPI dwritetextlayout_Draw(IDWriteTextLayout2 *iface,
More information about the wine-cvs
mailing list