[HarfBuzz] harfbuzz: Branch 'master' - 2 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Mon Nov 6 20:06:36 UTC 2017


 src/hb-open-type-private.hh                                             |    4 
 src/hb-ot-kern-table.hh                                                 |   69 +++++-----
 src/hb-ot-shape-complex-arabic.cc                                       |    1 
 test/shaping/Makefile.am                                                |    1 
 test/shaping/fonts/sha1sum/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf |binary
 test/shaping/tests/arabic-stch.tests                                    |    1 
 6 files changed, 45 insertions(+), 31 deletions(-)

New commits:
commit 625ae08fcee747fbdc33a3a6865fb3aa425662ca
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Sat Nov 4 12:01:11 2017 -0400

    [kern] Towards implementing format-2

diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index b3169c04..2687ba66 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -1078,9 +1078,7 @@ struct BinSearchHeader
 };
 
 template <typename Type>
-struct BinSearchArrayOf : SortedArrayOf<Type, BinSearchHeader>
-{
-};
+struct BinSearchArrayOf : SortedArrayOf<Type, BinSearchHeader> {};
 
 
 /* Lazy struct and blob loaders. */
diff --git a/src/hb-ot-kern-table.hh b/src/hb-ot-kern-table.hh
index 2cab5cc9..2d355914 100644
--- a/src/hb-ot-kern-table.hh
+++ b/src/hb-ot-kern-table.hh
@@ -81,9 +81,6 @@ struct KernSubTableFormat0
     return pairs[i].get_kerning ();
   }
 
-  inline unsigned int get_size (void) const
-  { return pairs.get_size (); }
-
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -96,46 +93,63 @@ struct KernSubTableFormat0
   DEFINE_SIZE_ARRAY (8, pairs);
 };
 
-struct KernSubTableFormat2
+struct KernClassTable
 {
-  inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
+  inline unsigned int get_class (hb_codepoint_t g) const { return classes[g - firstGlyph]; }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
   {
-    /* XXX */
-    return 0;
+    TRACE_SANITIZE (this);
+    return_trace (firstGlyph.sanitize (c) && classes.sanitize (c));
   }
 
-  inline unsigned int get_size (void) const
+  protected:
+  USHORT		firstGlyph;	/* First glyph in class range. */
+  ArrayOf<USHORT>	classes;	/* Glyph classes. */
+  public:
+  DEFINE_SIZE_ARRAY (4, classes);
+};
+
+struct KernSubTableFormat2
+{
+  inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, unsigned int length) const
   {
-    /* XXX */
-    return 0;
+    unsigned int l = (this+leftClassTable).get_class (left);
+    unsigned int r = (this+leftClassTable).get_class (left);
+    return 0;//(&(this+array))[0/*XXX*/];
   }
 
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-
-    /* XXX */
-
-    return_trace (true);
+    return_trace (rowWidth.sanitize (c) &&
+		  leftClassTable.sanitize (c, this) &&
+		  rightClassTable.sanitize (c, this) &&
+		  array.sanitize (c, this));
   }
+
+  protected:
+  USHORT	rowWidth;	/* The width, in bytes, of a row in the table. */
+  OffsetTo<KernClassTable>
+		leftClassTable;	/* Offset from beginning of this subtable to
+				 * left-hand class table. */
+  OffsetTo<KernClassTable>
+		rightClassTable;/* Offset from beginning of this subtable to
+				 * right-hand class table. */
+  OffsetTo<FWORD>
+		array;		/* Offset from beginning of this subtable to
+				 * the start of the kerning array. */
+  public:
+  DEFINE_SIZE_MIN (8);
 };
 
 struct KernSubTable
 {
-  inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, unsigned int format) const
+  inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right, unsigned int length, unsigned int format) const
   {
     switch (format) {
     case 0: return u.format0.get_kerning (left, right);
-    case 2: return u.format2.get_kerning (left, right);
-    default:return 0;
-    }
-  }
-
-  inline unsigned int get_size (unsigned int format) const
-  {
-    switch (format) {
-    case 0: return u.format0.get_size ();
-    case 2: return u.format2.get_size ();
+    case 2: return u.format2.get_kerning (left, right, length);
     default:return 0;
     }
   }
