Home | History | Annotate | Download | only in util
      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 
     31 struct 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 
    120 int
    121 main (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