[layout] Add hb_collect_features_context_t

Towards https://github.com/harfbuzz/harfbuzz/pull/1317
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index ece7f89..aa1a357 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -655,20 +655,32 @@
   return get_gsubgpos_table (face, table_tag).get_lookup_count ();
 }
 
+
+struct hb_collect_features_context_t
+{
+  hb_collect_features_context_t (hb_face_t       *face,
+				 hb_tag_t         table_tag,
+				 hb_set_t        *feature_indexes_)
+    : g (get_gsubgpos_table (face, table_tag)),
+      feature_indexes (feature_indexes_) {}
+
+  const OT::GSUBGPOS &g;
+  hb_set_t           *feature_indexes;
+};
+
 static void
-langsys_collect_features (const OT::GSUBGPOS &g,
+langsys_collect_features (hb_collect_features_context_t *c,
 			  const OT::LangSys  &l,
-			  const hb_tag_t     *features,
-			  hb_set_t           *feature_indexes /* OUT */)
+			  const hb_tag_t     *features)
 {
   if (!features)
   {
     /* All features. */
     unsigned int index = l.get_required_feature_index ();
     if (index != HB_OT_LAYOUT_NO_FEATURE_INDEX)
-      feature_indexes->add (index);
+      c->feature_indexes->add (index);
 
-    l.add_feature_indexes_to (feature_indexes);
+    l.add_feature_indexes_to (c->feature_indexes);
   }
   else
   {
@@ -682,9 +694,9 @@
       {
 	unsigned int feature_index = l.get_feature_index (i);
 
-	if (feature_tag == g.get_feature_tag (feature_index))
+	if (feature_tag == c->g.get_feature_tag (feature_index))
 	{
-	  feature_indexes->add (feature_index);
+	  c->feature_indexes->add (feature_index);
 	  break;
 	}
       }
@@ -693,26 +705,23 @@
 }
 
 static void
-script_collect_features (const OT::GSUBGPOS &g,
+script_collect_features (hb_collect_features_context_t *c,
 			 const OT::Script   &s,
 			 const hb_tag_t *languages,
-			 const hb_tag_t *features,
-			 hb_set_t       *feature_indexes /* OUT */)
+			 const hb_tag_t *features)
 {
   if (!languages)
   {
     /* All languages. */
-    langsys_collect_features (g,
+    langsys_collect_features (c,
 			      s.get_default_lang_sys (),
-			      features,
-			      feature_indexes);
+			      features);
 
     unsigned int count = s.get_lang_sys_count ();
     for (unsigned int language_index = 0; language_index < count; language_index++)
-      langsys_collect_features (g,
+      langsys_collect_features (c,
 				s.get_lang_sys (language_index),
-				features,
-				feature_indexes);
+				features);
   }
   else
   {
@@ -720,10 +729,9 @@
     {
       unsigned int language_index;
       if (s.find_lang_sys_index (*languages, &language_index))
-	langsys_collect_features (g,
+	langsys_collect_features (c,
 				  s.get_lang_sys (language_index),
-				  features,
-				  feature_indexes);
+				  features);
     }
   }
 }
@@ -741,29 +749,27 @@
                                const hb_tag_t *features,
                                hb_set_t       *feature_indexes /* OUT */)
 {
-  const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
+  hb_collect_features_context_t c (face, table_tag, feature_indexes);
   if (!scripts)
   {
     /* All scripts. */
-    unsigned int count = g.get_script_count ();
+    unsigned int count = c.g.get_script_count ();
     for (unsigned int script_index = 0; script_index < count; script_index++)
-      script_collect_features (g,
-			       g.get_script (script_index),
+      script_collect_features (&c,
+			       c.g.get_script (script_index),
 			       languages,
-			       features,
-			       feature_indexes);
+			       features);
   }
   else
   {
     for (; *scripts; scripts++)
     {
       unsigned int script_index;
-      if (g.find_script_index (*scripts, &script_index))
-	script_collect_features (g,
-				 g.get_script (script_index),
+      if (c.g.find_script_index (*scripts, &script_index))
+	script_collect_features (&c,
+				 c.g.get_script (script_index),
 				 languages,
-				 features,
-				 feature_indexes);
+				 features);
     }
   }
 }