[pango/fix-vertical-regression] Revert "Fix advance widths with transforms"




commit 22f8df579d82f342909b629c0e94b8ff7c5452fd
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Dec 17 14:24:17 2021 -0500

    Revert "Fix advance widths with transforms"
    
    This reverts commit ccb651dd2a876a4f4a4cb9351f05332173e709ba.
    
    This broke vertical text rendering, see
    https://gitlab.com/inkscape/inkscape/-/issues/2950.
    
    Update affected tests and add a vertical test.

 pango/shape.c                   |  45 ++++---
 tests/fonts/README              |   1 +
 tests/fonts/noto-sans-cjk.ttf   | Bin 0 -> 3708 bytes
 tests/layouts/bratwurst.layout  |   8 +-
 tests/layouts/bratwurst2.layout |   8 +-
 tests/layouts/bratwurst3.layout |   4 +-
 tests/layouts/bratwurst4.layout |   8 +-
 tests/layouts/effigy.layout     |   8 +-
 tests/layouts/kebab.layout      |   2 +-
 tests/layouts/tabs.layout       |   4 +-
 tests/layouts/valid-10.layout   |   6 +-
 tests/layouts/valid-14.layout   |   6 +-
 tests/layouts/valid-19.layout   |   6 +-
 tests/layouts/valid-20.layout   |  10 +-
 tests/layouts/valid-8.layout    |   8 +-
 tests/layouts/valid-9.layout    |   4 +-
 tests/layouts/vertical.layout   | 260 ++++++++++++++++++++++++++++++++++++++++
 17 files changed, 331 insertions(+), 57 deletions(-)
---
diff --git a/pango/shape.c b/pango/shape.c
index d0140d5e..90334cc1 100644
--- a/pango/shape.c
+++ b/pango/shape.c
@@ -162,11 +162,16 @@ pango_hb_font_get_glyph_h_advance (hb_font_t      *font,
                                    void           *user_data G_GNUC_UNUSED)
 {
   PangoHbShapeContext *context = (PangoHbShapeContext *) font_data;
-  PangoRectangle logical;
 
-  pango_font_get_glyph_extents (context->font, glyph, NULL, &logical);
+  if (glyph & PANGO_GLYPH_UNKNOWN_FLAG)
+    {
+      PangoRectangle logical;
+
+      pango_font_get_glyph_extents (context->font, glyph, NULL, &logical);
+      return logical.width;
+    }
 
-  return logical.width;
+  return hb_font_get_glyph_h_advance (context->parent, glyph);
 }
 
 static hb_position_t
@@ -176,14 +181,16 @@ pango_hb_font_get_glyph_v_advance (hb_font_t      *font,
                                    void           *user_data G_GNUC_UNUSED)
 {
   PangoHbShapeContext *context = (PangoHbShapeContext *) font_data;
-  PangoRectangle logical;
 
-  pango_font_get_glyph_extents (context->font, glyph, NULL, &logical);
+  if (glyph & PANGO_GLYPH_UNKNOWN_FLAG)
+    {
+      PangoRectangle logical;
 
-  if (hb_font_get_glyph_v_advance (context->parent, glyph) < 0)
-    return - logical.height;
-  else
-    return logical.height;
+      pango_font_get_glyph_extents (context->font, glyph, NULL, &logical);
+      return logical.height;
+    }
+
+  return hb_font_get_glyph_v_advance (context->parent, glyph);
 }
 
 static hb_bool_t
