summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-06-10 21:09:41 +0000
committerMatthias Clasen <mclasen@redhat.com>2020-06-10 21:09:41 +0000
commit072aa88d48f9bd267bb08eac786caf5dff1452af (patch)
treec54be0da8a3a347c19a867734ddc50602b16341e
parentb2b39ba72148d65409db71ab96e2b095e065c48f (diff)
parent0ea1a90f940474e2fdf0a3e36527a74cb9d332f8 (diff)
downloadpango-072aa88d48f9bd267bb08eac786caf5dff1452af.tar.gz
Merge branch 'fix-attr-lists' into 'master'
Fix pango_attr_list_change See merge request GNOME/pango!200
-rw-r--r--pango/pango-attributes.c12
-rw-r--r--tests/testattributes.c138
2 files changed, 147 insertions, 3 deletions
diff --git a/pango/pango-attributes.c b/pango/pango-attributes.c
index 239fc935..800c2dec 100644
--- a/pango/pango-attributes.c
+++ b/pango/pango-attributes.c
@@ -1531,7 +1531,7 @@ pango_attr_list_change (PangoAttrList *list,
g_return_if_fail (list != NULL);
- if (start_index == end_index) /* empty, nothing to do */
+ if (start_index == end_index) /* empty, nothing to do */
{
pango_attribute_destroy (attr);
return;
@@ -1560,7 +1560,7 @@ pango_attr_list_change (PangoAttrList *list,
continue; /* This attr does not overlap with the new one */
g_assert (tmp_attr->end_index >= start_index);
- g_assert (start_index < tmp_attr->end_index);
+ g_assert (start_index <= tmp_attr->end_index);
if (pango_attribute_equal (tmp_attr, attr))
{
@@ -1571,7 +1571,6 @@ pango_attr_list_change (PangoAttrList *list,
/* We are totally overlapping the previous attribute.
* No action is needed.
*/
- g_ptr_array_remove_index (list->attributes, i);
pango_attribute_destroy (attr);
return;
}
@@ -1607,6 +1606,13 @@ pango_attr_list_change (PangoAttrList *list,
}
}
+ if (i == p)
+ {
+ /* we didn't insert attr yet */
+ pango_attr_list_insert (list, attr);
+ return;
+ }
+
/* We now have the range inserted into the list one way or the
* other. Fix up the remainder */
/* Attention: No i = 0 here. */
diff --git a/tests/testattributes.c b/tests/testattributes.c
index 4eea97da..8022498a 100644
--- a/tests/testattributes.c
+++ b/tests/testattributes.c
@@ -688,6 +688,142 @@ test_list_equal (void)
}
}
+static void
+test_insert (void)
+{
+ PangoAttrList *list;
+ PangoAttribute *attr;
+
+ list = pango_attr_list_new ();
+ attr = pango_attr_size_new (10 * PANGO_SCALE);
+ attr->start_index = 10;
+ attr->end_index = 11;
+ pango_attr_list_insert (list, attr);
+ attr = pango_attr_rise_new (100);
+ attr->start_index = 0;
+ attr->end_index = 200;
+ pango_attr_list_insert (list, attr);
+ attr = pango_attr_family_new ("Times");
+ attr->start_index = 5;
+ attr->end_index = 15;
+ pango_attr_list_insert (list, attr);
+ attr = pango_attr_fallback_new (FALSE);
+ attr->start_index = 11;
+ attr->end_index = 100;
+ pango_attr_list_insert (list, attr);
+ attr = pango_attr_stretch_new (PANGO_STRETCH_CONDENSED);
+ attr->start_index = 30;
+ attr->end_index = 60;
+ pango_attr_list_insert (list, attr);
+
+ assert_attr_list (list, "[0,200]rise=100\n"
+ "[5,15]family=Times\n"
+ "[10,11]size=10240\n"
+ "[11,100]fallback=0\n"
+ "[30,60]stretch=2\n");
+
+ attr = pango_attr_family_new ("Times");
+ attr->start_index = 10;
+ attr->end_index = 25;
+ pango_attr_list_change (list, attr);
+
+ assert_attr_list (list, "[0,200]rise=100\n"
+ "[5,25]family=Times\n"
+ "[10,11]size=10240\n"
+ "[11,100]fallback=0\n"
+ "[30,60]stretch=2\n");
+
+ attr = pango_attr_family_new ("Futura");
+ attr->start_index = 11;
+ attr->end_index = 25;
+ pango_attr_list_insert (list, attr);
+
+ assert_attr_list (list, "[0,200]rise=100\n"
+ "[5,25]family=Times\n"
+ "[10,11]size=10240\n"
+ "[11,100]fallback=0\n"
+ "[11,25]family=Futura\n"
+ "[30,60]stretch=2\n");
+
+ pango_attr_list_unref (list);
+}
+
+static gboolean
+attr_list_merge_filter (PangoAttribute *attribute,
+ gpointer list)
+{
+ pango_attr_list_change (list, pango_attribute_copy (attribute));
+ return FALSE;
+}
+
+/* test something that gtk does */
+static void
+test_merge (void)
+{
+ PangoAttrList *list;
+ PangoAttrList *list2;
+ PangoAttribute *attr;
+
+ list = pango_attr_list_new ();
+ attr = pango_attr_size_new (10 * PANGO_SCALE);
+ attr->start_index = 10;
+ attr->end_index = 11;
+ pango_attr_list_insert (list, attr);
+ attr = pango_attr_rise_new (100);
+ attr->start_index = 0;
+ attr->end_index = 200;
+ pango_attr_list_insert (list, attr);
+ attr = pango_attr_family_new ("Times");
+ attr->start_index = 5;
+ attr->end_index = 15;
+ pango_attr_list_insert (list, attr);
+ attr = pango_attr_fallback_new (FALSE);
+ attr->start_index = 11;
+ attr->end_index = 100;
+ pango_attr_list_insert (list, attr);
+ attr = pango_attr_stretch_new (PANGO_STRETCH_CONDENSED);
+ attr->start_index = 30;
+ attr->end_index = 60;
+ pango_attr_list_insert (list, attr);
+
+ assert_attr_list (list, "[0,200]rise=100\n"
+ "[5,15]family=Times\n"
+ "[10,11]size=10240\n"
+ "[11,100]fallback=0\n"
+ "[30,60]stretch=2\n");
+
+ list2 = pango_attr_list_new ();
+ attr = pango_attr_size_new (10 * PANGO_SCALE);
+ attr->start_index = 11;
+ attr->end_index = 13;
+ pango_attr_list_insert (list2, attr);
+ attr = pango_attr_size_new (11 * PANGO_SCALE);
+ attr->start_index = 13;
+ attr->end_index = 15;
+ pango_attr_list_insert (list2, attr);
+ attr = pango_attr_size_new (12 * PANGO_SCALE);
+ attr->start_index = 40;
+ attr->end_index = 50;
+ pango_attr_list_insert (list2, attr);
+
+ assert_attr_list (list2, "[11,13]size=10240\n"
+ "[13,15]size=11264\n"
+ "[40,50]size=12288\n");
+
+ pango_attr_list_filter (list2, attr_list_merge_filter, list);
+
+ assert_attr_list (list, "[0,200]rise=100\n"
+ "[5,15]family=Times\n"
+ "[10,13]size=10240\n"
+ "[11,100]fallback=0\n"
+ "[13,15]size=11264\n"
+ "[30,60]stretch=2\n"
+ "[40,50]size=12288\n");
+
+ pango_attr_list_unref (list);
+ pango_attr_list_unref (list2);
+}
+
int
main (int argc, char *argv[])
{
@@ -705,6 +841,8 @@ main (int argc, char *argv[])
g_test_add_func ("/attributes/iter/get", test_iter_get);
g_test_add_func ("/attributes/iter/get_font", test_iter_get_font);
g_test_add_func ("/attributes/iter/get_attrs", test_iter_get_attrs);
+ g_test_add_func ("/attributes/insert", test_insert);
+ g_test_add_func ("/attributes/merge", test_merge);
return g_test_run ();
}