summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-11-28 09:59:39 -0500
committerMatthias Clasen <mclasen@redhat.com>2021-11-28 10:34:22 -0500
commit2439902d2f81c0e44e753a7381b27a5ad5d0d2b4 (patch)
treebe4d6f559b9c93b95f09114401758d06341b35f4
parent3fdbd3fe01842e683a26a1e1c9c9eb04099f27f1 (diff)
downloadpango-2439902d2f81c0e44e753a7381b27a5ad5d0d2b4.tar.gz
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.
-rw-r--r--pango/pango-impl-utils.h42
-rw-r--r--pango/shape.c7
-rw-r--r--tests/layouts/valid-21.layout170
3 files changed, 215 insertions, 4 deletions
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
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+}