Commit 90461c0137e5369fc0fdcaffc4abd640a9591cd3

Behdad Esfahbod 2017-10-14T08:42:07

[afshaper] Delay creating `hb_set' objects until needed. In runs on Noto Naskh Arabic, this results in 89 sets created instead of 340 before. Makes auto-hinter setup with HarfBuzz enabled 20% to 30% faster. * src/autofit/afshaper.c (af_shaper_get_coverage): Implement it.

diff --git a/ChangeLog b/ChangeLog
index 2f8d322..4cc182a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2017-10-14  Behdad Esfahbod  <behdad@behdad.org>
+
+	[afshaper] Delay creating `hb_set' objects until needed.
+
+	In runs on Noto Naskh Arabic, this results in 89 sets created
+	instead of 340 before.  Makes auto-hinter setup with HarfBuzz
+	enabled 20% to 30% faster.
+
+	* src/autofit/afshaper.c (af_shaper_get_coverage): Implement it.
+
 2017-10-12  Ewald Hew  <ewaldhew@gmail.com>
 
 	[type1, cid] Add hinting engine switch.
diff --git a/src/autofit/afshaper.c b/src/autofit/afshaper.c
index d259964..8ee9ba1 100644
--- a/src/autofit/afshaper.c
+++ b/src/autofit/afshaper.c
@@ -104,10 +104,10 @@
   {
     hb_face_t*  face;
 
-    hb_set_t*  gsub_lookups;  /* GSUB lookups for a given script */
-    hb_set_t*  gsub_glyphs;   /* glyphs covered by GSUB lookups  */
-    hb_set_t*  gpos_lookups;  /* GPOS lookups for a given script */
-    hb_set_t*  gpos_glyphs;   /* glyphs covered by GPOS lookups  */
+    hb_set_t*  gsub_lookups = NULL; /* GSUB lookups for a given script */
+    hb_set_t*  gsub_glyphs  = NULL; /* glyphs covered by GSUB lookups  */
+    hb_set_t*  gpos_lookups = NULL; /* GPOS lookups for a given script */
+    hb_set_t*  gpos_glyphs  = NULL; /* glyphs covered by GPOS lookups  */
 
     hb_script_t      script;
     const hb_tag_t*  coverage_tags;
@@ -127,11 +127,6 @@
 
     face = hb_font_get_face( globals->hb_font );
 
-    gsub_lookups = hb_set_create();
-    gsub_glyphs  = hb_set_create();
-    gpos_lookups = hb_set_create();
-    gpos_glyphs  = hb_set_create();
-
     coverage_tags = coverages[style_class->coverage];
     script        = scripts[style_class->script];
 
@@ -168,6 +163,7 @@
         script_tags[1] = HB_TAG_NONE;
     }
 
+    gsub_lookups = hb_set_create();
     hb_ot_layout_collect_lookups( face,
                                   HB_OT_TAG_GSUB,
                                   script_tags,
@@ -178,13 +174,6 @@
     if ( hb_set_is_empty( gsub_lookups ) )
       goto Exit; /* nothing to do */
 
-    hb_ot_layout_collect_lookups( face,
-                                  HB_OT_TAG_GPOS,
-                                  script_tags,
-                                  NULL,
-                                  coverage_tags,
-                                  gpos_lookups );
-
     FT_TRACE4(( "GSUB lookups (style `%s'):\n"
                 " ",
                 af_style_names[style_class->style] ));
@@ -193,6 +182,7 @@
     count = 0;
 #endif
 
+    gsub_glyphs = hb_set_create();
     for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, &idx ); )
     {
 #ifdef FT_DEBUG_LEVEL_TRACE
@@ -220,10 +210,19 @@
                 " ",
                 af_style_names[style_class->style] ));
 
+    gpos_lookups = hb_set_create();
+    hb_ot_layout_collect_lookups( face,
+                                  HB_OT_TAG_GPOS,
+                                  script_tags,
+                                  NULL,
+                                  coverage_tags,
+                                  gpos_lookups );
+
 #ifdef FT_DEBUG_LEVEL_TRACE
     count = 0;
 #endif
 
+    gpos_glyphs = hb_set_create();
     for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gpos_lookups, &idx ); )
     {
 #ifdef FT_DEBUG_LEVEL_TRACE