[pango/fix-itemize-crash] Fix a bug in Small Caps handling




commit 60f8171f062b4653a41cce02a582caa25331c68f
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Nov 13 08:15:12 2021 -0500

    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 ();
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]