From 2439902d2f81c0e44e753a7381b27a5ad5d0d2b4 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 28 Nov 2021 09:59:39 -0500 Subject: Never show variation selectors Even when we show ignorables, we still want to ignore variation selectors and other ignorables that we don't have nicks for. Test included. --- pango/pango-impl-utils.h | 42 ++++++++++- pango/shape.c | 7 +- tests/layouts/valid-21.layout | 170 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 215 insertions(+), 4 deletions(-) create mode 100644 tests/layouts/valid-21.layout diff --git a/pango/pango-impl-utils.h b/pango/pango-impl-utils.h index a0183d69..55c743df 100644 --- a/pango/pango-impl-utils.h +++ b/pango/pango-impl-utils.h @@ -128,8 +128,46 @@ pango_glyph_string_reverse_range (PangoGlyphString *glyphs, } } -/* The cairo hexbox drawing code assumes - * that these nicks are 1-6 ASCII chars +static inline gboolean +pango_is_default_ignorable (gunichar ch) +{ + int plane = ch >> 16; + + if (G_LIKELY (plane == 0)) + { + int page = ch >> 8; + switch (page) + { + case 0x00: return ch == 0x00ad; + case 0x03: return ch == 0x034f; + case 0x06: return ch == 0x061c; + case 0x17: return (0x17b4 <= ch && ch <= 0x17b5); + case 0x18: return (0x180b <= ch && ch <= 0x180e); + case 0x20: return (0x200b <= ch && ch <= 0x200f) || + (0x202a <= ch && ch <= 0x202e) || + (0x2060 <= ch && ch <= 0x206f); + case 0xfe: return (0xfe00 <= ch && ch <= 0xfe0f) || ch == 0xfeff; + case 0xff: return (0xfff0 <= ch && ch <= 0xfff8); + default: return FALSE; + } + } + else + { + /* Other planes */ + switch (plane) + { + case 0x01: return (0x1d173 <= ch && ch <= 0x1d17a); + case 0x0e: return (0xe0000 <= ch && ch <= 0xe0fff); + default: return FALSE; + } + } +} + +/* These are the default ignorables that we render as hexboxes + * with nicks if PANGO_SHOW_IGNORABLES is used. + * + * The cairo hexbox drawing code assumes that these nicks are + * 1-6 ASCII chars */ static struct { gunichar ch; diff --git a/pango/shape.c b/pango/shape.c index caefeae4..45c979f2 100644 --- a/pango/shape.c +++ b/pango/shape.c @@ -111,9 +111,12 @@ pango_hb_font_get_nominal_glyph (hb_font_t *font, } if ((context->show_flags & PANGO_SHOW_IGNORABLES) != 0 && - pango_get_ignorable (unicode)) + pango_is_default_ignorable (unicode)) { - *glyph = PANGO_GET_UNKNOWN_GLYPH (unicode); + if (pango_get_ignorable (unicode)) + *glyph = PANGO_GET_UNKNOWN_GLYPH (unicode); + else + *glyph = PANGO_GLYPH_EMPTY; return TRUE; } diff --git a/tests/layouts/valid-21.layout b/tests/layouts/valid-21.layout new file mode 100644 index 00000000..9088c721 --- /dev/null +++ b/tests/layouts/valid-21.layout @@ -0,0 +1,170 @@ +{ + "context" : { + "font" : "serif 12", + "language" : "en-us", + "base-gravity" : "south", + "gravity-hint" : "natural", + "base-dir" : "weak-ltr", + "round-glyph-positions" : true, + "transform" : [ + 1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0 + ] + }, + "comment" : "Visible and nickless ignorables", + "text" : "😊️ ‍", + "attributes" : [ + { + "type" : "show", + "value" : 4 + } + ], + "font" : "Cantarell 11", + "output" : { + "is-wrapped" : false, + "is-ellipsized" : false, + "unknown-glyphs" : 1, + "width" : 45056, + "height" : 19456, + "log-attrs" : [ + { + "char-break" : true, + "cursor-position" : true, + "sentence-boundary" : true, + "sentence-start" : true, + "backspace-deletes-character" : true, + "word-boundary" : true + }, + { }, + { + "char-break" : true, + "white" : true, + "cursor-position" : true, + "expandable-space" : true, + "word-boundary" : true + }, + { + "line-break" : true + }, + { + "line-break" : true, + "mandatory-break" : true, + "char-break" : true, + "white" : true, + "cursor-position" : true, + "sentence-boundary" : true, + "sentence-end" : true, + "backspace-deletes-character" : true, + "word-boundary" : true + } + ], + "lines" : [ + { + "start-index" : 0, + "length" : 11, + "paragraph-start" : true, + "direction" : "ltr", + "runs" : [ + { + "offset" : 0, + "length" : 7, + "text" : "😊️", + "bidi-level" : 0, + "gravity" : "south", + "language" : "en-us", + "script" : "common", + "font" : { + "description" : "Noto Color Emoji 11", + "checksum" : "054c1c2e2ca956b920262840dcad39dcf27bb88d6f70b892b2b1180de2c2ab47", + "matrix" : [ + 0.13455956135321101, + -0.0, + -0.0, + 0.13455956135321101, + 0.0, + 0.0 + ] + }, + "flags" : 0, + "extra-attributes" : [ + { + "type" : "show", + "value" : 4 + } + ], + "y-offset" : 0, + "start-x-offset" : 0, + "end-x-offset" : 0, + "glyphs" : [ + { + "glyph" : 13, + "width" : 18432, + "is-cluster-start" : true, + "is-color" : true, + "log-cluster" : 0 + }, + { + "glyph" : 268435455, + "width" : 0, + "is-cluster-start" : true, + "log-cluster" : 4 + } + ] + }, + { + "offset" : 7, + "length" : 4, + "text" : " ‍", + "bidi-level" : 0, + "gravity" : "south", + "language" : "en-us", + "script" : "common", + "font" : { + "description" : "Cantarell 11", + "checksum" : "5bcb6ee14ee9d210b2e91d643de1fe456e9d1aea770983fdb05951545efebbe2", + "variations" : { + "wght" : 0 + }, + "matrix" : [ + 1.0, + -0.0, + -0.0, + 1.0, + 0.0, + 0.0 + ] + }, + "flags" : 0, + "extra-attributes" : [ + { + "type" : "show", + "value" : 4 + } + ], + "y-offset" : 0, + "start-x-offset" : 0, + "end-x-offset" : 0, + "glyphs" : [ + { + "glyph" : 1109, + "width" : 3072, + "is-cluster-start" : true, + "log-cluster" : 0 + }, + { + "glyph" : 268443661, + "width" : 23552, + "is-cluster-start" : true, + "log-cluster" : 1 + } + ] + } + ] + } + ] + } +} -- cgit v1.2.1