@@ -194,16 +201,22 @@ pango_hb_font_get_glyph_extents (hb_font_t          *font,
                                  void               *user_data G_GNUC_UNUSED)
 {
   PangoHbShapeContext *context = (PangoHbShapeContext *) font_data;
-  PangoRectangle ink;
 
-  pango_font_get_glyph_extents (context->font, glyph, &ink, NULL);
+  if (glyph & PANGO_GLYPH_UNKNOWN_FLAG)
+    {
+      PangoRectangle ink;
+
+      pango_font_get_glyph_extents (context->font, glyph, &ink, NULL);
 
-  extents->x_bearing = ink.x;
-  extents->y_bearing = ink.y;
-  extents->width     = ink.width;
-  extents->height    = ink.height;
+      extents->x_bearing = ink.x;
+      extents->y_bearing = ink.y;
+      extents->width     = ink.width;
+      extents->height    = ink.height;
+
+      return TRUE;
+    }
 
-  return TRUE;
+  return hb_font_get_glyph_extents (context->parent, glyph, extents);
 }
 
 static hb_font_t *
diff --git a/tests/fonts/README b/tests/fonts/README
index ca56ca40..5faba25d 100644
--- a/tests/fonts/README
+++ b/tests/fonts/README
@@ -8,3 +8,4 @@ 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
+noto-sans-cjk.ttf: subset of Noto Sans CJK
diff --git a/tests/fonts/noto-sans-cjk.ttf b/tests/fonts/noto-sans-cjk.ttf
new file mode 100644
index 00000000..7f636815
Binary files /dev/null and b/tests/fonts/noto-sans-cjk.ttf differ
diff --git a/tests/layouts/bratwurst.layout b/tests/layouts/bratwurst.layout
index 18a02eca..14979a1a 100644
--- a/tests/layouts/bratwurst.layout
+++ b/tests/layouts/bratwurst.layout
@@ -30,8 +30,8 @@
     "is-wrapped" : false,
     "is-ellipsized" : false,
     "unknown-glyphs" : 0,
-    "width" : 202752,
-    "height" : 202752,
+    "width" : 200704,
+    "height" : 200704,
     "log-attrs" : [
       {
         "char-break" : true,
@@ -137,7 +137,7 @@
               },
               {
                 "glyph" : 409,
-                "width" : 18432,
+                "width" : 17408,
                 "is-cluster-start" : true,
                 "log-cluster" : 1
               },
@@ -197,7 +197,7 @@
               },
               {
                 "glyph" : 409,
-                "width" : 18432,
+                "width" : 17408,
                 "is-cluster-start" : true,
                 "log-cluster" : 2
               },
diff --git a/tests/layouts/bratwurst2.layout b/tests/layouts/bratwurst2.layout
index 34d83ec8..311a2994 100644
--- a/tests/layouts/bratwurst2.layout
+++ b/tests/layouts/bratwurst2.layout
@@ -23,8 +23,8 @@
     "is-wrapped" : false,
     "is-ellipsized" : false,
     "unknown-glyphs" : 0,
-    "width" : 202752,
-    "height" : 202752,
+    "width" : 200704,
+    "height" : 200704,
     "log-attrs" : [
       {
         "char-break" : true,
@@ -130,7 +130,7 @@
               },
               {
                 "glyph" : 409,
-                "width" : 18432,
+                "width" : 17408,
                 "is-cluster-start" : true,
                 "log-cluster" : 1
               },
@@ -160,7 +160,7 @@
               },
               {
                 "glyph" : 409,
-                "width" : 18432,
+                "width" : 17408,
                 "is-cluster-start" : true,
                 "log-cluster" : 6
               },
diff --git a/tests/layouts/bratwurst3.layout b/tests/layouts/bratwurst3.layout
index 04914992..6ce03c16 100644
--- a/tests/layouts/bratwurst3.layout
+++ b/tests/layouts/bratwurst3.layout
@@ -131,7 +131,7 @@
               },
               {
                 "glyph" : 409,
-                "width" : 18432,
+                "width" : 17408,
                 "is-cluster-start" : true,
                 "log-cluster" : 1
               },
