/*
* Copyright (C) 1999 Red Hat Software
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see .
*/
#pragma once
#include
#include
#include
G_BEGIN_DECLS
typedef struct _Pango2LogAttr Pango2LogAttr;
typedef struct _Pango2FontDescription Pango2FontDescription;
typedef struct _Pango2Font Pango2Font;
typedef struct _Pango2FontFace Pango2FontFace;
typedef struct _Pango2FontFamily Pango2FontFamily;
typedef struct _Pango2FontMap Pango2FontMap;
typedef struct _Pango2Rectangle Pango2Rectangle;
typedef struct _Pango2Context Pango2Context;
typedef struct _Pango2Language Pango2Language;
/* A index of a glyph into a font. Rendering system dependent */
/**
* Pango2Glyph:
*
* A `Pango2Glyph` represents a single glyph in the output form of a string.
*/
typedef guint32 Pango2Glyph;
typedef struct _Pango2Lines Pango2Lines;
typedef struct _Pango2Run Pango2Run;
typedef struct _Pango2Line Pango2Line;
typedef struct _Pango2LineIter Pango2LineIter;
/**
* PANGO2_SCALE:
*
* The scale between dimensions used for Pango distances and device units.
*
* The definition of device units is dependent on the output device; it will
* typically be pixels for a screen, and points for a printer. %PANGO2_SCALE is
* currently 1024, but this may be changed in the future.
*
* When setting font sizes, device units are always considered to be
* points (as in "12 point font"), rather than pixels.
*/
/**
* PANGO2_PIXELS:
* @d: a dimension in Pango units.
*
* Converts a dimension to device units by rounding.
*
* Return value: rounded dimension in device units.
*/
/**
* PANGO2_PIXELS_FLOOR:
* @d: a dimension in Pango units.
*
* Converts a dimension to device units by flooring.
*
* Return value: floored dimension in device units.
*/
/**
* PANGO2_PIXELS_CEIL:
* @d: a dimension in Pango units.
*
* Converts a dimension to device units by ceiling.
*
* Return value: ceiled dimension in device units.
*/
#define PANGO2_SCALE 1024
#define PANGO2_PIXELS(d) (((int)(d) + 512) >> 10)
#define PANGO2_PIXELS_FLOOR(d) (((int)(d)) >> 10)
#define PANGO2_PIXELS_CEIL(d) (((int)(d) + 1023) >> 10)
/* The above expressions are just slightly wrong for floating point d;
* For example we'd expect PANGO2_PIXELS(-512.5) => -1 but instead we get 0.
* That's unlikely to matter for practical use and the expression is much
* more compact and faster than alternatives that work exactly for both
* integers and floating point.
*
* PANGO2_PIXELS also behaves differently for +512 and -512.
*/
/**
* PANGO2_UNITS_FLOOR:
* @d: a dimension in Pango units.
*
* Rounds a dimension down to whole device units, but does not
* convert it to device units.
*
* Return value: rounded down dimension in Pango units.
*/
#define PANGO2_UNITS_FLOOR(d) \
((d) & ~(PANGO2_SCALE - 1))
/**
* PANGO2_UNITS_CEIL:
* @d: a dimension in Pango units.
*
* Rounds a dimension up to whole device units, but does not
* convert it to device units.
*
* Return value: rounded up dimension in Pango units.
*/
#define PANGO2_UNITS_CEIL(d) \
(((d) + (PANGO2_SCALE - 1)) & ~(PANGO2_SCALE - 1))
/**
* PANGO2_UNITS_ROUND:
* @d: a dimension in Pango units.
*
* Rounds a dimension to whole device units, but does not
* convert it to device units.
*
* Return value: rounded dimension in Pango units.
*/
#define PANGO2_UNITS_ROUND(d) \
(((d) + (PANGO2_SCALE >> 1)) & ~(PANGO2_SCALE - 1))
PANGO2_AVAILABLE_IN_ALL
int pango2_units_from_double (double d) G_GNUC_CONST;
PANGO2_AVAILABLE_IN_ALL
double pango2_units_to_double (int i) G_GNUC_CONST;
/**
* Pango2Rectangle:
* @x: X coordinate of the left side of the rectangle.
* @y: Y coordinate of the the top side of the rectangle.
* @width: width of the rectangle.
* @height: height of the rectangle.
*
* The `Pango2Rectangle` structure represents a rectangle.
*
* `Pango2Rectangle` is frequently used to represent the logical or ink
* extents of a single glyph or section of text. (See, for instance,
* [method@Pango2.Font.get_glyph_extents].)
*/
struct _Pango2Rectangle
{
int x;
int y;
int width;
int height;
};
/* Macros to translate from extents rectangles to ascent/descent/lbearing/rbearing
*/
/**
* PANGO2_ASCENT:
* @rect: a `Pango2Rectangle`
*
* Extracts the *ascent* from a `Pango2Rectangle`
* representing glyph extents.
*
* The ascent is the distance from the baseline to the
* highest point of the character. This is positive if the
* glyph ascends above the baseline.
*/
/**
* PANGO2_DESCENT:
* @rect: a `Pango2Rectangle`
*
* Extracts the *descent* from a `Pango2Rectangle`
* representing glyph extents.
*
* The descent is the distance from the baseline to the
* lowest point of the character. This is positive if the
* glyph descends below the baseline.
*/
/**
* PANGO2_LBEARING:
* @rect: a `Pango2Rectangle`
*
* Extracts the *left bearing* from a `Pango2Rectangle`
* representing glyph extents.
*
* The left bearing is the distance from the horizontal
* origin to the farthest left point of the character.
* This is positive for characters drawn completely to
* the right of the glyph origin.
*/
/**
* PANGO2_RBEARING:
* @rect: a `Pango2Rectangle`
*
* Extracts the *right bearing* from a `Pango2Rectangle`
* representing glyph extents.
*
* The right bearing is the distance from the horizontal
* origin to the farthest right point of the character.
* This is positive except for characters drawn completely
* to the left of the horizontal origin.
*/
#define PANGO2_ASCENT(rect) (-(rect).y)
#define PANGO2_DESCENT(rect) ((rect).y + (rect).height)
#define PANGO2_LBEARING(rect) ((rect).x)
#define PANGO2_RBEARING(rect) ((rect).x + (rect).width)
PANGO2_AVAILABLE_IN_ALL
void pango2_extents_to_pixels (Pango2Rectangle *inclusive,
Pango2Rectangle *nearest);
#include
#include
#include
#include
#include
/**
* Pango2Alignment:
* @PANGO2_ALIGN_LEFT: Put all available space on the right
* @PANGO2_ALIGN_CENTER: Center the line within the available space
* @PANGO2_ALIGN_RIGHT: Put all available space on the left
* @PANGO2_ALIGN_NATURAL: Use left or right alignment, depending
* on the text direction of the paragraph
* @PANGO2_ALIGN_JUSTIFY: Justify the content to fill the available space
*
* `Pango2Alignment` describes how to align the lines of a `Pango2Layout`
* within the available space.
*/
typedef enum
{
PANGO2_ALIGN_LEFT,
PANGO2_ALIGN_CENTER,
PANGO2_ALIGN_RIGHT,
PANGO2_ALIGN_NATURAL,
PANGO2_ALIGN_JUSTIFY
} Pango2Alignment;
/**
* Pango2WrapMode:
* @PANGO2_WRAP_WORD: wrap lines at word boundaries.
* @PANGO2_WRAP_CHAR: wrap lines at character boundaries.
* @PANGO2_WRAP_WORD_CHAR: wrap lines at word boundaries, but fall back to
* character boundaries if there is not enough space for a full word.
*
* `Pango2WrapMode` describes how to wrap the lines of a `Pango2Layout`
* to the desired width.
*
* For @PANGO2_WRAP_WORD, Pango uses break opportunities that are determined
* by the Unicode line breaking algorithm. For @PANGO2_WRAP_CHAR, Pango allows
* breaking at grapheme boundaries that are determined by the Unicode text
* segmentation algorithm.
*/
typedef enum {
PANGO2_WRAP_WORD,
PANGO2_WRAP_CHAR,
PANGO2_WRAP_WORD_CHAR
} Pango2WrapMode;
/**
* Pango2EllipsizeMode:
* @PANGO2_ELLIPSIZE_NONE: No ellipsization
* @PANGO2_ELLIPSIZE_START: Omit characters at the start of the text
* @PANGO2_ELLIPSIZE_MIDDLE: Omit characters in the middle of the text
* @PANGO2_ELLIPSIZE_END: Omit characters at the end of the text
*
* `Pango2EllipsizeMode` describes what sort of ellipsization
* should be applied to text.
*
* In the ellipsization process characters are removed from the
* text in order to make it fit to a given width and replaced
* with an ellipsis.
*/
typedef enum {
PANGO2_ELLIPSIZE_NONE,
PANGO2_ELLIPSIZE_START,
PANGO2_ELLIPSIZE_MIDDLE,
PANGO2_ELLIPSIZE_END
} Pango2EllipsizeMode;
/**
* Pango2LeadingTrim:
* @PANGO2_LEADING_TRIM_NONE: No trimming
* @PANGO2_LEADING_TRIM_START: Trim leading at the top
* @PANGO2_LEADING_TRIM_END: Trim leading at the bottom
*
* The `Pango2LeadingTrim` flags control how the line height affects
* the extents of runs and lines.
*/
typedef enum
{
PANGO2_LEADING_TRIM_NONE = 0,
PANGO2_LEADING_TRIM_START = 1 << 0,
PANGO2_LEADING_TRIM_END = 1 << 1,
} Pango2LeadingTrim;
/**
* PANGO2_LEADING_TRIM_BOTH:
*
* Shorthand for `PANGO2_LEADING_TRIM_START|PANGO2_LEADING_TRIM_END`.
*/
#define PANGO2_LEADING_TRIM_BOTH (PANGO2_LEADING_TRIM_START|PANGO2_LEADING_TRIM_END)
/**
* PANGO2_COLOR_PALETTE_DEFAULT:
*
* The name for the default color palette.
*/
#define PANGO2_COLOR_PALETTE_DEFAULT "default"
/**
* PANGO2_COLOR_PALETTE_LIGHT:
*
* The name for a color palette suitable for use on
* a light background.
*/
#define PANGO2_COLOR_PALETTE_LIGHT "light"
/**
* PANGO2_COLOR_PALETTE_DARK:
*
* The name for a color palette suitable for use on
* a dark background.
*/
#define PANGO2_COLOR_PALETTE_DARK "dark"
/**
* Pango2EmojiPresentation:
* @PANGO2_EMOJI_PRESENTATION_AUTO: Present Emoji with to their
* default presentation according to Unicode
* @PANGO2_EMOJI_PRESENTATION_TEXT: Prefer text presentation
* @PANGO2_EMOJI_PRESENTATION_EMOJI: Prefer Emoji presentation
*
* `Pango2EmojiPresentation` describes a preference for Emoji
* presentation style.
*
* See [method@Pango2.Context.set_emoji_presentation] or
* [func@Pango2.attr_emoji_presentation_new] for ways to communicate
* Emoji presentation style preferences to Pango.
*
* Note that even with such a preference, Pango will respect
* Emoji presentation style if it has been explicitly selected
* with a Unicode [variation selector](https://unicode.org/reports/tr51/#Emoji_Variation_Sequences).
*/
typedef enum {
PANGO2_EMOJI_PRESENTATION_AUTO,
PANGO2_EMOJI_PRESENTATION_TEXT,
PANGO2_EMOJI_PRESENTATION_EMOJI
} Pango2EmojiPresentation;
/*
* PANGO2_DECLARE_INTERNAL_TYPE:
* @ModuleObjName: The name of the new type, in camel case (like GtkWidget)
* @module_obj_name: The name of the new type in lowercase, with words
* separated by '_' (like 'gtk_widget')
* @MODULE: The name of the module, in all caps (like 'GTK')
* @OBJ_NAME: The bare name of the type, in all caps (like 'WIDGET')
* @ParentName: the name of the parent type, in camel case (like GtkWidget)
*
* A convenience macro for emitting the usual declarations in the
* header file for a type which is intended to be subclassed only
* by internal consumers.
*
* This macro differs from %G_DECLARE_DERIVABLE_TYPE and %G_DECLARE_FINAL_TYPE
* by declaring a type that is only derivable internally. Internal users can
* derive this type, assuming they have access to the instance and class
* structures; external users will not be able to subclass this type.
*/
#define PANGO2_DECLARE_INTERNAL_TYPE(ModuleObjName, module_obj_name, MODULE, OBJ_NAME, ParentName) \
GType module_obj_name##_get_type (void); \
G_GNUC_BEGIN_IGNORE_DEPRECATIONS \
typedef struct _##ModuleObjName ModuleObjName; \
typedef struct _##ModuleObjName##Class ModuleObjName##Class; \
\
_GLIB_DEFINE_AUTOPTR_CHAINUP (ModuleObjName, ParentName) \
G_DEFINE_AUTOPTR_CLEANUP_FUNC (ModuleObjName##Class, g_type_class_unref) \
\
G_GNUC_UNUSED static inline ModuleObjName * MODULE##_##OBJ_NAME (gpointer ptr) { \
return G_TYPE_CHECK_INSTANCE_CAST (ptr, module_obj_name##_get_type (), ModuleObjName); } \
G_GNUC_UNUSED static inline ModuleObjName##Class * MODULE##_##OBJ_NAME##_CLASS (gpointer ptr) { \
return G_TYPE_CHECK_CLASS_CAST (ptr, module_obj_name##_get_type (), ModuleObjName##Class); } \
G_GNUC_UNUSED static inline gboolean MODULE##_IS_##OBJ_NAME (gpointer ptr) { \
return G_TYPE_CHECK_INSTANCE_TYPE (ptr, module_obj_name##_get_type ()); } \
G_GNUC_UNUSED static inline gboolean MODULE##_IS_##OBJ_NAME##_CLASS (gpointer ptr) { \
return G_TYPE_CHECK_CLASS_TYPE (ptr, module_obj_name##_get_type ()); } \
G_GNUC_UNUSED static inline ModuleObjName##Class * MODULE##_##OBJ_NAME##_GET_CLASS (gpointer ptr) { \
return G_TYPE_INSTANCE_GET_CLASS (ptr, module_obj_name##_get_type (), ModuleObjName##Class); } \
G_GNUC_END_IGNORE_DEPRECATIONS
G_END_DECLS