/*
|
* 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);
|
|
//
|
//
|
//
|