From 60f8171f062b4653a41cce02a582caa25331c68f Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 13 Nov 2021 08:15:12 -0500 Subject: Fix a bug in Small Caps handling We were not passing the correct split_offset to pango_item_split(). Testcase included. Fixes: #627 --- pango/itemize.c | 4 ++-- tests/testmisc.c | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/pango/itemize.c b/pango/itemize.c index 82c737cc..77e86507 100644 --- a/pango/itemize.c +++ b/pango/itemize.c @@ -1380,7 +1380,7 @@ split_item_for_variant (const char *text, /* p0 .. p is a lowercase segment */ if (p < end) { - new_item = pango_item_split (item, p - p0, g_utf8_strlen (p, p - p0)); + new_item = pango_item_split (item, p - p0, g_utf8_strlen (p0, p - p0)); list_item->data = new_item; list_item = g_list_insert_before (list_item, list_item->next, item); list_item = list_item->next; @@ -1429,7 +1429,7 @@ split_item_for_variant (const char *text, /* p0 .. p is a uppercase segment */ if (p < end) { - new_item = pango_item_split (item, p - p0, g_utf8_strlen (p, p - p0)); + new_item = pango_item_split (item, p - p0, g_utf8_strlen (p0, p - p0)); list_item->data = new_item; list_item = g_list_insert_before (list_item, list_item->next, item); list_item = list_item->next; diff --git a/tests/testmisc.c b/tests/testmisc.c index a91dcbb3..4861c3d0 100644 --- a/tests/testmisc.c +++ b/tests/testmisc.c @@ -779,6 +779,29 @@ test_wrap_char (void) g_object_unref (context); } +/* Test the crash with Small Caps in itemization from #627 */ +static void +test_small_caps_crash (void) +{ + PangoContext *context; + PangoLayout *layout; + PangoFontDescription *desc; + int w, h; + + context = pango_font_map_create_context (pango_cairo_font_map_get_default ()); + layout = pango_layout_new (context); + desc = pango_font_description_from_string ("Cantarell Small-Caps 11"); + pango_layout_set_font_description (layout, desc); + + pango_layout_set_text (layout, "Pere Ràfols Soler\nEqualiser, LV2\nAudio: 1, 1\nMidi: 0, 0\nControls: 53, 2\nCV: 0, 0", -1); + + pango_layout_get_size (layout, &w, &h); + + pango_font_description_free (desc); + g_object_unref (layout); + g_object_unref (context); +} + int main (int argc, char *argv[]) { @@ -813,6 +836,7 @@ main (int argc, char *argv[]) g_test_add_func ("/layout/gravity-metrics", test_gravity_metrics); g_test_add_func ("/layout/wrap-char", test_wrap_char); g_test_add_func ("/matrix/transform-rectangle", test_transform_rectangle); + g_test_add_func ("/itemize/small-caps-crash", test_small_caps_crash); return g_test_run (); } -- cgit v1.2.1