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