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, hb_buffer_serialize_list_formats ()),
     35 		    format (parser),
     36 		    gs (NULL),
     37 		    line_no (0),
     38 		    font (NULL) {}
     39 
     40   void init (const font_options_t *font_opts)
     41   {
     42     options.get_file_handle ();
     43     gs = g_string_new (NULL);
     44     line_no = 0;
     45     font = hb_font_reference (font_opts->get_font ());
     46 
     47     if (!options.output_format)
     48       output_format = HB_BUFFER_SERIALIZE_FORMAT_TEXT;
     49     else
     50       output_format = hb_buffer_serialize_format_from_string (options.output_format, -1);
     51     /* An empty "output_format" parameter basically skips output generating.
     52      * Useful for benchmarking. */
     53     if ((!options.output_format || *options.output_format) &&
     54 	!hb_buffer_serialize_format_to_string (output_format))
     55     {
     56       if (options.explicit_output_format)
     57 	fail (false, "Unknown output format `%s'; supported formats are: %s",
     58 	      options.output_format,
     59 	      g_strjoinv ("/", const_cast<char**> (options.supported_formats)));
     60       else
     61 	/* Just default to TEXT if not explicitly requested and the
     62 	 * file extension is not recognized. */
     63 	output_format = HB_BUFFER_SERIALIZE_FORMAT_TEXT;
     64     }
     65 
     66     unsigned int flags = HB_BUFFER_SERIALIZE_FLAG_DEFAULT;
     67     if (!format.show_glyph_names)
     68       flags |= HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES;
     69     if (!format.show_clusters)
     70       flags |= HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS;
     71     if (!format.show_positions)
     72       flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS;
     73     if (format.show_extents)
     74       flags |= HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS;
     75     format_flags = (hb_buffer_serialize_flags_t) flags;
     76   }
     77   void new_line (void)
     78   {
     79     line_no++;
     80   }
     81   void consume_text (hb_buffer_t  *buffer,
     82 		     const char   *text,
     83 		     unsigned int  text_len,
     84 		     hb_bool_t     utf8_clusters)
     85   {
     86     g_string_set_size (gs, 0);
     87     format.serialize_buffer_of_text (buffer, line_no, text, text_len, font, gs);
     88     fprintf (options.fp, "%s", gs->str);
     89   }
     90   void shape_failed (hb_buffer_t  *buffer,
     91 		     const char   *text,
     92 		     unsigned int  text_len,
     93 		     hb_bool_t     utf8_clusters)
     94   {
     95     g_string_set_size (gs, 0);
     96     format.serialize_message (line_no, "msg: all shapers failed", gs);
     97     fprintf (options.fp, "%s", gs->str);
     98   }
     99   void consume_glyphs (hb_buffer_t  *buffer,
    100 		       const char   *text,
    101 		       unsigned int  text_len,
    102 		       hb_bool_t     utf8_clusters)
    103   {
    104     g_string_set_size (gs, 0);
    105     format.serialize_buffer_of_glyphs (buffer, line_no, text, text_len, font,
    106 				       output_format, format_flags, gs);
    107     fprintf (options.fp, "%s", gs->str);
    108   }
    109   void finish (const font_options_t *font_opts)
    110   {
    111     hb_font_destroy (font);
    112     g_string_free (gs, true);
    113     gs = NULL;
    114     font = NULL;
    115   }
    116 
    117   protected:
    118   output_options_t options;
    119   format_options_t format;
    120 
    121   GString *gs;
    122   unsigned int line_no;
    123   hb_font_t *font;
    124   hb_buffer_serialize_format_t output_format;
    125   hb_buffer_serialize_flags_t format_flags;
    126 };
    127 
    128 int
    129 main (int argc, char **argv)
    130 {
    131   main_font_text_t<shape_consumer_t<output_buffer_t>, FONT_SIZE_UPEM, 0> driver;
    132   return driver.main (argc, argv);
    133 }
    134