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

Behdad Esfahbod behdad at kemper.freedesktop.org
Sun Nov 4 01:19:33 UTC 2018


 src/hb-blob.cc                 |    2 
 src/hb-dsalgs.hh               |    4 +
 src/hb-null.hh                 |   30 +++++++++++++
 src/hb-open-type.hh            |    2 
 src/hb-ot-color-cbdt-table.hh  |   10 ----
 src/hb-ot-color-sbix-table.hh  |   11 +---
 src/hb-ot-color-svg-table.hh   |   11 +---
 src/hb-ot-glyf-table.hh        |    6 +-
 src/hb-ot-layout-gdef-table.hh |    2 
 src/hb-ot-layout-gsubgpos.hh   |    2 
 src/hb-ot-name-table.hh        |    2 
 src/hb-ot-name.cc              |    4 -
 src/hb-ot-post-table.hh        |    2 
 test/api/Makefile.am           |    1 
 test/api/test-ot-face.c        |   94 +++++++++++++++++++++++++++++++++++++++++
 15 files changed, 150 insertions(+), 33 deletions(-)

New commits:
commit c8f94a1ca6928f07749285da910b63087d485537
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Sat Nov 3 21:07:39 2018 -0400

    Minor

diff --git a/src/hb-ot-name.cc b/src/hb-ot-name.cc
index e0c97108..f5ac18d7 100644
--- a/src/hb-ot-name.cc
+++ b/src/hb-ot-name.cc
@@ -52,7 +52,7 @@ _get_name (hb_face_t *face)
 /**
  * hb_ot_name_list_names:
  * @face: font face.
- * @num_entries: (out): number of returned entries.
+ * @num_entries: (out) (allow-none): number of returned entries.
  *
  * Enumerates all available name IDs and language combinations. Returned
  * array is owned by the @face and should not be modified.  It can be
@@ -66,7 +66,7 @@ hb_ot_name_list_names (hb_face_t    *face,
 		       unsigned int *num_entries /* OUT */)
 {
   const OT::name_accelerator_t &name = _get_name (face);
-  *num_entries = name.names.len;
+  if (num_entries) *num_entries = name.names.len;
   return name.names.arrayZ();
 }
 
commit 9779e602ed7ac214c0da2c90e104b38460422476
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Sat Nov 3 20:50:56 2018 -0400

    [test] Add test for empty face

diff --git a/test/api/Makefile.am b/test/api/Makefile.am
index 3b985703..b307cd12 100644
--- a/test/api/Makefile.am
+++ b/test/api/Makefile.am
@@ -36,6 +36,7 @@ TEST_PROGS = \
 	test-font \
 	test-map \
 	test-object \
+	test-ot-face \
 	test-set \
 	test-shape \
 	test-subset \
