[subset] Switch building of glyph maps in subset plan to use iterators.
authorGarret Rieger <grieger@google.com>
Wed, 8 May 2019 23:33:03 +0000 (16:33 -0700)
committerGarret Rieger <grieger@google.com>
Thu, 9 May 2019 21:52:01 +0000 (14:52 -0700)
src/hb-algs.hh
src/hb-subset-plan.cc

index ca70755..dbb0805 100644 (file)
@@ -218,9 +218,7 @@ struct hb_pair_t
   hb_pair_t (const pair_t& o) : first (o.first), second (o.second) {}
 
   hb_pair_t<T1, T2> reverse () const
-  {
-    return hb_pair_t<T1, T2> (second, first);
-  }
+  { return hb_pair_t<T1, T2> (second, first); }
 
   bool operator == (const pair_t& o) const { return first == o.first && second == o.second; }
 
index 901347b..66976fa 100644 (file)
@@ -153,36 +153,36 @@ _populate_gids_to_retain (hb_face_t *face,
 }
 
 static void
-_create_old_gid_to_new_gid_map (const hb_face_t                   *face,
-                                bool                               retain_gids,
-                               hb_set_t                          *all_gids_to_retain,
-                                hb_map_t                          *glyph_map, /* OUT */
-                                hb_map_t                          *reverse_glyph_map, /* OUT */
-                                unsigned int                      *num_glyphs /* OUT */)
+_create_old_gid_to_new_gid_map (const hb_face_t *face,
+                                bool             retain_gids,
+                               const hb_set_t  *all_gids_to_retain,
+                                hb_map_t        *glyph_map, /* OUT */
+                                hb_map_t        *reverse_glyph_map, /* OUT */
+                                unsigned int    *num_glyphs /* OUT */)
 {
-  hb_codepoint_t gid = HB_SET_VALUE_INVALID;
-  unsigned int length = 0;
-  for (unsigned int i = 0; all_gids_to_retain->next (&gid); i++) {
-    if (!retain_gids)
-    {
-      glyph_map->set (gid, i);
-      reverse_glyph_map->set (i, gid);
-    }
-    else
-    {
-      glyph_map->set (gid, gid);
-      reverse_glyph_map->set (gid, gid);
-    }
-    ++length;
-  }
-  if (!retain_gids || length == 0)
-  {
-    *num_glyphs = length;
-  }
-  else
+  if (!retain_gids)
   {
+    + hb_enumerate (hb_iter (all_gids_to_retain), (hb_codepoint_t) 0)
+    | hb_sink (reverse_glyph_map)
+    ;
+    *num_glyphs = reverse_glyph_map->get_population ();
+  } else {
+    + hb_iter (all_gids_to_retain)
+    | hb_map ([=] (hb_codepoint_t _) {
+               return hb_pair_t<hb_codepoint_t, hb_codepoint_t> (_, _);
+             })
+    | hb_sink (reverse_glyph_map);
+    ;
+
+    // TODO(grieger): Should we discard glyphs past the max glyph to keep?
+    // *num_glyphs = + hb_iter (all_gids_to_retain) | hb_reduce (hb_max, 0);
     *num_glyphs = face->get_num_glyphs ();
   }
+
+  + reverse_glyph_map->iter ()
+  | hb_map (&hb_pair_t<hb_codepoint_t, hb_codepoint_t>::reverse)
+  | hb_sink (glyph_map)
+  ;
 }
 
 /**