#ifndef __MATRIX_H__
#define __MATRIX_H__
#include "user.h"
typedef enum {
MatrixSet=0,
MatrixAppend=1,
MatrixPrepend=2
} MATRIXMODE;
typedef enum {
MatrixM11,
MatrixM12,
MatrixM21,
MatrixM22,
MatrixDx,
MatrixDy
} MATRIXELEMENT;
typedef struct{
DWORD opaque[14];
} MATRIX;
#define GetM11(x) MatrixGetValue(x,MatrixM11)
#define GetM12(x) MatrixGetValue(x,MatrixM12)
#define GetM21(x) MatrixGetValue(x,MatrixM21)
#define GetM22(x) MatrixGetValue(x,MatrixM22)
#define GetDx(x) MatrixGetValue(x,MatrixDx)
#define GetDy(x) MatrixGetValue(x,MatrixDy)
#define MatrixDoAppend(dst,src) MatrixMultiply(dst,dst,src)
#define MatrixDoPrepend(dst,src) MatrixMultiply(dst,src,dst)
double MatrixDeterminant(MATRIX *mat);
BOOL MatrixInvert(MATRIX *matDst, MATRIX *matSrc);
BOOL MatrixIsInvertible(MATRIX *mat);
BOOL MatrixIsIdentity(MATRIX *mat);
void MatrixSetIdentity(MATRIX *mat);
BOOL MatrixEquals(MATRIX *mat, MATRIX *mat2);
BOOL MatrixAreClose(MATRIX *mat, MATRIX *mat2);
void MatrixTransformVectors(MATRIX *mat, double *pts, DWORD numpts);
void MatrixTransformPoints(MATRIX *mat, double *pts, DWORD numpts);
double MatrixGetValue(MATRIX *mat, MATRIXELEMENT elem);
BOOL MatrixSetValue(MATRIX *mat, MATRIXELEMENT elem, double value);
BOOL MatrixGetValueArray(MATRIX *mat, double *values);
BOOL MatrixSetValueArray(MATRIX *mat, double *values);
void MatrixSetValues(MATRIX *mat, double m11, double m12, double m21, double m22, double dx, double dy);
void MatrixMultiply(MATRIX *matResult, MATRIX *matLeft, MATRIX *matRight);
void MatrixTranslate(MATRIX *mat, double x, double y, MATRIXMODE mode);
void MatrixScale(MATRIX *mat, double x, double y, MATRIXMODE mode);
void MatrixRotate(MATRIX *mat, double degrees, MATRIXMODE mode);
void MatrixParallelogram(MATRIX *mat, double *rect, double *points, MATRIXMODE mode);
void MatrixRotateAt(MATRIX *mat, double degrees, double x, double y, MATRIXMODE mode);
void MatrixScaleAt(MATRIX *mat, double x, double y, double centerX, double centerY, MATRIXMODE mode);
void MatrixShear(MATRIX *mat, double shearX, double shearY, MATRIXMODE mode);
void MatrixSkew(MATRIX *mat, double angleX, double angleY, MATRIXMODE mode);
#endif