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

Behdad Esfahbod behdad at kemper.freedesktop.org
Wed Nov 28 20:06:28 UTC 2018


 src/hb-aat-layout-common.hh     |   44 ++++++++++++++++++++--------------------
 src/hb-aat-layout-kerx-table.hh |   18 +++++++---------
 2 files changed, 31 insertions(+), 31 deletions(-)

New commits:
commit a3267cf803082af157a7f2b0026af2633b14f8e3
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed Nov 28 15:06:01 2018 -0500

    [kern] Fix kern table Format2 offsetToIndex
    
    Fixes https://github.com/harfbuzz/harfbuzz/issues/1421

diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh
index 48526edf..abd577b9 100644
--- a/src/hb-aat-layout-kerx-table.hh
+++ b/src/hb-aat-layout-kerx-table.hh
@@ -392,9 +392,13 @@ struct KerxSubTableFormat2
     unsigned int num_glyphs = c->sanitizer.get_num_glyphs ();
     unsigned int l = (this+leftClassTable).get_class (left, num_glyphs, 0);
     unsigned int r = (this+rightClassTable).get_class (right, num_glyphs, 0);
-    unsigned int offset = l + r;
-    const FWORD *v = &StructAtOffset<FWORD> (&(this+array), offset);
+
+    const UnsizedArrayOf<FWORD> &arrayZ = this+array;
+    unsigned int kern_idx = l + r;
+    kern_idx = Types::offsetToIndex (kern_idx, this, &arrayZ);
+    const FWORD *v = &arrayZ[kern_idx];
     if (unlikely (!v->sanitize (&c->sanitizer))) return 0;
+
     return kerxTupleKern (*v, header.tuple_count (), this, c);
   }
 
commit f9a9c0fd1e561715d696c7bd840bab552d0718ee
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed Nov 28 14:51:56 2018 -0500

    [kerx] Fix ClassTable implementation for 'kern' table Format 2

diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh
index 94885216..253b56fe 100644
--- a/src/hb-aat-layout-common.hh
+++ b/src/hb-aat-layout-common.hh
@@ -488,7 +488,7 @@ struct StateTable
 {
   typedef typename Types::HBUINT HBUINT;
   typedef typename Types::HBUSHORT HBUSHORT;
-  typedef typename Types::ClassType ClassType;
+  typedef typename Types::ClassTypeNarrow ClassType;
 
   enum State
   {
@@ -678,7 +678,8 @@ struct ObsoleteTypes
   static const bool extended = false;
   typedef HBUINT16 HBUINT;
   typedef HBUINT8 HBUSHORT;
-  typedef ClassTable<HBUINT8> ClassType;
+  typedef ClassTable<HBUINT8> ClassTypeNarrow;
+  typedef ClassTable<HBUINT16> ClassTypeWide;
 
   template <typename T>
   static inline unsigned int offsetToIndex (unsigned int offset,
@@ -700,7 +701,8 @@ struct ExtendedTypes
   static const bool extended = true;
   typedef HBUINT32 HBUINT;
   typedef HBUINT16 HBUSHORT;
-  typedef Lookup<HBUINT16> ClassType;
+  typedef Lookup<HBUINT16> ClassTypeNarrow;
+  typedef Lookup<HBUINT16> ClassTypeWide;
 
   template <typename T>
   static inline unsigned int offsetToIndex (unsigned int offset,
diff --git a/src/hb-aat-layout-kerx-table.hh b/src/hb-aat-layout-kerx-table.hh
index 8dc74991..48526edf 100644
--- a/src/hb-aat-layout-kerx-table.hh
+++ b/src/hb-aat-layout-kerx-table.hh
@@ -437,19 +437,13 @@ struct KerxSubTableFormat2
 			  c->check_range (this, array)));
   }
 
-  /* Note:
-   * OT kern table specifies ClassTable as having 16-bit entries, whereas
-   * AAT kern table specifies them as having 8bit entries.
-   * I've not seen any fonts with this format in kern table.
-   * We follow AAT. */
-
   protected:
   KernSubTableHeader	header;
   HBUINT		rowWidth;	/* The width, in bytes, of a row in the table. */
-  OffsetTo<typename Types::ClassType, HBUINT, false>
+  OffsetTo<typename Types::ClassTypeWide, HBUINT, false>
 			leftClassTable;	/* Offset from beginning of this subtable to
 					 * left-hand class table. */
-  OffsetTo<typename Types::ClassType, HBUINT, false>
+  OffsetTo<typename Types::ClassTypeWide, HBUINT, false>
 			rightClassTable;/* Offset from beginning of this subtable to
 					 * right-hand class table. */
   OffsetTo<UnsizedArrayOf<FWORD>, HBUINT, false>
commit 5b4a789ca857664668ff69936574dcd09bee6065
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed Nov 28 14:46:26 2018 -0500

    [aat] Towards adding two ClassTable's

diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh
index 3ee96bc9..94885216 100644
--- a/src/hb-aat-layout-common.hh
+++ b/src/hb-aat-layout-common.hh
@@ -363,6 +363,14 @@ struct Lookup
     }
   }
 
