Blame pango/pango-gravity.c

Packit 0ec9dd
/* Pango
Packit 0ec9dd
 * pango-gravity.c: Gravity routines
Packit 0ec9dd
 *
Packit 0ec9dd
 * Copyright (C) 2006, 2007 Red Hat Software
Packit 0ec9dd
 *
Packit 0ec9dd
 * This library is free software; you can redistribute it and/or
Packit 0ec9dd
 * modify it under the terms of the GNU Library General Public
Packit 0ec9dd
 * License as published by the Free Software Foundation; either
Packit 0ec9dd
 * version 2 of the License, or (at your option) any later version.
Packit 0ec9dd
 *
Packit 0ec9dd
 * This library is distributed in the hope that it will be useful,
Packit 0ec9dd
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 0ec9dd
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
Packit 0ec9dd
 * Library General Public License for more details.
Packit 0ec9dd
 *
Packit 0ec9dd
 * You should have received a copy of the GNU Library General Public
Packit 0ec9dd
 * License along with this library; if not, write to the
Packit 0ec9dd
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit 0ec9dd
 * Boston, MA 02111-1307, USA.
Packit 0ec9dd
 */
Packit 0ec9dd
Packit 0ec9dd
/**
Packit 0ec9dd
 * SECTION:vertical
Packit 0ec9dd
 * @short_description:Laying text out in vertical directions
Packit 0ec9dd
 * @title:Vertical Text
Packit 0ec9dd
 * @see_also: pango_context_get_base_gravity(),
Packit 0ec9dd
 * pango_context_set_base_gravity(),
Packit 0ec9dd
 * pango_context_get_gravity(),
Packit 0ec9dd
 * pango_context_get_gravity_hint(),
Packit 0ec9dd
 * pango_context_set_gravity_hint(),
Packit 0ec9dd
 * pango_font_description_set_gravity(),
Packit 0ec9dd
 * pango_font_description_get_gravity(),
Packit 0ec9dd
 * pango_attr_gravity_new(),
Packit 0ec9dd
 * pango_attr_gravity_hint_new()
Packit 0ec9dd
 *
Packit 0ec9dd
 * Since 1.16, Pango is able to correctly lay vertical text out.  In fact, it can
Packit 0ec9dd
 * set layouts of mixed vertical and non-vertical text.  This section describes
Packit 0ec9dd
 * the types used for setting vertical text parameters.
Packit 0ec9dd
 *
Packit 0ec9dd
 * The way this is implemented is through the concept of
Packit 0ec9dd
 * <firstterm>gravity</firstterm>.  Gravity of normal Latin text is south.  A
Packit 0ec9dd
 * gravity value of east means that glyphs will be rotated ninety degrees
Packit 0ec9dd
 * counterclockwise.  So, to render vertical text one needs to set the gravity
Packit 0ec9dd
 * and rotate the layout using the matrix machinery already in place.  This has
Packit 0ec9dd
 * the huge advantage that most algorithms working on a #PangoLayout do not need
Packit 0ec9dd
 * any change as the assumption that lines run in the X direction and stack in
Packit 0ec9dd
 * the Y direction holds even for vertical text layouts.
Packit 0ec9dd
 *
Packit 0ec9dd
 * Applications should only need to set base gravity on #PangoContext in use, and
Packit 0ec9dd
 * let Pango decide the gravity assigned to each run of text.  This automatically
Packit 0ec9dd
 * handles text with mixed scripts.  A very common use is to set the context base
Packit 0ec9dd
 * gravity to auto using pango_context_set_base_gravity()
Packit 0ec9dd
 * and rotate the layout normally.  Pango will make sure that
Packit 0ec9dd
 * Asian languages take the right form, while other scripts are rotated normally.
Packit 0ec9dd
 *
Packit 0ec9dd
 * The correct way to set gravity on a layout is to set it on the context
Packit 0ec9dd
 * associated with it using pango_context_set_base_gravity().  The context
Packit 0ec9dd
 * of a layout can be accessed using pango_layout_get_context().  The currently
Packit 0ec9dd
 * set base gravity of the context can be accessed using
Packit 0ec9dd
 * pango_context_get_base_gravity() and the <firstterm>resolved</firstterm>
Packit 0ec9dd
 * gravity of it using pango_context_get_gravity().  The resolved gravity is
Packit 0ec9dd
 * the same as the base gravity for the most part, except that if the base
Packit 0ec9dd
 * gravity is set to %PANGO_GRAVITY_AUTO, the resolved gravity will depend
Packit 0ec9dd
 * on the current matrix set on context, and is derived using
Packit 0ec9dd
 * pango_gravity_get_for_matrix().
Packit 0ec9dd
 *
Packit 0ec9dd
 * The next thing an application may want to set on the context is the
Packit 0ec9dd
 * <firstterm>gravity hint</firstterm>.  A #PangoGravityHint instructs how
Packit 0ec9dd
 * different scripts should react to the set base gravity.
Packit 0ec9dd
 *
Packit 0ec9dd
 * Font descriptions have a gravity property too, that can be set using
Packit 0ec9dd
 * pango_font_description_set_gravity() and accessed using
Packit 0ec9dd
 * pango_font_description_get_gravity().  However, those are rarely useful
Packit 0ec9dd
 * from application code and are mainly used by #PangoLayout internally.
Packit 0ec9dd
 *
Packit 0ec9dd
 * Last but not least, one can create #PangoAttributes for gravity
Packit 0ec9dd
 * and gravity hint using pango_attr_gravity_new() and
Packit 0ec9dd
 * pango_attr_gravity_hint_new().
Packit 0ec9dd
 */
