1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2012 Google, Inc.
3*2d1272b8SAndroid Build Coastguard Worker *
4*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library.
5*2d1272b8SAndroid Build Coastguard Worker *
6*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without
7*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this
8*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the
9*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in
10*2d1272b8SAndroid Build Coastguard Worker * all copies of this software.
11*2d1272b8SAndroid Build Coastguard Worker *
12*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16*2d1272b8SAndroid Build Coastguard Worker * DAMAGE.
17*2d1272b8SAndroid Build Coastguard Worker *
18*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
21*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23*2d1272b8SAndroid Build Coastguard Worker *
24*2d1272b8SAndroid Build Coastguard Worker * Google Author(s): Behdad Esfahbod
25*2d1272b8SAndroid Build Coastguard Worker */
26*2d1272b8SAndroid Build Coastguard Worker
27*2d1272b8SAndroid Build Coastguard Worker #include "batch.hh"
28*2d1272b8SAndroid Build Coastguard Worker #include "font-options.hh"
29*2d1272b8SAndroid Build Coastguard Worker #include "main-font-text.hh"
30*2d1272b8SAndroid Build Coastguard Worker #include "shape-options.hh"
31*2d1272b8SAndroid Build Coastguard Worker #include "text-options.hh"
32*2d1272b8SAndroid Build Coastguard Worker
33*2d1272b8SAndroid Build Coastguard Worker const unsigned DEFAULT_FONT_SIZE = FONT_SIZE_NONE;
34*2d1272b8SAndroid Build Coastguard Worker const unsigned SUBPIXEL_BITS = 0;
35*2d1272b8SAndroid Build Coastguard Worker
36*2d1272b8SAndroid Build Coastguard Worker struct shape_closure_consumer_t
37*2d1272b8SAndroid Build Coastguard Worker {
add_optionsshape_closure_consumer_t38*2d1272b8SAndroid Build Coastguard Worker void add_options (struct option_parser_t *parser)
39*2d1272b8SAndroid Build Coastguard Worker {
40*2d1272b8SAndroid Build Coastguard Worker parser->set_summary ("Find glyph set from input text under shaping closure.");
41*2d1272b8SAndroid Build Coastguard Worker shaper.add_options (parser);
42*2d1272b8SAndroid Build Coastguard Worker
43*2d1272b8SAndroid Build Coastguard Worker GOptionEntry entries[] =
44*2d1272b8SAndroid Build Coastguard Worker {
45*2d1272b8SAndroid Build Coastguard Worker {"no-glyph-names", 0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &this->show_glyph_names, "Use glyph indices instead of names", nullptr},
46*2d1272b8SAndroid Build Coastguard Worker {nullptr}
47*2d1272b8SAndroid Build Coastguard Worker };
48*2d1272b8SAndroid Build Coastguard Worker parser->add_group (entries,
49*2d1272b8SAndroid Build Coastguard Worker "format",
50*2d1272b8SAndroid Build Coastguard Worker "Format options:",
51*2d1272b8SAndroid Build Coastguard Worker "Options controlling output formatting",
52*2d1272b8SAndroid Build Coastguard Worker this);
53*2d1272b8SAndroid Build Coastguard Worker }
54*2d1272b8SAndroid Build Coastguard Worker
initshape_closure_consumer_t55*2d1272b8SAndroid Build Coastguard Worker void init (const font_options_t *font_opts)
56*2d1272b8SAndroid Build Coastguard Worker {
57*2d1272b8SAndroid Build Coastguard Worker glyphs = hb_set_create ();
58*2d1272b8SAndroid Build Coastguard Worker font = hb_font_reference (font_opts->font);
59*2d1272b8SAndroid Build Coastguard Worker failed = false;
60*2d1272b8SAndroid Build Coastguard Worker buffer = hb_buffer_create ();
61*2d1272b8SAndroid Build Coastguard Worker }
62*2d1272b8SAndroid Build Coastguard Worker template <typename text_options_type>
consume_lineshape_closure_consumer_t63*2d1272b8SAndroid Build Coastguard Worker bool consume_line (text_options_type &text_opts)
64*2d1272b8SAndroid Build Coastguard Worker {
65*2d1272b8SAndroid Build Coastguard Worker unsigned int text_len;
66*2d1272b8SAndroid Build Coastguard Worker const char *text;
67*2d1272b8SAndroid Build Coastguard Worker if (!(text = text_opts.get_line (&text_len)))
68*2d1272b8SAndroid Build Coastguard Worker return false;
69*2d1272b8SAndroid Build Coastguard Worker
70*2d1272b8SAndroid Build Coastguard Worker hb_set_clear (glyphs);
71*2d1272b8SAndroid Build Coastguard Worker shaper.shape_closure (text, text_len, font, buffer, glyphs);
72*2d1272b8SAndroid Build Coastguard Worker
73*2d1272b8SAndroid Build Coastguard Worker if (hb_set_is_empty (glyphs))
74*2d1272b8SAndroid Build Coastguard Worker return true;
75*2d1272b8SAndroid Build Coastguard Worker
76*2d1272b8SAndroid Build Coastguard Worker /* Print it out! */
77*2d1272b8SAndroid Build Coastguard Worker bool first = true;
78*2d1272b8SAndroid Build Coastguard Worker for (hb_codepoint_t i = -1; hb_set_next (glyphs, &i);)
79*2d1272b8SAndroid Build Coastguard Worker {
80*2d1272b8SAndroid Build Coastguard Worker if (first)
81*2d1272b8SAndroid Build Coastguard Worker first = false;
82*2d1272b8SAndroid Build Coastguard Worker else
83*2d1272b8SAndroid Build Coastguard Worker printf (" ");
84*2d1272b8SAndroid Build Coastguard Worker if (show_glyph_names)
85*2d1272b8SAndroid Build Coastguard Worker {
86*2d1272b8SAndroid Build Coastguard Worker char glyph_name[64];
87*2d1272b8SAndroid Build Coastguard Worker hb_font_glyph_to_string (font, i, glyph_name, sizeof (glyph_name));
88*2d1272b8SAndroid Build Coastguard Worker printf ("%s", glyph_name);
89*2d1272b8SAndroid Build Coastguard Worker } else
90*2d1272b8SAndroid Build Coastguard Worker printf ("%u", i);
91*2d1272b8SAndroid Build Coastguard Worker }
92*2d1272b8SAndroid Build Coastguard Worker
93*2d1272b8SAndroid Build Coastguard Worker return true;
94*2d1272b8SAndroid Build Coastguard Worker }
finishshape_closure_consumer_t95*2d1272b8SAndroid Build Coastguard Worker void finish (const font_options_t *font_opts)
96*2d1272b8SAndroid Build Coastguard Worker {
97*2d1272b8SAndroid Build Coastguard Worker printf ("\n");
98*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font);
99*2d1272b8SAndroid Build Coastguard Worker font = nullptr;
100*2d1272b8SAndroid Build Coastguard Worker hb_set_destroy (glyphs);
101*2d1272b8SAndroid Build Coastguard Worker glyphs = nullptr;
102*2d1272b8SAndroid Build Coastguard Worker hb_buffer_destroy (buffer);
103*2d1272b8SAndroid Build Coastguard Worker buffer = nullptr;
104*2d1272b8SAndroid Build Coastguard Worker }
105*2d1272b8SAndroid Build Coastguard Worker
106*2d1272b8SAndroid Build Coastguard Worker bool failed;
107*2d1272b8SAndroid Build Coastguard Worker
108*2d1272b8SAndroid Build Coastguard Worker protected:
109*2d1272b8SAndroid Build Coastguard Worker shape_options_t shaper;
110*2d1272b8SAndroid Build Coastguard Worker hb_bool_t show_glyph_names = true;
111*2d1272b8SAndroid Build Coastguard Worker
112*2d1272b8SAndroid Build Coastguard Worker hb_set_t *glyphs = nullptr;
113*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = nullptr;
114*2d1272b8SAndroid Build Coastguard Worker hb_buffer_t *buffer = nullptr;
115*2d1272b8SAndroid Build Coastguard Worker };
116*2d1272b8SAndroid Build Coastguard Worker
117*2d1272b8SAndroid Build Coastguard Worker int
main(int argc,char ** argv)118*2d1272b8SAndroid Build Coastguard Worker main (int argc, char **argv)
119*2d1272b8SAndroid Build Coastguard Worker {
120*2d1272b8SAndroid Build Coastguard Worker using main_t = main_font_text_t<shape_closure_consumer_t, font_options_t, text_options_t>;
121*2d1272b8SAndroid Build Coastguard Worker return batch_main<main_t> (argc, argv);
122*2d1272b8SAndroid Build Coastguard Worker }
123