diff --git a/test/api/test-ot-face.c b/test/api/test-ot-face.c
new file mode 100644
index 00000000..0af584e0
--- /dev/null
+++ b/test/api/test-ot-face.c
@@ -0,0 +1,94 @@
+/*
+ * Copyright © 2011  Google, Inc.
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ *
+ * Google Author(s): Behdad Esfahbod
+ */
+
+#include "hb-test.h"
+#include <hb-ot.h>
+
+/* Unit tests for hb-ot-*.h */
+
+
+static void
+test_ot_face_empty (void)
+{
+  hb_face_t *face = hb_face_get_empty ();
+  hb_font_t *font = hb_font_create (face);
+  hb_set_t *set = hb_set_create ();
+
+  hb_face_collect_unicodes (face, set);
+  hb_face_collect_variation_selectors (face, set);
+  hb_face_collect_variation_unicodes (face, 0, set);
+
+  hb_ot_color_has_palettes (face);
+  hb_ot_color_palette_get_count (face);
+  hb_ot_color_palette_get_name_id (face, 0);
+  hb_ot_color_palette_color_get_name_id (face, 0);
+  hb_ot_color_palette_get_flags (face, 0);
+  hb_ot_color_palette_get_colors (face, 0, 0, NULL, NULL);
+  hb_ot_color_has_layers (face);
+  hb_ot_color_glyph_get_layers (face, 0, 0, NULL, NULL);
+  hb_ot_color_has_svg (face);
+  hb_ot_color_glyph_reference_svg (face, 0);
+  hb_ot_color_has_png (face);
+  hb_ot_color_glyph_reference_png (font, 0);
+
+  hb_ot_layout_has_glyph_classes (face);
+  hb_ot_layout_has_substitution (face);
+  hb_ot_layout_has_positioning (face);
+
+  hb_ot_math_has_data (face);
+  hb_ot_math_get_constant (font, 0);
+  hb_ot_math_get_glyph_italics_correction (font, 0);
+  hb_ot_math_get_glyph_top_accent_attachment (font, 0);
+  hb_ot_math_is_glyph_extended_shape (face, 0);
+  hb_ot_math_get_glyph_kerning (font, 0, 0, 0);
+  hb_ot_math_get_glyph_variants (font, 0, 0, 0, NULL, NULL);
+  hb_ot_math_get_min_connector_overlap (font, 0);
+  hb_ot_math_get_glyph_assembly (font, 0, 0, 0, NULL, NULL, NULL);
+
+  hb_ot_name_list_names (face, NULL);
+  hb_ot_name_get_utf8 (face, 0, NULL, NULL, NULL);
+  hb_ot_name_get_utf16 (face, 0, NULL, NULL, NULL);
+  hb_ot_name_get_utf32 (face, 0, NULL, NULL, NULL);
+
+  hb_ot_var_get_axis_count (face);
+  hb_ot_var_get_axes (face, 0, NULL, NULL);
+  hb_ot_var_normalize_variations (face, NULL, 0, NULL, 0);
+  hb_ot_var_normalize_coords (face, 0, NULL, NULL);
+
+  hb_set_destroy (set);
+  hb_font_destroy (font);
+  hb_face_destroy (face);
+}
+
+int
+main (int argc, char **argv)
+{
+  hb_test_init (&argc, &argv);
+
+  hb_test_add (test_ot_face_empty);
+
+  return hb_test_run();
+}
commit 0b0b38ec1e6a815a30bef98193043d255b52c4a1
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Sat Nov 3 16:15:30 2018 -0400

    Fix null accelerator's
    
    Fixes all except for cmap.  To be done separately.
    
    Part of https://github.com/harfbuzz/harfbuzz/issues/1146

diff --git a/src/hb-ot-color-cbdt-table.hh b/src/hb-ot-color-cbdt-table.hh
index 614cc80c..580dc376 100644
--- a/src/hb-ot-color-cbdt-table.hh
+++ b/src/hb-ot-color-cbdt-table.hh
@@ -409,9 +409,6 @@ struct CBDT
     inline bool get_extents (hb_font_t *font, hb_codepoint_t glyph,
 			     hb_glyph_extents_t *extents) const
     {
-      if (!cblc)
-	return false;
-
       const void *base;
       const BitmapSizeTable &strike = this->cblc->choose_strike (font);
       const IndexSubtableRecord *subtable_record = strike.find_table (glyph, cblc, &base);
@@ -467,9 +464,6 @@ struct CBDT
     inline hb_blob_t* reference_png (hb_font_t      *font,
 				     hb_codepoint_t  glyph) const
     {
-      if (!cblc)
-	return hb_blob_get_empty ();
-
       const void *base;
       const BitmapSizeTable &strike = this->cblc->choose_strike (font);
       const IndexSubtableRecord *subtable_record = strike.find_table (glyph, cblc, &base);
@@ -525,8 +519,8 @@ struct CBDT
     private:
     hb_blob_t *cblc_blob;
     hb_blob_t *cbdt_blob;
-    const CBLC *cblc;
-    const CBDT *cbdt;
+    hb_nonnull_ptr_t<const CBLC> cblc;
+    hb_nonnull_ptr_t<const CBDT> cbdt;
 
     unsigned int cbdt_len;
     unsigned int upem;
diff --git a/src/hb-ot-color-sbix-table.hh b/src/hb-ot-color-sbix-table.hh
index 065c0dd1..7a01d14a 100644
--- a/src/hb-ot-color-sbix-table.hh
+++ b/src/hb-ot-color-sbix-table.hh
@@ -152,9 +152,6 @@ struct sbix
 
     inline bool has_data () const
     {
-      /* XXX Fix somehow and remove next line.
-       * https://github.com/harfbuzz/harfbuzz/issues/1146 */
-      if (!num_glyphs) return false;
       return table->has_data ();
     }
 
@@ -234,8 +231,8 @@ struct sbix
 				 hb_codepoint_t      glyph,
 				 hb_glyph_extents_t *extents) const
     {
-      /* Following code is safe to call even without data (XXX currently
-       * isn't.  See has_data()), but faster to short-circuit. */
+      /* Following code is safe to call even without data.
+       * But faster to short-circuit. */
       if (!has_data ())
         return false;
 
@@ -262,12 +259,12 @@ struct sbix
 
       hb_blob_destroy (blob);
 
-      return true;
+      return strike_ppem;
     }
 
     private:
     hb_blob_t *sbix_blob;
-    const sbix *table;
+    hb_nonnull_ptr_t<const sbix> table;
 
     unsigned int num_glyphs;
   };
