diff --git a/test/subset/run-tests.py b/test/subset/run-tests.py index 0b4b96a6e..b0054802f 100755 --- a/test/subset/run-tests.py +++ b/test/subset/run-tests.py @@ -30,22 +30,25 @@ def fail_test(test, cli_args, message): print ('Test State:') print (' test.font_path %s' % os.path.abspath(test.font_path)) print (' test.profile_path %s' % os.path.abspath(test.profile_path)) - print (' test.unicodes %s' % test.unicodes()) + print (' test.unicodes %s' % test.unicodes()) expected_file = os.path.join(test_suite.get_output_directory(), - test.get_font_name()) - print (' expected_file %s' % os.path.abspath(expected_file)) + test.get_font_name()) + print (' expected_file %s' % os.path.abspath(expected_file)) return 1 def run_test(test): - out_file = os.path.join(tempfile.mkdtemp(), test.get_font_name() + '-subset.ttf') - cli_args = [hb_subset, test.font_path, out_file, "--unicodes=%s" % test.unicodes()] + out_file = os.path.join(tempfile.mkdtemp(), test.get_font_name() + '-subset.ttf') + cli_args = [hb_subset, + "--font-file=" + test.font_path, + "--output-file=" + out_file, + "--unicodes=%s" % test.unicodes()] _, return_code = cmd(cli_args) if return_code: return fail_test(test, cli_args, "%s returned %d" % (' '.join(cli_args), return_code)) expected = read_binary(os.path.join(test_suite.get_output_directory(), - test.get_font_name())) + test.get_font_name())) actual = read_binary(out_file) if len(actual) != len(expected): diff --git a/util/Makefile.sources b/util/Makefile.sources index 94a5fa8a2..c4516ebcb 100644 --- a/util/Makefile.sources +++ b/util/Makefile.sources @@ -31,4 +31,7 @@ HB_OT_SHAPE_CLOSURE_sources = \ HB_SUBSET_sources = \ hb-subset.cc \ + options.cc \ + options.hh \ + main-font-text.hh \ $(NULL) diff --git a/util/hb-subset.cc b/util/hb-subset.cc index 4beb6a1c0..f5e8aaf3e 100644 --- a/util/hb-subset.cc +++ b/util/hb-subset.cc @@ -1,82 +1,91 @@ -#include -#include -#include -#include -#include -#include -#include +/* + * Copyright © 2010 Behdad Esfahbod + * Copyright © 2011,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Garret Rieger, Rod Sheeter + */ -#include "hb-private.hh" -#include "hb-blob.h" +#include "main-font-text.hh" + +/* + * Command line interface to the harfbuzz font subsetter. + */ + +struct subset_consumer_t +{ + subset_consumer_t (option_parser_t *parser) + : failed (false), options(parser) {} + + void init (hb_buffer_t *buffer_, + const font_options_t *font_opts) + { + font = hb_font_reference (font_opts->get_font ()); + } + + void consume_line (const char *text, + unsigned int text_len, + const char *text_before, + const char *text_after) + { + } + + 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); + unsigned int data_length; + const char* data = hb_blob_get_data (result, &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 { + fprintf(stderr, "Unable to open output file"); + failed = true; + } + + hb_blob_destroy (result); + hb_font_destroy (font); + } + + public: + bool failed; + + private: + output_options_t options; + hb_font_t *font; +}; int main (int argc, char **argv) { - int exit_code = 0; - - if (argc != 4) { - fprintf(stderr, "Must have 4 args\n"); - exit(1); - } - - int fd = open(argv[1], O_RDONLY); - if (fd == -1) { - perror("Unable to open font file"); - exit(1); - } - - void *mapped_file = MAP_FAILED; - int fd_out = -1; - - struct stat stat; - if (fstat(fd, &stat) != -1) { - - mapped_file = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (mapped_file == MAP_FAILED) { - perror("Failed to map file"); - } - } else { - perror("Unable to fstat"); - } - - if (mapped_file != MAP_FAILED) { - hb_blob_t *font_blob = hb_blob_create(static_cast(mapped_file), - stat.st_size, - HB_MEMORY_MODE_READONLY, nullptr, - nullptr); - - fd_out = open(argv[2], O_CREAT | O_WRONLY, S_IRWXU); - if (fd_out != -1) { - ssize_t bytes_written = write(fd_out, mapped_file, stat.st_size); - if (bytes_written == -1) { - perror("Unable to write output file"); - exit_code = 1; - } else if (bytes_written != stat.st_size) { - fprintf(stderr, "Wrong number of bytes written"); - exit_code = 1; - } - } else { - perror("Unable to open output file"); - exit_code = 1; - } - } - - if (mapped_file != MAP_FAILED) { - if (munmap(mapped_file, stat.st_size) == -1) { - perror("Unable to unmap file"); - exit_code = 1; - } - } - - if (fd_out != -1 && close(fd_out) == -1) { - perror("Unable to close output file"); - exit_code = 1; - } - - if (fd != -1 && close(fd) == -1) { - perror("Unable to close file"); - exit_code = 1; - } - - return exit_code; + main_font_text_t driver; + return driver.main (argc, argv); }