summaryrefslogtreecommitdiff
path: root/pango/pango-context.c
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@gnome.org>2007-01-16 09:52:02 +0000
committerBehdad Esfahbod <behdad@src.gnome.org>2007-01-16 09:52:02 +0000
commit56e7902a63f2036ea46a386c9d80827d6420f143 (patch)
tree6363106a16cc800436c945d09d88bbad951b5997 /pango/pango-context.c
parent7a102793913cb7a1a0eefbbfc9d5c0d04c9eb868 (diff)
downloadpango-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.c60
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;
}
}