[HarfBuzz] harfbuzz-ng: Branch 'master' - 5 commits

Behdad Esfahbod behdad at kemper.freedesktop.org
Wed Jul 7 21:42:16 PDT 2010


 src/Makefile.am                    |    4 -
 src/check-header-guards.sh         |   20 +++++
 src/check-libstdc++.sh             |    1 
 src/hb-buffer-private.hh           |    6 -
 src/hb-font-private.hh             |    6 -
 src/hb-object-private.h            |    6 -
 src/hb-open-file-private.hh        |    1 
 src/hb-open-type-private.hh        |   53 +++++++++++++
 src/hb-ot-layout-common-private.hh |  145 +++++++++++++------------------------
 src/hb-ot-layout-private.hh        |    6 -
 src/hb-ot-shape.h                  |    2 
 11 files changed, 138 insertions(+), 112 deletions(-)

New commits:
commit cc8a4abea68f2dba26feb5785f9e518e6853c744
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Thu Jul 8 00:40:04 2010 -0400

    Use bsearch where applicable

diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index 59c7866..9cc0518 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -394,6 +394,7 @@ struct IntType
   inline operator Type(void) const { return v; }
   inline bool operator == (const IntType<Type> &o) const { return v == o.v; }
   inline bool operator != (const IntType<Type> &o) const { return v != o.v; }
+  inline int cmp (Type b) const { Type a = v; return b < a ? -1 : b == a ? 0 : +1; }
   inline bool sanitize (hb_sanitize_context_t *c) {
     TRACE_SANITIZE ();
     return likely (c->check_struct (this));
@@ -707,4 +708,52 @@ struct HeadlessArrayOf
 };
 
 
+/* An array with sorted elements.  Supports binary searching. */
+template <typename Type>
+struct SortedArrayOf : ArrayOf<Type> {
+
+  template <typename SearchType>
+  inline int search (const SearchType &x) const {
+    class Cmp {
+      public: static int cmp (const void *p1, const void *p2) {
+	const SearchType *a = (const SearchType *) p1;
+	const Type *b = (const Type *) p2;
+	return b->cmp (*a);
+      }
+    };
+    const Type *p = (const Type *) bsearch (&x, this->array, this->len, sizeof (this->array[0]), Cmp::cmp);
+    return p ? p - this->array : -1;
+  }
+
+  inline bool sanitize_order (hb_sanitize_context_t *c) {
+    /* Make sure the list is sorted, since we bsearch in it. */
+    unsigned int count = this->len;
+    for (unsigned int i = 1; i < count; i++)
+      if (unlikely (this->array[i].cmp (this->array[i-1]) > 0)) {
+	/* We need to sort the entries. */
+	if (!c->can_edit (this, this->get_size ())) return false;
+	class Cmp {
+	  public: static int cmp (const void *p1, const void *p2) {
+	    const Type *a = (const Type *) p1;
+	    const Type *b = (const Type *) p2;
+	    return b->cmp (*a);
+	  }
+	};
+	qsort (this->array, this->len, sizeof (this->array[0]), Cmp::cmp);
+      }
+    return true;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) {
+    TRACE_SANITIZE ();
+    return ArrayOf<Type>::sanitize (c) && sanitize_order (c);
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c, void *base) {
+    TRACE_SANITIZE ();
+    return ArrayOf<Type>::sanitize (c, base) && sanitize_order (c);
+  }
+};
+
+
 #endif /* HB_OPEN_TYPE_PRIVATE_HH */