diff --git a/src/hb-ot-color-svg-table.hh b/src/hb-ot-color-svg-table.hh
index bb4c4f75..069c5478 100644
--- a/src/hb-ot-color-svg-table.hh
+++ b/src/hb-ot-color-svg-table.hh
@@ -75,12 +75,13 @@ struct SVG
 {
   static const hb_tag_t tableTag = HB_OT_TAG_SVG;
 
+  inline bool has_data (void) const { return svgDocEntries; }
+
   struct accelerator_t
   {
     inline void init (hb_face_t *face)
     {
       svg_blob = hb_sanitize_context_t().reference_table<SVG> (face);
-      svg_len = hb_blob_get_length (svg_blob);
       table = svg_blob->as<SVG> ();
     }
 
@@ -91,18 +92,14 @@ struct SVG
 
     inline hb_blob_t *reference_blob_for_glyph (hb_codepoint_t glyph_id) const
     {
-      if (unlikely (!svg_len))
-        return hb_blob_get_empty ();
       return table->get_glyph_entry (glyph_id).reference_blob (svg_blob, table->svgDocEntries);
     }
 
-    inline bool has_data () const { return svg_len; }
+    inline bool has_data () const { return table->has_data (); }
 
     private:
     hb_blob_t *svg_blob;
-    const SVG *table;
-
-    unsigned int svg_len;
+    hb_nonnull_ptr_t<const SVG> table;
   };
 
   inline const SVGDocumentIndexEntry &get_glyph_entry (hb_codepoint_t glyph_id) const
diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh
index 7bd175e3..d2a39f23 100644
--- a/src/hb-ot-glyf-table.hh
+++ b/src/hb-ot-glyf-table.hh
@@ -276,7 +276,7 @@ struct glyf
       if (!get_offsets (glyph, &start_offset, &end_offset))
         return false; /* glyph not found */
 
-      return CompositeGlyphHeader::get_iterator ((const char*) this->glyf_table + start_offset,
+      return CompositeGlyphHeader::get_iterator ((const char *) this->glyf_table + start_offset,
 						 end_offset - start_offset,
 						 composite);
     }
@@ -476,8 +476,8 @@ struct glyf
     private:
     bool short_offset;
     unsigned int num_glyphs;
-    const loca *loca_table;
-    const glyf *glyf_table;
+    hb_nonnull_ptr_t<const loca> loca_table;
+    hb_nonnull_ptr_t<const glyf> glyf_table;
     hb_blob_t *loca_blob;
     hb_blob_t *glyf_blob;
     unsigned int glyf_len;
diff --git a/src/hb-ot-layout-gdef-table.hh b/src/hb-ot-layout-gdef-table.hh
index 75709086..5847953d 100644
--- a/src/hb-ot-layout-gdef-table.hh
+++ b/src/hb-ot-layout-gdef-table.hh
@@ -418,7 +418,7 @@ struct GDEF
     }
 
     hb_blob_t *blob;
