options.hh revision 11e51993ab562d4c7460eb7c43d0e97404e628e7
13bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod/* 23bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * Copyright © 2011 Google, Inc. 33bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * 43bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * This is part of HarfBuzz, a text shaping library. 53bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * 63bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * Permission is hereby granted, without written agreement and without 73bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this 83bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * software and its documentation for any purpose, provided that the 93bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * above copyright notice and the following two paragraphs appear in 103bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * all copies of this software. 113bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * 123bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 133bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 143bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 153bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 163bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * DAMAGE. 173bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * 183bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 193bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 203bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 213bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 223bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 233bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * 243bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod * Google Author(s): Behdad Esfahbod 253bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod */ 263bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 273bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod#include "common.hh" 283bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 293bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod#ifndef OPTIONS_HH 303bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod#define OPTIONS_HH 313bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 323bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 33b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodextern bool debug; 34b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 35b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct option_group_t 36b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod{ 37b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod virtual void add_options (struct option_parser_t *parser) = 0; 38b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 39b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod virtual void pre_parse (GError **error G_GNUC_UNUSED) {}; 40b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod virtual void post_parse (GError **error G_GNUC_UNUSED) {}; 41b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod}; 42b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 43b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 44b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct option_parser_t 45b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod{ 46b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod option_parser_t (const char *usage) { 47b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod memset (this, 0, sizeof (*this)); 48b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod usage_str = usage; 49b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod context = g_option_context_new (usage); 50b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 51b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod add_main_options (); 52b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod } 53b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod ~option_parser_t (void) { 54b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod g_option_context_free (context); 55b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod } 56b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 57b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod void add_main_options (void); 58b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 59b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod void add_group (GOptionEntry *entries, 60b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod const gchar *name, 61b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod const gchar *description, 62b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod const gchar *help_description, 63b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod option_group_t *option_group); 64b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 65b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod void parse (int *argc, char ***argv); 66b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 67b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod G_GNUC_NORETURN void usage (void) { 68b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod g_printerr ("Usage: %s [OPTION...] %s\n", g_get_prgname (), usage_str); 69b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod exit (1); 70b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod } 71b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 72b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod const char *usage_str; 73b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod GOptionContext *context; 74b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod}; 75b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 76b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 77109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod#define DEFAULT_MARGIN 18 78109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod#define DEFAULT_FORE "#000000" 79109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod#define DEFAULT_BACK "#FFFFFF" 8011e51993ab562d4c7460eb7c43d0e97404e628e7Behdad Esfahbod#define DEFAULT_FONT_SIZE 36 81109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod 82b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct view_options_t : option_group_t 833bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod{ 84b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod view_options_t (option_parser_t *parser) { 85b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod annotate = false; 86109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod fore = DEFAULT_FORE; 87109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod back = DEFAULT_BACK; 88b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod line_space = 0; 89109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod margin.t = margin.r = margin.b = margin.l = DEFAULT_MARGIN; 9011e51993ab562d4c7460eb7c43d0e97404e628e7Behdad Esfahbod font_size = DEFAULT_FONT_SIZE; 91b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 92b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod add_options (parser); 933bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod } 943bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 95b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod void add_options (option_parser_t *parser); 96bc4b07b05ea9e39eb9f966eb2c3e1c737efa77ffBehdad Esfahbod 97b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod bool annotate; 983bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod const char *fore; 993bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod const char *back; 1003bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod double line_space; 1013bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod struct margin_t { 1023bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod double t, r, b, l; 1033bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod } margin; 10411e51993ab562d4c7460eb7c43d0e97404e628e7Behdad Esfahbod double font_size; 105b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod}; 1063bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 107109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod 108b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct shape_options_t : option_group_t 1093bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod{ 110b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod shape_options_t (option_parser_t *parser) { 111b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod direction = language = script = NULL; 112b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod features = NULL; 113b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod num_features = 0; 114b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod shapers = NULL; 115b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 116b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod add_options (parser); 1173bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod } 11890e312cb85df7a6dc350cb62138ab950790e3d15Behdad Esfahbod ~shape_options_t (void) { 11990e312cb85df7a6dc350cb62138ab950790e3d15Behdad Esfahbod free (features); 12090e312cb85df7a6dc350cb62138ab950790e3d15Behdad Esfahbod g_free (shapers); 12190e312cb85df7a6dc350cb62138ab950790e3d15Behdad Esfahbod } 1223bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 123b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod void add_options (option_parser_t *parser); 124bc4b07b05ea9e39eb9f966eb2c3e1c737efa77ffBehdad Esfahbod 1254f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod void setup_buffer (hb_buffer_t *buffer) { 126516857eb51bbb79ff4adf44e3fefbf460f9ee8f8Behdad Esfahbod hb_buffer_set_direction (buffer, hb_direction_from_string (direction, -1)); 127516857eb51bbb79ff4adf44e3fefbf460f9ee8f8Behdad Esfahbod hb_buffer_set_script (buffer, hb_script_from_string (script, -1)); 128516857eb51bbb79ff4adf44e3fefbf460f9ee8f8Behdad Esfahbod hb_buffer_set_language (buffer, hb_language_from_string (language, -1)); 1294f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod } 1304f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod 131b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod bool shape (const char *text, int text_len, 132b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod hb_font_t *font, hb_buffer_t *buffer) { 133b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod hb_buffer_reset (buffer); 134b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod hb_buffer_add_utf8 (buffer, text, text_len, 0, text_len); 1354f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod setup_buffer (buffer); 1364f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod return hb_shape_full (font, buffer, features, num_features, NULL, shapers); 1374f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod } 1384f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod 1393bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod const char *direction; 1403bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod const char *language; 1413bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod const char *script; 1423bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod hb_feature_t *features; 1433bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod unsigned int num_features; 1443bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod char **shapers; 145b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod}; 1463bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 147109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod 148b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct font_options_t : option_group_t 1493bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod{ 150b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod font_options_t (option_parser_t *parser) { 151b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod font_file = NULL; 152b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod face_index = 0; 153b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 154b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod font = NULL; 155b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 156b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod add_options (parser); 157b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod } 158b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod ~font_options_t (void) { 159b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod hb_font_destroy (font); 1603bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod } 1613bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 162b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod void add_options (option_parser_t *parser); 163b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 164b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod hb_font_t *get_font (void) const; 165bc4b07b05ea9e39eb9f966eb2c3e1c737efa77ffBehdad Esfahbod 1663bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod const char *font_file; 1673bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod int face_index; 1683bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 169b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod private: 170b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod mutable hb_font_t *font; 171b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod}; 172b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 173b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 174b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct text_options_t : option_group_t 175b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod{ 176b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod text_options_t (option_parser_t *parser) { 177b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod text = NULL; 178b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod text_file = NULL; 179b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 18055aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod fp = NULL; 18155aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod gs = NULL; 182b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod text_len = (unsigned int) -1; 183b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 184b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod add_options (parser); 185b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod } 186b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod ~text_options_t (void) { 18755aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod if (gs) 18855aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod g_string_free (gs, TRUE); 18955aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod if (fp) 19055aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod fclose (fp); 191b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod } 192b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 193b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod void add_options (option_parser_t *parser); 194b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 195b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod void post_parse (GError **error G_GNUC_UNUSED) { 196b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod if (text && text_file) 197b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod g_set_error (error, 198b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, 199b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod "Only one of text and text-file must be set"); 200b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 201b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod }; 202b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 203b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod const char *get_line (unsigned int *len); 204b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 205b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod const char *text; 206b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod const char *text_file; 207b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 208b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod private: 20955aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod FILE *fp; 21055aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod GString *gs; 21155aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod unsigned int text_len; 212b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod}; 213b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 214b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct output_options_t : option_group_t 215b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod{ 216b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod output_options_t (option_parser_t *parser) { 217b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod output_file = NULL; 218b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod output_format = NULL; 219b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 220f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod fp = NULL; 221f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod 222b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod add_options (parser); 223b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod } 224f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod ~output_options_t (void) { 22555aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod if (fp) 226f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod fclose (fp); 227f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod } 228b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 229b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod void add_options (option_parser_t *parser); 230b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 231b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod void post_parse (GError **error G_GNUC_UNUSED) 232b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod { 233b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod if (output_file && !output_format) { 234b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod output_format = strrchr (output_file, '.'); 235b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod if (output_format) 236b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod output_format++; /* skip the dot */ 237b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod } 238b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod 239f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod if (output_file && 0 == strcmp (output_file, "-")) 240f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod output_file = NULL; /* STDOUT */ 241f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod } 242f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod 243a75c1b125159f6cfb6b652a9ec40803f7c7e3f71Behdad Esfahbod FILE *get_file_handle (void); 2443bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 245b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod virtual void init (const font_options_t *font_opts) = 0; 246b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod virtual void consume_line (hb_buffer_t *buffer, 247b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod const char *text, 248b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod unsigned int text_len) = 0; 249b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod virtual void finish (const font_options_t *font_opts) = 0; 2503bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 251f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod protected: 252b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod const char *output_file; 253b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod const char *output_format; 254f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod 255f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod mutable FILE *fp; 256b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod}; 2573bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 2583bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod 2593bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod#endif 260