Packit 0ec9dd
#include "config.h"
Packit 0ec9dd
Packit 0ec9dd
#include "pango-gravity.h"
Packit 0ec9dd
Packit 0ec9dd
#include <math.h>
Packit 0ec9dd
Packit 0ec9dd
/**
Packit 0ec9dd
 * pango_gravity_to_rotation:
Packit 0ec9dd
 * @gravity: gravity to query
Packit 0ec9dd
 *
Packit 0ec9dd
 * Converts a #PangoGravity value to its natural rotation in radians.
Packit 0ec9dd
 * @gravity should not be %PANGO_GRAVITY_AUTO.
Packit 0ec9dd
 *
Packit 0ec9dd
 * Note that pango_matrix_rotate() takes angle in degrees, not radians.
Packit 0ec9dd
 * So, to call pango_matrix_rotate() with the output of this function
Packit 0ec9dd
 * you should multiply it by (180. / G_PI).
Packit 0ec9dd
 *
Packit 0ec9dd
 * Return value: the rotation value corresponding to @gravity.
Packit 0ec9dd
 *
Packit 0ec9dd
 * Since: 1.16
Packit 0ec9dd
 */
Packit 0ec9dd
double
Packit 0ec9dd
pango_gravity_to_rotation (PangoGravity gravity)
Packit 0ec9dd
{
Packit 0ec9dd
  double rotation;
Packit 0ec9dd
Packit 0ec9dd
  g_return_val_if_fail (gravity != PANGO_GRAVITY_AUTO, 0);
Packit 0ec9dd
Packit 0ec9dd
  switch (gravity)
Packit 0ec9dd
    {
Packit 0ec9dd
      default:
Packit 0ec9dd
      case PANGO_GRAVITY_AUTO: /* shut gcc up */
Packit 0ec9dd
      case PANGO_GRAVITY_SOUTH:	rotation =  0;		break;
Packit 0ec9dd
      case PANGO_GRAVITY_NORTH:	rotation =  G_PI;	break;
Packit 0ec9dd
      case PANGO_GRAVITY_EAST:	rotation = -G_PI_2;	break;
Packit 0ec9dd
      case PANGO_GRAVITY_WEST:	rotation = +G_PI_2;	break;
Packit 0ec9dd
    }
Packit 0ec9dd
Packit 0ec9dd
  return rotation;
Packit 0ec9dd
}
Packit 0ec9dd
Packit 0ec9dd
/**
Packit 0ec9dd
 * pango_gravity_get_for_matrix:
Packit 0ec9dd
 * @matrix: (nullable): a #PangoMatrix
Packit 0ec9dd
 *
Packit 0ec9dd
 * Finds the gravity that best matches the rotation component
Packit 0ec9dd
 * in a #PangoMatrix.
Packit 0ec9dd
 *
Packit 0ec9dd
 * Return value: the gravity of @matrix, which will never be
Packit 0ec9dd
 * %PANGO_GRAVITY_AUTO, or %PANGO_GRAVITY_SOUTH if @matrix is %NULL
Packit 0ec9dd
 *
Packit 0ec9dd
 * Since: 1.16
Packit 0ec9dd
 */
