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

Behdad Esfahbod behdad at kemper.freedesktop.org
Wed Nov 1 07:16:00 UTC 2017


 .circleci/config.yml             |    4 +++
 src/hb-open-file-private.hh      |   40 +++++++++++++------------------
 src/hb-open-type-private.hh      |   50 ++++++++++++++++++++++++++++++++-------
 src/hb-ot-font.cc                |    2 -
 src/hb-ot-shape-complex-indic.cc |    4 +--
 5 files changed, 66 insertions(+), 34 deletions(-)

New commits:
commit 65d4e5bcda543c17e09867418365ba44b441d5d6
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed Nov 1 01:15:27 2017 -0600

    [CircleCI] Ignore gh-pages branch
    
    https://github.com/behdad/harfbuzz/pull/592

diff --git a/.circleci/config.yml b/.circleci/config.yml
index 7135b853..d4835e44 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -1,4 +1,8 @@
 version: 2
+
+branches:
+  ignore:
+      - gh-pages
 jobs:
 
   base:
commit 92bb5086424d7454d666732e39117a7d32490646
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Oct 31 22:58:03 2017 -0600

    [indic] Use mutable for virama_glyph

diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 0cb326aa..f17a974d 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -508,7 +508,7 @@ struct indic_shape_plan_t
 
       /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph
        * during shape planning...  Instead, overwrite it here.  It's safe.  Don't worry! */
-      (const_cast<indic_shape_plan_t *> (this))->virama_glyph = glyph;
+      virama_glyph = glyph;
     }
 
     *pglyph = glyph;
@@ -518,7 +518,7 @@ struct indic_shape_plan_t
   const indic_config_t *config;
 
   bool is_old_spec;
-  hb_codepoint_t virama_glyph;
+  mutable hb_codepoint_t virama_glyph;
 
   would_substitute_feature_t rphf;
   would_substitute_feature_t pref;
commit 6c04dcb28dcafc7d97799c80c0bc714c76d51d1c
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Oct 31 20:11:00 2017 -0600

    Use bsearch() for large SFNT table directories

diff --git a/src/hb-open-file-private.hh b/src/hb-open-file-private.hh
index 77caddd2..a6d5a6b1 100644
--- a/src/hb-open-file-private.hh
+++ b/src/hb-open-file-private.hh
@@ -53,6 +53,9 @@ struct TTCHeader;
 
 typedef struct TableRecord
 {
+  int cmp (Tag t) const
+  { return t.cmp (tag); }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -100,18 +103,12 @@ typedef struct OffsetTable
   {
     Tag t;
     t.set (tag);
-    unsigned int count = tables.len;
-    /* TODO bsearch() */
-    for (unsigned int i = 0; i < count; i++)
-    {
-      if (t == tables.array[i].tag)
-      {
-        if (table_index) *table_index = i;
-        return true;
-      }
-    }
-    if (table_index) *table_index = Index::NOT_FOUND_INDEX;
-    return false;
+    /* Linear-search for small tables to work around fonts with unsorted
+     * table list. */
+    int i = tables.len < 64 ? tables.lsearch (t) : tables.bsearch (t);
+    if (table_index)
+      *table_index = i == -1 ? Index::NOT_FOUND_INDEX : (unsigned int) i;
+    return i != -1;
   }
   inline const TableRecord& get_table_by_tag (hb_tag_t tag) const
   {
commit b0e33da02d062200dd41e4503ecc21fb4bd636e6
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Oct 31 20:05:37 2017 -0600

    Add BinSearchArrayOf<>

diff --git a/src/hb-open-file-private.hh b/src/hb-open-file-private.hh
index dcfdfd6c..77caddd2 100644
--- a/src/hb-open-file-private.hh
+++ b/src/hb-open-file-private.hh
@@ -73,10 +73,9 @@ typedef struct OffsetTable
   friend struct OpenTypeFontFile;
 
   inline unsigned int get_table_count (void) const
-  { return numTables; }
+  { return tables.len; }
   inline const TableRecord& get_table (unsigned int i) const
   {
-    if (unlikely (i >= numTables)) return Null(TableRecord);
     return tables[i];
   }
   inline unsigned int get_table_tags (unsigned int start_offset,
@@ -85,26 +84,27 @@ typedef struct OffsetTable
   {
     if (table_count)
     {
-      if (start_offset >= numTables)
+      if (start_offset >= tables.len)
         *table_count = 0;
       else
-        *table_count = MIN (*table_count, numTables - start_offset);
+        *table_count = MIN (*table_count, tables.len - start_offset);
 
-      const TableRecord *sub_tables = tables + start_offset;
+      const TableRecord *sub_tables = tables.array + start_offset;
       unsigned int count = *table_count;
       for (unsigned int i = 0; i < count; i++)
 	table_tags[i] = sub_tables[i].tag;
     }
-    return numTables;
+    return tables.len;
   }
   inline bool find_table_index (hb_tag_t tag, unsigned int *table_index) const
   {
     Tag t;
     t.set (tag);
-    unsigned int count = numTables;
+    unsigned int count = tables.len;
+    /* TODO bsearch() */
     for (unsigned int i = 0; i < count; i++)
     {
-      if (t == tables[i].tag)
+      if (t == tables.array[i].tag)
       {
         if (table_index) *table_index = i;
         return true;
@@ -124,16 +124,13 @@ typedef struct OffsetTable
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && c->check_array (tables, TableRecord::static_size, numTables));
+    return_trace (c->check_struct (this) && tables.sanitize (c));
   }
 
   protected:
   Tag		sfnt_version;	/* '\0\001\0\00' if TrueType / 'OTTO' if CFF */
-  USHORT	numTables;	/* Number of tables. */
-  USHORT	searchRangeZ;	/* (Maximum power of 2 <= numTables) x 16 */
-  USHORT	entrySelectorZ;	/* Log2(maximum power of 2 <= numTables). */
-  USHORT	rangeShiftZ;	/* NumTables x 16-searchRange. */
-  TableRecord	tables[VAR];	/* TableRecord entries. numTables items */
+  BinSearchArrayOf<TableRecord>
+		tables;
   public:
   DEFINE_SIZE_ARRAY (12, tables);
 } OpenTypeFontFace;
diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index e41e7451..90db791e 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -1045,7 +1045,9 @@ struct HeadlessArrayOf
 };
 
 
-/* An array with sorted elements.  Supports binary searching. */
+/*
+ * An array with sorted elements.  Supports binary searching.
+ */
 template <typename Type, typename LenType=USHORT>
 struct SortedArrayOf : ArrayOf<Type, LenType>
 {
@@ -1070,6 +1072,35 @@ struct SortedArrayOf : ArrayOf<Type, LenType>
   }
 };
 
+/*
+ * Binary-search arrays
+ */
+
+struct BinSearchHeader
+{
+  inline operator uint32_t (void) const { return len; }
+
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this));
+  }
+
+  protected:
+  USHORT	len;
+  USHORT	searchRangeZ;
+  USHORT	entrySelectorZ;
+  USHORT	rangeShiftZ;
+
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
+template <typename Type>
+struct BinSearchArrayOf : SortedArrayOf<Type, BinSearchHeader>
+{
+};
+
 
 /* Lazy struct and blob loaders. */
 
diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc
index 5759a30d..38f61493 100644
--- a/src/hb-ot-font.cc
+++ b/src/hb-ot-font.cc
@@ -37,8 +37,8 @@
 #include "hb-ot-hhea-table.hh"
 #include "hb-ot-hmtx-table.hh"
 #include "hb-ot-os2-table.hh"
-#include "hb-ot-var-hvar-table.hh"
 #include "hb-ot-post-table.hh"
+#include "hb-ot-var-hvar-table.hh"
 
 
 struct hb_ot_face_metrics_accelerator_t
commit aca378f51ecf682ea1454071f671bbc7eef808bd
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Oct 31 18:11:10 2017 -0600

    Sanitize (Headless)ArrayOf()::len to ensure it doesn't use offsets

diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index 7a62dcb8..e41e7451 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -946,7 +946,7 @@ struct ArrayOf
   inline bool sanitize_shallow (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) && c->check_array (array, Type::static_size, len));
+    return_trace (len.sanitize (c) && c->check_array (array, Type::static_size, len));
   }
 
   public:
@@ -1033,7 +1033,7 @@ struct HeadlessArrayOf
   inline bool sanitize_shallow (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
-    return_trace (c->check_struct (this) &&
+    return_trace (len.sanitize (c) &&
 		  (!len || c->check_array (array, Type::static_size, len - 1)));
   }
 
commit 5f047113142349ecf0dd6d00384f7ef7b3d1a85e
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Tue Oct 31 18:10:40 2017 -0600

    Fix HeadlessArrayOf::sanitize_shallow()

diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index a49071d2..7a62dcb8 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -1012,12 +1012,6 @@ struct HeadlessArrayOf
     return_trace (true);
   }
 
-  inline bool sanitize_shallow (hb_sanitize_context_t *c) const
-  {
-    return c->check_struct (this)
-	&& c->check_array (this, Type::static_size, len);
-  }
-
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -1035,6 +1029,15 @@ struct HeadlessArrayOf
     return_trace (true);
   }
 
+  private:
+  inline bool sanitize_shallow (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (c->check_struct (this) &&
+		  (!len || c->check_array (array, Type::static_size, len - 1)));
+  }
+
+  public:
   LenType len;
   Type array[VAR];
   public:


More information about the HarfBuzz mailing list