hb-subset.cc 2.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*
 * 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
 */
27

28
#include "main-font-text.hh"
29

30 31 32
/*
 * Command line interface to the harfbuzz font subsetter.
 */
33

34 35 36 37
struct subset_consumer_t
{
  subset_consumer_t (option_parser_t *parser)
      : failed (false), options(parser) {}
38

39 40 41 42
  void init (hb_buffer_t  *buffer_,
             const font_options_t *font_opts)
  {
    font = hb_font_reference (font_opts->get_font ());
43 44
  }

45 46 47 48 49
  void consume_line (const char   *text,
                     unsigned int  text_len,
                     const char   *text_before,
                     const char   *text_after)
  {
50 51
  }

52 53 54 55 56 57
  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);
58

59
    int fd_out = open(options.output_file, O_CREAT | O_WRONLY, S_IRWXU);
G
Garret Rieger 已提交
60
    if (fd_out != -1) {
61
      ssize_t bytes_written = write(fd_out, data, data_length);
G
Garret Rieger 已提交
62
      if (bytes_written == -1) {
63 64 65
        fprintf(stderr, "Unable to write output file");
        failed = true;
      } else if (bytes_written != data_length) {
G
Garret Rieger 已提交
66
        fprintf(stderr, "Wrong number of bytes written");
67
        failed = true;
68
      }
G
Garret Rieger 已提交
69
    } else {
70 71
      fprintf(stderr, "Unable to open output file");
      failed = true;
G
Garret Rieger 已提交
72
    }
73

74 75
    hb_blob_destroy (result);
    hb_font_destroy (font);
76 77
  }

78 79
  public:
  bool failed;
80

81 82 83 84
  private:
  output_options_t options;
  hb_font_t *font;
};
85

86 87 88 89 90
int
main (int argc, char **argv)
{
  main_font_text_t<subset_consumer_t, 10, 0> driver;
  return driver.main (argc, argv);
91
}