src/hb-ot-layout.cc |   97 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/hb-ot-layout.h  |    4 --
 2 files changed, 98 insertions(+), 3 deletions(-)

New commits:
commit a88e7160217b9f44e4e5b4b814d0ca98c457ee40
Author: Behdad Esfahbod <[email protected]>
Date:   Sat Nov 24 02:31:02 2012 -0500

    [OTLayout] Implement hb_ot_layout_collect_lookups()
    
    Untested.

diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index 022460a..11d3060 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -401,6 +401,103 @@ hb_ot_layout_feature_get_lookups (hb_face_t    *face,
   return f.get_lookup_indexes (start_offset, lookup_count, lookup_indexes);
 }
 
+static void
+_hb_ot_layout_collect_lookups_lookups (hb_face_t      *face,
+                                      hb_tag_t        table_tag,
+                                      unsigned int    feature_index,
+                                      hb_set_t       *lookup_indexes /* OUT */)
+{
+  unsigned int lookup_indices[32];
+  unsigned int offset, len;
+
+  offset = 0;
+  do {
+    len = ARRAY_LENGTH (lookup_indices);
+    hb_ot_layout_feature_get_lookups (face,
+                                     table_tag,
+                                     feature_index,
+                                     offset, &len,
+                                     lookup_indices);
+
+    for (unsigned int i = 0; i < len; i++)
+      lookup_indexes->add (lookup_indices[i]);
+
+    offset += len;
+  } while (len == ARRAY_LENGTH (lookup_indices));
+}
+
+static void
+_hb_ot_layout_collect_lookups_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       *lookup_indexes /* OUT 
*/)
+{
+  if (!features)
+  {
+    /* All features */
+    unsigned int count = hb_ot_layout_language_get_feature_tags (face, 
table_tag, script_index, language_index, 0, NULL, NULL);
+    for (unsigned int feature_index = 0; feature_index < count; 
feature_index++)
+      _hb_ot_layout_collect_lookups_lookups (face, table_tag, feature_index, 
lookup_indexes);
+  } else {
+    for (; *features; features++)
+    {
+      unsigned int feature_index;
+      if (hb_ot_layout_language_find_feature (face, table_tag, script_index, 
language_index, *features, &feature_index))
+        _hb_ot_layout_collect_lookups_lookups (face, table_tag, feature_index, 
lookup_indexes);
+    }
+  }
+}
+
+static void
+_hb_ot_layout_collect_lookups_languages (hb_face_t      *face,
+                                        hb_tag_t        table_tag,
+                                        unsigned int    script_index,
+                                        const hb_tag_t *languages,
+                                        const hb_tag_t *features,
+                                        hb_set_t       *lookup_indexes /* OUT 
*/)
+{
+  if (!languages)
+  {
+    /* All languages */
+    unsigned int count = hb_ot_layout_script_get_language_tags (face, 
table_tag, script_index, 0, NULL, NULL);
+    for (unsigned int language_index = 0; language_index < count; 
language_index++)
+      _hb_ot_layout_collect_lookups_features (face, table_tag, script_index, 
language_index, features, lookup_indexes);
+  } else {
+    for (; *languages; languages++)
+    {
+      unsigned int language_index;
+      if (hb_ot_layout_script_find_language (face, table_tag, script_index, 
*languages, &language_index))
+        _hb_ot_layout_collect_lookups_features (face, table_tag, script_index, 
language_index, features, lookup_indexes);
+    }
+  }
+}
+
+void
+hb_ot_layout_collect_lookups (hb_face_t      *face,
+                             hb_tag_t        table_tag,
+                             const hb_tag_t *scripts,
+                             const hb_tag_t *languages,
+                             const hb_tag_t *features,
+                             hb_set_t       *lookup_indexes /* OUT */)
+{
+  if (!scripts)
+  {
+    /* All scripts */
+    unsigned int count = hb_ot_layout_table_get_script_tags (face, table_tag, 
0, NULL, NULL);
+    for (unsigned int script_index = 0; script_index < count; script_index++)
+      _hb_ot_layout_collect_lookups_languages (face, table_tag, script_index, 
languages, features, lookup_indexes);
+  } else {
+    for (; *scripts; scripts++)
+    {
+      unsigned int script_index;
+      if (hb_ot_layout_table_find_script (face, table_tag, *scripts, 
&script_index))
+        _hb_ot_layout_collect_lookups_languages (face, table_tag, 
script_index, languages, features, lookup_indexes);
+    }
+  }
+}
+
 void
 hb_ot_layout_lookup_collect_glyphs (hb_face_t    *face,
                                    hb_tag_t      table_tag,
diff --git a/src/hb-ot-layout.h b/src/hb-ot-layout.h
index f97c893..ed7298c 100644
--- a/src/hb-ot-layout.h
+++ b/src/hb-ot-layout.h
@@ -179,15 +179,13 @@ hb_ot_layout_feature_get_lookups (hb_face_t    *face,
                                  unsigned int *lookup_count /* IN/OUT */,
                                  unsigned int *lookup_indexes /* OUT */);
 
-#ifdef HB_NOT_IMPLEMENTED
 void
-Xhb_ot_layout_collect_lookups (hb_face_t      *face,
+hb_ot_layout_collect_lookups (hb_face_t      *face,
                              hb_tag_t        table_tag,
                              const hb_tag_t *scripts,
                              const hb_tag_t *languages,
                              const hb_tag_t *features,
                              hb_set_t       *lookup_indexes /* OUT */);
-#endif
 
 void
 hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan,
_______________________________________________
HarfBuzz mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/harfbuzz

Reply via email to