summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-08-10 15:10:47 +0000
committerMatthias Clasen <mclasen@redhat.com>2021-08-10 15:10:47 +0000
commitd0613077ea250701197a58db86e2ca636846fcb2 (patch)
treecda09bbc521bc9d4bf422132210b87c31909670f
parent439e06365078e0925055019789090f024d8c1b96 (diff)
parentbb23cf62b2f9a60657e7bfd4390eeb3775be7317 (diff)
downloadpango-d0613077ea250701197a58db86e2ca636846fcb2.tar.gz
Merge branch 'justify-last-line' into 'main'
Add pango_justify_last_line Closes #74 See merge request GNOME/pango!403
-rw-r--r--pango/pango-layout-private.h1
-rw-r--r--pango/pango-layout.c57
-rw-r--r--pango/pango-layout.h7
-rw-r--r--utils/viewer-render.c8
4 files changed, 68 insertions, 5 deletions
diff --git a/pango/pango-layout-private.h b/pango/pango-layout-private.h
index 63e4139e..1805e730 100644
--- a/pango/pango-layout-private.h
+++ b/pango/pango-layout-private.h
@@ -58,6 +58,7 @@ struct _PangoLayout
float line_spacing; /* factor to apply to line height */
guint justify : 1;
+ guint justify_last_line : 1;
guint alignment : 2;
guint single_paragraph : 1;
guint auto_dir : 1;
diff --git a/pango/pango-layout.c b/pango/pango-layout.c
index a5577acc..ca5cbe74 100644
--- a/pango/pango-layout.c
+++ b/pango/pango-layout.c
@@ -214,6 +214,7 @@ pango_layout_init (PangoLayout *layout)
layout->alignment = PANGO_ALIGN_LEFT;
layout->justify = FALSE;
+ layout->justify_last_line = FALSE;
layout->auto_dir = TRUE;
layout->single_paragraph = FALSE;
@@ -805,6 +806,8 @@ pango_layout_get_font_description (PangoLayout *layout)
* Note that this setting is not implemented and so is ignored in
* Pango older than 1.18.
*
+ * Also see [method@Pango.Layout.set_justify_last_line].
+ *
* The default value is %FALSE.
*/
void
@@ -817,7 +820,9 @@ pango_layout_set_justify (PangoLayout *layout,
{
layout->justify = justify;
- if (layout->is_ellipsized || layout->is_wrapped)
+ if (layout->is_ellipsized ||
+ layout->is_wrapped ||
+ layout->justify_last_line)
layout_changed (layout);
}
}
@@ -839,6 +844,54 @@ pango_layout_get_justify (PangoLayout *layout)
}
/**
+ * pango_layout_set_justify_last_line:
+ * @layout: a `PangoLayout`
+ * @justify: whether the last line in the layout should be justified
+ *
+ * Sets whether the last line should be stretched to fill the
+ * entire width of the layout.
+ *
+ * This only has an effect if [method@Pango.Layout.set_justify] has
+ * been called as well.
+ *
+ * The default value is %FALSE.
+ *
+ * Since: 1.50
+ */
+void
+pango_layout_set_justify_last_line (PangoLayout *layout,
+ gboolean justify)
+{
+ g_return_if_fail (layout != NULL);
+
+ if (justify != layout->justify_last_line)
+ {
+ layout->justify_last_line = justify;
+
+ if (layout->justify)
+ layout_changed (layout);
+ }
+}
+
+/**
+ * pango_layout_get_justify_last_line:
+ * @layout: a `PangoLayout`
+ *
+ * Gets whether the last line should be stretched
+ * to fill the entire width of the layout.
+ *
+ * Return value: the justify value
+ *
+ * Since: 1.50
+ */
+gboolean
+pango_layout_get_justify_last_line (PangoLayout *layout)
+{
+ g_return_val_if_fail (layout != NULL, FALSE);
+ return layout->justify_last_line;
+}
+
+/**
* pango_layout_set_auto_dir:
* @layout: a `PangoLayout`
* @auto_dir: if %TRUE, compute the bidirectional base direction
@@ -6055,7 +6108,7 @@ pango_layout_line_postprocess (PangoLayoutLine *line,
/* Distribute extra space between words if justifying and line was wrapped
*/
- if (line->layout->justify && (wrapped || ellipsized))
+ if (line->layout->justify && (wrapped || ellipsized || line->layout->justify_last_line))
{
/* if we ellipsized, we don't have remaining_width set */
if (state->remaining_width < 0)
diff --git a/pango/pango-layout.h b/pango/pango-layout.h
index ab4029db..9436dbcb 100644
--- a/pango/pango-layout.h
+++ b/pango/pango-layout.h
@@ -223,9 +223,14 @@ PANGO_AVAILABLE_IN_1_44
float pango_layout_get_line_spacing (PangoLayout *layout);
PANGO_AVAILABLE_IN_ALL
void pango_layout_set_justify (PangoLayout *layout,
- gboolean justify);
+ gboolean justify);
PANGO_AVAILABLE_IN_ALL
gboolean pango_layout_get_justify (PangoLayout *layout);
+PANGO_AVAILABLE_IN_1_50
+void pango_layout_set_justify_last_line (PangoLayout *layout,
+ gboolean justify);
+PANGO_AVAILABLE_IN_1_50
+gboolean pango_layout_get_justify_last_line (PangoLayout *layout);
PANGO_AVAILABLE_IN_1_4
void pango_layout_set_auto_dir (PangoLayout *layout,
gboolean auto_dir);
diff --git a/utils/viewer-render.c b/utils/viewer-render.c
index 82b30f05..6f7e96c5 100644
--- a/utils/viewer-render.c
+++ b/utils/viewer-render.c
@@ -54,6 +54,7 @@ int opt_indent = 0;
int opt_spacing = 0;
double opt_line_spacing = -1.0;
gboolean opt_justify = 0;
+gboolean opt_justify_last_line = 0;
int opt_runs = 1;
PangoAlignment opt_align = PANGO_ALIGN_LEFT;
PangoEllipsizeMode opt_ellipsize = PANGO_ELLIPSIZE_NONE;
@@ -110,6 +111,7 @@ make_layout(PangoContext *context,
pango_layout_set_auto_dir (layout, opt_auto_dir);
pango_layout_set_ellipsize (layout, opt_ellipsize);
pango_layout_set_justify (layout, opt_justify);
+ pango_layout_set_justify_last_line (layout, opt_justify_last_line);
pango_layout_set_single_paragraph_mode (layout, opt_single_par);
pango_layout_set_wrap (layout, opt_wrap);
@@ -811,8 +813,10 @@ parse_options (int argc, char *argv[])
"Spacing in points between lines", "points"},
{"line-spacing", 0, 0, G_OPTION_ARG_DOUBLE, &opt_line_spacing,
"Spread factor for line height", "factor"},
- {"justify", 0, 0, G_OPTION_ARG_NONE, &opt_justify,
- "Align paragraph lines to be justified", NULL},
+ {"justify", 0, 0, G_OPTION_ARG_NONE, &opt_justify,
+ "Stretch paragraph lines to be justified", NULL},
+ {"justify-last-line", 0, 0, G_OPTION_ARG_NONE, &opt_justify_last_line,
+ "Justify the last line of the paragraph", NULL},
{"language", 0, 0, G_OPTION_ARG_STRING, &opt_language,
"Language to use for font selection", "en_US/etc"},
{"margin", 0, 0, G_OPTION_ARG_CALLBACK, &parse_margin,