options.hh revision 30874b4819a99cc84fa39e794266685e1b8735d2
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#ifndef OPTIONS_HH
283bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod#define OPTIONS_HH
293bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
303bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
318b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#ifdef HAVE_CONFIG_H
328b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#include "config.h"
338b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#endif
348b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod
358b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#include <stdlib.h>
368b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#include <stddef.h>
378b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#include <string.h>
388b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#include <stdio.h>
398b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#include <math.h>
408b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#include <locale.h>
418b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#include <errno.h>
428b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#include <fcntl.h>
438b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#ifdef HAVE_IO_H
448b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#include <io.h> /* for _setmode() under Windows */
458b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#endif
468b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod
478b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#include <hb.h>
488b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#include <glib.h>
498b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod#include <glib/gprintf.h>
508b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod
5169b84a8f6c789726815261c2e86692de7a65d6e8Behdad Esfahbod#undef MIN
5269b84a8f6c789726815261c2e86692de7a65d6e8Behdad Esfahbodtemplate <typename Type> static inline Type MIN (const Type &a, const Type &b) { return a < b ? a : b; }
5369b84a8f6c789726815261c2e86692de7a65d6e8Behdad Esfahbod
5469b84a8f6c789726815261c2e86692de7a65d6e8Behdad Esfahbod#undef MAX
5569b84a8f6c789726815261c2e86692de7a65d6e8Behdad Esfahbodtemplate <typename Type> static inline Type MAX (const Type &a, const Type &b) { return a > b ? a : b; }
5669b84a8f6c789726815261c2e86692de7a65d6e8Behdad Esfahbod
5769b84a8f6c789726815261c2e86692de7a65d6e8Behdad Esfahbod
588b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbodvoid fail (hb_bool_t suggest_help, const char *format, ...) G_GNUC_NORETURN;
598b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod
608b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod
61088c1e27c0fc0cdef999cf1f567e4d5eb2cfb2e4Behdad Esfahbodextern hb_bool_t debug;
62b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
63b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct option_group_t
64b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod{
65b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  virtual void add_options (struct option_parser_t *parser) = 0;
66b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
67b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  virtual void pre_parse (GError **error G_GNUC_UNUSED) {};
68b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  virtual void post_parse (GError **error G_GNUC_UNUSED) {};
69b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
70b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
71b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
72b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct option_parser_t
73b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod{
74b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  option_parser_t (const char *usage) {
75b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    memset (this, 0, sizeof (*this));
76b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    usage_str = usage;
77b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    context = g_option_context_new (usage);
78b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
79b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    add_main_options ();
80b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
81b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  ~option_parser_t (void) {
82b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    g_option_context_free (context);
83b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
84b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
85b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_main_options (void);
86b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
87b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_group (GOptionEntry   *entries,
88b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod		  const gchar    *name,
89b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod		  const gchar    *description,
90b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod		  const gchar    *help_description,
91b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod		  option_group_t *option_group);
92b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
93b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void parse (int *argc, char ***argv);
94b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
95b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  G_GNUC_NORETURN void usage (void) {
96b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    g_printerr ("Usage: %s [OPTION...] %s\n", g_get_prgname (), usage_str);
97b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    exit (1);
98b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
99b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
100b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  const char *usage_str;
101b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  GOptionContext *context;
102b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
103b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
104b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
1052097951110e33fe091ed9515ae77e2683c46c889Behdad Esfahbod#define DEFAULT_MARGIN 64
106109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod#define DEFAULT_FORE "#000000"
107109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod#define DEFAULT_BACK "#FFFFFF"
1082097951110e33fe091ed9515ae77e2683c46c889Behdad Esfahbod#define DEFAULT_FONT_SIZE 256
109109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod
110b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct view_options_t : option_group_t
1113bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod{
112b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  view_options_t (option_parser_t *parser) {
113b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    annotate = false;
114109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod    fore = DEFAULT_FORE;
115109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod    back = DEFAULT_BACK;
116b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    line_space = 0;
117109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod    margin.t = margin.r = margin.b = margin.l = DEFAULT_MARGIN;
11811e51993ab562d4c7460eb7c43d0e97404e628e7Behdad Esfahbod    font_size = DEFAULT_FONT_SIZE;
119b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
120b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    add_options (parser);
1213bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  }
1223bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
123b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_options (option_parser_t *parser);
124bc4b07b05ea9e39eb9f966eb2c3e1c737efa77ffBehdad Esfahbod
125088c1e27c0fc0cdef999cf1f567e4d5eb2cfb2e4Behdad Esfahbod  hb_bool_t annotate;
1263bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  const char *fore;
1273bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  const char *back;
1283bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  double line_space;
1293bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  struct margin_t {
1303bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod    double t, r, b, l;
1313bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  } margin;
13211e51993ab562d4c7460eb7c43d0e97404e628e7Behdad Esfahbod  double font_size;
133b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
1343bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
135109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod
136b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct shape_options_t : option_group_t
1373bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod{
138b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  shape_options_t (option_parser_t *parser) {
139b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    direction = language = script = NULL;
140b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    features = NULL;
141b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    num_features = 0;
142b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    shapers = NULL;
14395cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod    utf8_clusters = false;
144b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
145b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    add_options (parser);
1463bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  }
14790e312cb85df7a6dc350cb62138ab950790e3d15Behdad Esfahbod  ~shape_options_t (void) {
14890e312cb85df7a6dc350cb62138ab950790e3d15Behdad Esfahbod    free (features);
14990e312cb85df7a6dc350cb62138ab950790e3d15Behdad Esfahbod    g_free (shapers);
15090e312cb85df7a6dc350cb62138ab950790e3d15Behdad Esfahbod  }
1513bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
152b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_options (option_parser_t *parser);
153bc4b07b05ea9e39eb9f966eb2c3e1c737efa77ffBehdad Esfahbod
1544f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod  void setup_buffer (hb_buffer_t *buffer) {
155516857eb51bbb79ff4adf44e3fefbf460f9ee8f8Behdad Esfahbod    hb_buffer_set_direction (buffer, hb_direction_from_string (direction, -1));
156516857eb51bbb79ff4adf44e3fefbf460f9ee8f8Behdad Esfahbod    hb_buffer_set_script (buffer, hb_script_from_string (script, -1));
157516857eb51bbb79ff4adf44e3fefbf460f9ee8f8Behdad Esfahbod    hb_buffer_set_language (buffer, hb_language_from_string (language, -1));
1584f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod  }
1594f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod
160088c1e27c0fc0cdef999cf1f567e4d5eb2cfb2e4Behdad Esfahbod  hb_bool_t shape (const char *text, int text_len,
161088c1e27c0fc0cdef999cf1f567e4d5eb2cfb2e4Behdad Esfahbod		   hb_font_t *font, hb_buffer_t *buffer) {
162b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    hb_buffer_reset (buffer);
163b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    hb_buffer_add_utf8 (buffer, text, text_len, 0, text_len);
164d5300241680844f5625f32792f7dd7181ed05f9bBehdad Esfahbod
16595cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod    if (!utf8_clusters) {
16695cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod      /* Reset cluster values to refer to Unicode character index
16795cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod       * instead of UTF-8 index. */
16895cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod      unsigned int num_glyphs = hb_buffer_get_length (buffer);
16995cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod      hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL);
17095cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod      for (unsigned int i = 0; i < num_glyphs; i++)
17195cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod      {
17295cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod	info->cluster = i;
17395cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod	info++;
17495cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod      }
175d5300241680844f5625f32792f7dd7181ed05f9bBehdad Esfahbod    }
176d5300241680844f5625f32792f7dd7181ed05f9bBehdad Esfahbod
1774f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod    setup_buffer (buffer);
1786bd9b479b8b2befbb0847282e93beade197c8038Behdad Esfahbod    return hb_shape_full (font, buffer, features, num_features, shapers);
1794f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod  }
1804f4b114a5592c2f5d128ee795f159b438ad97829Behdad Esfahbod
1813bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  const char *direction;
1823bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  const char *language;
1833bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  const char *script;
1843bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  hb_feature_t *features;
1853bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  unsigned int num_features;
1863bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  char **shapers;
18795cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod  hb_bool_t utf8_clusters;
188b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
1893bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
190109cb382898f491eed733dba4ef5ba12de94aaf6Behdad Esfahbod
191b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct font_options_t : option_group_t
1923bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod{
193b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  font_options_t (option_parser_t *parser) {
194b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    font_file = NULL;
195b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    face_index = 0;
196b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
197b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    font = NULL;
198b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
199b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    add_options (parser);
200b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
201b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  ~font_options_t (void) {
202b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    hb_font_destroy (font);
2033bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  }
2043bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
205b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_options (option_parser_t *parser);
206b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
207b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  hb_font_t *get_font (void) const;
208bc4b07b05ea9e39eb9f966eb2c3e1c737efa77ffBehdad Esfahbod
2093bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  const char *font_file;
2103bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod  int face_index;
2113bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
212b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  private:
213b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  mutable hb_font_t *font;
214b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
215b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
216b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
217b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct text_options_t : option_group_t
218b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod{
219b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  text_options_t (option_parser_t *parser) {
220b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    text = NULL;
221b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    text_file = NULL;
222b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
22355aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod    fp = NULL;
22455aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod    gs = NULL;
225b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    text_len = (unsigned int) -1;
226b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
227b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    add_options (parser);
228b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
229b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  ~text_options_t (void) {
23055aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod    if (gs)
23155aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod      g_string_free (gs, TRUE);
23255aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod    if (fp)
23355aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod      fclose (fp);
234b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
235b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
236b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_options (option_parser_t *parser);
237b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
238b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void post_parse (GError **error G_GNUC_UNUSED) {
239b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    if (text && text_file)
240b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod      g_set_error (error,
241b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod		   G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
24230874b4819a99cc84fa39e794266685e1b8735d2Behdad Esfahbod		   "Only one of text and text-file can be set");
243b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
244b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  };
245b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
246b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  const char *get_line (unsigned int *len);
247b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
248b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  const char *text;
249b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  const char *text_file;
250b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
251b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  private:
25255aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod  FILE *fp;
25355aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod  GString *gs;
25455aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod  unsigned int text_len;
255b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
256b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
257b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbodstruct output_options_t : option_group_t
258b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod{
259b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  output_options_t (option_parser_t *parser) {
260b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    output_file = NULL;
261b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    output_format = NULL;
262b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
263f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod    fp = NULL;
264f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod
265b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    add_options (parser);
266b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  }
267f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod  ~output_options_t (void) {
26855aeb0490454cc1ba93a42f307ed1230f59dee4bBehdad Esfahbod    if (fp)
269f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod      fclose (fp);
270f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod  }
271b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
272b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void add_options (option_parser_t *parser);
273b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
274b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  void post_parse (GError **error G_GNUC_UNUSED)
275b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  {
276b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    if (output_file && !output_format) {
277b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod      output_format = strrchr (output_file, '.');
278b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod      if (output_format)
279b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod	  output_format++; /* skip the dot */
280b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod    }
281b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod
282f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod    if (output_file && 0 == strcmp (output_file, "-"))
283f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod      output_file = NULL; /* STDOUT */
284f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod  }
285f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod
286a75c1b125159f6cfb6b652a9ec40803f7c7e3f71Behdad Esfahbod  FILE *get_file_handle (void);
2873bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
288b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  virtual void init (const font_options_t *font_opts) = 0;
289b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  virtual void consume_line (hb_buffer_t  *buffer,
290b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod			     const char   *text,
29195cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod			     unsigned int  text_len,
29295cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod			     hb_bool_t     utf8_clusters) = 0;
293b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  virtual void finish (const font_options_t *font_opts) = 0;
2943bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
295b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  const char *output_file;
296b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod  const char *output_format;
297f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod
2988b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod  protected:
2998b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod
300f7e2ef74f856ee13d6fd6cf3f1e04bc162203bc2Behdad Esfahbod  mutable FILE *fp;
301b9b10ad78b1f977494a3a42b58f8040fe16505a3Behdad Esfahbod};
3023bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
3038b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbodstruct format_options_t : option_group_t
3048b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod{
3058b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod  format_options_t (option_parser_t *parser) {
3068b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod    show_glyph_names = true;
3078b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod    show_positions = true;
3088b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod    show_clusters = true;
309cc4d9810d6318ca2e4de3b8d62f03b51cc21ee05Behdad Esfahbod    show_text = false;
310cc4d9810d6318ca2e4de3b8d62f03b51cc21ee05Behdad Esfahbod    show_unicode = false;
311cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod    show_line_num = false;
312cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod    scratch = hb_buffer_create ();
3138b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod
3148b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod    add_options (parser);
3158b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod  }
3168b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod  ~format_options_t (void) {
317cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod    hb_buffer_destroy (scratch);
3188b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod  }
3198b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod
3208b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod  void add_options (option_parser_t *parser);
3218b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod
322cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod  void serialize_unicode (hb_buffer_t  *buffer,
323cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod			  GString      *gs);
324cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod  void serialize_glyphs (hb_buffer_t  *buffer,
325cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod			 hb_font_t    *font,
32695cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod			 hb_bool_t    utf8_clusters,
327cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod			 GString      *gs);
328cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod  void serialize_line_no (unsigned int  line_no,
329cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod			  GString      *gs);
330cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod  void serialize_line (hb_buffer_t  *buffer,
331cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod		       unsigned int  line_no,
332cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod		       const char   *text,
333cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod		       unsigned int  text_len,
334cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod		       hb_font_t    *font,
33595cefdf96efe43a44133aa8a186155cf4e63e2b7Behdad Esfahbod		       hb_bool_t     utf8_clusters,
336cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod		       GString      *gs);
337cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod
3388b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod
3398b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod  protected:
340088c1e27c0fc0cdef999cf1f567e4d5eb2cfb2e4Behdad Esfahbod  hb_bool_t show_glyph_names;
341088c1e27c0fc0cdef999cf1f567e4d5eb2cfb2e4Behdad Esfahbod  hb_bool_t show_positions;
342088c1e27c0fc0cdef999cf1f567e4d5eb2cfb2e4Behdad Esfahbod  hb_bool_t show_clusters;
343cc4d9810d6318ca2e4de3b8d62f03b51cc21ee05Behdad Esfahbod  hb_bool_t show_text;
344cc4d9810d6318ca2e4de3b8d62f03b51cc21ee05Behdad Esfahbod  hb_bool_t show_unicode;
345cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod  hb_bool_t show_line_num;
346cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod  private:
347cdc673d97c5ffedb386865a81f54a5cedcbad27cBehdad Esfahbod  hb_buffer_t *scratch;
3488b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod};
3498b8b19056decaf09e4e0ccd9412ee1aeb30f4de7Behdad Esfahbod
3503bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod
3513bb300ee78a40f9ded21ab19283863b733aeb677Behdad Esfahbod#endif
352