[lookup] More prep work for memoizing collect_features

https://github.com/harfbuzz/harfbuzz/pull/1317
diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh
index 98f6a07..c9a87ce 100644
--- a/src/hb-ot-layout-common.hh
+++ b/src/hb-ot-layout-common.hh
@@ -277,6 +277,8 @@
   { return langSys.find_index (tag, index); }
 
   inline bool has_default_lang_sys (void) const { return defaultLangSys != 0; }
+  inline const LangSys& get_default_lang_sys (unsigned int i) const
+  { return get_default_lang_sys (); }
   inline const LangSys& get_default_lang_sys (void) const { return this+defaultLangSys; }
 
   inline bool subset (hb_subset_context_t *c) const
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index 338ca64..d4bb280 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -681,40 +681,38 @@
 }
 
 static void
-_hb_ot_layout_collect_features_features (hb_face_t      *face,
-                                         hb_tag_t        table_tag,
-                                         unsigned int    script_index,
-                                         unsigned int    language_index,
-                                         const hb_tag_t *features,
-                                         hb_set_t       *feature_indexes /* OUT */)
+langsys_collect_features (const OT::GSUBGPOS &g,
+			  const OT::LangSys  &l,
+			  const hb_tag_t     *features,
+			  hb_set_t           *feature_indexes /* OUT */)
 {
   if (!features)
   {
-    unsigned int required_feature_index;
-    if (hb_ot_layout_language_get_required_feature (face,
-						    table_tag,
-						    script_index,
-						    language_index,
-						    &required_feature_index,
-						    nullptr))
-      feature_indexes->add (required_feature_index);
+    /* All features. */
+    unsigned int index = l.get_required_feature_index ();
+    if (index != HB_OT_LAYOUT_NO_FEATURE_INDEX)
+      feature_indexes->add (index);
 
-    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);
   }
   else
   {
+    /* Ugh. Any faster way? */
     for (; *features; features++)
     {
+      hb_tag_t feature_tag = *features;
       unsigned int feature_index;
-      if (hb_ot_layout_language_find_feature (face,
-					      table_tag,
-					      script_index,
-					      language_index,
-					      *features,
-					      &feature_index))
-        feature_indexes->add (feature_index);
+      unsigned int num_features = l.get_feature_count ();
+      for (unsigned int i = 0; i < num_features; i++)
+      {
+	unsigned int feature_index = l.get_feature_index (i);
+
+	if (feature_tag == g.get_feature_tag (feature_index))
+	{
+	  feature_indexes->add (feature_index);
+	  break;
+	}
+      }
     }
   }
 }
@@ -727,27 +725,24 @@
                                           const hb_tag_t *features,
                                           hb_set_t       *feature_indexes /* OUT */)
 {
-  _hb_ot_layout_collect_features_features (face,
-                                           table_tag,
-                                           script_index,
-                                           HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX,
-                                           features,
-                                           feature_indexes);
-
+  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
   if (!languages)
   {
-    /* All languages */
+    /* All languages. */
+    langsys_collect_features (g,
+			      g.get_script (script_index).get_default_lang_sys (),
+			      features,
+			      feature_indexes);
+
     unsigned int count = hb_ot_layout_script_get_language_tags (face,
 								table_tag,
 								script_index,
 								0, nullptr, nullptr);
     for (unsigned int language_index = 0; language_index < count; language_index++)
-      _hb_ot_layout_collect_features_features (face,
-                                               table_tag,
-                                               script_index,
-                                               language_index,
-                                               features,
-                                               feature_indexes);
+      langsys_collect_features (g,
+				g.get_script (script_index).get_lang_sys (language_index),
+				features,
+				feature_indexes);
   }
   else
   {
@@ -760,12 +755,10 @@
 					       1,
 					       languages,
 					       &language_index))
-        _hb_ot_layout_collect_features_features (face,
-                                                 table_tag,
-                                                 script_index,
-                                                 language_index,
-                                                 features,
-                                                 feature_indexes);
+	langsys_collect_features (g,
+				  g.get_script (script_index).get_lang_sys (language_index),
+				  features,
+				  feature_indexes);
     }
   }
 }
@@ -785,7 +778,7 @@
 {
   if (!scripts)
   {
-    /* All scripts */
+    /* All scripts. */
     unsigned int count = hb_ot_layout_table_get_script_tags (face,
 							     table_tag,
 							     0, nullptr, nullptr);