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

Behdad Esfahbod behdad at kemper.freedesktop.org
Mon May 30 08:09:17 PDT 2011


 Makefile.am                        |   31 +++++++++-
 TODO                               |    2 
 src/Makefile.am                    |    7 ++
 src/check-c-linkage-decls.sh       |    6 +
 src/check-header-guards.sh         |    8 ++
 src/check-includes.sh              |   42 +++++++++++++
 src/check-internal-symbols.sh      |    8 +-
 src/check-libstdc++.sh             |    7 +-
 src/hb-ot-layout-gpos-private.hh   |    4 -
 src/hb-ot-map-private.hh           |  112 ++++++++++++++++++-------------------
 src/hb-ot-map.cc                   |   44 +++++++++-----
 src/hb-ot-shape-complex-arabic.cc  |    6 -
 src/hb-ot-shape-complex-private.hh |    8 +-
 src/hb-ot-shape-private.hh         |   22 +++++++
 src/hb-ot-shape.cc                 |   28 ++++-----
 src/hb-ot-shape.h                  |    1 
 src/hb-view.cc                     |    2 
 17 files changed, 234 insertions(+), 104 deletions(-)

New commits:
commit 21deab2bdc58d8e9f1a3ba1f9c61c30a79e288a1
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Mon May 30 11:08:40 2011 -0400

    Fixed inifinite loop introduced in 7403e055cd1463f
    
    k is the index, not j.
    
    Reported by Tom Hacohen.