Packit 0ec9dd
PangoGravity
Packit 0ec9dd
pango_gravity_get_for_matrix (const PangoMatrix *matrix)
Packit 0ec9dd
{
Packit 0ec9dd
  PangoGravity gravity;
Packit 0ec9dd
  double x;
Packit 0ec9dd
  double y;
Packit 0ec9dd
Packit 0ec9dd
  if (!matrix)
Packit 0ec9dd
    return PANGO_GRAVITY_SOUTH;
Packit 0ec9dd
Packit 0ec9dd
  x = matrix->xy;
Packit 0ec9dd
  y = matrix->yy;
Packit 0ec9dd
Packit 0ec9dd
  if (fabs (x) > fabs (y))
Packit 0ec9dd
    gravity = x > 0 ? PANGO_GRAVITY_WEST : PANGO_GRAVITY_EAST;
Packit 0ec9dd
  else
Packit 0ec9dd
    gravity = y < 0 ? PANGO_GRAVITY_NORTH : PANGO_GRAVITY_SOUTH;
Packit 0ec9dd
Packit 0ec9dd
  return gravity;
Packit 0ec9dd
}
Packit 0ec9dd
Packit 0ec9dd
Packit 0ec9dd
Packit 0ec9dd
typedef enum
Packit 0ec9dd
{
Packit 0ec9dd
  PANGO_VERTICAL_DIRECTION_NONE,
Packit 0ec9dd
  PANGO_VERTICAL_DIRECTION_TTB,
Packit 0ec9dd
  PANGO_VERTICAL_DIRECTION_BTT
Packit 0ec9dd
} PangoVerticalDirection;
Packit 0ec9dd
Packit 0ec9dd
typedef struct {
Packit 0ec9dd
  /* PangoDirection */
Packit 0ec9dd
  guint8 horiz_dir;		/* Orientation in horizontal context */
Packit 0ec9dd
Packit 0ec9dd
  /* PangoVerticalDirection */
Packit 0ec9dd
  guint8 vert_dir;		/* Orientation in vertical context */
Packit 0ec9dd
Packit 0ec9dd
  /* PangoGravity */
Packit 0ec9dd
  guint8 preferred_gravity;	/* Preferred context gravity */
Packit 0ec9dd
Packit 0ec9dd
  /* gboolean */
Packit 0ec9dd
  guint8 wide;			/* Whether script is mostly wide.
Packit 0ec9dd
				 * Wide characters are upright (ie.
Packit 0ec9dd
				 * not rotated) in foreign context */
Packit 0ec9dd
} PangoScriptProperties;
Packit 0ec9dd
Packit 0ec9dd
#define NONE PANGO_VERTICAL_DIRECTION_NONE
Packit 0ec9dd
#define TTB  PANGO_VERTICAL_DIRECTION_TTB
Packit 0ec9dd
#define BTT  PANGO_VERTICAL_DIRECTION_BTT
Packit 0ec9dd
Packit 0ec9dd
#define LTR  PANGO_DIRECTION_LTR
Packit 0ec9dd
#define RTL  PANGO_DIRECTION_RTL
Packit 0ec9dd
#define WEAK PANGO_DIRECTION_WEAK_LTR
Packit 0ec9dd
Packit 0ec9dd
#define S PANGO_GRAVITY_SOUTH
Packit 0ec9dd
#define E PANGO_GRAVITY_EAST
Packit 0ec9dd
#define W PANGO_GRAVITY_WEST
Packit 0ec9dd
Packit 0ec9dd
const PangoScriptProperties script_properties[] =
Packit 0ec9dd
  {				/* ISO 15924 code */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Zyyy */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Qaai */
Packit 0ec9dd
      {RTL, NONE, S, FALSE},	/* Arab */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Armn */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Beng */
Packit 0ec9dd
      {LTR, TTB,  E, TRUE },	/* Bopo */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Cher */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Qaac */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Cyrl (Cyrs) */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Dsrt */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Deva */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Ethi */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Geor (Geon, Geoa) */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Goth */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Grek */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Gujr */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Guru */
Packit 0ec9dd
      {LTR, TTB,  E, TRUE },	/* Hani */
Packit 0ec9dd
      {LTR, TTB,  E, TRUE },	/* Hang */
Packit 0ec9dd
      {RTL, NONE, S, FALSE},	/* Hebr */
Packit 0ec9dd
      {LTR, TTB,  E, TRUE },	/* Hira */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Knda */
Packit 0ec9dd
      {LTR, TTB,  E, TRUE },	/* Kana */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Khmr */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Laoo */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Latn (Latf, Latg) */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Mlym */
Packit 0ec9dd
      {WEAK,TTB,  W, FALSE},	/* Mong */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Mymr */
Packit 0ec9dd
      {LTR, BTT,  W, FALSE},	/* Ogam */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Ital */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Orya */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Runr */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Sinh */
Packit 0ec9dd
      {RTL, NONE, S, FALSE},	/* Syrc (Syrj, Syrn, Syre) */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Taml */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Telu */
Packit 0ec9dd
      {RTL, NONE, S, FALSE},	/* Thaa */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Thai */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Tibt */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Cans */
Packit 0ec9dd
      {LTR, TTB,  S, TRUE },	/* Yiii */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Tglg */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Hano */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Buhd */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Tagb */
Packit 0ec9dd
Packit 0ec9dd
      /* Unicode-4.0 additions */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Brai */
Packit 0ec9dd
      {RTL, NONE, S, FALSE},	/* Cprt */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Limb */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Osma */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Shaw */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Linb */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Tale */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Ugar */
Packit 0ec9dd
Packit 0ec9dd
      /* Unicode-4.1 additions */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Talu */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Bugi */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Glag */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Tfng */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Sylo */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Xpeo */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Khar */
Packit 0ec9dd
Packit 0ec9dd
      /* Unicode-5.0 additions */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Zzzz */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Bali */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Xsux */
Packit 0ec9dd
      {RTL, NONE, S, FALSE},	/* Phnx */
Packit 0ec9dd
      {LTR, NONE, S, FALSE},	/* Phag */
Packit 0ec9dd
      {RTL, NONE, S, FALSE}	/* Nkoo */
Packit 0ec9dd
};
Packit 0ec9dd
Packit 0ec9dd
#undef NONE
Packit 0ec9dd
#undef TTB
Packit 0ec9dd
#undef BTT
Packit 0ec9dd
Packit 0ec9dd
#undef LTR
Packit 0ec9dd
#undef RTL
Packit 0ec9dd
#undef WEAK
Packit 0ec9dd
Packit 0ec9dd
#undef S
Packit 0ec9dd
#undef E
Packit 0ec9dd
#undef N
Packit 0ec9dd
#undef W
Packit 0ec9dd
Packit 0ec9dd
static PangoScriptProperties
Packit 0ec9dd
get_script_properties (PangoScript script)
Packit 0ec9dd
{
Packit 0ec9dd
  g_return_val_if_fail (script >= 0, script_properties[0]);
Packit 0ec9dd
Packit 0ec9dd
  if ((guint)script >= G_N_ELEMENTS (script_properties))
Packit 0ec9dd
    return script_properties[0];
Packit 0ec9dd
Packit 0ec9dd
  return script_properties[script];
Packit 0ec9dd
}
Packit 0ec9dd
Packit 0ec9dd
/**
Packit 0ec9dd
 * pango_gravity_get_for_script:
Packit 0ec9dd
 * @script: #PangoScript to query
Packit 0ec9dd
 * @base_gravity: base gravity of the paragraph
Packit 0ec9dd
 * @hint: orientation hint
Packit 0ec9dd
 *
Packit 0ec9dd
 * Based on the script, base gravity, and hint, returns actual gravity
Packit 0ec9dd
 * to use in laying out a single #PangoItem.
Packit 0ec9dd
 *
Packit 0ec9dd
 * If @base_gravity is %PANGO_GRAVITY_AUTO, it is first replaced with the
Packit 0ec9dd
 * preferred gravity of @script.  To get the preferred gravity of a script,
Packit 0ec9dd
 * pass %PANGO_GRAVITY_AUTO and %PANGO_GRAVITY_HINT_STRONG in.
Packit 0ec9dd
 *
Packit 0ec9dd
 * Return value: resolved gravity suitable to use for a run of text
Packit 0ec9dd
 * with @script.
Packit 0ec9dd
 *
Packit 0ec9dd
 * Since: 1.16
Packit 0ec9dd
 */