-    const GDEF *table;
+    hb_nonnull_ptr_t<const GDEF> table;
   };
 
   inline unsigned int get_size (void) const
diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh
index 54ae429b..0d9eeae5 100644
--- a/src/hb-ot-layout-gsubgpos.hh
+++ b/src/hb-ot-layout-gsubgpos.hh
@@ -2774,7 +2774,7 @@ struct GSUBGPOS
     }
 
     hb_blob_t *blob;
-    const T *table;
+    hb_nonnull_ptr_t<const T> table;
     unsigned int lookup_count;
     hb_ot_layout_lookup_accelerator_t *accels;
   };
diff --git a/src/hb-ot-name-table.hh b/src/hb-ot-name-table.hh
index 9f67b574..f1e785f1 100644
--- a/src/hb-ot-name-table.hh
+++ b/src/hb-ot-name-table.hh
@@ -257,7 +257,7 @@ struct name
     const void *pool;
     unsigned int pool_len;
     public:
-    const name *table;
+    hb_nonnull_ptr_t<const name> table;
     hb_vector_t<hb_ot_name_entry_t> names;
   };
 
diff --git a/src/hb-ot-post-table.hh b/src/hb-ot-post-table.hh
index bd049f9a..6432f3f1 100644
--- a/src/hb-ot-post-table.hh
+++ b/src/hb-ot-post-table.hh
@@ -254,7 +254,7 @@ struct post
     private:
     hb_blob_t *blob;
     uint32_t version;
-    const ArrayOf<HBUINT16> *glyphNameIndex;
+    hb_nonnull_ptr_t<const ArrayOf<HBUINT16>> glyphNameIndex;
     hb_vector_t<uint32_t, 1> index_to_offset;
     const uint8_t *pool;
     hb_atomic_ptr_t<uint16_t *> gids_sorted_by_name;
commit db889c182ee5f54127285bfaab5bc94dafe46bda
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Sat Nov 3 16:04:19 2018 -0400

    Add operator char * to the naked array types as well

diff --git a/src/hb-dsalgs.hh b/src/hb-dsalgs.hh
index f2bff063..fafac1f7 100644
--- a/src/hb-dsalgs.hh
+++ b/src/hb-dsalgs.hh
@@ -553,8 +553,10 @@ struct hb_array_t
 
   inline unsigned int get_size (void) const { return len * sizeof (Type); }
 
-  template <typename T> inline operator  T * (void) { return arrayZ; }
+  template <typename T> inline operator T * (void) { return arrayZ; }
   template <typename T> inline operator const T * (void) const { return arrayZ; }
+  inline operator char * (void) { return (char *) arrayZ; }
+  inline operator const char * (void) const { return (const char *) arrayZ; }
 
   inline Type * operator & (void) { return arrayZ; }
   inline const Type * operator & (void) const { return arrayZ; }
diff --git a/src/hb-open-type.hh b/src/hb-open-type.hh
index 0f6efdc6..e1dc8aab 100644
--- a/src/hb-open-type.hh
+++ b/src/hb-open-type.hh
@@ -342,6 +342,8 @@ struct UnsizedArrayOf
 
   template <typename T> inline operator T * (void) { return arrayZ; }
   template <typename T> inline operator const T * (void) const { return arrayZ; }
+  inline operator char * (void) { return (char *) arrayZ; }
+  inline operator const char * (void) const { return (const char *) arrayZ; }
 
   inline unsigned int get_size (unsigned int len) const
   { return len * Type::static_size; }
commit d6fdae310f2a98ca624c3a77c3aa03b8b3bd393a
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Sat Nov 3 16:02:03 2018 -0400

    Add operator char * to hb_nonnull_ptr_t

diff --git a/src/hb-null.hh b/src/hb-null.hh
index a3f0ea07..c91af163 100644
--- a/src/hb-null.hh
+++ b/src/hb-null.hh
@@ -120,10 +120,10 @@ struct hb_nonnull_ptr_t
   inline const T & operator * (void) const { return *get (); }
   inline T ** operator & (void) { return &v; }
   inline const T ** operator & (void) const { return &v; }