@@ -290,7 +290,7 @@
             "glyphs" : [
               {
                 "glyph" : 409,
-                "width" : 18432,
+                "width" : 17408,
                 "is-cluster-start" : true,
                 "log-cluster" : 0
               },
diff --git a/tests/layouts/bratwurst4.layout b/tests/layouts/bratwurst4.layout
index 7b63ab46..d3628c6c 100644
--- a/tests/layouts/bratwurst4.layout
+++ b/tests/layouts/bratwurst4.layout
@@ -23,8 +23,8 @@
     "is-wrapped" : true,
     "is-ellipsized" : false,
     "unknown-glyphs" : 0,
-    "width" : 115712,
-    "height" : 115712,
+    "width" : 114688,
+    "height" : 114688,
     "log-attrs" : [
       {
         "char-break" : true,
@@ -136,7 +136,7 @@
               },
               {
                 "glyph" : 409,
-                "width" : 18432,
+                "width" : 17408,
                 "is-cluster-start" : true,
                 "log-cluster" : 1
               },
@@ -215,7 +215,7 @@
               },
               {
                 "glyph" : 409,
-                "width" : 18432,
+                "width" : 17408,
                 "is-cluster-start" : true,
                 "log-cluster" : 2
               },
diff --git a/tests/layouts/effigy.layout b/tests/layouts/effigy.layout
index b5b67d85..2c621083 100644
--- a/tests/layouts/effigy.layout
+++ b/tests/layouts/effigy.layout
@@ -25,8 +25,8 @@
     "is-wrapped" : true,
     "is-ellipsized" : false,
     "unknown-glyphs" : 0,
-    "width" : 73728,
-    "height" : 73728,
+    "width" : 71680,
+    "height" : 71680,
     "log-attrs" : [
       {
         "char-break" : true,
@@ -114,13 +114,13 @@
               },
               {
                 "glyph" : 5041,
-                "width" : 30720,
+                "width" : 29696,
                 "is-cluster-start" : true,
                 "log-cluster" : 1
               },
               {
                 "glyph" : 2803,
-                "width" : 16384,
+                "width" : 15360,
                 "log-cluster" : 1
               }
             ]
diff --git a/tests/layouts/kebab.layout b/tests/layouts/kebab.layout
index a54b5c8b..fbf7e37e 100644
--- a/tests/layouts/kebab.layout
+++ b/tests/layouts/kebab.layout
@@ -163,7 +163,7 @@
               },
               {
                 "glyph" : 409,
-                "width" : 18432,
+                "width" : 17408,
                 "is-cluster-start" : true,
                 "log-cluster" : 5
               },
diff --git a/tests/layouts/tabs.layout b/tests/layouts/tabs.layout
index ee022a9b..ab70fab3 100644
--- a/tests/layouts/tabs.layout
+++ b/tests/layouts/tabs.layout
@@ -1481,7 +1481,7 @@
               },
               {
                 "glyph" : 967,
-                "width" : 11264,
+                "width" : 10240,
                 "is-cluster-start" : true,
                 "log-cluster" : 4
               }
@@ -1517,7 +1517,7 @@
             "glyphs" : [
               {
                 "glyph" : 268435455,
-                "width" : 55296,
+                "width" : 56320,
                 "is-cluster-start" : true,
                 "log-cluster" : 0
               }
diff --git a/tests/layouts/valid-10.layout b/tests/layouts/valid-10.layout
index bec277e7..df15efe0 100644
--- a/tests/layouts/valid-10.layout
+++ b/tests/layouts/valid-10.layout
@@ -270,13 +270,13 @@
               },
               {
                 "glyph" : 1331,
-                "width" : 9216,
+                "width" : 8192,
                 "is-cluster-start" : true,
                 "log-cluster" : 2
               },
               {
                 "glyph" : 1344,
-                "width" : 11264,
+                "width" : 10240,
                 "is-cluster-start" : true,
                 "log-cluster" : 0
               }
