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