summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-05-09 01:32:53 +0000
committerMatthias Clasen <mclasen@redhat.com>2021-05-09 01:32:53 +0000
commit7570667d08c7bb968316a8a40c6e65cee9c4b35b (patch)
tree582ae0983ef4fb5857e652c4d4ef36d1b210709d
parent99f4661a4f19802ba122fae09668a0b0e1cb7ca0 (diff)
parent00e222ab045f0956c16621aaadab4c76248f9bdb (diff)
downloadpango-1-46.tar.gz
Merge branch 'pango-1-46' into 'pango-1-46'pango-1-46
[1.46] Cherry pick various upstream fixes See merge request GNOME/pango!322
-rw-r--r--pango/pango-context.c2
-rw-r--r--pango/pango-glyph-item.c11
-rw-r--r--pango/pango-markup.c50
-rw-r--r--pango/pangofc-fontmap.c24
-rw-r--r--pango/pangofc-shape.c4
-rw-r--r--tests/meson.build2
-rw-r--r--tests/test-font.c71
-rw-r--r--tests/test-shape.c4
-rw-r--r--tests/testmisc.c14
9 files changed, 141 insertions, 41 deletions
diff --git a/pango/pango-context.c b/pango/pango-context.c
index 1fcdf366..a3d7e6c4 100644
--- a/pango/pango-context.c
+++ b/pango/pango-context.c
@@ -1572,7 +1572,7 @@ pango_itemize_with_base_dir (PangoContext *context,
g_return_val_if_fail (length >= 0, NULL);
g_return_val_if_fail (length == 0 || text != NULL, NULL);
- if (length == 0 || g_utf8_strlen (text, length) == 0)
+ if (length == 0 || g_utf8_strlen (text + start_index, length) == 0)
return NULL;
itemize_state_init (&state, context, text, base_dir, start_index, length,
diff --git a/pango/pango-glyph-item.c b/pango/pango-glyph-item.c
index 326ae37f..e38de730 100644
--- a/pango/pango-glyph-item.c
+++ b/pango/pango-glyph-item.c
@@ -753,7 +753,16 @@ pango_glyph_item_letter_space (PangoGlyphItem *glyph_item,
have_cluster = pango_glyph_item_iter_next_cluster (&iter))
{
if (!log_attrs[iter.start_char].is_cursor_position)
- continue;
+ {
+ if (glyphs[iter.start_glyph].geometry.width == 0)
+ {
+ if (iter.start_glyph < iter.end_glyph) /* LTR */
+ glyphs[iter.start_glyph].geometry.x_offset -= space_right;
+ else
+ glyphs[iter.start_glyph].geometry.x_offset += space_left;
+ }
+ continue;
+ }
if (iter.start_glyph < iter.end_glyph) /* LTR */
{
diff --git a/pango/pango-markup.c b/pango/pango-markup.c
index b74c1ad4..d0b47016 100644
--- a/pango/pango-markup.c
+++ b/pango/pango-markup.c
@@ -677,8 +677,21 @@ text_handler (GMarkupParseContext *context G_GNUC_UNUSED,
/* The underline should go underneath the char
* we're setting as the next range_start
*/
- uline_index = md->index;
- uline_len = g_utf8_next_char (p) - p;
+ if (md->attr_list != NULL)
+ {
+ /* Add the underline indicating the accelerator */
+ PangoAttribute *attr;
+
+ attr = pango_attr_underline_new (PANGO_UNDERLINE_LOW);
+
+ uline_index = md->index;
+ uline_len = g_utf8_next_char (p) - p;
+
+ attr->start_index = uline_index;
+ attr->end_index = uline_index + uline_len;
+
+ pango_attr_list_change (md->attr_list, attr);
+ }
/* set next range_start to include this char */
range_start = p;
@@ -693,35 +706,12 @@ text_handler (GMarkupParseContext *context G_GNUC_UNUSED,
}
p = g_utf8_next_char (p);
- }
-
- if (range_end)
- {
- g_string_append_len (md->text,
- range_start,
- range_end - range_start);
- md->index += range_end - range_start;
- }
- else
- {
- g_string_append_len (md->text,
- range_start,
- end - range_start);
- md->index += end - range_start;
- }
-
- if (md->attr_list != NULL && uline_index >= 0)
- {
- /* Add the underline indicating the accelerator */
- PangoAttribute *attr;
-
- attr = pango_attr_underline_new (PANGO_UNDERLINE_LOW);
-
- attr->start_index = uline_index;
- attr->end_index = uline_index + uline_len;
+ }
- pango_attr_list_change (md->attr_list, attr);
- }
+ g_string_append_len (md->text,
+ range_start,
+ end - range_start);
+ md->index += end - range_start;
}
}
diff --git a/pango/pangofc-fontmap.c b/pango/pangofc-fontmap.c
index 341b2d6c..3c31409e 100644
--- a/pango/pangofc-fontmap.c
+++ b/pango/pangofc-fontmap.c
@@ -1614,7 +1614,6 @@ pango_fc_make_pattern (const PangoFontDescription *description,
int slant;
double weight;
PangoGravity gravity;
- FcBool vertical;
char **families;
int i;
int width;
@@ -1625,7 +1624,6 @@ pango_fc_make_pattern (const PangoFontDescription *description,
width = pango_fc_convert_width_to_fc (pango_font_description_get_stretch (description));
gravity = pango_font_description_get_gravity (description);
- vertical = PANGO_GRAVITY_IS_VERTICAL (gravity) ? FcTrue : FcFalse;
/* The reason for passing in FC_SIZE as well as FC_PIXEL_SIZE is
* to work around a bug in libgnomeprint where it doesn't look
@@ -1634,13 +1632,14 @@ pango_fc_make_pattern (const PangoFontDescription *description,
* Putting FC_SIZE in here slightly reduces the efficiency
* of caching of patterns and fonts when working with multiple different
* dpi values.
+ *
+ * Do not pass FC_VERTICAL_LAYOUT true as HarfBuzz shaping assumes false.
*/
pattern = FcPatternBuild (NULL,
PANGO_FC_VERSION, FcTypeInteger, pango_version(),
FC_WEIGHT, FcTypeDouble, weight,
FC_SLANT, FcTypeInteger, slant,
FC_WIDTH, FcTypeInteger, width,
- FC_VERTICAL_LAYOUT, FcTypeBool, vertical,
#ifdef FC_VARIABLE
FC_VARIABLE, FcTypeBool, FcDontCare,
#endif
@@ -2439,7 +2438,24 @@ pango_fc_font_description_from_pattern (FcPattern *pattern, gboolean include_siz
pango_font_description_set_variant (desc, PANGO_VARIANT_NORMAL);
if (include_size && FcPatternGetDouble (pattern, FC_SIZE, 0, &size) == FcResultMatch)
- pango_font_description_set_size (desc, size * PANGO_SCALE);
+ {
+ FcMatrix *fc_matrix;
+ double scale_factor = 1;
+
+ if (FcPatternGetMatrix (pattern, FC_MATRIX, 0, &fc_matrix) == FcResultMatch)
+ {
+ PangoMatrix mat = PANGO_MATRIX_INIT;
+
+ mat.xx = fc_matrix->xx;
+ mat.xy = fc_matrix->xy;
+ mat.yx = fc_matrix->yx;
+ mat.yy = fc_matrix->yy;
+
+ scale_factor = pango_matrix_get_font_scale_factor (&mat);
+ }
+
+ pango_font_description_set_size (desc, scale_factor * size * PANGO_SCALE);
+ }
/* gravity is a bit different. we don't want to set it if it was not set on
* the pattern */
diff --git a/pango/pangofc-shape.c b/pango/pangofc-shape.c
index b6f74ca1..5c716b24 100644
--- a/pango/pangofc-shape.c
+++ b/pango/pangofc-shape.c
@@ -409,8 +409,8 @@ pango_hb_shape (PangoFont *font,
for (i = 0; i < num_glyphs; i++)
{
/* 90 degrees rotation counter-clockwise. */
- infos[i].geometry.width = hb_position->y_advance;
- infos[i].geometry.x_offset = hb_position->y_offset;
+ infos[i].geometry.width = - hb_position->y_advance;
+ infos[i].geometry.x_offset = - hb_position->y_offset;
infos[i].geometry.y_offset = - hb_position->x_offset;
hb_position++;
}
diff --git a/tests/meson.build b/tests/meson.build
index 6e10e2b7..6f08c240 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -8,6 +8,8 @@ endif
if host_system == 'windows'
test_cflags += '-DHAVE_WIN32'
+elif host_system == 'darwin'
+ test_cflags += '-DHAVE_CARBON'
endif
test_env = environment()
diff --git a/tests/test-font.c b/tests/test-font.c
index 486504f9..88e3cdc9 100644
--- a/tests/test-font.c
+++ b/tests/test-font.c
@@ -240,7 +240,74 @@ test_enumerate (void)
g_object_unref (font);
pango_font_description_free (desc);
g_free (faces);
- g_free (families);
+ g_free (families);
+ g_object_unref (context);
+}
+
+static void
+test_roundtrip_plain (void)
+{
+ PangoFontMap *fontmap;
+ PangoContext *context;
+ PangoFontDescription *desc, *desc2;
+ PangoFont *font;
+
+#ifdef HAVE_CARBON
+ /* We probably don't have the right fonts */
+ g_test_skip ("Skipping font-dependent tests on OS X");
+ return;
+#endif
+
+ fontmap = pango_cairo_font_map_get_default ();
+ context = pango_font_map_create_context (fontmap);
+
+ desc = pango_font_description_from_string ("Cantarell 11");
+
+ font = pango_context_load_font (context, desc);
+ desc2 = pango_font_describe (font);
+
+ g_assert (pango_font_description_equal (desc2, desc));
+
+ pango_font_description_free (desc2);
+ g_object_unref (font);
+ pango_font_description_free (desc);
+ g_object_unref (context);
+}
+
+static void
+test_roundtrip_emoji (void)
+{
+ PangoFontMap *fontmap;
+ PangoContext *context;
+ PangoFontDescription *desc, *desc2;
+ PangoFont *font;
+
+#ifdef HAVE_CARBON
+ /* We probably don't have the right fonts */
+ g_test_skip ("Skipping font-dependent tests on OS X");
+ return;
+#endif
+
+ fontmap = pango_cairo_font_map_get_default ();
+ context = pango_font_map_create_context (fontmap);
+
+ /* This is how pango_itemize creates the emoji font desc */
+ desc = pango_font_description_from_string ("Cantarell 11");
+ pango_font_description_set_family_static (desc, "emoji");
+
+ font = pango_context_load_font (context, desc);
+ desc2 = pango_font_describe (font);
+
+ /* We can't expect the family name to match, since we go in with
+ * a generic family
+ */
+ pango_font_description_unset_fields (desc, PANGO_FONT_MASK_FAMILY);
+ pango_font_description_unset_fields (desc2, PANGO_FONT_MASK_FAMILY);
+ g_assert (pango_font_description_equal (desc2, desc));
+
+ pango_font_description_free (desc2);
+ g_object_unref (font);
+ pango_font_description_free (desc);
g_object_unref (context);
g_object_unref (fontmap);
}
@@ -261,6 +328,8 @@ main (int argc, char *argv[])
g_test_add_func ("/pango/fontdescription/variation", test_variation);
g_test_add_func ("/pango/font/extents", test_extents);
g_test_add_func ("/pango/font/enumerate", test_enumerate);
+ g_test_add_func ("/pango/font/roundtrip/plain", test_roundtrip_plain);
+ g_test_add_func ("/pango/font/roundtrip/emoji", test_roundtrip_emoji);
return g_test_run ();
}
diff --git a/tests/test-shape.c b/tests/test-shape.c
index c2488dbf..feca154e 100644
--- a/tests/test-shape.c
+++ b/tests/test-shape.c
@@ -185,8 +185,6 @@ test_file (const gchar *filename, GString *string)
pango_attr_list_unref (itemize_attrs);
pango_attr_list_unref (shape_attrs);
- pango_attr_list_unref (attrs);
-
for (l = items; l; l = l->next)
{
PangoItem *item = l->data;
@@ -281,6 +279,8 @@ test_file (const gchar *filename, GString *string)
g_list_free_full (items, (GDestroyNotify)pango_item_free);
g_free (contents);
g_free (text);
+
+ pango_attr_list_unref (attrs);
}
static gchar *
diff --git a/tests/testmisc.c b/tests/testmisc.c
index 2f6c148b..48f60ee9 100644
--- a/tests/testmisc.c
+++ b/tests/testmisc.c
@@ -54,6 +54,19 @@ test_itemize_empty_crash (void)
g_object_unref (context);
}
+static void
+test_itemize_utf8 (void)
+{
+ PangoContext *context;
+ GList *result = NULL;
+
+ context = pango_font_map_create_context (pango_cairo_font_map_get_default ());
+ result = pango_itemize_with_base_dir (context, PANGO_DIRECTION_LTR, "\xc3\xa1\na", 3, 1, NULL, NULL);
+ g_assert (result != NULL);
+
+ g_object_unref (context);
+}
+
/* Test that pango_layout_set_text (layout, "short", 200)
* does not lead to a crash. (pidgin does this)
*/
@@ -94,6 +107,7 @@ main (int argc, char *argv[])
g_test_add_func ("/layout/shape-tab-crash", test_shape_tab_crash);
g_test_add_func ("/layout/itemize-empty-crash", test_itemize_empty_crash);
+ g_test_add_func ("/layout/itemize-utf8", test_itemize_utf8);
g_test_add_func ("/layout/short-string-crash", test_short_string_crash);
g_test_add_func ("/language/emoji-crash", test_language_emoji_crash);