@@ -391,7 +391,7 @@
             "glyphs" : [
               {
                 "glyph" : 1062,
-                "width" : 17408,
+                "width" : 19456,
                 "is-cluster-start" : true,
                 "log-cluster" : 0
               }
diff --git a/tests/layouts/valid-14.layout b/tests/layouts/valid-14.layout
index 8cfa62d9..9bfd7723 100644
--- a/tests/layouts/valid-14.layout
+++ b/tests/layouts/valid-14.layout
@@ -235,7 +235,7 @@
               },
               {
                 "glyph" : 1058,
-                "width" : 4096,
+                "width" : 6144,
                 "log-cluster" : 0
               }
             ]
@@ -378,13 +378,13 @@
               },
               {
                 "glyph" : 1331,
-                "width" : 9216,
+                "width" : 8192,
                 "is-cluster-start" : true,
                 "log-cluster" : 2
               },
               {
                 "glyph" : 1344,
-                "width" : 11264,
+                "width" : 10240,
                 "is-cluster-start" : true,
                 "log-cluster" : 0
               }
diff --git a/tests/layouts/valid-19.layout b/tests/layouts/valid-19.layout
index 4f478f67..7456bc7e 100644
--- a/tests/layouts/valid-19.layout
+++ b/tests/layouts/valid-19.layout
@@ -22,8 +22,8 @@
     "is-wrapped" : false,
     "is-ellipsized" : false,
     "unknown-glyphs" : 0,
