From b420d022a2979c2e86b465bca0c7d603dd136108 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Thu, 16 Dec 2021 08:40:07 -0500 Subject: Fix handling of space-less fonts HarfBuzz knows how to synthesize spaces, we just need to tickle it in the right way. Test included. Update affected tests. Fixes: #641 --- pango/shape.c | 10 ++- tests/fonts/README | 1 + tests/fonts/fa-regular-f2db.ttf | Bin 0 -> 912 bytes tests/fonts/fa-solid-f2db.ttf | Bin 0 -> 1320 bytes tests/layouts/no-space.layout | 142 ++++++++++++++++++++++++++++++++++++++++ tests/layouts/valid-14.layout | 20 ++---- tests/meson.build | 1 + 7 files changed, 160 insertions(+), 14 deletions(-) create mode 100644 tests/fonts/fa-regular-f2db.ttf create mode 100644 tests/fonts/fa-solid-f2db.ttf create mode 100644 tests/layouts/no-space.layout diff --git a/pango/shape.c b/pango/shape.c index 45c979f2..d0140d5e 100644 --- a/pango/shape.c +++ b/pango/shape.c @@ -137,10 +137,18 @@ pango_hb_font_get_nominal_glyph (hb_font_t *font, if (hb_font_get_nominal_glyph (context->parent, unicode, glyph)) return TRUE; + /* HarfBuzz knows how to synthesize spaces, so never replace them + * with unknown glyphs, but we do need to tell HarfBuzz that the + * font does not have a glyph. + */ + if (g_unichar_type (unicode) == G_UNICODE_SPACE_SEPARATOR) + return FALSE; + *glyph = PANGO_GET_UNKNOWN_GLYPH (unicode); /* We draw our own invalid-Unicode shape, so prevent HarfBuzz - * from using REPLACEMENT CHARACTER. */ + * from using REPLACEMENT CHARACTER. + */ if (unicode > 0x10FFFF) return TRUE; diff --git a/tests/fonts/README b/tests/fonts/README index 9cc88ca7..ca56ca40 100644 --- a/tests/fonts/README +++ b/tests/fonts/README @@ -7,3 +7,4 @@ DejaVSansMono.ttf: DejaVu Sans Mono emoji-subset.ttf: subset of Noto Color Emoji droid-sans-subset.ttf: subset of Droid Sans Japanese amiri-06dd.ttf: subset of Amiri containing U+06dd +fa-regular-f2db.ttf, fa-solid-f2db.ttf: subset of FontAwesome containing U+f2db diff --git a/tests/fonts/fa-regular-f2db.ttf b/tests/fonts/fa-regular-f2db.ttf new file mode 100644 index 00000000..54e0f1fb Binary files /dev/null and b/tests/fonts/fa-regular-f2db.ttf differ diff --git a/tests/fonts/fa-solid-f2db.ttf b/tests/fonts/fa-solid-f2db.ttf new file mode 100644 index 00000000..dc5ef3d7 Binary files /dev/null and b/tests/fonts/fa-solid-f2db.ttf differ diff --git a/tests/layouts/no-space.layout b/tests/layouts/no-space.layout new file mode 100644 index 00000000..07f6aa06 --- /dev/null +++ b/tests/layouts/no-space.layout @@ -0,0 +1,142 @@ +{ + "context" : { + "font" : "serif 12", + "base-gravity" : "south", + "gravity-hint" : "natural", + "base-dir" : "weak-ltr", + "round-glyph-positions" : true, + "transform" : [ + 1, + 0, + 0, + 1, + 0, + 0 + ] + }, + "comment" : "Test that we get synthesized spaces\nfrom HarfBuzz.", + "text" : "  ", + "font" : "Font Awesome 5 Free 32", + "output" : { + "is-wrapped" : false, + "is-ellipsized" : false, + "unknown-glyphs" : 0, + "width" : 220160, + "height" : 220160, + "log-attrs" : [ + { + "char-break" : true, + "white" : true, + "cursor-position" : true, + "sentence-boundary" : true, + "backspace-deletes-character" : true, + "expandable-space" : true, + "word-boundary" : true + }, + { + "char-break" : true, + "white" : true, + "cursor-position" : true, + "expandable-space" : true + }, + { + "line-break" : true, + "char-break" : true, + "cursor-position" : true, + "sentence-start" : true, + "word-boundary" : true + }, + { + "char-break" : true, + "white" : true, + "cursor-position" : true, + "sentence-end" : true, + "backspace-deletes-character" : true, + "expandable-space" : true, + "word-boundary" : true + }, + { + "char-break" : true, + "white" : true, + "cursor-position" : true, + "expandable-space" : true + }, + { + "line-break" : true, + "mandatory-break" : true, + "char-break" : true, + "white" : true, + "cursor-position" : true, + "sentence-boundary" : true, + "word-boundary" : true + } + ], + "lines" : [ + { + "start-index" : 0, + "length" : 7, + "paragraph-start" : true, + "direction" : "ltr", + "runs" : [ + { + "offset" : 0, + "length" : 7, + "text" : "  ", + "bidi-level" : 0, + "gravity" : "south", + "language" : "en-us", + "script" : "common", + "font" : { + "description" : "Font Awesome 5 Free Solid Heavy 32", + "checksum" : "8fe6cd51391fa6f8c2008609ddd489bb81a6d7674f3a1c8b7fa07efd026a6397", + "matrix" : [ + 1, + -0, + -0, + 1, + 0, + 0 + ] + }, + "flags" : 0, + "y-offset" : 0, + "start-x-offset" : 0, + "end-x-offset" : 0, + "glyphs" : [ + { + "glyph" : 0, + "width" : 44032, + "is-cluster-start" : true, + "log-cluster" : 0 + }, + { + "glyph" : 0, + "width" : 44032, + "is-cluster-start" : true, + "log-cluster" : 1 + }, + { + "glyph" : 1, + "width" : 44032, + "is-cluster-start" : true, + "log-cluster" : 2 + }, + { + "glyph" : 0, + "width" : 44032, + "is-cluster-start" : true, + "log-cluster" : 5 + }, + { + "glyph" : 0, + "width" : 44032, + "is-cluster-start" : true, + "log-cluster" : 6 + } + ] + } + ] + } + ] + } +} diff --git a/tests/layouts/valid-14.layout b/tests/layouts/valid-14.layout index ca686814..8cfa62d9 100644 --- a/tests/layouts/valid-14.layout +++ b/tests/layouts/valid-14.layout @@ -23,7 +23,7 @@ "output" : { "is-wrapped" : false, "is-ellipsized" : true, - "unknown-glyphs" : 1, + "unknown-glyphs" : 0, "width" : 161792, "height" : 161792, "log-attrs" : [ @@ -189,8 +189,8 @@ "runs" : [ { "offset" : 0, - "length" : 3, - "text" : "你", + "length" : 6, + "text" : "你好", "bidi-level" : 0, "gravity" : "south", "language" : "en-us", @@ -241,9 +241,9 @@ ] }, { - "offset" : 3, - "length" : 4, - "text" : "好 ", + "offset" : 6, + "length" : 1, + "text" : " ", "bidi-level" : 0, "gravity" : "south", "language" : "xx", @@ -266,16 +266,10 @@ "end-x-offset" : 0, "glyphs" : [ { - "glyph" : 1, + "glyph" : 0, "width" : 15360, "is-cluster-start" : true, "log-cluster" : 0 - }, - { - "glyph" : 268435488, - "width" : 0, - "is-cluster-start" : true, - "log-cluster" : 3 } ] }, diff --git a/tests/meson.build b/tests/meson.build index 79510fb6..271d9046 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -122,6 +122,7 @@ installed_test_layouts_data = [ 'layouts/tab-crash.layout', 'layouts/tab-assert.layout', 'layouts/arabic-format.layout', + 'layouts/no-space.layout', ] test_markups_data = [ -- cgit v1.2.1