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

Behdad Esfahbod behdad at kemper.freedesktop.org
Fri Oct 27 21:27:47 UTC 2017


 src/hb-glib.cc                     |   36 +++++++++++++++++++++-----
 src/hb-icu.cc                      |   51 ++++++++++++++++++++++++++-----------
 src/hb-open-type-private.hh        |   10 ++++---
 src/hb-ot-layout.cc                |    3 ++
 src/hb-ot-shape-complex-arabic.cc  |    1 
 src/hb-ot-shape-complex-default.cc |    1 
 src/hb-ot-shape-complex-hangul.cc  |    1 
 src/hb-ot-shape-complex-hebrew.cc  |    1 
 src/hb-ot-shape-complex-indic.cc   |    1 
 src/hb-ot-shape-complex-myanmar.cc |    2 -
 src/hb-ot-shape-complex-private.hh |    2 -
 src/hb-ot-shape-complex-thai.cc    |    1 
 src/hb-ot-shape-complex-tibetan.cc |    1 
 src/hb-ot-shape-complex-use.cc     |    1 
 src/hb-private.hh                  |    2 -
 src/hb-ucdn.cc                     |   37 +++++++++++++++++++++-----
 src/main.cc                        |    1 
 17 files changed, 106 insertions(+), 46 deletions(-)

New commits:
commit 8864864b624590d95ae5dca61956695cbff1269a
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Oct 27 15:26:45 2017 -0600

    [glib/icu/ucdn] Make the funcs object allocated on demand

diff --git a/src/hb-glib.cc b/src/hb-glib.cc
index 5b0a1eb3..c8863ea7 100644
--- a/src/hb-glib.cc
+++ b/src/hb-glib.cc
@@ -364,22 +364,44 @@ hb_glib_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs HB_UNUSED,
   return utf8_decomposed_len;
 }
 
