[pango/matthiasc/for-main: 2/2] Be more forgiving about attribute ordering
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pango/matthiasc/for-main: 2/2] Be more forgiving about attribute ordering
- Date: Wed, 1 Sep 2021 16:58:31 +0000 (UTC)
commit b56d606e1788fb3bd02b102923c10e0e74d86839
Author: Matthias Clasen <mclasen redhat com>
Date: Wed Sep 1 12:52:48 2021 -0400
Be more forgiving about attribute ordering
We don't really have firm control over the way
attributes are ordered in the list, so the
assumtion that we see proper nesting for baseline
shifts was a bit optimistic.
Just look through all open stack items for a match,
and remove that.
Test included.
pango/pango-layout.c | 26 ++++++----
tests/layouts/valid-22.expected | 112 ++++++++++++++++++++++++++++++++++++++++
tests/layouts/valid-22.markup | 2 +
3 files changed, 130 insertions(+), 10 deletions(-)
---
diff --git a/pango/pango-layout.c b/pango/pango-layout.c
index 098e3a3e..21e2c9c6 100644
--- a/pango/pango-layout.c
+++ b/pango/pango-layout.c
@@ -6248,20 +6248,26 @@ collect_baseline_shift (ParaBreakState *state,
if (attr->end_index == item->offset + item->length)
{
- BaselineItem *entry = state->baseline_shifts->data;
+ GList *t;
- if (attr->start_index == entry->attr->start_index &&
- attr->end_index == entry->attr->end_index &&
- ((PangoAttrInt *)attr)->value == ((PangoAttrInt *)entry->attr)->value)
+ for (t = state->baseline_shifts; t; t = t->next)
{
- *end_x_offset -= entry->x_offset;
- *end_y_offset -= entry->y_offset;
+ BaselineItem *entry = t->data;
+
+ if (attr->start_index == entry->attr->start_index &&
+ attr->end_index == entry->attr->end_index &&
+ ((PangoAttrInt *)attr)->value == ((PangoAttrInt *)entry->attr)->value)
+ {
+ *end_x_offset -= entry->x_offset;
+ *end_y_offset -= entry->y_offset;
+ }
+
+ state->baseline_shifts = g_list_remove (state->baseline_shifts, entry);
+ g_free (entry);
+ break;
}
- else
+ if (t == NULL)
g_warning ("Baseline attributes mismatch\n");
-
- state->baseline_shifts = g_list_remove (state->baseline_shifts, entry);
- g_free (entry);
}
}
}
diff --git a/tests/layouts/valid-22.expected b/tests/layouts/valid-22.expected
new file mode 100644
index 00000000..5b4b691e
--- /dev/null
+++ b/tests/layouts/valid-22.expected
@@ -0,0 +1,112 @@
+𝜀0 = 𝜔𝜔𝜔...
+
+--- parameters
+
+wrapped: 0
+ellipsized: 0
+lines: 2
+
+--- attributes
+
+range 0 4
+range 4 5
+[4,5]font-desc=Italic
+[4,5]font-scale=2
+[4,5]baseline-shift=2
+range 5 12
+range 12 16
+[12,23]font-scale=1
+[12,23]baseline-shift=1
+range 16 20
+[12,23]font-scale=1
+[12,23]baseline-shift=1
+[16,23]font-scale=1
+[16,23]baseline-shift=1
+range 20 21
+[12,23]font-scale=1
+[12,23]baseline-shift=1
+[16,23]font-scale=1
+[16,23]baseline-shift=1
+[20,23]font-scale=1
+[20,23]baseline-shift=1
+range 21 22
+[12,23]font-scale=1
+[12,23]baseline-shift=1
+[16,23]font-scale=1
+[16,23]baseline-shift=1
+[20,23]font-scale=1
+[20,23]baseline-shift=1
+[21,23]font-scale=1
+[21,23]baseline-shift=1
+range 22 23
+[12,23]font-scale=1
+[12,23]baseline-shift=1
+[16,23]font-scale=1
+[16,23]baseline-shift=1
+[20,23]font-scale=1
+[20,23]baseline-shift=1
+[21,23]font-scale=1
+[21,23]baseline-shift=1
+[22,23]font-scale=1
+[22,23]baseline-shift=1
+range 23 2147483647
+
+--- directions
+
+0 0 0 0 0 0 0 0 0 0 0 0
+
+--- cursor positions
+
+0(0) 4(0) 5(0) 6(0) 7(0) 8(0) 12(0) 16(0) 20(0) 22(1) 24(0)
+
+--- lines
+
+i=1, index=0, paragraph-start=1, dir=ltr '𝜀0 = 𝜔𝜔𝜔...
+'
+i=2, index=24, paragraph-start=1, dir=ltr ''
+
+--- runs
+
+i=1, index=0, chars=1, level=0, gravity=south, flags=0, font=OMITTED, script=common, language=en-us, '𝜀'
+i=2, index=4, chars=1, level=0, gravity=south, flags=0, font=OMITTED, script=common, language=en-us, '0'
+[4,5]font-scale=2
+[4,5]baseline-shift=2
+i=3, index=5, chars=3, level=0, gravity=south, flags=0, font=OMITTED, script=common, language=en-us, ' = '
+i=4, index=8, chars=1, level=0, gravity=south, flags=0, font=OMITTED, script=common, language=en-us, '𝜔'
+i=5, index=12, chars=1, level=0, gravity=south, flags=0, font=OMITTED, script=common, language=en-us, '𝜔'
+[12,23]font-scale=1
+[12,23]baseline-shift=1
+i=6, index=16, chars=1, level=0, gravity=south, flags=0, font=OMITTED, script=common, language=en-us, '𝜔'
+[12,23]font-scale=1
+[12,23]baseline-shift=1
+[16,23]font-scale=1
+[16,23]baseline-shift=1
+i=7, index=20, chars=1, level=0, gravity=south, flags=0, font=OMITTED, script=common, language=en-us, '.'
+[12,23]font-scale=1
+[12,23]baseline-shift=1
+[16,23]font-scale=1
+[16,23]baseline-shift=1
+[20,23]font-scale=1
+[20,23]baseline-shift=1
+i=8, index=21, chars=1, level=0, gravity=south, flags=0, font=OMITTED, script=common, language=en-us, '.'
+[12,23]font-scale=1
+[12,23]baseline-shift=1
+[16,23]font-scale=1
+[16,23]baseline-shift=1
+[20,23]font-scale=1
+[20,23]baseline-shift=1
+[21,23]font-scale=1
+[21,23]baseline-shift=1
+i=9, index=22, chars=1, level=0, gravity=south, flags=0, font=OMITTED, script=common, language=en-us, '.'
+[12,23]font-scale=1
+[12,23]baseline-shift=1
+[16,23]font-scale=1
+[16,23]baseline-shift=1
+[20,23]font-scale=1
+[20,23]baseline-shift=1
+[21,23]font-scale=1
+[21,23]baseline-shift=1
+[22,23]font-scale=1
+[22,23]baseline-shift=1
+i=10, index=23, no run, line end
+i=11, index=24, no run, line end
diff --git a/tests/layouts/valid-22.markup b/tests/layouts/valid-22.markup
new file mode 100644
index 00000000..2045976f
--- /dev/null
+++ b/tests/layouts/valid-22.markup
@@ -0,0 +1,2 @@
+
+𝜀<span font_desc="italic"><sub>0</sub></span> = 𝜔<sup>𝜔<sup>𝜔<sup>.<sup>.<sup>.</sup></sup></sup></sup></sup>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]