[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;
}