Packit 0ec9dd
PangoGravity
Packit 0ec9dd
pango_gravity_get_for_script (PangoScript      script,
Packit 0ec9dd
			      PangoGravity     base_gravity,
Packit 0ec9dd
			      PangoGravityHint hint)
Packit 0ec9dd
{
Packit 0ec9dd
  PangoScriptProperties props = get_script_properties (script);
Packit 0ec9dd
Packit 0ec9dd
  if (G_UNLIKELY (base_gravity == PANGO_GRAVITY_AUTO))
Packit 0ec9dd
    base_gravity = props.preferred_gravity;
Packit 0ec9dd
Packit 0ec9dd
  return pango_gravity_get_for_script_and_width (script, props.wide,
Packit 0ec9dd
						 base_gravity, hint);
Packit 0ec9dd
}
Packit 0ec9dd
Packit 0ec9dd
/**
Packit 0ec9dd
 * pango_gravity_get_for_script_and_width:
Packit 0ec9dd
 * @script: #PangoScript to query
Packit 0ec9dd
 * @wide: %TRUE for wide characters as returned by g_unichar_iswide()
Packit 0ec9dd
 * @base_gravity: base gravity of the paragraph
Packit 0ec9dd
 * @hint: orientation hint
Packit 0ec9dd
 *
Packit 0ec9dd
 * Based on the script, East Asian width, base gravity, and hint,
Packit 0ec9dd
 * returns actual gravity to use in laying out a single character
Packit 0ec9dd
 * or #PangoItem.
Packit 0ec9dd
 *
Packit 0ec9dd
 * This function is similar to pango_gravity_get_for_script() except
Packit 0ec9dd
 * that this function makes a distinction between narrow/half-width and
Packit 0ec9dd
 * wide/full-width characters also.  Wide/full-width characters always
Packit 0ec9dd
 * stand <emphasis>upright</emphasis>, that is, they always take the base gravity,
Packit 0ec9dd
 * whereas narrow/full-width characters are always rotated in vertical
Packit 0ec9dd
 * context.
Packit 0ec9dd
 *
Packit 0ec9dd
 * If @base_gravity is %PANGO_GRAVITY_AUTO, it is first replaced with the
Packit 0ec9dd
 * preferred gravity of @script.
Packit 0ec9dd
 *
Packit 0ec9dd
 * Return value: resolved gravity suitable to use for a run of text
Packit 0ec9dd
 * with @script and @wide.
Packit 0ec9dd
 *
Packit 0ec9dd
 * Since: 1.26
Packit 0ec9dd
 */
