From 887cc68c36f31c5d8796c377919c186870d2b198 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 23 May 2021 21:03:22 -0400 Subject: Explicitly preserve unlimited attributes When calling pango_attr_list_update(), we must not change the limits or attributes that are unlimited. --- pango/pango-attributes.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/pango/pango-attributes.c b/pango/pango-attributes.c index 8b4b2f7a..0d604f3d 100644 --- a/pango/pango-attributes.c +++ b/pango/pango-attributes.c @@ -1760,28 +1760,34 @@ pango_attr_list_update (PangoAttrList *list, continue; } - if (attr->start_index >= pos && - attr->start_index < pos + remove) - { - attr->start_index = pos + add; - } - else if (attr->start_index >= pos + remove) + if (attr->start_index != PANGO_ATTR_INDEX_FROM_TEXT_BEGINNING) { - attr->start_index += add - remove; + if (attr->start_index >= pos && + attr->start_index < pos + remove) + { + attr->start_index = pos + add; + } + else if (attr->start_index >= pos + remove) + { + attr->start_index += add - remove; + } } - if (attr->end_index >= pos && - attr->end_index < pos + remove) - { - attr->end_index = pos; - } - else if (attr->end_index >= pos + remove) + if (attr->end_index != PANGO_ATTR_INDEX_TO_TEXT_END) { - if (add > remove && - G_MAXUINT - attr->end_index < add - remove) - attr->end_index = G_MAXUINT; - else - attr->end_index += add - remove; + if (attr->end_index >= pos && + attr->end_index < pos + remove) + { + attr->end_index = pos; + } + else if (attr->end_index >= pos + remove) + { + if (add > remove && + G_MAXUINT - attr->end_index < add - remove) + attr->end_index = G_MAXUINT; + else + attr->end_index += add - remove; + } } } } -- cgit v1.2.1 From 6e363555a5ed76756a5bc8eb4914dc2e4af9c3b5 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 23 May 2021 21:04:11 -0400 Subject: Add a test for unlimited attributes Test the fix in the previous commit. --- tests/testmisc.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/testmisc.c b/tests/testmisc.c index 0767eb7a..b4467a63 100644 --- a/tests/testmisc.c +++ b/tests/testmisc.c @@ -125,23 +125,33 @@ static void test_attr_list_update (void) { PangoAttribute *weight_attr; + PangoAttribute *fg_attr; PangoAttrList *list; weight_attr = pango_attr_weight_new (700); weight_attr->start_index = 4; weight_attr->end_index = 6; + fg_attr = pango_attr_foreground_new (0, 0, 65535); + fg_attr->start_index = PANGO_ATTR_INDEX_FROM_TEXT_BEGINNING; + fg_attr->end_index = PANGO_ATTR_INDEX_TO_TEXT_END; + list = pango_attr_list_new(); pango_attr_list_insert (list, weight_attr); + pango_attr_list_insert (list, fg_attr); g_assert_cmpuint (weight_attr->start_index, ==, 4); g_assert_cmpuint (weight_attr->end_index, ==, 6); + g_assert_cmpuint (fg_attr->start_index, ==, PANGO_ATTR_INDEX_FROM_TEXT_BEGINNING); + g_assert_cmpuint (fg_attr->end_index, ==, PANGO_ATTR_INDEX_TO_TEXT_END); // Delete 1 byte at position 2 pango_attr_list_update (list, 2, 1, 0); g_assert_cmpuint (weight_attr->start_index, ==, 3); g_assert_cmpuint (weight_attr->end_index, ==, 5); + g_assert_cmpuint (fg_attr->start_index, ==, PANGO_ATTR_INDEX_FROM_TEXT_BEGINNING); + g_assert_cmpuint (fg_attr->end_index, ==, PANGO_ATTR_INDEX_TO_TEXT_END); pango_attr_list_unref (list); } -- cgit v1.2.1