+static hb_unicode_funcs_t *static_glib_funcs = nullptr;
+
+#ifdef HB_USE_ATEXIT
+static
+void free_static_glib_funcs (void)
+{
+  hb_unicode_funcs_destroy (static_glib_funcs);
+}
+#endif
+
 hb_unicode_funcs_t *
 hb_glib_get_unicode_funcs (void)
 {
-  static const hb_unicode_funcs_t _hb_glib_unicode_funcs = {
-    HB_OBJECT_HEADER_STATIC,
+retry:
+  hb_unicode_funcs_t *funcs = (hb_unicode_funcs_t *) hb_atomic_ptr_get (&static_glib_funcs);
 
-    nullptr, /* parent */
-    true, /* immutable */
-    {
-#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_glib_unicode_##name,
+  if (unlikely (!funcs))
+  {
+    funcs = hb_unicode_funcs_create (nullptr);
+
+#define HB_UNICODE_FUNC_IMPLEMENT(name) \
+    hb_unicode_funcs_set_##name##_func (funcs, hb_glib_unicode_##name, nullptr, nullptr);
       HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_UNICODE_FUNC_IMPLEMENT
+
+    hb_unicode_funcs_make_immutable (funcs);
+
+    if (!hb_atomic_ptr_cmpexch (&static_glib_funcs, nullptr, funcs)) {
+      hb_unicode_funcs_destroy (funcs);
+      goto retry;
     }
+
+#ifdef HB_USE_ATEXIT
+    atexit (free_static_glib_funcs); /* First person registers atexit() callback. */
+#endif
   };
 
-  return const_cast<hb_unicode_funcs_t *> (&_hb_glib_unicode_funcs);
+  return funcs;
 }
 
 #if GLIB_CHECK_VERSION(2,31,10)
diff --git a/src/hb-icu.cc b/src/hb-icu.cc
index 01d15f48..2550e438 100644
--- a/src/hb-icu.cc
+++ b/src/hb-icu.cc
@@ -345,27 +345,50 @@ hb_icu_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs HB_UNUSED,
 }
 
 
+static hb_unicode_funcs_t *static_icu_funcs = nullptr;
+
+#ifdef HB_USE_ATEXIT
+static
+void free_static_icu_funcs (void)
+{
+  hb_unicode_funcs_destroy (static_icu_funcs);
+}
+#endif
+
 hb_unicode_funcs_t *
 hb_icu_get_unicode_funcs (void)
 {
-  static const hb_unicode_funcs_t _hb_icu_unicode_funcs = {
-    HB_OBJECT_HEADER_STATIC,
+retry:
+  hb_unicode_funcs_t *funcs = (hb_unicode_funcs_t *) hb_atomic_ptr_get (&static_icu_funcs);
+
+  if (unlikely (!funcs))
+  {
+#if U_ICU_VERSION_MAJOR_NUM >= 49
+    if (!hb_atomic_ptr_get (&normalizer)) {
+      UErrorCode icu_err = U_ZERO_ERROR;
+      /* We ignore failure in getNFCInstace(). */
+      (void) hb_atomic_ptr_cmpexch (&normalizer, nullptr, unorm2_getNFCInstance (&icu_err));
+    }
+#endif
 
-    nullptr, /* parent */
-    true, /* immutable */
-    {
-#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_icu_unicode_##name,
+    funcs = hb_unicode_funcs_create (nullptr);
+
+#define HB_UNICODE_FUNC_IMPLEMENT(name) \
+    hb_unicode_funcs_set_##name##_func (funcs, hb_icu_unicode_##name, nullptr, nullptr);
       HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_UNICODE_FUNC_IMPLEMENT
+
+    hb_unicode_funcs_make_immutable (funcs);
+
+    if (!hb_atomic_ptr_cmpexch (&static_icu_funcs, nullptr, funcs)) {
+      hb_unicode_funcs_destroy (funcs);
+      goto retry;
     }
-  };
 
-#if U_ICU_VERSION_MAJOR_NUM >= 49
-  if (!hb_atomic_ptr_get (&normalizer)) {
-    UErrorCode icu_err = U_ZERO_ERROR;
-    /* We ignore failure in getNFCInstace(). */
-    (void) hb_atomic_ptr_cmpexch (&normalizer, nullptr, unorm2_getNFCInstance (&icu_err));
-  }
+#ifdef HB_USE_ATEXIT
+    atexit (free_static_icu_funcs); /* First person registers atexit() callback. */
 #endif
-  return const_cast<hb_unicode_funcs_t *> (&_hb_icu_unicode_funcs);
+  };
+
+  return funcs;
 }
diff --git a/src/hb-ucdn.cc b/src/hb-ucdn.cc
index c237ee82..e51f0353 100644
--- a/src/hb-ucdn.cc
+++ b/src/hb-ucdn.cc
@@ -231,22 +231,43 @@ hb_ucdn_decompose_compatibility(hb_unicode_funcs_t *ufuncs HB_UNUSED,
     return ucdn_compat_decompose(u, decomposed);
 }
 
+static hb_unicode_funcs_t *static_ucdn_funcs = nullptr;
+
+#ifdef HB_USE_ATEXIT
+static
+void free_static_ucdn_funcs (void)
+{
+  hb_unicode_funcs_destroy (static_ucdn_funcs);
+}
+#endif
+
 extern "C" HB_INTERNAL
 hb_unicode_funcs_t *
 hb_ucdn_get_unicode_funcs (void)
 {
-  static const hb_unicode_funcs_t _hb_ucdn_unicode_funcs = {
-    HB_OBJECT_HEADER_STATIC,
+retry:
+  hb_unicode_funcs_t *funcs = (hb_unicode_funcs_t *) hb_atomic_ptr_get (&static_ucdn_funcs);
+
+  if (unlikely (!funcs))
+  {
+    funcs = hb_unicode_funcs_create (nullptr);
 
-    nullptr, /* parent */
-    true, /* immutable */
-    {
-#define HB_UNICODE_FUNC_IMPLEMENT(name) hb_ucdn_##name,
+#define HB_UNICODE_FUNC_IMPLEMENT(name) \
+    hb_unicode_funcs_set_##name##_func (funcs, hb_ucdn_##name, nullptr, nullptr);
       HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS
 #undef HB_UNICODE_FUNC_IMPLEMENT
+
+    hb_unicode_funcs_make_immutable (funcs);
+
+    if (!hb_atomic_ptr_cmpexch (&static_ucdn_funcs, nullptr, funcs)) {
+      hb_unicode_funcs_destroy (funcs);
+      goto retry;
     }
+
+#ifdef HB_USE_ATEXIT
+    atexit (free_static_ucdn_funcs); /* First person registers atexit() callback. */
+#endif
   };
 
-  return const_cast<hb_unicode_funcs_t *> (&_hb_ucdn_unicode_funcs);
+  return funcs;
 }
-
commit af3f72f9eb7d7b80ea827976a3303390b5deae8d
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Oct 27 15:13:50 2017 -0600

    Correctly mark NullPool const
    
    Saves some more code size as well!

diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index f1c90474..a49071d2 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -133,7 +133,7 @@ static inline Type& StructAfter(TObject &X)
 
 #define HB_NULL_POOL_SIZE 264
 static_assert (HB_NULL_POOL_SIZE % sizeof (void *) == 0, "Align HB_NULL_POOL_SIZE.");
-extern HB_INTERNAL const void *_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)];
+extern HB_INTERNAL const void * const _hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)];
 
 /* Generic nul-content Null objects. */
 template <typename Type>
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index 4850f720..df43c29e 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -39,7 +39,7 @@
 #include "hb-ot-map-private.hh"
 
 
