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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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,
_______________________________________________
HarfBuzz mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/harfbuzz

Reply via email to