/* utility matrix ops for cii test programs */
/* NOT SUPPORTED */
#include "cii.h"
#include "cii←matrix.h"
#include <math.h>

extern CII←RES
CIU←MakeScale(float s, float mp[]) {
mp[0] = s;	mp[1] = 0.0;
mp[2] = 0.0;	mp[3] = s;
mp[4] = 0.0;	mp[5] = 0.0;
return(CII←RES←ok);
}

extern CII←RES
CIU←MakeScale2(float sx, float sy, float mp[]) {
mp[0] = sx;	mp[1] = 0.0;
mp[2] = 0.0;	mp[3] = sy;
mp[4] = 0.0;	mp[5] = 0.0;
return(CII←RES←ok);
}

extern CII←RES
CIU←MakeTranslate(float x, float y, float mp[]) {
mp[0] = 1;	mp[1] = 0.0;
mp[2] = 0.0;	mp[3] = 1;
mp[4] = x;	mp[5] = y;
return(CII←RES←ok);
}

extern CII←RES
CIU←MakeRotate(float d, float mp[]) {
float c,s;
double r;
r = d*(3.14159265358979323 / 180.0);
c = cos(r);
s = sin(r);
mp[0] = c;	mp[1] = s;
mp[2] = -s;	mp[3] = c;
mp[4] = 0;	mp[5] = 0;
return(CII←RES←ok);
}

extern CII←RES
CIU←ApplyPreConcat(float Ap[], float Rp[]) {
/* Coded for clarity more than speed.  There are superfluous multiplies here. */
float A00, A01, A02, A10, A11, A12, A20, A21, A22;
float B00, B01, B02, B10, B11, B12, B20, B21, B22;
A00 = Ap[0];
A01 = Ap[1];
A02 = 0.0;
A10 = Ap[2];
A11 = Ap[3];
A12 = 0.0;
A20 = Ap[4];
A21 = Ap[5];
A22 = 1.0;
B00 = Rp[0];
B01 = Rp[1];
B02 = 0.0;
B10 = Rp[2];
B11 = Rp[3];
B12 = 0.0;
B20 = Rp[4];
B21 = Rp[5];
B22 = 1.0;
Rp[0] = A00 * B00 + A01 * B10 + A02 * B20;
Rp[1] = A00 * B01 + A01 * B11 + A02 * B21;
Rp[2] = A10 * B00 + A11 * B10 + A12 * B20;
Rp[3] = A10 * B01 + A11 * B11 + A12 * B21;
Rp[4] = A20 * B00 + A21 * B10 + A22 * B20;
Rp[5] = A20 * B01 + A21 * B11 + A22 * B21;
return(CII←RES←ok);
}

extern CII←RES
CIU←TransformPoint(CII←VectorRep *v, float mp[], CII←VectorRep *Rp) {
float B00, B01, B02, B10, B11, B12, B20, B21, B22;
float x, y;
x = v->x;
y = v->y;
B00 = mp[0];
B01 = mp[1];
B02 = 0.0;
B10 = mp[2];
B11 = mp[3];
B12 = 0.0;
B20 = mp[4];
B21 = mp[5];
B22 = 1.0;
Rp->x = x * B00 + y * B10 + B20;
Rp->y = x * B01 + y * B11 + B21;
}

extern CII←RES
CIU←TransformVec(CII←VectorRep *v, float mp[], CII←VectorRep *Rp) {
float B00, B01, B02, B10, B11, B12, B20, B21, B22;
float x, y;
x = v->x;
y = v->y;
B00 = mp[0];
B01 = mp[1];
B10 = mp[2];
B11 = mp[3];
Rp->x = x * B00 + y * B10;
Rp->y = x * B01 + y * B11;
}

extern CII←RES
CIU←ApplyPreScale(float s, float mp[]) {
float a[6];
CIU←MakeScale(s, a);
return(CIU←ApplyPreConcat(a, mp));
}

extern CII←RES
CIU←ApplyPreScale2(float sx, float sy, float mp[]) {
float a[6];
CIU←MakeScale2(sx, sy, a);
return(CIU←ApplyPreConcat(a, mp));
}

extern CII←RES
CIU←ApplyPreRotate(float d, float mp[]) {
float a[6];
CIU←MakeRotate(d, a);
return(CIU←ApplyPreConcat(a, mp));
}

extern CII←RES
CIU←ApplyPreTranslate(float x, float y, float mp[]) {
float a[6];
CIU←MakeTranslate(x, y, a);
return(CIU←ApplyPreConcat(a, mp));
}