-const void *OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)];
+const void * const OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 
 
 hb_ot_layout_t *
diff --git a/src/main.cc b/src/main.cc
index eb1711ed..377d1396 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -38,7 +38,7 @@
 
 using namespace OT;
 
-const void *OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)];
+const void * const OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)] = {};
 
 int
 main (int argc, char **argv)
commit 51f4d4d5cd5a0dd1a581bee5b55b3cc0a74cbea3
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Oct 27 15:09:22 2017 -0600

    Reduce prealloced number of user-data items from 2 to 1
    
    Even 1 is too many but putting 0 breaks compile.  Saves 3k in .so

diff --git a/src/hb-private.hh b/src/hb-private.hh
index a6b3ab8c..ab6511dc 100644
--- a/src/hb-private.hh
+++ b/src/hb-private.hh
@@ -545,7 +545,7 @@ struct hb_auto_array_t : hb_prealloced_array_t <Type>
 template <typename item_t, typename lock_t>
 struct hb_lockable_set_t
 {
-  hb_prealloced_array_t <item_t, 2> items;
+  hb_prealloced_array_t <item_t, 1> items;
 
   inline void init (void) { items.init (); }
 
commit 3205de7906abab9d12e614e86e2c182a41420698
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Oct 27 15:01:40 2017 -0600

    Make the NullPool HB_INTERNAL shared
    
    Saves 2k of .bss section.

diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh
index f0ff2ff5..f1c90474 100644
--- a/src/hb-open-type-private.hh
+++ b/src/hb-open-type-private.hh
@@ -130,14 +130,16 @@ static inline Type& StructAfter(TObject &X)
  */
 
 /* Global nul-content Null pool.  Enlarge as necessary. */
-/* TODO This really should be a extern HB_INTERNAL and defined somewhere... */
-static const void *_NullPool[(256+8) / sizeof (void *)];
+
+#define HB_NULL_POOL_SIZE 264
+static_assert (HB_NULL_POOL_SIZE % sizeof (void *) == 0, "Align HB_NULL_POOL_SIZE.");
+extern HB_INTERNAL const void *_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)];
 
 /* Generic nul-content Null objects. */
 template <typename Type>
 static inline const Type& Null (void) {
-  static_assert ((sizeof (Type) <= sizeof (_NullPool)), "");
-  return *CastP<Type> (_NullPool);
+  static_assert (sizeof (Type) <= HB_NULL_POOL_SIZE, "Increase HB_NULL_POOL_SIZE.");
+  return *CastP<Type> (_hb_NullPool);
 }
 
 /* Specializaiton for arbitrary-content arbitrary-sized Null objects. */
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index 71e78268..4850f720 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -39,6 +39,9 @@
 #include "hb-ot-map-private.hh"
 
 