Packit 0ec9dd
PangoGravity
Packit 0ec9dd
pango_gravity_get_for_script_and_width (PangoScript        script,
Packit 0ec9dd
					gboolean           wide,
Packit 0ec9dd
					PangoGravity       base_gravity,
Packit 0ec9dd
					PangoGravityHint   hint)
Packit 0ec9dd
{
Packit 0ec9dd
  PangoScriptProperties props = get_script_properties (script);
Packit 0ec9dd
  gboolean vertical;
Packit 0ec9dd
Packit 0ec9dd
Packit 0ec9dd
  if (G_UNLIKELY (base_gravity == PANGO_GRAVITY_AUTO))
Packit 0ec9dd
    base_gravity = props.preferred_gravity;
Packit 0ec9dd
Packit 0ec9dd
  vertical = PANGO_GRAVITY_IS_VERTICAL (base_gravity);
Packit 0ec9dd
Packit 0ec9dd
  /* Everything is designed such that a system with no vertical support
Packit 0ec9dd
   * renders everything correctly horizontally.  So, if not in a vertical
Packit 0ec9dd
   * gravity, base and resolved gravities are always the same.
Packit 0ec9dd
   *
Packit 0ec9dd
   * Wide characters are always upright.
Packit 0ec9dd
   */
Packit 0ec9dd
  if (G_LIKELY (!vertical || wide))
Packit 0ec9dd
    return base_gravity;
Packit 0ec9dd
Packit 0ec9dd
  /* If here, we have a narrow character in a vertical gravity setting.
Packit 0ec9dd
   * Resolve depending on the hint.
Packit 0ec9dd
   */
Packit 0ec9dd
  switch (hint)
Packit 0ec9dd
    {
Packit 0ec9dd
    default:
Packit 0ec9dd
    case PANGO_GRAVITY_HINT_NATURAL:
Packit 0ec9dd
      if (props.vert_dir == PANGO_VERTICAL_DIRECTION_NONE)
Packit 0ec9dd
	return PANGO_GRAVITY_SOUTH;
Packit 0ec9dd
      if ((base_gravity   == PANGO_GRAVITY_EAST) ^
Packit 0ec9dd
	  (props.vert_dir == PANGO_VERTICAL_DIRECTION_BTT))
Packit 0ec9dd
	return PANGO_GRAVITY_SOUTH;
Packit 0ec9dd
      else
Packit 0ec9dd
	return PANGO_GRAVITY_NORTH;
Packit 0ec9dd
Packit 0ec9dd
    case PANGO_GRAVITY_HINT_STRONG:
Packit 0ec9dd
      return base_gravity;
Packit 0ec9dd
Packit 0ec9dd
    case PANGO_GRAVITY_HINT_LINE:
Packit 0ec9dd
      if ((base_gravity    == PANGO_GRAVITY_EAST) ^
Packit 0ec9dd
	  (props.horiz_dir == PANGO_DIRECTION_RTL))
Packit 0ec9dd
	return PANGO_GRAVITY_SOUTH;
Packit 0ec9dd
      else
Packit 0ec9dd
	return PANGO_GRAVITY_NORTH;
Packit 0ec9dd
    }
Packit 0ec9dd
}