[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