diff options
-rw-r--r-- | pango/pango-context.c | 2 | ||||
-rw-r--r-- | pango/pango-glyph-item.c | 11 | ||||
-rw-r--r-- | pango/pango-markup.c | 50 | ||||
-rw-r--r-- | pango/pangofc-fontmap.c | 24 | ||||
-rw-r--r-- | pango/pangofc-shape.c | 4 | ||||
-rw-r--r-- | tests/meson.build | 2 | ||||
-rw-r--r-- | tests/test-font.c | 71 | ||||
-rw-r--r-- | tests/test-shape.c | 4 | ||||
-rw-r--r-- | tests/testmisc.c | 14 |
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); |