diff options
author | Behdad Esfahbod <behdad@gnome.org> | 2007-01-16 09:52:02 +0000 |
---|---|---|
committer | Behdad Esfahbod <behdad@src.gnome.org> | 2007-01-16 09:52:02 +0000 |
commit | 56e7902a63f2036ea46a386c9d80827d6420f143 (patch) | |
tree | 6363106a16cc800436c945d09d88bbad951b5997 /pango/pango-context.c | |
parent | 7a102793913cb7a1a0eefbbfc9d5c0d04c9eb868 (diff) | |
download | pango-56e7902a63f2036ea46a386c9d80827d6420f143.tar.gz |
New attribute types PANGO_ATTR_GRAVITY and PANGO_ATTR_GRAVITY_HINT. New
2007-01-16 Behdad Esfahbod <behdad@gnome.org>
* pango/pango-attributes.h:
* pango/pango-attributes.c:
New attribute types PANGO_ATTR_GRAVITY and PANGO_ATTR_GRAVITY_HINT.
New public functions:
pango_attr_gravity_new()
pango_attr_gravity_hint_new()
* pango/pango-context.c (update_attr_iterator),
(itemize_state_init), (itemize_state_add_character),
(get_shaper_and_font), (itemize_state_update_for_new_run):
Handle gravity and gravity_hint attributes.
* pango/pango-utils.h:
* pango/pango-utils.c:
New public function:
pango_parse_enum()
* pango/pango-markup.c (span_parse_func): Parse gravity and
gravity_hint attributes for <span>. Optimize a bit.
* pango/pango-markup.c (parse_absolute_size), (attr_strcmp),
(span_parse_int), (span_parse_boolean), (span_parse_color),
(span_parse_enum), (span_parse_func): Use pango_scan_int(),
pango_color_parse(), and pango_parse_enum(). Also, ignore '-' and
'_' differences when matching attribute names for <span>.
* examples/renderdemo.c (parse_enum), (parse_ellipsis),
(parse_gravity), (parse_gravity_hint), (parse_hinting),
(parse_wrap): Use a generic parse_enum() that uses pango_parse_enum().
* modules/basic/basic-fc.c (basic_engine_shape):
* pango/pangofc-fontmap.c (pango_fc_make_pattern):
Use PANGO_GRAVITY_IS_VERTICAL().
* pango/pango.def:
* docs/pango-sections.txt:
* docs/tmpl/text-attributes.sgml:
* docs/tmpl/utils.sgml:
Update.
svn path=/trunk/; revision=2145
Diffstat (limited to 'pango/pango-context.c')
-rw-r--r-- | pango/pango-context.c | 60 |
1 files changed, 35 insertions, 25 deletions
diff --git a/pango/pango-context.c b/pango/pango-context.c index 32197e5f..53b86302 100644 --- a/pango/pango-context.c +++ b/pango/pango-context.c @@ -663,6 +663,8 @@ struct _ItemizeState guint8 embedding; PangoGravity gravity; + PangoGravityHint gravity_hint; + PangoGravity resolved_gravity; PangoGravity font_desc_gravity; gboolean centered_baseline; @@ -723,7 +725,7 @@ static void update_attr_iterator (ItemizeState *state) { PangoLanguage *old_lang; - PangoAttribute *fallback; + PangoAttribute *attr; int end_index; pango_attr_iterator_range (state->attr_iter, NULL, &end_index); @@ -748,8 +750,14 @@ update_attr_iterator (ItemizeState *state) if (!state->lang) state->lang = state->context->language; - fallback = find_attribute (state->extra_attrs, PANGO_ATTR_FALLBACK); - state->enable_fallback = (fallback == NULL || ((PangoAttrInt *)fallback)->value); + attr = find_attribute (state->extra_attrs, PANGO_ATTR_FALLBACK); + state->enable_fallback = (attr == NULL || ((PangoAttrInt *)attr)->value); + + attr = find_attribute (state->extra_attrs, PANGO_ATTR_GRAVITY); + state->gravity = attr == NULL ? PANGO_GRAVITY_AUTO : ((PangoAttrInt *)attr)->value; + + attr = find_attribute (state->extra_attrs, PANGO_ATTR_GRAVITY_HINT); + state->gravity_hint = attr == NULL ? state->context->gravity_hint : ((PangoAttrInt *)attr)->value; state->changed |= FONT_CHANGED; if (state->lang != old_lang) @@ -850,6 +858,8 @@ itemize_state_init (ItemizeState *state, state->font_desc_gravity = PANGO_GRAVITY_AUTO; state->gravity = PANGO_GRAVITY_AUTO; + state->gravity_hint = state->context->gravity_hint; + state->resolved_gravity = PANGO_GRAVITY_AUTO; state->derived_lang = NULL; state->lang_engine = NULL; state->current_fonts = NULL; @@ -970,7 +980,7 @@ itemize_state_add_character (ItemizeState *state, state->item->analysis.font = font; state->item->analysis.level = state->embedding; - state->item->analysis.gravity = state->gravity; + state->item->analysis.gravity = state->resolved_gravity; /* The level vs. gravity dance: * - If gravity is SOUTH, leave level untouched. @@ -1099,19 +1109,10 @@ get_shaper_and_font (ItemizeState *state, */ PangoScript script; - switch (state->gravity) - { - case PANGO_GRAVITY_SOUTH: - case PANGO_GRAVITY_NORTH: - case PANGO_GRAVITY_AUTO: - default: - script = state->script; - break; - case PANGO_GRAVITY_EAST: - case PANGO_GRAVITY_WEST: - script = PANGO_SCRIPT_COMMON; - break; - } + if (PANGO_GRAVITY_IS_VERTICAL (state->resolved_gravity)) + script = PANGO_SCRIPT_COMMON; + else + script = state->script; get_engines (state->context, state->derived_lang, script, &state->exact_engines, &state->fallback_engines); @@ -1212,25 +1213,34 @@ get_lang_map (PangoLanguage *lang) static void itemize_state_update_for_new_run (ItemizeState *state) { + /* This block should be moved to update_attr_iterator, but I'm too lazy to + * do it right now */ if (state->changed & (FONT_CHANGED | SCRIPT_CHANGED)) { - PangoGravity old_gravity = state->gravity; + PangoGravity old_gravity = state->resolved_gravity; if (state->font_desc_gravity != PANGO_GRAVITY_AUTO) - state->gravity = state->font_desc_gravity; + state->resolved_gravity = state->font_desc_gravity; else { - PangoGravity gravity = state->context->resolved_gravity; + PangoGravity gravity; + PangoGravityHint gravity_hint; + + gravity = state->gravity; + if (G_LIKELY (gravity == PANGO_GRAVITY_AUTO)) + gravity = state->context->resolved_gravity; + + gravity_hint = state->gravity_hint; gravity = pango_gravity_get_for_script (state->script, - state->context->resolved_gravity, - state->context->gravity_hint); - state->gravity = gravity; + gravity, + gravity_hint); + state->resolved_gravity = gravity; } - if (old_gravity != state->gravity) + if (old_gravity != state->resolved_gravity) { - pango_font_description_set_gravity (state->font_desc, state->gravity); + pango_font_description_set_gravity (state->font_desc, state->resolved_gravity); state->changed |= FONT_CHANGED; } } |