dwrite: Keep underlines in separate list.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
a4562cca50
commit
c0fb6f436b
@ -102,6 +102,7 @@ struct layout_range_attr_value {
|
|||||||
|
|
||||||
enum layout_range_kind {
|
enum layout_range_kind {
|
||||||
LAYOUT_RANGE_REGULAR,
|
LAYOUT_RANGE_REGULAR,
|
||||||
|
LAYOUT_RANGE_UNDERLINE,
|
||||||
LAYOUT_RANGE_STRIKETHROUGH,
|
LAYOUT_RANGE_STRIKETHROUGH,
|
||||||
LAYOUT_RANGE_EFFECT,
|
LAYOUT_RANGE_EFFECT,
|
||||||
LAYOUT_RANGE_SPACING,
|
LAYOUT_RANGE_SPACING,
|
||||||
@ -121,7 +122,6 @@ struct layout_range {
|
|||||||
FLOAT fontsize;
|
FLOAT fontsize;
|
||||||
DWRITE_FONT_STRETCH stretch;
|
DWRITE_FONT_STRETCH stretch;
|
||||||
IDWriteInlineObject *object;
|
IDWriteInlineObject *object;
|
||||||
BOOL underline;
|
|
||||||
BOOL pair_kerning;
|
BOOL pair_kerning;
|
||||||
IDWriteFontCollection *collection;
|
IDWriteFontCollection *collection;
|
||||||
WCHAR locale[LOCALE_NAME_MAX_LENGTH];
|
WCHAR locale[LOCALE_NAME_MAX_LENGTH];
|
||||||
@ -234,6 +234,7 @@ struct dwrite_textlayout {
|
|||||||
UINT32 len;
|
UINT32 len;
|
||||||
struct dwrite_textformat_data format;
|
struct dwrite_textformat_data format;
|
||||||
struct list strike_ranges;
|
struct list strike_ranges;
|
||||||
|
struct list underline_ranges;
|
||||||
struct list typographies;
|
struct list typographies;
|
||||||
struct list effects;
|
struct list effects;
|
||||||
struct list spacing;
|
struct list spacing;
|
||||||
@ -1627,7 +1628,7 @@ static BOOL is_same_layout_attrvalue(struct layout_range_header const *h, enum l
|
|||||||
case LAYOUT_RANGE_ATTR_EFFECT:
|
case LAYOUT_RANGE_ATTR_EFFECT:
|
||||||
return range_iface->iface == value->u.effect;
|
return range_iface->iface == value->u.effect;
|
||||||
case LAYOUT_RANGE_ATTR_UNDERLINE:
|
case LAYOUT_RANGE_ATTR_UNDERLINE:
|
||||||
return range->underline == value->u.underline;
|
return range_bool->value == value->u.underline;
|
||||||
case LAYOUT_RANGE_ATTR_STRIKETHROUGH:
|
case LAYOUT_RANGE_ATTR_STRIKETHROUGH:
|
||||||
return range_bool->value == value->u.strikethrough;
|
return range_bool->value == value->u.strikethrough;
|
||||||
case LAYOUT_RANGE_ATTR_PAIR_KERNING:
|
case LAYOUT_RANGE_ATTR_PAIR_KERNING:
|
||||||
@ -1664,12 +1665,12 @@ static inline BOOL is_same_layout_attributes(struct layout_range_header const *h
|
|||||||
left->stretch == right->stretch &&
|
left->stretch == right->stretch &&
|
||||||
left->fontsize == right->fontsize &&
|
left->fontsize == right->fontsize &&
|
||||||
left->object == right->object &&
|
left->object == right->object &&
|
||||||
left->underline == right->underline &&
|
|
||||||
left->pair_kerning == right->pair_kerning &&
|
left->pair_kerning == right->pair_kerning &&
|
||||||
left->collection == right->collection &&
|
left->collection == right->collection &&
|
||||||
!strcmpiW(left->locale, right->locale) &&
|
!strcmpiW(left->locale, right->locale) &&
|
||||||
!strcmpW(left->fontfamily, right->fontfamily);
|
!strcmpW(left->fontfamily, right->fontfamily);
|
||||||
}
|
}
|
||||||
|
case LAYOUT_RANGE_UNDERLINE:
|
||||||
case LAYOUT_RANGE_STRIKETHROUGH:
|
case LAYOUT_RANGE_STRIKETHROUGH:
|
||||||
{
|
{
|
||||||
struct layout_range_bool const *left = (struct layout_range_bool const*)hleft;
|
struct layout_range_bool const *left = (struct layout_range_bool const*)hleft;
|
||||||
@ -1722,7 +1723,6 @@ static struct layout_range_header *alloc_layout_range(struct dwrite_textlayout *
|
|||||||
range->stretch = layout->format.stretch;
|
range->stretch = layout->format.stretch;
|
||||||
range->fontsize = layout->format.fontsize;
|
range->fontsize = layout->format.fontsize;
|
||||||
range->object = NULL;
|
range->object = NULL;
|
||||||
range->underline = FALSE;
|
|
||||||
range->pair_kerning = FALSE;
|
range->pair_kerning = FALSE;
|
||||||
|
|
||||||
range->fontfamily = heap_strdupW(layout->format.family_name);
|
range->fontfamily = heap_strdupW(layout->format.family_name);
|
||||||
@ -1739,6 +1739,7 @@ static struct layout_range_header *alloc_layout_range(struct dwrite_textlayout *
|
|||||||
h = &range->h;
|
h = &range->h;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case LAYOUT_RANGE_UNDERLINE:
|
||||||
case LAYOUT_RANGE_STRIKETHROUGH:
|
case LAYOUT_RANGE_STRIKETHROUGH:
|
||||||
{
|
{
|
||||||
struct layout_range_bool *range;
|
struct layout_range_bool *range;
|
||||||
@ -1813,6 +1814,7 @@ static struct layout_range_header *alloc_layout_range_from(struct layout_range_h
|
|||||||
ret = &range->h;
|
ret = &range->h;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case LAYOUT_RANGE_UNDERLINE:
|
||||||
case LAYOUT_RANGE_STRIKETHROUGH:
|
case LAYOUT_RANGE_STRIKETHROUGH:
|
||||||
{
|
{
|
||||||
struct layout_range_bool *strike = heap_alloc(sizeof(*strike));
|
struct layout_range_bool *strike = heap_alloc(sizeof(*strike));
|
||||||
@ -1894,6 +1896,11 @@ static void free_layout_ranges_list(struct dwrite_textlayout *layout)
|
|||||||
free_layout_range(cur);
|
free_layout_range(cur);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LIST_FOR_EACH_ENTRY_SAFE(cur, cur2, &layout->underline_ranges, struct layout_range_header, entry) {
|
||||||
|
list_remove(&cur->entry);
|
||||||
|
free_layout_range(cur);
|
||||||
|
}
|
||||||
|
|
||||||
LIST_FOR_EACH_ENTRY_SAFE(cur, cur2, &layout->strike_ranges, struct layout_range_header, entry) {
|
LIST_FOR_EACH_ENTRY_SAFE(cur, cur2, &layout->strike_ranges, struct layout_range_header, entry) {
|
||||||
list_remove(&cur->entry);
|
list_remove(&cur->entry);
|
||||||
free_layout_range(cur);
|
free_layout_range(cur);
|
||||||
@ -1993,8 +2000,8 @@ static BOOL set_layout_range_attrval(struct layout_range_header *h, enum layout_
|
|||||||
changed = set_layout_range_iface_attr((IUnknown**)&dest_iface->iface, (IUnknown*)value->u.effect);
|
changed = set_layout_range_iface_attr((IUnknown**)&dest_iface->iface, (IUnknown*)value->u.effect);
|
||||||
break;
|
break;
|
||||||
case LAYOUT_RANGE_ATTR_UNDERLINE:
|
case LAYOUT_RANGE_ATTR_UNDERLINE:
|
||||||
changed = dest->underline != value->u.underline;
|
changed = dest_bool->value != value->u.underline;
|
||||||
dest->underline = value->u.underline;
|
dest_bool->value = value->u.underline;
|
||||||
break;
|
break;
|
||||||
case LAYOUT_RANGE_ATTR_STRIKETHROUGH:
|
case LAYOUT_RANGE_ATTR_STRIKETHROUGH:
|
||||||
changed = dest_bool->value != value->u.strikethrough;
|
changed = dest_bool->value != value->u.strikethrough;
|
||||||
@ -2069,13 +2076,15 @@ static HRESULT set_layout_range_attr(struct dwrite_textlayout *layout, enum layo
|
|||||||
case LAYOUT_RANGE_ATTR_STRETCH:
|
case LAYOUT_RANGE_ATTR_STRETCH:
|
||||||
case LAYOUT_RANGE_ATTR_FONTSIZE:
|
case LAYOUT_RANGE_ATTR_FONTSIZE:
|
||||||
case LAYOUT_RANGE_ATTR_INLINE:
|
case LAYOUT_RANGE_ATTR_INLINE:
|
||||||
case LAYOUT_RANGE_ATTR_UNDERLINE:
|
|
||||||
case LAYOUT_RANGE_ATTR_PAIR_KERNING:
|
case LAYOUT_RANGE_ATTR_PAIR_KERNING:
|
||||||
case LAYOUT_RANGE_ATTR_FONTCOLL:
|
case LAYOUT_RANGE_ATTR_FONTCOLL:
|
||||||
case LAYOUT_RANGE_ATTR_LOCALE:
|
case LAYOUT_RANGE_ATTR_LOCALE:
|
||||||
case LAYOUT_RANGE_ATTR_FONTFAMILY:
|
case LAYOUT_RANGE_ATTR_FONTFAMILY:
|
||||||
ranges = &layout->ranges;
|
ranges = &layout->ranges;
|
||||||
break;
|
break;
|
||||||
|
case LAYOUT_RANGE_ATTR_UNDERLINE:
|
||||||
|
ranges = &layout->underline_ranges;
|
||||||
|
break;
|
||||||
case LAYOUT_RANGE_ATTR_STRIKETHROUGH:
|
case LAYOUT_RANGE_ATTR_STRIKETHROUGH:
|
||||||
ranges = &layout->strike_ranges;
|
ranges = &layout->strike_ranges;
|
||||||
break;
|
break;
|
||||||
@ -2778,15 +2787,12 @@ static HRESULT WINAPI dwritetextlayout_GetUnderline(IDWriteTextLayout2 *iface,
|
|||||||
UINT32 position, BOOL *underline, DWRITE_TEXT_RANGE *r)
|
UINT32 position, BOOL *underline, DWRITE_TEXT_RANGE *r)
|
||||||
{
|
{
|
||||||
struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface);
|
struct dwrite_textlayout *This = impl_from_IDWriteTextLayout2(iface);
|
||||||
struct layout_range *range;
|
struct layout_range_bool *range;
|
||||||
|
|
||||||
TRACE("(%p)->(%u %p %p)\n", This, position, underline, r);
|
TRACE("(%p)->(%u %p %p)\n", This, position, underline, r);
|
||||||
|
|
||||||
if (position >= This->len)
|
range = (struct layout_range_bool*)get_layout_range_header_by_pos(&This->underline_ranges, position);
|
||||||
return S_OK;
|
*underline = range->value;
|
||||||
|
|
||||||
range = get_layout_range_by_pos(This, position);
|
|
||||||
*underline = range->underline;
|
|
||||||
|
|
||||||
return return_range(&range->h, r);
|
return return_range(&range->h, r);
|
||||||
}
|
}
|
||||||
@ -4032,7 +4038,7 @@ static HRESULT layout_format_from_textformat(struct dwrite_textlayout *layout, I
|
|||||||
|
|
||||||
static HRESULT init_textlayout(const WCHAR *str, UINT32 len, IDWriteTextFormat *format, FLOAT maxwidth, FLOAT maxheight, struct dwrite_textlayout *layout)
|
static HRESULT init_textlayout(const WCHAR *str, UINT32 len, IDWriteTextFormat *format, FLOAT maxwidth, FLOAT maxheight, struct dwrite_textlayout *layout)
|
||||||
{
|
{
|
||||||
struct layout_range_header *range, *strike, *effect, *spacing, *typography;
|
struct layout_range_header *range, *strike, *underline, *effect, *spacing, *typography;
|
||||||
static const DWRITE_TEXT_RANGE r = { 0, ~0u };
|
static const DWRITE_TEXT_RANGE r = { 0, ~0u };
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
@ -4057,6 +4063,7 @@ static HRESULT init_textlayout(const WCHAR *str, UINT32 len, IDWriteTextFormat *
|
|||||||
list_init(&layout->runs);
|
list_init(&layout->runs);
|
||||||
list_init(&layout->ranges);
|
list_init(&layout->ranges);
|
||||||
list_init(&layout->strike_ranges);
|
list_init(&layout->strike_ranges);
|
||||||
|
list_init(&layout->underline_ranges);
|
||||||
list_init(&layout->effects);
|
list_init(&layout->effects);
|
||||||
list_init(&layout->spacing);
|
list_init(&layout->spacing);
|
||||||
list_init(&layout->typographies);
|
list_init(&layout->typographies);
|
||||||
@ -4081,12 +4088,14 @@ static HRESULT init_textlayout(const WCHAR *str, UINT32 len, IDWriteTextFormat *
|
|||||||
|
|
||||||
range = alloc_layout_range(layout, &r, LAYOUT_RANGE_REGULAR);
|
range = alloc_layout_range(layout, &r, LAYOUT_RANGE_REGULAR);
|
||||||
strike = alloc_layout_range(layout, &r, LAYOUT_RANGE_STRIKETHROUGH);
|
strike = alloc_layout_range(layout, &r, LAYOUT_RANGE_STRIKETHROUGH);
|
||||||
|
underline = alloc_layout_range(layout, &r, LAYOUT_RANGE_UNDERLINE);
|
||||||
effect = alloc_layout_range(layout, &r, LAYOUT_RANGE_EFFECT);
|
effect = alloc_layout_range(layout, &r, LAYOUT_RANGE_EFFECT);
|
||||||
spacing = alloc_layout_range(layout, &r, LAYOUT_RANGE_SPACING);
|
spacing = alloc_layout_range(layout, &r, LAYOUT_RANGE_SPACING);
|
||||||
typography = alloc_layout_range(layout, &r, LAYOUT_RANGE_TYPOGRAPHY);
|
typography = alloc_layout_range(layout, &r, LAYOUT_RANGE_TYPOGRAPHY);
|
||||||
if (!range || !strike || !effect || !spacing || !typography) {
|
if (!range || !strike || !effect || !spacing || !typography || !underline) {
|
||||||
free_layout_range(range);
|
free_layout_range(range);
|
||||||
free_layout_range(strike);
|
free_layout_range(strike);
|
||||||
|
free_layout_range(underline);
|
||||||
free_layout_range(effect);
|
free_layout_range(effect);
|
||||||
free_layout_range(spacing);
|
free_layout_range(spacing);
|
||||||
free_layout_range(typography);
|
free_layout_range(typography);
|
||||||
@ -4096,6 +4105,7 @@ static HRESULT init_textlayout(const WCHAR *str, UINT32 len, IDWriteTextFormat *
|
|||||||
|
|
||||||
list_add_head(&layout->ranges, &range->entry);
|
list_add_head(&layout->ranges, &range->entry);
|
||||||
list_add_head(&layout->strike_ranges, &strike->entry);
|
list_add_head(&layout->strike_ranges, &strike->entry);
|
||||||
|
list_add_head(&layout->underline_ranges, &underline->entry);
|
||||||
list_add_head(&layout->effects, &effect->entry);
|
list_add_head(&layout->effects, &effect->entry);
|
||||||
list_add_head(&layout->spacing, &spacing->entry);
|
list_add_head(&layout->spacing, &spacing->entry);
|
||||||
list_add_head(&layout->typographies, &typography->entry);
|
list_add_head(&layout->typographies, &typography->entry);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user