pango/pango-fixes-small-caps.patch
2021-11-18 13:19:23 +08:00

87 lines
3.2 KiB
Diff

From 60f8171f062b4653a41cce02a582caa25331c68f Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Sat, 13 Nov 2021 08:15:12 -0500
Subject: [PATCH 1/2] 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(-)
Index: pango-1.49.3/pango/itemize.c
===================================================================
--- pango-1.49.3.orig/pango/itemize.c
+++ pango-1.49.3/pango/itemize.c
@@ -1380,7 +1380,7 @@ split_item_for_variant (const char *te
/* 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 *te
/* 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;
Index: pango-1.49.3/tests/testmisc.c
===================================================================
--- pango-1.49.3.orig/tests/testmisc.c
+++ pango-1.49.3/tests/testmisc.c
@@ -754,6 +754,35 @@ test_transform_rectangle (void)
g_assert_cmpint (rect2.height, ==, rect.width);
}
+/* 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;
+
+ if (strcmp (G_OBJECT_TYPE_NAME (pango_cairo_font_map_get_default ()), "PangoCairoCoreTextFontMap") == 0)
+ {
+ g_test_skip ("This test needs a fontmap that supports Small-Caps");
+ return;
+ }
+
+ 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[])
{
@@ -787,6 +816,7 @@ main (int argc, char *argv[])
g_test_add_func ("/layout/empty-line-height", test_empty_line_height);
g_test_add_func ("/layout/gravity-metrics", test_gravity_metrics);
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 ();
}