diff --git a/util/hb-subset.cc b/util/hb-subset.cc index 2ec0efe36..67cfed193 100644 --- a/util/hb-subset.cc +++ b/util/hb-subset.cc @@ -43,6 +43,7 @@ struct subset_consumer_t const font_options_t *font_opts) { font = hb_font_reference (font_opts->get_font ()); + codepoints = hb_set_create(); } void consume_line (const char *text, @@ -50,6 +51,16 @@ struct subset_consumer_t const char *text_before, const char *text_after) { + // text appears to be a g_string when set by --unicodes + // TODO(Q1) are gunichar and hbcodepoint_t interchangeable? + // TODO(Q1) does this only get called with at least 1 codepoint? + gchar *c = (gchar *)text; + do { + gunichar cp = g_utf8_get_char(c); + hb_codepoint_t hb_cp = cp; // TODO(Q1) is this safe? + hb_set_add(codepoints, hb_cp); + g_print (" U+%04X %" G_GINT32_FORMAT "\n", cp, cp); + } while ((c = g_utf8_find_next_char(c, text + text_len)) != nullptr); } hb_bool_t @@ -80,16 +91,19 @@ struct subset_consumer_t { // TODO(Q1) check for errors from creates and such hb_subset_profile_t *subset_profile = hb_subset_profile_create(); - hb_subset_input_t *subset_input = hb_subset_input_create (hb_set_get_empty ()); + hb_subset_input_t *subset_input = hb_subset_input_create (codepoints); hb_face_t *face = hb_font_get_face (font); hb_subset_face_t *subset_face = hb_subset_face_create(face); + + hb_blob_t *result = nullptr; failed = !(hb_subset(subset_profile, subset_input, subset_face, &result) && write_file(options.output_file, result)); hb_subset_profile_destroy (subset_profile); hb_subset_input_destroy (subset_input); + hb_set_destroy (codepoints); hb_subset_face_destroy (subset_face); hb_blob_destroy (result); hb_font_destroy (font); @@ -101,6 +115,7 @@ struct subset_consumer_t private: output_options_t options; hb_font_t *font; + hb_set_t *codepoints; }; int