| /* | |
| * 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 <skc/skc.h> | |
| // | |
| // | |
| // | |
| #if 1 | |
| typedef float skc_transform_float_t; | |
| #define SKC_TRANSFORM_FLOAT_SUFFIX f | |
| #else | |
| typedef double skc_transform_float_t; | |
| #define SKC_TRANSFORM_FLOAT_SUFFIX | |
| #endif | |
| // | |
| // | |
| // | |
| struct skc_transform_stack; | |
| // | |
| // | |
| // | |
| struct skc_transform_stack * | |
| skc_transform_stack_create(const uint32_t size); | |
| void | |
| skc_transform_stack_release(struct skc_transform_stack * const ts); | |
| // | |
| // | |
| // | |
| uint32_t | |
| skc_transform_stack_save(struct skc_transform_stack * const ts); | |
| void | |
| skc_transform_stack_restore(struct skc_transform_stack * const ts, uint32_t const restore); | |
| // | |
| // | |
| // | |
| skc_transform_float_t * | |
| skc_transform_stack_top_transform(struct skc_transform_stack * const ts); | |
| skc_transform_weakref_t * | |
| skc_transform_stack_top_weakref(struct skc_transform_stack * const ts); | |
| // | |
| // | |
| // | |
| void | |
| skc_transform_stack_drop(struct skc_transform_stack * const ts); | |
| void | |
| skc_transform_stack_dup(struct skc_transform_stack * const ts); | |
| // | |
| // | |
| // | |
| void | |
| skc_transform_stack_transform_affine(struct skc_transform_stack * const ts, | |
| skc_transform_float_t const x_pre, | |
| skc_transform_float_t const y_pre, | |
| skc_transform_float_t * const x_post, | |
| skc_transform_float_t * const y_post); | |
| // | |
| // | |
| // | |
| void | |
| skc_transform_stack_push_matrix(struct skc_transform_stack * const ts, | |
| skc_transform_float_t const sx, | |
| skc_transform_float_t const shx, | |
| skc_transform_float_t const tx, | |
| skc_transform_float_t const shy, | |
| skc_transform_float_t const sy, | |
| skc_transform_float_t const ty, | |
| skc_transform_float_t const w0, | |
| skc_transform_float_t const w1, | |
| skc_transform_float_t const w2); | |
| void | |
| skc_transform_stack_push_identity(struct skc_transform_stack * const ts); | |
| void | |
| skc_transform_stack_push_affine(struct skc_transform_stack * const ts, | |
| skc_transform_float_t const sx, | |
| skc_transform_float_t const shx, | |
| skc_transform_float_t const tx, | |
| skc_transform_float_t const shy, | |
| skc_transform_float_t const sy, | |
| skc_transform_float_t const ty); | |
| void | |
| skc_transform_stack_push_translate(struct skc_transform_stack * const ts, | |
| skc_transform_float_t const tx, | |
| skc_transform_float_t const ty); | |
| void | |
| skc_transform_stack_push_scale(struct skc_transform_stack * const ts, | |
| skc_transform_float_t const sx, | |
| skc_transform_float_t const sy); | |
| void | |
| skc_transform_stack_push_shear(struct skc_transform_stack * const ts, | |
| skc_transform_float_t const shx, | |
| skc_transform_float_t const shy); | |
| void | |
| skc_transform_stack_push_skew_x(struct skc_transform_stack * const ts, | |
| skc_transform_float_t const theta); | |
| void | |
| skc_transform_stack_push_skew_y(struct skc_transform_stack * const ts, | |
| skc_transform_float_t const theta); | |
| void | |
| skc_transform_stack_push_rotate(struct skc_transform_stack * const ts, | |
| skc_transform_float_t const theta); | |
| void | |
| skc_transform_stack_push_rotate_xy2(struct skc_transform_stack * const ts, | |
| skc_transform_float_t const theta, | |
| skc_transform_float_t const cx, | |
| skc_transform_float_t const cy, | |
| skc_transform_float_t const tx, | |
| skc_transform_float_t const ty); | |
| void | |
| skc_transform_stack_push_rotate_xy(struct skc_transform_stack * const ts, | |
| skc_transform_float_t const theta, | |
| skc_transform_float_t const cx, | |
| skc_transform_float_t const cy); | |
| void | |
| skc_transform_stack_push_rotate_scale_xy(struct skc_transform_stack * const ts, | |
| skc_transform_float_t const theta, | |
| skc_transform_float_t const sx, | |
| skc_transform_float_t const sy, | |
| skc_transform_float_t const cx, | |
| skc_transform_float_t const cy); | |
| // | |
| // Quadrilateral coordinates are skc_transform_float_t2 structs: | |
| // | |
| // float2[4] = { xy0, xy1, xy2, xy3 } | |
| // | |
| // -or- | |
| // | |
| // float[8] = { x0, y0, x1, y1, x2, y2, x3, y3 }; | |
| // | |
| bool | |
| skc_transform_stack_push_quad_to_unit(struct skc_transform_stack * const ts, | |
| float const quad_src[8]); | |
| bool | |
| skc_transform_stack_push_unit_to_quad(struct skc_transform_stack * const ts, | |
| float const quad_dst[8]); | |
| bool | |
| skc_transform_stack_push_rect_to_quad(struct skc_transform_stack * const ts, | |
| float const x0, | |
| float const y0, | |
| float const x1, | |
| float const y1, | |
| float const quad_dst[8]); | |
| bool | |
| skc_transform_stack_push_quad_to_quad(struct skc_transform_stack * const ts, | |
| float const quad_src[8], | |
| float const quad_dst[8]); | |
| // | |
| // | |
| // | |
| void | |
| skc_transform_stack_concat(struct skc_transform_stack * const ts); | |
| // | |
| // | |
| // | |