[pango/matthiasc/for-main: 48/49] Never show variation selectors




commit 2439902d2f81c0e44e753a7381b27a5ad5d0d2b4
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Nov 28 09:59:39 2021 -0500

    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(-)
---
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
+              }
+            ]
+          }
+        ]
+      }
+    ]
+  }
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]