/*
 * Copyright © 2011,2012  Google, Inc.
 *
 *  This is part of HarfBuzz, a text shaping library.
 *
 * Permission is hereby granted, without written agreement and without
 * license or royalty fees, to use, copy, modify, and distribute this
 * software and its documentation for any purpose, provided that the
 * above copyright notice and the following two paragraphs appear in
 * all copies of this software.
 *
 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *
 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 *
 * Google Author(s): Behdad Esfahbod
 */

#include "options.hh"

#ifndef HB_MAIN_FONT_TEXT_HH
#define HB_MAIN_FONT_TEXT_HH

/* main() body for utilities taking font and processing text.*/

static char *
locale_to_utf8 (char *s)
{
  char *t;
  GError *error = NULL;

  t = g_locale_to_utf8 (s, -1, NULL, NULL, &error);
  if (!t)
  {
     fail (true, "Failed converting text to UTF-8");
  }

  return t;
}

static hb_bool_t
message_func (hb_buffer_t *buffer,
	      hb_font_t *font,
	      const char *message,
	      void *user_data)
{
  fprintf (stderr, "HB: %s\n", message);
  char buf[4096];
  hb_buffer_serialize_glyphs (buffer, 0, hb_buffer_get_length (buffer),
			      buf, sizeof (buf), NULL,
			      font,
			      HB_BUFFER_SERIALIZE_FORMAT_TEXT,
			      HB_BUFFER_SERIALIZE_FLAG_DEFAULT);
  fprintf (stderr, "HB: buffer [%s]\n", buf);
  return true;
}

template <typename consumer_t, int default_font_size, int subpixel_bits>
struct main_font_text_t
{
  main_font_text_t (void)
		  : options ("[FONT-FILE] [TEXT]"),
		    font_opts (&options, default_font_size, subpixel_bits),
		    input (&options),
		    consumer (&options) {}

  int
  main (int argc, char **argv)
  {
    options.parse (&argc, &argv);

    argc--, argv++;
    if (argc && !font_opts.font_file) font_opts.font_file = locale_to_utf8 (argv[0]), argc--, argv++;
    if (argc && !input.text && !input.text_file) input.text = locale_to_utf8 (argv[0]), argc--, argv++;
    if (argc)
      fail (true, "Too many arguments on the command line");
    if (!font_opts.font_file)
      options.usage ();
    if (!input.text && !input.text_file)
      input.text_file = g_strdup ("-");

    consumer.init (&font_opts);

    hb_buffer_t *buffer = hb_buffer_create ();
    if (debug)
      hb_buffer_set_message_func (buffer, message_func, NULL, NULL);
    unsigned int text_len;
    const char *text;
    while ((text = input.get_line (&text_len)))
      consumer.consume_line (buffer, text, text_len, input.text_before, input.text_after);
    hb_buffer_destroy (buffer);

    consumer.finish (&font_opts);

    return consumer.failed ? 1 : 0;
  }

  protected:
  option_parser_t options;
  font_options_t font_opts;
  text_options_t input;
  consumer_t consumer;
};

#endif

