blob: 275f529db55c04b2d282d1dc784ed15ab22e7a68 [file] [log] [blame]
/*
* 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);
//
//
//