[subset] use add_array to populate feature_indexes.
authorGarret Rieger <grieger@google.com>
Tue, 31 Jul 2018 01:10:43 +0000 (18:10 -0700)
committerGarret Rieger <grieger@google.com>
Wed, 1 Aug 2018 01:26:09 +0000 (18:26 -0700)
This is much faster then calling a bunch of individual add()'s.

src/hb-ot-layout-common-private.hh
src/hb-ot-layout.cc

index 1cf530e..76ad30c 100644 (file)
@@ -190,6 +190,11 @@ struct IndexArray : ArrayOf<Index>
     }
     return this->len;
   }
+
+  inline void add_indexes_to (hb_set_t* output /* OUT */) const
+  {
+    output->add_array (arrayZ, len);
+  }
 };
 
 
@@ -208,6 +213,8 @@ struct LangSys
                                           unsigned int *feature_count /* IN/OUT */,
                                           unsigned int *feature_indexes /* OUT */) const
   { return featureIndex.get_indexes (start_offset, feature_count, feature_indexes); }
+  inline void add_feature_indexes_to (hb_set_t *feature_indexes) const
+  { featureIndex.add_indexes_to (feature_indexes); }
 
   inline bool has_required_feature (void) const { return reqFeatureIndex != 0xFFFFu; }
   inline unsigned int get_required_feature_index (void) const
index 7b30fc7..db78234 100644 (file)
@@ -520,6 +520,19 @@ hb_ot_layout_language_get_required_feature (hb_face_t    *face,
   return l.has_required_feature ();
 }
 
+static void
+_hb_ot_layout_language_add_feature_indexes_to (hb_face_t    *face,
+                                               hb_tag_t      table_tag,
+                                               unsigned int  script_index,
+                                               unsigned int  language_index,
+                                               hb_set_t     *feature_indexes /* OUT */)
+{
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+  const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
+  l.add_feature_indexes_to (feature_indexes);
+}
+
+
 unsigned int
 hb_ot_layout_language_get_feature_indexes (hb_face_t    *face,
                                           hb_tag_t      table_tag,
@@ -677,24 +690,11 @@ _hb_ot_layout_collect_features_features (hb_face_t      *face,
       feature_indexes->add (required_feature_index);
 
     /* All features */
-    unsigned int feature_indices[32];
-    unsigned int offset, len;
-
-    offset = 0;
-    do {
-      len = ARRAY_LENGTH (feature_indices);
-      hb_ot_layout_language_get_feature_indexes (face,
-                                                table_tag,
-                                                script_index,
-                                                language_index,
-                                                offset, &len,
-                                                feature_indices);
-
-      for (unsigned int i = 0; i < len; i++)
-        feature_indexes->add (feature_indices[i]);
-
-      offset += len;
-    } while (len == ARRAY_LENGTH (feature_indices));
+    _hb_ot_layout_language_add_feature_indexes_to (face,
+                                                   table_tag,
+                                                   script_index,
+                                                   language_index,
+                                                   feature_indexes);
   }
   else
   {
@@ -763,9 +763,9 @@ _hb_ot_layout_collect_features_languages (hb_face_t      *face,
 }
 
 /**
- * hb_ot_layout_collect_lookups:
+ * hb_ot_layout_collect_features:
  *
- * Since: 0.9.8
+ * Since: REPLACEME
  **/
 void
 hb_ot_layout_collect_features (hb_face_t      *face,