/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can
 * be found in the LICENSE file.
 *
 */

#ifndef SKC_ONCE_STYLING_TYPES
#define SKC_ONCE_STYLING_TYPES

//
//
//

#include "types.h"
#include "macros.h"
#include "skc_styling.h"

//
//
//

typedef skc_uint  skc_layer_id;
typedef skc_uint  skc_group_id;

//
//
//

union skc_styling_cmd
{
  skc_uint                    u32;
  skc_int                     s32;
  skc_float                   f32;
  skc_half                    f16a2[2];
  skc_ushort2                 u16v2;
  skc_styling_opcode_e        opcode;
  skc_styling_gradient_type_e gradient_type;
  skc_group_id                parent;

#if 0
#if !defined(__OPENCL_C_VERSION__)
  struct {
    skc_uint                  opcode : 31;
    skc_uint                  final  : 1;
  };
#endif
#endif
};

#define SKC_STYLING_OPCODE_MASK_OPCODE    SKC_BITS_TO_MASK(31)
#define SKC_STYLING_OPCODE_MASK_IS_FINAL  SKC_BITS_TO_MASK_AT(1,31)

SKC_STATIC_ASSERT(sizeof(union skc_styling_cmd) == sizeof(skc_uint));

//
//
//

union skc_layer_node
{
  skc_uint2      u32v2;

  struct {
    skc_uint     cmds;   // starting index of sequence of command words
    skc_group_id parent; // index of parent group
  };
};

SKC_STATIC_ASSERT(sizeof(union skc_layer_node) == sizeof(skc_uint2));

//
//
//

union skc_group_parents
{
  skc_uint2  u32v2;

  struct {
    skc_uint depth;
    skc_uint base;
  };
};

SKC_STATIC_ASSERT(sizeof(union skc_group_parents) == sizeof(skc_uint2));

//
// inclusive layer range [lo,hi]
//

union skc_group_range
{
  skc_uint2  u32v2;

  struct {
    skc_uint lo; // first layer
    skc_uint hi; // last  layer
  };
};

SKC_STATIC_ASSERT(sizeof(union skc_group_range) == sizeof(skc_uint2));

//
//
//

struct skc_group_node
{
  union skc_group_parents parents; // path of parent groups leading back to root

  union skc_group_range   range;   // range of layers enclosed by this group

  struct {
    skc_uint              enter;   // starting index of sequence of command words
    skc_uint              leave;   // starting index of sequence of command words
  } cmds;
};

SKC_STATIC_ASSERT(sizeof(struct skc_group_node) == sizeof(skc_uint2) * 3); // 6 words

//
//
//

union skc_gradient_slope
{
  skc_float  slope;
  skc_half   color_pair[2];
};

SKC_STATIC_ASSERT(sizeof(union skc_gradient_slope) == sizeof(skc_float));

//
//
//

union skc_gradient_vector
{
  skc_float4               f32v4;

  struct {
    skc_float              dx;
    skc_float              p0;
    skc_float              dy;
    skc_float              denom;
  };

  union skc_gradient_slope slopes[4];
};

SKC_STATIC_ASSERT(sizeof(union skc_gradient_vector) == sizeof(skc_float4));

//
// FIXME -- will eventually need to know if this gradient is
// perspective transformed and if so additional values will need to be
// encoded
//
// VERSION 1
// =============================================================
//
// LINEAR GRADIENT HEADER FOR N STOPS
//
// +----------+----------+------------+----------+-------------+
// |  HEADER  |   INFO   |    LUTS    |  FLOORS  |    COLORS   |
// +----------+----------+------------+----------+-------------+
// |  uintv4  | u32v2[1] | f32v2[N-1] | f32[N-2] | ushort2[4N] |
// +----------+----------+------------+----------+-------------+
//
//   COLOR PAIR            WORD EXPANSION            TOTAL
// +------------+---------------------------------+--------+-------------------------+
// |  ushort2   |  4 + 2 + 2*(N-1) + N - 2 + 4*N  | 7N + 2 | = 7(N-1+1)+2 = 7(N-1)+9 |
// +------------+---------------------------------+--------+-------------------------+
//
// COLOR LAYOUT:
//
//   R[0]R[1], R[1]R[2], ... R[N-1]R[N-1]
//   G[0]G[1], G[1]G[2], ... G[N-1]G[N-1]
//   B[0]B[1], B[1]B[2], ... B[N-1]B[N-1]
//   A[0]A[1], A[1]A[2], ... A[N-1]A[N-1]
//
//
// MINIMUM WORDS:  N=2 --> 16
//
//
// VERSION 2
// =============================================================
//
// LINEAR GRADIENT DESCRIPTOR FOR N STOPS
//
//                           +--------------- REMOVE ME LATER
//                           v
// +--------+------+-------+---+----------+-----------+
// | VECTOR | TYPE | COUNT | N |  SLOPES  |   COLORS  |
// +--------+------+-------+---+----------+-----------+
// |  f32v4 |   1  |   1   | 1 | f32[N-1] | f16v2[4N] |
// +--------+------+-------+---+----------+-----------+
//
//   COLOR PAIR           WORD EXPANSION            TOTAL
// +------------+--------------------------------+--------+
// |   f16v2    |  4 + 1 + 1 + 1 + [N-1] + [4*N] | 5N + 6 |
// +------------+--------------------------------+--------+
//
// COLOR LAYOUT:
//
//   R[0]R[1], R[1]R[2], ... R[N-1]R[N-1] <-------------------------- FIXME -- USE HERB'S SINGLE FMA REPRESENTATION
//   G[0]G[1], G[1]G[2], ... G[N-1]G[N-1] <-------------------------- FIXME -- USE HERB'S SINGLE FMA REPRESENTATION
//   B[0]B[1], B[1]B[2], ... B[N-1]B[N-1] <-------------------------- FIXME -- USE HERB'S SINGLE FMA REPRESENTATION
//   A[0]A[1], A[1]A[2], ... A[N-1]A[N-1] <-------------------------- FIXME -- USE HERB'S SINGLE FMA REPRESENTATION
//
//
// MINIMUM WORDS:  N=2 --> 16
//
//
// VERSION 3+
// =============================================================
//
// FIXME -- will probably want to try using the sampler/texture
// hardware to interpolate colors.
//
// This will require that the colors are laid out in sampler-friendly
// order:
//
//    RGBA[0]RGBA[1], RGBA[1]RGBA[2], ..., RGBA[N-1]RGBA[N-1]
//
//

#if 0
#define SKC_GRADIENT_HEADER_WORDS_LUTS_OFFSET       4
#define SKC_GRADIENT_HEADER_WORDS_TOTAL(n_minus_1)  (7 * (n_minus_1) + 9)
#define SKC_GRADIENT_HEADER_WORDS_MIN               SKC_GRADIENT_HEADER_WORDS_TOTAL(1)
#define SKC_GRADIENT_CMD_WORDS_V1(n)                (1 + SKC_GRADIENT_HEADER_WORDS_TOTAL(n-1))
#endif

#define SKC_GRADIENT_CMD_WORDS_V1(n)                (7 * (n) + 2)
#define SKC_GRADIENT_CMD_WORDS_V2(n)                (5 * (n) + 6)
#define SKC_GRADIENT_CMD_WORDS_V2_ADJUST(v1,v2)     (SKC_GRADIENT_CMD_WORDS_V1(v1) - ((v2) + 6))

//
//
//

#endif

//
//
//
