1/* 2 * Copyright © 2010 Behdad Esfahbod 3 * Copyright © 2011,2012 Google, Inc. 4 * 5 * This is part of HarfBuzz, a text shaping library. 6 * 7 * Permission is hereby granted, without written agreement and without 8 * license or royalty fees, to use, copy, modify, and distribute this 9 * software and its documentation for any purpose, provided that the 10 * above copyright notice and the following two paragraphs appear in 11 * all copies of this software. 12 * 13 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 14 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 15 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 16 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 17 * DAMAGE. 18 * 19 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 20 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 21 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 22 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 23 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 24 * 25 * Google Author(s): Behdad Esfahbod 26 */ 27 28#include "main-font-text.hh" 29#include "shape-consumer.hh" 30 31struct output_buffer_t 32{ 33 output_buffer_t (option_parser_t *parser) 34 : options (parser, 35 g_strjoinv ("/", (gchar**) hb_buffer_serialize_list_formats ())), 36 format (parser) {} 37 38 void init (const font_options_t *font_opts) 39 { 40 options.get_file_handle (); 41 gs = g_string_new (NULL); 42 line_no = 0; 43 font = hb_font_reference (font_opts->get_font ()); 44 45 if (!options.output_format) 46 output_format = HB_BUFFER_SERIALIZE_FORMAT_TEXT; 47 else 48 output_format = hb_buffer_serialize_format_from_string (options.output_format, -1); 49 if (!hb_buffer_serialize_format_to_string (output_format)) 50 { 51 if (options.explicit_output_format) 52 fail (false, "Unknown output format `%s'; supported formats are: %s", 53 options.output_format, options.supported_formats); 54 else 55 /* Just default to TEXT if not explicitly requested and the 56 * file extension is not recognized. */ 57 output_format = HB_BUFFER_SERIALIZE_FORMAT_TEXT; 58 } 59 60 unsigned int flags = HB_BUFFER_SERIALIZE_FLAGS_DEFAULT; 61 if (!format.show_glyph_names) 62 flags |= HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES; 63 if (!format.show_clusters) 64 flags |= HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS; 65 if (!format.show_positions) 66 flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS; 67 format_flags = (hb_buffer_serialize_flags_t) flags; 68 } 69 void new_line (void) 70 { 71 line_no++; 72 } 73 void consume_text (hb_buffer_t *buffer, 74 const char *text, 75 unsigned int text_len, 76 hb_bool_t utf8_clusters) 77 { 78 g_string_set_size (gs, 0); 79 format.serialize_buffer_of_text (buffer, line_no, text, text_len, font, gs); 80 fprintf (options.fp, "%s", gs->str); 81 } 82 void shape_failed (hb_buffer_t *buffer, 83 const char *text, 84 unsigned int text_len, 85 hb_bool_t utf8_clusters) 86 { 87 g_string_set_size (gs, 0); 88 format.serialize_message (line_no, "msg: all shapers failed", gs); 89 fprintf (options.fp, "%s", gs->str); 90 } 91 void consume_glyphs (hb_buffer_t *buffer, 92 const char *text, 93 unsigned int text_len, 94 hb_bool_t utf8_clusters) 95 { 96 g_string_set_size (gs, 0); 97 format.serialize_buffer_of_glyphs (buffer, line_no, text, text_len, font, 98 output_format, format_flags, gs); 99 fprintf (options.fp, "%s", gs->str); 100 } 101 void finish (const font_options_t *font_opts) 102 { 103 hb_font_destroy (font); 104 g_string_free (gs, true); 105 gs = NULL; 106 font = NULL; 107 } 108 109 protected: 110 output_options_t options; 111 format_options_t format; 112 113 GString *gs; 114 unsigned int line_no; 115 hb_font_t *font; 116 hb_buffer_serialize_format_t output_format; 117 hb_buffer_serialize_flags_t format_flags; 118}; 119 120int 121main (int argc, char **argv) 122{ 123 main_font_text_t<shape_consumer_t<output_buffer_t> > driver; 124 return driver.main (argc, argv); 125} 126