summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-01-23 23:06:05 -0500
committerMatthias Clasen <mclasen@redhat.com>2022-01-25 15:29:16 -0500
commitb79cd710f0988214ab8bd88b2e2ff75c4f1319ed (patch)
tree6885c333caa9d20e896dda0091f8b2f867d8841e
parent25dc165392f311e1c4d65496acaa8aa1294eab8e (diff)
downloadpango-b79cd710f0988214ab8bd88b2e2ff75c4f1319ed.tar.gz
layout: Add spacing back
Implement the PangoLayout:spacing property by translating it into a line-spacing attribute.
-rw-r--r--pango/pango-layout.c79
-rw-r--r--pango/pango-layout.h7
2 files changed, 86 insertions, 0 deletions
diff --git a/pango/pango-layout.c b/pango/pango-layout.c
index 9a190a88..d5b0a9fc 100644
--- a/pango/pango-layout.c
+++ b/pango/pango-layout.c
@@ -20,6 +20,7 @@ struct _PangoLayout
PangoAttrList *attrs;
PangoFontDescription *font_desc;
float line_height;
+ int spacing;
int width;
int height;
PangoTabArray *tabs;
@@ -47,6 +48,7 @@ enum
PROP_ATTRIBUTES,
PROP_FONT_DESCRIPTION,
PROP_LINE_HEIGHT,
+ PROP_SPACING,
PROP_WIDTH,
PROP_HEIGHT,
PROP_TABS,
@@ -75,6 +77,7 @@ pango_layout_init (PangoLayout *layout)
layout->alignment = PANGO_ALIGN_NATURAL;
layout->ellipsize = PANGO_ELLIPSIZE_NONE;
layout->line_height = 0.0;
+ layout->spacing = 0;
layout->auto_dir = TRUE;
layout->text = g_strdup ("");
layout->length = 0;
@@ -126,6 +129,10 @@ pango_layout_set_property (GObject *object,
pango_layout_set_line_height (layout, g_value_get_float (value));
break;
+ case PROP_SPACING:
+ pango_layout_set_spacing (layout, g_value_get_int (value));
+ break;
+
case PROP_WIDTH:
pango_layout_set_width (layout, g_value_get_int (value));
break;
@@ -198,6 +205,10 @@ pango_layout_get_property (GObject *object,
g_value_set_float (value, layout->line_height);
break;
+ case PROP_SPACING:
+ g_value_set_int (value, layout->spacing);
+ break;
+
case PROP_WIDTH:
g_value_set_int (value, layout->width);
break;
@@ -306,6 +317,19 @@ pango_layout_class_init (PangoLayoutClass *class)
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
/**
+ * PangoLayout:spacing: (attributes org.gtk.Property.get=pango_layout_get_spacing org.gtk.Property.set=pango_layout_set_spacing)
+ *
+ * Spacing to add between the lines of the `PangoLayout`.
+ *
+ * The spacing is specified in Pango units.
+ *
+ * The default value is 0.
+ */
+ props[PROP_SPACING] = g_param_spec_int ("spacing", "spacing", "spacing",
+ 0, G_MAXINT, 0,
+ G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
+
+ /**
* PangoLayout:width: (attributes org.gtk.Property.get=pango_layout_get_width org.gtk.Property.set=pango_layout_set_width)
*
* The width to which the text of `PangoLayout` will be broken.
@@ -513,6 +537,13 @@ get_effective_attributes (PangoLayout *layout)
pango_attr_line_height_new (layout->line_height));
}
+ if (layout->spacing != 0)
+ {
+ attrs = ensure_attrs (layout, attrs);
+ pango_attr_list_insert_before (attrs,
+ pango_attr_line_spacing_new (layout->spacing));
+ }
+
if (layout->single_paragraph)
{
attrs = ensure_attrs (layout, attrs);
@@ -1019,6 +1050,54 @@ pango_layout_get_line_height (PangoLayout *layout)
}
/**
+ * pango_layout_set_spacing:
+ * @layout: a `PangoLayout`
+ * @spacing: the amount of spacing
+ *
+ * Sets the amount of spacing in Pango units between
+ * the lines of the layout.
+ *
+ * When placing lines with spacing, Pango arranges things so that
+ *
+ * line2.top = line1.bottom + spacing
+ *
+ * The default value is 0.
+ *
+ * Spacing only takes effect if the line height is not
+ * overridden via [method@Pango.Layout.set_line_height].
+ */
+void
+pango_layout_set_spacing (PangoLayout *layout,
+ int spacing)
+{
+ g_return_if_fail (PANGO_IS_LAYOUT (layout));
+
+ if (layout->spacing == spacing)
+ return;
+
+ layout->spacing = spacing;
+
+ g_object_notify_by_pspec (G_OBJECT (layout), props[PROP_SPACING]);
+ layout_changed (layout);
+}
+
+/**
+ * pango_layout_get_spacing:
+ * @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)
+{
+ g_return_val_if_fail (PANGO_IS_LAYOUT (layout), 0);
+
+ return layout->spacing;
+}
+
+/**
* pango_layout_set_width:
* @layout: a `PangoLayout`.
* @width: the desired width in Pango units, or -1 to indicate that no
diff --git a/pango/pango-layout.h b/pango/pango-layout.h
index 6e939984..c183716d 100644
--- a/pango/pango-layout.h
+++ b/pango/pango-layout.h
@@ -71,6 +71,13 @@ float pango_layout_get_line_height
(PangoLayout *layout);
PANGO_AVAILABLE_IN_ALL
+void pango_layout_set_spacing (PangoLayout *layout,
+ int spacing);
+
+PANGO_AVAILABLE_IN_ALL
+int pango_layout_get_spacing (PangoLayout *layout);
+
+PANGO_AVAILABLE_IN_ALL
void pango_layout_set_width (PangoLayout *layout,
int width);