/* 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)); }