-    "width" : 167936,
-    "height" : 167936,
+    "width" : 166912,
+    "height" : 166912,
     "log-attrs" : [
       {
         "char-break" : true,
@@ -194,7 +194,7 @@
             "glyphs" : [
               {
                 "glyph" : 5867,
-                "width" : 16384,
+                "width" : 15360,
                 "is-cluster-start" : true,
                 "log-cluster" : 0
               },
diff --git a/tests/layouts/valid-20.layout b/tests/layouts/valid-20.layout
index 8217b28b..950be74b 100644
--- a/tests/layouts/valid-20.layout
+++ b/tests/layouts/valid-20.layout
@@ -40,8 +40,8 @@
     "is-wrapped" : false,
     "is-ellipsized" : false,
     "unknown-glyphs" : 0,
-    "width" : 79872,
-    "height" : 79872,
+    "width" : 67584,
+    "height" : 67584,
     "log-attrs" : [
       {
         "char-break" : true,
@@ -138,7 +138,7 @@
             "glyphs" : [
               {
                 "glyph" : 244,
-                "width" : 19456,
+                "width" : 15360,
                 "x-offset" : 14764,
                 "y-offset" : 3844,
                 "is-cluster-start" : true,
@@ -146,7 +146,7 @@
               },
               {
                 "glyph" : 272,
-                "width" : 19456,
+                "width" : 15360,
                 "x-offset" : 14764,
                 "y-offset" : 4280,
                 "is-cluster-start" : true,
@@ -154,7 +154,7 @@
               },
               {
                 "glyph" : 273,
-                "width" : 19456,
+                "width" : 15360,
                 "x-offset" : 14764,
                 "y-offset" : 3506,
                 "is-cluster-start" : true,
diff --git a/tests/layouts/valid-8.layout b/tests/layouts/valid-8.layout
index fdaeee93..3b2a88ae 100644
--- a/tests/layouts/valid-8.layout
+++ b/tests/layouts/valid-8.layout
@@ -25,8 +25,8 @@
     "is-wrapped" : false,
     "is-ellipsized" : false,
     "unknown-glyphs" : 0,
-    "width" : 134144,
-    "height" : 134144,
+    "width" : 132096,
+    "height" : 132096,
     "log-attrs" : [
       {
         "char-break" : true,
@@ -270,13 +270,13 @@
               },
               {
                 "glyph" : 1331,
-                "width" : 9216,
+                "width" : 8192,
                 "is-cluster-start" : true,
                 "log-cluster" : 2
               },
               {
                 "glyph" : 1344,
-                "width" : 11264,
+                "width" : 10240,
                 "is-cluster-start" : true,
                 "log-cluster" : 0
               }
diff --git a/tests/layouts/valid-9.layout b/tests/layouts/valid-9.layout
index 71a146ff..1b5b2a23 100644
--- a/tests/layouts/valid-9.layout
+++ b/tests/layouts/valid-9.layout
@@ -303,14 +303,14 @@
               },
               {
                 "glyph" : 1331,
-                "width" : 18104,
+                "width" : 17080,
                 "x-offset" : 4444,
                 "is-cluster-start" : true,
                 "log-cluster" : 2
               },
               {
                 "glyph" : 1344,
-                "width" : 20152,
+                "width" : 19128,
                 "x-offset" : 4444,
                 "is-cluster-start" : true,
                 "log-cluster" : 0
diff --git a/tests/layouts/vertical.layout b/tests/layouts/vertical.layout
new file mode 100644
index 00000000..ec9b93df
--- /dev/null
+++ b/tests/layouts/vertical.layout
@@ -0,0 +1,260 @@
+{
+  "context" : {
+    "font" : "serif 12",
+    "language" : "en-us",
+    "base-gravity" : "east",
+    "gravity-hint" : "strong",
+    "base-dir" : "ltr",
+    "round-glyph-positions" : true,
+    "transform" : [
+      -1.8369701987210297e-16,
+      -1,
+      1,
+      -1.8369701987210297e-16,
+      0,
+      0
+    ]
+  },
+  "text" : "ABC日本語ABC",
+  "font" : "Noto Sans CJK JP 24",
+  "wrap" : "word-char",
+  "output" : {
+    "is-wrapped" : false,
+    "is-ellipsized" : false,
+    "unknown-glyphs" : 0,
+    "width" : 294912,
+    "height" : 294912,
+    "log-attrs" : [
+      {
+        "char-break" : true,
+        "cursor-position" : true,
+        "word-start" : true,
+        "sentence-boundary" : true,
+        "sentence-start" : true,
+        "backspace-deletes-character" : true,
+        "word-boundary" : true
+      },
+      {
+        "char-break" : true,
+        "cursor-position" : true,
+        "break-inserts-hyphen" : true
+      },
+      {
+        "char-break" : true,
+        "cursor-position" : true,
+        "break-inserts-hyphen" : true
+      },
+      {
+        "line-break" : true,
+        "char-break" : true,
+        "cursor-position" : true,
+        "word-boundary" : true
+      },
+      {
+        "line-break" : true,
+        "char-break" : true,
+        "cursor-position" : true,
+        "backspace-deletes-character" : true,
+        "word-boundary" : true
+      },
+      {
+        "line-break" : true,
+        "char-break" : true,
+        "cursor-position" : true,
+        "backspace-deletes-character" : true,
+        "word-boundary" : true
+      },
+      {
+        "line-break" : true,
+        "char-break" : true,
+        "cursor-position" : true,
+        "backspace-deletes-character" : true,
+        "word-boundary" : true
+      },
+      {
+        "char-break" : true,
+        "cursor-position" : true,
+        "break-inserts-hyphen" : true
+      },
+      {
+        "char-break" : true,
+        "cursor-position" : true,
+        "break-inserts-hyphen" : true
+      },
+      {
+        "line-break" : true,
+        "mandatory-break" : true,
+        "char-break" : true,
+        "white" : true,
+        "cursor-position" : true,
+        "word-end" : true,
+        "sentence-boundary" : true,
+        "sentence-end" : true,
+        "word-boundary" : true
+      }
+    ],
+    "lines" : [
+      {
+        "start-index" : 0,
+        "length" : 15,
+        "paragraph-start" : true,
+        "direction" : "ltr",
+        "runs" : [
+          {
+            "offset" : 0,
+            "length" : 3,
+            "text" : "ABC",
+            "bidi-level" : 0,
+            "gravity" : "east",
+            "language" : "en-us",
+            "script" : "latin",
+            "font" : {
+              "description" : "Noto Sans CJK JP Rotated-Left 24",
+              "checksum" : "3b50ae56f1fb5637c82d785945531f718f40b78a26bea3d137e58808bd774399",
+              "matrix" : [
+                1,
+                -0,
+                -0,
+                1,
+                0,
+                0
+              ]
+            },
+            "flags" : 1,
+            "y-offset" : 0,
+            "start-x-offset" : 0,
+            "end-x-offset" : 0,
+            "glyphs" : [
+              {
+                "glyph" : 1,
+                "width" : 32768,
+                "x-offset" : 28835,
+                "y-offset" : 9945,
+                "is-cluster-start" : true,
+                "log-cluster" : 0
+              },
+              {
+                "glyph" : 2,
+                "width" : 32768,
+                "x-offset" : 28835,
+                "y-offset" : 10764,
+                "is-cluster-start" : true,
+                "log-cluster" : 1
+              },
+              {
+                "glyph" : 3,
+                "width" : 32768,
+                "x-offset" : 28835,
+                "y-offset" : 10452,
+                "is-cluster-start" : true,
+                "log-cluster" : 2
+              }
+            ]
+          },
+          {
+            "offset" : 3,
+            "length" : 9,
+            "text" : "日本語",
+            "bidi-level" : 0,
+            "gravity" : "east",
+            "language" : "xx",
+            "script" : "han",
+            "font" : {
+              "description" : "Noto Sans CJK JP Rotated-Left 24",
+              "checksum" : "3b50ae56f1fb5637c82d785945531f718f40b78a26bea3d137e58808bd774399",
+              "matrix" : [
+                1,
+                -0,
+                -0,
+                1,
+                0,
+                0
+              ]
+            },
+            "flags" : 1,
+            "y-offset" : 0,
+            "start-x-offset" : 0,
+            "end-x-offset" : 0,
+            "glyphs" : [
+              {
+                "glyph" : 4,
+                "width" : 32768,
+                "x-offset" : 28835,
+                "y-offset" : 16383,
+                "is-cluster-start" : true,
+                "log-cluster" : 0
+              },
+              {
+                "glyph" : 5,
+                "width" : 32768,
+                "x-offset" : 28835,
+                "y-offset" : 16383,
+                "is-cluster-start" : true,
+                "log-cluster" : 3
+              },
+              {
+                "glyph" : 7,
+                "width" : 32768,
+                "x-offset" : 28835,
+                "y-offset" : 16383,
+                "is-cluster-start" : true,
+                "log-cluster" : 6
+              }
+            ]
+          },
+          {
+            "offset" : 12,
+            "length" : 3,
+            "text" : "ABC",
+            "bidi-level" : 0,
+            "gravity" : "east",
+            "language" : "en-us",
+            "script" : "latin",
+            "font" : {
+              "description" : "Noto Sans CJK JP Rotated-Left 24",
+              "checksum" : "3b50ae56f1fb5637c82d785945531f718f40b78a26bea3d137e58808bd774399",
+              "matrix" : [
+                1,
+                -0,
+                -0,
+                1,
+                0,
+                0
+              ]
+            },
+            "flags" : 1,
+            "y-offset" : 0,
+            "start-x-offset" : 0,
+            "end-x-offset" : 0,
+            "glyphs" : [
+              {
+                "glyph" : 1,
+                "width" : 32768,
+                "x-offset" : 28835,
+                "y-offset" : 9945,
+                "is-cluster-start" : true,
+                "log-cluster" : 0
+              },
+              {
+                "glyph" : 2,
+                "width" : 32768,
+                "x-offset" : 28835,
+                "y-offset" : 10764,
+                "is-cluster-start" : true,
+                "log-cluster" : 1
+              },
+              {
+                "glyph" : 3,
+                "width" : 32768,
+                "x-offset" : 28835,
+                "y-offset" : 10452,
+                "is-cluster-start" : true,
+                "log-cluster" : 2
+              }
+            ]
+          }
+        ]
+      }
+    ]
+  }
+}


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