From 37a64d947d55d3fe755c9106e478da927d207308 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 14 Feb 2021 20:19:58 -0500 Subject: docs: Port PangoLayout to the new doc format Replace gtk-doc'isms and use gi-docgen links instead. --- pango/pango-layout.c | 3514 +++++++++++++++++++++++++------------------------- pango/pango-layout.h | 43 +- 2 files changed, 1766 insertions(+), 1791 deletions(-) diff --git a/pango/pango-layout.c b/pango/pango-layout.c index c108d477..d287df50 100644 --- a/pango/pango-layout.c +++ b/pango/pango-layout.c @@ -10,7 +10,7 @@ * * 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 + * 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 @@ -30,10 +30,10 @@ * of code. The objects and functions in this section provide a * high-level driver for formatting entire paragraphs of text * at once. This includes paragraph-level functionality such as - * line-breaking, justification, alignment and ellipsization. + * line breaking, justification, alignment and ellipsization. * - * The #PangoLayout structure represents an entire paragraph - * of text. It is initialized with a #PangoContext, UTF-8 string + * The `PangoLayout` structure represents an entire paragraph + * of text. It is initialized with a `PangoContext`, UTF-8 string * and set of attributes for that string. Once that is done, the * set of formatted lines can be extracted from the object, * the layout can be rendered, and conversion between logical @@ -41,33 +41,33 @@ * position of the resulting glyphs can be made. * * There are a number of parameters to adjust the formatting of a - * PangoLayout. The following image shows adjustable parameters + * `PangoLayout`. The following image shows adjustable parameters * (on the left) and font metrics (on the right): * * ![Pango Layout Parameters](layout.png) * * It is possible, as well, to ignore the 2-D setup, - * and simply treat the results of a PangoLayout as a list of lines. + * and simply treat the results of a `PangoLayout` as a list of lines. */ /** * PangoLayout: * - * The #PangoLayout structure is opaque, and has no user-visible fields. + * The `PangoLayout` structure is opaque, and has no user-visible fields. */ /** * PangoLayoutIter: * - * A #PangoLayoutIter structure can be used to - * iterate over the visual extents of a #PangoLayout. + * A `PangoLayoutIter` structure can be used to iterate over the visual + * extents of a [class@Pango.Layout]. To obtain a `PangoLayoutIter`, use + * pango_layout_get_iter(). * - * The #PangoLayoutIter structure is opaque, and - * has no user-visible fields. + * The `PangoLayoutIter` structure is opaque, and has no user-visible fields. */ #include "config.h" -#include "pango-glyph.h" /* For pango_shape() */ +#include "pango-glyph.h" /* For pango_shape() */ #include "pango-break.h" #include "pango-item.h" #include "pango-engine.h" @@ -143,7 +143,7 @@ struct _PangoLayoutClass #define ITER_IS_INVALID(iter) G_UNLIKELY (check_invalid ((iter), G_STRLOC)) static gboolean check_invalid (PangoLayoutIter *iter, - const char *loc) + const char *loc) { if (iter->line->layout == NULL) { @@ -167,24 +167,24 @@ static PangoAttrList *pango_layout_get_effective_attributes (PangoLayout *layout static PangoLayoutLine * pango_layout_line_new (PangoLayout *layout); static void pango_layout_line_postprocess (PangoLayoutLine *line, - ParaBreakState *state, - gboolean wrapped); + ParaBreakState *state, + gboolean wrapped); static int *pango_layout_line_get_log2vis_map (PangoLayoutLine *line, - gboolean strong); + gboolean strong); static int *pango_layout_line_get_vis2log_map (PangoLayoutLine *line, - gboolean strong); + gboolean strong); static void pango_layout_line_leaked (PangoLayoutLine *line); /* doesn't leak line */ static PangoLayoutLine* _pango_layout_iter_get_line (PangoLayoutIter *iter); static void pango_layout_get_item_properties (PangoItem *item, - ItemProperties *properties); + ItemProperties *properties); static void pango_layout_get_empty_extents_at_index (PangoLayout *layout, - int index, - PangoRectangle *logical_rect); + int index, + PangoRectangle *logical_rect); static void pango_layout_finalize (GObject *object); @@ -255,18 +255,16 @@ pango_layout_finalize (GObject *object) G_OBJECT_CLASS (pango_layout_parent_class)->finalize (object); } - /** * pango_layout_new: - * @context: a #PangoContext + * @context: a `PangoContext` * - * Create a new #PangoLayout object with attributes initialized to - * default values for a particular #PangoContext. + * Create a new `PangoLayout` object with attributes initialized to + * default values for a particular `PangoContext`. * - * Return value: the newly allocated #PangoLayout, with a reference - * count of one, which should be freed with - * g_object_unref(). - **/ + * Return value: the newly allocated `PangoLayout`, with a reference + * count of one, which should be freed with g_object_unref(). + */ PangoLayout * pango_layout_new (PangoContext *context) { @@ -285,16 +283,16 @@ pango_layout_new (PangoContext *context) /** * pango_layout_copy: - * @src: a #PangoLayout + * @src: a `PangoLayout` * * Does a deep copy-by-value of the @src layout. The attribute list, * tab array, and text from the original layout are all copied by * value. * - * Return value: (transfer full): the newly allocated #PangoLayout, - * with a reference count of one, which should be freed - * with g_object_unref(). - **/ + * Return value: (transfer full): the newly allocated `PangoLayout`, + * with a reference count of one, which should be freed + * with g_object_unref(). + */ PangoLayout* pango_layout_copy (PangoLayout *src) { @@ -317,21 +315,21 @@ pango_layout_copy (PangoLayout *src) /* Value fields */ memcpy (&layout->copy_begin, &src->copy_begin, - G_STRUCT_OFFSET (PangoLayout, copy_end) - G_STRUCT_OFFSET (PangoLayout, copy_begin)); + G_STRUCT_OFFSET (PangoLayout, copy_end) - G_STRUCT_OFFSET (PangoLayout, copy_begin)); return layout; } /** * pango_layout_get_context: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * - * Retrieves the #PangoContext used for this layout. + * Retrieves the `PangoContext` used for this layout. * - * Return value: (transfer none): the #PangoContext for the layout. - * This does not have an additional refcount added, so if you want to - * keep a copy of this around, you must reference it yourself. - **/ + * Return value: (transfer none): the `PangoContext` for the layout. + * This does not have an additional refcount added, so if you want to + * keep a copy of this around, you must reference it yourself. + */ PangoContext * pango_layout_get_context (PangoLayout *layout) { @@ -342,16 +340,16 @@ pango_layout_get_context (PangoLayout *layout) /** * pango_layout_set_width: - * @layout: a #PangoLayout. + * @layout: a `PangoLayout`. * @width: the desired width in Pango units, or -1 to indicate that no - * wrapping or ellipsization should be performed. + * wrapping or ellipsization should be performed. * - * Sets the width to which the lines of the #PangoLayout should wrap or - * ellipsized. The default value is -1: no width set. - **/ + * Sets the width to which the lines of the `PangoLayout` should wrap or + * ellipsized. The default value is -1: no width set. + */ void pango_layout_set_width (PangoLayout *layout, - int width) + int width) { g_return_if_fail (layout != NULL); @@ -372,12 +370,12 @@ pango_layout_set_width (PangoLayout *layout, /** * pango_layout_get_width: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * - * Gets the width to which the lines of the #PangoLayout should wrap. + * Gets the width to which the lines of the `PangoLayout` should wrap. * * Return value: the width in Pango units, or -1 if no width set. - **/ + */ int pango_layout_get_width (PangoLayout *layout) { @@ -387,26 +385,26 @@ pango_layout_get_width (PangoLayout *layout) /** * pango_layout_set_height: - * @layout: a #PangoLayout. + * @layout: a `PangoLayout`. * @height: the desired height of the layout in Pango units if positive, - * or desired number of lines if negative. + * or desired number of lines if negative. * - * Sets the height to which the #PangoLayout should be ellipsized at. There - * are two different behaviors, based on whether @height is positive or - * negative. + * Sets the height to which the `PangoLayout` should be ellipsized at. + * There are two different behaviors, based on whether @height is positive + * or negative. * - * If @height is positive, it will be the maximum height of the layout. Only + * If @height is positive, it will be the maximum height of the layout. Only * lines would be shown that would fit, and if there is any text omitted, - * an ellipsis added. At least one line is included in each paragraph regardless - * of how small the height value is. A value of zero will render exactly one + * an ellipsis added. At least one line is included in each paragraph regardless + * of how small the height value is. A value of zero will render exactly one * line for the entire layout. * - * If @height is negative, it will be the (negative of) maximum number of lines per - * paragraph. That is, the total number of lines shown may well be more than + * If @height is negative, it will be the (negative of) maximum number of lines + * per paragraph. That is, the total number of lines shown may well be more than * this value if the layout contains multiple paragraphs of text. * The default value of -1 means that first line of each paragraph is ellipsized. * This behavior may be changed in the future to act per layout instead of per - * paragraph. File a bug against pango at + * paragraph. File a bug against pango at * [https://gitlab.gnome.org/gnome/pango](https://gitlab.gnome.org/gnome/pango) * if your code relies on this behavior. * @@ -417,10 +415,10 @@ pango_layout_get_width (PangoLayout *layout) * future. * * Since: 1.20 - **/ + */ void pango_layout_set_height (PangoLayout *layout, - int height) + int height) { g_return_if_fail (layout != NULL); @@ -433,26 +431,26 @@ pango_layout_set_height (PangoLayout *layout, * Bug 549003 */ if (layout->ellipsize != PANGO_ELLIPSIZE_NONE && - !(layout->lines && layout->is_ellipsized == FALSE && - height < 0 && layout->line_count <= (guint) -height)) - layout_changed (layout); + !(layout->lines && layout->is_ellipsized == FALSE && + height < 0 && layout->line_count <= (guint) -height)) + layout_changed (layout); } } /** * pango_layout_get_height: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * - * Gets the height of layout used for ellipsization. See - * pango_layout_set_height() for details. + * Gets the height of layout used for ellipsization. + * See [method@Pango.Layout.set_height] for details. * - * Return value: the height, in Pango units if positive, or - * number of lines if negative. + * Return value: the height, in Pango units if positive, + * or number of lines if negative. * * Since: 1.20 - **/ + */ int -pango_layout_get_height (PangoLayout *layout) +pango_layout_get_height (PangoLayout *layout) { g_return_val_if_fail (layout != NULL, 0); return layout->height; @@ -460,16 +458,16 @@ pango_layout_get_height (PangoLayout *layout) /** * pango_layout_set_wrap: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @wrap: the wrap mode * * Sets the wrap mode; the wrap mode only has effect if a width - * is set on the layout with pango_layout_set_width(). + * is set on the layout with [method@Pango.Layout.set_width]. * To turn off wrapping, set the width to -1. - **/ + */ void -pango_layout_set_wrap (PangoLayout *layout, - PangoWrapMode wrap) +pango_layout_set_wrap (PangoLayout *layout, + PangoWrapMode wrap) { g_return_if_fail (PANGO_IS_LAYOUT (layout)); @@ -478,21 +476,21 @@ pango_layout_set_wrap (PangoLayout *layout, layout->wrap = wrap; if (layout->width != -1) - layout_changed (layout); + layout_changed (layout); } } /** * pango_layout_get_wrap: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Gets the wrap mode for the layout. * - * Use pango_layout_is_wrapped() to query whether any paragraphs - * were actually wrapped. + * Use [method@Pango.Layout.is_wrapped] to query whether + * any paragraphs were actually wrapped. * * Return value: active wrap mode. - **/ + */ PangoWrapMode pango_layout_get_wrap (PangoLayout *layout) { @@ -503,7 +501,7 @@ pango_layout_get_wrap (PangoLayout *layout) /** * pango_layout_is_wrapped: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Queries whether the layout had to wrap any paragraphs. * @@ -513,7 +511,7 @@ pango_layout_get_wrap (PangoLayout *layout) * to be wrapped. * * Return value: %TRUE if any paragraphs had to be wrapped, %FALSE - * otherwise. + * otherwise. * * Since: 1.16 */ @@ -529,20 +527,21 @@ pango_layout_is_wrapped (PangoLayout *layout) /** * pango_layout_set_indent: - * @layout: a #PangoLayout. + * @layout: a `PangoLayout`. * @indent: the amount by which to indent. * - * Sets the width in Pango units to indent each paragraph. A negative value - * of @indent will produce a hanging indentation. That is, the first line will - * have the full width, and subsequent lines will be indented by the - * absolute value of @indent. + * Sets the width in Pango units to indent each paragraph. + * + * A negative value of @indent will produce a hanging indentation. + * That is, the first line will have the full width, and subsequent + * lines will be indented by the absolute value of @indent. * * The indent setting is ignored if layout alignment is set to * %PANGO_ALIGN_CENTER. - **/ + */ void pango_layout_set_indent (PangoLayout *layout, - int indent) + int indent) { g_return_if_fail (layout != NULL); @@ -555,13 +554,13 @@ pango_layout_set_indent (PangoLayout *layout, /** * pango_layout_get_indent: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Gets the paragraph indent width in Pango units. A negative value * indicates a hanging indentation. * * Return value: the indent in Pango units. - **/ + */ int pango_layout_get_indent (PangoLayout *layout) { @@ -571,7 +570,7 @@ pango_layout_get_indent (PangoLayout *layout) /** * pango_layout_set_spacing: - * @layout: a #PangoLayout. + * @layout: a `PangoLayout`. * @spacing: the amount of spacing * * Sets the amount of spacing in Pango unit between @@ -580,15 +579,15 @@ pango_layout_get_indent (PangoLayout *layout) * * line2.top = line1.bottom + spacing * - * Note: Since 1.44, Pango defaults to using the - * line height (as determined by the font) for placing - * lines. The @spacing set with this function is only - * taken into account when the line-height factor is - * set to zero with pango_layout_set_line_spacing(). - **/ + * Note: Since 1.44, Pango defaults to using the line height + * (as determined by the font) for placing lines. The @spacing + * set with this function is only taken into account when the + * line height factor is set to zero with + * [method@Pango.Layout.set_line_spacing]. + */ void pango_layout_set_spacing (PangoLayout *layout, - int spacing) + int spacing) { g_return_if_fail (layout != NULL); @@ -601,12 +600,12 @@ pango_layout_set_spacing (PangoLayout *layout, /** * pango_layout_get_spacing: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Gets the amount of spacing between the lines of the layout. * * Return value: the spacing in Pango units. - **/ + */ int pango_layout_get_spacing (PangoLayout *layout) { @@ -616,31 +615,28 @@ pango_layout_get_spacing (PangoLayout *layout) /** * pango_layout_set_line_spacing: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @factor: the new line spacing factor * * Sets a factor for line spacing. * Typical values are: 0, 1, 1.5, 2. * The default values is 0. * - * If @factor is non-zero, lines are placed - * so that + * If @factor is non-zero, lines are placed so that * - * baseline2 = baseline1 + factor * height2 + * baseline2 = baseline1 + factor * height2 * - * where height2 is the line height of the - * second line (as determined by the font(s)). - * In this case, the spacing set with - * pango_layout_set_spacing() is ignored. + * where height2 is the line height of the second line + * (as determined by the font(s)). In this case, the spacing + * set with [method@Pango.Layout.set_spacing] is ignored. * - * If @factor is zero, spacing is applied as - * before. + * If @factor is zero, spacing is applied as before. * * Since: 1.44 */ void pango_layout_set_line_spacing (PangoLayout *layout, - float factor) + float factor) { g_return_if_fail (layout != NULL); @@ -653,10 +649,10 @@ pango_layout_set_line_spacing (PangoLayout *layout, /** * pango_layout_get_line_spacing: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * - * Gets the value that has been - * set with pango_layout_set_line_spacing(). + * Gets the value that has been set with + * [method@Pango.Layout.set_line_spacing]. * * Since: 1.44 */ @@ -669,12 +665,12 @@ pango_layout_get_line_spacing (PangoLayout *layout) /** * pango_layout_set_attributes: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @attrs: (allow-none) (transfer none): a #PangoAttrList, can be %NULL * * Sets the text attributes for a layout object. * References @attrs, so the caller can unref its reference. - **/ + */ void pango_layout_set_attributes (PangoLayout *layout, PangoAttrList *attrs) @@ -696,7 +692,6 @@ pango_layout_set_attributes (PangoLayout *layout, /* We always clear lines such that this function can be called * whenever attrs changes. */ - layout->attrs = attrs; if (layout->attrs) pango_attr_list_ref (layout->attrs); @@ -710,13 +705,13 @@ pango_layout_set_attributes (PangoLayout *layout, /** * pango_layout_get_attributes: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Gets the attribute list for the layout, if any. * - * Return value: (transfer none) (nullable): a #PangoAttrList or %NULL + * Return value: (transfer none) (nullable): a `PangoAttrList` or %NULL * if none was set. - **/ + */ PangoAttrList* pango_layout_get_attributes (PangoLayout *layout) { @@ -727,17 +722,17 @@ pango_layout_get_attributes (PangoLayout *layout) /** * pango_layout_set_font_description: - * @layout: a #PangoLayout - * @desc: (allow-none): the new #PangoFontDescription, or %NULL to unset the - * current font description + * @layout: a `PangoLayout` + * @desc: (allow-none): the new `PangoFontDescription`, or %NULL + * to unset the current font description * * Sets the default font description for the layout. If no font * description is set on the layout, the font description from * the layout's context is used. - **/ + */ void -pango_layout_set_font_description (PangoLayout *layout, - const PangoFontDescription *desc) +pango_layout_set_font_description (PangoLayout *layout, + const PangoFontDescription *desc) { g_return_if_fail (layout != NULL); @@ -745,7 +740,7 @@ pango_layout_set_font_description (PangoLayout *layout, (!desc || !layout->font_desc || !pango_font_description_equal(desc, layout->font_desc))) { if (layout->font_desc) - pango_font_description_free (layout->font_desc); + pango_font_description_free (layout->font_desc); layout->font_desc = desc ? pango_font_description_copy (desc) : NULL; @@ -756,17 +751,17 @@ pango_layout_set_font_description (PangoLayout *layout, /** * pango_layout_get_font_description: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Gets the font description for the layout, if any. * * Return value: (nullable): a pointer to the layout's font - * description, or %NULL if the font description from the layout's - * context is inherited. This value is owned by the layout and must - * not be modified or freed. + * description, or %NULL if the font description from the layout's + * context is inherited. This value is owned by the layout and must + * not be modified or freed. * * Since: 1.8 - **/ + */ const PangoFontDescription * pango_layout_get_font_description (PangoLayout *layout) { @@ -777,21 +772,21 @@ pango_layout_get_font_description (PangoLayout *layout) /** * pango_layout_set_justify: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @justify: whether the lines in the layout should be justified. * - * Sets whether each complete line should be stretched to - * fill the entire width of the layout. This stretching is typically - * done by adding whitespace, but for some scripts (such as Arabic), - * the justification may be done in more complex ways, like extending + * Sets whether each complete line should be stretched to fill the + * entire width of the layout. This stretching is typically done by + * adding whitespace, but for some scripts (such as Arabic), the + * justification may be done in more complex ways, like extending * the characters. * - * Note that this setting is not implemented and so is ignored in Pango - * older than 1.18. - **/ + * Note that this setting is not implemented and so is ignored in + * Pango older than 1.18. + */ void pango_layout_set_justify (PangoLayout *layout, - gboolean justify) + gboolean justify) { g_return_if_fail (layout != NULL); @@ -800,19 +795,19 @@ pango_layout_set_justify (PangoLayout *layout, layout->justify = justify; if (layout->is_ellipsized || layout->is_wrapped) - layout_changed (layout); + layout_changed (layout); } } /** * pango_layout_get_justify: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Gets whether each complete line should be stretched to fill the entire * width of the layout. * * Return value: the justify. - **/ + */ gboolean pango_layout_get_justify (PangoLayout *layout) { @@ -822,7 +817,7 @@ pango_layout_get_justify (PangoLayout *layout) /** * pango_layout_set_auto_dir: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @auto_dir: if %TRUE, compute the bidirectional base direction * from the layout's contents. * @@ -835,19 +830,19 @@ pango_layout_get_justify (PangoLayout *layout) * have left-to-right layout. Paragraphs with only neutral * characters get their direction from the surrounding paragraphs. * - * When %FALSE, the choice between left-to-right and - * right-to-left layout is done according to the base direction - * of the layout's #PangoContext. (See pango_context_set_base_dir()). + * When %FALSE, the choice between left-to-right and right-to-left + * layout is done according to the base direction of the layout's + * `PangoContext`. (See [method@Pango.Context.set_base_dir]). * * When the auto-computed direction of a paragraph differs from the * base direction of the context, the interpretation of * %PANGO_ALIGN_LEFT and %PANGO_ALIGN_RIGHT are swapped. * * Since: 1.4 - **/ + */ void pango_layout_set_auto_dir (PangoLayout *layout, - gboolean auto_dir) + gboolean auto_dir) { g_return_if_fail (PANGO_IS_LAYOUT (layout)); @@ -862,17 +857,17 @@ pango_layout_set_auto_dir (PangoLayout *layout, /** * pango_layout_get_auto_dir: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Gets whether to calculate the bidirectional base direction * for the layout according to the contents of the layout. - * See pango_layout_set_auto_dir(). + * See [method@Pango.Layout.set_auto_dir]. * * Return value: %TRUE if the bidirectional base direction * is computed from the layout's contents, %FALSE otherwise. * * Since: 1.4 - **/ + */ gboolean pango_layout_get_auto_dir (PangoLayout *layout) { @@ -883,15 +878,15 @@ pango_layout_get_auto_dir (PangoLayout *layout) /** * pango_layout_set_alignment: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @alignment: the alignment * * Sets the alignment for the layout: how partial lines are * positioned within the horizontal space available. - **/ + */ void pango_layout_set_alignment (PangoLayout *layout, - PangoAlignment alignment) + PangoAlignment alignment) { g_return_if_fail (layout != NULL); @@ -904,13 +899,13 @@ pango_layout_set_alignment (PangoLayout *layout, /** * pango_layout_get_alignment: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Gets the alignment for the layout: how partial lines are * positioned within the horizontal space available. * * Return value: the alignment. - **/ + */ PangoAlignment pango_layout_get_alignment (PangoLayout *layout) { @@ -921,17 +916,17 @@ pango_layout_get_alignment (PangoLayout *layout) /** * pango_layout_set_tabs: - * @layout: a #PangoLayout - * @tabs: (allow-none): a #PangoTabArray, or %NULL + * @layout: a `PangoLayout` + * @tabs: (allow-none): a `PangoTabArray`, or %NULL * * Sets the tabs to use for @layout, overriding the default tabs - * (by default, tabs are every 8 spaces). If @tabs is %NULL, the default - * tabs are reinstated. @tabs is copied into the layout; you must - * free your copy of @tabs yourself. - **/ + * (by default, tabs are every 8 spaces). If @tabs is %NULL, the + * default tabs are reinstated. @tabs is copied into the layout; + * you must free your copy of @tabs yourself. + */ void pango_layout_set_tabs (PangoLayout *layout, - PangoTabArray *tabs) + PangoTabArray *tabs) { g_return_if_fail (PANGO_IS_LAYOUT (layout)); @@ -939,7 +934,7 @@ pango_layout_set_tabs (PangoLayout *layout, if (tabs != layout->tabs) { if (layout->tabs) - pango_tab_array_free (layout->tabs); + pango_tab_array_free (layout->tabs); layout->tabs = tabs ? pango_tab_array_copy (tabs) : NULL; @@ -949,16 +944,18 @@ pango_layout_set_tabs (PangoLayout *layout, /** * pango_layout_get_tabs: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * - * Gets the current #PangoTabArray used by this layout. If no - * #PangoTabArray has been set, then the default tabs are in use - * and %NULL is returned. Default tabs are every 8 spaces. - * The return value should be freed with pango_tab_array_free(). + * Gets the current `PangoTabArray` used by this layout. * - * Return value: (nullable): a copy of the tabs for this layout, or - * %NULL. - **/ + * If no `PangoTabArray` has been set, then the default tabs are + * in use and %NULL is returned. Default tabs are every 8 spaces. + * + * The return value should be freed with [method@Pango.TabArray.free]. + * + * Return value: (nullable): a copy of the tabs for this layout, + * or %NULL. + */ PangoTabArray* pango_layout_get_tabs (PangoLayout *layout) { @@ -972,17 +969,17 @@ pango_layout_get_tabs (PangoLayout *layout) /** * pango_layout_set_single_paragraph_mode: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @setting: new setting * * If @setting is %TRUE, do not treat newlines and similar characters * as paragraph separators; instead, keep all text in a single paragraph, * and display a glyph for paragraph separator characters. Used when * you want to allow editing of newlines on a single text line. - **/ + */ void pango_layout_set_single_paragraph_mode (PangoLayout *layout, - gboolean setting) + gboolean setting) { g_return_if_fail (PANGO_IS_LAYOUT (layout)); @@ -997,13 +994,13 @@ pango_layout_set_single_paragraph_mode (PangoLayout *layout, /** * pango_layout_get_single_paragraph_mode: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * - * Obtains the value set by pango_layout_set_single_paragraph_mode(). + * Obtains the value set by [method@Pango.Layout.set_single_paragraph_mode]. * * Return value: %TRUE if the layout does not break paragraphs at * paragraph separator characters, %FALSE otherwise. - **/ + */ gboolean pango_layout_get_single_paragraph_mode (PangoLayout *layout) { @@ -1014,26 +1011,26 @@ pango_layout_get_single_paragraph_mode (PangoLayout *layout) /** * pango_layout_set_ellipsize: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @ellipsize: the new ellipsization mode for @layout * * Sets the type of ellipsization being performed for @layout. * Depending on the ellipsization mode @ellipsize text is * removed from the start, middle, or end of text so they * fit within the width and height of layout set with - * pango_layout_set_width() and pango_layout_set_height(). + * [method@Pango.Layout.set_width] and [method@Pango.Layout.set_height]. * * If the layout contains characters such as newlines that * force it to be layed out in multiple paragraphs, then whether * each paragraph is ellipsized separately or the entire layout * is ellipsized as a whole depends on the set height of the layout. - * See pango_layout_set_height() for details. + * See [method@Pango.Layout.set_height] for details. * * Since: 1.6 - **/ + */ void pango_layout_set_ellipsize (PangoLayout *layout, - PangoEllipsizeMode ellipsize) + PangoEllipsizeMode ellipsize) { g_return_if_fail (PANGO_IS_LAYOUT (layout)); @@ -1042,24 +1039,24 @@ pango_layout_set_ellipsize (PangoLayout *layout, layout->ellipsize = ellipsize; if (layout->is_ellipsized || layout->is_wrapped) - layout_changed (layout); + layout_changed (layout); } } /** * pango_layout_get_ellipsize: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Gets the type of ellipsization being performed for @layout. - * See pango_layout_set_ellipsize() + * See [method@Pango.Layout.set_ellipsize]. * - * Return value: the current ellipsization mode for @layout. + * Use [method@Pango.Layout.is_ellipsized] to query whether any + * paragraphs were actually ellipsized. * - * Use pango_layout_is_ellipsized() to query whether any paragraphs - * were actually ellipsized. + * Return value: the current ellipsization mode for @layout. * * Since: 1.6 - **/ + */ PangoEllipsizeMode pango_layout_get_ellipsize (PangoLayout *layout) { @@ -1070,7 +1067,7 @@ pango_layout_get_ellipsize (PangoLayout *layout) /** * pango_layout_is_ellipsized: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Queries whether the layout had to ellipsize any paragraphs. * @@ -1096,29 +1093,28 @@ pango_layout_is_ellipsized (PangoLayout *layout) /** * pango_layout_set_text: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @text: the text * @length: maximum length of @text, in bytes. -1 indicates that - * the string is nul-terminated and the length should be - * calculated. The text will also be truncated on - * encountering a nul-termination even when @length is - * positive. + * the string is nul-terminated and the length should be calculated. + * The text will also be truncated on encountering a nul-termination + * even when @length is positive. * * Sets the text of the layout. - * + * * This function validates @text and renders invalid UTF-8 * with a placeholder glyph. * - * Note that if you have used pango_layout_set_markup() or - * pango_layout_set_markup_with_accel() on @layout before, you may - * want to call pango_layout_set_attributes() to clear the attributes - * set on the layout from the markup as this function does not clear - * attributes. - **/ + * Note that if you have used [method@Pango.Layout.set_markup] or + * [method@Pango.Layout.set_markup_with_accel] on @layout before, you + * may want to call [method@Pango.Layout.set_attributes] to clear the + * attributes set on the layout from the markup as this function does + * not clear attributes. + */ void pango_layout_set_text (PangoLayout *layout, - const char *text, - int length) + const char *text, + int length) { char *old_text, *start, *end; @@ -1180,7 +1176,7 @@ pango_layout_set_text (PangoLayout *layout, /** * pango_layout_get_text: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Gets the text in the layout. The returned text should not * be freed or modified. @@ -1202,13 +1198,13 @@ pango_layout_get_text (PangoLayout *layout) /** * pango_layout_get_character_count: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Returns the number of Unicode characters in the * the text of @layout. * * Return value: the number of Unicode characters - * in the text of @layout + * in the text of @layout * * Since: 1.30 */ @@ -1222,35 +1218,35 @@ pango_layout_get_character_count (PangoLayout *layout) /** * pango_layout_set_markup: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @markup: marked-up text * @length: length of marked-up text in bytes, or -1 if @markup is - * null-terminated + * null-terminated * - * Same as pango_layout_set_markup_with_accel(), but - * the markup text isn't scanned for accelerators. - * - **/ + * Same as [method@Pango.Layout.set_markup_with_accel], + * but the markup text isn't scanned for accelerators. + */ void pango_layout_set_markup (PangoLayout *layout, - const char *markup, - int length) + const char *markup, + int length) { pango_layout_set_markup_with_accel (layout, markup, length, 0, NULL); } /** * pango_layout_set_markup_with_accel: - * @layout: a #PangoLayout - * @markup: marked-up text (see the Pango Markup docs) + * @layout: a `PangoLayout` + * @markup: marked-up text (see [Pango Markup](pango_markup.html)) * @length: length of marked-up text in bytes, or -1 if @markup is - * null-terminated + * null-terminated * @accel_marker: marker for accelerators in the text * @accel_char: (out caller-allocates) (allow-none): return location - * for first located accelerator, or %NULL + * for first located accelerator, or %NULL * * Sets the layout text and attribute list from marked-up text (see - * the Pango Markup docs). Replaces the current text and attribute list. + * [Pango Markup](pango_markup.html)). Replaces the current text + * and attribute list. * * If @accel_marker is nonzero, the given character will mark the * character following it as an accelerator. For example, @accel_marker @@ -1259,13 +1255,13 @@ pango_layout_set_markup (PangoLayout *layout, * and the first character so marked will be returned in @accel_char. * Two @accel_marker characters following each other produce a single * literal @accel_marker character. - **/ + */ void -pango_layout_set_markup_with_accel (PangoLayout *layout, - const char *markup, - int length, - gunichar accel_marker, - gunichar *accel_char) +pango_layout_set_markup_with_accel (PangoLayout *layout, + const char *markup, + int length, + gunichar accel_marker, + gunichar *accel_char) { PangoAttrList *list = NULL; char *text = NULL; @@ -1276,10 +1272,10 @@ pango_layout_set_markup_with_accel (PangoLayout *layout, error = NULL; if (!pango_parse_markup (markup, length, - accel_marker, - &list, &text, - accel_char, - &error)) + accel_marker, + &list, &text, + accel_char, + &error)) { g_warning ("pango_layout_set_markup_with_accel: %s", error->message); g_error_free (error); @@ -1294,9 +1290,9 @@ pango_layout_set_markup_with_accel (PangoLayout *layout, /** * pango_layout_get_unknown_glyphs_count: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * - * Counts the number unknown glyphs in @layout. That is, zero if + * Counts the number unknown glyphs in @layout. That is, zero if * glyphs for all characters in the layout text were found, or more * than zero otherwise. * @@ -1328,22 +1324,22 @@ pango_layout_get_unknown_glyphs_count (PangoLayout *layout) lines_list = layout->lines; while (lines_list) { - line = lines_list->data; - runs_list = line->runs; - - while (runs_list) - { - run = runs_list->data; - - for (i = 0; i < run->glyphs->num_glyphs; i++) - { - if (run->glyphs->glyphs[i].glyph & PANGO_GLYPH_UNKNOWN_FLAG) - count++; - } - - runs_list = runs_list->next; - } - lines_list = lines_list->next; + line = lines_list->data; + runs_list = line->runs; + + while (runs_list) + { + run = runs_list->data; + + for (i = 0; i < run->glyphs->num_glyphs; i++) + { + if (run->glyphs->glyphs[i].glyph & PANGO_GLYPH_UNKNOWN_FLAG) + count++; + } + + runs_list = runs_list->next; + } + lines_list = lines_list->next; } layout->unknown_glyphs_count = count; @@ -1372,13 +1368,13 @@ layout_changed (PangoLayout *layout) /** * pango_layout_context_changed: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * - * Forces recomputation of any state in the #PangoLayout that + * Forces recomputation of any state in the `PangoLayout` that * might depend on the layout's context. This function should * be called if you make changes to the context subsequent * to creating the layout. - **/ + */ void pango_layout_context_changed (PangoLayout *layout) { @@ -1390,23 +1386,24 @@ pango_layout_context_changed (PangoLayout *layout) /** * pango_layout_get_serial: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * - * Returns the current serial number of @layout. The serial number is - * initialized to an small number larger than zero when a new layout + * Returns the current serial number of @layout. The serial number is + * initialized to an small number larger than zero when a new layout * is created and is increased whenever the layout is changed using any - * of the setter functions, or the #PangoContext it uses has changed. + * of the setter functions, or the `PangoContext` it uses has changed. * The serial may wrap, but will never have the value 0. Since it * can wrap, never compare it with "less than", always use "not equals". * - * This can be used to automatically detect changes to a #PangoLayout, and - * is useful for example to decide whether a layout needs redrawing. - * To force the serial to be increased, use pango_layout_context_changed(). + * This can be used to automatically detect changes to a `PangoLayout`, + * and is useful for example to decide whether a layout needs redrawing. + * To force the serial to be increased, use + * [method@Pango.Layout.context_changed]. * * Return value: The current serial number of @layout. * * Since: 1.32.4 - **/ + */ guint pango_layout_get_serial (PangoLayout *layout) { @@ -1416,23 +1413,23 @@ pango_layout_get_serial (PangoLayout *layout) /** * pango_layout_get_log_attrs: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @attrs: (out)(array length=n_attrs)(transfer container): - * location to store a pointer to an array of logical attributes - * This value must be freed with g_free(). + * location to store a pointer to an array of logical attributes + * This value must be freed with g_free(). * @n_attrs: (out): location to store the number of the attributes in the - * array. (The stored value will be one more than the total number - * of characters in the layout, since there need to be attributes - * corresponding to both the position before the first character - * and the position after the last character.) + * array. (The stored value will be one more than the total number + * of characters in the layout, since there need to be attributes + * corresponding to both the position before the first character + * and the position after the last character.) * * Retrieves an array of logical attributes for each character in * the @layout. - **/ + */ void -pango_layout_get_log_attrs (PangoLayout *layout, - PangoLogAttr **attrs, - gint *n_attrs) +pango_layout_get_log_attrs (PangoLayout *layout, + PangoLogAttr **attrs, + gint *n_attrs) { g_return_if_fail (layout != NULL); @@ -1450,14 +1447,14 @@ pango_layout_get_log_attrs (PangoLayout *layout, /** * pango_layout_get_log_attrs_readonly: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @n_attrs: (out): location to store the number of the attributes in * the array * * Retrieves an array of logical attributes for each character in * the @layout. * - * This is a faster alternative to pango_layout_get_log_attrs(). + * This is a faster alternative to [method@Pango.Layout.get_log_attrs]. * The returned array is part of @layout and must not be modified. * Modifying the layout will invalidate the returned array. * @@ -1489,12 +1486,12 @@ pango_layout_get_log_attrs_readonly (PangoLayout *layout, /** * pango_layout_get_line_count: - * @layout: #PangoLayout + * @layout: `PangoLayout` * * Retrieves the count of lines for the @layout. * * Return value: the line count. - **/ + */ int pango_layout_get_line_count (PangoLayout *layout) { @@ -1506,18 +1503,18 @@ pango_layout_get_line_count (PangoLayout *layout) /** * pango_layout_get_lines: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Returns the lines of the @layout as a list. * - * Use the faster pango_layout_get_lines_readonly() if you do not plan - * to modify the contents of the lines (glyphs, glyph widths, etc.). + * Use the faster [method@Pango.Layout.get_lines_readonly] if you do not + * plan to modify the contents of the lines (glyphs, glyph widths, etc.). * - * Return value: (element-type Pango.LayoutLine) (transfer none): a #GSList containing - * the lines in the layout. This points to internal data of the #PangoLayout - * and must be used with care. It will become invalid on any change to the layout's - * text or properties. - **/ + * Return value: (element-type Pango.LayoutLine) (transfer none): a `GSList` + * containing the lines in the layout. This points to internal data of the + * `PangoLayout` and must be used with care. It will become invalid on any + * change to the layout's text or properties. + */ GSList * pango_layout_get_lines (PangoLayout *layout) { @@ -1527,12 +1524,12 @@ pango_layout_get_lines (PangoLayout *layout) { GSList *tmp_list = layout->lines; while (tmp_list) - { - PangoLayoutLine *line = tmp_list->data; - tmp_list = tmp_list->next; + { + PangoLayoutLine *line = tmp_list->data; + tmp_list = tmp_list->next; - pango_layout_line_leaked (line); - } + pango_layout_line_leaked (line); + } } return layout->lines; @@ -1540,21 +1537,22 @@ pango_layout_get_lines (PangoLayout *layout) /** * pango_layout_get_lines_readonly: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Returns the lines of the @layout as a list. * - * This is a faster alternative to pango_layout_get_lines(), - * but the user is not expected - * to modify the contents of the lines (glyphs, glyph widths, etc.). + * This is a faster alternative to [method@Pango.Layout.get_lines], + * but the user is not expected to modify the contents of the lines + * (glyphs, glyph widths, etc.). * - * Return value: (element-type Pango.LayoutLine) (transfer none): a #GSList containing - * the lines in the layout. This points to internal data of the #PangoLayout and - * must be used with care. It will become invalid on any change to the layout's - * text or properties. No changes should be made to the lines. + * Return value: (element-type Pango.LayoutLine) (transfer none): a `GSList` + * containing the lines in the layout. This points to internal data of the + * `PangoLayout` and must be used with care. It will become invalid on any + * change to the layout's text or properties. No changes should be made to + * the lines. * * Since: 1.16 - **/ + */ GSList * pango_layout_get_lines_readonly (PangoLayout *layout) { @@ -1565,24 +1563,23 @@ pango_layout_get_lines_readonly (PangoLayout *layout) /** * pango_layout_get_line: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @line: the index of a line, which must be between 0 and * `pango_layout_get_line_count(layout) - 1`, inclusive. * - * Retrieves a particular line from a #PangoLayout. + * Retrieves a particular line from a `PangoLayout`. * - * Use the faster pango_layout_get_line_readonly() if you do not plan - * to modify the contents of the line (glyphs, glyph widths, etc.). + * Use the faster [method@Pango.Layout.get_line_readonly] if you do not + * plan to modify the contents of the line (glyphs, glyph widths, etc.). * - * Return value: (transfer none) (nullable): the requested - * #PangoLayoutLine, or %NULL if the index is out of - * range. This layout line can be ref'ed and retained, - * but will become invalid if changes are made to the - * #PangoLayout. - **/ + * Return value: (transfer none) (nullable): the requested `PangoLayoutLine`, + * or %NULL if the index is out of range. This layout line can be ref'ed + * and retained, but will become invalid if changes are made to the + * `PangoLayout`. + */ PangoLayoutLine * pango_layout_get_line (PangoLayout *layout, - int line) + int line) { GSList *list_item; g_return_val_if_fail (layout != NULL, NULL); @@ -1607,27 +1604,26 @@ pango_layout_get_line (PangoLayout *layout, /** * pango_layout_get_line_readonly: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @line: the index of a line, which must be between 0 and * `pango_layout_get_line_count(layout) - 1`, inclusive. * - * Retrieves a particular line from a #PangoLayout. + * Retrieves a particular line from a `PangoLayout`. * - * This is a faster alternative to pango_layout_get_line(), - * but the user is not expected - * to modify the contents of the line (glyphs, glyph widths, etc.). + * This is a faster alternative to [method@Pango.Layout.get_line], + * but the user is not expected to modify the contents of the line + * (glyphs, glyph widths, etc.). * - * Return value: (transfer none) (nullable): the requested - * #PangoLayoutLine, or %NULL if the index is out of - * range. This layout line can be ref'ed and retained, - * but will become invalid if changes are made to the - * #PangoLayout. No changes should be made to the line. + * Return value: (transfer none) (nullable): the requested `PangoLayoutLine`, + * or %NULL if the index is out of range. This layout line can be ref'ed + * and retained, but will become invalid if changes are made to the + * `PangoLayout`. No changes should be made to the line. * * Since: 1.16 - **/ + */ PangoLayoutLine * pango_layout_get_line_readonly (PangoLayout *layout, - int line) + int line) { GSList *list_item; g_return_val_if_fail (layout != NULL, NULL); @@ -1650,21 +1646,20 @@ pango_layout_get_line_readonly (PangoLayout *layout, /** * pango_layout_line_index_to_x: - * @line: a #PangoLayoutLine - * @index_: byte offset of a grapheme within the layout + * @line: a `PangoLayoutLine` + * @index_: byte offset of a grapheme within the layout * @trailing: an integer indicating the edge of the grapheme to retrieve - * the position of. If > 0, the trailing edge of the grapheme, - * if 0, the leading of the grapheme. - * @x_pos: (out): location to store the x_offset (in Pango unit) + * the position of. If > 0, the trailing edge of the grapheme, + * if 0, the leading of the grapheme. + * @x_pos: (out): location to store the x_offset (in Pango units) * * Converts an index within a line to a X position. - * - **/ + */ void -pango_layout_line_index_to_x (PangoLayoutLine *line, - int index, - int trailing, - int *x_pos) +pango_layout_line_index_to_x (PangoLayoutLine *line, + int index, + int trailing, + int *x_pos) { PangoLayout *layout = line->layout; GSList *run_list = line->runs; @@ -1675,39 +1670,39 @@ pango_layout_line_index_to_x (PangoLayoutLine *line, PangoLayoutRun *run = run_list->data; if (run->item->offset <= index && run->item->offset + run->item->length > index) - { - int offset = g_utf8_pointer_to_offset (layout->text, layout->text + index); - if (trailing) - { - while (index < line->start_index + line->length && - offset + 1 < layout->n_chars && - !layout->log_attrs[offset + 1].is_cursor_position) - { - offset++; - index = g_utf8_next_char (layout->text + index) - layout->text; - } - } - else - { - while (index > line->start_index && - !layout->log_attrs[offset].is_cursor_position) - { - offset--; - index = g_utf8_prev_char (layout->text + index) - layout->text; - } - - } - - pango_glyph_string_index_to_x (run->glyphs, - layout->text + run->item->offset, - run->item->length, - &run->item->analysis, - index - run->item->offset, trailing, x_pos); - if (x_pos) - *x_pos += width; - - return; - } + { + int offset = g_utf8_pointer_to_offset (layout->text, layout->text + index); + if (trailing) + { + while (index < line->start_index + line->length && + offset + 1 < layout->n_chars && + !layout->log_attrs[offset + 1].is_cursor_position) + { + offset++; + index = g_utf8_next_char (layout->text + index) - layout->text; + } + } + else + { + while (index > line->start_index && + !layout->log_attrs[offset].is_cursor_position) + { + offset--; + index = g_utf8_prev_char (layout->text + index) - layout->text; + } + + } + + pango_glyph_string_index_to_x (run->glyphs, + layout->text + run->item->offset, + run->item->length, + &run->item->analysis, + index - run->item->offset, trailing, x_pos); + if (x_pos) + *x_pos += width; + + return; + } width += pango_glyph_string_get_width (run->glyphs); @@ -1720,10 +1715,10 @@ pango_layout_line_index_to_x (PangoLayoutLine *line, static PangoLayoutLine * pango_layout_index_to_line (PangoLayout *layout, - int index, - int *line_nr, - PangoLayoutLine **line_before, - PangoLayoutLine **line_after) + int index, + int *line_nr, + PangoLayoutLine **line_before, + PangoLayoutLine **line_after) { GSList *tmp_list; GSList *line_list; @@ -1737,7 +1732,7 @@ pango_layout_index_to_line (PangoLayout *layout, PangoLayoutLine *tmp_line = tmp_list->data; if (tmp_line->start_index > index) - break; /* index was in paragraph delimiters */ + break; /* index was in paragraph delimiters */ prev_line = line; line = tmp_line; @@ -1745,7 +1740,7 @@ pango_layout_index_to_line (PangoLayout *layout, i++; if (line->start_index + line->length > index) - break; + break; tmp_list = tmp_list->next; } @@ -1764,8 +1759,8 @@ pango_layout_index_to_line (PangoLayout *layout, static PangoLayoutLine * pango_layout_index_to_line_and_extents (PangoLayout *layout, - int index, - PangoRectangle *line_rect) + int index, + PangoRectangle *line_rect) { PangoLayoutIter iter; PangoLayoutLine *line = NULL; @@ -1775,20 +1770,20 @@ pango_layout_index_to_line_and_extents (PangoLayout *layout, if (!ITER_IS_INVALID (&iter)) while (TRUE) { - PangoLayoutLine *tmp_line = _pango_layout_iter_get_line (&iter); + PangoLayoutLine *tmp_line = _pango_layout_iter_get_line (&iter); - if (tmp_line->start_index > index) - break; /* index was in paragraph delimiters */ + if (tmp_line->start_index > index) + break; /* index was in paragraph delimiters */ - line = tmp_line; + line = tmp_line; - pango_layout_iter_get_line_extents (&iter, NULL, line_rect); + pango_layout_iter_get_line_extents (&iter, NULL, line_rect); - if (line->start_index + line->length > index) - break; + if (line->start_index + line->length > index) + break; - if (!pango_layout_iter_next_line (&iter)) - break; /* Use end of last line */ + if (!pango_layout_iter_next_line (&iter)) + break; /* Use end of last line */ } _pango_layout_iter_destroy (&iter); @@ -1798,25 +1793,25 @@ pango_layout_index_to_line_and_extents (PangoLayout *layout, /** * pango_layout_index_to_line_x: - * @layout: a #PangoLayout - * @index_: the byte index of a grapheme within the layout. - * @trailing: an integer indicating the edge of the grapheme to retrieve the - * position of. If > 0, the trailing edge of the grapheme, if 0, - * the leading of the grapheme. + * @layout: a `PangoLayout` + * @index_: the byte index of a grapheme within the layout. + * @trailing: an integer indicating the edge of the grapheme to retrieve the + * position of. If > 0, the trailing edge of the grapheme, if 0, + * the leading of the grapheme. * @line: (out) (allow-none): location to store resulting line index. (which will - * between 0 and pango_layout_get_line_count(layout) - 1), or %NULL + * between 0 and pango_layout_get_line_count(layout) - 1), or %NULL * @x_pos: (out) (allow-none): location to store resulting position within line - * (%PANGO_SCALE units per device unit), or %NULL + * (%PANGO_SCALE units per device unit), or %NULL * * Converts from byte @index_ within the @layout to line and X position. * (X position is measured from the left edge of the line) */ void pango_layout_index_to_line_x (PangoLayout *layout, - int index, - gboolean trailing, - int *line, - int *x_pos) + int index, + gboolean trailing, + int *line, + int *x_pos) { int line_num; PangoLayoutLine *layout_line = NULL; @@ -1828,77 +1823,75 @@ pango_layout_index_to_line_x (PangoLayout *layout, pango_layout_check_lines (layout); layout_line = pango_layout_index_to_line (layout, index, - &line_num, NULL, NULL); + &line_num, NULL, NULL); if (layout_line) { /* use end of line if index was in the paragraph delimiters */ if (index > layout_line->start_index + layout_line->length) - index = layout_line->start_index + layout_line->length; + index = layout_line->start_index + layout_line->length; if (line) - *line = line_num; + *line = line_num; pango_layout_line_index_to_x (layout_line, index, trailing, x_pos); } else { if (line) - *line = -1; + *line = -1; if (x_pos) - *x_pos = -1; + *x_pos = -1; } } /** * pango_layout_move_cursor_visually: - * @layout: a #PangoLayout. - * @strong: whether the moving cursor is the strong cursor or the - * weak cursor. The strong cursor is the cursor corresponding - * to text insertion in the base direction for the layout. + * @layout: a `PangoLayout` + * @strong: whether the moving cursor is the strong cursor or the + * weak cursor. The strong cursor is the cursor corresponding + * to text insertion in the base direction for the layout. * @old_index: the byte index of the grapheme for the old index * @old_trailing: if 0, the cursor was at the leading edge of the - * grapheme indicated by @old_index, if > 0, the cursor - * was at the trailing edge. + * grapheme indicated by @old_index, if > 0, the cursor + * was at the trailing edge. * @direction: direction to move cursor. A negative - * value indicates motion to the left. - * @new_index: (out): location to store the new cursor byte index. A value of -1 - * indicates that the cursor has been moved off the beginning - * of the layout. A value of %G_MAXINT indicates that - * the cursor has been moved off the end of the layout. - * @new_trailing: (out): number of characters to move forward from the - * location returned for @new_index to get the position - * where the cursor should be displayed. This allows - * distinguishing the position at the beginning of one - * line from the position at the end of the preceding - * line. @new_index is always on the line where the - * cursor should be displayed. - * - * Computes a new cursor position from an old position and - * a count of positions to move visually. If @direction is positive, - * then the new strong cursor position will be one position - * to the right of the old cursor position. If @direction is negative, - * then the new strong cursor position will be one position - * to the left of the old cursor position. - * - * In the presence of bidirectional text, the correspondence - * between logical and visual order will depend on the direction - * of the current run, and there may be jumps when the cursor - * is moved off of the end of a run. - * - * Motion here is in cursor positions, not in characters, so a - * single call to pango_layout_move_cursor_visually() may move the - * cursor over multiple characters when multiple characters combine - * to form a single grapheme. - **/ + * value indicates motion to the left. + * @new_index: (out): location to store the new cursor byte index. + * A value of -1 indicates that the cursor has been moved off the + * beginning of the layout. A value of %G_MAXINT indicates that + * the cursor has been moved off the end of the layout. + * @new_trailing: (out): number of characters to move forward from + * the location returned for @new_index to get the position where + * the cursor should be displayed. This allows distinguishing the + * position at the beginning of one line from the position at the + * end of the preceding line. @new_index is always on the line where + * the cursor should be displayed. + * + * Computes a new cursor position from an old position and a count of + * positions to move visually. If @direction is positive, then the new + * strong cursor position will be one position to the right of the old + * cursor position. If @direction is negative, then the new strong cursor + * position will be one position to the left of the old cursor position. + * + * In the presence of bidirectional text, the correspondence between + * logical and visual order will depend on the direction of the current + * run, and there may be jumps when the cursor is moved off of the end + * of a run. + * + * Motion here is in cursor positions, not in characters, so a single + * call to [method@Pango.Layout.move_cursor_visually] may move the cursor over + * multiple characters when multiple characters combine to form a single + * grapheme. + */ void pango_layout_move_cursor_visually (PangoLayout *layout, - gboolean strong, - int old_index, - int old_trailing, - int direction, - int *new_index, - int *new_trailing) + gboolean strong, + int old_index, + int old_trailing, + int direction, + int *new_index, + int *new_trailing) { PangoLayoutLine *line = NULL; PangoLayoutLine *prev_line; @@ -1924,7 +1917,7 @@ pango_layout_move_cursor_visually (PangoLayout *layout, /* Find the line the old cursor is on */ line = pango_layout_index_to_line (layout, old_index, - NULL, &prev_line, &next_line); + NULL, &prev_line, &next_line); start_offset = g_utf8_pointer_to_offset (layout->text, layout->text + line->start_index); @@ -1946,16 +1939,16 @@ pango_layout_move_cursor_visually (PangoLayout *layout, if (vis_pos == 0 && direction < 0) { if (line->resolved_dir == PANGO_DIRECTION_LTR) - off_start = TRUE; + off_start = TRUE; else - off_end = TRUE; + off_end = TRUE; } else if (vis_pos == n_vis && direction > 0) { if (line->resolved_dir == PANGO_DIRECTION_LTR) - off_end = TRUE; + off_end = TRUE; else - off_start = TRUE; + off_start = TRUE; } if (off_start || off_end) @@ -1966,59 +1959,59 @@ pango_layout_move_cursor_visually (PangoLayout *layout, gboolean paragraph_boundary; if (off_start) - { - if (!prev_line) - { - *new_index = -1; - *new_trailing = 0; - return; - } - line = prev_line; - paragraph_boundary = (line->start_index + line->length != old_index); - } + { + if (!prev_line) + { + *new_index = -1; + *new_trailing = 0; + return; + } + line = prev_line; + paragraph_boundary = (line->start_index + line->length != old_index); + } else - { - if (!next_line) - { - *new_index = G_MAXINT; - *new_trailing = 0; - return; - } - line = next_line; - paragraph_boundary = (line->start_index != old_index); - } + { + if (!next_line) + { + *new_index = G_MAXINT; + *new_trailing = 0; + return; + } + line = next_line; + paragraph_boundary = (line->start_index != old_index); + } n_vis = pango_utf8_strlen (layout->text + line->start_index, line->length); start_offset = g_utf8_pointer_to_offset (layout->text, layout->text + line->start_index); if (vis_pos == 0 && direction < 0) - { - vis_pos = n_vis; - if (paragraph_boundary) - vis_pos++; - } + { + vis_pos = n_vis; + if (paragraph_boundary) + vis_pos++; + } else /* (vis_pos == n_vis && direction > 0) */ - { - vis_pos = 0; - if (paragraph_boundary) - vis_pos--; - } + { + vis_pos = 0; + if (paragraph_boundary) + vis_pos--; + } } vis2log_map = pango_layout_line_get_vis2log_map (line, strong); vis_pos_old = vis_pos + direction; log_pos = g_utf8_pointer_to_offset (layout->text + line->start_index, - layout->text + line->start_index + vis2log_map[vis_pos_old]); + layout->text + line->start_index + vis2log_map[vis_pos_old]); do { vis_pos += direction; log_pos += g_utf8_pointer_to_offset (layout->text + line->start_index + vis2log_map[vis_pos_old], - layout->text + line->start_index + vis2log_map[vis_pos]); + layout->text + line->start_index + vis2log_map[vis_pos]); vis_pos_old = vis_pos; } while (vis_pos > 0 && vis_pos < n_vis && - !layout->log_attrs[start_offset + log_pos].is_cursor_position); + !layout->log_attrs[start_offset + log_pos].is_cursor_position); *new_index = line->start_index + vis2log_map[vis_pos]; g_free (vis2log_map); @@ -2028,45 +2021,43 @@ pango_layout_move_cursor_visually (PangoLayout *layout, if (*new_index == line->start_index + line->length && line->length > 0) { do - { - log_pos--; - *new_index = g_utf8_prev_char (layout->text + *new_index) - layout->text; - (*new_trailing)++; - } + { + log_pos--; + *new_index = g_utf8_prev_char (layout->text + *new_index) - layout->text; + (*new_trailing)++; + } while (log_pos > 0 && !layout->log_attrs[start_offset + log_pos].is_cursor_position); } } /** * pango_layout_xy_to_index: - * @layout: a #PangoLayout - * @x: the X offset (in Pango units) - * from the left edge of the layout. - * @y: the Y offset (in Pango units) - * from the top edge of the layout - * @index_: (out): location to store calculated byte index + * @layout: a `PangoLayout` + * @x: the X offset (in Pango units) from the left edge of the layout. + * @y: the Y offset (in Pango units) from the top edge of the layout + * @index_: (out): location to store calculated byte index * @trailing: (out): location to store a integer indicating where - * in the grapheme the user clicked. It will either - * be zero, or the number of characters in the - * grapheme. 0 represents the leading edge of the grapheme. - * - * Converts from X and Y position within a layout to the byte - * index to the character at that logical position. If the - * Y position is not inside the layout, the closest position is chosen - * (the position will be clamped inside the layout). If the - * X position is not within the layout, then the start or the - * end of the line is chosen as described for pango_layout_line_x_to_index(). - * If either the X or Y positions were not inside the layout, then the - * function returns %FALSE; on an exact hit, it returns %TRUE. + * in the grapheme the user clicked. It will either be zero, or the + * number of characters in the grapheme. 0 represents the leading edge + * of the grapheme. + * + * Converts from X and Y position within a layout to the byte index to the + * character at that logical position. If the Y position is not inside the + * layout, the closest position is chosen (the position will be clamped + * inside the layout). If the X position is not within the layout, then + * the start or the end of the line is chosen as described for + * [method@Pango.Layout.line_x_to_index]. If either the X or Y positions + * were not inside the layout, then the function returns %FALSE; on an + * exact hit, it returns %TRUE. * * Return value: %TRUE if the coordinates were inside text, %FALSE otherwise. - **/ + */ gboolean pango_layout_xy_to_index (PangoLayout *layout, - int x, - int y, - int *index, - gint *trailing) + int x, + int y, + int *index, + gint *trailing) { PangoLayoutIter iter; PangoLayoutLine *prev_line = NULL; @@ -2092,34 +2083,34 @@ pango_layout_xy_to_index (PangoLayout *layout, pango_layout_iter_get_line_yrange (&iter, &first_y, &last_y); if (y < first_y) - { - if (prev_line && y < (prev_last + (first_y - prev_last) / 2)) - { - found = prev_line; - found_line_x = prev_line_x; - } - else - { - if (prev_line == NULL) - outside = TRUE; /* off the top */ - - found = _pango_layout_iter_get_line (&iter); - found_line_x = x - line_logical.x; - } - } + { + if (prev_line && y < (prev_last + (first_y - prev_last) / 2)) + { + found = prev_line; + found_line_x = prev_line_x; + } + else + { + if (prev_line == NULL) + outside = TRUE; /* off the top */ + + found = _pango_layout_iter_get_line (&iter); + found_line_x = x - line_logical.x; + } + } else if (y >= first_y && - y < last_y) - { - found = _pango_layout_iter_get_line (&iter); - found_line_x = x - line_logical.x; - } + y < last_y) + { + found = _pango_layout_iter_get_line (&iter); + found_line_x = x - line_logical.x; + } prev_line = _pango_layout_iter_get_line (&iter); prev_last = last_y; prev_line_x = x - line_logical.x; if (found != NULL) - break; + break; } while (pango_layout_iter_next_line (&iter)); @@ -2135,8 +2126,8 @@ pango_layout_xy_to_index (PangoLayout *layout, } retval = pango_layout_line_x_to_index (found, - found_line_x, - index, trailing); + found_line_x, + index, trailing); if (outside) retval = FALSE; @@ -2146,21 +2137,21 @@ pango_layout_xy_to_index (PangoLayout *layout, /** * pango_layout_index_to_pos: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @index_: byte index within @layout * @pos: (out): rectangle in which to store the position of the grapheme * - * Converts from an index within a #PangoLayout to the onscreen position + * Converts from an index within a `PangoLayout` to the onscreen position * corresponding to the grapheme at that index, which is represented - * as rectangle. Note that `pos->x` is always the leading - * edge of the grapheme and `pos->x + pos->width` the trailing - * edge of the grapheme. If the directionality of the grapheme is right-to-left, - * then `pos->width` will be negative. - **/ + * as rectangle. Note that `pos->x` is always the leading edge of the + * grapheme and `pos->x + pos->width` the trailing edge of the grapheme. + * If the directionality of the grapheme is right-to-left, then `pos->width` + * will be negative. + */ void pango_layout_index_to_pos (PangoLayout *layout, - int index, - PangoRectangle *pos) + int index, + PangoRectangle *pos) { PangoRectangle logical_rect; PangoLayoutIter iter; @@ -2176,35 +2167,35 @@ pango_layout_index_to_pos (PangoLayout *layout, if (!ITER_IS_INVALID (&iter)) { while (TRUE) - { - PangoLayoutLine *tmp_line = _pango_layout_iter_get_line (&iter); - - if (tmp_line->start_index > index) - { - /* index is in the paragraph delim&iters, move to - * end of previous line - * - * This shouldn’t occur in the first loop &iteration as the first - * line’s start_index should always be 0. - */ - g_assert (layout_line != NULL); - index = layout_line->start_index + layout_line->length; - break; - } - - layout_line = tmp_line; - - pango_layout_iter_get_line_extents (&iter, NULL, &logical_rect); - - if (layout_line->start_index + layout_line->length > index) - break; - - if (!pango_layout_iter_next_line (&iter)) - { - index = layout_line->start_index + layout_line->length; - break; - } - } + { + PangoLayoutLine *tmp_line = _pango_layout_iter_get_line (&iter); + + if (tmp_line->start_index > index) + { + /* index is in the paragraph delim&iters, move to + * end of previous line + * + * This shouldn’t occur in the first loop &iteration as the first + * line’s start_index should always be 0. + */ + g_assert (layout_line != NULL); + index = layout_line->start_index + layout_line->length; + break; + } + + layout_line = tmp_line; + + pango_layout_iter_get_line_extents (&iter, NULL, &logical_rect); + + if (layout_line->start_index + layout_line->length > index) + break; + + if (!pango_layout_iter_next_line (&iter)) + { + index = layout_line->start_index + layout_line->length; + break; + } + } pos->y = logical_rect.y; pos->height = logical_rect.height; @@ -2213,12 +2204,12 @@ pango_layout_index_to_pos (PangoLayout *layout, pos->x = logical_rect.x + x_pos; if (index < layout_line->start_index + layout_line->length) - { - pango_layout_line_index_to_x (layout_line, index, 1, &x_pos); - pos->width = (logical_rect.x + x_pos) - pos->x; - } + { + pango_layout_line_index_to_x (layout_line, index, 1, &x_pos); + pos->width = (logical_rect.x + x_pos) - pos->x; + } else - pos->width = 0; + pos->width = 0; } _pango_layout_iter_destroy (&iter); @@ -2226,8 +2217,8 @@ pango_layout_index_to_pos (PangoLayout *layout, static void pango_layout_line_get_range (PangoLayoutLine *line, - char **start, - char **end) + char **start, + char **end) { char *p; @@ -2241,7 +2232,7 @@ pango_layout_line_get_range (PangoLayoutLine *line, static int * pango_layout_line_get_vis2log_map (PangoLayoutLine *line, - gboolean strong) + gboolean strong) { PangoLayout *layout = line->layout; PangoDirection prev_dir; @@ -2282,39 +2273,39 @@ pango_layout_line_get_vis2log_map (PangoLayoutLine *line, /* p is the logical byte index at the start of the run */ if (run_dir == PANGO_DIRECTION_LTR) - { - if ((cursor_dir == PANGO_DIRECTION_LTR) || - (prev_dir == run_dir)) - result[pos] = p - start; - - p = g_utf8_next_char (p); - - for (i = 1; i < run_n_chars; i++) - { - result[pos + i] = p - start; - p = g_utf8_next_char (p); - } - - if (cursor_dir == PANGO_DIRECTION_LTR) - result[pos + run_n_chars] = p - start; - } + { + if ((cursor_dir == PANGO_DIRECTION_LTR) || + (prev_dir == run_dir)) + result[pos] = p - start; + + p = g_utf8_next_char (p); + + for (i = 1; i < run_n_chars; i++) + { + result[pos + i] = p - start; + p = g_utf8_next_char (p); + } + + if (cursor_dir == PANGO_DIRECTION_LTR) + result[pos + run_n_chars] = p - start; + } else - { - if (cursor_dir == PANGO_DIRECTION_RTL) - result[pos + run_n_chars] = p - start; + { + if (cursor_dir == PANGO_DIRECTION_RTL) + result[pos + run_n_chars] = p - start; - p = g_utf8_next_char (p); + p = g_utf8_next_char (p); - for (i = 1; i < run_n_chars; i++) - { - result[pos + run_n_chars - i] = p - start; - p = g_utf8_next_char (p); - } + for (i = 1; i < run_n_chars; i++) + { + result[pos + run_n_chars - i] = p - start; + p = g_utf8_next_char (p); + } - if ((cursor_dir == PANGO_DIRECTION_RTL) || - (prev_dir == run_dir)) - result[pos] = p - start; - } + if ((cursor_dir == PANGO_DIRECTION_RTL) || + (prev_dir == run_dir)) + result[pos] = p - start; + } pos += run_n_chars; prev_dir = run_dir; @@ -2331,7 +2322,7 @@ pango_layout_line_get_vis2log_map (PangoLayoutLine *line, static int * pango_layout_line_get_log2vis_map (PangoLayoutLine *line, - gboolean strong) + gboolean strong) { gchar *start, *end; int *reverse_map; @@ -2355,7 +2346,7 @@ pango_layout_line_get_log2vis_map (PangoLayoutLine *line, static PangoDirection pango_layout_line_get_char_direction (PangoLayoutLine *layout_line, - int index) + int index) { GSList *run_list; @@ -2365,7 +2356,7 @@ pango_layout_line_get_char_direction (PangoLayoutLine *layout_line, PangoLayoutRun *run = run_list->data; if (run->item->offset <= index && run->item->offset + run->item->length > index) - return run->item->analysis.level % 2 ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR; + return run->item->analysis.level % 2 ? PANGO_DIRECTION_RTL : PANGO_DIRECTION_LTR; run_list = run_list->next; } @@ -2377,11 +2368,10 @@ pango_layout_line_get_char_direction (PangoLayoutLine *layout_line, /** * pango_layout_get_direction: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @index: the byte index of the char * - * Gets the text direction at the given character - * position in @layout. + * Gets the text direction at the given character position in @layout. * * Returns: the text direction at @index * @@ -2403,26 +2393,26 @@ pango_layout_get_direction (PangoLayout *layout, /** * pango_layout_get_cursor_pos: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @index_: the byte index of the cursor - * @strong_pos: (out) (allow-none): location to store the strong cursor position - * (may be %NULL) - * @weak_pos: (out) (allow-none): location to store the weak cursor position (may be %NULL) + * @strong_pos: (out) (allow-none): location to store the strong + * cursor position (may be %NULL) + * @weak_pos: (out) (allow-none): location to store the weak cursor + * position (may be %NULL) * * Given an index within a layout, determines the positions that of the - * strong and weak cursors if the insertion point is at that - * index. The position of each cursor is stored as a zero-width - * rectangle. The strong cursor location is the location where - * characters of the directionality equal to the base direction of the - * layout are inserted. The weak cursor location is the location - * where characters of the directionality opposite to the base - * direction of the layout are inserted. - **/ + * strong and weak cursors if the insertion point is at that index. The + * position of each cursor is stored as a zero-width rectangle. The strong + * cursor location is the location where characters of the directionality + * equal to the base direction of the layout are inserted. The weak cursor + * location is the location where characters of the directionality opposite + * to the base direction of the layout are inserted. + */ void pango_layout_get_cursor_pos (PangoLayout *layout, - int index, - PangoRectangle *strong_pos, - PangoRectangle *weak_pos) + int index, + PangoRectangle *strong_pos, + PangoRectangle *weak_pos) { PangoDirection dir1; PangoRectangle line_rect; @@ -2434,7 +2424,7 @@ pango_layout_get_cursor_pos (PangoLayout *layout, g_return_if_fail (index >= 0 && index <= layout->length); layout_line = pango_layout_index_to_line_and_extents (layout, index, - &line_rect); + &line_rect); g_assert (index >= layout_line->start_index); @@ -2443,17 +2433,17 @@ pango_layout_get_cursor_pos (PangoLayout *layout, { dir1 = layout_line->resolved_dir; if (layout_line->resolved_dir == PANGO_DIRECTION_LTR) - x1_trailing = 0; + x1_trailing = 0; else - x1_trailing = line_rect.width; + x1_trailing = line_rect.width; } else if (index >= layout_line->start_index + layout_line->length) { dir1 = layout_line->resolved_dir; if (layout_line->resolved_dir == PANGO_DIRECTION_LTR) - x1_trailing = line_rect.width; + x1_trailing = line_rect.width; else - x1_trailing = 0; + x1_trailing = 0; } else { @@ -2466,9 +2456,9 @@ pango_layout_get_cursor_pos (PangoLayout *layout, if (index >= layout_line->start_index + layout_line->length) { if (layout_line->resolved_dir == PANGO_DIRECTION_LTR) - x2 = line_rect.width; + x2 = line_rect.width; else - x2 = 0; + x2 = 0; } else { @@ -2480,9 +2470,9 @@ pango_layout_get_cursor_pos (PangoLayout *layout, strong_pos->x = line_rect.x; if (dir1 == layout_line->resolved_dir) - strong_pos->x += x1_trailing; + strong_pos->x += x1_trailing; else - strong_pos->x += x2; + strong_pos->x += x2; strong_pos->y = line_rect.y; strong_pos->width = 0; @@ -2494,9 +2484,9 @@ pango_layout_get_cursor_pos (PangoLayout *layout, weak_pos->x = line_rect.x; if (dir1 == layout_line->resolved_dir) - weak_pos->x += x2; + weak_pos->x += x2; else - weak_pos->x += x1_trailing; + weak_pos->x += x1_trailing; weak_pos->y = line_rect.y; weak_pos->width = 0; @@ -2527,7 +2517,7 @@ direction_simple (PangoDirection d) static PangoAlignment get_alignment (PangoLayout *layout, - PangoLayoutLine *line) + PangoLayoutLine *line) { PangoAlignment alignment = layout->alignment; @@ -2536,9 +2526,9 @@ get_alignment (PangoLayout *layout, -direction_simple (pango_context_get_base_dir (layout->context))) { if (alignment == PANGO_ALIGN_LEFT) - alignment = PANGO_ALIGN_RIGHT; + alignment = PANGO_ALIGN_RIGHT; else if (alignment == PANGO_ALIGN_RIGHT) - alignment = PANGO_ALIGN_LEFT; + alignment = PANGO_ALIGN_LEFT; } return alignment; @@ -2546,10 +2536,10 @@ get_alignment (PangoLayout *layout, static void get_x_offset (PangoLayout *layout, - PangoLayoutLine *line, - int layout_width, - int line_width, - int *x_offset) + PangoLayoutLine *line, + int layout_width, + int line_width, + int *x_offset) { PangoAlignment alignment = get_alignment (layout, line); @@ -2563,14 +2553,13 @@ get_x_offset (PangoLayout *layout, /* hinting */ if (((layout_width | line_width) & (PANGO_SCALE - 1)) == 0) { - *x_offset = PANGO_UNITS_ROUND (*x_offset); + *x_offset = PANGO_UNITS_ROUND (*x_offset); } } else *x_offset = 0; /* Indentation */ - /* For center, we ignore indentation; I think I've seen word * processors that still do the indentation here as if it were * indented left/right, though we can't sensibly do that without @@ -2583,22 +2572,22 @@ get_x_offset (PangoLayout *layout, if (line->is_paragraph_start) { if (layout->indent > 0) - { - if (alignment == PANGO_ALIGN_LEFT) - *x_offset += layout->indent; - else - *x_offset -= layout->indent; - } + { + if (alignment == PANGO_ALIGN_LEFT) + *x_offset += layout->indent; + else + *x_offset -= layout->indent; + } } else { if (layout->indent < 0) - { - if (alignment == PANGO_ALIGN_LEFT) - *x_offset -= layout->indent; - else - *x_offset += layout->indent; - } + { + if (alignment == PANGO_ALIGN_LEFT) + *x_offset -= layout->indent; + else + *x_offset += layout->indent; + } } } @@ -2609,12 +2598,12 @@ pango_layout_line_get_extents_and_height (PangoLayoutLine *line, int *height); static void get_line_extents_layout_coords (PangoLayout *layout, - PangoLayoutLine *line, - int layout_width, - int y_offset, - int *baseline, - PangoRectangle *line_ink_layout, - PangoRectangle *line_logical_layout) + PangoLayoutLine *line, + int layout_width, + int y_offset, + int *baseline, + PangoRectangle *line_ink_layout, + PangoRectangle *line_logical_layout) { int x_offset; /* Line extents in line coords (origin at line baseline) */ @@ -2664,8 +2653,8 @@ get_line_extents_layout_coords (PangoLayout *layout, */ static void pango_layout_get_extents_internal (PangoLayout *layout, - PangoRectangle *ink_rect, - PangoRectangle *logical_rect, + PangoRectangle *ink_rect, + PangoRectangle *logical_rect, Extents **line_extents) { GSList *line_list; @@ -2706,14 +2695,14 @@ pango_layout_get_extents_internal (PangoLayout *layout, */ line_list = layout->lines; while (line_list && !need_width) - { - PangoLayoutLine *line = line_list->data; + { + PangoLayoutLine *line = line_list->data; - if (get_alignment (layout, line) != PANGO_ALIGN_LEFT) - need_width = TRUE; + if (get_alignment (layout, line) != PANGO_ALIGN_LEFT) + need_width = TRUE; - line_list = line_list->next; - } + line_list = line_list->next; + } } else if (layout->alignment != PANGO_ALIGN_LEFT) need_width = TRUE; @@ -2753,79 +2742,79 @@ pango_layout_get_extents_internal (PangoLayout *layout, /* This block gets the line extents in layout coords */ { - get_line_extents_layout_coords (layout, line, - width, y_offset, - &baseline, - ink_rect ? &line_ink_layout : NULL, - &line_logical_layout); - - if (line_extents && layout->line_count > 0) - { - Extents *ext = &(*line_extents)[line_index]; - ext->baseline = baseline; - ext->ink_rect = line_ink_layout; - ext->logical_rect = line_logical_layout; - } + get_line_extents_layout_coords (layout, line, + width, y_offset, + &baseline, + ink_rect ? &line_ink_layout : NULL, + &line_logical_layout); + + if (line_extents && layout->line_count > 0) + { + Extents *ext = &(*line_extents)[line_index]; + ext->baseline = baseline; + ext->ink_rect = line_ink_layout; + ext->logical_rect = line_logical_layout; + } } if (ink_rect) - { - /* Compute the union of the current ink_rect with - * line_ink_layout - */ - - if (line_list == layout->lines) - { - *ink_rect = line_ink_layout; - } - else - { - new_pos = MIN (ink_rect->x, line_ink_layout.x); - ink_rect->width = - MAX (ink_rect->x + ink_rect->width, - line_ink_layout.x + line_ink_layout.width) - new_pos; - ink_rect->x = new_pos; - - new_pos = MIN (ink_rect->y, line_ink_layout.y); - ink_rect->height = - MAX (ink_rect->y + ink_rect->height, - line_ink_layout.y + line_ink_layout.height) - new_pos; - ink_rect->y = new_pos; - } - } + { + /* Compute the union of the current ink_rect with + * line_ink_layout + */ + + if (line_list == layout->lines) + { + *ink_rect = line_ink_layout; + } + else + { + new_pos = MIN (ink_rect->x, line_ink_layout.x); + ink_rect->width = + MAX (ink_rect->x + ink_rect->width, + line_ink_layout.x + line_ink_layout.width) - new_pos; + ink_rect->x = new_pos; + + new_pos = MIN (ink_rect->y, line_ink_layout.y); + ink_rect->height = + MAX (ink_rect->y + ink_rect->height, + line_ink_layout.y + line_ink_layout.height) - new_pos; + ink_rect->y = new_pos; + } + } if (logical_rect) - { - if (layout->width == -1) - { - /* When no width is set on layout, we can just compute the max of the - * line lengths to get the horizontal extents ... logical_rect.x = 0. - */ - logical_rect->width = MAX (logical_rect->width, line_logical_layout.width); - } - else - { - /* When a width is set, we have to compute the union of the horizontal - * extents of all the lines. - */ - if (line_list == layout->lines) - { - logical_rect->x = line_logical_layout.x; - logical_rect->width = line_logical_layout.width; - } - else - { - new_pos = MIN (logical_rect->x, line_logical_layout.x); - logical_rect->width = - MAX (logical_rect->x + logical_rect->width, - line_logical_layout.x + line_logical_layout.width) - new_pos; - logical_rect->x = new_pos; - - } - } - - logical_rect->height = line_logical_layout.y + line_logical_layout.height - logical_rect->y; - } + { + if (layout->width == -1) + { + /* When no width is set on layout, we can just compute the max of the + * line lengths to get the horizontal extents ... logical_rect.x = 0. + */ + logical_rect->width = MAX (logical_rect->width, line_logical_layout.width); + } + else + { + /* When a width is set, we have to compute the union of the horizontal + * extents of all the lines. + */ + if (line_list == layout->lines) + { + logical_rect->x = line_logical_layout.x; + logical_rect->width = line_logical_layout.width; + } + else + { + new_pos = MIN (logical_rect->x, line_logical_layout.x); + logical_rect->width = + MAX (logical_rect->x + logical_rect->width, + line_logical_layout.x + line_logical_layout.width) - new_pos; + logical_rect->x = new_pos; + + } + } + + logical_rect->height = line_logical_layout.y + line_logical_layout.height - logical_rect->y; + } y_offset = line_logical_layout.y + line_logical_layout.height + layout->spacing; line_list = line_list->next; @@ -2846,28 +2835,27 @@ pango_layout_get_extents_internal (PangoLayout *layout, /** * pango_layout_get_extents: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @ink_rect: (out) (allow-none): rectangle used to store the extents of the - * layout as drawn or %NULL to indicate that the result is - * not needed. + * layout as drawn or %NULL to indicate that the result is not needed. * @logical_rect: (out) (allow-none):rectangle used to store the logical - * extents of the layout or %NULL to indicate that the - * result is not needed. + * extents of the layout or %NULL to indicate that the result is not needed. * - * Computes the logical and ink extents of @layout. Logical extents - * are usually what you want for positioning things. Note that both extents - * may have non-zero x and y. You may want to use those to offset where you - * render the layout. Not doing that is a very typical bug that shows up as - * right-to-left layouts not being correctly positioned in a layout with - * a set width. + * Computes the logical and ink extents of @layout. + * + * Logical extents are usually what you want for positioning things. Note + * that both extents may have non-zero x and y. You may want to use those + * to offset where you render the layout. Not doing that is a very typical + * bug that shows up as right-to-left layouts not being correctly positioned + * in a layout with a set width. * * The extents are given in layout coordinates and in Pango units; layout * coordinates begin at the top left corner of the layout. */ void pango_layout_get_extents (PangoLayout *layout, - PangoRectangle *ink_rect, - PangoRectangle *logical_rect) + PangoRectangle *ink_rect, + PangoRectangle *logical_rect) { g_return_if_fail (layout != NULL); @@ -2876,24 +2864,23 @@ pango_layout_get_extents (PangoLayout *layout, /** * pango_layout_get_pixel_extents: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @ink_rect: (out) (allow-none): rectangle used to store the extents of the - * layout as drawn or %NULL to indicate that the result is - * not needed. + * layout as drawn or %NULL to indicate that the result is not needed. * @logical_rect: (out) (allow-none): rectangle used to store the logical - * extents of the layout or %NULL to indicate that the - * result is not needed. + * extents of the layout or %NULL to indicate that the result is not needed. * * Computes the logical and ink extents of @layout in device units. - * This function just calls pango_layout_get_extents() followed by - * two pango_extents_to_pixels() calls, rounding @ink_rect and @logical_rect + * + * This function just calls [method@Pango.Layout.get_extents] followed by + * two [func@extents_to_pixels] calls, rounding @ink_rect and @logical_rect * such that the rounded rectangles fully contain the unrounded one (that is, - * passes them as first argument to pango_extents_to_pixels()). - **/ + * passes them as first argument to `pango_extents_to_pixels()`). + */ void -pango_layout_get_pixel_extents (PangoLayout *layout, - PangoRectangle *ink_rect, - PangoRectangle *logical_rect) +pango_layout_get_pixel_extents (PangoLayout *layout, + PangoRectangle *ink_rect, + PangoRectangle *logical_rect) { g_return_if_fail (PANGO_IS_LAYOUT (layout)); @@ -2904,18 +2891,18 @@ pango_layout_get_pixel_extents (PangoLayout *layout, /** * pango_layout_get_size: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @width: (out) (allow-none): location to store the logical width, or %NULL * @height: (out) (allow-none): location to store the logical height, or %NULL * - * Determines the logical width and height of a #PangoLayout - * in Pango units (device units scaled by %PANGO_SCALE). This - * is simply a convenience function around pango_layout_get_extents(). - **/ + * Determines the logical width and height of a `PangoLayout` in Pango + * units (device units scaled by %PANGO_SCALE). This is simply a + * convenience function around [method@Pango.Layout.get_extents]. + */ void pango_layout_get_size (PangoLayout *layout, - int *width, - int *height) + int *width, + int *height) { PangoRectangle logical_rect; @@ -2929,20 +2916,19 @@ pango_layout_get_size (PangoLayout *layout, /** * pango_layout_get_pixel_size: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * @width: (out) (allow-none): location to store the logical width, or %NULL * @height: (out) (allow-none): location to store the logical height, or %NULL * - * Determines the logical width and height of a #PangoLayout - * in device units. (pango_layout_get_size() returns the width - * and height scaled by %PANGO_SCALE.) This - * is simply a convenience function around - * pango_layout_get_pixel_extents(). - **/ + * Determines the logical width and height of a `PangoLayout` in device + * units. ([method@Pango.Layout.get_size] returns the width and height + * scaled by %PANGO_SCALE.) This is simply a convenience function around + * [method@Pango.Layout.get_pixel_extents]. + */ void pango_layout_get_pixel_size (PangoLayout *layout, - int *width, - int *height) + int *width, + int *height) { PangoRectangle logical_rect; @@ -2957,16 +2943,16 @@ pango_layout_get_pixel_size (PangoLayout *layout, /** * pango_layout_get_baseline: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Gets the Y position of baseline of the first line in @layout. * * Return value: baseline of first line, from top of @layout. * * Since: 1.22 - **/ + */ int -pango_layout_get_baseline (PangoLayout *layout) +pango_layout_get_baseline (PangoLayout *layout) { int baseline; Extents *extents = NULL; @@ -2987,13 +2973,13 @@ pango_layout_clear_lines (PangoLayout *layout) { GSList *tmp_list = layout->lines; while (tmp_list) - { - PangoLayoutLine *line = tmp_list->data; - tmp_list = tmp_list->next; + { + PangoLayoutLine *line = tmp_list->data; + tmp_list = tmp_list->next; - line->layout = NULL; - pango_layout_line_unref (line); - } + line->layout = NULL; + pango_layout_line_unref (line); + } g_slist_free (layout->lines); layout->lines = NULL; @@ -3034,7 +3020,7 @@ pango_layout_line_leaked (PangoLayoutLine *line) static void shape_tab (PangoLayoutLine *line, PangoItem *item, - PangoGlyphString *glyphs); + PangoGlyphString *glyphs); static void free_run (PangoLayoutRun *run, gpointer data) @@ -3134,7 +3120,7 @@ ensure_tab_width (PangoLayout *layout) * problems with the font. */ if (layout->tab_width <= 0) - layout->tab_width = 50 * PANGO_SCALE; /* pretty much arbitrary */ + layout->tab_width = 50 * PANGO_SCALE; /* pretty much arbitrary */ } } @@ -3142,7 +3128,9 @@ ensure_tab_width (PangoLayout *layout) * all tabs are left-aligned. */ static int -get_tab_pos (PangoLayout *layout, int index, gboolean *is_default) +get_tab_pos (PangoLayout *layout, + int index, + gboolean *is_default) { gint n_tabs; gboolean in_pixels; @@ -3152,14 +3140,14 @@ get_tab_pos (PangoLayout *layout, int index, gboolean *is_default) n_tabs = pango_tab_array_get_size (layout->tabs); in_pixels = pango_tab_array_get_positions_in_pixels (layout->tabs); if (is_default) - *is_default = FALSE; + *is_default = FALSE; } else { n_tabs = 0; in_pixels = FALSE; if (is_default) - *is_default = TRUE; + *is_default = TRUE; } if (index < n_tabs) @@ -3169,9 +3157,9 @@ get_tab_pos (PangoLayout *layout, int index, gboolean *is_default) pango_tab_array_get_tab (layout->tabs, index, NULL, &pos); if (in_pixels) - return pos * PANGO_SCALE; + return pos * PANGO_SCALE; else - return pos; + return pos; } if (n_tabs > 0) @@ -3186,24 +3174,24 @@ get_tab_pos (PangoLayout *layout, int index, gboolean *is_default) pango_tab_array_get_tab (layout->tabs, n_tabs - 1, NULL, &last_pos); if (n_tabs > 1) - pango_tab_array_get_tab (layout->tabs, n_tabs - 2, NULL, &next_to_last_pos); + pango_tab_array_get_tab (layout->tabs, n_tabs - 2, NULL, &next_to_last_pos); else - next_to_last_pos = 0; + next_to_last_pos = 0; if (in_pixels) - { - next_to_last_pos *= PANGO_SCALE; - last_pos *= PANGO_SCALE; - } + { + next_to_last_pos *= PANGO_SCALE; + last_pos *= PANGO_SCALE; + } if (last_pos > next_to_last_pos) - { - tab_width = last_pos - next_to_last_pos; - } + { + tab_width = last_pos - next_to_last_pos; + } else - { - tab_width = layout->tab_width; - } + { + tab_width = layout->tab_width; + } return last_pos + tab_width * (index - n_tabs + 1); } @@ -3230,7 +3218,7 @@ line_width (PangoLayoutLine *line) PangoLayoutRun *run = l->data; for (i=0; i < run->glyphs->num_glyphs; i++) - width += run->glyphs->glyphs[i].geometry.width; + width += run->glyphs->glyphs[i].geometry.width; } return width; @@ -3256,7 +3244,7 @@ showing_space (const PangoAnalysis *analysis) static void shape_tab (PangoLayoutLine *line, PangoItem *item, - PangoGlyphString *glyphs) + PangoGlyphString *glyphs) { int i, space_width; @@ -3288,17 +3276,17 @@ shape_tab (PangoLayoutLine *line, * the pixel. */ if (tab_pos >= current_width + (is_default ? space_width : 1)) - { - glyphs->glyphs[0].geometry.width = tab_pos - current_width; - break; - } + { + glyphs->glyphs[0].geometry.width = tab_pos - current_width; + break; + } } } static inline gboolean can_break_at (PangoLayout *layout, - gint offset, - gboolean always_wrap_char) + gint offset, + gboolean always_wrap_char) { PangoWrapMode wrap; /* We probably should have a mode where we treat all white-space as @@ -3325,9 +3313,9 @@ can_break_at (PangoLayout *layout, static inline gboolean can_break_in (PangoLayout *layout, - int start_offset, - int num_chars, - gboolean allow_break_at_start) + int start_offset, + int num_chars, + gboolean allow_break_at_start) { int i; @@ -3340,8 +3328,8 @@ can_break_in (PangoLayout *layout, static inline void distribute_letter_spacing (int letter_spacing, - int *space_left, - int *space_right) + int *space_left, + int *space_right) { *space_left = letter_spacing / 2; /* hinting */ @@ -3364,41 +3352,41 @@ typedef enum struct _ParaBreakState { /* maintained per layout */ - int line_height; /* Estimate of height of current line; < 0 is no estimate */ - int remaining_height; /* Remaining height of the layout; only defined if layout->height >= 0 */ + int line_height; /* Estimate of height of current line; < 0 is no estimate */ + int remaining_height; /* Remaining height of the layout; only defined if layout->height >= 0 */ /* maintained per paragraph */ - PangoAttrList *attrs; /* Attributes being used for itemization */ - GList *items; /* This paragraph turned into items */ - PangoDirection base_dir; /* Current resolved base direction */ - int line_of_par; /* Line of the paragraph, starting at 1 for first line */ - - PangoGlyphString *glyphs; /* Glyphs for the first item in state->items */ - int start_offset; /* Character offset of first item in state->items in layout->text */ - ItemProperties properties; /* Properties for the first item in state->items */ - int *log_widths; /* Logical widths for first item in state->items.. */ + PangoAttrList *attrs; /* Attributes being used for itemization */ + GList *items; /* This paragraph turned into items */ + PangoDirection base_dir; /* Current resolved base direction */ + int line_of_par; /* Line of the paragraph, starting at 1 for first line */ + + PangoGlyphString *glyphs; /* Glyphs for the first item in state->items */ + int start_offset; /* Character offset of first item in state->items in layout->text */ + ItemProperties properties; /* Properties for the first item in state->items */ + int *log_widths; /* Logical widths for first item in state->items.. */ int log_widths_offset; /* Offset into log_widths to the point corresponding - * to the remaining portion of the first item */ + * to the remaining portion of the first item */ int *need_hyphen; /* Insert a hyphen if breaking here ? */ - int line_start_index; /* Start index (byte offset) of line in layout->text */ - int line_start_offset; /* Character offset of line in layout->text */ + int line_start_index; /* Start index (byte offset) of line in layout->text */ + int line_start_offset; /* Character offset of line in layout->text */ /* maintained per line */ - int line_width; /* Goal width of line currently processing; < 0 is infinite */ - int remaining_width; /* Amount of space remaining on line; < 0 is infinite */ + int line_width; /* Goal width of line currently processing; < 0 is infinite */ + int remaining_width; /* Amount of space remaining on line; < 0 is infinite */ int hyphen_width; /* How much space a hyphen will take */ }; static gboolean should_ellipsize_current_line (PangoLayout *layout, - ParaBreakState *state); + ParaBreakState *state); static PangoGlyphString * shape_run (PangoLayoutLine *line, - ParaBreakState *state, - PangoItem *item) + ParaBreakState *state, + PangoItem *item) { PangoLayout *layout = line->layout; PangoGlyphString *glyphs = pango_glyph_string_new (); @@ -3413,9 +3401,9 @@ shape_run (PangoLayoutLine *line, shape_flags |= PANGO_SHAPE_ROUND_POSITIONS; if (state->properties.shape_set) - _pango_shape_shape (layout->text + item->offset, item->num_chars, - state->properties.shape_ink_rect, state->properties.shape_logical_rect, - glyphs); + _pango_shape_shape (layout->text + item->offset, item->num_chars, + state->properties.shape_ink_rect, state->properties.shape_logical_rect, + glyphs); else pango_shape_with_flags (layout->text + item->offset, item->length, layout->text, layout->length, @@ -3423,24 +3411,24 @@ shape_run (PangoLayoutLine *line, shape_flags); if (state->properties.letter_spacing) - { - PangoGlyphItem glyph_item; - int space_left, space_right; + { + PangoGlyphItem glyph_item; + int space_left, space_right; - glyph_item.item = item; - glyph_item.glyphs = glyphs; + glyph_item.item = item; + glyph_item.glyphs = glyphs; - pango_glyph_item_letter_space (&glyph_item, - layout->text, - layout->log_attrs + state->start_offset, - state->properties.letter_spacing); + pango_glyph_item_letter_space (&glyph_item, + layout->text, + layout->log_attrs + state->start_offset, + state->properties.letter_spacing); - distribute_letter_spacing (state->properties.letter_spacing, &space_left, &space_right); + distribute_letter_spacing (state->properties.letter_spacing, &space_left, &space_right); - glyphs->glyphs[0].geometry.width += space_left; - glyphs->glyphs[0].geometry.x_offset += space_left; - glyphs->glyphs[glyphs->num_glyphs - 1].geometry.width += space_right; - } + glyphs->glyphs[0].geometry.width += space_left; + glyphs->glyphs[0].geometry.x_offset += space_left; + glyphs->glyphs[glyphs->num_glyphs - 1].geometry.width += space_right; + } } return glyphs; @@ -3448,9 +3436,9 @@ shape_run (PangoLayoutLine *line, static void insert_run (PangoLayoutLine *line, - ParaBreakState *state, - PangoItem *run_item, - gboolean last_run) + ParaBreakState *state, + PangoItem *run_item, + gboolean last_run) { PangoLayoutRun *run = g_slice_new (PangoLayoutRun); @@ -3464,7 +3452,7 @@ insert_run (PangoLayoutLine *line, if (last_run) { if (state->log_widths_offset > 0) - pango_glyph_string_free (state->glyphs); + pango_glyph_string_free (state->glyphs); state->glyphs = NULL; g_free (state->log_widths); state->log_widths = NULL; @@ -3520,19 +3508,19 @@ get_need_hyphen (PangoItem *item, if (attr) insert_hyphens = ((PangoAttrInt*)attr)->value; - /* Some scripts don't use hyphen.*/ - switch (item->analysis.script) - { - case PANGO_SCRIPT_COMMON: - case PANGO_SCRIPT_HAN: - case PANGO_SCRIPT_HANGUL: - case PANGO_SCRIPT_HIRAGANA: - case PANGO_SCRIPT_KATAKANA: - insert_hyphens = FALSE; - break; - default: - break; - } + /* Some scripts don't use hyphen.*/ + switch (item->analysis.script) + { + case PANGO_SCRIPT_COMMON: + case PANGO_SCRIPT_HAN: + case PANGO_SCRIPT_HANGUL: + case PANGO_SCRIPT_HIRAGANA: + case PANGO_SCRIPT_KATAKANA: + insert_hyphens = FALSE; + break; + default: + break; + } } switch (g_unichar_type (wc)) @@ -3623,7 +3611,7 @@ find_hyphen_width (PangoItem *item) static int find_break_extra_width (PangoLayout *layout, - ParaBreakState *state, + ParaBreakState *state, int pos) { /* Check whether to insert a hyphen */ @@ -3648,11 +3636,11 @@ debug (const char *where, PangoLayoutLine *line, ParaBreakState *state) { int line_width = pango_layout_line_get_width (line); - g_debug ("rem %d + line %d = %d %s", - state->remaining_width, - line_width, - state->remaining_width + line_width, - where); + g_debug ("rem %d + line %d = %d %s", + state->remaining_width, + line_width, + state->remaining_width + line_width, + where); } #else # define DEBUG(where, line, state) do { } while (0) @@ -3679,10 +3667,10 @@ debug (const char *where, PangoLayoutLine *line, ParaBreakState *state) */ static BreakResult process_item (PangoLayout *layout, - PangoLayoutLine *line, - ParaBreakState *state, - gboolean force_fit, - gboolean no_break_at_end) + PangoLayoutLine *line, + ParaBreakState *state, + gboolean force_fit, + gboolean no_break_at_end) { PangoItem *item = state->items->data; gboolean shape_set = FALSE; @@ -3733,7 +3721,7 @@ process_item (PangoLayout *layout, else { for (i = 0; i < item->num_chars; i++) - width += state->log_widths[state->log_widths_offset + i]; + width += state->log_widths[state->log_widths_offset + i]; } if ((width <= state->remaining_width || (item->num_chars == 1 && !line->runs)) && @@ -3755,13 +3743,13 @@ process_item (PangoLayout *layout, gboolean retrying_with_char_breaks = FALSE; if (processing_new_item) - { - PangoGlyphItem glyph_item = {item, state->glyphs}; - state->log_widths = g_new (int, item->num_chars); - pango_glyph_item_get_logical_widths (&glyph_item, layout->text, state->log_widths); - state->need_hyphen = g_new (int, item->num_chars); + { + PangoGlyphItem glyph_item = {item, state->glyphs}; + state->log_widths = g_new (int, item->num_chars); + pango_glyph_item_get_logical_widths (&glyph_item, layout->text, state->log_widths); + state->need_hyphen = g_new (int, item->num_chars); get_need_hyphen (item, layout->text, state->need_hyphen); - } + } retry_break: @@ -3769,103 +3757,103 @@ process_item (PangoLayout *layout, width = 0; extra_width = 0; for (num_chars = 0; num_chars < item->num_chars; num_chars++) - { - if (width + extra_width > state->remaining_width && break_num_chars < item->num_chars) + { + if (width + extra_width > state->remaining_width && break_num_chars < item->num_chars) { break; } - /* If there are no previous runs we have to take care to grab at least one char. */ - if (can_break_at (layout, state->start_offset + num_chars, retrying_with_char_breaks) && - (num_chars > 0 || line->runs)) - { - break_num_chars = num_chars; - break_width = width; + /* If there are no previous runs we have to take care to grab at least one char. */ + if (can_break_at (layout, state->start_offset + num_chars, retrying_with_char_breaks) && + (num_chars > 0 || line->runs)) + { + break_num_chars = num_chars; + break_width = width; break_extra_width = extra_width; extra_width = find_break_extra_width (layout, state, num_chars); - } + } else extra_width = 0; - width += state->log_widths[state->log_widths_offset + num_chars]; - } + width += state->log_widths[state->log_widths_offset + num_chars]; + } /* If there's a space at the end of the line, include that also. * The logic here should match zero_line_final_space(). * XXX Currently it doesn't quite match the logic there. We don't check * the cluster here. But should be fine in practice. */ if (break_num_chars > 0 && break_num_chars < item->num_chars && - layout->log_attrs[state->start_offset + break_num_chars - 1].is_white) + layout->log_attrs[state->start_offset + break_num_chars - 1].is_white) { - break_width -= state->log_widths[state->log_widths_offset + break_num_chars - 1]; + break_width -= state->log_widths[state->log_widths_offset + break_num_chars - 1]; } if (layout->wrap == PANGO_WRAP_WORD_CHAR && force_fit && break_width + break_extra_width > state->remaining_width && !retrying_with_char_breaks) - { - retrying_with_char_breaks = TRUE; - num_chars = item->num_chars; - width = orig_width; - break_num_chars = num_chars; - break_width = width; - goto retry_break; - } - - if (force_fit || break_width + break_extra_width <= state->remaining_width) /* Successfully broke the item */ - { - if (state->remaining_width >= 0) - { - state->remaining_width -= break_width; - state->remaining_width = MAX (state->remaining_width, 0); - } - - if (break_num_chars == item->num_chars) - { + { + retrying_with_char_breaks = TRUE; + num_chars = item->num_chars; + width = orig_width; + break_num_chars = num_chars; + break_width = width; + goto retry_break; + } + + if (force_fit || break_width + break_extra_width <= state->remaining_width) /* Successfully broke the item */ + { + if (state->remaining_width >= 0) + { + state->remaining_width -= break_width; + state->remaining_width = MAX (state->remaining_width, 0); + } + + if (break_num_chars == item->num_chars) + { if (break_needs_hyphen (layout, state, break_num_chars)) item->analysis.flags |= PANGO_ANALYSIS_FLAG_NEED_HYPHEN; - insert_run (line, state, item, TRUE); + insert_run (line, state, item, TRUE); - return BREAK_ALL_FIT; - } - else if (break_num_chars == 0) - { - return BREAK_EMPTY_FIT; - } - else - { - PangoItem *new_item; + return BREAK_ALL_FIT; + } + else if (break_num_chars == 0) + { + return BREAK_EMPTY_FIT; + } + else + { + PangoItem *new_item; - length = g_utf8_offset_to_pointer (layout->text + item->offset, break_num_chars) - (layout->text + item->offset); + length = g_utf8_offset_to_pointer (layout->text + item->offset, break_num_chars) - (layout->text + item->offset); - new_item = pango_item_split (item, length, break_num_chars); + new_item = pango_item_split (item, length, break_num_chars); if (break_needs_hyphen (layout, state, break_num_chars)) new_item->analysis.flags |= PANGO_ANALYSIS_FLAG_NEED_HYPHEN; - /* Add the width back, to the line, reshape, subtract the new width */ - state->remaining_width += break_width; - insert_run (line, state, new_item, FALSE); - break_width = pango_glyph_string_get_width (((PangoGlyphItem *)(line->runs->data))->glyphs); - state->remaining_width -= break_width; + /* Add the width back, to the line, reshape, subtract the new width */ + state->remaining_width += break_width; + insert_run (line, state, new_item, FALSE); + break_width = pango_glyph_string_get_width (((PangoGlyphItem *)(line->runs->data))->glyphs); + state->remaining_width -= break_width; - state->log_widths_offset += break_num_chars; + state->log_widths_offset += break_num_chars; - /* Shaped items should never be broken */ - g_assert (!shape_set); + /* Shaped items should never be broken */ + g_assert (!shape_set); - return BREAK_SOME_FIT; - } - } + return BREAK_SOME_FIT; + } + } else - { - pango_glyph_string_free (state->glyphs); - state->glyphs = NULL; - g_free (state->log_widths); - state->log_widths = NULL; - g_free (state->need_hyphen); - state->need_hyphen = NULL; - - return BREAK_NONE_FIT; - } + { + pango_glyph_string_free (state->glyphs); + state->glyphs = NULL; + g_free (state->log_widths); + state->log_widths = NULL; + g_free (state->need_hyphen); + state->need_hyphen = NULL; + + return BREAK_NONE_FIT; + } } } @@ -3874,7 +3862,7 @@ process_item (PangoLayout *layout, */ static void line_set_resolved_dir (PangoLayoutLine *line, - PangoDirection direction) + PangoDirection direction) { switch (direction) { @@ -3893,14 +3881,14 @@ line_set_resolved_dir (PangoLayoutLine *line, } /* The direction vs. gravity dance: - * - If gravity is SOUTH, leave direction untouched. - * - If gravity is NORTH, switch direction. - * - If gravity is EAST, set to LTR, as - * it's a clockwise-rotated layout, so the rotated - * top is unrotated left. - * - If gravity is WEST, set to RTL, as - * it's a counter-clockwise-rotated layout, so the rotated - * top is unrotated right. + * - If gravity is SOUTH, leave direction untouched. + * - If gravity is NORTH, switch direction. + * - If gravity is EAST, set to LTR, as + * it's a clockwise-rotated layout, so the rotated + * top is unrotated left. + * - If gravity is WEST, set to RTL, as + * it's a counter-clockwise-rotated layout, so the rotated + * top is unrotated right. * * A similar dance is performed in pango-context.c: * itemize_state_add_character(). Keep in synch. @@ -3913,8 +3901,8 @@ line_set_resolved_dir (PangoLayoutLine *line, break; case PANGO_GRAVITY_NORTH: line->resolved_dir = PANGO_DIRECTION_LTR - + PANGO_DIRECTION_RTL - - line->resolved_dir; + + PANGO_DIRECTION_RTL + - line->resolved_dir; break; case PANGO_GRAVITY_EAST: /* This is in fact why deprecated TTB_RTL is LTR */ @@ -3928,19 +3916,19 @@ line_set_resolved_dir (PangoLayoutLine *line, } static gboolean -should_ellipsize_current_line (PangoLayout *layout, - ParaBreakState *state) +should_ellipsize_current_line (PangoLayout *layout, + ParaBreakState *state) { if (G_LIKELY (layout->ellipsize == PANGO_ELLIPSIZE_NONE || layout->width < 0)) return FALSE; - if (layout->height >= 0) { /* state->remaining_height is height of layout left */ /* if we can't stuff two more lines at the current guess of line height, - * the line we are going to produce is going to be the last line */ + * the line we are going to produce is going to be the last line + */ return state->line_height * 2 > state->remaining_height; } else @@ -3952,7 +3940,7 @@ should_ellipsize_current_line (PangoLayout *layout, static void add_line (PangoLayoutLine *line, - ParaBreakState *state) + ParaBreakState *state) { PangoLayout *layout = line->layout; @@ -3972,13 +3960,13 @@ add_line (PangoLayoutLine *line, static void process_line (PangoLayout *layout, - ParaBreakState *state) + ParaBreakState *state) { PangoLayoutLine *line; gboolean have_break = FALSE; /* If we've seen a possible break yet */ int break_remaining_width = 0; /* Remaining width before adding run with break */ - int break_start_offset = 0; /* Start offset before adding run with break */ + int break_start_offset = 0; /* Start offset before adding run with break */ GSList *break_link = NULL; /* Link holding run before break */ gboolean wrapped = FALSE; /* If we had to wrap the line */ @@ -3991,9 +3979,9 @@ process_line (PangoLayout *layout, if (state->line_width >= 0 && layout->alignment != PANGO_ALIGN_CENTER) { if (line->is_paragraph_start && layout->indent >= 0) - state->line_width -= layout->indent; + state->line_width -= layout->indent; else if (!line->is_paragraph_start && layout->indent < 0) - state->line_width += layout->indent; + state->line_width += layout->indent; if (state->line_width < 0) state->line_width = 0; @@ -4020,58 +4008,58 @@ process_line (PangoLayout *layout, result = process_item (layout, line, state, !have_break, FALSE); switch (result) - { - case BREAK_ALL_FIT: - if (can_break_in (layout, state->start_offset, old_num_chars, first_item_in_line)) - { - have_break = TRUE; - break_remaining_width = old_remaining_width; - break_start_offset = state->start_offset; - break_link = line->runs->next; - } + { + case BREAK_ALL_FIT: + if (can_break_in (layout, state->start_offset, old_num_chars, first_item_in_line)) + { + have_break = TRUE; + break_remaining_width = old_remaining_width; + break_start_offset = state->start_offset; + break_link = line->runs->next; + } - state->items = g_list_delete_link (state->items, state->items); - state->start_offset += old_num_chars; + state->items = g_list_delete_link (state->items, state->items); + state->start_offset += old_num_chars; - break; + break; - case BREAK_EMPTY_FIT: - wrapped = TRUE; - goto done; + case BREAK_EMPTY_FIT: + wrapped = TRUE; + goto done; - case BREAK_SOME_FIT: - state->start_offset += old_num_chars - item->num_chars; - wrapped = TRUE; - goto done; + case BREAK_SOME_FIT: + state->start_offset += old_num_chars - item->num_chars; + wrapped = TRUE; + goto done; - case BREAK_NONE_FIT: - /* Back up over unused runs to run where there is a break */ - while (line->runs && line->runs != break_link) - state->items = g_list_prepend (state->items, uninsert_run (line)); + case BREAK_NONE_FIT: + /* Back up over unused runs to run where there is a break */ + while (line->runs && line->runs != break_link) + state->items = g_list_prepend (state->items, uninsert_run (line)); - state->start_offset = break_start_offset; - state->remaining_width = break_remaining_width; + state->start_offset = break_start_offset; + state->remaining_width = break_remaining_width; - /* Reshape run to break */ - item = state->items->data; + /* Reshape run to break */ + item = state->items->data; - old_num_chars = item->num_chars; - result = process_item (layout, line, state, TRUE, TRUE); - g_assert (result == BREAK_SOME_FIT || result == BREAK_EMPTY_FIT); + old_num_chars = item->num_chars; + result = process_item (layout, line, state, TRUE, TRUE); + g_assert (result == BREAK_SOME_FIT || result == BREAK_EMPTY_FIT); - state->start_offset += old_num_chars - item->num_chars; + state->start_offset += old_num_chars - item->num_chars; - wrapped = TRUE; - goto done; + wrapped = TRUE; + goto done; - case BREAK_LINE_SEPARATOR: - state->items = g_list_delete_link (state->items, state->items); - state->start_offset += old_num_chars; - /* A line-separate is just a forced break. Set wrapped, so we do - * justification */ - wrapped = TRUE; - goto done; - } + case BREAK_LINE_SEPARATOR: + state->items = g_list_delete_link (state->items, state->items); + state->start_offset += old_num_chars; + /* A line-separate is just a forced break. Set wrapped, so we do + * justification */ + wrapped = TRUE; + goto done; + } } done: @@ -4086,8 +4074,8 @@ static void get_items_log_attrs (const char *text, int start, int length, - GList *items, - PangoLogAttr *log_attrs, + GList *items, + PangoLogAttr *log_attrs, int log_attrs_len) { int offset = 0; @@ -4300,7 +4288,7 @@ pango_layout_check_lines (PangoLayout *layout) { prev_base_dir = pango_find_base_dir (layout->text, layout->length); if (prev_base_dir == PANGO_DIRECTION_NEUTRAL) - prev_base_dir = pango_context_get_base_dir (layout->context); + prev_base_dir = pango_context_get_base_dir (layout->context); } else base_dir = pango_context_get_base_dir (layout->context); @@ -4322,50 +4310,50 @@ pango_layout_check_lines (PangoLayout *layout) int delimiter_index, next_para_index; if (layout->single_paragraph) - { - delimiter_index = layout->length; - next_para_index = layout->length; - } + { + delimiter_index = layout->length; + next_para_index = layout->length; + } else - { - pango_find_paragraph_boundary (start, - (layout->text + layout->length) - start, - &delimiter_index, - &next_para_index); - } + { + pango_find_paragraph_boundary (start, + (layout->text + layout->length) - start, + &delimiter_index, + &next_para_index); + } g_assert (next_para_index >= delimiter_index); if (layout->auto_dir) - { - base_dir = pango_find_base_dir (start, delimiter_index); + { + base_dir = pango_find_base_dir (start, delimiter_index); - /* Propagate the base direction for neutral paragraphs */ - if (base_dir == PANGO_DIRECTION_NEUTRAL) - base_dir = prev_base_dir; - else - prev_base_dir = base_dir; - } + /* Propagate the base direction for neutral paragraphs */ + if (base_dir == PANGO_DIRECTION_NEUTRAL) + base_dir = prev_base_dir; + else + prev_base_dir = base_dir; + } end = start + delimiter_index; delim_len = next_para_index - delimiter_index; if (end == (layout->text + layout->length)) - done = TRUE; + done = TRUE; g_assert (end <= (layout->text + layout->length)); g_assert (start <= (layout->text + layout->length)); - g_assert (delim_len < 4); /* PS is 3 bytes */ + g_assert (delim_len < 4); /* PS is 3 bytes */ g_assert (delim_len >= 0); state.attrs = itemize_attrs; state.items = pango_itemize_with_base_dir (layout->context, - base_dir, - layout->text, - start - layout->text, - end - start, - itemize_attrs, + base_dir, + layout->text, + start - layout->text, + end - start, + itemize_attrs, itemize_attrs ? &iter : NULL); apply_attributes_to_items (state.items, shape_attrs); @@ -4374,7 +4362,7 @@ pango_layout_check_lines (PangoLayout *layout) start - layout->text, delimiter_index + delim_len, state.items, - layout->log_attrs + start_offset, + layout->log_attrs + start_offset, layout->n_chars + 1 - start_offset); state.base_dir = base_dir; @@ -4395,27 +4383,27 @@ pango_layout_check_lines (PangoLayout *layout) state.hyphen_width = -1; if (state.items) - { - while (state.items) - process_line (layout, &state); - } + { + while (state.items) + process_line (layout, &state); + } else - { - PangoLayoutLine *empty_line; + { + PangoLayoutLine *empty_line; - empty_line = pango_layout_line_new (layout); - empty_line->start_index = state.line_start_index; - empty_line->is_paragraph_start = TRUE; - line_set_resolved_dir (empty_line, base_dir); + empty_line = pango_layout_line_new (layout); + empty_line->start_index = state.line_start_index; + empty_line->is_paragraph_start = TRUE; + line_set_resolved_dir (empty_line, base_dir); - add_line (empty_line, &state); - } + add_line (empty_line, &state); + } if (layout->height >= 0 && state.remaining_height < state.line_height) - done = TRUE; + done = TRUE; if (!done) - start_offset += pango_utf8_strlen (start, (end - start) + delim_len); + start_offset += pango_utf8_strlen (start, (end - start) + delim_len); start = end + delim_len; } @@ -4438,14 +4426,14 @@ pango_layout_check_lines (PangoLayout *layout) /** * pango_layout_line_ref: - * @line: (nullable): a #PangoLayoutLine, may be %NULL + * @line: (nullable): a `PangoLayoutLine`, may be %NULL * - * Increase the reference count of a #PangoLayoutLine by one. + * Increase the reference count of a `PangoLayoutLine` by one. * * Return value: the line passed in. * * Since: 1.10 - **/ + */ PangoLayoutLine * pango_layout_line_ref (PangoLayoutLine *line) { @@ -4461,12 +4449,12 @@ pango_layout_line_ref (PangoLayoutLine *line) /** * pango_layout_line_unref: - * @line: a #PangoLayoutLine + * @line: a `PangoLayoutLine` * - * Decrease the reference count of a #PangoLayoutLine by one. + * Decrease the reference count of a `PangoLayoutLine` by one. * If the result is zero, the line and all associated memory * will be freed. - **/ + */ void pango_layout_line_unref (PangoLayoutLine *line) { @@ -4491,34 +4479,32 @@ G_DEFINE_BOXED_TYPE (PangoLayoutLine, pango_layout_line, /** * pango_layout_line_x_to_index: - * @line: a #PangoLayoutLine - * @x_pos: the X offset (in Pango units) - * from the left edge of the line. - * @index_: (out): location to store calculated byte index for - * the grapheme in which the user clicked. - * @trailing: (out): location to store an integer indicating where - * in the grapheme the user clicked. It will either - * be zero, or the number of characters in the - * grapheme. 0 represents the leading edge of the grapheme. - * - * Converts from x offset to the byte index of the corresponding - * character within the text of the layout. If @x_pos is outside the line, - * @index_ and @trailing will point to the very first or very last position - * in the line. This determination is based on the resolved direction - * of the paragraph; for example, if the resolved direction is - * right-to-left, then an X position to the right of the line (after it) - * results in 0 being stored in @index_ and @trailing. An X position to the - * left of the line results in @index_ pointing to the (logical) last - * grapheme in the line and @trailing being set to the number of characters - * in that grapheme. The reverse is true for a left-to-right line. + * @line: a `PangoLayoutLine` + * @x_pos: the X offset (in Pango units) from the left edge of the line. + * @index_: (out): location to store calculated byte index for the grapheme + * in which the user clicked. + * @trailing: (out): location to store an integer indicating where in the + * grapheme the user clicked. It will either be zero, or the number of + * characters in the grapheme. 0 represents the leading edge of the grapheme. + * + * Converts from x offset to the byte index of the corresponding character + * within the text of the layout. If @x_pos is outside the line, @index_ and + * @trailing will point to the very first or very last position in the line. + * This determination is based on the resolved direction of the paragraph; + * for example, if the resolved direction is right-to-left, then an X position + * to the right of the line (after it) results in 0 being stored in @index_ + * and @trailing. An X position to the left of the line results in @index_ + * pointing to the (logical) last grapheme in the line and @trailing being + * set to the number of characters in that grapheme. The reverse is true for + * a left-to-right line. * * Return value: %FALSE if @x_pos was outside the line, %TRUE if inside - **/ + */ gboolean pango_layout_line_x_to_index (PangoLayoutLine *line, - int x_pos, - int *index, - int *trailing) + int x_pos, + int *index, + int *trailing) { GSList *tmp_list; gint start_pos = 0; @@ -4543,9 +4529,9 @@ pango_layout_line_x_to_index (PangoLayoutLine *line, if (line->length == 0) { if (index) - *index = first_index; + *index = first_index; if (trailing) - *trailing = 0; + *trailing = 0; return FALSE; } @@ -4606,10 +4592,10 @@ pango_layout_line_x_to_index (PangoLayoutLine *line, { /* pick the leftmost char */ if (index) - *index = (line->resolved_dir == PANGO_DIRECTION_LTR) ? first_index : last_index; + *index = (line->resolved_dir == PANGO_DIRECTION_LTR) ? first_index : last_index; /* and its leftmost edge */ if (trailing) - *trailing = (line->resolved_dir == PANGO_DIRECTION_LTR || suppress_last_trailing) ? 0 : last_trailing; + *trailing = (line->resolved_dir == PANGO_DIRECTION_LTR || suppress_last_trailing) ? 0 : last_trailing; return FALSE; } @@ -4623,58 +4609,58 @@ pango_layout_line_x_to_index (PangoLayoutLine *line, logical_width = pango_glyph_string_get_width (run->glyphs); if (x_pos >= start_pos && x_pos < start_pos + logical_width) - { - int offset; - gboolean char_trailing; - int grapheme_start_index; - int grapheme_start_offset; - int grapheme_end_offset; - int pos; - int char_index; - - pango_glyph_string_x_to_index (run->glyphs, - layout->text + run->item->offset, run->item->length, - &run->item->analysis, - x_pos - start_pos, - &pos, &char_trailing); - - char_index = run->item->offset + pos; - - /* Convert from characters to graphemes */ - - offset = g_utf8_pointer_to_offset (layout->text, layout->text + char_index); - - grapheme_start_offset = offset; - grapheme_start_index = char_index; - while (grapheme_start_offset > first_offset && - !layout->log_attrs[grapheme_start_offset].is_cursor_position) - { - grapheme_start_index = g_utf8_prev_char (layout->text + grapheme_start_index) - layout->text; - grapheme_start_offset--; - } - - grapheme_end_offset = offset; - do - { - grapheme_end_offset++; - } - while (grapheme_end_offset < end_offset && - !layout->log_attrs[grapheme_end_offset].is_cursor_position); - - if (index) - *index = grapheme_start_index; - - if (trailing) - { - if ((grapheme_end_offset == end_offset && suppress_last_trailing) || - offset + char_trailing <= (grapheme_start_offset + grapheme_end_offset) / 2) - *trailing = 0; - else - *trailing = grapheme_end_offset - grapheme_start_offset; - } - - return TRUE; - } + { + int offset; + gboolean char_trailing; + int grapheme_start_index; + int grapheme_start_offset; + int grapheme_end_offset; + int pos; + int char_index; + + pango_glyph_string_x_to_index (run->glyphs, + layout->text + run->item->offset, run->item->length, + &run->item->analysis, + x_pos - start_pos, + &pos, &char_trailing); + + char_index = run->item->offset + pos; + + /* Convert from characters to graphemes */ + + offset = g_utf8_pointer_to_offset (layout->text, layout->text + char_index); + + grapheme_start_offset = offset; + grapheme_start_index = char_index; + while (grapheme_start_offset > first_offset && + !layout->log_attrs[grapheme_start_offset].is_cursor_position) + { + grapheme_start_index = g_utf8_prev_char (layout->text + grapheme_start_index) - layout->text; + grapheme_start_offset--; + } + + grapheme_end_offset = offset; + do + { + grapheme_end_offset++; + } + while (grapheme_end_offset < end_offset && + !layout->log_attrs[grapheme_end_offset].is_cursor_position); + + if (index) + *index = grapheme_start_index; + + if (trailing) + { + if ((grapheme_end_offset == end_offset && suppress_last_trailing) || + offset + char_trailing <= (grapheme_start_offset + grapheme_end_offset) / 2) + *trailing = 0; + else + *trailing = grapheme_end_offset - grapheme_start_offset; + } + + return TRUE; + } start_pos += logical_width; tmp_list = tmp_list->next; @@ -4711,24 +4697,21 @@ pango_layout_line_get_width (PangoLayoutLine *line) /** * pango_layout_line_get_x_ranges: - * @line: a #PangoLayoutLine + * @line: a `PangoLayoutLine` * @start_index: Start byte index of the logical range. If this value - * is less than the start index for the line, then - * the first range will extend all the way to the leading - * edge of the layout. Otherwise it will start at the - * leading edge of the first character. - * @end_index: Ending byte index of the logical range. If this value - * is greater than the end index for the line, then - * the last range will extend all the way to the trailing - * edge of the layout. Otherwise, it will end at the - * trailing edge of the last character. - * @ranges: (out) (array length=n_ranges) (transfer full): - * location to store a pointer to an array of ranges. - * The array will be of length `2*n_ranges`, - * with each range starting at `(*ranges)[2*n]` - * and of width `(*ranges)[2*n + 1] - (*ranges)[2*n]`. - * This array must be freed with g_free(). The coordinates - * are relative to the layout and are in Pango units. + * is less than the start index for the line, then the first range + * will extend all the way to the leading edge of the layout. Otherwise, + * it will start at the leading edge of the first character. + * @end_index: Ending byte index of the logical range. If this value is + * greater than the end index for the line, then the last range will + * extend all the way to the trailing edge of the layout. Otherwise, + * it will end at the trailing edge of the last character. + * @ranges: (out) (array length=n_ranges) (transfer full): location to + * store a pointer to an array of ranges. The array will be of length + * `2*n_ranges`, with each range starting at `(*ranges)[2*n]` and of + * width `(*ranges)[2*n + 1] - (*ranges)[2*n]`. This array must be freed + * with g_free(). The coordinates are relative to the layout and are in + * Pango units. * @n_ranges: The number of ranges stored in @ranges. * * Gets a list of visual ranges corresponding to a given logical range. @@ -4736,13 +4719,13 @@ pango_layout_line_get_width (PangoLayoutLine *line) * ranges which are adjacent. The ranges will be sorted from left to * right. The ranges are with respect to the left edge of the entire * layout, not with respect to the line. - **/ + */ void pango_layout_line_get_x_ranges (PangoLayoutLine *line, - int start_index, - int end_index, - int **ranges, - int *n_ranges) + int start_index, + int end_index, + int **ranges, + int *n_ranges) { gint line_start_index = 0; GSList *tmp_list; @@ -4790,10 +4773,10 @@ pango_layout_line_get_x_ranges (PangoLayoutLine *line, (line->resolved_dir == PANGO_DIRECTION_RTL && end_index > line_start_index + line->length))) { if (ranges) - { - (*ranges)[2*range_count] = 0; - (*ranges)[2*range_count + 1] = x_offset; - } + { + (*ranges)[2*range_count] = 0; + (*ranges)[2*range_count + 1] = x_offset; + } range_count ++; } @@ -4804,42 +4787,42 @@ pango_layout_line_get_x_ranges (PangoLayoutLine *line, PangoLayoutRun *run = (PangoLayoutRun *)tmp_list->data; if ((start_index < run->item->offset + run->item->length && - end_index > run->item->offset)) - { - if (ranges) - { - int run_start_index = MAX (start_index, run->item->offset); - int run_end_index = MIN (end_index, run->item->offset + run->item->length); - int run_start_x, run_end_x; - - g_assert (run_end_index > 0); - - /* Back the end_index off one since we want to find the trailing edge of the preceding character */ - - run_end_index = g_utf8_prev_char (line->layout->text + run_end_index) - line->layout->text; - - pango_glyph_string_index_to_x (run->glyphs, - line->layout->text + run->item->offset, - run->item->length, - &run->item->analysis, - run_start_index - run->item->offset, FALSE, - &run_start_x); - pango_glyph_string_index_to_x (run->glyphs, - line->layout->text + run->item->offset, - run->item->length, - &run->item->analysis, - run_end_index - run->item->offset, TRUE, - &run_end_x); - - (*ranges)[2*range_count] = x_offset + accumulated_width + MIN (run_start_x, run_end_x); - (*ranges)[2*range_count + 1] = x_offset + accumulated_width + MAX (run_start_x, run_end_x); - } - - range_count++; - } + end_index > run->item->offset)) + { + if (ranges) + { + int run_start_index = MAX (start_index, run->item->offset); + int run_end_index = MIN (end_index, run->item->offset + run->item->length); + int run_start_x, run_end_x; + + g_assert (run_end_index > 0); + + /* Back the end_index off one since we want to find the trailing edge of the preceding character */ + + run_end_index = g_utf8_prev_char (line->layout->text + run_end_index) - line->layout->text; + + pango_glyph_string_index_to_x (run->glyphs, + line->layout->text + run->item->offset, + run->item->length, + &run->item->analysis, + run_start_index - run->item->offset, FALSE, + &run_start_x); + pango_glyph_string_index_to_x (run->glyphs, + line->layout->text + run->item->offset, + run->item->length, + &run->item->analysis, + run_end_index - run->item->offset, TRUE, + &run_end_x); + + (*ranges)[2*range_count] = x_offset + accumulated_width + MIN (run_start_x, run_end_x); + (*ranges)[2*range_count + 1] = x_offset + accumulated_width + MAX (run_start_x, run_end_x); + } + + range_count++; + } if (tmp_list->next) - accumulated_width += pango_glyph_string_get_width (run->glyphs); + accumulated_width += pango_glyph_string_get_width (run->glyphs); tmp_list = tmp_list->next; } @@ -4849,10 +4832,10 @@ pango_layout_line_get_x_ranges (PangoLayoutLine *line, (line->resolved_dir == PANGO_DIRECTION_RTL && start_index < line_start_index))) { if (ranges) - { - (*ranges)[2*range_count] = x_offset + line_width; - (*ranges)[2*range_count + 1] = line->layout->width; - } + { + (*ranges)[2*range_count] = x_offset + line_width; + (*ranges)[2*range_count + 1] = line->layout->width; + } range_count ++; } @@ -4863,8 +4846,8 @@ pango_layout_line_get_x_ranges (PangoLayoutLine *line, static void pango_layout_get_empty_extents_at_index (PangoLayout *layout, - int index, - PangoRectangle *logical_rect) + int index, + PangoRectangle *logical_rect) { if (logical_rect) { @@ -4876,76 +4859,76 @@ pango_layout_get_empty_extents_at_index (PangoLayout *layout, if (layout->font_desc) { - font_desc = pango_font_description_copy_static (font_desc); - pango_font_description_merge (font_desc, layout->font_desc, TRUE); - free_font_desc = TRUE; - } + font_desc = pango_font_description_copy_static (font_desc); + pango_font_description_merge (font_desc, layout->font_desc, TRUE); + free_font_desc = TRUE; + } /* Find the font description for this line */ if (layout->attrs) - { + { PangoAttrIterator iter; - int start, end; + int start, end; _pango_attr_list_get_iterator (layout->attrs, &iter); - do - { + do + { pango_attr_iterator_range (&iter, &start, &end); - if (start <= index && index < end) - { - if (!free_font_desc) - { - font_desc = pango_font_description_copy_static (font_desc); - free_font_desc = TRUE; - } + if (start <= index && index < end) + { + if (!free_font_desc) + { + font_desc = pango_font_description_copy_static (font_desc); + free_font_desc = TRUE; + } pango_attr_iterator_get_font (&iter, - font_desc, - NULL, - NULL); + font_desc, + NULL, + NULL); - break; - } + break; + } - } + } while (pango_attr_iterator_next (&iter)); _pango_attr_iterator_destroy (&iter); - } + } font = pango_context_load_font (layout->context, font_desc); if (font) - { - PangoFontMetrics *metrics; - - metrics = pango_font_get_metrics (font, - pango_context_get_language (layout->context)); - - if (metrics) - { - logical_rect->y = - pango_font_metrics_get_ascent (metrics); - logical_rect->height = - logical_rect->y + pango_font_metrics_get_descent (metrics); - - pango_font_metrics_unref (metrics); - } - else - { - logical_rect->y = 0; - logical_rect->height = 0; - } - g_object_unref (font); - } + { + PangoFontMetrics *metrics; + + metrics = pango_font_get_metrics (font, + pango_context_get_language (layout->context)); + + if (metrics) + { + logical_rect->y = - pango_font_metrics_get_ascent (metrics); + logical_rect->height = - logical_rect->y + pango_font_metrics_get_descent (metrics); + + pango_font_metrics_unref (metrics); + } + else + { + logical_rect->y = 0; + logical_rect->height = 0; + } + g_object_unref (font); + } else - { - logical_rect->y = 0; - logical_rect->height = 0; - } + { + logical_rect->y = 0; + logical_rect->height = 0; + } if (free_font_desc) - pango_font_description_free (font_desc); + pango_font_description_free (font_desc); logical_rect->x = 0; logical_rect->width = 0; @@ -4954,7 +4937,7 @@ pango_layout_get_empty_extents_at_index (PangoLayout *layout, static void pango_layout_line_get_empty_extents (PangoLayoutLine *line, - PangoRectangle *logical_rect) + PangoRectangle *logical_rect) { pango_layout_get_empty_extents_at_index (line->layout, line->start_index, logical_rect); } @@ -4988,12 +4971,12 @@ pango_layout_run_get_extents_and_height (PangoLayoutRun *run, if (properties.shape_set) _pango_shape_get_extents (run->item->num_chars, - properties.shape_ink_rect, - properties.shape_logical_rect, - run_ink, run_logical); + properties.shape_ink_rect, + properties.shape_logical_rect, + run_ink, run_logical); else pango_glyph_string_extents (run->glyphs, run->item->analysis.font, - run_ink, run_logical); + run_ink, run_logical); if (run_ink && (has_underline || has_overline || properties.strikethrough)) { @@ -5005,7 +4988,7 @@ pango_layout_run_get_extents_and_height (PangoLayoutRun *run, if (!metrics) metrics = pango_font_get_metrics (run->item->analysis.font, - run->item->analysis.language); + run->item->analysis.language); underline_thickness = pango_font_metrics_get_underline_thickness (metrics); underline_position = pango_font_metrics_get_underline_position (metrics); @@ -5024,18 +5007,18 @@ pango_layout_run_get_extents_and_height (PangoLayoutRun *run, */ if (properties.strikethrough) - { - if (run_ink->height == 0) - { - run_ink->height = strikethrough_thickness; - run_ink->y = -strikethrough_position; - } - } + { + if (run_ink->height == 0) + { + run_ink->height = strikethrough_thickness; + run_ink->y = -strikethrough_position; + } + } if (properties.oline_single) { - run_ink->y -= underline_thickness; - run_ink->height += underline_thickness; + run_ink->y -= underline_thickness; + run_ink->height += underline_thickness; } if (properties.uline_low) @@ -5055,7 +5038,7 @@ pango_layout_run_get_extents_and_height (PangoLayoutRun *run, { if (!metrics) metrics = pango_font_get_metrics (run->item->analysis.font, - run->item->analysis.language); + run->item->analysis.language); *height = pango_font_metrics_get_height (metrics); } @@ -5065,7 +5048,7 @@ pango_layout_run_get_extents_and_height (PangoLayoutRun *run, int adjustment = run_logical->y + run_logical->height / 2; if (is_hinted) - adjustment = PANGO_UNITS_ROUND (adjustment); + adjustment = PANGO_UNITS_ROUND (adjustment); properties.rise += adjustment; } @@ -5073,10 +5056,10 @@ pango_layout_run_get_extents_and_height (PangoLayoutRun *run, if (properties.rise != 0) { if (run_ink) - run_ink->y -= properties.rise; + run_ink->y -= properties.rise; if (run_logical) - run_logical->y -= properties.rise; + run_logical->y -= properties.rise; } if (metrics) @@ -5103,28 +5086,28 @@ pango_layout_line_get_extents_and_height (PangoLayoutLine *line, { case CACHED: { - if (ink_rect) - *ink_rect = private->ink_rect; - if (logical_rect) - *logical_rect = private->logical_rect; + if (ink_rect) + *ink_rect = private->ink_rect; + if (logical_rect) + *logical_rect = private->logical_rect; if (height) *height = private->height; - return; + return; } case NOT_CACHED: { - caching = TRUE; - if (!ink_rect) - ink_rect = &private->ink_rect; - if (!logical_rect) - logical_rect = &private->logical_rect; + caching = TRUE; + if (!ink_rect) + ink_rect = &private->ink_rect; + if (!logical_rect) + logical_rect = &private->logical_rect; if (!height) height = &private->height; - break; + break; } case LEAKED: { - break; + break; } } @@ -5162,37 +5145,37 @@ pango_layout_line_get_extents_and_height (PangoLayoutLine *line, height ? &run_height : NULL); if (ink_rect) - { - if (ink_rect->width == 0 || ink_rect->height == 0) - { - *ink_rect = run_ink; - ink_rect->x += x_pos; - } - else if (run_ink.width != 0 && run_ink.height != 0) - { - new_pos = MIN (ink_rect->x, x_pos + run_ink.x); - ink_rect->width = MAX (ink_rect->x + ink_rect->width, - x_pos + run_ink.x + run_ink.width) - new_pos; - ink_rect->x = new_pos; - - new_pos = MIN (ink_rect->y, run_ink.y); - ink_rect->height = MAX (ink_rect->y + ink_rect->height, - run_ink.y + run_ink.height) - new_pos; - ink_rect->y = new_pos; - } - } + { + if (ink_rect->width == 0 || ink_rect->height == 0) + { + *ink_rect = run_ink; + ink_rect->x += x_pos; + } + else if (run_ink.width != 0 && run_ink.height != 0) + { + new_pos = MIN (ink_rect->x, x_pos + run_ink.x); + ink_rect->width = MAX (ink_rect->x + ink_rect->width, + x_pos + run_ink.x + run_ink.width) - new_pos; + ink_rect->x = new_pos; + + new_pos = MIN (ink_rect->y, run_ink.y); + ink_rect->height = MAX (ink_rect->y + ink_rect->height, + run_ink.y + run_ink.height) - new_pos; + ink_rect->y = new_pos; + } + } if (logical_rect) { new_pos = MIN (logical_rect->x, x_pos + run_logical.x); logical_rect->width = MAX (logical_rect->x + logical_rect->width, - x_pos + run_logical.x + run_logical.width) - new_pos; - logical_rect->x = new_pos; + x_pos + run_logical.x + run_logical.width) - new_pos; + logical_rect->x = new_pos; - new_pos = MIN (logical_rect->y, run_logical.y); - logical_rect->height = MAX (logical_rect->y + logical_rect->height, - run_logical.y + run_logical.height) - new_pos; - logical_rect->y = new_pos; + new_pos = MIN (logical_rect->y, run_logical.y); + logical_rect->height = MAX (logical_rect->y + logical_rect->height, + run_logical.y + run_logical.height) - new_pos; + logical_rect->y = new_pos; } if (height) @@ -5208,9 +5191,9 @@ pango_layout_line_get_extents_and_height (PangoLayoutLine *line, if (caching) { if (&private->ink_rect != ink_rect) - private->ink_rect = *ink_rect; + private->ink_rect = *ink_rect; if (&private->logical_rect != logical_rect) - private->logical_rect = *logical_rect; + private->logical_rect = *logical_rect; if (&private->height != height) private->height = *height; private->cache_status = CACHED; @@ -5219,37 +5202,37 @@ pango_layout_line_get_extents_and_height (PangoLayoutLine *line, /** * pango_layout_line_get_extents: - * @line: a #PangoLayoutLine + * @line: a `PangoLayoutLine` * @ink_rect: (out) (allow-none): rectangle used to store the extents of - * the glyph string as drawn, or %NULL + * the glyph string as drawn, or %NULL * @logical_rect: (out) (allow-none):rectangle used to store the logical - * extents of the glyph string, or %NULL + * extents of the glyph string, or %NULL * * Computes the logical and ink extents of a layout line. See - * pango_font_get_glyph_extents() for details about the interpretation - * of the rectangles. + * [method@Pango.Font.get_glyph_extents] for details about the + * interpretation of the rectangles. */ void pango_layout_line_get_extents (PangoLayoutLine *line, - PangoRectangle *ink_rect, - PangoRectangle *logical_rect) + PangoRectangle *ink_rect, + PangoRectangle *logical_rect) { pango_layout_line_get_extents_and_height (line, ink_rect, logical_rect, NULL); } /** * pango_layout_line_get_height: - * @line: a #PangoLayoutLine + * @line: a `PangoLayoutLine` * @height: (out) (allow-none): return location for the line height * - * Computes the height of the line, ie the distance between + * Computes the height of the line, i.e. the distance between * this and the previous lines baseline. * * Since: 1.44 */ void pango_layout_line_get_height (PangoLayoutLine *line, - int *height) + int *height) { pango_layout_line_get_extents_and_height (line, NULL, NULL, height); } @@ -5273,22 +5256,23 @@ pango_layout_line_new (PangoLayout *layout) /** * pango_layout_line_get_pixel_extents: - * @layout_line: a #PangoLayoutLine + * @layout_line: a `PangoLayoutLine` * @ink_rect: (out) (allow-none): rectangle used to store the extents of - * the glyph string as drawn, or %NULL + * the glyph string as drawn, or %NULL * @logical_rect: (out) (allow-none): rectangle used to store the logical - * extents of the glyph string, or %NULL + * extents of the glyph string, or %NULL * * Computes the logical and ink extents of @layout_line in device units. - * This function just calls pango_layout_line_get_extents() followed by - * two pango_extents_to_pixels() calls, rounding @ink_rect and @logical_rect + * + * This function just calls [method@Pango.LayoutLine.get_extents] followed by + * two [func@extents_to_pixels] calls, rounding @ink_rect and @logical_rect * such that the rounded rectangles fully contain the unrounded one (that is, - * passes them as first argument to pango_extents_to_pixels()). - **/ + * passes them as first argument to [func@extents_to_pixels]). + */ void pango_layout_line_get_pixel_extents (PangoLayoutLine *layout_line, - PangoRectangle *ink_rect, - PangoRectangle *logical_rect) + PangoRectangle *ink_rect, + PangoRectangle *logical_rect) { g_return_if_fail (LINE_IS_VALID (layout_line)); @@ -5301,9 +5285,9 @@ pango_layout_line_get_pixel_extents (PangoLayoutLine *layout_line, * NB: This implement the exact same algorithm as * reorder-items.c:pango_reorder_items(). */ - static GSList * -reorder_runs_recurse (GSList *items, int n_items) +reorder_runs_recurse (GSList *items, + int n_items) { GSList *tmp_list, *level_start_node; int i, level_start_i; @@ -5331,23 +5315,23 @@ reorder_runs_recurse (GSList *items, int n_items) PangoLayoutRun *run = tmp_list->data; if (run->item->analysis.level == min_level) - { - if (min_level % 2) - { - if (i > level_start_i) - result = g_slist_concat (reorder_runs_recurse (level_start_node, i - level_start_i), result); - result = g_slist_prepend (result, run); - } - else - { - if (i > level_start_i) - result = g_slist_concat (result, reorder_runs_recurse (level_start_node, i - level_start_i)); - result = g_slist_append (result, run); - } - - level_start_i = i + 1; - level_start_node = tmp_list->next; - } + { + if (min_level % 2) + { + if (i > level_start_i) + result = g_slist_concat (reorder_runs_recurse (level_start_node, i - level_start_i), result); + result = g_slist_prepend (result, run); + } + else + { + if (i > level_start_i) + result = g_slist_concat (result, reorder_runs_recurse (level_start_node, i - level_start_i)); + result = g_slist_append (result, run); + } + + level_start_i = i + 1; + level_start_node = tmp_list->next; + } tmp_list = tmp_list->next; } @@ -5355,12 +5339,12 @@ reorder_runs_recurse (GSList *items, int n_items) if (min_level % 2) { if (i > level_start_i) - result = g_slist_concat (reorder_runs_recurse (level_start_node, i - level_start_i), result); + result = g_slist_concat (reorder_runs_recurse (level_start_node, i - level_start_i), result); } else { if (i > level_start_i) - result = g_slist_concat (result, reorder_runs_recurse (level_start_node, i - level_start_i)); + result = g_slist_concat (result, reorder_runs_recurse (level_start_node, i - level_start_i)); } return result; @@ -5416,8 +5400,8 @@ get_item_letter_spacing (PangoItem *item) static void pad_glyphstring_right (PangoGlyphString *glyphs, - ParaBreakState *state, - int adjustment) + ParaBreakState *state, + int adjustment) { int glyph = glyphs->num_glyphs - 1; @@ -5438,8 +5422,8 @@ pad_glyphstring_right (PangoGlyphString *glyphs, static void pad_glyphstring_left (PangoGlyphString *glyphs, - ParaBreakState *state, - int adjustment) + ParaBreakState *state, + int adjustment) { int glyph = 0; @@ -5456,15 +5440,15 @@ pad_glyphstring_left (PangoGlyphString *glyphs, static gboolean is_tab_run (PangoLayout *layout, - PangoLayoutRun *run) + PangoLayoutRun *run) { return (layout->text[run->item->offset] == '\t'); } static void zero_line_final_space (PangoLayoutLine *line, - ParaBreakState *state, - PangoLayoutRun *run) + ParaBreakState *state, + PangoLayoutRun *run) { PangoLayout *layout = line->layout; PangoItem *item = run->item; @@ -5505,7 +5489,7 @@ zero_line_final_space (PangoLayoutLine *line, */ static void adjust_line_letter_spacing (PangoLayoutLine *line, - ParaBreakState *state) + ParaBreakState *state) { PangoLayout *layout = line->layout; gboolean reversed; @@ -5522,12 +5506,12 @@ adjust_line_letter_spacing (PangoLayoutLine *line, if (line->resolved_dir == PANGO_DIRECTION_RTL) { for (l = line->runs; l; l = l->next) - if (is_tab_run (layout, l->data)) - { - line->runs = g_slist_reverse (line->runs); - reversed = TRUE; - break; - } + if (is_tab_run (layout, l->data)) + { + line->runs = g_slist_reverse (line->runs); + reversed = TRUE; + break; + } } /* Walk over the runs in the line, redistributing letter @@ -5539,7 +5523,6 @@ adjust_line_letter_spacing (PangoLayoutLine *line, * which we add onto the next tab stop space to keep the * things properly aligned. */ - last_run = NULL; tab_adjustment = 0; for (l = line->runs; l; l = l->next) @@ -5548,43 +5531,43 @@ adjust_line_letter_spacing (PangoLayoutLine *line, PangoLayoutRun *next_run = l->next ? l->next->data : NULL; if (is_tab_run (layout, run)) - { - pad_glyphstring_right (run->glyphs, state, tab_adjustment); - tab_adjustment = 0; - } + { + pad_glyphstring_right (run->glyphs, state, tab_adjustment); + tab_adjustment = 0; + } else - { - PangoLayoutRun *visual_next_run = reversed ? last_run : next_run; - PangoLayoutRun *visual_last_run = reversed ? next_run : last_run; - int run_spacing = get_item_letter_spacing (run->item); - int space_left, space_right; - - distribute_letter_spacing (run_spacing, &space_left, &space_right); - - if (run->glyphs->glyphs[0].geometry.width == 0) - { - /* we've zeroed this space glyph at the end of line, now remove - * the letter spacing added to its adjacent glyph */ - pad_glyphstring_left (run->glyphs, state, - space_left); - } - else if (!visual_last_run || is_tab_run (layout, visual_last_run)) - { - pad_glyphstring_left (run->glyphs, state, - space_left); - tab_adjustment += space_left; - } - - if (run->glyphs->glyphs[run->glyphs->num_glyphs - 1].geometry.width == 0) - { - /* we've zeroed this space glyph at the end of line, now remove - * the letter spacing added to its adjacent glyph */ - pad_glyphstring_right (run->glyphs, state, - space_right); - } - else if (!visual_next_run || is_tab_run (layout, visual_next_run)) - { - pad_glyphstring_right (run->glyphs, state, - space_right); - tab_adjustment += space_right; - } - } + { + PangoLayoutRun *visual_next_run = reversed ? last_run : next_run; + PangoLayoutRun *visual_last_run = reversed ? next_run : last_run; + int run_spacing = get_item_letter_spacing (run->item); + int space_left, space_right; + + distribute_letter_spacing (run_spacing, &space_left, &space_right); + + if (run->glyphs->glyphs[0].geometry.width == 0) + { + /* we've zeroed this space glyph at the end of line, now remove + * the letter spacing added to its adjacent glyph */ + pad_glyphstring_left (run->glyphs, state, - space_left); + } + else if (!visual_last_run || is_tab_run (layout, visual_last_run)) + { + pad_glyphstring_left (run->glyphs, state, - space_left); + tab_adjustment += space_left; + } + + if (run->glyphs->glyphs[run->glyphs->num_glyphs - 1].geometry.width == 0) + { + /* we've zeroed this space glyph at the end of line, now remove + * the letter spacing added to its adjacent glyph */ + pad_glyphstring_right (run->glyphs, state, - space_right); + } + else if (!visual_next_run || is_tab_run (layout, visual_next_run)) + { + pad_glyphstring_right (run->glyphs, state, - space_right); + tab_adjustment += space_right; + } + } last_run = run; } @@ -5595,7 +5578,7 @@ adjust_line_letter_spacing (PangoLayoutLine *line, static void justify_clusters (PangoLayoutLine *line, - ParaBreakState *state) + ParaBreakState *state) { const gchar *text = line->layout->text; const PangoLogAttr *log_attrs = line->layout->log_attrs; @@ -5627,120 +5610,120 @@ justify_clusters (PangoLayoutLine *line, gaps_so_far = 0; for (run_iter = line->runs; run_iter; run_iter = run_iter->next) - { - PangoLayoutRun *run = run_iter->data; - PangoGlyphString *glyphs = run->glyphs; - PangoGlyphItemIter cluster_iter; - gboolean have_cluster; - int dir; - int offset; - - dir = run->item->analysis.level % 2 == 0 ? +1 : -1; - - /* We need character offset of the start of the run. We don't have this. - * Compute by counting from the beginning of the line. The naming is - * confusing. Note that: - * - * run->item->offset is byte offset of start of run in layout->text. - * state->line_start_index is byte offset of start of line in layout->text. - * state->line_start_offset is character offset of start of line in layout->text. - */ - g_assert (run->item->offset >= state->line_start_index); - offset = state->line_start_offset - + pango_utf8_strlen (text + state->line_start_index, - run->item->offset - state->line_start_index); - - for (have_cluster = dir > 0 ? - pango_glyph_item_iter_init_start (&cluster_iter, run, text) : - pango_glyph_item_iter_init_end (&cluster_iter, run, text); - have_cluster; - have_cluster = dir > 0 ? - pango_glyph_item_iter_next_cluster (&cluster_iter) : - pango_glyph_item_iter_prev_cluster (&cluster_iter)) - { - int i; - int width = 0; - - /* don't expand in the middle of graphemes */ - if (!log_attrs[offset + cluster_iter.start_char].is_cursor_position) - continue; - - for (i = cluster_iter.start_glyph; i != cluster_iter.end_glyph; i += dir) - width += glyphs->glyphs[i].geometry.width; - - /* also don't expand zero-width clusters. */ - if (width == 0) - continue; - - gaps_so_far++; - - if (mode == ADJUST) - { - int leftmost, rightmost; - int adjustment, space_left, space_right; - - adjustment = total_remaining_width / total_gaps + residual; - if (is_hinted) - { - int old_adjustment = adjustment; - adjustment = PANGO_UNITS_ROUND (adjustment); - residual = old_adjustment - adjustment; - } - /* distribute to before/after */ - distribute_letter_spacing (adjustment, &space_left, &space_right); - - if (cluster_iter.start_glyph < cluster_iter.end_glyph) - { - /* LTR */ - leftmost = cluster_iter.start_glyph; - rightmost = cluster_iter.end_glyph - 1; - } - else - { - /* RTL */ - leftmost = cluster_iter.end_glyph + 1; - rightmost = cluster_iter.start_glyph; - } - /* Don't add to left-side of left-most glyph of left-most non-zero run. */ - if (leftedge) - leftedge = FALSE; - else - { - glyphs->glyphs[leftmost].geometry.width += space_left ; - glyphs->glyphs[leftmost].geometry.x_offset += space_left ; - added_so_far += space_left; - } - /* Don't add to right-side of right-most glyph of right-most non-zero run. */ - { - /* Save so we can undo later. */ - rightmost_glyphs = glyphs; - rightmost_space = space_right; - - glyphs->glyphs[rightmost].geometry.width += space_right; - added_so_far += space_right; - } - } - } - } + { + PangoLayoutRun *run = run_iter->data; + PangoGlyphString *glyphs = run->glyphs; + PangoGlyphItemIter cluster_iter; + gboolean have_cluster; + int dir; + int offset; + + dir = run->item->analysis.level % 2 == 0 ? +1 : -1; + + /* We need character offset of the start of the run. We don't have this. + * Compute by counting from the beginning of the line. The naming is + * confusing. Note that: + * + * run->item->offset is byte offset of start of run in layout->text. + * state->line_start_index is byte offset of start of line in layout->text. + * state->line_start_offset is character offset of start of line in layout->text. + */ + g_assert (run->item->offset >= state->line_start_index); + offset = state->line_start_offset + + pango_utf8_strlen (text + state->line_start_index, + run->item->offset - state->line_start_index); + + for (have_cluster = dir > 0 ? + pango_glyph_item_iter_init_start (&cluster_iter, run, text) : + pango_glyph_item_iter_init_end (&cluster_iter, run, text); + have_cluster; + have_cluster = dir > 0 ? + pango_glyph_item_iter_next_cluster (&cluster_iter) : + pango_glyph_item_iter_prev_cluster (&cluster_iter)) + { + int i; + int width = 0; + + /* don't expand in the middle of graphemes */ + if (!log_attrs[offset + cluster_iter.start_char].is_cursor_position) + continue; + + for (i = cluster_iter.start_glyph; i != cluster_iter.end_glyph; i += dir) + width += glyphs->glyphs[i].geometry.width; + + /* also don't expand zero-width clusters. */ + if (width == 0) + continue; + + gaps_so_far++; + + if (mode == ADJUST) + { + int leftmost, rightmost; + int adjustment, space_left, space_right; + + adjustment = total_remaining_width / total_gaps + residual; + if (is_hinted) + { + int old_adjustment = adjustment; + adjustment = PANGO_UNITS_ROUND (adjustment); + residual = old_adjustment - adjustment; + } + /* distribute to before/after */ + distribute_letter_spacing (adjustment, &space_left, &space_right); + + if (cluster_iter.start_glyph < cluster_iter.end_glyph) + { + /* LTR */ + leftmost = cluster_iter.start_glyph; + rightmost = cluster_iter.end_glyph - 1; + } + else + { + /* RTL */ + leftmost = cluster_iter.end_glyph + 1; + rightmost = cluster_iter.start_glyph; + } + /* Don't add to left-side of left-most glyph of left-most non-zero run. */ + if (leftedge) + leftedge = FALSE; + else + { + glyphs->glyphs[leftmost].geometry.width += space_left ; + glyphs->glyphs[leftmost].geometry.x_offset += space_left ; + added_so_far += space_left; + } + /* Don't add to right-side of right-most glyph of right-most non-zero run. */ + { + /* Save so we can undo later. */ + rightmost_glyphs = glyphs; + rightmost_space = space_right; + + glyphs->glyphs[rightmost].geometry.width += space_right; + added_so_far += space_right; + } + } + } + } if (mode == MEASURE) - { - total_gaps = gaps_so_far - 1; - - if (total_gaps == 0) - { - /* a single cluster, can't really justify it */ - return; - } - } + { + total_gaps = gaps_so_far - 1; + + if (total_gaps == 0) + { + /* a single cluster, can't really justify it */ + return; + } + } else /* mode == ADJUST */ { - if (rightmost_glyphs) - { - rightmost_glyphs->glyphs[rightmost_glyphs->num_glyphs - 1].geometry.width -= rightmost_space; - added_so_far -= rightmost_space; - } - } + if (rightmost_glyphs) + { + rightmost_glyphs->glyphs[rightmost_glyphs->num_glyphs - 1].geometry.width -= rightmost_space; + added_so_far -= rightmost_space; + } + } } state->remaining_width -= added_so_far; @@ -5748,7 +5731,7 @@ justify_clusters (PangoLayoutLine *line, static void justify_words (PangoLayoutLine *line, - ParaBreakState *state) + ParaBreakState *state) { const gchar *text = line->layout->text; const PangoLogAttr *log_attrs = line->layout->log_attrs; @@ -5775,71 +5758,71 @@ justify_words (PangoLayoutLine *line, spaces_so_far = 0; for (run_iter = line->runs; run_iter; run_iter = run_iter->next) - { - PangoLayoutRun *run = run_iter->data; - PangoGlyphString *glyphs = run->glyphs; - PangoGlyphItemIter cluster_iter; - gboolean have_cluster; - int offset; - - /* We need character offset of the start of the run. We don't have this. - * Compute by counting from the beginning of the line. The naming is - * confusing. Note that: - * - * run->item->offset is byte offset of start of run in layout->text. - * state->line_start_index is byte offset of start of line in layout->text. - * state->line_start_offset is character offset of start of line in layout->text. - */ - g_assert (run->item->offset >= state->line_start_index); - offset = state->line_start_offset - + pango_utf8_strlen (text + state->line_start_index, - run->item->offset - state->line_start_index); - - for (have_cluster = pango_glyph_item_iter_init_start (&cluster_iter, run, text); - have_cluster; - have_cluster = pango_glyph_item_iter_next_cluster (&cluster_iter)) - { - int i; - int dir; - - if (!log_attrs[offset + cluster_iter.start_char].is_expandable_space) - continue; - - dir = (cluster_iter.start_glyph < cluster_iter.end_glyph) ? 1 : -1; - for (i = cluster_iter.start_glyph; i != cluster_iter.end_glyph; i += dir) - { - int glyph_width = glyphs->glyphs[i].geometry.width; - - if (glyph_width == 0) - continue; - - spaces_so_far += glyph_width; - - if (mode == ADJUST) - { - int adjustment; - - adjustment = ((guint64) spaces_so_far * total_remaining_width) / total_space_width - added_so_far; - if (is_hinted) - adjustment = PANGO_UNITS_ROUND (adjustment); - - glyphs->glyphs[i].geometry.width += adjustment; - added_so_far += adjustment; - } - } - } - } + { + PangoLayoutRun *run = run_iter->data; + PangoGlyphString *glyphs = run->glyphs; + PangoGlyphItemIter cluster_iter; + gboolean have_cluster; + int offset; + + /* We need character offset of the start of the run. We don't have this. + * Compute by counting from the beginning of the line. The naming is + * confusing. Note that: + * + * run->item->offset is byte offset of start of run in layout->text. + * state->line_start_index is byte offset of start of line in layout->text. + * state->line_start_offset is character offset of start of line in layout->text. + */ + g_assert (run->item->offset >= state->line_start_index); + offset = state->line_start_offset + + pango_utf8_strlen (text + state->line_start_index, + run->item->offset - state->line_start_index); + + for (have_cluster = pango_glyph_item_iter_init_start (&cluster_iter, run, text); + have_cluster; + have_cluster = pango_glyph_item_iter_next_cluster (&cluster_iter)) + { + int i; + int dir; + + if (!log_attrs[offset + cluster_iter.start_char].is_expandable_space) + continue; + + dir = (cluster_iter.start_glyph < cluster_iter.end_glyph) ? 1 : -1; + for (i = cluster_iter.start_glyph; i != cluster_iter.end_glyph; i += dir) + { + int glyph_width = glyphs->glyphs[i].geometry.width; + + if (glyph_width == 0) + continue; + + spaces_so_far += glyph_width; + + if (mode == ADJUST) + { + int adjustment; + + adjustment = ((guint64) spaces_so_far * total_remaining_width) / total_space_width - added_so_far; + if (is_hinted) + adjustment = PANGO_UNITS_ROUND (adjustment); + + glyphs->glyphs[i].geometry.width += adjustment; + added_so_far += adjustment; + } + } + } + } if (mode == MEASURE) - { - total_space_width = spaces_so_far; + { + total_space_width = spaces_so_far; - if (total_space_width == 0) - { - justify_clusters (line, state); - return; - } - } + if (total_space_width == 0) + { + justify_clusters (line, state); + return; + } + } } state->remaining_width -= added_so_far; @@ -5847,8 +5830,8 @@ justify_words (PangoLayoutLine *line, static void pango_layout_line_postprocess (PangoLayoutLine *line, - ParaBreakState *state, - gboolean wrapped) + ParaBreakState *state, + gboolean wrapped) { gboolean ellipsized = FALSE; @@ -5868,7 +5851,7 @@ pango_layout_line_postprocess (PangoLayoutLine *line, /* Ellipsize the line if necessary */ if (G_UNLIKELY (state->line_width >= 0 && - should_ellipsize_current_line (line->layout, state))) + should_ellipsize_current_line (line->layout, state))) { PangoShapeFlags shape_flags = PANGO_SHAPE_NONE; @@ -5898,7 +5881,7 @@ pango_layout_line_postprocess (PangoLayoutLine *line, { /* if we ellipsized, we don't have remaining_width set */ if (state->remaining_width < 0) - state->remaining_width = state->line_width - pango_layout_line_get_width (line); + state->remaining_width = state->line_width - pango_layout_line_get_width (line); justify_words (line, state); } @@ -5911,7 +5894,7 @@ pango_layout_line_postprocess (PangoLayoutLine *line, static void pango_layout_get_item_properties (PangoItem *item, - ItemProperties *properties) + ItemProperties *properties) { GSList *tmp_list = item->analysis.extra_attrs; @@ -5932,8 +5915,8 @@ pango_layout_get_item_properties (PangoItem *item, PangoAttribute *attr = tmp_list->data; switch ((int) attr->klass->type) - { - case PANGO_ATTR_UNDERLINE: + { + case PANGO_ATTR_UNDERLINE: switch (((PangoAttrInt *)attr)->value) { case PANGO_UNDERLINE_NONE: @@ -5957,48 +5940,48 @@ pango_layout_get_item_properties (PangoItem *item, g_assert_not_reached (); break; } - break; + break; - case PANGO_ATTR_OVERLINE: + case PANGO_ATTR_OVERLINE: switch (((PangoAttrInt *)attr)->value) { case PANGO_OVERLINE_SINGLE: - properties->oline_single = TRUE; + properties->oline_single = TRUE; break; default: g_assert_not_reached (); break; } - break; + break; - case PANGO_ATTR_STRIKETHROUGH: - properties->strikethrough = ((PangoAttrInt *)attr)->value; - break; + case PANGO_ATTR_STRIKETHROUGH: + properties->strikethrough = ((PangoAttrInt *)attr)->value; + break; - case PANGO_ATTR_RISE: - properties->rise = ((PangoAttrInt *)attr)->value; - break; + case PANGO_ATTR_RISE: + properties->rise = ((PangoAttrInt *)attr)->value; + break; - case PANGO_ATTR_LETTER_SPACING: - properties->letter_spacing = ((PangoAttrInt *)attr)->value; - break; + case PANGO_ATTR_LETTER_SPACING: + properties->letter_spacing = ((PangoAttrInt *)attr)->value; + break; - case PANGO_ATTR_SHAPE: - properties->shape_set = TRUE; - properties->shape_logical_rect = &((PangoAttrShape *)attr)->logical_rect; - properties->shape_ink_rect = &((PangoAttrShape *)attr)->ink_rect; - break; + case PANGO_ATTR_SHAPE: + properties->shape_set = TRUE; + properties->shape_logical_rect = &((PangoAttrShape *)attr)->logical_rect; + properties->shape_ink_rect = &((PangoAttrShape *)attr)->ink_rect; + break; - default: - break; - } + default: + break; + } tmp_list = tmp_list->next; } } static int next_cluster_start (PangoGlyphString *gs, - int cluster_start) + int cluster_start) { int i; @@ -6006,7 +5989,7 @@ next_cluster_start (PangoGlyphString *gs, while (i < gs->num_glyphs) { if (gs->glyphs[i].attr.is_cluster_start) - return i; + return i; i++; } @@ -6016,7 +5999,7 @@ next_cluster_start (PangoGlyphString *gs, static int cluster_width (PangoGlyphString *gs, - int cluster_start) + int cluster_start) { int i; int width; @@ -6026,7 +6009,7 @@ cluster_width (PangoGlyphString *gs, while (i < gs->num_glyphs) { if (gs->glyphs[i].attr.is_cluster_start) - break; + break; width += gs->glyphs[i].geometry.width; i++; @@ -6037,7 +6020,7 @@ cluster_width (PangoGlyphString *gs, static inline void offset_y (PangoLayoutIter *iter, - int *y) + int *y) { *y += iter->line_extents[iter->line_index].baseline; } @@ -6047,7 +6030,7 @@ offset_y (PangoLayoutIter *iter, */ static void update_cluster (PangoLayoutIter *iter, - int cluster_start_index) + int cluster_start_index) { char *cluster_text; PangoGlyphString *gs; @@ -6065,9 +6048,9 @@ update_cluster (PangoLayoutIter *iter, * since logical and visual runs are in the same direction. */ if (iter->next_cluster_glyph < gs->num_glyphs) - cluster_length = gs->log_clusters[iter->next_cluster_glyph] - cluster_start_index; + cluster_length = gs->log_clusters[iter->next_cluster_glyph] - cluster_start_index; else - cluster_length = iter->run->item->length - cluster_start_index; + cluster_length = iter->run->item->length - cluster_start_index; } else { @@ -6076,12 +6059,12 @@ update_cluster (PangoLayoutIter *iter, */ int i = iter->cluster_start; while (i > 0 && gs->log_clusters[i - 1] == cluster_start_index) - i--; + i--; if (i == 0) - cluster_length = iter->run->item->length - cluster_start_index; + cluster_length = iter->run->item->length - cluster_start_index; else - cluster_length = gs->log_clusters[i - 1] - cluster_start_index; + cluster_length = gs->log_clusters[i - 1] - cluster_start_index; } cluster_text = iter->layout->text + iter->run->item->offset + cluster_start_index; @@ -6095,7 +6078,7 @@ update_cluster (PangoLayoutIter *iter, static void update_run (PangoLayoutIter *iter, - int run_start_index) + int run_start_index) { const Extents *line_ext = &iter->line_extents[iter->line_index]; @@ -6141,16 +6124,16 @@ update_run (PangoLayoutIter *iter, /** * pango_layout_iter_copy: - * @iter: (nullable): a #PangoLayoutIter, may be %NULL + * @iter: (nullable): a `PangoLayoutIter`, may be %NULL * - * Copies a #PangoLayoutIter. + * Copies a `PangoLayoutIter`. * - * Return value: (nullable): the newly allocated #PangoLayoutIter, - * which should be freed with pango_layout_iter_free(), - * or %NULL if @iter was %NULL. + * Return value: (nullable): the newly allocated `PangoLayoutIter`, + * which should be freed with [method@Pango.LayoutIter.free], + * or %NULL if @iter was %NULL. * * Since: 1.20 - **/ + */ PangoLayoutIter * pango_layout_iter_copy (PangoLayoutIter *iter) { @@ -6203,13 +6186,13 @@ G_DEFINE_BOXED_TYPE (PangoLayoutIter, pango_layout_iter, /** * pango_layout_get_iter: - * @layout: a #PangoLayout + * @layout: a `PangoLayout` * * Returns an iterator to iterate over the visual extents of the layout. * - * Return value: the new #PangoLayoutIter that should be freed using - * pango_layout_iter_free(). - **/ + * Return value: the new `PangoLayoutIter` that should be freed using + * [method@Pango.LayoutIter.free]. + */ PangoLayoutIter* pango_layout_get_iter (PangoLayout *layout) { @@ -6289,7 +6272,7 @@ _pango_layout_iter_destroy (PangoLayoutIter *iter) /** * pango_layout_iter_free: - * @iter: (nullable): a #PangoLayoutIter, may be %NULL + * @iter: (nullable): a `PangoLayoutIter`, may be %NULL * * Frees an iterator that's no longer in use. **/ @@ -6305,15 +6288,15 @@ pango_layout_iter_free (PangoLayoutIter *iter) /** * pango_layout_iter_get_index: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * * Gets the current byte index. Note that iterating forward by char * moves in visual order, not logical order, so indexes may not be * sequential. Also, the index may be equal to the length of the text - * in the layout, if on the %NULL run (see pango_layout_iter_get_run()). + * in the layout, if on the %NULL run (see [method@Pango.LayoutIter.get_run]). * * Return value: current byte index. - **/ + */ int pango_layout_iter_get_index (PangoLayoutIter *iter) { @@ -6325,18 +6308,18 @@ pango_layout_iter_get_index (PangoLayoutIter *iter) /** * pango_layout_iter_get_run: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * * Gets the current run. When iterating by run, at the end of each * line, there's a position with a %NULL run, so this function can return * %NULL. The %NULL run at the end of each line ensures that all lines have * at least one run, even lines consisting of only a newline. * - * Use the faster pango_layout_iter_get_run_readonly() if you do not plan - * to modify the contents of the run (glyphs, glyph widths, etc.). + * Use the faster [method@Pango.LayoutIter.get_run_readonly] if you do not + * plan to modify the contents of the run (glyphs, glyph widths, etc.). * * Return value: (transfer none) (nullable): the current run. - **/ + */ PangoLayoutRun* pango_layout_iter_get_run (PangoLayoutIter *iter) { @@ -6350,22 +6333,22 @@ pango_layout_iter_get_run (PangoLayoutIter *iter) /** * pango_layout_iter_get_run_readonly: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * * Gets the current run. When iterating by run, at the end of each * line, there's a position with a %NULL run, so this function can return * %NULL. The %NULL run at the end of each line ensures that all lines have * at least one run, even lines consisting of only a newline. * - * This is a faster alternative to pango_layout_iter_get_run(), - * but the user is not expected - * to modify the contents of the run (glyphs, glyph widths, etc.). + * This is a faster alternative to [method@Pango.LayoutIter.get_run], + * but the user is not expected to modify the contents of the run (glyphs, + * glyph widths, etc.). * * Return value: (transfer none) (nullable): the current run, that * should not be modified. * * Since: 1.16 - **/ + */ PangoLayoutRun* pango_layout_iter_get_run_readonly (PangoLayoutIter *iter) { @@ -6386,15 +6369,16 @@ _pango_layout_iter_get_line (PangoLayoutIter *iter) /** * pango_layout_iter_get_line: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * * Gets the current line. * - * Use the faster pango_layout_iter_get_line_readonly() if you do not plan - * to modify the contents of the line (glyphs, glyph widths, etc.). + * Use the faster [method@Pango.LayoutIter.get_line_readonly] if + * you do not plan to modify the contents of the line (glyphs, + * glyph widths, etc.). * * Return value: (transfer none): the current line. - **/ + */ PangoLayoutLine* pango_layout_iter_get_line (PangoLayoutIter *iter) { @@ -6408,19 +6392,19 @@ pango_layout_iter_get_line (PangoLayoutIter *iter) /** * pango_layout_iter_get_line_readonly: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * * Gets the current line for read-only access. * - * This is a faster alternative to pango_layout_iter_get_line(), - * but the user is not expected - * to modify the contents of the line (glyphs, glyph widths, etc.). + * This is a faster alternative to [method@Pango.LayoutIter.get_line], + * but the user is not expected to modify the contents of the line + * (glyphs, glyph widths, etc.). * * Return value: (transfer none): the current line, that should not be * modified. * * Since: 1.16 - **/ + */ PangoLayoutLine* pango_layout_iter_get_line_readonly (PangoLayoutIter *iter) { @@ -6432,12 +6416,12 @@ pango_layout_iter_get_line_readonly (PangoLayoutIter *iter) /** * pango_layout_iter_at_last_line: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * * Determines whether @iter is on the last line of the layout. * * Return value: %TRUE if @iter is on the last line. - **/ + */ gboolean pango_layout_iter_at_last_line (PangoLayoutIter *iter) { @@ -6449,14 +6433,14 @@ pango_layout_iter_at_last_line (PangoLayoutIter *iter) /** * pango_layout_iter_get_layout: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * - * Gets the layout associated with a #PangoLayoutIter. + * Gets the layout associated with a `PangoLayoutIter`. * * Return value: (transfer none): the layout associated with @iter. * * Since: 1.20 - **/ + */ PangoLayout* pango_layout_iter_get_layout (PangoLayoutIter *iter) { @@ -6467,7 +6451,6 @@ pango_layout_iter_get_layout (PangoLayoutIter *iter) return iter->layout; } - static gboolean line_is_terminated (PangoLayoutIter *iter) { @@ -6478,7 +6461,7 @@ line_is_terminated (PangoLayoutIter *iter) { PangoLayoutLine *next_line = iter->line_list_link->next->data; if (next_line->is_paragraph_start) - return TRUE; + return TRUE; } return FALSE; @@ -6490,7 +6473,7 @@ line_is_terminated (PangoLayoutIter *iter) */ static gboolean next_nonempty_line (PangoLayoutIter *iter, - gboolean include_terminators) + gboolean include_terminators) { gboolean result; @@ -6498,13 +6481,13 @@ next_nonempty_line (PangoLayoutIter *iter, { result = pango_layout_iter_next_line (iter); if (!result) - break; + break; if (iter->line->runs) - break; + break; if (include_terminators && line_is_terminated (iter)) - break; + break; } return result; @@ -6516,7 +6499,7 @@ next_nonempty_line (PangoLayoutIter *iter, */ static gboolean next_nonempty_run (PangoLayoutIter *iter, - gboolean include_terminators) + gboolean include_terminators) { gboolean result; @@ -6524,13 +6507,13 @@ next_nonempty_run (PangoLayoutIter *iter, { result = pango_layout_iter_next_run (iter); if (!result) - break; + break; if (iter->run) - break; + break; if (include_terminators && line_is_terminated (iter)) - break; + break; } return result; @@ -6542,7 +6525,7 @@ next_nonempty_run (PangoLayoutIter *iter, */ static gboolean next_cluster_internal (PangoLayoutIter *iter, - gboolean include_terminators) + gboolean include_terminators) { PangoGlyphString *gs; int next_start; @@ -6572,13 +6555,13 @@ next_cluster_internal (PangoLayoutIter *iter, /** * pango_layout_iter_next_char: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * - * Moves @iter forward to the next character in visual order. If @iter was already at - * the end of the layout, returns %FALSE. + * Moves @iter forward to the next character in visual order. + * If @iter was already at the end of the layout, returns %FALSE. * * Return value: whether motion was possible. - **/ + */ gboolean pango_layout_iter_next_char (PangoLayoutIter *iter) { @@ -6591,12 +6574,12 @@ pango_layout_iter_next_char (PangoLayoutIter *iter) { /* We need to fake an iterator position in the middle of a \r\n line terminator */ if (line_is_terminated (iter) && - strncmp (iter->layout->text + iter->line->start_index + iter->line->length, "\r\n", 2) == 0 && - iter->character_position == 0) - { - iter->character_position++; - return TRUE; - } + strncmp (iter->layout->text + iter->line->start_index + iter->line->length, "\r\n", 2) == 0 && + iter->character_position == 0) + { + iter->character_position++; + return TRUE; + } return next_nonempty_line (iter, TRUE); } @@ -6616,13 +6599,13 @@ pango_layout_iter_next_char (PangoLayoutIter *iter) /** * pango_layout_iter_next_cluster: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * - * Moves @iter forward to the next cluster in visual order. If @iter - * was already at the end of the layout, returns %FALSE. + * Moves @iter forward to the next cluster in visual order. + * If @iter was already at the end of the layout, returns %FALSE. * * Return value: whether motion was possible. - **/ + */ gboolean pango_layout_iter_next_cluster (PangoLayoutIter *iter) { @@ -6631,13 +6614,13 @@ pango_layout_iter_next_cluster (PangoLayoutIter *iter) /** * pango_layout_iter_next_run: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * - * Moves @iter forward to the next run in visual order. If @iter was - * already at the end of the layout, returns %FALSE. + * Moves @iter forward to the next run in visual order. + * If @iter was already at the end of the layout, returns %FALSE. * * Return value: whether motion was possible. - **/ + */ gboolean pango_layout_iter_next_run (PangoLayoutIter *iter) { @@ -6675,13 +6658,13 @@ pango_layout_iter_next_run (PangoLayoutIter *iter) /** * pango_layout_iter_next_line: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * - * Moves @iter forward to the start of the next line. If @iter is - * already on the last line, returns %FALSE. + * Moves @iter forward to the start of the next line. + * If @iter is already on the last line, returns %FALSE. * * Return value: whether motion was possible. - **/ + */ gboolean pango_layout_iter_next_line (PangoLayoutIter *iter) { @@ -6719,7 +6702,7 @@ pango_layout_iter_next_line (PangoLayoutIter *iter) /** * pango_layout_iter_get_char_extents: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * @logical_rect: (out caller-allocates): rectangle to fill with * logical extents * @@ -6727,11 +6710,10 @@ pango_layout_iter_next_line (PangoLayoutIter *iter) * (origin is the top left of the entire layout). Only logical extents * can sensibly be obtained for characters; ink extents make sense only * down to the level of clusters. - * - **/ + */ void pango_layout_iter_get_char_extents (PangoLayoutIter *iter, - PangoRectangle *logical_rect) + PangoRectangle *logical_rect) { PangoRectangle cluster_rect; int x0, x1; @@ -6771,18 +6753,17 @@ pango_layout_iter_get_char_extents (PangoLayoutIter *iter, /** * pango_layout_iter_get_cluster_extents: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * @ink_rect: (out) (allow-none): rectangle to fill with ink extents, or %NULL * @logical_rect: (out) (allow-none): rectangle to fill with logical extents, or %NULL * * Gets the extents of the current cluster, in layout coordinates * (origin is the top left of the entire layout). - * - **/ + */ void pango_layout_iter_get_cluster_extents (PangoLayoutIter *iter, - PangoRectangle *ink_rect, - PangoRectangle *logical_rect) + PangoRectangle *ink_rect, + PangoRectangle *logical_rect) { if (ITER_IS_INVALID (iter)) return; @@ -6797,11 +6778,11 @@ pango_layout_iter_get_cluster_extents (PangoLayoutIter *iter, } pango_glyph_string_extents_range (iter->run->glyphs, - iter->cluster_start, - iter->next_cluster_glyph, - iter->run->item->analysis.font, - ink_rect, - logical_rect); + iter->cluster_start, + iter->next_cluster_glyph, + iter->run->item->analysis.font, + ink_rect, + logical_rect); if (ink_rect) { @@ -6819,18 +6800,17 @@ pango_layout_iter_get_cluster_extents (PangoLayoutIter *iter, /** * pango_layout_iter_get_run_extents: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * @ink_rect: (out) (allow-none): rectangle to fill with ink extents, or %NULL * @logical_rect: (out) (allow-none): rectangle to fill with logical extents, or %NULL * * Gets the extents of the current run in layout coordinates * (origin is the top left of the entire layout). - * - **/ + */ void pango_layout_iter_get_run_extents (PangoLayoutIter *iter, - PangoRectangle *ink_rect, - PangoRectangle *logical_rect) + PangoRectangle *ink_rect, + PangoRectangle *logical_rect) { if (G_UNLIKELY (!ink_rect && !logical_rect)) return; @@ -6843,16 +6823,16 @@ pango_layout_iter_get_run_extents (PangoLayoutIter *iter, pango_layout_run_get_extents_and_height (iter->run, ink_rect, logical_rect, NULL); if (ink_rect) - { - offset_y (iter, &ink_rect->y); - ink_rect->x += iter->run_x; - } + { + offset_y (iter, &ink_rect->y); + ink_rect->x += iter->run_x; + } if (logical_rect) - { - offset_y (iter, &logical_rect->y); - logical_rect->x += iter->run_x; - } + { + offset_y (iter, &logical_rect->y); + logical_rect->x += iter->run_x; + } } else { @@ -6861,37 +6841,36 @@ pango_layout_iter_get_run_extents (PangoLayoutIter *iter, pango_layout_iter_get_line_extents (iter, ink_rect, logical_rect); if (ink_rect) - { - ink_rect->x = iter->run_x; - ink_rect->width = 0; - } + { + ink_rect->x = iter->run_x; + ink_rect->width = 0; + } if (logical_rect) - { - logical_rect->x = iter->run_x; - logical_rect->width = 0; - } + { + logical_rect->x = iter->run_x; + logical_rect->width = 0; + } } } /** * pango_layout_iter_get_line_extents: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * @ink_rect: (out) (allow-none): rectangle to fill with ink extents, or %NULL * @logical_rect: (out) (allow-none): rectangle to fill with logical extents, or %NULL * * Obtains the extents of the current line. @ink_rect or @logical_rect * can be %NULL if you aren't interested in them. Extents are in layout * coordinates (origin is the top-left corner of the entire - * #PangoLayout). Thus the extents returned by this function will be + * `PangoLayout`). Thus the extents returned by this function will be * the same width/height but not at the same x/y as the extents - * returned from pango_layout_line_get_extents(). - * - **/ + * returned from [method@Pango.LayoutLine.get_extents]. + */ void pango_layout_iter_get_line_extents (PangoLayoutIter *iter, - PangoRectangle *ink_rect, - PangoRectangle *logical_rect) + PangoRectangle *ink_rect, + PangoRectangle *logical_rect) { const Extents *ext; @@ -6903,11 +6882,11 @@ pango_layout_iter_get_line_extents (PangoLayoutIter *iter, if (ink_rect) { get_line_extents_layout_coords (iter->layout, iter->line, - iter->layout_width, - ext->logical_rect.y, + iter->layout_width, + ext->logical_rect.y, NULL, - ink_rect, - NULL); + ink_rect, + NULL); } if (logical_rect) @@ -6916,26 +6895,25 @@ pango_layout_iter_get_line_extents (PangoLayoutIter *iter, /** * pango_layout_iter_get_line_yrange: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * @y0_: (out) (allow-none): start of line, or %NULL * @y1_: (out) (allow-none): end of line, or %NULL * - * Divides the vertical space in the #PangoLayout being iterated over + * Divides the vertical space in the `PangoLayout` being iterated over * between the lines in the layout, and returns the space belonging to - * the current line. A line's range includes the line's logical - * extents, plus half of the spacing above and below the line, if - * pango_layout_set_spacing() has been called to set layout spacing. + * the current line. A line's range includes the line's logical extents, + * plus half of the spacing above and below the line, if + * [method@Pango.Layout.set_spacing] has been called to set layout spacing. * The Y positions are in layout coordinates (origin at top left of the * entire layout). * - * Note: Since 1.44, Pango uses line heights for placing lines, - * and there may be gaps between the ranges returned by this - * function. + * Note: Since 1.44, Pango uses line heights for placing lines, and there + * may be gaps between the ranges returned by this function. */ void pango_layout_iter_get_line_yrange (PangoLayoutIter *iter, - int *y0, - int *y1) + int *y0, + int *y1) { const Extents *ext; int half_spacing; @@ -6956,30 +6934,30 @@ pango_layout_iter_get_line_yrange (PangoLayoutIter *iter, /* No spacing above the first line */ if (iter->line_index == 0) - *y0 = ext->logical_rect.y; + *y0 = ext->logical_rect.y; else - *y0 = ext->logical_rect.y - (iter->layout->spacing - half_spacing); + *y0 = ext->logical_rect.y - (iter->layout->spacing - half_spacing); } if (y1) { /* No spacing below the last line */ if (iter->line_index == iter->layout->line_count - 1) - *y1 = ext->logical_rect.y + ext->logical_rect.height; + *y1 = ext->logical_rect.y + ext->logical_rect.height; else - *y1 = ext->logical_rect.y + ext->logical_rect.height + half_spacing; + *y1 = ext->logical_rect.y + ext->logical_rect.height + half_spacing; } } /** * pango_layout_iter_get_baseline: - * @iter: a #PangoLayoutIter + * @iter: a `PangoLayoutIter` * * Gets the Y position of the current line's baseline, in layout * coordinates (origin at top left of the entire layout). * * Return value: baseline of current line. - **/ + */ int pango_layout_iter_get_baseline (PangoLayoutIter *iter) { @@ -6991,21 +6969,17 @@ pango_layout_iter_get_baseline (PangoLayoutIter *iter) /** * pango_layout_iter_get_layout_extents: - * @iter: a #PangoLayoutIter - * @ink_rect: (out) (allow-none): rectangle to fill with ink extents, - * or %NULL - * @logical_rect: (out) (allow-none): rectangle to fill with logical - * extents, or %NULL - * - * Obtains the extents of the #PangoLayout being iterated - * over. @ink_rect or @logical_rect can be %NULL if you - * aren't interested in them. + * @iter: a `PangoLayoutIter` + * @ink_rect: (out) (allow-none): rectangle to fill with ink extents, or %NULL + * @logical_rect: (out) (allow-none): rectangle to fill with logical extents, or %NULL * - **/ + * Obtains the extents of the `PangoLayout` being iterated over. + * @ink_rect or @logical_rect can be %NULL if you aren't interested in them. + */ void pango_layout_iter_get_layout_extents (PangoLayoutIter *iter, - PangoRectangle *ink_rect, - PangoRectangle *logical_rect) + PangoRectangle *ink_rect, + PangoRectangle *logical_rect) { if (ITER_IS_INVALID (iter)) return; diff --git a/pango/pango-layout.h b/pango/pango-layout.h index d0a4fe8f..6182d889 100644 --- a/pango/pango-layout.h +++ b/pango/pango-layout.h @@ -36,10 +36,11 @@ typedef struct _PangoLayoutLine PangoLayoutLine; /** * PangoLayoutRun: * - * The #PangoLayoutRun structure represents a single run within - * a #PangoLayoutLine; it is simply an alternate name for - * #PangoGlyphItem. - * See the #PangoGlyphItem docs for details on the fields. + * The `PangoLayoutRun` structure represents a single run within + * a [struct@Pango.LayoutLine]; it is simply an alternate name for + * [struct@Pango.GlyphItem]. + * + * See the [struct@Pango.GlyphItem] docs for details on the fields. */ typedef PangoGlyphItem PangoLayoutRun; @@ -49,9 +50,10 @@ typedef PangoGlyphItem PangoLayoutRun; * @PANGO_ALIGN_CENTER: Center the line within the available space * @PANGO_ALIGN_RIGHT: Put all available space on the left * - * A #PangoAlignment describes how to align the lines of a #PangoLayout within the - * available space. If the #PangoLayout is set to justify - * using pango_layout_set_justify(), this only has effect for partial lines. + * A `PangoAlignment` describes how to align the lines of a `PangoLayout` + * within the available space. If the `PangoLayout` is set to justify + * using [method@Pango.Layout.set_justify], this only has effect for + * partial lines. */ typedef enum { PANGO_ALIGN_LEFT, @@ -63,10 +65,11 @@ typedef enum { * PangoWrapMode: * @PANGO_WRAP_WORD: wrap lines at word boundaries. * @PANGO_WRAP_CHAR: wrap lines at character boundaries. - * @PANGO_WRAP_WORD_CHAR: wrap lines at word boundaries, but fall back to character boundaries if there is not - * enough space for a full word. + * @PANGO_WRAP_WORD_CHAR: wrap lines at word boundaries, but fall back to + * character boundaries if there is not enough space for a full word. * - * A #PangoWrapMode describes how to wrap the lines of a #PangoLayout to the desired width. + * A `PangoWrapMode` describes how to wrap the lines of a `PangoLayout` + * to the desired width. */ typedef enum { PANGO_WRAP_WORD, @@ -81,9 +84,10 @@ typedef enum { * @PANGO_ELLIPSIZE_MIDDLE: Omit characters in the middle of the text * @PANGO_ELLIPSIZE_END: Omit characters at the end of the text * - * The #PangoEllipsizeMode type describes what sort of (if any) - * ellipsization should be applied to a line of text. In - * the ellipsization process characters are removed from the + * The `PangoEllipsizeMode` type describes what sort of (if any) + * ellipsization should be applied to a line of 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. */ @@ -104,14 +108,11 @@ typedef enum { * @is_paragraph_start: #TRUE if this is the first line of the paragraph * @resolved_dir: #Resolved PangoDirection of line * - * The #PangoLayoutLine structure represents one of the lines resulting - * from laying out a paragraph via #PangoLayout. #PangoLayoutLine - * structures are obtained by calling pango_layout_get_line() and - * are only valid until the text, attributes, or settings of the - * parent #PangoLayout are modified. - * - * Routines for rendering PangoLayout objects are provided in - * code specific to each rendering system. + * The `PangoLayoutLine` structure represents one of the lines resulting + * from laying out a paragraph via [class@Pango.Layout]. `PangoLayoutLine` + * structures are obtained by calling [method@Pango.Layout.get_line] and + * are only valid until the text, attributes, or settings of the parent + * `PangoLayout` are modified. */ struct _PangoLayoutLine { -- cgit v1.2.1