diff --git a/src/hb-ot-layout-common-private.hh b/src/hb-ot-layout-common-private.hh
index f965491..5954499 100644
--- a/src/hb-ot-layout-common-private.hh
+++ b/src/hb-ot-layout-common-private.hh
@@ -51,6 +51,14 @@
 template <typename Type>
 struct Record
 {
+  inline int cmp (const Record &other) const {
+    return cmp (other.tag);
+  }
+  inline int cmp (hb_tag_t b) const {
+    hb_tag_t a = tag;
+    return b < a ? -1 : b == a ? 0 : -1;
+  }
+
   inline bool sanitize (hb_sanitize_context_t *c, void *base) {
     TRACE_SANITIZE ();
     return c->check_struct (this)
@@ -66,7 +74,7 @@ struct Record
 };
 
 template <typename Type>
-struct RecordArrayOf : ArrayOf<Record<Type> > {
+struct RecordArrayOf : SortedArrayOf<Record<Type> > {
   inline const Tag& get_tag (unsigned int i) const
   {
     if (unlikely (i >= this->len)) return Null(Tag);
@@ -86,21 +94,14 @@ struct RecordArrayOf : ArrayOf<Record<Type> > {
   }
   inline bool find_index (hb_tag_t tag, unsigned int *index) const
   {
-    Tag t;
-    t.set (tag);
-    /* TODO: bsearch (need to sort in sanitize) */
-    const Record<Type> *a = this->array;
-    unsigned int count = this->len;
-    for (unsigned int i = 0; i < count; i++)
-    {
-      if (t == a[i].tag)
-      {
+    int i = this->search (tag);
+    if (i != -1) {
         if (index) *index = i;
         return true;
-      }
+    } else {
+      if (index) *index = Index::NOT_FOUND_INDEX;
+      return false;
     }
-    if (index) *index = Index::NOT_FOUND_INDEX;
-    return false;
   }
 };
 
@@ -117,6 +118,31 @@ struct RecordListOf : RecordArrayOf<Type>
 };
 
 
+struct RangeRecord
+{
+  inline int cmp (const RangeRecord &other) const {
+    hb_codepoint_t a = start, b = other.start;
+    return b < a ? -1 : b == a ? 0 : +1;
+  }
+  inline int cmp (hb_codepoint_t g) const {
+    hb_codepoint_t a = start, b = end;
+    return g < a ? -1 : g <= b ? 0 : +1 ;
+  }
+
+  inline bool sanitize (hb_sanitize_context_t *c) {
+    TRACE_SANITIZE ();
+    return c->check_struct (this);
+  }
+
+  GlyphID	start;		/* First GlyphID in the range */
+  GlyphID	end;		/* Last GlyphID in the range */
+  USHORT	value;		/* Value */
+  public:
+  DEFINE_SIZE_STATIC (6);
+};
+DEFINE_NULL_DATA (RangeRecord, "\000\001");
+
+
 struct IndexArray : ArrayOf<Index>
 {
   inline unsigned int get_indexes (unsigned int start_offset,
@@ -318,14 +344,8 @@ struct CoverageFormat1
   private:
   inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
   {
-    if (unlikely (glyph_id > 0xFFFF))
-      return NOT_COVERED;
-    GlyphID gid;
-    gid.set (glyph_id);
-    /* TODO: bsearch (need to sort in sanitize) */
-    unsigned int num_glyphs = glyphArray.len;
-    for (unsigned int i = 0; i < num_glyphs; i++)
-      if (gid == glyphArray[i])
+    int i = glyphArray.search (glyph_id);
+    if (i != -1)
         return i;
     return NOT_COVERED;
   }
@@ -337,40 +357,12 @@ struct CoverageFormat1
 
   private:
   USHORT	coverageFormat;	/* Format identifier--format = 1 */
-  ArrayOf<GlyphID>
+  SortedArrayOf<GlyphID>
 		glyphArray;	/* Array of GlyphIDs--in numerical order */
   public:
   DEFINE_SIZE_ARRAY (4, glyphArray);
 };
 
-struct CoverageRangeRecord
-{
-  friend struct CoverageFormat2;
-
-  private:
-  inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
-  {
-    if (glyph_id >= start && glyph_id <= end)
-      return (unsigned int) startCoverageIndex + (glyph_id - start);
-    return NOT_COVERED;
-  }
-
-  public:
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE ();
-    return c->check_struct (this);
-  }
-
-  private:
-  GlyphID	start;			/* First GlyphID in the range */
-  GlyphID	end;			/* Last GlyphID in the range */
-  USHORT	startCoverageIndex;	/* Coverage Index of first GlyphID in
-					 * range */
-  public:
-  DEFINE_SIZE_STATIC (6);
-};
-DEFINE_NULL_DATA (CoverageRangeRecord, "\000\001");
-
 struct CoverageFormat2
 {
   friend struct Coverage;
@@ -378,13 +370,10 @@ struct CoverageFormat2
   private:
   inline unsigned int get_coverage (hb_codepoint_t glyph_id) const
   {
-    /* TODO: bsearch (need to sort in sanitize) */
-    unsigned int count = rangeRecord.len;
-    for (unsigned int i = 0; i < count; i++)
-    {
-      unsigned int coverage = rangeRecord[i].get_coverage (glyph_id);
-      if (coverage != NOT_COVERED)
-        return coverage;
+    int i = rangeRecord.search (glyph_id);
+    if (i != -1) {
+      const RangeRecord &range = rangeRecord[i];
+      return (unsigned int) range.value + (glyph_id - range.start);
     }
     return NOT_COVERED;
   }
@@ -396,7 +385,7 @@ struct CoverageFormat2
 
   private:
   USHORT	coverageFormat;	/* Format identifier--format = 2 */
-  ArrayOf<CoverageRangeRecord>
+  SortedArrayOf<RangeRecord>
 		rangeRecord;	/* Array of glyph ranges--ordered by
 				 * Start GlyphID. rangeCount entries
 				 * long */
@@ -468,33 +457,6 @@ struct ClassDefFormat1
   DEFINE_SIZE_ARRAY (6, classValue);
 };
 
-struct ClassRangeRecord
-{
-  friend struct ClassDefFormat2;
-
-  private:
-  inline hb_ot_layout_class_t get_class (hb_codepoint_t glyph_id) const
-  {
-    if (glyph_id >= start && glyph_id <= end)
-      return classValue;
-    return 0;
-  }
-
-  public:
-  inline bool sanitize (hb_sanitize_context_t *c) {
-    TRACE_SANITIZE ();
-    return c->check_struct (this);
-  }
-
-  private:
-  GlyphID	start;		/* First GlyphID in the range */
-  GlyphID	end;		/* Last GlyphID in the range */
-  USHORT	classValue;	/* Applied to all glyphs in the range */
-  public:
-  DEFINE_SIZE_STATIC (6);
-};
-DEFINE_NULL_DATA (ClassRangeRecord, "\000\001");
-
 struct ClassDefFormat2
 {
   friend struct ClassDef;
@@ -502,14 +464,9 @@ struct ClassDefFormat2
   private:
   inline hb_ot_layout_class_t get_class (hb_codepoint_t glyph_id) const
   {
-    /* TODO: bsearch (need to sort in sanitize) */
-    unsigned int count = rangeRecord.len;
-    for (unsigned int i = 0; i < count; i++)
-    {
-      int classValue = rangeRecord[i].get_class (glyph_id);
-      if (classValue > 0)
-        return classValue;
-    }
+    int i = rangeRecord.search (glyph_id);
+    if (i != -1)
+      return rangeRecord[i].value;
     return 0;
   }
 
@@ -519,7 +476,7 @@ struct ClassDefFormat2
   }
 
   USHORT	classFormat;	/* Format identifier--format = 2 */
-  ArrayOf<ClassRangeRecord>
+  SortedArrayOf<RangeRecord>
 		rangeRecord;	/* Array of glyph ranges--ordered by
 				 * Start GlyphID */
   public:
commit 2f418f5709b2b8b3ef2f6056b9d8c13b66f0b74a
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed Jul 7 22:07:40 2010 -0400

    Remove useless TODO

diff --git a/src/hb-open-file-private.hh b/src/hb-open-file-private.hh
index 905f50f..9570b0f 100644
--- a/src/hb-open-file-private.hh
+++ b/src/hb-open-file-private.hh
@@ -77,7 +77,6 @@ typedef struct OffsetTable
   {
     Tag t;
     t.set (tag);
-    /* TODO: bsearch (need to sort in sanitize) */
     unsigned int count = numTables;
     for (unsigned int i = 0; i < count; i++)
     {
commit da8edbb62204dc39f93d500ef85929e234e0bd19
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed Jun 9 07:15:39 2010 -0400

    Fix header

diff --git a/src/hb-buffer-private.hh b/src/hb-buffer-private.hh
index 0232dc3..cfc781c 100644
--- a/src/hb-buffer-private.hh
+++ b/src/hb-buffer-private.hh
@@ -25,8 +25,8 @@
  * Red Hat Author(s): Owen Taylor, Behdad Esfahbod
  */
 
-#ifndef HB_BUFFER_PRIVATE_H
-#define HB_BUFFER_PRIVATE_H
+#ifndef HB_BUFFER_PRIVATE_HH
+#define HB_BUFFER_PRIVATE_HH
 
 #include "hb-private.h"
 #include "hb-buffer.h"
@@ -170,4 +170,4 @@ struct _hb_buffer_t {
 
 HB_END_DECLS
 
-#endif /* HB_BUFFER_PRIVATE_H */
+#endif /* HB_BUFFER_PRIVATE_HH */
commit d05d13df02fbe76814694fe49cc01bbb41c3d0e7
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed Jun 9 07:15:03 2010 -0400

    Add a test for header preprocessor guards

diff --git a/src/Makefile.am b/src/Makefile.am
index 810083a..ace7686 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -113,7 +113,9 @@ main_CPPFLAGS = $(HBCFLAGS)
 main_LDADD = libharfbuzz.la $(HBLIBS)
 
 TESTS = \
-	check-internal-symbols.sh
+	check-header-guards.sh \
+	check-internal-symbols.sh \
+	$(NULL)
 
 if HAVE_ICU
 else
diff --git a/src/check-header-guards.sh b/src/check-header-guards.sh
new file mode 100755
index 0000000..b84fd68
--- /dev/null
+++ b/src/check-header-guards.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+LC_ALL=C
+export LC_ALL
+
+test -z "$srcdir" && srcdir=.
+stat=0
+
+cd "$srcdir"
+
+for x in *.h *.hh ; do
+	tag=`echo "$x" | tr 'a-z.-' 'A-Z_'`
+	lines=`grep "$tag" "$x" | wc -l`
+	if test "x$lines" != x3; then
+		echo "Ouch, header file $x does not have correct preprocessor guards"
+		stat=1
+	fi
+done
+
+exit $stat
diff --git a/src/check-libstdc++.sh b/src/check-libstdc++.sh
index 82e62d6..c0abcbe 100755
--- a/src/check-libstdc++.sh
+++ b/src/check-libstdc++.sh
@@ -11,7 +11,6 @@ else
 fi
 
 test -z "$srcdir" && srcdir=.
-test -z "$MAKE" && MAKE=make
 stat=0
 
 so=.libs/libharfbuzz.so
commit 0f0cd9d361f1bb614aa3fd4616160d027062370e
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Wed Jun 9 06:32:56 2010 -0400

    Fix header tags

diff --git a/src/hb-font-private.hh b/src/hb-font-private.hh
index 406e195..d24ea5f 100644
--- a/src/hb-font-private.hh
+++ b/src/hb-font-private.hh
@@ -24,8 +24,8 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_FONT_PRIVATE_H
-#define HB_FONT_PRIVATE_H
+#ifndef HB_FONT_PRIVATE_HH
+#define HB_FONT_PRIVATE_HH
 
 #include "hb-private.h"
 
@@ -94,4 +94,4 @@ struct _hb_font_t {
 
 HB_END_DECLS
 
-#endif /* HB_FONT_PRIVATE_H */
+#endif /* HB_FONT_PRIVATE_HH */
diff --git a/src/hb-object-private.h b/src/hb-object-private.h
index 4d6321a..9fdd564 100644
--- a/src/hb-object-private.h
+++ b/src/hb-object-private.h
@@ -27,8 +27,8 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_REFCOUNT_PRIVATE_H
-#define HB_REFCOUNT_PRIVATE_H
+#ifndef HB_OBJECT_PRIVATE_H
+#define HB_OBJECT_PRIVATE_H
 
 #include "hb-private.h"
 
@@ -136,4 +136,4 @@ _hb_trace_object (const void *obj,
 
 
 
-#endif /* HB_REFCOUNT_PRIVATE_H */
+#endif /* HB_OBJECT_PRIVATE_H */
diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index d2fbb21..59c7866 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -24,8 +24,8 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_OPEN_TYPES_PRIVATE_HH
-#define HB_OPEN_TYPES_PRIVATE_HH
+#ifndef HB_OPEN_TYPE_PRIVATE_HH
+#define HB_OPEN_TYPE_PRIVATE_HH
 
 #include "hb-private.h"
 
diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh
index 71d7253..55b609d 100644
--- a/src/hb-ot-layout-private.hh
+++ b/src/hb-ot-layout-private.hh
@@ -24,8 +24,8 @@
  * Red Hat Author(s): Behdad Esfahbod
  */
 
-#ifndef HB_OT_LAYOUT_PRIVATE_H
-#define HB_OT_LAYOUT_PRIVATE_H
+#ifndef HB_OT_LAYOUT_PRIVATE_HH
+#define HB_OT_LAYOUT_PRIVATE_HH
 
 #include "hb-private.h"
 
@@ -120,4 +120,4 @@ _hb_ot_layout_skip_mark (hb_face_t    *face,
 
 HB_END_DECLS
 
-#endif /* HB_OT_LAYOUT_PRIVATE_H */
+#endif /* HB_OT_LAYOUT_PRIVATE_HH */
diff --git a/src/hb-ot-shape.h b/src/hb-ot-shape.h
index 6d6a3be..1fafb8e 100644
--- a/src/hb-ot-shape.h
+++ b/src/hb-ot-shape.h
@@ -41,4 +41,4 @@ hb_ot_shape (hb_font_t    *font,
 
 HB_END_DECLS
 
-#endif /* HB_OT_SHAPE_PRIVATE_H */
+#endif /* HB_OT_SHAPE_H */



More information about the HarfBuzz mailing list