+const void *OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)];
+
+
 hb_ot_layout_t *
 _hb_ot_layout_create (hb_face_t *face)
 {
diff --git a/src/main.cc b/src/main.cc
index 93c3b46a..eb1711ed 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -38,6 +38,7 @@
 
 using namespace OT;
 
+const void *OT::_hb_NullPool[HB_NULL_POOL_SIZE / sizeof (void *)];
 
 int
 main (int argc, char **argv)
commit 7036f1d22c4001b79d3205c16aac3fefbfcaae24
Author: Behdad Esfahbod <behdad at behdad.org>
Date:   Fri Oct 27 14:42:59 2017 -0600

    [ot] Remove shaper name
    
    In ten years we never used them...

diff --git a/src/hb-ot-shape-complex-arabic.cc b/src/hb-ot-shape-complex-arabic.cc
index 4a92d410..a303fc13 100644
--- a/src/hb-ot-shape-complex-arabic.cc
+++ b/src/hb-ot-shape-complex-arabic.cc
@@ -689,7 +689,6 @@ reorder_marks_arabic (const hb_ot_shape_plan_t *plan,
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic =
 {
-  "arabic",
   collect_features_arabic,
   nullptr, /* override_features */
   data_create_arabic,
diff --git a/src/hb-ot-shape-complex-default.cc b/src/hb-ot-shape-complex-default.cc
index 99b53a5a..68a62a10 100644
--- a/src/hb-ot-shape-complex-default.cc
+++ b/src/hb-ot-shape-complex-default.cc
@@ -29,7 +29,6 @@
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
 {
-  "default",
   nullptr, /* collect_features */
   nullptr, /* override_features */
   nullptr, /* data_create */
diff --git a/src/hb-ot-shape-complex-hangul.cc b/src/hb-ot-shape-complex-hangul.cc
index 0f3337ff..7508c223 100644
--- a/src/hb-ot-shape-complex-hangul.cc
+++ b/src/hb-ot-shape-complex-hangul.cc
@@ -414,7 +414,6 @@ setup_masks_hangul (const hb_ot_shape_plan_t *plan,
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hangul =
 {
-  "hangul",
   collect_features_hangul,
   override_features_hangul,
   data_create_hangul,
diff --git a/src/hb-ot-shape-complex-hebrew.cc b/src/hb-ot-shape-complex-hebrew.cc
index fccd76a4..ba78186a 100644
--- a/src/hb-ot-shape-complex-hebrew.cc
+++ b/src/hb-ot-shape-complex-hebrew.cc
@@ -169,7 +169,6 @@ disable_otl_hebrew (const hb_ot_shape_plan_t *plan)
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_hebrew =
 {
-  "hebrew",
   nullptr, /* collect_features */
   nullptr, /* override_features */
   nullptr, /* data_create */
diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 05a51369..1937380b 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -1843,7 +1843,6 @@ compose_indic (const hb_ot_shape_normalize_context_t *c,
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_indic =
 {
-  "indic",
   collect_features_indic,
   override_features_indic,
   data_create_indic,
diff --git a/src/hb-ot-shape-complex-myanmar.cc b/src/hb-ot-shape-complex-myanmar.cc
index f446fe62..5ea1dbff 100644
--- a/src/hb-ot-shape-complex-myanmar.cc
+++ b/src/hb-ot-shape-complex-myanmar.cc
@@ -512,7 +512,6 @@ final_reordering (const hb_ot_shape_plan_t *plan,
  * generic shaper, except that it zeros mark advances GDEF_LATE. */
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar_old =
 {
-  "default",
   nullptr, /* collect_features */
   nullptr, /* override_features */
   nullptr, /* data_create */
@@ -531,7 +530,6 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar_old =
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_myanmar =
 {
-  "myanmar",
   collect_features_myanmar,
   override_features_myanmar,
   nullptr, /* data_create */
diff --git a/src/hb-ot-shape-complex-private.hh b/src/hb-ot-shape-complex-private.hh
index 4951cb5f..fb2f6115 100644
--- a/src/hb-ot-shape-complex-private.hh
+++ b/src/hb-ot-shape-complex-private.hh
@@ -65,8 +65,6 @@ enum hb_ot_shape_zero_width_marks_type_t {
 
 struct hb_ot_complex_shaper_t
 {
-  char name[8];
-
   /* collect_features()
    * Called during shape_plan().
    * Shapers should use plan->map to add their features and callbacks.
diff --git a/src/hb-ot-shape-complex-thai.cc b/src/hb-ot-shape-complex-thai.cc
index 58a0a41e..6ba925c6 100644
--- a/src/hb-ot-shape-complex-thai.cc
+++ b/src/hb-ot-shape-complex-thai.cc
@@ -366,7 +366,6 @@ preprocess_text_thai (const hb_ot_shape_plan_t *plan,
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_thai =
 {
-  "thai",
   nullptr, /* collect_features */
   nullptr, /* override_features */
   nullptr, /* data_create */
diff --git a/src/hb-ot-shape-complex-tibetan.cc b/src/hb-ot-shape-complex-tibetan.cc
index e87f1a4e..eaac0bf6 100644
--- a/src/hb-ot-shape-complex-tibetan.cc
+++ b/src/hb-ot-shape-complex-tibetan.cc
@@ -46,7 +46,6 @@ collect_features_tibetan (hb_ot_shape_planner_t *plan)
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_tibetan =
 {
-  "default",
   collect_features_tibetan,
   nullptr, /* override_features */
   nullptr, /* data_create */
diff --git a/src/hb-ot-shape-complex-use.cc b/src/hb-ot-shape-complex-use.cc
index a2cacac5..62acd697 100644
--- a/src/hb-ot-shape-complex-use.cc
+++ b/src/hb-ot-shape-complex-use.cc
@@ -595,7 +595,6 @@ compose_use (const hb_ot_shape_normalize_context_t *c,
 
 const hb_ot_complex_shaper_t _hb_ot_complex_shaper_use =
 {
-  "use",
   collect_features_use,
   nullptr, /* override_features */
   data_create_use,


More information about the HarfBuzz mailing list