diff --git a/src/hb-ot-layout-gpos-private.hh b/src/hb-ot-layout-gpos-private.hh
index d51a2b0..59750ab 100644
--- a/src/hb-ot-layout-gpos-private.hh
+++ b/src/hb-ot-layout-gpos-private.hh
@@ -1553,12 +1553,12 @@ fix_mark_attachment (hb_glyph_position_t *pos, unsigned int i, hb_direction_t di
   pos[i].y_offset += pos[j].y_offset;
 
   if (HB_DIRECTION_IS_FORWARD (direction))
-    for (unsigned int k = j; k < i; j++) {
+    for (unsigned int k = j; k < i; k++) {
       pos[i].x_offset -= pos[k].x_advance;
       pos[i].y_offset -= pos[k].y_advance;
     }
   else
-    for (unsigned int k = j + 1; k < i + 1; j++) {
+    for (unsigned int k = j + 1; k < i + 1; k++) {
       pos[i].x_offset += pos[k].x_advance;
       pos[i].y_offset += pos[k].y_advance;
     }
commit 51881a61ca96c3328e2d92927a5a61e60997a429
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 27 18:15:56 2011 -0400

    Shrink code size

diff --git a/src/hb-ot-map-private.hh b/src/hb-ot-map-private.hh
index 2c8b99f..07a321f 100644
--- a/src/hb-ot-map-private.hh
+++ b/src/hb-ot-map-private.hh
@@ -42,16 +42,7 @@ struct hb_ot_map_builder_t
 {
   public:
 
-  inline void add_feature (hb_tag_t tag, unsigned int value, bool global)
-  {
-    feature_info_t *info = feature_infos.push();
-    if (unlikely (!info)) return;
-    info->tag = tag;
-    info->seq = feature_infos.len;
-    info->max_value = value;
-    info->global = global;
-    info->default_value = global ? value : 0;
-  }
+  HB_INTERNAL void add_feature (hb_tag_t tag, unsigned int value, bool global);
 
   inline void add_bool_feature (hb_tag_t tag, bool global = true)
   { add_feature (tag, 1, global); }
diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc
index f178bed..68e1321 100644
--- a/src/hb-ot-map.cc
+++ b/src/hb-ot-map.cc
@@ -64,6 +64,17 @@ hb_ot_map_t::add_lookups (hb_face_t    *face,
 }
 
 
+void hb_ot_map_builder_t::add_feature (hb_tag_t tag, unsigned int value, bool global)
+{
+  feature_info_t *info = feature_infos.push();
+  if (unlikely (!info)) return;
+  info->tag = tag;
+  info->seq = feature_infos.len;
+  info->max_value = value;
+  info->global = global;
+  info->default_value = global ? value : 0;
+}
+
 void
 hb_ot_map_builder_t::compile (hb_face_t *face,
 			      const hb_segment_properties_t *props,
commit 90645fb24bcbb78183576d3641a99560d87e49f2
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 27 18:13:31 2011 -0400

    [OT] Separate map_builder from the actual map
    
    Respectively, separate planner from the actual plan.

diff --git a/src/hb-ot-map-private.hh b/src/hb-ot-map-private.hh
index 02f5a91..2c8b99f 100644
--- a/src/hb-ot-map-private.hh
+++ b/src/hb-ot-map-private.hh
@@ -38,7 +38,31 @@ HB_BEGIN_DECLS
 
 static const hb_tag_t table_tags[2] = {HB_OT_TAG_GSUB, HB_OT_TAG_GPOS};
 
-struct hb_ot_map_t {
+struct hb_ot_map_builder_t
+{
+  public:
+
+  inline void add_feature (hb_tag_t tag, unsigned int value, bool global)
+  {
+    feature_info_t *info = feature_infos.push();
+    if (unlikely (!info)) return;
+    info->tag = tag;
+    info->seq = feature_infos.len;
+    info->max_value = value;
+    info->global = global;
+    info->default_value = global ? value : 0;
+  }
+
+  inline void add_bool_feature (hb_tag_t tag, bool global = true)
+  { add_feature (tag, 1, global); }
+
+  HB_INTERNAL void compile (hb_face_t *face,
+			    const hb_segment_properties_t *props,
+			    struct hb_ot_map_t &m);
+
+  inline void finish (void) {
+    feature_infos.finish ();
+  }
 
   private:
 
@@ -53,90 +77,77 @@ struct hb_ot_map_t {
     { return (a->tag != b->tag) ?  (a->tag < b->tag ? -1 : 1) : (a->seq < b->seq ? -1 : 1); }
   };
 
-  struct feature_map_t {
-    hb_tag_t tag; /* should be first for our bsearch to work */
-    unsigned int index[2]; /* GSUB, GPOS */
-    unsigned int shift;
-    hb_mask_t mask;
-    hb_mask_t _1_mask; /* mask for value=1, for quick access */
-
-    static int cmp (const feature_map_t *a, const feature_map_t *b)
-    { return a->tag < b->tag ? -1 : a->tag > b->tag ? 1 : 0; }
-  };
-
-  struct lookup_map_t {
-    unsigned int index;
-    hb_mask_t mask;
-
-    static int cmp (const lookup_map_t *a, const lookup_map_t *b)
-    { return a->index < b->index ? -1 : a->index > b->index ? 1 : 0; }
-  };
+  hb_prealloced_array_t<feature_info_t,16> feature_infos; /* used before compile() only */
+};
 
-  HB_INTERNAL void add_lookups (hb_face_t    *face,
-				unsigned int  table_index,
-				unsigned int  feature_index,
-				hb_mask_t     mask);
 
+struct hb_ot_map_t
+{
+  friend struct hb_ot_map_builder_t;
 
   public:
 
-  void add_feature (hb_tag_t tag, unsigned int value, bool global)
-  {
-    feature_info_t *info = feature_infos.push();
-    if (unlikely (!info)) return;
-    info->tag = tag;
-    info->seq = feature_infos.len;
-    info->max_value = value;
-    info->global = global;
-    info->default_value = global ? value : 0;
-  }
-
-  inline void add_bool_feature (hb_tag_t tag, bool global = true)
-  { add_feature (tag, 1, global); }
-
-  HB_INTERNAL void compile (hb_face_t *face,
-			    const hb_segment_properties_t *props);
-
   inline hb_mask_t get_global_mask (void) const { return global_mask; }
 
   inline hb_mask_t get_mask (hb_tag_t tag, unsigned int *shift = NULL) const {
-    const feature_map_t *map = feature_maps.bsearch (&tag);
+    const feature_map_t *map = features.bsearch (&tag);
     if (shift) *shift = map ? map->shift : 0;
     return map ? map->mask : 0;
   }
 
   inline hb_mask_t get_1_mask (hb_tag_t tag) const {
-    const feature_map_t *map = feature_maps.bsearch (&tag);
+    const feature_map_t *map = features.bsearch (&tag);
     return map ? map->_1_mask : 0;
   }
 
   inline void substitute (hb_face_t *face, hb_buffer_t *buffer) const {
-    for (unsigned int i = 0; i < lookup_maps[0].len; i++)
-      hb_ot_layout_substitute_lookup (face, buffer, lookup_maps[0][i].index, lookup_maps[0][i].mask);
+    for (unsigned int i = 0; i < lookups[0].len; i++)
+      hb_ot_layout_substitute_lookup (face, buffer, lookups[0][i].index, lookups[0][i].mask);
   }
 
   inline void position (hb_font_t *font, hb_face_t *face, hb_buffer_t *buffer) const {
-    for (unsigned int i = 0; i < lookup_maps[1].len; i++)
-      hb_ot_layout_position_lookup (font, buffer, lookup_maps[1][i].index, lookup_maps[1][i].mask);
+    for (unsigned int i = 0; i < lookups[1].len; i++)
+      hb_ot_layout_position_lookup (font, buffer, lookups[1][i].index, lookups[1][i].mask);
   }
 
   inline void finish (void) {
-    feature_infos.finish ();
-    feature_maps.finish ();
-    lookup_maps[0].finish ();
-    lookup_maps[1].finish ();
+    features.finish ();
+    lookups[0].finish ();
+    lookups[1].finish ();
   }
 
   private:
 
-  hb_mask_t global_mask;
+  struct feature_map_t {
+    hb_tag_t tag; /* should be first for our bsearch to work */
+    unsigned int index[2]; /* GSUB, GPOS */
+    unsigned int shift;
+    hb_mask_t mask;
+    hb_mask_t _1_mask; /* mask for value=1, for quick access */
 
-  hb_prealloced_array_t<feature_info_t,8> feature_infos; /* used before compile() only */
-  hb_prealloced_array_t<feature_map_t, 8> feature_maps;
+    static int cmp (const feature_map_t *a, const feature_map_t *b)
+    { return a->tag < b->tag ? -1 : a->tag > b->tag ? 1 : 0; }
+  };
 
-  hb_prealloced_array_t<lookup_map_t, 32> lookup_maps[2]; /* GSUB/GPOS */
-};
+  struct lookup_map_t {
+    unsigned int index;
+    hb_mask_t mask;
 
+    static int cmp (const lookup_map_t *a, const lookup_map_t *b)
+    { return a->index < b->index ? -1 : a->index > b->index ? 1 : 0; }
+  };
+
+  HB_INTERNAL void add_lookups (hb_face_t    *face,
+				unsigned int  table_index,
+				unsigned int  feature_index,
+				hb_mask_t     mask);
+
+
+  hb_mask_t global_mask;
+
+  hb_prealloced_array_t<feature_map_t, 8> features;
+  hb_prealloced_array_t<lookup_map_t, 32> lookups[2]; /* GSUB/GPOS */
+};
 
 
 HB_END_DECLS
diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc
index 9006bf9..f178bed 100644
--- a/src/hb-ot-map.cc
+++ b/src/hb-ot-map.cc
@@ -52,7 +52,7 @@ hb_ot_map_t::add_lookups (hb_face_t    *face,
 					     lookup_indices);
 
     for (unsigned int i = 0; i < len; i++) {
-      lookup_map_t *lookup = lookup_maps[table_index].push ();
+      hb_ot_map_t::lookup_map_t *lookup = lookups[table_index].push ();
       if (unlikely (!lookup))
         return;
       lookup->mask = mask;
@@ -65,10 +65,11 @@ hb_ot_map_t::add_lookups (hb_face_t    *face,
 
 
 void
-hb_ot_map_t::compile (hb_face_t *face,
-		      const hb_segment_properties_t *props)
+hb_ot_map_builder_t::compile (hb_face_t *face,
+			      const hb_segment_properties_t *props,
+			      hb_ot_map_t &m)
 {
- global_mask = 1;
+ m.global_mask = 1;
 
   if (!feature_infos.len)
     return;
@@ -139,7 +140,7 @@ hb_ot_map_t::compile (hb_face_t *face,
       continue;
 
 
-    feature_map_t *map = feature_maps.push ();
+    hb_ot_map_t::feature_map_t *map = m.features.push ();
     if (unlikely (!map))
       break;
 
@@ -155,7 +156,7 @@ hb_ot_map_t::compile (hb_face_t *face,
       map->mask = (1 << (next_bit + bits_needed)) - (1 << next_bit);
       next_bit += bits_needed;
       if (info->global)
-	global_mask |= (info->default_value << map->shift) & map->mask;
+	m.global_mask |= (info->default_value << map->shift) & map->mask;
     }
     map->_1_mask = (1 << map->shift) & map->mask;
 
@@ -174,22 +175,22 @@ hb_ot_map_t::compile (hb_face_t *face,
 							  script_index[table_index],
 							  language_index[table_index],
 							  &required_feature_index))
-      add_lookups (face, table_index, required_feature_index, 1);
+      m.add_lookups (face, table_index, required_feature_index, 1);
 
-    for (unsigned i = 0; i < feature_maps.len; i++)
-      add_lookups (face, table_index, feature_maps[i].index[table_index], feature_maps[i].mask);
+    for (unsigned i = 0; i < m.features.len; i++)
+      m.add_lookups (face, table_index, m.features[i].index[table_index], m.features[i].mask);
 
     /* Sort lookups and merge duplicates */
-    lookup_maps[table_index].sort ();
-    if (lookup_maps[table_index].len)
+    m.lookups[table_index].sort ();
+    if (m.lookups[table_index].len)
     {
       unsigned int j = 0;
-      for (unsigned int i = 1; i < lookup_maps[table_index].len; i++)
-	if (lookup_maps[table_index][i].index != lookup_maps[table_index][j].index)
-	  lookup_maps[table_index][++j] = lookup_maps[table_index][i];
+      for (unsigned int i = 1; i < m.lookups[table_index].len; i++)
+	if (m.lookups[table_index][i].index != m.lookups[table_index][j].index)
+	  m.lookups[table_index][++j] = m.lookups[table_index][i];
 	else
-	  lookup_maps[table_index][j].mask |= lookup_maps[table_index][i].mask;
-      lookup_maps[table_index].shrink (j + 1);
+	  m.lookups[table_index][j].mask |= m.lookups[table_index][i].mask;
+      m.lookups[table_index].shrink (j + 1);
     }
   }
 }
diff --git a/src/hb-ot-shape-complex-arabic.cc b/src/hb-ot-shape-complex-arabic.cc
index f2d325f..1b5b231 100644
--- a/src/hb-ot-shape-complex-arabic.cc
+++ b/src/hb-ot-shape-complex-arabic.cc
@@ -152,14 +152,14 @@ static const struct arabic_state_table_entry {
 
 
 void
-_hb_ot_shape_complex_collect_features_arabic	(hb_ot_shape_plan_t *plan, const hb_segment_properties_t  *props)
+_hb_ot_shape_complex_collect_features_arabic	(hb_ot_shape_planner_t *planner, const hb_segment_properties_t  *props)
 {
   /* ArabicOT spec enables 'cswh' for Arabic where as for basic shaper it's disabled by default. */
-  plan->map.add_bool_feature (HB_TAG('c','s','w','h'));
+  planner->map.add_bool_feature (HB_TAG('c','s','w','h'));
 
   unsigned int num_features = props->script == HB_SCRIPT_SYRIAC ? SYRIAC_NUM_FEATURES : COMMON_NUM_FEATURES;
   for (unsigned int i = 0; i < num_features; i++)
-    plan->map.add_bool_feature (arabic_syriac_features[i], false);
+    planner->map.add_bool_feature (arabic_syriac_features[i], false);
 }
 
 void
diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
index b3afe2b..f58e5da 100644
--- a/src/hb-ot-shape-complex-private.hh
+++ b/src/hb-ot-shape-complex-private.hh
@@ -61,14 +61,14 @@ hb_ot_shape_complex_categorize (const hb_segment_properties_t *props)
  * Shapers should use plan->map to add their features.
  */
 
-HB_INTERNAL void _hb_ot_shape_complex_collect_features_arabic	(hb_ot_shape_plan_t *plan, const hb_segment_properties_t  *props);
+HB_INTERNAL void _hb_ot_shape_complex_collect_features_arabic	(hb_ot_shape_planner_t *plan, const hb_segment_properties_t  *props);
 
 static inline void
-hb_ot_shape_complex_collect_features (hb_ot_shape_plan_t *plan,
+hb_ot_shape_complex_collect_features (hb_ot_shape_planner_t *planner,
 				      const hb_segment_properties_t  *props)
 {
-  switch (plan->shaper) {
-    case hb_ot_complex_shaper_arabic:	_hb_ot_shape_complex_collect_features_arabic (plan, props);	return;
+  switch (planner->shaper) {
+    case hb_ot_complex_shaper_arabic:	_hb_ot_shape_complex_collect_features_arabic (planner, props);	return;
     case hb_ot_complex_shaper_none:	default:							return;
   }
 }
diff --git a/src/hb-ot-shape-private.hh b/src/hb-ot-shape-private.hh
index 4ea73f5..60269ce 100644
--- a/src/hb-ot-shape-private.hh
+++ b/src/hb-ot-shape-private.hh
@@ -49,6 +49,8 @@ enum hb_ot_complex_shaper_t {
 
 struct hb_ot_shape_plan_t
 {
+  friend struct hb_ot_shape_planner_t;
+
   hb_ot_map_t map;
   hb_ot_complex_shaper_t shaper;
 
@@ -59,6 +61,26 @@ struct hb_ot_shape_plan_t
   NO_COPY (hb_ot_shape_plan_t);
 };
 
+struct hb_ot_shape_planner_t
+{
+  hb_ot_map_builder_t map;
+  hb_ot_complex_shaper_t shaper;
+
+  hb_ot_shape_planner_t (void) : map () {}
+  ~hb_ot_shape_planner_t (void) { map.finish (); }
+
+  inline void compile (hb_face_t *face,
+		       const hb_segment_properties_t *props,
+		       struct hb_ot_shape_plan_t &plan)
+  {
+    plan.shaper = shaper;
+    map.compile (face, props, plan.map);
+  }
+
+  private:
+  NO_COPY (hb_ot_shape_planner_t);
+};
+
 
 struct hb_ot_shape_context_t
 {
diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index 02be237..4b66dd1 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -49,19 +49,19 @@ hb_tag_t default_features[] = {
 };
 
 static void
-hb_ot_shape_collect_features (hb_ot_shape_plan_t       *plan,
+hb_ot_shape_collect_features (hb_ot_shape_planner_t          *planner,
 			      const hb_segment_properties_t  *props,
-			      const hb_feature_t       *user_features,
-			      unsigned int              num_user_features)
+			      const hb_feature_t             *user_features,
+			      unsigned int                    num_user_features)
 {
   switch (props->direction) {
     case HB_DIRECTION_LTR:
-      plan->map.add_bool_feature (HB_TAG ('l','t','r','a'));
-      plan->map.add_bool_feature (HB_TAG ('l','t','r','m'));
+      planner->map.add_bool_feature (HB_TAG ('l','t','r','a'));
+      planner->map.add_bool_feature (HB_TAG ('l','t','r','m'));
       break;
     case HB_DIRECTION_RTL:
-      plan->map.add_bool_feature (HB_TAG ('r','t','l','a'));
-      plan->map.add_bool_feature (HB_TAG ('r','t','l','m'), false);
+      planner->map.add_bool_feature (HB_TAG ('r','t','l','a'));
+      planner->map.add_bool_feature (HB_TAG ('r','t','l','m'), false);
       break;
     case HB_DIRECTION_TTB:
     case HB_DIRECTION_BTT:
@@ -71,13 +71,13 @@ hb_ot_shape_collect_features (hb_ot_shape_plan_t       *plan,
   }
 
   for (unsigned int i = 0; i < ARRAY_LENGTH (default_features); i++)
-    plan->map.add_bool_feature (default_features[i]);
+    planner->map.add_bool_feature (default_features[i]);
 
-  hb_ot_shape_complex_collect_features (plan, props);
+  hb_ot_shape_complex_collect_features (planner, props);
 
   for (unsigned int i = 0; i < num_user_features; i++) {
     const hb_feature_t *feature = &user_features[i];
-    plan->map.add_feature (feature->tag, feature->value, (feature->start == 0 && feature->end == (unsigned int) -1));
+    planner->map.add_feature (feature->tag, feature->value, (feature->start == 0 && feature->end == (unsigned int) -1));
   }
 }
 
@@ -384,11 +384,13 @@ hb_ot_shape_plan_internal (hb_ot_shape_plan_t       *plan,
 			   const hb_feature_t       *user_features,
 			   unsigned int              num_user_features)
 {
-  plan->shaper = hb_ot_shape_complex_categorize (props);
+  hb_ot_shape_planner_t planner;
 
-  hb_ot_shape_collect_features (plan, props, user_features, num_user_features);
+  planner.shaper = hb_ot_shape_complex_categorize (props);
 
-  plan->map.compile (face, props);
+  hb_ot_shape_collect_features (&planner, props, user_features, num_user_features);
+
+  planner.compile (face, props, *plan);
 }
 
 static void
commit 5560a19e2b3901437d8ee2e5905b4ac77073bfbe
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 27 17:49:16 2011 -0400

    Minor

diff --git a/src/hb-view.cc b/src/hb-view.cc
index 5dceaf9..519f6cf 100644
--- a/src/hb-view.cc
+++ b/src/hb-view.cc
@@ -86,7 +86,7 @@ usage (FILE *f, int status)
 G_GNUC_NORETURN static void
 version (void)
 {
-  printf ("hb-view (harfbuzz) %s\n", PACKAGE_VERSION);
+  printf ("hb-view (harfbuzz) %s\n", HB_VERSION_STRING);
   exit (0);
 }
 
commit 1587c26fe94087040b4a5d682ec196f568e4a1a2
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 27 16:05:01 2011 -0400

    [TODO] Add item

diff --git a/TODO b/TODO
index f770286..a03923f 100644
--- a/TODO
+++ b/TODO
@@ -22,6 +22,8 @@ General fixes:
 API issues to fix before 1.0:
 ============================
 
+- Add pkg-config files for glue codes (harfbuzz-glib, etc)
+
 - Figure out how many .so objects, how to link, etc
 
 - Add hb-cairo glue
commit 5c9f14932d59e306fbc72f7daecb384a16da73d9
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 27 15:59:33 2011 -0400

    Minor

diff --git a/Makefile.am b/Makefile.am
index 5167eaf..bb68ede 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -55,6 +55,8 @@ $(srcdir)/ChangeLog:
 # Release engineering
 #
 
+# TODO: Copy infrastructure from cairo
+
 TAR_OPTIONS = --owner=0 --group=0
 dist-hook: dist-clear-sticky-bits
 # Clean up any sticky bits we may inherit from parent dir
commit 5bc18195d55570ef01e4b24dd248f222f081b0a2
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 27 15:58:54 2011 -0400

    Add check-includes.sh

diff --git a/src/Makefile.am b/src/Makefile.am
index df5c52f..93a5138 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -146,6 +146,7 @@ dist_check_SCRIPTS = \
 	check-c-linkage-decls.sh \
 	check-header-guards.sh \
 	check-internal-symbols.sh \
+	check-includes.sh \
 	$(NULL)
 
 if HAVE_ICU
@@ -154,5 +155,11 @@ dist_check_SCRIPTS += check-libstdc++.sh
 endif
 
 TESTS = $(dist_check_SCRIPTS)
+TESTS_ENVIRONMENT = \
+	srcdir="$(srcdir)" \
+	MAKE="$(MAKE) $(AM_MAKEFLAGS)" \
+	HBSOURCES="$(HBSOURCES)" \
+	HBHEADERS="$(HBHEADERS)" \
+	$(NULL)
 
 -include $(top_srcdir)/git.mk
diff --git a/src/check-c-linkage-decls.sh b/src/check-c-linkage-decls.sh
index ffdb9e3..84e77cf 100755
--- a/src/check-c-linkage-decls.sh
+++ b/src/check-c-linkage-decls.sh
@@ -6,9 +6,13 @@ export LC_ALL
 test -z "$srcdir" && srcdir=.
 stat=0
 
+test "x$HBHEADERS" = x && HBHEADERS=`find . -maxdepth 1 -name 'hb*.h'`
+test "x$HBSOURCES" = x && HBSOURCES=`find . -maxdepth 1 -name 'hb-*.cc' -or -name 'hb-*.hh'`
+
+
 cd "$srcdir"
 
-for x in hb-*.cc hb-*.h hb-*.hh ; do
+for x in $HBHEADERS $HBSOURCES; do
 	if ! grep -q HB_BEGIN_DECLS "$x" || ! grep -q HB_END_DECLS "$x"; then
 		echo "Ouch, file $x does not HB_BEGIN_DECLS / HB_END_DECLS"
 		stat=1
diff --git a/src/check-header-guards.sh b/src/check-header-guards.sh
index c966cd2..ddbcd83 100755
--- a/src/check-header-guards.sh
+++ b/src/check-header-guards.sh
@@ -6,9 +6,15 @@ export LC_ALL
 test -z "$srcdir" && srcdir=.
 stat=0
 
+test "x$HBHEADERS" = x && HBHEADERS=`find . -maxdepth 1 -name 'hb*.h'`
+test "x$HBSOURCES" = x && HBSOURCES=`find . -maxdepth 1 -name 'hb-*.cc' -or -name 'hb-*.hh'`
+
+
 cd "$srcdir"
 
-for x in hb-*.h hb-*.hh ; do
+for x in $HBHEADERS $HBSOURCES; do
+	echo "$x" | grep '[^h]$' -q && continue;
+	x=`echo "$x" | sed 's at .*/@@'`
 	tag=`echo "$x" | tr 'a-z.-' 'A-Z_'`
 	lines=`grep "\<$tag\>" "$x" | wc -l`
 	if test "x$lines" != x3; then
diff --git a/src/check-includes.sh b/src/check-includes.sh
new file mode 100755
index 0000000..79323a7
--- /dev/null
+++ b/src/check-includes.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+
+LC_ALL=C
+export LC_ALL
+
+test -z "$srcdir" && srcdir=.
+stat=0
+
+test "x$HBHEADERS" = x && HBHEADERS=`find . -maxdepth 1 -name 'hb*.h'`
+test "x$HBSOURCES" = x && HBSOURCES=`find . -maxdepth 1 -name 'hb-*.cc' -or -name 'hb-*.hh'`
+
+
+cd "$srcdir"
+
+
+echo 'Checking that public header files #include "hb-common.h" or "hb.h" first (or none)'
+
+for x in $HBHEADERS; do
+	grep '#.*\<include\>' "$x" /dev/null | head -n 1
+done |
+grep -v '"hb-common[.]h"' |
+grep -v '"hb[.]h"' |
+grep -v 'hb-common[.]h:' |
+grep -v 'hb[.]h:' |
+grep . >&2 && stat=1
+
+
+echo 'Checking that source files #include "hb-*private.hh" first (or none)'
+
+for x in $HBSOURCES; do
+	grep '#.*\<include\>' "$x" /dev/null | head -n 1
+done |
+grep -v '"hb-.*private[.]hh"' |
+grep -v 'hb-private[.]hh:' |
+grep . >&2 && stat=1
+
+
+echo 'Checking that there is no #include <hb.*.h>'
+grep '#.*\<include\>.*<.*hb' $HBHEADERS $HBSOURCES >&2 && stat=1
+
+
+exit $stat
diff --git a/src/check-internal-symbols.sh b/src/check-internal-symbols.sh
index 124a7b0..2885fa4 100755
--- a/src/check-internal-symbols.sh
+++ b/src/check-internal-symbols.sh
@@ -3,6 +3,10 @@
 LC_ALL=C
 export LC_ALL
 
+test -z "$srcdir" && srcdir=.
+stat=0
+
+
 if which nm 2>/dev/null >/dev/null; then
 	:
 else
@@ -10,10 +14,6 @@ else
 	exit 0
 fi
 
-test -z "$srcdir" && srcdir=.
-test -z "$MAKE" && MAKE=make
-stat=0
-
 so=.libs/libharfbuzz.so
 if test -f "$so"; then
 	echo "Checking that we are exposing internal symbols"
diff --git a/src/check-libstdc++.sh b/src/check-libstdc++.sh
index c0abcbe..40e73b0 100755
--- a/src/check-libstdc++.sh
+++ b/src/check-libstdc++.sh
@@ -3,6 +3,10 @@
 LC_ALL=C
 export LC_ALL
 
+test -z "$srcdir" && srcdir=.
+stat=0
+
+
 if which ldd 2>/dev/null >/dev/null; then
 	:
 else
@@ -10,9 +14,6 @@ else
 	exit 0
 fi
 
-test -z "$srcdir" && srcdir=.
-stat=0
-
 so=.libs/libharfbuzz.so
 if test -f "$so"; then
 	echo "Checking that we are not linking to libstdc++"
diff --git a/src/hb-ot-shape.h b/src/hb-ot-shape.h
index 70a8172..f9560e5 100644
--- a/src/hb-ot-shape.h
+++ b/src/hb-ot-shape.h
@@ -27,6 +27,7 @@
 #ifndef HB_OT_SHAPE_H
 #define HB_OT_SHAPE_H
 
+#include "hb-common.h"
 #include "hb-shape.h"
 
 
commit 3f12c434e20261f6d5c600e56575b7dfdd5b1470
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri May 27 04:58:11 2011 -0400

    [configure] Generate sha256sum and GPG-sign it

diff --git a/Makefile.am b/Makefile.am
index 12a42e6..5167eaf 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -29,8 +29,11 @@ MAINTAINERCLEANFILES = \
 	$(srcdir)/ChangeLog \
 	`find "$(srcdir)" -type f -name Makefile.in -print`
 
-CHANGELOG_RANGE =
 
+#
+# ChangeLog generation
+#
+CHANGELOG_RANGE =
 ChangeLog: $(srcdir)/ChangeLog
 $(srcdir)/ChangeLog:
 	$(AM_V_GEN) if test -d "$(srcdir)/.git"; then \
@@ -48,4 +51,28 @@ $(srcdir)/ChangeLog:
 .PHONY: $(srcdir)/ChangeLog
 
 
+#
+# Release engineering
+#
+
+TAR_OPTIONS = --owner=0 --group=0
+dist-hook: dist-clear-sticky-bits
+# Clean up any sticky bits we may inherit from parent dir
+dist-clear-sticky-bits:
+	chmod -R a-s $(distdir)
+
+
+tar_file = $(PACKAGE_TARNAME)-$(VERSION).tar.bz2
+sha256_file = $(tar_file).sha256
+gpg_file = $(sha256_file).asc
+$(sha256_file): $(tar_file)
+	sha256sum $^ > $@
+$(gpg_file): $(sha256_file)
+	@echo "Please enter your GPG password to sign the checksum."
+	gpg --armor --sign $^
+
+release-files: $(tar_file) $(sha256_file) $(gpg_file)
+
+
+
 -include $(top_srcdir)/git.mk



More information about the HarfBuzz mailing list