options.hh 5.8 KB
Newer Older
B
Behdad Esfahbod 已提交
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 27 28 29 30 31 32
/*
 * Copyright © 2011  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): Behdad Esfahbod
 */

#include "common.hh"

#ifndef OPTIONS_HH
#define OPTIONS_HH


33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
extern bool debug;

struct option_group_t
{
  virtual void add_options (struct option_parser_t *parser) = 0;

  virtual void pre_parse (GError **error G_GNUC_UNUSED) {};
  virtual void post_parse (GError **error G_GNUC_UNUSED) {};
};


struct option_parser_t
{
  option_parser_t (const char *usage) {
    memset (this, 0, sizeof (*this));
    usage_str = usage;
    context = g_option_context_new (usage);

    add_main_options ();
  }
  ~option_parser_t (void) {
    g_option_context_free (context);
  }

  void add_main_options (void);

  void add_group (GOptionEntry   *entries,
		  const gchar    *name,
		  const gchar    *description,
		  const gchar    *help_description,
		  option_group_t *option_group);

  void parse (int *argc, char ***argv);

  G_GNUC_NORETURN void usage (void) {
    g_printerr ("Usage: %s [OPTION...] %s\n", g_get_prgname (), usage_str);
    exit (1);
  }

  const char *usage_str;
  GOptionContext *context;
};


77 78 79 80
#define DEFAULT_MARGIN 18
#define DEFAULT_FORE "#000000"
#define DEFAULT_BACK "#FFFFFF"

81
struct view_options_t : option_group_t
B
Behdad Esfahbod 已提交
82
{
83 84
  view_options_t (option_parser_t *parser) {
    annotate = false;
85 86
    fore = DEFAULT_FORE;
    back = DEFAULT_BACK;
87
    line_space = 0;
88
    margin.t = margin.r = margin.b = margin.l = DEFAULT_MARGIN;
89 90

    add_options (parser);
B
Behdad Esfahbod 已提交
91 92
  }

93
  void add_options (option_parser_t *parser);
B
Behdad Esfahbod 已提交
94

95
  bool annotate;
B
Behdad Esfahbod 已提交
96 97 98 99 100 101
  const char *fore;
  const char *back;
  double line_space;
  struct margin_t {
    double t, r, b, l;
  } margin;
102
};
B
Behdad Esfahbod 已提交
103

104

105
struct shape_options_t : option_group_t
B
Behdad Esfahbod 已提交
106
{
107 108 109 110 111 112 113
  shape_options_t (option_parser_t *parser) {
    direction = language = script = NULL;
    features = NULL;
    num_features = 0;
    shapers = NULL;

    add_options (parser);
B
Behdad Esfahbod 已提交
114
  }
B
Behdad Esfahbod 已提交
115 116 117 118
  ~shape_options_t (void) {
    free (features);
    g_free (shapers);
  }
B
Behdad Esfahbod 已提交
119

120
  void add_options (option_parser_t *parser);
B
Behdad Esfahbod 已提交
121

B
Behdad Esfahbod 已提交
122
  void setup_buffer (hb_buffer_t *buffer) {
B
Behdad Esfahbod 已提交
123 124 125
    hb_buffer_set_direction (buffer, hb_direction_from_string (direction, -1));
    hb_buffer_set_script (buffer, hb_script_from_string (script, -1));
    hb_buffer_set_language (buffer, hb_language_from_string (language, -1));
B
Behdad Esfahbod 已提交
126 127
  }

128 129 130 131
  bool shape (const char *text, int text_len,
	      hb_font_t *font, hb_buffer_t *buffer) {
    hb_buffer_reset (buffer);
    hb_buffer_add_utf8 (buffer, text, text_len, 0, text_len);
B
Behdad Esfahbod 已提交
132 133 134 135
    setup_buffer (buffer);
    return hb_shape_full (font, buffer, features, num_features, NULL, shapers);
  }

B
Behdad Esfahbod 已提交
136 137 138 139 140 141
  const char *direction;
  const char *language;
  const char *script;
  hb_feature_t *features;
  unsigned int num_features;
  char **shapers;
142
};
B
Behdad Esfahbod 已提交
143

144 145 146

#define DEFAULT_FONT_SIZE 36

147
struct font_options_t : option_group_t
B
Behdad Esfahbod 已提交
148
{
149 150 151
  font_options_t (option_parser_t *parser) {
    font_file = NULL;
    face_index = 0;
152
    font_size = DEFAULT_FONT_SIZE;
153 154 155 156 157 158 159

    font = NULL;

    add_options (parser);
  }
  ~font_options_t (void) {
    hb_font_destroy (font);
B
Behdad Esfahbod 已提交
160 161
  }

162 163 164
  void add_options (option_parser_t *parser);

  hb_font_t *get_font (void) const;
B
Behdad Esfahbod 已提交
165

B
Behdad Esfahbod 已提交
166 167 168 169
  const char *font_file;
  int face_index;
  double font_size;

170 171 172 173 174 175 176 177 178 179 180
  private:
  mutable hb_font_t *font;
};


struct text_options_t : option_group_t
{
  text_options_t (option_parser_t *parser) {
    text = NULL;
    text_file = NULL;

B
Behdad Esfahbod 已提交
181 182
    fp = NULL;
    gs = NULL;
183 184 185 186 187
    text_len = (unsigned int) -1;

    add_options (parser);
  }
  ~text_options_t (void) {
B
Behdad Esfahbod 已提交
188 189 190 191
    if (gs)
      g_string_free (gs, TRUE);
    if (fp)
      fclose (fp);
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
  }

  void add_options (option_parser_t *parser);

  void post_parse (GError **error G_GNUC_UNUSED) {
    if (text && text_file)
      g_set_error (error,
		   G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
		   "Only one of text and text-file must be set");

  };

  const char *get_line (unsigned int *len);

  const char *text;
  const char *text_file;

  private:
B
Behdad Esfahbod 已提交
210 211 212
  FILE *fp;
  GString *gs;
  unsigned int text_len;
213 214 215 216 217 218 219 220
};

struct output_options_t : option_group_t
{
  output_options_t (option_parser_t *parser) {
    output_file = NULL;
    output_format = NULL;

221 222
    fp = NULL;

223 224
    add_options (parser);
  }
225
  ~output_options_t (void) {
B
Behdad Esfahbod 已提交
226
    if (fp)
227 228
      fclose (fp);
  }
229 230 231 232 233 234 235 236 237 238 239

  void add_options (option_parser_t *parser);

  void post_parse (GError **error G_GNUC_UNUSED)
  {
    if (output_file && !output_format) {
      output_format = strrchr (output_file, '.');
      if (output_format)
	  output_format++; /* skip the dot */
    }

240 241 242 243
    if (output_file && 0 == strcmp (output_file, "-"))
      output_file = NULL; /* STDOUT */
  }

B
Behdad Esfahbod 已提交
244
  FILE *get_file_handle (void);
B
Behdad Esfahbod 已提交
245

246 247 248 249 250
  virtual void init (const font_options_t *font_opts) = 0;
  virtual void consume_line (hb_buffer_t  *buffer,
			     const char   *text,
			     unsigned int  text_len) = 0;
  virtual void finish (const font_options_t *font_opts) = 0;
B
Behdad Esfahbod 已提交
251

252
  protected:
253 254
  const char *output_file;
  const char *output_format;
255 256

  mutable FILE *fp;
257
};
B
Behdad Esfahbod 已提交
258 259 260


#endif