summaryrefslogtreecommitdiff
path: root/pango2/itemize.c
diff options
context:
space:
mode:
Diffstat (limited to 'pango2/itemize.c')
-rw-r--r--pango2/itemize.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/pango2/itemize.c b/pango2/itemize.c
index 1cf4e6ea..537600d3 100644
--- a/pango2/itemize.c
+++ b/pango2/itemize.c
@@ -321,6 +321,7 @@ struct _ItemizeState
Pango2WidthIter width_iter;
Pango2EmojiIter emoji_iter;
+ Pango2EmojiPresentation preferred;
Pango2Language *derived_lang;
@@ -366,6 +367,7 @@ update_attr_iterator (ItemizeState *state)
Pango2Language *old_lang;
Pango2Attribute *attr;
int end_index;
+ Pango2EmojiPresentation old_preferred;
pango2_attr_iterator_range (state->attr_iter, NULL, &end_index);
if (end_index < state->end - state->text)
@@ -404,9 +406,15 @@ update_attr_iterator (ItemizeState *state)
attr = find_attribute (state->extra_attrs, PANGO2_ATTR_GRAVITY_HINT);
state->gravity_hint = attr == NULL ? state->context->gravity_hint : (Pango2GravityHint)attr->int_value;
+ old_preferred = state->preferred;
+ attr = find_attribute (state->extra_attrs, PANGO2_ATTR_EMOJI_PRESENTATION);
+ state->preferred = attr ? attr->int_value : state->context->presentation;
+
state->changed |= FONT_CHANGED;
if (state->lang != old_lang)
state->changed |= LANG_CHANGED;
+ if (state->preferred != old_preferred)
+ state->changed |= EMOJI_CHANGED;
}
static void
@@ -460,6 +468,8 @@ itemize_state_init (ItemizeState *state,
state->gravity_hint = state->context->gravity_hint;
state->resolved_gravity = PANGO2_GRAVITY_AUTO;
+ state->preferred = context->presentation;
+
/* Initialize the attribute iterator
*/
if (cached_iter)
@@ -505,11 +515,11 @@ itemize_state_init (ItemizeState *state,
&state->script_end, &state->script);
width_iter_init (&state->width_iter, text + start_index, length);
- _pango2_emoji_iter_init (&state->emoji_iter, text + start_index, length);
+ pango2_emoji_iter_init (&state->emoji_iter, text + start_index, length);
if (!PANGO2_GRAVITY_IS_VERTICAL (state->context->resolved_gravity))
state->width_iter.end = state->end;
- else if (state->emoji_iter.is_emoji)
+ else if (pango2_emoji_iter_get (&state->emoji_iter, state->preferred) == EMOJI_PRESENTATION_EMOJI)
state->width_iter.end = MAX (state->width_iter.end, state->emoji_iter.end);
update_end (state);
@@ -557,10 +567,10 @@ itemize_state_next (ItemizeState *state)
}
if (state->run_end == state->emoji_iter.end)
{
- _pango2_emoji_iter_next (&state->emoji_iter);
+ pango2_emoji_iter_next (&state->emoji_iter);
state->changed |= EMOJI_CHANGED;
- if (state->emoji_iter.is_emoji)
+ if (pango2_emoji_iter_get (&state->emoji_iter, state->preferred) == EMOJI_PRESENTATION_EMOJI)
state->width_iter.end = MAX (state->width_iter.end, state->emoji_iter.end);
}
if (state->run_end == state->width_iter.end)
@@ -874,16 +884,18 @@ itemize_state_update_for_new_run (ItemizeState *state)
if (!state->current_fonts)
{
- gboolean is_emoji = state->emoji_iter.is_emoji;
+ gboolean is_emoji = pango2_emoji_iter_get (&state->emoji_iter, state->preferred) == EMOJI_PRESENTATION_EMOJI;
+
if (is_emoji && !state->emoji_font_desc)
{
state->emoji_font_desc = pango2_font_description_copy_static (state->font_desc);
pango2_font_description_set_family_static (state->emoji_font_desc, "emoji");
}
+
state->current_fonts = pango2_font_map_load_fontset (state->context->font_map,
- state->context,
- is_emoji ? state->emoji_font_desc : state->font_desc,
- state->derived_lang);
+ state->context,
+ is_emoji ? state->emoji_font_desc : state->font_desc,
+ state->derived_lang);
state->cache = get_font_cache (state->current_fonts);
}
@@ -1022,7 +1034,7 @@ itemize_state_finish (ItemizeState *state)
pango2_font_description_free (state->font_desc);
pango2_font_description_free (state->emoji_font_desc);
width_iter_fini (&state->width_iter);
- _pango2_emoji_iter_fini (&state->emoji_iter);
+ pango2_emoji_iter_fini (&state->emoji_iter);
if (state->current_fonts)
g_object_unref (state->current_fonts);