/*
* Copyright 2018 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can
* be found in the LICENSE file.
*
*/
//
//
//
#pragma once
//
//
//
#include <stdint.h>
//
//
//
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);
//
//
//