// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

//
//
//

#ifndef SRC_GRAPHICS_LIB_COMPUTE_TS_TRANSFORM_STACK_H_
#define SRC_GRAPHICS_LIB_COMPUTE_TS_TRANSFORM_STACK_H_

//
//
//

#include <stdint.h>

//
//
//

#ifdef __cplusplus
extern "C" {
#endif

//
//
//

struct ts_transform_stack;

//
//
//

#if 1
typedef float ts_transform_float_t;
#define TS_TRANSFORM_FLOAT_SUFFIX f
#else
typedef double ts_transform_float_t;
#define TS_TRANSFORM_FLOAT_SUFFIX
#endif

//
//
//

typedef uint64_t ts_transform_weakref_t;

#define TS_TRANSFORM_WEAKREF_INVALID UINT64_MAX;

//
//
//

typedef enum ts_transform_type
{
  TS_TRANSFORM_TYPE_INVALID,
  TS_TRANSFORM_TYPE_AFFINE,
  TS_TRANSFORM_TYPE_PROJECTIVE
} ts_transform_type_e;

//
//
//

struct ts_transform_stack *
ts_transform_stack_create(const uint32_t size);

void
ts_transform_stack_release(struct ts_transform_stack * const ts);

//
//
//

uint32_t
ts_transform_stack_save(struct ts_transform_stack * const ts);

void
ts_transform_stack_restore(struct ts_transform_stack * const ts, uint32_t const restore);

//
//
//

ts_transform_float_t *
ts_transform_stack_top_transform(struct ts_transform_stack * const ts);

ts_transform_weakref_t *
ts_transform_stack_top_weakref(struct ts_transform_stack * const ts);

//
//
//

void
ts_transform_stack_dup(struct ts_transform_stack * const ts);

void
ts_transform_stack_drop(struct ts_transform_stack * const ts);

//
//
//

void
ts_transform_stack_transform_xy(struct ts_transform_stack * const ts,
                                ts_transform_float_t const        x,
                                ts_transform_float_t const        y,
                                ts_transform_float_t * const      xp,
                                ts_transform_float_t * const      yp);

//
//
//

void
ts_transform_stack_push_matrix(struct ts_transform_stack * const ts,
                               ts_transform_float_t const        sx,
                               ts_transform_float_t const        shx,
                               ts_transform_float_t const        tx,
                               ts_transform_float_t const        shy,
                               ts_transform_float_t const        sy,
                               ts_transform_float_t const        ty,
                               ts_transform_float_t const        w0,
                               ts_transform_float_t const        w1,
                               ts_transform_float_t const        w2);

void
ts_transform_stack_push_identity(struct ts_transform_stack * const ts);

void
ts_transform_stack_push_affine(struct ts_transform_stack * const ts,
                               ts_transform_float_t const        sx,
                               ts_transform_float_t const        shx,
                               ts_transform_float_t const        tx,
                               ts_transform_float_t const        shy,
                               ts_transform_float_t const        sy,
                               ts_transform_float_t const        ty);

void
ts_transform_stack_push_translate(struct ts_transform_stack * const ts,
                                  ts_transform_float_t const        tx,
                                  ts_transform_float_t const        ty);

void
ts_transform_stack_push_scale(struct ts_transform_stack * const ts,
                              ts_transform_float_t const        sx,
                              ts_transform_float_t const        sy);

void
ts_transform_stack_push_shear(struct ts_transform_stack * const ts,
                              ts_transform_float_t const        shx,
                              ts_transform_float_t const        shy);

void
ts_transform_stack_push_skew_x(struct ts_transform_stack * const ts,
                               ts_transform_float_t const        theta);

void
ts_transform_stack_push_skew_y(struct ts_transform_stack * const ts,
                               ts_transform_float_t const        theta);

void
ts_transform_stack_push_rotate(struct ts_transform_stack * const ts,
                               ts_transform_float_t const        theta);

void
ts_transform_stack_push_rotate_xy2(struct ts_transform_stack * const ts,
                                   ts_transform_float_t const        theta,
                                   ts_transform_float_t const        cx,
                                   ts_transform_float_t const        cy,
                                   ts_transform_float_t const        tx,
                                   ts_transform_float_t const        ty);

void
ts_transform_stack_push_rotate_xy(struct ts_transform_stack * const ts,
                                  ts_transform_float_t const        theta,
                                  ts_transform_float_t const        cx,
                                  ts_transform_float_t const        cy);

void
ts_transform_stack_push_rotate_scale_xy(struct ts_transform_stack * const ts,
                                        ts_transform_float_t const        theta,
                                        ts_transform_float_t const        sx,
                                        ts_transform_float_t const        sy,
                                        ts_transform_float_t const        cx,
                                        ts_transform_float_t const        cy);
//
// Quadrilateral coordinates are ts_transform_float_t2 structs:
//
//   float2[4] = { xy0, xy1, xy2, xy3 }
//
// -or-
//
//   float[8]  = { x0, y0, x1, y1, x2, y2, x3, y3 };
//

ts_transform_type_e
ts_transform_stack_push_quad_to_unit(struct ts_transform_stack * const ts,
                                     ts_transform_float_t const        quad[8]);

ts_transform_type_e
ts_transform_stack_push_unit_to_quad(struct ts_transform_stack * const ts,
                                     ts_transform_float_t const        quad[8]);

ts_transform_type_e
ts_transform_stack_push_quad_to_quad(struct ts_transform_stack * const ts,
                                     ts_transform_float_t const        quad_src[8],
                                     ts_transform_float_t const        quad_dst[8]);

ts_transform_type_e
ts_transform_stack_push_rect_to_quad(struct ts_transform_stack * const ts,
                                     ts_transform_float_t const        x0,
                                     ts_transform_float_t const        y0,
                                     ts_transform_float_t const        x1,
                                     ts_transform_float_t const        y1,
                                     ts_transform_float_t const        quad_dst[8]);

//
// The second matrix on the stack (TOS[-1]) is post-multiplied by the
// top matrix on the stack (TOS[0]).
//
// The result replaces TOS[0] and TOS[-1] is unmodified.
//
// The stack effect of concat is:
//
//   | B |    | A*B |
//   | A |    |  A  |
//   | . | => |  .  |
//   | . |    |  .  |
//   | . |    |  .  |
//

void
ts_transform_stack_concat(struct ts_transform_stack * const ts);

//
// The second matrix on the stack (TOS[-1]) is post-multiplied by the
// top matrix on the stack (TOS[0]).
//
// The result replaces both matrices.
//
// The stack effect of multiply is:
//
//   | B |    | A*B |
//   | A |    |  .  |
//   | . | => |  .  |
//   | . |    |  .  |
//   | . |    |  .  |
//

void
ts_transform_stack_multiply(struct ts_transform_stack * const ts);

//
//
//

#ifdef __cplusplus
}
#endif

//
//
//

#endif  // SRC_GRAPHICS_LIB_COMPUTE_TS_TRANSFORM_STACK_H_