+  inline typename T::type get_class (hb_codepoint_t glyph_id,
+				     unsigned int num_glyphs,
+				     unsigned int outOfRange) const
+  {
+    const T *v = get_value (glyph_id, num_glyphs);
+    return v ? *v : outOfRange;
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -638,6 +646,7 @@ struct StateTable
   DEFINE_SIZE_STATIC (4 * sizeof (HBUINT));
 };
 
+template <typename HBUCHAR>
 struct ClassTable
 {
   inline unsigned int get_class (hb_codepoint_t glyph_id, unsigned int outOfRange) const
@@ -645,6 +654,12 @@ struct ClassTable
     unsigned int i = glyph_id - firstGlyph;
     return i >= classArray.len ? outOfRange : classArray.arrayZ[i];
   }
+  inline unsigned int get_class (hb_codepoint_t glyph_id,
+				 unsigned int num_glyphs HB_UNUSED,
+				 unsigned int outOfRange) const
+  {
+    return get_class (glyph_id, outOfRange);
+  }
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -652,7 +667,7 @@ struct ClassTable
   }
   protected:
   GlyphID		firstGlyph;	/* First glyph index included in the trimmed array. */
-  ArrayOf<HBUINT8>	classArray;	/* The class codes (indexed by glyph index minus
+  ArrayOf<HBUCHAR>	classArray;	/* The class codes (indexed by glyph index minus
 					 * firstGlyph). */
   public:
   DEFINE_SIZE_ARRAY (4, classArray);
@@ -663,15 +678,8 @@ struct ObsoleteTypes
   static const bool extended = false;
   typedef HBUINT16 HBUINT;
   typedef HBUINT8 HBUSHORT;
-  struct ClassType : ClassTable
-  {
-    inline unsigned int get_class (hb_codepoint_t glyph_id,
-				   unsigned int num_glyphs HB_UNUSED,
-				   unsigned int outOfRange) const
-    {
-      return ClassTable::get_class (glyph_id, outOfRange);
-    }
-  };
+  typedef ClassTable<HBUINT8> ClassType;
+
   template <typename T>
   static inline unsigned int offsetToIndex (unsigned int offset,
 					    const void *base,
@@ -692,16 +700,8 @@ struct ExtendedTypes
   static const bool extended = true;
   typedef HBUINT32 HBUINT;
   typedef HBUINT16 HBUSHORT;
-  struct ClassType : Lookup<HBUINT16>
-  {
-    inline unsigned int get_class (hb_codepoint_t glyph_id,
-				   unsigned int num_glyphs,
-				   unsigned int outOfRange) const
-    {
-      const HBUINT16 *v = get_value (glyph_id, num_glyphs);
-      return v ? *v : outOfRange;
-    }
-  };
+  typedef Lookup<HBUINT16> ClassType;
+
   template <typename T>
   static inline unsigned int offsetToIndex (unsigned int offset,
 					    const void *base,


More information about the HarfBuzz mailing list