/*
 * fontconfig/doc/fcmatrix.fncs
 *
 * Copyright © 2003 Keith Packard
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of the author(s) not be used in
 * advertising or publicity pertaining to distribution of the software without
 * specific, written prior permission.  The authors make no
 * representations about the suitability of this software for any purpose.  It
 * is provided "as is" without express or implied warranty.
 *
 * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */

@RET@		void
@FUNC@		FcMatrixInit
@PURPOSE@	initialize an FcMatrix structure
@TYPE1@		FcMatrix *
@ARG1@		matrix
@DESC@
<function>FcMatrixInit</function> initializes <parameter>matrix</parameter>
to the identity matrix.
@@

@FUNC@		FcMatrixCopy
@PURPOSE@	Copy a matrix
@TYPE1@		const FcMatrix *
@ARG1@		matrix
@DESC@
<function>FcMatrixCopy</function> allocates a new FcMatrix
and copies <parameter>mat</parameter> into it.
@@

@FUNC@		FcMatrixEqual
@PURPOSE@	Compare two matrices
@TYPE1@		const FcMatrix *
@ARG1@		matrix1
@TYPE2@		const FcMatrix *
@ARG2@		matrix2
@DESC@
<function>FcMatrixEqual</function> compares <parameter>matrix1</parameter>
and <parameter>matrix2</parameter> returning FcTrue when they are equal and
FcFalse when they are not.
@@

@FUNC@		FcMatrixMultiply
@PURPOSE@	Multiply matrices
@TYPE1@		FcMatrix *
@ARG1@		result
@TYPE2@		const FcMatrix *
@ARG2@		matrix1
@TYPE3@		const FcMatrix *
@ARG3@		matrix2
@DESC@
<function>FcMatrixMultiply</function> multiplies
<parameter>matrix1</parameter> and <parameter>matrix2</parameter> storing
the result in <parameter>result</parameter>.
@@

@FUNC@		FcMatrixRotate
@PURPOSE@	Rotate a matrix
@TYPE1@		FcMatrix *
@ARG1@		matrix
@TYPE2@		double%
@ARG2@		cos
@TYPE3@		double%
@ARG3@		sin
@DESC@
<function>FcMatrixRotate</function> rotates <parameter>matrix</parameter>
by the angle who's sine is <parameter>sin</parameter> and cosine is
<parameter>cos</parameter>.  This is done by multiplying by the
matrix:
<programlisting>
  cos -sin
  sin  cos
</programlisting>
@@

@FUNC@		FcMatrixScale
@PURPOSE@	Scale a matrix
@TYPE1@		FcMatrix *
@ARG1@		matrix
@TYPE2@		double%
@ARG2@		sx
@TYPE3@		double%
@ARG3@		dy
@DESC@
<function>FcMatrixScale</function> multiplies <parameter>matrix</parameter>
x values by <parameter>sx</parameter> and y values by
<parameter>dy</parameter>.  This is done by multiplying by
the matrix:
<programlisting>
   sx  0
   0   dy
</programlisting>
@@

@FUNC@		FcMatrixShear
@PURPOSE@	Shear a matrix
@TYPE1@		FcMatrix *
@ARG1@		matrix
@TYPE2@		double%
@ARG2@		sh
@TYPE3@		double%
@ARG3@		sv
@DESC@
<function>FcMatrixShare</function> shears <parameter>matrix</parameter>
horizontally by <parameter>sh</parameter> and vertically by
<parameter>sv</parameter>.  This is done by multiplying by
the matrix:
<programlisting>
  1  sh
  sv  1
</programlisting>
@@
