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