/*
 * Copyright © 2011  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
 */

#ifndef VIEW_CAIRO_HH
#define VIEW_CAIRO_HH

#include "view-options.hh"
#include "output-options.hh"
#include "helper-cairo.hh"

struct view_cairo_t : view_options_t, output_options_t<>
{
  ~view_cairo_t ()
  {
    cairo_debug_reset_static_data ();
  }

  void add_options (option_parser_t *parser)
  {
    parser->set_summary ("View text with given font.");
    parser->set_description ("Shows image of rendering text with a given font in various formats.");

    view_options_t::add_options (parser);
    output_options_t::add_options (parser, helper_cairo_supported_formats);
  }

  void init (hb_buffer_t *buffer, const font_options_t *font_opts)
  {
    lines = g_array_new (false, false, sizeof (helper_cairo_line_t));
    subpixel_bits = font_opts->subpixel_bits;
  }
  void new_line () {}
  void consume_text (hb_buffer_t  *buffer,
		     const char   *text,
		     unsigned int  text_len,
		     hb_bool_t     utf8_clusters) {}
  void error (const char *message)
  { g_printerr ("%s: %s\n", g_get_prgname (), message); }
  void consume_glyphs (hb_buffer_t  *buffer,
		       const char   *text,
		       unsigned int  text_len,
		       hb_bool_t     utf8_clusters)
  {
    direction = hb_buffer_get_direction (buffer);
    helper_cairo_line_t l (text, text_len, buffer, utf8_clusters, subpixel_bits);
    g_array_append_val (lines, l);
  }
  void finish (hb_buffer_t *buffer, const font_options_t *font_opts)
  {
    render (font_opts);

    for (unsigned int i = 0; i < lines->len; i++) {
      helper_cairo_line_t &line = g_array_index (lines, helper_cairo_line_t, i);
      line.finish ();
    }
    g_array_unref (lines);
  }

  protected:

  void render (const font_options_t *font_opts);
  void draw_lines (cairo_t *cr, hb_font_t *font, double leading, int vert, int horiz);

  hb_direction_t direction = HB_DIRECTION_INVALID; // Remove this, make segment_properties accessible
  GArray *lines = nullptr;
  unsigned subpixel_bits = 0;
};

inline void
view_cairo_t::draw_lines (cairo_t *cr, hb_font_t *font, double leading, int vert, int horiz)
{
  const bool use_foreground_palette =
    foreground_use_palette && foreground_palette && foreground_palette->len;
  const bool use_stroke = stroke_enabled && stroke_width > 0;
  unsigned palette_glyph_index = 0;

  cairo_translate (cr, +vert * leading, -horiz * leading);
  for (unsigned int i = 0; i < lines->len; i++)
  {
    helper_cairo_line_t &l = g_array_index (lines, helper_cairo_line_t, i);

    cairo_translate (cr, -vert * leading, +horiz * leading);

    if (show_extents)
    {
      cairo_save (cr);

      /* Foreground for parity with the other utils' --show-
       * extents overlay (raster, vector, gpu).  Stroked rect
       * around each glyph's ink box, plus a filled dot at the
       * pen origin. */
      cairo_set_source_rgba (cr,
			     foreground_color.r / 255.,
			     foreground_color.g / 255.,
			     foreground_color.b / 255.,
			     foreground_color.a / 255.);
      cairo_set_line_width (cr, 1);
      for (unsigned i = 0; i < l.num_glyphs; i++)
      {
	hb_glyph_extents_t hb_extents;
	if (hb_font_get_glyph_extents (font, l.glyphs[i].index, &hb_extents))
	{
	  double x1 = scalbn ((double) hb_extents.x_bearing, - (int) subpixel_bits);
	  double y1 = -scalbn ((double) hb_extents.y_bearing, - (int) subpixel_bits);
	  double width = scalbn ((double) hb_extents.width, - (int) subpixel_bits);
	  double height = -scalbn ((double) hb_extents.height, - (int) subpixel_bits);

	  cairo_rectangle (cr, l.glyphs[i].x + x1, l.glyphs[i].y + y1, width, height);
	}
      }
      cairo_stroke (cr);

      /* Filled origin dot. */
      for (unsigned i = 0; i < l.num_glyphs; i++)
      {
	cairo_arc (cr, l.glyphs[i].x, l.glyphs[i].y, 2., 0., 2 * G_PI);
	cairo_fill (cr);
      }

      cairo_restore (cr);
    }

    if (use_foreground_palette)
    {
      for (unsigned j = 0; j < l.num_glyphs; j++)
      {
	auto &color = g_array_index (foreground_palette, rgba_color_t,
				      palette_glyph_index++ % foreground_palette->len);
	cairo_set_source_rgba (cr,
			       color.r / 255.,
			       color.g / 255.,
			       color.b / 255.,
			       color.a / 255.);
	cairo_show_glyphs (cr, l.glyphs + j, 1);
      }
    }
    else
    {
      // https://github.com/harfbuzz/harfbuzz/issues/4378
#if CAIRO_VERSION >= 11705
      if (l.num_clusters)
	cairo_show_text_glyphs (cr,
				l.utf8, l.utf8_len,
				l.glyphs, l.num_glyphs,
				l.clusters, l.num_clusters,
				l.cluster_flags);
      else
#endif
	cairo_show_glyphs (cr, l.glyphs, l.num_glyphs);
    }

    if (use_stroke && l.num_glyphs)
    {
      cairo_save (cr);
      cairo_set_source_rgba (cr,
			     stroke_color.r / 255.,
			     stroke_color.g / 255.,
			     stroke_color.b / 255.,
			     stroke_color.a / 255.);
      cairo_set_line_width (cr, stroke_width);
      cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
      cairo_set_line_join (cr, CAIRO_LINE_JOIN_ROUND);
      cairo_new_path (cr);
      cairo_glyph_path (cr, l.glyphs, l.num_glyphs);
      cairo_stroke (cr);
      cairo_restore (cr);
    }
  }
}

