summaryrefslogtreecommitdiff
path: root/pango
diff options
context:
space:
mode:
Diffstat (limited to 'pango')
-rw-r--r--pango/Makefile.am10
-rw-r--r--pango/pango-attributes.c3
-rw-r--r--pango/pango-context.c57
-rw-r--r--pango/pango-context.h3
-rw-r--r--pango/pango-glyph-item-private.h1
-rw-r--r--pango/pango-glyph-item.c1
-rw-r--r--pango/pango-glyph-item.h1
-rw-r--r--pango/pango-gravity.c294
-rw-r--r--pango/pango-gravity.h109
-rw-r--r--pango/pango-layout.c6
-rw-r--r--pango/pango-matrix.c37
-rw-r--r--pango/pango-matrix.h115
-rw-r--r--pango/pango-script.c1
-rw-r--r--pango/pango-script.h7
-rw-r--r--pango/pango-types.h116
-rw-r--r--pango/pango-utils.c30
-rw-r--r--pango/pango.def6
-rw-r--r--pango/pango.h2
18 files changed, 598 insertions, 201 deletions
diff --git a/pango/Makefile.am b/pango/Makefile.am
index 59e1bcbc..9961d04d 100644
--- a/pango/Makefile.am
+++ b/pango/Makefile.am
@@ -77,18 +77,19 @@ libpango_1_0_la_SOURCES = \
pango-fontset.c \
pango-glyph-item.c \
pango-glyph-item-private.h \
+ pango-gravity.c \
pango-impl-utils.h \
pango-item.c \
pango-layout.c \
pango-layout-private.h \
pango-markup.c \
+ pango-matrix.c \
pango-renderer.c \
pango-script.c \
pango-script-lang-table.h \
pango-script-table.h \
pango-tabs.c \
pango-utils.c \
- pango-matrix.c \
reorder-items.c \
shape.c \
pango-enum-types.c \
@@ -106,16 +107,16 @@ pango_headers = \
pango-fontset.h \
pango-glyph.h \
pango-glyph-item.h \
+ pango-gravity.h \
pango-item.h \
pango-layout.h \
+ pango-matrix.h \
pango-modules.h \
pango-renderer.h \
pango-script.h \
pango-tabs.h \
pango-types.h \
- pango-utils.h \
- pangofc-font.h \
- pangofc-fontmap.h
+ pango-utils.h
pangoinclude_HEADERS = \
$(pango_headers) \
@@ -183,6 +184,7 @@ libpangox_1_0_la_SOURCES = \
# ------------------- libpangoft2 -------------------
if HAVE_FREETYPE
+pangoinclude_HEADERS += pangofc-font.h pangofc-fontmap.h
pangoinclude_HEADERS += pangoft2.h pango-ot.h pangofc-decoder.h
lib_LTLIBRARIES += libpangoft2-1.0.la
endif
diff --git a/pango/pango-attributes.c b/pango/pango-attributes.c
index eef62ea2..7f997461 100644
--- a/pango/pango-attributes.c
+++ b/pango/pango-attributes.c
@@ -1,5 +1,4 @@
-/* -*- mode: C; c-file-style: "gnu" -*- */
-/* pango
+/* Pango
* pango-attributes.c: Attributed text
*
* Copyright (C) 2000-2002 Red Hat Software
diff --git a/pango/pango-context.c b/pango/pango-context.c
index 533929d6..32197e5f 100644
--- a/pango/pango-context.c
+++ b/pango/pango-context.c
@@ -1,7 +1,7 @@
/* Pango
* pango-context.c: Contexts for itemization and shaping
*
- * Copyright (C) 2000 Red Hat Software
+ * Copyright (C) 2000, 2006 Red Hat Software
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -38,6 +38,7 @@ struct _PangoContext
PangoDirection base_dir;
PangoGravity base_gravity;
PangoGravity resolved_gravity;
+ PangoGravityHint gravity_hint;
PangoFontDescription *font_desc;
@@ -61,6 +62,8 @@ pango_context_init (PangoContext *context)
{
context->base_dir = PANGO_DIRECTION_WEAK_LTR;
context->resolved_gravity = context->base_gravity = PANGO_GRAVITY_SOUTH;
+ context->gravity_hint = PANGO_GRAVITY_HINT_NATURAL;
+
context->language = NULL;
context->font_map = NULL;
@@ -133,7 +136,7 @@ static void
update_resolved_gravity (PangoContext *context)
{
if (context->base_gravity == PANGO_GRAVITY_AUTO)
- context->resolved_gravity = pango_matrix_to_gravity (context->matrix);
+ context->resolved_gravity = pango_gravity_get_for_matrix (context->matrix);
else
context->resolved_gravity = context->base_gravity;
}
@@ -466,7 +469,7 @@ pango_context_get_base_gravity (PangoContext *context)
*
* 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
+ * is %PANGO_GRAVITY_AUTO for which pango_gravity_get_for_matrix() is used
* to return the gravity from the current context matrix.
*
* Return value: the resolved gravity for the context.
@@ -481,6 +484,47 @@ pango_context_get_gravity (PangoContext *context)
return context->resolved_gravity;
}
+/**
+ * pango_context_set_gravity_hint:
+ * @context: a #PangoContext
+ * @hint: the new gravity hint
+ *
+ * Sets the gravity hint for the context.
+ *
+ * The gravity hint is used in laying vertical text out, and is only relevant
+ * if gravity of the context as returned by pango_context_get_gravity()
+ * is set %PANGO_GRAVITY_EAST or %PANGO_GRAVITY_WEST.
+ *
+ * Since: 1.16
+ **/
+void
+pango_context_set_gravity_hint (PangoContext *context,
+ PangoGravityHint hint)
+{
+ g_return_if_fail (context != NULL);
+
+ context->gravity_hint = hint;
+}
+
+/**
+ * pango_context_get_gravity_hint:
+ * @context: a #PangoContext
+ *
+ * Retrieves the gravity hint for the context. See
+ * pango_context_set_gravity_hint() for details.
+ *
+ * Return value: the gravity hint for the context.
+ *
+ * Since: 1.16
+ **/
+PangoGravityHint
+pango_context_get_gravity_hint (PangoContext *context)
+{
+ g_return_val_if_fail (context != NULL, PANGO_GRAVITY_HINT_NATURAL);
+
+ return context->gravity_hint;
+}
+
/**********************************************************************/
static gboolean
@@ -1178,10 +1222,9 @@ itemize_state_update_for_new_run (ItemizeState *state)
{
PangoGravity gravity = state->context->resolved_gravity;
- /* FIXME
- * gravity = pango_script_get_resolved_gravity (script, gravity, hint);
- */
-
+ gravity = pango_gravity_get_for_script (state->script,
+ state->context->resolved_gravity,
+ state->context->gravity_hint);
state->gravity = gravity;
}
diff --git a/pango/pango-context.h b/pango/pango-context.h
index 12a2508a..5cd88404 100644
--- a/pango/pango-context.h
+++ b/pango/pango-context.h
@@ -82,6 +82,9 @@ void pango_context_set_base_gravity (PangoContext
PangoGravity gravity);
PangoGravity pango_context_get_base_gravity (PangoContext *context);
PangoGravity pango_context_get_gravity (PangoContext *context);
+void pango_context_set_gravity_hint (PangoContext *context,
+ PangoGravityHint hint);
+PangoGravityHint pango_context_get_gravity_hint (PangoContext *context);
void pango_context_set_matrix (PangoContext *context,
const PangoMatrix *matrix);
diff --git a/pango/pango-glyph-item-private.h b/pango/pango-glyph-item-private.h
index 245706ad..aa19c3c9 100644
--- a/pango/pango-glyph-item-private.h
+++ b/pango/pango-glyph-item-private.h
@@ -1,4 +1,3 @@
-/* -*- mode: C; c-file-style: "gnu" -*- */
/* Pango
* pango-glyph-item-private.h: Pair of PangoItem and a glyph string; private
* functionality
diff --git a/pango/pango-glyph-item.c b/pango/pango-glyph-item.c
index 65069193..b33e7c4b 100644
--- a/pango/pango-glyph-item.c
+++ b/pango/pango-glyph-item.c
@@ -1,4 +1,3 @@
-/* -*- mode: C; c-file-style: "gnu" -*- */
/* Pango
* pango-glyph-item.c: Pair of PangoItem and a glyph string
*
diff --git a/pango/pango-glyph-item.h b/pango/pango-glyph-item.h
index 3be2b9e6..fec086a4 100644
--- a/pango/pango-glyph-item.h
+++ b/pango/pango-glyph-item.h
@@ -1,4 +1,3 @@
-/* -*- mode: C; c-file-style: "gnu" -*- */
/* Pango
* pango-glyph-item.h: Pair of PangoItem and a glyph string
*
diff --git a/pango/pango-gravity.c b/pango/pango-gravity.c
new file mode 100644
index 00000000..73103134
--- /dev/null
+++ b/pango/pango-gravity.c
@@ -0,0 +1,294 @@
+/* Pango
+ * pango-gravity.c: Gravity routines
+ *
+ * Copyright (C) 2006, 2007 Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <config.h>
+
+#include "pango-gravity.h"
+
+#include <math.h>
+
+/**
+ * pango_gravity_to_rotation:
+ * @gravity: gravity to query
+ *
+ * Converts a #PangoGravity value to its rotation value.
+ * @gravity should not be %PANGO_GRAVITY_AUTO.
+ *
+ * Return value: the rotation value corresponding to @gravity.
+ *
+ * Since: 1.16
+ */
+double
+pango_gravity_to_rotation (PangoGravity gravity)
+{
+ double rotation;
+
+ g_return_val_if_fail (gravity != PANGO_GRAVITY_AUTO, 0);
+
+ switch (gravity)
+ {
+ default:
+ case PANGO_GRAVITY_AUTO: /* shut gcc up */
+ case PANGO_GRAVITY_SOUTH: rotation = 0; break;
+ case PANGO_GRAVITY_NORTH: rotation = G_PI; break;
+ case PANGO_GRAVITY_EAST: rotation = -G_PI_2; break;
+ case PANGO_GRAVITY_WEST: rotation = +G_PI_2; break;
+ }
+
+ return rotation;
+}
+
+/**
+ * pango_gravity_get_for_matrix:
+ * @matrix: a #PangoMatrix
+ *
+ * Finds the gravity that best matches the rotation component
+ * in a #PangoMatrix.
+ *
+ * Return value: the gravity of @matrix, which will never be
+ * %PANGO_GRAVITY_AUTO, or %PANGO_GRAVITY_SOUTH if @matrix is %NULL
+ *
+ * Since: 1.16
+ */
+PangoGravity
+pango_gravity_get_for_matrix (const PangoMatrix *matrix)
+{
+ PangoGravity gravity;
+ double x;
+ double y;
+
+ if (!matrix)
+ return PANGO_GRAVITY_SOUTH;
+
+ x = matrix->xy;
+ y = matrix->yy;
+
+ if (fabs (x) > fabs (y))
+ gravity = x > 0 ? PANGO_GRAVITY_WEST : PANGO_GRAVITY_EAST;
+ else
+ gravity = y < 0 ? PANGO_GRAVITY_NORTH : PANGO_GRAVITY_SOUTH;
+
+ return gravity;
+}
+
+
+
+typedef enum
+{
+ PANGO_VERTICAL_DIRECTION_NONE,
+ PANGO_VERTICAL_DIRECTION_TTB,
+ PANGO_VERTICAL_DIRECTION_BTT
+} PangoVerticalDirection;
+
+typedef struct {
+ /* PangoDirection */
+ guint8 horiz_dir; /* Orientation in horizontal context */
+
+ /* PangoVerticalDirection */
+ guint8 vert_dir; /* Orientation in vertical context */
+
+ /* PangoGravity */
+ guint8 preferred_gravity; /* Preferred context gravity */
+
+ /* gboolean */
+ guint8 upright; /* Whether glyphs are upright or
+ * rotated in foreign context */
+} PangoScriptProperties;
+
+#define NONE PANGO_VERTICAL_DIRECTION_NONE
+#define TTB PANGO_VERTICAL_DIRECTION_TTB
+#define BTT PANGO_VERTICAL_DIRECTION_BTT
+
+#define LTR PANGO_DIRECTION_LTR
+#define RTL PANGO_DIRECTION_RTL
+#define WEAK PANGO_DIRECTION_WEAK_LTR
+
+#define S PANGO_GRAVITY_SOUTH
+#define E PANGO_GRAVITY_EAST
+#define N PANGO_GRAVITY_NORTH
+#define W PANGO_GRAVITY_WEST
+
+const PangoScriptProperties script_properties[] =
+ { /* ISO 15924 code */
+ {LTR, NONE, S, FALSE}, /* Zyyy */
+ {LTR, NONE, S, FALSE}, /* Qaai */
+ {RTL, NONE, S, FALSE}, /* Arab */
+ {LTR, NONE, S, FALSE}, /* Armn */
+ {LTR, NONE, S, FALSE}, /* Beng */
+ {LTR, TTB, E, TRUE }, /* Bopo */
+ {LTR, NONE, S, FALSE}, /* Cher */
+ {LTR, NONE, S, FALSE}, /* Qaac */
+ {LTR, NONE, S, FALSE}, /* Cyrl (Cyrs) */
+ {LTR, NONE, S, FALSE}, /* Dsrt */
+ {LTR, NONE, S, FALSE}, /* Deva */
+ {LTR, NONE, S, FALSE}, /* Ethi */
+ {LTR, NONE, S, FALSE}, /* Geor (Geon, Geoa) */
+ {LTR, NONE, S, FALSE}, /* Goth */
+ {LTR, NONE, S, FALSE}, /* Grek */
+ {LTR, NONE, S, FALSE}, /* Gujr */
+ {LTR, NONE, S, FALSE}, /* Guru */
+ {LTR, TTB, E, TRUE }, /* Hani */
+ {LTR, TTB, E, TRUE }, /* Hang */
+ {RTL, NONE, S, FALSE}, /* Hebr */
+ {LTR, TTB, E, TRUE }, /* Hira */
+ {LTR, NONE, S, FALSE}, /* Knda */
+ {LTR, TTB, E, TRUE }, /* Kana */
+ {LTR, NONE, S, FALSE}, /* Khmr */
+ {LTR, NONE, S, FALSE}, /* Laoo */
+ {LTR, NONE, S, FALSE}, /* Latn (Latf, Latg) */
+ {LTR, NONE, S, FALSE}, /* Mlym */
+ {WEAK,TTB, W, FALSE}, /* Mong */
+ {LTR, NONE, S, FALSE}, /* Mymr */
+ {LTR, BTT, W, FALSE}, /* Ogam */
+ {LTR, NONE, S, FALSE}, /* Ital */
+ {LTR, NONE, S, FALSE}, /* Orya */
+ {LTR, NONE, S, FALSE}, /* Runr */
+ {LTR, NONE, S, FALSE}, /* Sinh */
+ {RTL, NONE, S, FALSE}, /* Syrc (Syrj, Syrn, Syre) */
+ {LTR, NONE, S, FALSE}, /* Taml */
+ {LTR, NONE, S, FALSE}, /* Telu */
+ {RTL, NONE, S, FALSE}, /* Thaa */
+ {LTR, NONE, S, FALSE}, /* Thai */
+ {LTR, NONE, S, FALSE}, /* Tibt */
+ {LTR, NONE, S, FALSE}, /* Cans */
+ {LTR, TTB, S, TRUE }, /* Yiii */
+ {LTR, NONE, S, FALSE}, /* Tglg */
+ {LTR, NONE, S, FALSE}, /* Hano */
+ {LTR, NONE, S, FALSE}, /* Buhd */
+ {LTR, NONE, S, FALSE}, /* Tagb */
+
+ /* Unicode-4.0 additions */
+ {LTR, NONE, S, FALSE}, /* Brai */
+ {LTR, NONE, S, FALSE}, /* Cprt */
+ {LTR, NONE, S, FALSE}, /* Limb */
+ {LTR, NONE, S, FALSE}, /* Osma */
+ {LTR, NONE, S, FALSE}, /* Shaw */
+ {LTR, NONE, S, FALSE}, /* Linb */
+ {LTR, NONE, S, FALSE}, /* Tale */
+ {LTR, NONE, S, FALSE}, /* Ugar */
+
+ /* Unicode-4.1 additions */
+ {LTR, NONE, S, FALSE}, /* Talu */
+ {LTR, NONE, S, FALSE}, /* Bugi */
+ {LTR, NONE, S, FALSE}, /* Glag */
+ {LTR, NONE, S, FALSE}, /* Tfng */
+ {LTR, NONE, S, FALSE}, /* Sylo */
+ {LTR, NONE, S, FALSE}, /* Xpeo */
+ {LTR, NONE, S, FALSE}, /* Khar */
+
+ /* Unicode-5.0 additions */
+ {LTR, NONE, S, FALSE}, /* Zzzz */
+ {LTR, NONE, S, FALSE}, /* Bali */
+ {LTR, NONE, S, FALSE}, /* Xsux */
+ {RTL, NONE, S, FALSE}, /* Phnx */
+ {LTR, NONE, S, FALSE}, /* Phag */
+ {RTL, NONE, S, FALSE} /* Nkoo */
+};
+
+#undef NONE
+#undef TTB
+#undef BTT
+
+#undef LTR
+#undef RTL
+#undef WEAK
+
+#undef S
+#undef E
+#undef N
+#undef W
+
+static PangoScriptProperties
+get_script_properties (PangoScript script)
+{
+ if ((guint)script >= G_N_ELEMENTS (script_properties))
+ script = 0;
+
+ return script_properties[script];
+}
+
+/**
+ * pango_gravity_get_for_script:
+ * @script: #PangoScript to query
+ * @base_gravity: base gravity of the paragraph
+ * @hint: orientation hint
+ *
+ * Based on the script, base gravity, and hint, returns actual gravity
+ * to use in laying out a single #PangoItem.
+ *
+ * If @base_gravity is %PANGO_GRAVITY_AUTO, it is first replaced with the
+ * preferred gravity of @script. To get the preferred gravity of a script,
+ * pass %PANGO_GRAVITY_AUTO and %PANGO_GRAVITY_HINT_STRONG in.
+ *
+ * Return value: resolved gravity suitable to use for a run of text
+ *
+ * Since: 1.16
+ */
+PangoGravity
+pango_gravity_get_for_script (PangoScript script,
+ PangoGravity base_gravity,
+ PangoGravityHint hint)
+{
+ PangoScriptProperties props = get_script_properties (script);
+ gboolean vertical;
+
+
+ if (G_UNLIKELY (base_gravity == PANGO_GRAVITY_AUTO))
+ base_gravity = props.preferred_gravity;
+
+ vertical = PANGO_GRAVITY_IS_VERTICAL (base_gravity);
+
+ /* Everything is designed such that a system with no vertical support
+ * renders everything correctly horizontally. So, if not in a vertical
+ * gravity, base and resolved gravities are always the same.
+ *
+ * If the script should be upright all the time, like Chinese and Japenese,
+ * any base gravity should resolve to itself.
+ */
+ if (G_LIKELY (!vertical || props.upright))
+ return base_gravity;
+
+ /* If here, we have a non-upright script in a vertical gravity setting.
+ * Resolve depending on the hint.
+ */
+ switch (hint)
+ {
+ default:
+ case PANGO_GRAVITY_HINT_NATURAL:
+ if (props.vert_dir == PANGO_VERTICAL_DIRECTION_NONE)
+ return PANGO_GRAVITY_SOUTH;
+ if ((base_gravity == PANGO_GRAVITY_EAST) ^
+ (props.vert_dir == PANGO_VERTICAL_DIRECTION_BTT))
+ return PANGO_GRAVITY_SOUTH;
+ else
+ return PANGO_GRAVITY_NORTH;
+
+ case PANGO_GRAVITY_HINT_STRONG:
+ return base_gravity;
+
+ case PANGO_GRAVITY_HINT_LINE:
+ if ((base_gravity == PANGO_GRAVITY_EAST) ^
+ (props.horiz_dir == PANGO_DIRECTION_RTL))
+ return PANGO_GRAVITY_SOUTH;
+ else
+ return PANGO_GRAVITY_NORTH;
+ }
+}
diff --git a/pango/pango-gravity.h b/pango/pango-gravity.h
new file mode 100644
index 00000000..b79436c5
--- /dev/null
+++ b/pango/pango-gravity.h
@@ -0,0 +1,109 @@
+/* Pango
+ * pango-gravity.h: Gravity routines
+ *
+ * Copyright (C) 2006, 2007 Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __PANGO_GRAVITY_H__
+#define __PANGO_GRAVITY_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+/**
+ * PangoGravity:
+ * @PANGO_GRAVITY_SOUTH: Glyphs stand upright (default)
+ * @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().
+ *
+ * See also: #PangoGravityHint
+ *
+ * Since: 1.16
+ **/
+typedef enum {
+ PANGO_GRAVITY_SOUTH,
+ PANGO_GRAVITY_EAST,
+ PANGO_GRAVITY_NORTH,
+ PANGO_GRAVITY_WEST,
+ PANGO_GRAVITY_AUTO
+} PangoGravity;
+
+/**
+ * PangoGravityHint:
+ * @PANGO_GRAVITY_HINT_NATURAL: scripts will take their natural gravity based
+ * on the base gravity and the script. This is the default.
+ * @PANGO_GRAVITY_HINT_STRONG: always use the base gravity set, regardless of
+ * the script.
+ * @PANGO_GRAVITY_HINT_LINE: for scripts not in their natural direction (eg.
+ * Latin in East gravity), choose per-script gravity such that every script
+ * respects the line progression. This means, Latin and Arabic will take
+ * opposite gravities and both flow top-to-bottom for example.
+ *
+ * The #PangoGravityHint defines how horizontal scripts should behave in a
+ * vertical context. That is, English excerpt in a vertical paragraph for
+ * example.
+ *
+ * See #PangoGravity.
+ *
+ * Since: 1.16
+ **/
+typedef enum {
+ PANGO_GRAVITY_HINT_NATURAL,
+ PANGO_GRAVITY_HINT_STRONG,
+ PANGO_GRAVITY_HINT_LINE
+} PangoGravityHint;
+
+/**
+ * PANGO_GRAVITY_IS_VERTICAL:
+ * @gravity: the #PangoGravity to check
+ *
+ * Whether a #PangoGravity represents vertical writing directions.
+ *
+ * Returns: %TRUE if @gravity is %PANGO_GRAVITY_EAST or %PANGO_GRAVITY_WEST,
+ * %FALSE otherwise.
+ *
+ * Since: 1.16
+ **/
+#define PANGO_GRAVITY_IS_VERTICAL(gravity) \
+ ((gravity) == PANGO_GRAVITY_EAST || (gravity) == PANGO_GRAVITY_WEST)
+
+#include <pango/pango-matrix.h>
+#include <pango/pango-script.h>
+
+double pango_gravity_to_rotation (PangoGravity gravity) G_GNUC_CONST;
+PangoGravity pango_gravity_get_for_matrix (const PangoMatrix *matrix);
+PangoGravity pango_gravity_get_for_script (PangoScript script,
+ PangoGravity base_gravity,
+ PangoGravityHint hint) G_GNUC_CONST;
+
+
+G_END_DECLS
+
+#endif /* __PANGO_GRAVITY_H__ */
diff --git a/pango/pango-layout.c b/pango/pango-layout.c
index eab30f8a..52b9dccf 100644
--- a/pango/pango-layout.c
+++ b/pango/pango-layout.c
@@ -1,7 +1,7 @@
/* Pango
* pango-layout.c: High-level layout driver
*
- * Copyright (C) 2000, 2001 Red Hat Software
+ * Copyright (C) 2000, 2001, 2006 Red Hat Software
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -3138,6 +3138,7 @@ line_set_resolved_dir (PangoLayoutLine *line,
{
switch (direction)
{
+ default:
case PANGO_DIRECTION_LTR:
case PANGO_DIRECTION_TTB_RTL:
case PANGO_DIRECTION_WEAK_LTR:
@@ -3166,8 +3167,9 @@ line_set_resolved_dir (PangoLayoutLine *line,
*/
switch (pango_context_get_gravity (line->layout->context))
{
- case PANGO_GRAVITY_SOUTH:
default:
+ case PANGO_GRAVITY_AUTO:
+ case PANGO_GRAVITY_SOUTH:
break;
case PANGO_GRAVITY_NORTH:
line->resolved_dir = PANGO_DIRECTION_LTR
diff --git a/pango/pango-matrix.c b/pango/pango-matrix.c
index 857cc977..907cc7ea 100644
--- a/pango/pango-matrix.c
+++ b/pango/pango-matrix.c
@@ -1,7 +1,7 @@
/* Pango
* pango-matrix.c: Matrix manipulation routines
*
- * Copyright (C) 2000 Red Hat Software
+ * Copyright (C) 2000, 2006 Red Hat Software
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
@@ -23,7 +23,7 @@
#include <stdlib.h>
#include <math.h>
-#include "pango-types.h"
+#include "pango-matrix.h"
#include "pango-impl-utils.h"
GType
@@ -251,39 +251,6 @@ pango_matrix_get_font_scale_factor (const PangoMatrix *matrix)
}
/**
- * pango_matrix_to_gravity:
- * @matrix: a #PangoMatrix
- *
- * Finds the gravity that best matches the rotation component
- * in a #PangoMatrix.
- *
- * Return value: the gravity of @matrix, which will never be
- * %PANGO_GRAVITY_AUTO, or PANGO_GRAVITY_SOUTH if @matrix is %NULL
- *
- * Since: 1.16
- */
-PangoGravity
-pango_matrix_to_gravity (const PangoMatrix *matrix)
-{
- PangoGravity gravity;
- 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;
- else
- gravity = y < 0 ? PANGO_GRAVITY_NORTH : PANGO_GRAVITY_SOUTH;
-
- return gravity;
-}
-
-/**
* pango_matrix_transform_distance:
* @matrix: a #PangoMatrix, or %NULL
* @dx: in/out X component of a distance vector
diff --git a/pango/pango-matrix.h b/pango/pango-matrix.h
new file mode 100644
index 00000000..2b746c4f
--- /dev/null
+++ b/pango/pango-matrix.h
@@ -0,0 +1,115 @@
+/* Pango
+ * pango-matrix.h: Matrix manipulation routines
+ *
+ * Copyright (C) 2002, 2006 Red Hat Software
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <glib.h>
+
+#ifndef __PANGO_MATRIX_H__
+#define __PANGO_MATRIX_H__
+
+G_BEGIN_DECLS
+
+typedef struct _PangoMatrix PangoMatrix;
+
+/**
+ * PangoMatrix:
+ * @xx: 1st component of the transformation matrix
+ * @xy: 2nd component of the transformation matrix
+ * @yx: 3rd component of the transformation matrix
+ * @yy: 4th component of the transformation matrix
+ * @x0: x translation
+ * @y0: y translation
+ *
+ * A structure specifying a transformation between user-space
+ * coordinates and device coordinates. The transformation
+ * is given by
+ *
+ * <programlisting>
+ * x_device = x_user * matrix->xx + y_user * matrix->xy + matrix->x0;
+ * y_device = x_user * matrix->yx + y_user * matrix->yy + matrix->y0;
+ * </programlisting>
+ *
+ * Since: 1.6
+ **/
+struct _PangoMatrix
+{
+ double xx;
+ double xy;
+ double yx;
+ double yy;
+ double x0;
+ double y0;
+};
+
+/**
+ * PANGO_TYPE_MATRIX
+ *
+ * The GObject type for #PangoMatrix
+ **/
+#define PANGO_TYPE_MATRIX (pango_matrix_get_type ())
+
+/**
+ * PANGO_MATRIX_INIT
+ *
+ * Constant that can be used to initialize a PangoMatrix to
+ * the identity transform.
+ *
+ * <informalexample><programlisting>
+ * PangoMatrix matrix = PANGO_MATRIX_INIT;
+ * pango_matrix_rotate (&amp;matrix, 45.);
+ * </programlisting></informalexample>
+ *
+ * Since: 1.6
+ **/
+#define PANGO_MATRIX_INIT { 1., 0., 0., 1., 0., 0. }
+
+#include <pango/pango-types.h>
+
+GType pango_matrix_get_type (void);
+
+PangoMatrix *pango_matrix_copy (const PangoMatrix *matrix);
+void pango_matrix_free (PangoMatrix *matrix);
+
+void pango_matrix_translate (PangoMatrix *matrix,
+ double tx,
+ double ty);
+void pango_matrix_scale (PangoMatrix *matrix,
+ double scale_x,
+ double scale_y);
+void pango_matrix_rotate (PangoMatrix *matrix,
+ double degrees);
+void pango_matrix_concat (PangoMatrix *matrix,
+ const PangoMatrix *new_matrix);
+void pango_matrix_transform_point (const PangoMatrix *matrix,
+ double *x,
+ double *y);
+void pango_matrix_transform_distance (const PangoMatrix *matrix,
+ double *dx,
+ double *dy);
+void pango_matrix_transform_rectangle (const PangoMatrix *matrix,
+ PangoRectangle *rect);
+void pango_matrix_transform_pixel_rectangle (const PangoMatrix *matrix,
+ PangoRectangle *rect);
+double pango_matrix_get_font_scale_factor (const PangoMatrix *matrix);
+
+
+G_END_DECLS
+
+#endif /* __PANGO_MATRIX_H__ */
diff --git a/pango/pango-script.c b/pango/pango-script.c
index 67133bac..130309ff 100644
--- a/pango/pango-script.c
+++ b/pango/pango-script.c
@@ -1,4 +1,3 @@
-/* -*- mode: C; c-file-style: "gnu" -*- */
/* Pango
* pango-script.c: Script tag handling
*
diff --git a/pango/pango-script.h b/pango/pango-script.h
index ee1859d0..e152a695 100644
--- a/pango/pango-script.h
+++ b/pango/pango-script.h
@@ -1,4 +1,3 @@
-/* -*- mode: C; c-file-style: "gnu" -*- */
/* Pango
* pango-script.h: Script tag handling
*
@@ -25,13 +24,11 @@
#include <glib.h>
-#include <pango/pango-types.h>
-
G_BEGIN_DECLS
/**
* PangoScriptIter:
-
+ *
* A #PangoScriptIter is used to iterate through a string
* and identify ranges in different scripts.
**/
@@ -114,6 +111,8 @@ typedef enum { /* ISO 15924 code */
PANGO_SCRIPT_NKO /* Nkoo */
} PangoScript;
+#include <pango/pango-types.h>
+
PangoScript pango_script_for_unichar (gunichar ch);
PangoScriptIter *pango_script_iter_new (const char *text,
diff --git a/pango/pango-types.h b/pango/pango-types.h
index 75c31278..45f76e40 100644
--- a/pango/pango-types.h
+++ b/pango/pango-types.h
@@ -35,7 +35,6 @@ typedef struct _PangoEngineShape PangoEngineShape;
typedef struct _PangoFont PangoFont;
typedef struct _PangoFontMap PangoFontMap;
-typedef struct _PangoMatrix PangoMatrix;
typedef struct _PangoRectangle PangoRectangle;
@@ -147,118 +146,9 @@ gboolean pango_get_mirror_char (gunichar ch,
#endif
-
-/**
- * PangoGravity:
- * @PANGO_GRAVITY_SOUTH: Glyphs stand upright (default)
- * @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
- **/
-typedef enum {
- PANGO_GRAVITY_SOUTH,
- PANGO_GRAVITY_EAST,
- PANGO_GRAVITY_NORTH,
- PANGO_GRAVITY_WEST,
- PANGO_GRAVITY_AUTO
-} PangoGravity;
-
-double pango_gravity_to_rotation (PangoGravity gravity) G_GNUC_CONST;
-
-
-
-/**
- * PangoMatrix:
- * @xx: 1st component of the transformation matrix
- * @xy: 2nd component of the transformation matrix
- * @yx: 3rd component of the transformation matrix
- * @yy: 4th component of the transformation matrix
- * @x0: x translation
- * @y0: y translation
- *
- * A structure specifying a transformation between user-space
- * coordinates and device coordinates. The transformation
- * is given by
- *
- * <programlisting>
- * x_device = x_user * matrix->xx + y_user * matrix->xy + matrix->x0;
- * y_device = x_user * matrix->yx + y_user * matrix->yy + matrix->y0;
- * </programlisting>
- *
- * Since: 1.6
- **/
-struct _PangoMatrix
-{
- double xx;
- double xy;
- double yx;
- double yy;
- double x0;
- double y0;
-};
-
-/**
- * PANGO_TYPE_MATRIX
- *
- * The GObject type for #PangoMatrix
- **/
-#define PANGO_TYPE_MATRIX (pango_matrix_get_type ())
-
-/**
- * PANGO_MATRIX_INIT
- *
- * Constant that can be used to initialize a PangoMatrix to
- * the identity transform.
- *
- * <informalexample><programlisting>
- * PangoMatrix matrix = PANGO_MATRIX_INIT;
- * pango_matrix_rotate (&amp;matrix, 45.);
- * </programlisting></informalexample>
- *
- * Since: 1.6
- **/
-#define PANGO_MATRIX_INIT { 1., 0., 0., 1., 0., 0. }
-
-GType pango_matrix_get_type (void);
-
-PangoMatrix *pango_matrix_copy (const PangoMatrix *matrix);
-void pango_matrix_free (PangoMatrix *matrix);
-
-void pango_matrix_translate (PangoMatrix *matrix,
- double tx,
- double ty);
-void pango_matrix_scale (PangoMatrix *matrix,
- double scale_x,
- double scale_y);
-void pango_matrix_rotate (PangoMatrix *matrix,
- double degrees);
-void pango_matrix_concat (PangoMatrix *matrix,
- const PangoMatrix *new_matrix);
-void pango_matrix_transform_point (const PangoMatrix *matrix,
- double *x,
- double *y);
-void pango_matrix_transform_distance (const PangoMatrix *matrix,
- double *dx,
- double *dy);
-void pango_matrix_transform_rectangle (const PangoMatrix *matrix,
- PangoRectangle *rect);
-void pango_matrix_transform_pixel_rectangle (const PangoMatrix *matrix,
- PangoRectangle *rect);
-double pango_matrix_get_font_scale_factor (const PangoMatrix *matrix);
-PangoGravity pango_matrix_to_gravity (const PangoMatrix *matrix);
-
+#include <pango/pango-matrix.h>
+#include <pango/pango-script.h>
+#include <pango/pango-gravity.h>
G_END_DECLS
diff --git a/pango/pango-utils.c b/pango/pango-utils.c
index 211b99a3..ce778a8f 100644
--- a/pango/pango-utils.c
+++ b/pango/pango-utils.c
@@ -1,4 +1,4 @@
- /* Pango
+/* Pango
* pango-utils.c: Utilities for internal functions and modules
*
* Copyright (C) 2000 Red Hat Software
@@ -1832,34 +1832,6 @@ pango_quantize_line_geometry (int *thickness,
}
/**
- * pango_gravity_to_rotation:
- * @gravity: gravity to query
- *
- * Converts a #PangoGravity value to its rotation value.
- *
- * Return value: the rotation value corresponding to @gravity,
- * or zero if @gravity is %PANGO_GRAVITY_AUTO
- *
- * Since: 1.16
- */
-double
-pango_gravity_to_rotation (PangoGravity gravity)
-{
- double rotation;
-
- switch (gravity)
- {
- default:
- case PANGO_GRAVITY_SOUTH: rotation = 0; break;
- case PANGO_GRAVITY_NORTH: rotation = G_PI; break;
- case PANGO_GRAVITY_EAST: rotation = -G_PI_2; break;
- case PANGO_GRAVITY_WEST: rotation = +G_PI_2; break;
- }
-
- return rotation;
-}
-
-/**
* pango_units_from_double:
* @d: double floating-point value
*
diff --git a/pango/pango.def b/pango/pango.def
index 14a591e3..dd37bf94 100644
--- a/pango/pango.def
+++ b/pango/pango.def
@@ -56,6 +56,7 @@ EXPORTS
pango_context_get_font_description
pango_context_get_font_map
pango_context_get_gravity
+ pango_context_get_gravity_hint
pango_context_get_language
pango_context_get_matrix
pango_context_get_metrics
@@ -68,6 +69,7 @@ EXPORTS
pango_context_set_base_gravity
pango_context_set_font_description
pango_context_set_font_map
+ pango_context_set_gravity_hint
pango_context_set_language
pango_context_set_matrix
pango_coverage_copy
@@ -184,7 +186,10 @@ EXPORTS
pango_glyph_string_new
pango_glyph_string_set_size
pango_glyph_string_x_to_index
+ pango_gravity_get_for_matrix
+ pango_gravity_get_for_script
pango_gravity_get_type
+ pango_gravity_hint_get_type
pango_gravity_to_rotation
pango_is_zero_width
pango_item_copy
@@ -287,7 +292,6 @@ EXPORTS
pango_matrix_get_type
pango_matrix_rotate
pango_matrix_scale
- pango_matrix_to_gravity
pango_matrix_transform_distance
pango_matrix_transform_pixel_rectangle
pango_matrix_transform_point
diff --git a/pango/pango.h b/pango/pango.h
index b87d22f7..5b5ef1e4 100644
--- a/pango/pango.h
+++ b/pango/pango.h
@@ -34,8 +34,10 @@
#include <pango/pango-fontset.h>
#include <pango/pango-glyph.h>
#include <pango/pango-glyph-item.h>
+#include <pango/pango-gravity.h>
#include <pango/pango-item.h>
#include <pango/pango-layout.h>
+#include <pango/pango-matrix.h>
#include <pango/pango-renderer.h>
#include <pango/pango-script.h>
#include <pango/pango-tabs.h>