[pango/log-attr-tweaks: 17/19] layout: Make log attrs settable
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pango/log-attr-tweaks: 17/19] layout: Make log attrs settable
- Date: Tue, 24 Aug 2021 02:47:00 +0000 (UTC)
commit 4eecf46fc09f986c892303ae8a96beaaaf8f5a7a
Author: Matthias Clasen <mclasen redhat com>
Date: Sat Aug 21 01:22:27 2021 -0400
layout: Make log attrs settable
This lets users tweak log attrs.
Fixes: #33, #132
pango/pango-layout.c | 39 +++++++++++++++++++++++++++++++++++++++
pango/pango-layout.h | 11 ++++++++---
2 files changed, 47 insertions(+), 3 deletions(-)
---
diff --git a/pango/pango-layout.c b/pango/pango-layout.c
index b6e0c217..5269c634 100644
--- a/pango/pango-layout.c
+++ b/pango/pango-layout.c
@@ -322,6 +322,13 @@ pango_layout_copy (PangoLayout *src)
/* Dupped */
layout->text = g_strdup (src->text);
+ if (src->log_attrs)
+ {
+ layout->n_chars = src->n_chars;
+ layout->log_attrs = g_new (PangoLogAttr, src->n_chars + 1);
+ memcpy (layout->log_attrs, src->log_attrs, sizeof (PangoLogAttr) * (src->n_chars + 1));
+ }
+
/* Value fields */
memcpy (&layout->copy_begin, &src->copy_begin,
G_STRUCT_OFFSET (PangoLayout, copy_end) - G_STRUCT_OFFSET (PangoLayout, copy_begin));
@@ -1559,6 +1566,38 @@ pango_layout_get_log_attrs (PangoLayout *layout,
*n_attrs = layout->n_chars + 1;
}
+/**
+ * pango_layout_set_log_attrs:
+ * @layout: a `PangoLayout`
+ * @attrs: `PangoLogAttr` array to use
+ * @n_attrs: length of @attrs
+ *
+ * Sets logical attributes to use instead of the default ones.
+ *
+ * The expected use of this function is to call
+ * [method@Pango.Layout.get_log_attrs], tweak the attributes,
+ * and then call this function.
+ *
+ * Note that `PangoLayout` clears its logical attributes when
+ * either the text of attributes of @layout change, so tweaks
+ * will have to be re-applied after such a change.
+ *
+ * Since: 1.50
+ */
+void
+pango_layout_set_log_attrs (PangoLayout *layout,
+ const PangoLogAttr *attrs,
+ int n_attrs)
+{
+ g_return_if_fail (layout->n_chars + 1 == n_attrs);
+
+ if (!layout->log_attrs)
+ layout->log_attrs = g_new (PangoLogAttr, layout->n_chars + 1);
+ memcpy (layout->log_attrs, attrs, sizeof (PangoLogAttr) * (layout->n_chars + 1));
+
+ layout_changed (layout);
+}
+
/**
* pango_layout_get_log_attrs_readonly:
* @layout: a `PangoLayout`
diff --git a/pango/pango-layout.h b/pango/pango-layout.h
index 9436dbcb..7b039be7 100644
--- a/pango/pango-layout.h
+++ b/pango/pango-layout.h
@@ -276,12 +276,17 @@ guint pango_layout_get_serial (PangoLayout *layout);
PANGO_AVAILABLE_IN_ALL
void pango_layout_get_log_attrs (PangoLayout *layout,
- PangoLogAttr **attrs,
- gint *n_attrs);
+ PangoLogAttr **attrs,
+ gint *n_attrs);
PANGO_AVAILABLE_IN_1_30
const PangoLogAttr *pango_layout_get_log_attrs_readonly (PangoLayout *layout,
- gint *n_attrs);
+ gint *n_attrs);
+
+PANGO_AVAILABLE_IN_1_50
+void pango_layout_set_log_attrs (PangoLayout *layout,
+ const PangoLogAttr *attrs,
+ int n_attrs);
PANGO_AVAILABLE_IN_ALL
void pango_layout_index_to_pos (PangoLayout *layout,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]