/* Copyright (C) 1989, 1990 Aladdin Enterprises.  All rights reserved.
   Distributed by Free Software Foundation, Inc.

This file is part of Ghostscript.

Ghostscript is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY.  No author or distributor accepts responsibility
to anyone for the consequences of using it or for whether it serves any
particular purpose or works at all, unless he says so in writing.  Refer
to the Ghostscript General Public License for full details.

Everyone is granted permission to copy, modify and redistribute
Ghostscript, but only under the conditions described in the Ghostscript
General Public License.  A copy of this license is supposed to have been
given to you along with Ghostscript so you can know your rights and
responsibilities.  It should be in a file named COPYING.  Among other
things, the copyright notice and this notice must be preserved on all
copies.  */

/* gsmatrix.h */
/* Definition of matrices and matrix routines for GhostScript library */

/* See p. 65 of the PostScript manual for the semantics of */
/* transformation matrices. */

/* Structure for a transformation matrix. */
/* This is a machine-dependent hack to avoid importing */
/* the full definition of a GhostScript type-tagged reference. */
#define _matrix_body\
	float xx; long _xx /*skip*/;\
	float xy; long _xy /*skip*/;\
	float yx; long _yx /*skip*/;\
	float yy; long _yy /*skip*/;\
	float tx; long _tx /*skip*/;\
	float ty; long _ty /*skip*/
typedef struct gs_matrix_s {
	_matrix_body;
} gs_matrix;
/* Macro for initializing constant matrices */
#define constant_matrix_body(xx, xy, yx, yy, tx, ty)\
	(float)(xx),0L, (float)(xy),0L, (float)(yx),0L,\
	(float)(yy),0L, (float)(tx),0L, (float)(ty),0L

/* The identity matrix (for structure initialization) */
#define identity_matrix_body\
	constant_matrix_body(1, 0, 0, 1, 0, 0)

/* Matrix creation */
void	gs_make_identity(P1(gs_matrix *));
int	gs_make_translation(P3(floatp, floatp, gs_matrix *)),
	gs_make_scaling(P3(floatp, floatp, gs_matrix *)),
	gs_make_rotation(P2(floatp, gs_matrix *));

/* Matrix arithmetic */
int	gs_matrix_multiply(P3(gs_matrix *, gs_matrix *, gs_matrix *)),
	gs_matrix_invert(P2(gs_matrix *, gs_matrix *)),
	gs_matrix_rotate(P3(gs_matrix *, floatp, gs_matrix *));

/* Coordinate transformation */
int	gs_point_transform(P4(floatp, floatp, gs_matrix *, gs_point *)),
	gs_point_transform_inverse(P4(floatp, floatp, gs_matrix *, gs_point *)),
	gs_distance_transform(P4(floatp, floatp, gs_matrix *, gs_point *)),
	gs_distance_transform_inverse(P4(floatp, floatp, gs_matrix *, gs_point *)),
	gs_bbox_transform_inverse(P3(gs_rect *, gs_matrix *, gs_rect *));
