- hb_blob_t *vorg_blob = hb_sanitize_context_t().reference_table<VORG> (plan->source);
- const VORG *vorg_table = vorg_blob->as<VORG> ();
-
- /* count the number of glyphs to be included in the subset table */
- hb_vector_t<VertOriginMetric> subset_metrics;
- subset_metrics.init ();
-
-
- hb_codepoint_t old_glyph = HB_SET_VALUE_INVALID;
- unsigned int i = 0;
- while (i < vertYOrigins.len
- && plan->glyphset ()->next (&old_glyph))
- {
- while (old_glyph > vertYOrigins[i].glyph)
- {
- i++;
- if (i >= vertYOrigins.len)
- break;
- }
-
- if (old_glyph == vertYOrigins[i].glyph)
- {
- hb_codepoint_t new_glyph;
- if (plan->new_gid_for_old_gid (old_glyph, &new_glyph))
- {
- VertOriginMetric *metrics = subset_metrics.push ();
- metrics->glyph.set (new_glyph);
- metrics->vertOriginY.set (vertYOrigins[i].vertOriginY);
- }
- }
- }
-
- /* alloc the new table */
- unsigned int dest_sz = VORG::min_size + VertOriginMetric::static_size * subset_metrics.length;
- void *dest = (void *) malloc (dest_sz);
- if (unlikely (!dest))
- {
- subset_metrics.fini ();
- hb_blob_destroy (vorg_blob);
- return false;
- }
+ TRACE_SUBSET (this);
+ VORG *vorg_prime = c->serializer->start_embed<VORG> ();
+ if (unlikely (!c->serializer->check_success (vorg_prime))) return_trace (false);
+
+ auto it =
+ + vertYOrigins.as_array ()
+ | hb_filter (c->plan->glyphset (), &VertOriginMetric::glyph)
+ | hb_map ([&] (const VertOriginMetric& _)
+ {
+ hb_codepoint_t new_glyph = HB_SET_VALUE_INVALID;
+ c->plan->new_gid_for_old_gid (_.glyph, &new_glyph);
+
+ VertOriginMetric metric;
+ metric.glyph = new_glyph;
+ metric.vertOriginY = _.vertOriginY;
+ return metric;
+ })
+ ;