inline void
view_cairo_t::render (const font_options_t *font_opts)
{
  bool vertical = HB_DIRECTION_IS_VERTICAL (direction);
  int vert  = vertical ? 1 : 0;
  int horiz = vertical ? 0 : 1;

  int x_sign = font_opts->font_size_x < 0 ? -1 : +1;
  int y_sign = font_opts->font_size_y < 0 ? -1 : +1;

  hb_font_t *font = font_opts->font;

  if (!have_font_extents)
  {
    hb_font_extents_t hb_extents;
    hb_font_get_extents_for_direction (font, direction, &hb_extents);
    font_extents.ascent = scalbn ((double) hb_extents.ascender, - (int) subpixel_bits);
    font_extents.descent = -scalbn ((double) hb_extents.descender, - (int) subpixel_bits);
    font_extents.line_gap = scalbn ((double) hb_extents.line_gap, - (int) subpixel_bits);
    have_font_extents = true;
  }

  double ascent = y_sign * font_extents.ascent;
  double descent = y_sign * font_extents.descent;
  double line_gap = y_sign * font_extents.line_gap + line_space;
  double leading = ascent + descent + line_gap;

  /* Calculate logical surface size. */
  double logical_w = 0, logical_h = 0;
  (vertical ? logical_w : logical_h) = (int) lines->len * leading - (font_extents.line_gap + line_space);
  (vertical ? logical_h : logical_w) = 0;
  for (unsigned int i = 0; i < lines->len; i++) {
    helper_cairo_line_t &line = g_array_index (lines, helper_cairo_line_t, i);
    double x_advance, y_advance;
    line.get_advance (&x_advance, &y_advance);
    if (vertical)
      logical_h =  MAX (logical_h, y_sign * y_advance);
    else
      logical_w =  MAX (logical_w, x_sign * x_advance);
  }

  cairo_scaled_font_t *scaled_font = helper_cairo_create_scaled_font (font_opts,
								      this);

  /* See if font needs color. */
  cairo_content_t content = CAIRO_CONTENT_ALPHA;
  if (helper_cairo_scaled_font_has_color (scaled_font))
    content = CAIRO_CONTENT_COLOR;

  double surface_w = logical_w, surface_h = logical_h;
  double surface_shift_x = 0, surface_shift_y = 0;
  bool include_logical = include_logical_extents ();
  bool include_ink = include_ink_extents ();
  if (include_ink)
  {
    cairo_surface_t *ink_surface = cairo_recording_surface_create (content, nullptr);
    cairo_t *ink_cr = cairo_create (ink_surface);
    cairo_set_scaled_font (ink_cr, scaled_font);

    if (vertical)
      cairo_translate (ink_cr,
		       logical_w - ascent, /* We currently always stack lines right to left */
		       y_sign < 0 ? logical_h : 0);
    else
     {
      cairo_translate (ink_cr,
		       x_sign < 0 ? logical_w : 0,
		       y_sign < 0 ? descent : ascent);
     }

    draw_lines (ink_cr, font, leading, vert, horiz);

    double ink_x, ink_y, ink_w, ink_h;
    cairo_recording_surface_ink_extents (ink_surface, &ink_x, &ink_y, &ink_w, &ink_h);
    if (ink_w > 0 && ink_h > 0)
    {
      if (include_logical)
      {
	double x1 = MIN (0., ink_x);
	double y1 = MIN (0., ink_y);
	double x2 = MAX (logical_w, ink_x + ink_w);
	double y2 = MAX (logical_h, ink_y + ink_h);
	surface_w = x2 - x1;
	surface_h = y2 - y1;
	surface_shift_x = -x1;
	surface_shift_y = -y1;
      }
      else
      {
	surface_w = ink_w;
	surface_h = ink_h;
	surface_shift_x = -ink_x;
	surface_shift_y = -ink_y;
      }
    }

    cairo_destroy (ink_cr);
    cairo_surface_destroy (ink_surface);
  }

  /* Create surface. */
  cairo_t *cr = helper_cairo_create_context (surface_w + margin.l + margin.r,
					     surface_h + margin.t + margin.b,
					     this,
					     this,
					     content);
  cairo_set_scaled_font (cr, scaled_font);

  /* Setup coordinate system. */
  cairo_translate (cr, margin.l + surface_shift_x, margin.t + surface_shift_y);
  if (vertical)
    cairo_translate (cr,
		     logical_w - ascent, /* We currently always stack lines right to left */
		     y_sign < 0 ? logical_h : 0);
  else
   {
    cairo_translate (cr,
		     x_sign < 0 ? logical_w : 0,
		     y_sign < 0 ? descent : ascent);
   }

  /* Draw. */
  draw_lines (cr, font, leading, vert, horiz);

  /* Clean up. */
  helper_cairo_destroy_context (cr);
  cairo_scaled_font_destroy (scaled_font);
}

#endif
