[subset] Update hb-subset-glyf.cc to use new hb-subset-plan API.
diff --git a/src/hb-subset-glyf.cc b/src/hb-subset-glyf.cc
index 712b7cd..ee004ee 100644
--- a/src/hb-subset-glyf.cc
+++ b/src/hb-subset-glyf.cc
@@ -58,21 +58,6 @@
               size);
     return false;
   }
-
-  inline bool
-  _add_empty_glyphs_to_loca (hb_codepoint_t from_gid,
-                             hb_codepoint_t to_gid,
-                             unsigned int   offset)
-  {
-    bool success = true;
-    while (from_gid < to_gid)
-    {
-      success = success && _write_loca_entry (from_gid,
-                                              offset);
-      from_gid++;
-    }
-    return success;
-  }
 };
 
 /**
@@ -119,10 +104,10 @@
 				     hb_vector_t<unsigned int>     *instruction_ranges /* OUT */)
 {
   unsigned int total = 0;
-  for (unsigned int i = 0; i < plan->glyphs.length; i++)
-  {
-    hb_codepoint_t next_glyph = plan->glyphs[i];
 
+  hb_codepoint_t next_glyph = HB_SET_VALUE_INVALID;
+  while (plan->glyphset ()->next (&next_glyph))
+  {
     unsigned int start_offset, end_offset;
     if (unlikely (!(glyf.get_offsets (next_glyph, &start_offset, &end_offset) &&
 		    glyf.remove_padding (start_offset, &end_offset))))
@@ -152,7 +137,7 @@
 
   *glyf_size = total;
   loca_data->is_short = (total <= 131070);
-  loca_data->size = (plan->num_glyphs + 1)
+  loca_data->size = (plan->num_output_glyphs () + 1)
       * (loca_data->is_short ? sizeof (OT::HBUINT16) : sizeof (OT::HBUINT32));
 
   DEBUG_MSG(SUBSET, nullptr, "preparing to subset glyf: final size %d, loca size %d, using %s loca",
@@ -207,26 +192,27 @@
 			    char                          *glyf_prime_data /* OUT */,
 			    loca_data_t                   *loca_prime /* OUT */)
 {
-  const hb_vector_t<hb_codepoint_t> &glyph_ids = plan->glyphs;
   char *glyf_prime_data_next = glyf_prime_data;
 
   bool success = true;
-  unsigned int current_gid = 0;
-  for (unsigned int i = 0; i < glyph_ids.length; i++)
-  {
-    hb_codepoint_t next_gid = current_gid;
-    success = success && plan->new_gid_for_old_gid (glyph_ids[i], &next_gid);
 
-    // If we are retaining existing gids then there will potentially be gaps
-    // in the loca table between glyphs. Fill in this gap with glyphs that have
-    // no outlines.
-    success = success && loca_prime->_add_empty_glyphs_to_loca (current_gid,
-                                                                next_gid,
-                                                                glyf_prime_data_next - glyf_prime_data);
-    current_gid = next_gid;
+
+  unsigned int i = 0;
+  hb_codepoint_t new_gid;
+  for (new_gid = 0; new_gid < plan->num_output_glyphs (); new_gid++)
+  {
+    hb_codepoint_t old_gid;
+    if (!plan->old_gid_for_new_gid (new_gid, &old_gid))
+    {
+      // Empty glyph, add a loca entry and carry on.
+      loca_prime->_write_loca_entry (new_gid,
+                                     glyf_prime_data_next - glyf_prime_data);
+      continue;
+    }
+
 
     unsigned int start_offset, end_offset;
-    if (unlikely (!(glyf.get_offsets (glyph_ids[i], &start_offset, &end_offset) &&
+    if (unlikely (!(glyf.get_offsets (old_gid, &start_offset, &end_offset) &&
 		    glyf.remove_padding (start_offset, &end_offset))))
       end_offset = start_offset = 0;
 
@@ -260,18 +246,19 @@
 	memset (glyf_prime_data_next + instruction_start - start_offset - 2, 0, 2);
     }
 
-    success = success && loca_prime->_write_loca_entry (current_gid,
+    success = success && loca_prime->_write_loca_entry (new_gid,
                                                         glyf_prime_data_next - glyf_prime_data);
     _update_components (plan, glyf_prime_data_next, length);
 
     // TODO: don't align to two bytes if using long loca.
     glyf_prime_data_next += length + (length % 2); // Align to 2 bytes for short loca.
-    current_gid++;
+
+    i++;
   }
 
   // loca table has n+1 entries where the last entry signifies the end location of the last
   // glyph.
-  success = success && loca_prime->_write_loca_entry (current_gid,
+  success = success && loca_prime->_write_loca_entry (new_gid,
                                                       glyf_prime_data_next - glyf_prime_data);
   return success;
 }