|
|
|
@ -28,6 +28,7 @@ |
|
|
|
|
#include <unistd.h> |
|
|
|
|
|
|
|
|
|
#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); |
|
|
|
|
} |
|
|
|
|