summaryrefslogtreecommitdiff
path: root/pango
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@gnome.org>2006-08-20 20:35:45 +0000
committerBehdad Esfahbod <behdad@src.gnome.org>2006-08-20 20:35:45 +0000
commitd166f21c486ecda8c67d94ec0392f837c5f3eea9 (patch)
tree48ea486638afadaf9d734c59f9bbb06102f5e4a0 /pango
parent919d3089dae2e2ad011c9b94b4847c30b536ac63 (diff)
downloadpango-d166f21c486ecda8c67d94ec0392f837c5f3eea9.tar.gz
Correct switched return value of EAST/WEST.
2006-08-20 Behdad Esfahbod <behdad@gnome.org> * pango/pango-matrix.c (pango_matrix_to_gravity): Correct switched return value of EAST/WEST. * pango/pango-types.h (PangoGravity): Add PANGO_GRAVITY_AUTO. * pango/pango-context.h: Add pango_context_get_gravity(). * examples/renderdemo.c (parse_gravity), (parse_options): * pango/pango-context.c (pango_context_init), (update_resolved_gravity), (pango_context_set_matrix), (pango_context_set_base_gravity), (pango_context_get_gravity), (itemize_state_init), (get_shaper_and_font): * pango/pango-layout.c (line_set_resolved_dir): * pango/pangocairo-fcfont.c (pango_cairo_fc_font_get_metrics), (pango_cairo_fc_font_glyph_extents_cache_init), (_pango_cairo_fc_font_new): * pango/pangofc-fontmap.c (pango_fc_make_pattern), (pango_fc_font_map_load_fontset): * pango/pango.def: * docs/pango-sections.txt: * docs/tmpl/main.sgml: Update to above.
Diffstat (limited to 'pango')
-rw-r--r--pango/pango-context.c44
-rw-r--r--pango/pango-context.h1
-rw-r--r--pango/pango-layout.c2
-rw-r--r--pango/pango-matrix.c14
-rw-r--r--pango/pango-types.h8
-rw-r--r--pango/pango.def1
-rw-r--r--pango/pangocairo-fcfont.c4
-rw-r--r--pango/pangofc-fontmap.c3
8 files changed, 65 insertions, 12 deletions
diff --git a/pango/pango-context.c b/pango/pango-context.c
index ac6db552..b3dec728 100644
--- a/pango/pango-context.c
+++ b/pango/pango-context.c
@@ -37,6 +37,7 @@ struct _PangoContext
PangoLanguage *language;
PangoDirection base_dir;
PangoGravity base_gravity;
+ PangoGravity resolved_gravity;
PangoFontDescription *font_desc;
@@ -59,7 +60,7 @@ static void
pango_context_init (PangoContext *context)
{
context->base_dir = PANGO_DIRECTION_WEAK_LTR;
- context->base_gravity = PANGO_GRAVITY_SOUTH;
+ context->resolved_gravity = context->base_gravity = PANGO_GRAVITY_SOUTH;
context->language = NULL;
context->font_map = NULL;
@@ -128,6 +129,15 @@ pango_context_new (void)
return context;
}
+static void
+update_resolved_gravity (PangoContext *context)
+{
+ if (context->base_gravity == PANGO_GRAVITY_AUTO)
+ context->resolved_gravity = pango_matrix_to_gravity (context->matrix);
+ else
+ context->resolved_gravity = context->base_gravity;
+}
+
/**
* pango_context_set_matrix:
* @context: a #PangoContext
@@ -155,6 +165,8 @@ pango_context_set_matrix (PangoContext *context,
context->matrix = pango_matrix_copy (matrix);
else
context->matrix = NULL;
+
+ update_resolved_gravity (context);
}
/**
@@ -423,6 +435,8 @@ pango_context_set_base_gravity (PangoContext *context,
g_return_if_fail (context != NULL);
context->base_gravity = gravity;
+
+ update_resolved_gravity (context);
}
/**
@@ -444,6 +458,27 @@ pango_context_get_base_gravity (PangoContext *context)
return context->base_gravity;
}
+/**
+ * pango_context_get_gravity:
+ * @context: a #PangoContext
+ *
+ * Retrieves the gravity for the context. This is similar to
+ * pango_context_get_base_gravity(), except for when the base gravity
+ * is %PANGO_GRAVITY_AUTO for which pango_matrix_to_gravity() is used
+ * to return the gravity from the current context matrix.
+ *
+ * Return value: the resolved gravity for the context.
+ *
+ * Since: 1.16
+ **/
+PangoGravity
+pango_context_get_gravity (PangoContext *context)
+{
+ g_return_val_if_fail (context != NULL, PANGO_GRAVITY_SOUTH);
+
+ return context->resolved_gravity;
+}
+
/**********************************************************************/
static gboolean
@@ -711,10 +746,10 @@ itemize_state_init (ItemizeState *state,
/* FIXME: Set gravity to base gravity for now, until we do
* proper gravity assignment.
*/
- state->gravity = context->base_gravity;
+ state->gravity = context->resolved_gravity;
- state->centered_baseline = context->base_gravity == PANGO_GRAVITY_EAST
- || context->base_gravity == PANGO_GRAVITY_WEST;
+ state->centered_baseline = context->resolved_gravity == PANGO_GRAVITY_EAST
+ || context->resolved_gravity == PANGO_GRAVITY_WEST;
/* Initialize the attribute iterator
*/
@@ -1014,6 +1049,7 @@ get_shaper_and_font (ItemizeState *state,
{
case PANGO_GRAVITY_SOUTH:
case PANGO_GRAVITY_NORTH:
+ case PANGO_GRAVITY_AUTO:
default:
script = state->script;
break;
diff --git a/pango/pango-context.h b/pango/pango-context.h
index 97af918c..25bdf4ab 100644
--- a/pango/pango-context.h
+++ b/pango/pango-context.h
@@ -81,6 +81,7 @@ PangoDirection pango_context_get_base_dir (PangoContext
void pango_context_set_base_gravity (PangoContext *context,
PangoGravity gravity);
PangoGravity pango_context_get_base_gravity (PangoContext *context);
+PangoGravity pango_context_get_gravity (PangoContext *context);
void pango_context_set_matrix (PangoContext *context,
const PangoMatrix *matrix);
diff --git a/pango/pango-layout.c b/pango/pango-layout.c
index 4c9ec92f..1a5917ba 100644
--- a/pango/pango-layout.c
+++ b/pango/pango-layout.c
@@ -3028,7 +3028,7 @@ line_set_resolved_dir (PangoLayoutLine *line,
* A similar dance is performed in pango-context.c:
* itemize_state_add_character(). Keep in synch.
*/
- switch (pango_context_get_base_gravity (line->layout->context))
+ switch (pango_context_get_gravity (line->layout->context))
{
case PANGO_GRAVITY_SOUTH:
default:
diff --git a/pango/pango-matrix.c b/pango/pango-matrix.c
index 322a4931..e63ecab1 100644
--- a/pango/pango-matrix.c
+++ b/pango/pango-matrix.c
@@ -258,7 +258,7 @@ pango_matrix_get_font_scale_factor (const PangoMatrix *matrix)
* in a #PangoMatrix.
*
* Return value: the gravity of @matrix, which will never be
- * %PANGO_GRAVITY_AUTO
+ * %PANGO_GRAVITY_AUTO, or PANGO_GRAVITY_SOUTH if @matrix is %NULL
*
* Since: 1.16
*/
@@ -266,11 +266,17 @@ PangoGravity
pango_matrix_to_gravity (const PangoMatrix *matrix)
{
PangoGravity gravity;
- double x = matrix->xy;
- double y = matrix->yy;
+ double x;
+ double y;
+
+ if (!matrix)
+ return PANGO_GRAVITY_SOUTH;
+
+ x = matrix->xy;
+ y = matrix->yy;
if (abs (x) > abs (y))
- gravity = x < 0 ? PANGO_GRAVITY_WEST : PANGO_GRAVITY_EAST;
+ gravity = x > 0 ? PANGO_GRAVITY_WEST : PANGO_GRAVITY_EAST;
else
gravity = y < 0 ? PANGO_GRAVITY_NORTH : PANGO_GRAVITY_SOUTH;
diff --git a/pango/pango-types.h b/pango/pango-types.h
index 9d4caba6..2e8b5a83 100644
--- a/pango/pango-types.h
+++ b/pango/pango-types.h
@@ -154,11 +154,16 @@ gboolean pango_get_mirror_char (gunichar ch,
* @PANGO_GRAVITY_EAST: Glyphs are rotated 90 degrees clockwise
* @PANGO_GRAVITY_NORTH: Glyphs are upside-down
* @PANGO_GRAVITY_WEST: Glyphs are rotated 90 degrees counter-clockwise
+ * @PANGO_GRAVITY_AUTO: Gravity is resolved from the context matrix
*
* The #PangoGravity type represents the orientation of glyphs in a segment
* of text. This is useful when rendering vertical text layouts. In
* those situations, the layout is rotated using a non-identity PangoMatrix,
* and then glyph orientation is controlled using #PangoGravity.
+ * Not every value in this enumeration makes sense for every usage of
+ * #PangoGravity; for example, %PANGO_GRAVITY_AUTO only can be passed to
+ * pango_context_set_base_gravity() and can only be returned by
+ * pango_context_get_base_gravity().
*
* Since: 1.16
**/
@@ -166,7 +171,8 @@ typedef enum {
PANGO_GRAVITY_SOUTH,
PANGO_GRAVITY_EAST,
PANGO_GRAVITY_NORTH,
- PANGO_GRAVITY_WEST
+ PANGO_GRAVITY_WEST,
+ PANGO_GRAVITY_AUTO
} PangoGravity;
double pango_gravity_to_rotation (PangoGravity gravity);
diff --git a/pango/pango.def b/pango/pango.def
index 32576db6..fed46d8b 100644
--- a/pango/pango.def
+++ b/pango/pango.def
@@ -54,6 +54,7 @@ EXPORTS
pango_context_get_base_gravity
pango_context_get_font_description
pango_context_get_font_map
+ pango_context_get_gravity
pango_context_get_language
pango_context_get_matrix
pango_context_get_metrics
diff --git a/pango/pangocairo-fcfont.c b/pango/pangocairo-fcfont.c
index a0dec5c6..f6ce1087 100644
--- a/pango/pangocairo-fcfont.c
+++ b/pango/pangocairo-fcfont.c
@@ -239,6 +239,7 @@ pango_cairo_fc_font_get_metrics (PangoFont *font,
switch (cffont->gravity)
{
default:
+ case PANGO_GRAVITY_AUTO:
case PANGO_GRAVITY_SOUTH:
break;
case PANGO_GRAVITY_NORTH:
@@ -299,6 +300,7 @@ pango_cairo_fc_font_glyph_extents_cache_init (PangoCairoFcFont *cffont)
switch (cffont->gravity)
{
default:
+ case PANGO_GRAVITY_AUTO:
case PANGO_GRAVITY_SOUTH:
cffont->font_extents.y = - PANGO_UNITS (font_extents.ascent);
break;
@@ -506,7 +508,7 @@ _pango_cairo_fc_font_new (PangoCairoFcFontMap *cffontmap,
NULL);
/* FIXME: support per-item gravity */
- cffont->gravity = pango_context_get_base_gravity (context);
+ cffont->gravity = pango_context_get_gravity (context);
if (FcPatternGetMatrix (pattern,
FC_MATRIX, 0, &fc_matrix) == FcResultMatch)
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c
index 356b321a..756774ad 100644
--- a/pango/pangofc-fontmap.c
+++ b/pango/pangofc-fontmap.c
@@ -812,6 +812,7 @@ pango_fc_make_pattern (const PangoFontDescription *description,
width = pango_fc_convert_width_to_fc (pango_font_description_get_stretch (description));
#endif
+ /* FIXME: get gravity from description */
switch (gravity)
{
case PANGO_GRAVITY_SOUTH:
@@ -1233,7 +1234,7 @@ pango_fc_font_map_load_fontset (PangoFontMap *fontmap,
{
/* FIXME: support per-item gravity */
PangoFcPatternSet *patterns = pango_fc_font_map_get_patterns (fontmap, context, desc, language,
- pango_context_get_base_gravity (context));
+ pango_context_get_gravity (context));
PangoFontset *result;
int i;