@@ -173,7 +187,7 @@ struct KernSubTableWrapper
   { return bool (thiz()->coverage & T::COVERAGE_OVERRIDE_FLAG); }
 
   inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
-  { return thiz()->subtable.get_kerning (left, right, thiz()->format); }
+  { return thiz()->subtable.get_kerning (left, right, thiz()->length - thiz()->min_size, thiz()->format); }
 
   inline int get_h_kerning (hb_codepoint_t left, hb_codepoint_t right) const
   { return is_horizontal () ? get_kerning (left, right) : 0; }
@@ -186,8 +200,7 @@ struct KernSubTableWrapper
     return_trace (c->check_struct (thiz()) &&
 		  thiz()->length >= thiz()->min_size &&
 		  c->check_array (thiz(), 1, thiz()->length) &&
-		  thiz()->subtable.sanitize (c, thiz()->format) &&
-		  thiz()->subtable.get_size (thiz()-> format) <= thiz()->length - thiz()->min_size);
+		  thiz()->subtable.sanitize (c, thiz()->format));
   }
 };
 
commit 74e82adaea08ced18493e3341823dbd5b6cd493e
Author: David Corbett <corbett.dav at husky.neu.edu>
Date:   Mon Nov 6 14:41:55 2017 -0500

    Mark glyphs involved in 'stch' as unsafe to break

diff --git a/src/hb-ot-shape-complex-arabic.cc b/src/hb-ot-shape-complex-arabic.cc
index 283f325b..eda20ca1 100644
--- a/src/hb-ot-shape-complex-arabic.cc
+++ b/src/hb-ot-shape-complex-arabic.cc
@@ -560,6 +560,7 @@ apply_stch (const hb_ot_shape_plan_t *plan,
       }
       else
       {
+	buffer->unsafe_to_break (context, end + 1);
 	hb_position_t x_offset = 0;
 	for (unsigned int k = end; k > start; k--)
 	{
diff --git a/test/shaping/Makefile.am b/test/shaping/Makefile.am
index 377c08d0..ca7c1c30 100644
--- a/test/shaping/Makefile.am
+++ b/test/shaping/Makefile.am
@@ -45,6 +45,7 @@ TESTS = \
 	tests/arabic-feature-order.tests \
 	tests/arabic-like-joining.tests \
 	tests/arabic-mark-order.tests \
+	tests/arabic-stch.tests \
 	tests/automatic-fractions.tests \
 	tests/cluster.tests \
 	tests/color-fonts.tests \
diff --git a/test/shaping/fonts/sha1sum/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf b/test/shaping/fonts/sha1sum/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf
new file mode 100644
index 00000000..112146eb
Binary files /dev/null and b/test/shaping/fonts/sha1sum/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf differ
diff --git a/test/shaping/tests/arabic-stch.tests b/test/shaping/tests/arabic-stch.tests
new file mode 100644
index 00000000..a268d8a7
--- /dev/null
+++ b/test/shaping/tests/arabic-stch.tests
@@ -0,0 +1 @@
+fonts/sha1sum/d9b8bc10985f24796826c29f7ccba3d0ae11ec02.ttf:--no-glyph-names --show-flags:U+0718,U+070F,U+0718,U+0718,U+002E:[1=4+168|3=3+502#1|3=2+502#1|4=1 at -1004,0+0#1|5=1 at -876,0+0#1|5=1 at -799,0+0#1|5=1 at -722,0+0#1|5=1 at -645,0+0#1|4=1 at -566,0+0#1|5=1 at -438,0+0#1|5=1 at -361,0+0#1|5=1 at -284,0+0#1|5=1 at -207,0+0#1|4=1 at -128,0+0#1|3=0+502]


More information about the HarfBuzz mailing list