#include "config.h"

#include "gskgpuprintprivate.h"

#include "gskgpucolorstatesprivate.h"
#include "gskgpuimageprivate.h"
#include "gskgpushaderflagsprivate.h"

void
gsk_gpu_print_indent (GString *string,
                      guint    indent)
{
  g_string_append_printf (string, "%*s", 2 * indent, "");
}

void
gsk_gpu_print_shader_flags (GString           *string,
                            GskGpuShaderFlags  flags,
                            gboolean           first)
{
  GskGpuShaderClip clip = gsk_gpu_shader_flags_get_clip (flags);

  g_string_append (string, first ? "+ " : "| ");
#if 0
  g_string_append (string, first ? (last ? "⧫ " : "▲ ") 
                                 : (last ? "▼ " : "▮ "));
#endif

  switch (clip)
    {
      case GSK_GPU_SHADER_CLIP_NONE:
        g_string_append (string, "⬚ ");
        break;
      case GSK_GPU_SHADER_CLIP_RECT:
        g_string_append (string, "□ ");
        break;
      case GSK_GPU_SHADER_CLIP_ROUNDED:
        g_string_append (string, "▢ ");
        break;
      default:
        g_assert_not_reached ();
        break;
    }
}

void
gsk_gpu_print_color_states (GString           *string,
                            GskGpuColorStates  color_states)
{
  if (gsk_gpu_color_states_get_alt (color_states) == gsk_gpu_color_states_get_output (color_states))
    g_string_append_printf (string, "any %s -> %s ",
                            gsk_gpu_color_states_is_alt_premultiplied (color_states) ? "(p)" : "",
                            gsk_gpu_color_states_is_output_premultiplied (color_states) ? "(p)" : "");
  else
    g_string_append_printf (string, "%s%s -> %s%s ",
                            gdk_color_state_get_name (gsk_gpu_color_states_get_alt (color_states)),
                            gsk_gpu_color_states_is_alt_premultiplied (color_states) ? "(p)" : "",
                            gdk_color_state_get_name (gsk_gpu_color_states_get_output (color_states)),
                            gsk_gpu_color_states_is_output_premultiplied (color_states) ? "(p)" : "");
}

void
gsk_gpu_print_op (GString    *string,
                  guint       indent,
                  const char *op_name)
{
  gsk_gpu_print_indent (string, indent);
  g_string_append (string, op_name);
  g_string_append_c (string, ' ');
}

void
gsk_gpu_print_string (GString    *string,
                      const char *s)
{
  g_string_append (string, s);
  g_string_append_c (string, ' ');
}

void
gsk_gpu_print_enum (GString *string,
                    GType    type,
                    int      value)
{
  GEnumClass *class;

  class = g_type_class_ref (type);
  gsk_gpu_print_string (string, g_enum_get_value (class, value)->value_nick);
  g_type_class_unref (class);
}

void
gsk_gpu_print_rect (GString     *string,
                    const float  rect[4])
{
  g_string_append_printf (string, "%g %g %g %g ",
                          rect[0], rect[1],
                          rect[2], rect[3]);
}

void
gsk_gpu_print_int_rect (GString                     *string,
                        const cairo_rectangle_int_t *rect)
{
  g_string_append_printf (string, "%d %d %d %d ",
                          rect->x, rect->y,
                          rect->width, rect->height);
}

void
gsk_gpu_print_rounded_rect (GString     *string,
                            const float  rect[12])
{
  gsk_gpu_print_rect (string, (const float *) rect);

  if (rect[4] == 0.0 && rect[5] == 0.0 &&
      rect[6] == 0.0 && rect[7] == 0.0 &&
      rect[8] == 0.0 && rect[9] == 0.0 &&
      rect[10] == 0.0 && rect[11] == 0.0)
    return;

  g_string_append (string, "/ ");

  if (rect[4] != rect[5] ||
      rect[6] != rect[7] ||
      rect[8] != rect[9] ||
      rect[10] != rect[11])
    {
      g_string_append (string, "variable ");
    }
  else if (rect[4] != rect[6] ||
           rect[4] != rect[8] ||
           rect[4] != rect[10])
    {
      g_string_append_printf (string, "%g %g %g %g ",
                              rect[4], rect[6],
                              rect[8], rect[10]);
    }
  else
    {
      g_string_append_printf (string, "%g ", rect[4]);
    }
}

void
gsk_gpu_print_rgba (GString     *string,
                    const float  rgba[4])
{
  GdkRGBA color = { rgba[0], rgba[1], rgba[2], rgba[3] };
  char *s = gdk_rgba_to_string (&color);
  g_string_append (string, s);
  g_string_append_c (string, ' ');
  g_free (s);
}

void
gsk_gpu_print_newline (GString *string)
{
  if (string->len && string->str[string->len - 1] == ' ')
    string->str[string->len - 1] = '\n';
  else
    g_string_append_c (string, '\n');
}

void
gsk_gpu_print_image (GString     *string,
                     GskGpuImage *image)
{
  g_string_append_printf (string, "%zux%zu %s%s ",
                          gsk_gpu_image_get_width (image),
                          gsk_gpu_image_get_height (image),
                          gsk_gpu_image_get_flags (image) & GSK_GPU_IMAGE_SRGB ? "S" : "",
                          gdk_memory_format_get_name (gsk_gpu_image_get_format (image)));
}