-  template <typename C>
-  inline operator C * (void) { return get (); }
-  template <typename C>
-  inline operator const C * (void) const { return get (); }
+  template <typename C> inline operator C * (void) { return get (); }
+  template <typename C> inline operator const C * (void) const { return get (); }
+  inline operator char * (void) { return (char *) get (); }
+  inline operator const char * (void) const { return (const char *) get (); }
   inline T * get (void) { return v ? v : const_cast<T *> (&Null(T)); }
   inline const T * get (void) const { return v ? v : const_cast<T *> (&Null(T)); }
   inline T * get_raw (void) { return v; }
commit 7430ff604aa54bedcb07cc1c2962eae85fcade76
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Sat Nov 3 15:59:13 2018 -0400

    Template casts in hb_nonnull_ptr_t

diff --git a/src/hb-null.hh b/src/hb-null.hh
index 151277ca..a3f0ea07 100644
--- a/src/hb-null.hh
+++ b/src/hb-null.hh
@@ -120,8 +120,10 @@ struct hb_nonnull_ptr_t
   inline const T & operator * (void) const { return *get (); }
   inline T ** operator & (void) { return &v; }
   inline const T ** operator & (void) const { return &v; }
-  inline operator T * (void) { return get (); }
-  inline operator const T * (void) const { return get (); }
+  template <typename C>
+  inline operator C * (void) { return get (); }
+  template <typename C>
+  inline operator const C * (void) const { return get (); }
   inline T * get (void) { return v ? v : const_cast<T *> (&Null(T)); }
   inline const T * get (void) const { return v ? v : const_cast<T *> (&Null(T)); }
   inline T * get_raw (void) { return v; }
commit da408fce98153e0fab3d82fe28813085feed0974
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Sat Nov 3 15:49:37 2018 -0400

    [blob] Allow null parent in create_sub_blob()
    
    Like font and unicode.

diff --git a/src/hb-blob.cc b/src/hb-blob.cc
index 4b036e80..9271200b 100644
--- a/src/hb-blob.cc
+++ b/src/hb-blob.cc
@@ -149,7 +149,7 @@ hb_blob_create_sub_blob (hb_blob_t    *parent,
 {
   hb_blob_t *blob;
 
-  if (!length || offset >= parent->length)
+  if (!length || !parent || offset >= parent->length)
     return hb_blob_get_empty ();
 
   hb_blob_make_immutable (parent);
commit fb0f30f55a5d654b2f1f9b99efa9b8abc51dbf34
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Sat Nov 3 15:24:14 2018 -0400

    Add hb_nonnull_ptr_t
    
    Towards fixing https://github.com/harfbuzz/harfbuzz/issues/1146

diff --git a/src/hb-null.hh b/src/hb-null.hh
index d5b74bf5..151277ca 100644
--- a/src/hb-null.hh
+++ b/src/hb-null.hh
@@ -103,4 +103,32 @@ struct CrapOrNull<const Type> {
 #define CrapOrNull(Type) CrapOrNull<Type>::get ()
 
 
+/*
+ * hb_nonnull_ptr_t
+ */
+
+template <typename P>
+struct hb_nonnull_ptr_t
+{
+  typedef typename hb_remove_pointer<P>::value T;
+
+  inline hb_nonnull_ptr_t (T *v_ = nullptr) : v (v_) {}
+  inline T * operator = (T *v_) { return v = v_; }
+  inline T * operator -> (void) { return get (); }
+  inline const T * operator -> (void) const { return get (); }
+  inline T & operator * (void) { return *get (); }
+  inline const T & operator * (void) const { return *get (); }
+  inline T ** operator & (void) { return &v; }
+  inline const T ** operator & (void) const { return &v; }
+  inline operator T * (void) { return get (); }
+  inline operator const T * (void) const { return get (); }
+  inline T * get (void) { return v ? v : const_cast<T *> (&Null(T)); }
+  inline const T * get (void) const { return v ? v : const_cast<T *> (&Null(T)); }
+  inline T * get_raw (void) { return v; }
+  inline const T * get_raw (void) const { return v; }
+
+  T *v;
+};
+
+
 #endif /* HB_NULL_HH */


More information about the HarfBuzz mailing list