diff --git a/src/dump-emoji.cc b/src/dump-emoji.cc index 7c7392f20..73305aa77 100644 --- a/src/dump-emoji.cc +++ b/src/dump-emoji.cc @@ -58,15 +58,30 @@ cbdt_callback (const uint8_t* data, unsigned int length, } static void -sbix_callback (hb_blob_t *blob, unsigned int group, unsigned int gid) +sbix_dump (hb_face_t *face) { - char output_path[255]; - sprintf (output_path, "out/sbix-%d-%d.png", group, gid); - FILE *f = fopen (output_path, "wb"); - unsigned int length; - const char* data = hb_blob_get_data (blob, &length); - fwrite (data, 1, length, f); - fclose (f); + OT::sbix::accelerator_t sbix; + sbix.init (face); + unsigned int length = 0; + unsigned int *available_ppems = sbix.get_available_ppems (&length); + unsigned int num_glyphs = face->num_glyphs; + for (unsigned int group = 0; group < length; group++) + for (unsigned int glyph_id = 0; glyph_id < num_glyphs; glyph_id++) + { + hb_blob_t *blob; + blob = sbix.reference_blob_for_glyph (glyph_id, 0, available_ppems[group], + HB_TAG('p','n','g',' '), NULL, NULL); + if (hb_blob_get_length (blob) == 0) continue; + + char output_path[255]; + sprintf (output_path, "out/sbix-%d-%d.png", available_ppems[group], glyph_id); + FILE *f = fopen (output_path, "wb"); + unsigned int length; + const char* data = hb_blob_get_data (blob, &length); + fwrite (data, 1, length, f); + fclose (f); + } + sbix.fini (); } static void @@ -273,10 +288,7 @@ main (int argc, char **argv) cbdt.dump (cbdt_callback); cbdt.fini (); - OT::sbix::accelerator_t sbix; - sbix.init (face); - sbix.dump (sbix_callback); - sbix.fini (); + sbix_dump (face); if (hb_ot_color_has_svg (face)) svg_dump (face); diff --git a/src/hb-ot-color-sbix-table.hh b/src/hb-ot-color-sbix-table.hh index cba62f0cf..b48ea1715 100644 --- a/src/hb-ot-color-sbix-table.hh +++ b/src/hb-ot-color-sbix-table.hh @@ -153,23 +153,17 @@ struct sbix hb_blob_destroy (sbix_blob); } - inline void dump (void (*callback) (hb_blob_t *data, - unsigned int group, unsigned int gid)) const + /* only to support dump-emoji, don't use it anywhere else */ + inline unsigned int *get_available_ppems (unsigned int *length) { - for (unsigned group = 0; group < sbix_table->strikes.len; group++) - { - const SBIXStrike &strike = sbix_table+sbix_table->strikes[group]; - for (unsigned int glyph_id = 0; glyph_id < num_glyphs; glyph_id++) - { - hb_tag_t tag; - hb_blob_t *blob; - blob = strike.get_glyph_blob (glyph_id, sbix_blob, sbix_len, - sbix_table->strikes[group], - nullptr, nullptr, - HB_TAG('p','n','g',' '), num_glyphs); - if (hb_blob_get_length (blob)) callback (blob, group, glyph_id); - } - } + if (unlikely (sbix_len == 0 || sbix_table->strikes.len == 0)) + return nullptr; + *length = sbix_table->strikes.len; + unsigned int *result; + result = (unsigned int *) malloc (sizeof (unsigned int) * sbix_table->strikes.len); + for (unsigned int i = 0; i < sbix_table->strikes.len; i++) + result[i] = (sbix_table+sbix_table->strikes[i]).get_ppem (); + return result; } inline hb_blob_t *reference_blob_for_glyph (hb_codepoint_t glyph_id,