1*2d1272b8SAndroid Build Coastguard Worker /* 2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2010 Behdad Esfahbod 3*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2011,2012 Google, Inc. 4*2d1272b8SAndroid Build Coastguard Worker * 5*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library. 6*2d1272b8SAndroid Build Coastguard Worker * 7*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without 8*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this 9*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the 10*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in 11*2d1272b8SAndroid Build Coastguard Worker * all copies of this software. 12*2d1272b8SAndroid Build Coastguard Worker * 13*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 14*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 15*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 16*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 17*2d1272b8SAndroid Build Coastguard Worker * DAMAGE. 18*2d1272b8SAndroid Build Coastguard Worker * 19*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 20*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 21*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 22*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 23*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 24*2d1272b8SAndroid Build Coastguard Worker * 25*2d1272b8SAndroid Build Coastguard Worker * Google Author(s): Behdad Esfahbod 26*2d1272b8SAndroid Build Coastguard Worker */ 27*2d1272b8SAndroid Build Coastguard Worker 28*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_SHAPE_OUTPUT_HH 29*2d1272b8SAndroid Build Coastguard Worker #define HB_SHAPE_OUTPUT_HH 30*2d1272b8SAndroid Build Coastguard Worker 31*2d1272b8SAndroid Build Coastguard Worker #include "shape-format.hh" 32*2d1272b8SAndroid Build Coastguard Worker #include "output-options.hh" 33*2d1272b8SAndroid Build Coastguard Worker 34*2d1272b8SAndroid Build Coastguard Worker 35*2d1272b8SAndroid Build Coastguard Worker struct shape_output_t : output_options_t<> 36*2d1272b8SAndroid Build Coastguard Worker { add_optionsshape_output_t37*2d1272b8SAndroid Build Coastguard Worker void add_options (option_parser_t *parser) 38*2d1272b8SAndroid Build Coastguard Worker { 39*2d1272b8SAndroid Build Coastguard Worker parser->set_summary ("Shape text with given font."); 40*2d1272b8SAndroid Build Coastguard Worker output_options_t::add_options (parser, hb_buffer_serialize_list_formats ()); 41*2d1272b8SAndroid Build Coastguard Worker format.add_options (parser); 42*2d1272b8SAndroid Build Coastguard Worker } 43*2d1272b8SAndroid Build Coastguard Worker initshape_output_t44*2d1272b8SAndroid Build Coastguard Worker void init (hb_buffer_t *buffer, const font_options_t *font_opts) 45*2d1272b8SAndroid Build Coastguard Worker { 46*2d1272b8SAndroid Build Coastguard Worker gs = g_string_new (nullptr); 47*2d1272b8SAndroid Build Coastguard Worker line_no = 0; 48*2d1272b8SAndroid Build Coastguard Worker font = hb_font_reference (font_opts->font); 49*2d1272b8SAndroid Build Coastguard Worker 50*2d1272b8SAndroid Build Coastguard Worker if (!output_format) 51*2d1272b8SAndroid Build Coastguard Worker serialize_format = HB_BUFFER_SERIALIZE_FORMAT_TEXT; 52*2d1272b8SAndroid Build Coastguard Worker else 53*2d1272b8SAndroid Build Coastguard Worker serialize_format = hb_buffer_serialize_format_from_string (output_format, -1); 54*2d1272b8SAndroid Build Coastguard Worker /* An empty "output_format" parameter basically skips output generating. 55*2d1272b8SAndroid Build Coastguard Worker * Useful for benchmarking. */ 56*2d1272b8SAndroid Build Coastguard Worker if ((!output_format || *output_format) && 57*2d1272b8SAndroid Build Coastguard Worker !hb_buffer_serialize_format_to_string (serialize_format)) 58*2d1272b8SAndroid Build Coastguard Worker { 59*2d1272b8SAndroid Build Coastguard Worker if (explicit_output_format) 60*2d1272b8SAndroid Build Coastguard Worker fail (false, "Unknown output format `%s'; supported formats are: %s", 61*2d1272b8SAndroid Build Coastguard Worker output_format, 62*2d1272b8SAndroid Build Coastguard Worker g_strjoinv ("/", const_cast<char**> (hb_buffer_serialize_list_formats ()))); 63*2d1272b8SAndroid Build Coastguard Worker else 64*2d1272b8SAndroid Build Coastguard Worker /* Just default to TEXT if not explicitly requested and the 65*2d1272b8SAndroid Build Coastguard Worker * file extension is not recognized. */ 66*2d1272b8SAndroid Build Coastguard Worker serialize_format = HB_BUFFER_SERIALIZE_FORMAT_TEXT; 67*2d1272b8SAndroid Build Coastguard Worker } 68*2d1272b8SAndroid Build Coastguard Worker 69*2d1272b8SAndroid Build Coastguard Worker unsigned int flags = HB_BUFFER_SERIALIZE_FLAG_DEFAULT; 70*2d1272b8SAndroid Build Coastguard Worker if (!format.show_glyph_names) 71*2d1272b8SAndroid Build Coastguard Worker flags |= HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES; 72*2d1272b8SAndroid Build Coastguard Worker if (!format.show_clusters) 73*2d1272b8SAndroid Build Coastguard Worker flags |= HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS; 74*2d1272b8SAndroid Build Coastguard Worker if (!format.show_positions) 75*2d1272b8SAndroid Build Coastguard Worker flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS; 76*2d1272b8SAndroid Build Coastguard Worker if (!format.show_advances) 77*2d1272b8SAndroid Build Coastguard Worker flags |= HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES; 78*2d1272b8SAndroid Build Coastguard Worker if (format.show_extents) 79*2d1272b8SAndroid Build Coastguard Worker flags |= HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS; 80*2d1272b8SAndroid Build Coastguard Worker if (format.show_flags) 81*2d1272b8SAndroid Build Coastguard Worker flags |= HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS; 82*2d1272b8SAndroid Build Coastguard Worker serialize_flags = (hb_buffer_serialize_flags_t) flags; 83*2d1272b8SAndroid Build Coastguard Worker 84*2d1272b8SAndroid Build Coastguard Worker if (format.trace) 85*2d1272b8SAndroid Build Coastguard Worker hb_buffer_set_message_func (buffer, message_func, this, nullptr); 86*2d1272b8SAndroid Build Coastguard Worker } new_lineshape_output_t87*2d1272b8SAndroid Build Coastguard Worker void new_line () { line_no++; } consume_textshape_output_t88*2d1272b8SAndroid Build Coastguard Worker void consume_text (hb_buffer_t *buffer, 89*2d1272b8SAndroid Build Coastguard Worker const char *text, 90*2d1272b8SAndroid Build Coastguard Worker unsigned int text_len, 91*2d1272b8SAndroid Build Coastguard Worker hb_bool_t utf8_clusters) 92*2d1272b8SAndroid Build Coastguard Worker { 93*2d1272b8SAndroid Build Coastguard Worker g_string_set_size (gs, 0); 94*2d1272b8SAndroid Build Coastguard Worker format.serialize_buffer_of_text (buffer, line_no, text, text_len, font, gs); 95*2d1272b8SAndroid Build Coastguard Worker fprintf (out_fp, "%s", gs->str); 96*2d1272b8SAndroid Build Coastguard Worker } errorshape_output_t97*2d1272b8SAndroid Build Coastguard Worker void error (const char *message) 98*2d1272b8SAndroid Build Coastguard Worker { 99*2d1272b8SAndroid Build Coastguard Worker g_string_set_size (gs, 0); 100*2d1272b8SAndroid Build Coastguard Worker format.serialize_message (line_no, "error", message, gs); 101*2d1272b8SAndroid Build Coastguard Worker fprintf (out_fp, "%s", gs->str); 102*2d1272b8SAndroid Build Coastguard Worker } consume_glyphsshape_output_t103*2d1272b8SAndroid Build Coastguard Worker void consume_glyphs (hb_buffer_t *buffer, 104*2d1272b8SAndroid Build Coastguard Worker const char *text, 105*2d1272b8SAndroid Build Coastguard Worker unsigned int text_len, 106*2d1272b8SAndroid Build Coastguard Worker hb_bool_t utf8_clusters) 107*2d1272b8SAndroid Build Coastguard Worker { 108*2d1272b8SAndroid Build Coastguard Worker g_string_set_size (gs, 0); 109*2d1272b8SAndroid Build Coastguard Worker format.serialize_buffer_of_glyphs (buffer, line_no, text, text_len, font, 110*2d1272b8SAndroid Build Coastguard Worker serialize_format, serialize_flags, gs); 111*2d1272b8SAndroid Build Coastguard Worker fprintf (out_fp, "%s", gs->str); 112*2d1272b8SAndroid Build Coastguard Worker } finishshape_output_t113*2d1272b8SAndroid Build Coastguard Worker void finish (hb_buffer_t *buffer, const font_options_t *font_opts) 114*2d1272b8SAndroid Build Coastguard Worker { 115*2d1272b8SAndroid Build Coastguard Worker hb_buffer_set_message_func (buffer, nullptr, nullptr, nullptr); 116*2d1272b8SAndroid Build Coastguard Worker hb_font_destroy (font); 117*2d1272b8SAndroid Build Coastguard Worker g_string_free (gs, true); 118*2d1272b8SAndroid Build Coastguard Worker gs = nullptr; 119*2d1272b8SAndroid Build Coastguard Worker font = nullptr; 120*2d1272b8SAndroid Build Coastguard Worker } 121*2d1272b8SAndroid Build Coastguard Worker 122*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t message_funcshape_output_t123*2d1272b8SAndroid Build Coastguard Worker message_func (hb_buffer_t *buffer, 124*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font, 125*2d1272b8SAndroid Build Coastguard Worker const char *message, 126*2d1272b8SAndroid Build Coastguard Worker void *user_data) 127*2d1272b8SAndroid Build Coastguard Worker { 128*2d1272b8SAndroid Build Coastguard Worker shape_output_t *that = (shape_output_t *) user_data; 129*2d1272b8SAndroid Build Coastguard Worker that->trace (buffer, font, message); 130*2d1272b8SAndroid Build Coastguard Worker return true; 131*2d1272b8SAndroid Build Coastguard Worker } 132*2d1272b8SAndroid Build Coastguard Worker 133*2d1272b8SAndroid Build Coastguard Worker void traceshape_output_t134*2d1272b8SAndroid Build Coastguard Worker trace (hb_buffer_t *buffer, 135*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font, 136*2d1272b8SAndroid Build Coastguard Worker const char *message) 137*2d1272b8SAndroid Build Coastguard Worker { 138*2d1272b8SAndroid Build Coastguard Worker g_string_set_size (gs, 0); 139*2d1272b8SAndroid Build Coastguard Worker format.serialize_line_no (line_no, gs); 140*2d1272b8SAndroid Build Coastguard Worker g_string_append_printf (gs, "trace: %s buffer: ", message); 141*2d1272b8SAndroid Build Coastguard Worker format.serialize (buffer, font, serialize_format, serialize_flags, gs); 142*2d1272b8SAndroid Build Coastguard Worker g_string_append_c (gs, '\n'); 143*2d1272b8SAndroid Build Coastguard Worker fprintf (stderr, "%s", gs->str); 144*2d1272b8SAndroid Build Coastguard Worker } 145*2d1272b8SAndroid Build Coastguard Worker 146*2d1272b8SAndroid Build Coastguard Worker 147*2d1272b8SAndroid Build Coastguard Worker protected: 148*2d1272b8SAndroid Build Coastguard Worker 149*2d1272b8SAndroid Build Coastguard Worker shape_format_options_t format; 150*2d1272b8SAndroid Build Coastguard Worker 151*2d1272b8SAndroid Build Coastguard Worker GString *gs = nullptr; 152*2d1272b8SAndroid Build Coastguard Worker unsigned int line_no = 0; 153*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font = nullptr; 154*2d1272b8SAndroid Build Coastguard Worker hb_buffer_serialize_format_t serialize_format = HB_BUFFER_SERIALIZE_FORMAT_INVALID; 155*2d1272b8SAndroid Build Coastguard Worker hb_buffer_serialize_flags_t serialize_flags = HB_BUFFER_SERIALIZE_FLAG_DEFAULT; 156*2d1272b8SAndroid Build Coastguard Worker }; 157*2d1272b8SAndroid Build Coastguard Worker 158*2d1272b8SAndroid Build Coastguard Worker 159*2d1272b8SAndroid Build Coastguard Worker #endif 160