|
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 |
}
|