[lookup] More prep work for memoizing collect_features
authorBehdad Esfahbod <behdad@behdad.org>
Fri, 26 Oct 2018 03:48:20 +0000 (20:48 -0700)
committerBehdad Esfahbod <behdad@behdad.org>
Fri, 26 Oct 2018 03:48:20 +0000 (20:48 -0700)
https://github.com/harfbuzz/harfbuzz/pull/1317

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

index 98f6a07..c9a87ce 100644 (file)
@@ -277,6 +277,8 @@ struct Script
   { 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
index 338ca64..d4bb280 100644 (file)
@@ -681,40 +681,38 @@ _hb_ot_layout_collect_lookups_lookups (hb_face_t      *face,
 }
 
 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);
-
-    const OT::GSUBGPOS &g = get_gsubgpos_table (face, table_tag);
-    const OT::LangSys &l = g.get_script (script_index).get_lang_sys (language_index);
+    /* All features. */
+    unsigned int index = l.get_required_feature_index ();
+    if (index != HB_OT_LAYOUT_NO_FEATURE_INDEX)
+      feature_indexes->add (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 @@ _hb_ot_layout_collect_features_languages (hb_face_t      *face,
                                           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 @@ _hb_ot_layout_collect_features_languages (hb_face_t      *face,
                                               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 @@ hb_ot_layout_collect_features (hb_face_t      *face,
 {
   if (!scripts)
   {
-    /* All scripts */
+    /* All scripts. */
     unsigned int count = hb_ot_layout_table_get_script_tags (face,
                                                             table_tag,
                                                             0, nullptr, nullptr);