diff --git a/util/hb-subset.cc b/util/hb-subset.cc index 3dda92194..808cb04f2 100644 --- a/util/hb-subset.cc +++ b/util/hb-subset.cc @@ -28,6 +28,7 @@ #include #include "main-font-text.hh" +#include "hb-subset.h" /* * Command line interface to the harfbuzz font subsetter. @@ -51,28 +52,44 @@ struct subset_consumer_t { } - void finish (const font_options_t *font_opts) - { - hb_face_t *face = hb_font_get_face (font); - hb_blob_t *result = hb_face_reference_blob (face); + hb_bool_t + write_file (const char *output_file, hb_blob_t *blob) { unsigned int data_length; - const char* data = hb_blob_get_data (result, &data_length); + const char* data = hb_blob_get_data (blob, &data_length); - int fd_out = open(options.output_file, O_CREAT | O_WRONLY, S_IRWXU); - if (fd_out != -1) { - ssize_t bytes_written = write(fd_out, data, data_length); - if (bytes_written == -1) { - fprintf(stderr, "Unable to write output file"); - failed = true; - } else if (bytes_written != data_length) { - fprintf(stderr, "Wrong number of bytes written"); - failed = true; - } - } else { + int fd_out = open(output_file, O_CREAT | O_WRONLY, S_IRWXU); + if (fd_out == -1) { fprintf(stderr, "Unable to open output file"); - failed = true; + return false; } + ssize_t bytes_written = write(fd_out, data, data_length); + if (bytes_written == -1) { + fprintf(stderr, "Unable to write output file\n"); + return false; + } + if (bytes_written != data_length) { + fprintf(stderr, "Expected %u bytes written, got %ld\n", data_length, + bytes_written); + return false; + } + return true; + } + + void finish (const font_options_t *font_opts) + { + // 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_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_subset_face_destroy (subset_face); hb_blob_destroy (result); hb_font_destroy (font); }