LTCD_070816.ISO
This commit is contained in:
1 parent
d14bbc24f9
commit
0e9364ff4c
506 files changed
+157705
-41812
No files matched your search
@@ -0,0 +1,13 @@
|
||||
#help_index "Graphics"
|
||||
|
||||
extern GrBitMap *GrAlias(GrBitMap *base,TssStruct *tss);
|
||||
extern void GrDel(GrBitMap *base);
|
||||
|
||||
#include "GrMath"
|
||||
#include "GrScreen"
|
||||
#include "GrBitMap"
|
||||
#include "GrPlot"
|
||||
#include "GrChar"
|
||||
#include "GrElem"
|
||||
|
||||
#help_index ""
|
||||
File diff suppressed because it is too large.
Load diff
Binary file not shown.
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,569 @@
|
||||
#help_index "Graphics/Math"
|
||||
|
||||
I8 GrXOffsets[8]={-1,0,1,-1,1,-1,0,1},
|
||||
GrYOffsets[8]={-1,-1,-1,0,0,1,1,1};
|
||||
|
||||
public void Line(void *aux_data,
|
||||
I8 x1,I8 y1,I8 z1,
|
||||
I8 x2,I8 y2,I8 z2,
|
||||
void plot_cb(void *aux,I8 x,I8 y,I8 z),
|
||||
I8 step=1,I8 start=0)
|
||||
{
|
||||
I8 i,j,d,dx=x2-x1,dy=y2-y1,dz=z2-z1;
|
||||
I8 adx=AbsI8(dx),ady=AbsI8(dy),adz=AbsI8(dz);
|
||||
|
||||
if (adx>=ady) {
|
||||
if (adx>=adz) {
|
||||
if (d=adx) {
|
||||
if (dx>=0)
|
||||
dx=0x100000000;
|
||||
else
|
||||
dx=-0x100000000;
|
||||
dy=dy<<32/d;
|
||||
dz=dz<<32/d;
|
||||
}
|
||||
} else {
|
||||
if (d=adz) {
|
||||
dx=dx<<32/d;
|
||||
dy=dy<<32/d;
|
||||
if (dz>=0)
|
||||
dz=0x100000000;
|
||||
else
|
||||
dz=-0x100000000;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (ady>=adz) {
|
||||
if (d=ady) {
|
||||
dx=dx<<32/d;
|
||||
if (dy>=0)
|
||||
dy=0x100000000;
|
||||
else
|
||||
dy=-0x100000000;
|
||||
dz=dz<<32/d;
|
||||
}
|
||||
} else {
|
||||
if (d=adz) {
|
||||
dx=dx<<32/d;
|
||||
dy=dy<<32/d;
|
||||
if (dz>=0)
|
||||
dz=0x100000000;
|
||||
else
|
||||
dz=-0x100000000;
|
||||
}
|
||||
}
|
||||
}
|
||||
x1<<=32; y1<<=32; z1<<=32;
|
||||
for (j=0;j<start;j++) {
|
||||
x1+=dx; y1+=dy; z1+=dz;
|
||||
}
|
||||
if (step==1) {
|
||||
for (i=start;i<=d;i++) {
|
||||
plot_cb(aux_data,x1.i4[1],y1.i4[1],z1.i4[1]);
|
||||
x1+=dx; y1+=dy; z1+=dz;
|
||||
}
|
||||
} else {
|
||||
for (i=start;i<=d;i+=step) {
|
||||
plot_cb(aux_data,x1.i4[1],y1.i4[1],z1.i4[1]);
|
||||
for (j=0;j<step;j++) {
|
||||
x1+=dx; y1+=dy; z1+=dz;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Box(void *aux_data,
|
||||
I8 x1,I8 y1,I8 z1,
|
||||
I8 x2,I8 y2,I8 z2,
|
||||
I8 x3,I8 y3,I8 z3,
|
||||
void plot_cb(void *aux,I8 x,I8 y,I8 z))
|
||||
{
|
||||
I8 i,j,
|
||||
d1,dx1=x2-x1,dy1=y2-y1,dz1=z2-z1,
|
||||
d2,dx2=x3-x1,dy2=y3-y1,dz2=z3-z1,
|
||||
adx1=AbsI8(dx1),ady1=AbsI8(dy1),adz1=AbsI8(dz1),
|
||||
adx2=AbsI8(dx2),ady2=AbsI8(dy2),adz2=AbsI8(dz2);
|
||||
|
||||
if (adx1>=ady1)
|
||||
d1=(adx1>=adz1) ? adx1:adz1;
|
||||
else
|
||||
d1=(ady1>=adz1) ? ady1:adz1;
|
||||
d1<<=1;
|
||||
if (d1) {
|
||||
dx1=dx1<<32/d1;
|
||||
dy1=dy1<<32/d1;
|
||||
dz1=dz1<<32/d1;
|
||||
}
|
||||
|
||||
if (adx2>=ady2)
|
||||
d2=(adx2>=adz2) ? adx2:adz2;
|
||||
else
|
||||
d2=(ady2>=adz2) ? ady2:adz2;
|
||||
d2<<=1;
|
||||
if (d2) {
|
||||
dx2=dx2<<32/d2;
|
||||
dy2=dy2<<32/d2;
|
||||
dz2=dz2<<32/d2;
|
||||
}
|
||||
|
||||
x1<<=32; y1<<=32; z1<<=32;
|
||||
for (j=0;j<=d1;j++) {
|
||||
x2=x1; y2=y1; z2=z1;
|
||||
for (i=0;i<=d2;i++) {
|
||||
plot_cb(aux_data,x2.i4[1],y2.i4[1],z2.i4[1]);
|
||||
x2+=dx2; y2+=dy2; z2+=dz2;
|
||||
}
|
||||
x1+=dx1; y1+=dy1; z1+=dz1;
|
||||
}
|
||||
}
|
||||
|
||||
#help_index "Graphics/Math/3D Transformation"
|
||||
I8 gr_scale;
|
||||
gr_scale.u4[0]=0;
|
||||
gr_scale.u4[1]=1;
|
||||
|
||||
void *gr_screen_capture=NULL;
|
||||
public void GrRotate(I8 *r,I8 *x,I8 *y,I8 *z)
|
||||
{
|
||||
I8 x1,y1,z1,xx=*x,yy=*y,zz=*z;
|
||||
x1=(r[0]*xx+r[1]*yy+r[2]*zz+r[3])>>32;
|
||||
y1=(r[4]*xx+r[5]*yy+r[6]*zz+r[7])>>32;
|
||||
z1=(r[8]*xx+r[9]*yy+r[10]*zz+r[11])>>32;
|
||||
*x=x1;*y=y1;*z=z1;
|
||||
}
|
||||
|
||||
public void GrTransform(GrBitMap *base,I8 *x,I8 *y,I8 *z)
|
||||
{
|
||||
GrRotate(base->r,x,y,z);
|
||||
*x+=base->x;
|
||||
*y+=base->y;
|
||||
*z+=base->z;
|
||||
}
|
||||
|
||||
|
||||
public I8 *GrTheta(double theta,TssStruct *tss=NULL)
|
||||
{
|
||||
double my_cos,my_sin;
|
||||
I8 *r=MAllocZ(sizeof(I8)*16,tss);
|
||||
|
||||
my_cos=Cos(theta)*gr_scale;
|
||||
my_sin=Sin(theta)*gr_scale;
|
||||
r[0]=my_cos;
|
||||
r[5]=my_cos;
|
||||
r[4]=my_sin;
|
||||
r[1]=-my_sin;
|
||||
r[10]=gr_scale;
|
||||
return r;
|
||||
}
|
||||
|
||||
public I8 *GrPhi(double phi,TssStruct *tss=NULL)
|
||||
{
|
||||
double my_cos,my_sin;
|
||||
I8 *r=MAllocZ(sizeof(I8)*16,tss);
|
||||
|
||||
my_cos=Cos(phi)*gr_scale;
|
||||
my_sin=Sin(phi)*gr_scale;
|
||||
r[5]=my_cos;
|
||||
r[10]=my_cos;
|
||||
r[9]=my_sin;
|
||||
r[6]=-my_sin;
|
||||
r[0]=gr_scale;
|
||||
return r;
|
||||
}
|
||||
|
||||
public I8 *GrScaleMat(I8 *m1,double s,TssStruct *tss=NULL)
|
||||
{
|
||||
I8 i,*r=MAllocZ(sizeof(I8)*16,tss);
|
||||
for (i=0;i<16;i++)
|
||||
r[i]=m1[i]*s;
|
||||
return r;
|
||||
}
|
||||
|
||||
public I8 *GrMulMat(I8 *m1,I8 *m2,TssStruct *tss=NULL)
|
||||
{
|
||||
I8 *r=MAllocZ(sizeof(I8)*16,tss);
|
||||
I8 i,j,k;
|
||||
double d;
|
||||
for (i=0;i<4;i++) {
|
||||
for (j=0;j<4;j++) {
|
||||
for (k=0;k<4;k++) {
|
||||
d=m1[k+4*j];
|
||||
d*=m2[i+4*k];
|
||||
d/=gr_scale;
|
||||
r[i+4*j]+=d;
|
||||
}
|
||||
}
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
public I8 GrDetMat(I8 *m1)
|
||||
{
|
||||
I8 i;
|
||||
double m[16],d;
|
||||
for (i=0;i<16;i++)
|
||||
m[i]=m1[i]/(1.0*0x100000000);
|
||||
d=m[0]*(m[5]*m[10]-m[6]*m[9])-
|
||||
m[1]*(m[4]*m[10]-m[6]*m[8])+
|
||||
m[2]*(m[4]*m[9]-m[5]*m[8]);
|
||||
return d*0x100000000;
|
||||
}
|
||||
|
||||
public void GrScalePenWidth(GrBitMap *base)
|
||||
{
|
||||
I8 d;
|
||||
if (base->flags&BMF_TRANSFORMATION) {
|
||||
if (base->pen_width) {
|
||||
d=base->pen_width*GrDetMat(base->r)+0x80000000;
|
||||
base->pen_width=d.u4[1];
|
||||
if (base->pen_width<1)
|
||||
base->pen_width=1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void GrSetIdent(I8 *r)
|
||||
{
|
||||
MemSet(r,0,16<<3);
|
||||
r[0].u4[1]=1;
|
||||
r[5].u4[1]=1;
|
||||
r[10].u4[1]=1;
|
||||
r[15].u4[1]=1;
|
||||
}
|
||||
|
||||
public void GrSetTranslation(I8 *r,I8 x,I8 y,I8 z)
|
||||
{
|
||||
r[3]=x<<32;
|
||||
r[7]=y<<32;
|
||||
r[11]=z<<32;
|
||||
}
|
||||
|
||||
#help_index "Graphics/Math"
|
||||
public void Circle(void *aux_data,
|
||||
I8 cx,I8 cy,I8 cz,
|
||||
I8 radius,
|
||||
void plot_cb(void *aux,I8 x,I8 y,I8 z),
|
||||
I8 step=1,
|
||||
double start_rad=0,
|
||||
double len_rad=pi2)
|
||||
{
|
||||
I8 i,j,len=len_rad*radius;
|
||||
I8 x,y,x1,y1,s1,s2,c;
|
||||
double t;
|
||||
if (radius<0) return;
|
||||
if (!radius) {
|
||||
plot_cb(aux_data,cx,cy,cz);
|
||||
return;
|
||||
}
|
||||
t=1.0/radius;
|
||||
s1=(1<<24)*Sin(t);
|
||||
s2=-s1;
|
||||
c=(1<<24)*Cos(t);
|
||||
if (start_rad) {
|
||||
x=radius*Cos(start_rad);
|
||||
y=-radius*Sin(start_rad);
|
||||
} else {
|
||||
x=radius;
|
||||
y=0;
|
||||
}
|
||||
x<<=8;
|
||||
y<<=8;
|
||||
for (i=0;i<=len;i+=step) {
|
||||
plot_cb(aux_data,cx+x>>8,cy+y>>8,cz);
|
||||
for (j=0;j<step;j++) {
|
||||
x1=(c*x+s1*y)>>24;
|
||||
y1=(s2*x+c*y)>>24;
|
||||
x=x1; y=y1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Ellipse(void *aux_data,
|
||||
I8 cx,I8 cy,I8 cz,
|
||||
I8 x_radius,I8 y_radius,
|
||||
void plot_cb(void *aux,I8 x,I8 y,I8 z),
|
||||
double rot_angle=0,
|
||||
I8 step=1,
|
||||
double start_rad=0,
|
||||
double len_rad=pi2)
|
||||
{
|
||||
I8 i,j,len;
|
||||
I8 x,y,x1,y1,x2,y2, s1,s2,c, s12,s22,c2;
|
||||
double t;
|
||||
if (x_radius<0 || y_radius<0 || step<1)
|
||||
return;
|
||||
if (!x_radius && !y_radius) {
|
||||
plot_cb(aux_data,cx,cy,cz);
|
||||
return;
|
||||
}
|
||||
if (x_radius>=y_radius) {
|
||||
t=1.0/x_radius;
|
||||
len=len_rad*x_radius;
|
||||
} else {
|
||||
t=1.0/y_radius;
|
||||
len=len_rad*y_radius;
|
||||
}
|
||||
|
||||
s1=(1<<24)*Sin(t);
|
||||
s2=-s1;
|
||||
c=(1<<24)*Cos(t);
|
||||
|
||||
s12=(1<<24)*Sin(rot_angle);
|
||||
s22=-s12;
|
||||
c2=(1<<24)*Cos(rot_angle);
|
||||
|
||||
if (start_rad) {
|
||||
x=x_radius*Cos(start_rad);
|
||||
y=-x_radius*Sin(start_rad);
|
||||
} else {
|
||||
x=x_radius;
|
||||
y=0;
|
||||
}
|
||||
x<<=8;
|
||||
y<<=8;
|
||||
x2=x;
|
||||
y2=y;
|
||||
|
||||
y1=y2*y_radius/x_radius;
|
||||
x=(c2*x2+s12*y1)>>24;
|
||||
y=(s22*x2+c2*y1)>>24;
|
||||
|
||||
for (i=0;i<=len;i+=step) {
|
||||
plot_cb(aux_data,cx+x>>8,cy+y>>8,cz);
|
||||
for (j=0;j<step;j++) {
|
||||
x1=(c*x2+s1*y2)>>24;
|
||||
y1=(s2*x2+c*y2)>>24;
|
||||
x2=x1;
|
||||
y2=y1;
|
||||
y1=y1*y_radius/x_radius;
|
||||
x=(c2*x1+s12*y1)>>24;
|
||||
y=(s22*x1+c2*y1)>>24;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public I8 DistP3I4(P3I4 *p1,P3I4 *p2)
|
||||
{
|
||||
return Sqrt(SqrI8(p1->x-p2->x)+SqrI8(p1->y-p2->y)+SqrI8(p1->z-p2->z));
|
||||
}
|
||||
|
||||
public void Bezier2(void *aux_data,P3I4 *ctrl,void plot_cb(void *aux,I8 x,I8 y,I8 z))
|
||||
{//2nd order
|
||||
I8 x,y,z,xx,yy,zz,dx,dy,dz,d_max;
|
||||
double x0=ctrl[0].x,y0=ctrl[0].y,z0=ctrl[0].z;
|
||||
double x1=ctrl[1].x-x0,y1=ctrl[1].y-y0,z1=ctrl[1].z-z0;
|
||||
double x2=ctrl[2].x-x0,y2=ctrl[2].y-y0,z2=ctrl[2].z-z0;
|
||||
double t,d=DistP3I4(&ctrl[0],&ctrl[1])+
|
||||
DistP3I4(&ctrl[1],&ctrl[2])+
|
||||
DistP3I4(&ctrl[2],&ctrl[0]),
|
||||
s=0.5/d,t1,t2;
|
||||
xx=x0; yy=y0; zz=z0;
|
||||
for (t=0.0;t<=1.0;t+=s) {
|
||||
t1=t*(1.0-t);
|
||||
t2=t*t;
|
||||
x=x0+x1*t1+x2*t2;
|
||||
y=y0+y1*t1+y2*t2;
|
||||
z=z0+z1*t1+z2*t2;
|
||||
dx=AbsI8(x-xx);
|
||||
dy=AbsI8(y-yy);
|
||||
dz=AbsI8(z-zz);
|
||||
if (dx>dy)
|
||||
d_max=dx;
|
||||
else
|
||||
d_max=dy;
|
||||
if (dz>d_max)
|
||||
d_max=dz;
|
||||
if (!d_max)
|
||||
s*=1.1;
|
||||
else {
|
||||
s*=0.9;
|
||||
plot_cb(aux_data,x,y,z);
|
||||
xx=x;yy=y;zz=z;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Bezier3(void *aux_data,P3I4 *ctrl,void plot_cb(void *aux,I8 x,I8 y,I8 z))
|
||||
{ //3rd order
|
||||
I8 x,y,z,xx,yy,zz,dx,dy,dz,d_max;
|
||||
double x0=ctrl[0].x,y0=ctrl[0].y,z0=ctrl[0].z;
|
||||
double x1=ctrl[1].x-x0,y1=ctrl[1].y-y0,z1=ctrl[1].z-z0;
|
||||
double x2=ctrl[2].x-x0,y2=ctrl[2].y-y0,z2=ctrl[2].z-z0;
|
||||
double x3=ctrl[3].x-x0,y3=ctrl[3].y-y0,z3=ctrl[3].z-z0;
|
||||
double t,d=DistP3I4(&ctrl[0],&ctrl[1])+
|
||||
DistP3I4(&ctrl[1],&ctrl[2])+
|
||||
DistP3I4(&ctrl[2],&ctrl[3])+
|
||||
DistP3I4(&ctrl[3],&ctrl[0]),
|
||||
s=0.5/d,nt,t1,t2,t3;
|
||||
xx=x0; yy=y0; zz=z0;
|
||||
for (t=0.0;t<=1.0;t+=s) {
|
||||
nt=1.0-t;
|
||||
t1=t*nt*nt;
|
||||
t2=t*t*nt;
|
||||
t3=t*t*t;
|
||||
x=x0+x1*t1+x2*t2+x3*t3;
|
||||
y=y0+y1*t1+y2*t2+y3*t3;
|
||||
z=z0+z1*t1+z2*t2+z3*t3;
|
||||
dx=AbsI8(x-xx);
|
||||
dy=AbsI8(y-yy);
|
||||
dz=AbsI8(z-zz);
|
||||
if (dx>dy)
|
||||
d_max=dx;
|
||||
else
|
||||
d_max=dy;
|
||||
if (dz>d_max)
|
||||
d_max=dz;
|
||||
if (!d_max)
|
||||
s*=1.1;
|
||||
else {
|
||||
s*=0.9;
|
||||
plot_cb(aux_data,x,y,z);
|
||||
xx=x;yy=y;zz=z;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void BSpline2(void *aux_data,P3I4 *ctrl,I8 cnt,void plot_cb(void *aux,I8 x,I8 y,I8 z),BoolU4 closed=FALSE)
|
||||
{ //2nd order
|
||||
I8 i,j;
|
||||
P3I4 *c;
|
||||
if (cnt<3) return;
|
||||
if (closed) {
|
||||
cnt++;
|
||||
c=MAlloc(sizeof(P3I4)*(cnt*2-1));
|
||||
j=1;
|
||||
for (i=0;i<cnt-2;i++) {
|
||||
c[j].x=(ctrl[i].x+ctrl[i+1].x)/2.0;
|
||||
c[j].y=(ctrl[i].y+ctrl[i+1].y)/2.0;
|
||||
c[j].z=(ctrl[i].z+ctrl[i+1].z)/2.0;
|
||||
j+=2;
|
||||
}
|
||||
c[j].x=(ctrl[0].x+ctrl[cnt-2].x)/2.0;
|
||||
c[j].y=(ctrl[0].y+ctrl[cnt-2].y)/2.0;
|
||||
c[j].z=(ctrl[0].z+ctrl[cnt-2].z)/2.0;
|
||||
|
||||
c[0].x=(c[1].x+c[j].x)/2.0;
|
||||
c[0].y=(c[1].y+c[j].y)/2.0;
|
||||
c[0].z=(c[1].z+c[j].z)/2.0;
|
||||
j=2;
|
||||
for (i=0;i<cnt-2;i++) {
|
||||
c[j].x=(c[j-1].x+c[j+1].x)/2.0;
|
||||
c[j].y=(c[j-1].y+c[j+1].y)/2.0;
|
||||
c[j].z=(c[j-1].z+c[j+1].z)/2.0;
|
||||
j+=2;
|
||||
}
|
||||
c[j].x=c[0].x;
|
||||
c[j].y=c[0].y;
|
||||
c[j].z=c[0].z;
|
||||
} else {
|
||||
c=MAlloc(sizeof(P3I4)*(cnt*2-1));
|
||||
c[0].x=ctrl[0].x;
|
||||
c[0].y=ctrl[0].y;
|
||||
c[0].z=ctrl[0].z;
|
||||
c[cnt*2-2].x=ctrl[cnt-1].x;
|
||||
c[cnt*2-2].y=ctrl[cnt-1].y;
|
||||
c[cnt*2-2].z=ctrl[cnt-1].z;
|
||||
j=1;
|
||||
for (i=0;i<cnt-1;i++) {
|
||||
c[j].x=(ctrl[i].x+ctrl[i+1].x)/2.0;
|
||||
c[j].y=(ctrl[i].y+ctrl[i+1].y)/2.0;
|
||||
c[j].z=(ctrl[i].z+ctrl[i+1].z)/2.0;
|
||||
j+=2;
|
||||
}
|
||||
j=2;
|
||||
for (i=0;i<cnt-2;i++) {
|
||||
c[j].x=(c[j-1].x+c[j+1].x)/2.0;
|
||||
c[j].y=(c[j-1].y+c[j+1].y)/2.0;
|
||||
c[j].z=(c[j-1].z+c[j+1].z)/2.0;
|
||||
j+=2;
|
||||
}
|
||||
}
|
||||
for (i=0;i<cnt*2-2;i+=2)
|
||||
Bezier2(aux_data,&c[i],plot_cb);
|
||||
Free(c);
|
||||
}
|
||||
|
||||
public void BSpline3(void *aux_data,P3I4 *ctrl,I8 cnt,void plot_cb(void *aux,I8 x,I8 y,I8 z),BoolU4 closed=FALSE)
|
||||
{ //3rd order
|
||||
I8 i,j;
|
||||
double x,y,z;
|
||||
P3I4 *c;
|
||||
if (cnt<3) return;
|
||||
if (closed) {
|
||||
cnt++;
|
||||
c=MAlloc(sizeof(P3I4)*(cnt*3-2));
|
||||
j=1;
|
||||
for (i=0;i<cnt-2;i++) {
|
||||
x=ctrl[i].x;
|
||||
y=ctrl[i].y;
|
||||
z=ctrl[i].z;
|
||||
c[j].x=(ctrl[i+1].x-x)/3.0+x;
|
||||
c[j].y=(ctrl[i+1].y-y)/3.0+y;
|
||||
c[j].z=(ctrl[i+1].z-z)/3.0+z;
|
||||
j++;
|
||||
c[j].x=2.0*(ctrl[i+1].x-x)/3.0+x;
|
||||
c[j].y=2.0*(ctrl[i+1].y-y)/3.0+y;
|
||||
c[j].z=2.0*(ctrl[i+1].z-z)/3.0+z;
|
||||
j+=2;
|
||||
}
|
||||
x=ctrl[cnt-2].x;
|
||||
y=ctrl[cnt-2].y;
|
||||
z=ctrl[cnt-2].z;
|
||||
c[j].x=(ctrl[0].x-x)/3.0+x;
|
||||
c[j].y=(ctrl[0].y-y)/3.0+y;
|
||||
c[j].z=(ctrl[0].z-z)/3.0+z;
|
||||
j++;
|
||||
c[j].x=2.0*(ctrl[0].x-x)/3.0+x;
|
||||
c[j].y=2.0*(ctrl[0].y-y)/3.0+y;
|
||||
c[j].z=2.0*(ctrl[0].z-z)/3.0+z;
|
||||
|
||||
c[0].x=(c[1].x+c[j].x)/2.0;
|
||||
c[0].y=(c[1].y+c[j].y)/2.0;
|
||||
c[0].z=(c[1].z+c[j].z)/2.0;
|
||||
|
||||
j=3;
|
||||
for (i=0;i<cnt-2;i++) {
|
||||
c[j].x=(c[j-1].x+c[j+1].x)/2.0;
|
||||
c[j].y=(c[j-1].y+c[j+1].y)/2.0;
|
||||
c[j].z=(c[j-1].z+c[j+1].z)/2.0;
|
||||
j+=3;
|
||||
}
|
||||
c[j].x=c[0].x;
|
||||
c[j].y=c[0].y;
|
||||
c[j].z=c[0].z;
|
||||
} else {
|
||||
c=MAlloc(sizeof(P3I4)*(cnt*3-2));
|
||||
c[0].x=ctrl[0].x;
|
||||
c[0].y=ctrl[0].y;
|
||||
c[0].z=ctrl[0].z;
|
||||
c[cnt*3-3].x=ctrl[cnt-1].x;
|
||||
c[cnt*3-3].y=ctrl[cnt-1].y;
|
||||
c[cnt*3-3].z=ctrl[cnt-1].z;
|
||||
j=1;
|
||||
for (i=0;i<cnt-1;i++) {
|
||||
x=ctrl[i].x;
|
||||
y=ctrl[i].y;
|
||||
z=ctrl[i].z;
|
||||
c[j].x=(ctrl[i+1].x-x)/3.0+x;
|
||||
c[j].y=(ctrl[i+1].y-y)/3.0+y;
|
||||
c[j].z=(ctrl[i+1].z-z)/3.0+z;
|
||||
j++;
|
||||
c[j].x=2.0*(ctrl[i+1].x-x)/3.0+x;
|
||||
c[j].y=2.0*(ctrl[i+1].y-y)/3.0+y;
|
||||
c[j].z=2.0*(ctrl[i+1].z-z)/3.0+z;
|
||||
j+=2;
|
||||
}
|
||||
j=3;
|
||||
for (i=0;i<cnt-2;i++) {
|
||||
c[j].x=(c[j-1].x+c[j+1].x)/2.0;
|
||||
c[j].y=(c[j-1].y+c[j+1].y)/2.0;
|
||||
c[j].z=(c[j-1].z+c[j+1].z)/2.0;
|
||||
j+=3;
|
||||
}
|
||||
}
|
||||
for (i=0;i<cnt*3-3;i+=3)
|
||||
Bezier3(aux_data,&c[i],plot_cb);
|
||||
Free(c);
|
||||
}
|
||||
|
||||
#help_index "Graphics"
|
||||
@@ -0,0 +1,728 @@
|
||||
public void GrPlot(GrBitMap *base,I8 x,I8 y)
|
||||
{ //Clipping but No transformation or pen width
|
||||
BoolU4 draw=TRUE;
|
||||
if (base->brush) {
|
||||
GrBlot(base,x,y,base->brush);
|
||||
return;
|
||||
}
|
||||
if (base->flags & BMF_SCREEN_BITMAP) {
|
||||
if (x<0) draw=FALSE;
|
||||
x+=base->win_tss->win_pixel_left;
|
||||
if (x>base->win_tss->win_pixel_right) draw=FALSE;
|
||||
|
||||
if (y<0) draw=FALSE;
|
||||
y+=base->win_tss->win_pixel_top;
|
||||
if (y>base->win_tss->win_pixel_bottom) draw=FALSE;
|
||||
if (x>=base->width) draw=FALSE;
|
||||
if (y>=base->height) draw=FALSE;
|
||||
if (IsPixelCovered(base->win_tss,x,y)) draw=FALSE;
|
||||
} else {
|
||||
if (x<0) draw=FALSE;
|
||||
if (x>=base->width) draw=FALSE;
|
||||
if (y<0) draw=FALSE;
|
||||
if (y>=base->height) draw=FALSE;
|
||||
}
|
||||
if (draw)
|
||||
GrPlot0(base,x,y);
|
||||
}
|
||||
|
||||
public I8 GrPeek(GrBitMap *base,I8 x,I8 y)
|
||||
{ //Clipping but No transformation
|
||||
BoolU4 peek=TRUE;
|
||||
if (base->flags & BMF_SCREEN_BITMAP) {
|
||||
if (x<0) peek=FALSE;
|
||||
x+=base->win_tss->win_pixel_left;
|
||||
if (x>base->win_tss->win_pixel_right) peek=FALSE;
|
||||
|
||||
if (y<0) peek=FALSE;
|
||||
y+=base->win_tss->win_pixel_top;
|
||||
if (y>base->win_tss->win_pixel_bottom) peek=FALSE;
|
||||
if (x>=base->width) peek=FALSE;
|
||||
if (y>=base->height) peek=FALSE;
|
||||
if (IsPixelCovered(base->win_tss,x,y)) peek=FALSE;
|
||||
} else {
|
||||
if (x<0) peek=FALSE;
|
||||
if (x>=base->width) peek=FALSE;
|
||||
if (y<0) peek=FALSE;
|
||||
if (y>=base->height) peek=FALSE;
|
||||
}
|
||||
if (peek)
|
||||
return GrPeek0(base,x,y);
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
#define CC_LEFT 1
|
||||
#define CC_RIGHT 2
|
||||
#define CC_TOP 4
|
||||
#define CC_BOTTOM 8
|
||||
|
||||
U8 ClipCode(I8 x,I8 y,I8 right,I8 bottom)
|
||||
{
|
||||
U8 result;
|
||||
if (y>bottom)
|
||||
result=CC_BOTTOM;
|
||||
else if (y<0)
|
||||
result=CC_TOP;
|
||||
else
|
||||
result=0;
|
||||
if (x>right)
|
||||
result|=CC_RIGHT;
|
||||
else if (x<0)
|
||||
result|=CC_LEFT;
|
||||
return result;
|
||||
}
|
||||
|
||||
public BoolU8 ClipLine(GrBitMap *base,I8 *x1,I8 *y1,I8 *x2,I8 *y2)
|
||||
{
|
||||
I8 x,y,right,bottom;
|
||||
U8 cc,cc1,cc2;
|
||||
if (base->flags & BMF_SCREEN_BITMAP) {
|
||||
right=base->win_tss->win_pixel_right-base->win_tss->win_pixel_left-1;
|
||||
if (base->width-1<right)
|
||||
right=base->width-1;
|
||||
bottom=base->win_tss->win_pixel_bottom-base->win_tss->win_pixel_top-1;
|
||||
if (base->height-1<bottom)
|
||||
bottom=base->height-1;
|
||||
} else {
|
||||
right=base->width-1;
|
||||
bottom=base->height-1;
|
||||
}
|
||||
cc1=ClipCode(*x1,*y1,right,bottom);
|
||||
cc2=ClipCode(*x2,*y2,right,bottom);
|
||||
do {
|
||||
if (!(cc1|cc2))
|
||||
return TRUE;
|
||||
if (cc1&cc2)
|
||||
return FALSE;
|
||||
|
||||
if (cc1)
|
||||
cc=cc1;
|
||||
else
|
||||
cc=cc2;
|
||||
|
||||
if (cc&CC_BOTTOM) {
|
||||
x=*x1+(*x2-*x1)*(bottom-*y1)/(*y2-*y1);
|
||||
y=bottom;
|
||||
} else if (cc&CC_TOP) {
|
||||
x=*x1+(*x2-*x1)*(-*y1)/(*y2-*y1);
|
||||
y=0;
|
||||
} else if (cc&CC_RIGHT) {
|
||||
y=*y1+(*y2-*y1)*(right-*x1)/(*x2-*x1);
|
||||
x=right;
|
||||
} else {
|
||||
y=*y1+(*y2-*y1)*(-*x1)/(*x2-*x1);
|
||||
x=0;
|
||||
}
|
||||
|
||||
if (cc==cc1) {
|
||||
*x1=x;
|
||||
*y1=y;
|
||||
cc1=ClipCode(*x1,*y1,right,bottom);
|
||||
} else {
|
||||
*x2=x;
|
||||
*y2=y;
|
||||
cc2=ClipCode(*x2,*y2,right,bottom);
|
||||
}
|
||||
} while (TRUE);
|
||||
}
|
||||
|
||||
I8 GrFloodFillRay(GrBitMap *base,I8 x,I8 y)
|
||||
{
|
||||
I8 cnt,j,x1,ray_len,ray_len2;
|
||||
|
||||
cnt=ray_len=GrRayLen(base,&x,y);
|
||||
|
||||
y--;
|
||||
j=ray_len;
|
||||
x1=x;
|
||||
while (j>0) {
|
||||
if (ray_len2=GrRayLenMinus(base,x1,y))
|
||||
cnt+=GrFloodFillRay(base,x1,y);
|
||||
j-=ray_len2+1;
|
||||
x1-=ray_len2+1;
|
||||
}
|
||||
|
||||
y+=2;
|
||||
j=ray_len;
|
||||
x1=x;
|
||||
while (j>0) {
|
||||
if (ray_len2=GrRayLenMinus(base,x1,y))
|
||||
cnt+=GrFloodFillRay(base,x1,y);
|
||||
j-=ray_len2+1;
|
||||
x1-=ray_len2+1;
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
|
||||
public I8 GrFloodFill(GrBitMap *base,I8 x,I8 y,BoolU4 not_color=TRUE)
|
||||
{
|
||||
I8 cnt=0,j,c,old_color2=base->color2,old_flags=base->flags;
|
||||
GrBitMap *old_brush;
|
||||
if (base->flags & BMF_DONT_DRAW) //TODO
|
||||
return 0;
|
||||
old_brush=base->brush;
|
||||
base->brush=NULL;
|
||||
j=GrPeek(base,x,y);
|
||||
if (j>=0) {
|
||||
switch (base->type) {
|
||||
case BMT_COLOR4:
|
||||
if (not_color) {
|
||||
base->color2=base->color&0xFFFFFF;
|
||||
base->flags|=BMF_FILL_NOT_COLOR;
|
||||
} else {
|
||||
base->color2=j;
|
||||
if (base->color2==base->color&0xFFFFFF)
|
||||
break;
|
||||
base->flags&=~BMF_FILL_NOT_COLOR;
|
||||
}
|
||||
if (not_color && j!=base->color2 ||
|
||||
!not_color)
|
||||
cnt=GrFloodFillRay(base,x,y);
|
||||
break;
|
||||
case BMT_MONO:
|
||||
c=(base->color&0xFFFFFF)?1:0;
|
||||
if (not_color) {
|
||||
base->color2=c;
|
||||
base->flags|=BMF_FILL_NOT_COLOR;
|
||||
} else {
|
||||
base->color2=(j)?1:0;
|
||||
if (base->color2==c)
|
||||
break;
|
||||
base->flags&=~BMF_FILL_NOT_COLOR;
|
||||
}
|
||||
if (not_color && j!=c ||
|
||||
!not_color)
|
||||
cnt=GrFloodFillRay(base,x,y);
|
||||
break;
|
||||
}
|
||||
}
|
||||
base->brush=old_brush;
|
||||
base->flags=old_flags;
|
||||
base->color2=old_color2;
|
||||
return cnt;
|
||||
}
|
||||
|
||||
public void GrPlot2(GrBitMap *base,I8 x,I8 y,I8 z)
|
||||
{ //Clipping and transformation but no pen_width
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
GrRotate(base->r,&x,&y,&z);
|
||||
x+=base->x;
|
||||
y+=base->y;
|
||||
z+=base->z;
|
||||
}
|
||||
GrPlot(base,x,y);
|
||||
}
|
||||
|
||||
public void GrPlot3(GrBitMap *base,I8 x,I8 y,I8 z)
|
||||
{ //clipping and transformation and pen width
|
||||
|
||||
I8 i,j,w,old_color,dist;
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
GrRotate(base->r,&x,&y,&z);
|
||||
x+=base->x;
|
||||
y+=base->y;
|
||||
z+=base->z;
|
||||
}
|
||||
w=base->pen_width>>1;
|
||||
if (w<=0)
|
||||
GrPlot(base,x,y);
|
||||
else if (base->pen_width<GR_NUM_PEN_BRUSHES) {
|
||||
old_color=base->color;
|
||||
if (base->color.u1[3]==ROPB_EQU)
|
||||
base->color.u1[3]=ROPB_TRANSPARENT;
|
||||
if (GrBlot(base,x-w,y-w,gr_pen_brushes[base->pen_width])) {
|
||||
if (base->flags & BMF_SCREEN_BITMAP) {
|
||||
x+=base->win_tss->win_pixel_left;
|
||||
y+=base->win_tss->win_pixel_top;
|
||||
}
|
||||
if (base->flags & BMF_LOCATE_NEAREST) {
|
||||
dist=DistI8(x,y,base->cur_x,base->cur_y);
|
||||
if (dist<base->nearest_dist) {
|
||||
base->nearest_sub_grelem=base->cur_sub_grelem;
|
||||
base->nearest_dist=dist;
|
||||
}
|
||||
}
|
||||
}
|
||||
base->color=old_color;
|
||||
} else if (base->pen_width & 1) {
|
||||
for (i=-w;i<=w;i++)
|
||||
for (j=-w;j<=w;j++)
|
||||
GrPlot(base,x+i,y+j);
|
||||
} else {
|
||||
for (i=-w;i<w;i++)
|
||||
for (j=-w;j<w;j++)
|
||||
GrPlot(base,x+i,y+j);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void GrPlot4(GrBitMap *base,I8 x,I8 y)
|
||||
{ //Plot with base->brush
|
||||
BoolU4 draw=TRUE;
|
||||
|
||||
if (x<0) draw=FALSE;
|
||||
x+=base->win_tss->win_pixel_left;
|
||||
if (x>base->win_tss->win_pixel_right) draw=FALSE;
|
||||
|
||||
if (y<0) draw=FALSE;
|
||||
y+=base->win_tss->win_pixel_top;
|
||||
if (y>base->win_tss->win_pixel_bottom) draw=FALSE;
|
||||
|
||||
if (x>=base->width) draw=FALSE;
|
||||
if (y>=base->height) draw=FALSE;
|
||||
|
||||
if (draw) {
|
||||
if (base->brush)
|
||||
GrBlot(base,x,y,base->brush);
|
||||
else
|
||||
GrPlot0(base,x,y);
|
||||
}
|
||||
}
|
||||
|
||||
void GrLinePlot(GrBitMap *base,I8 x,I8 y,I8 z)
|
||||
{
|
||||
nounusedwarn z;
|
||||
GrPlot(base,x,y);
|
||||
}
|
||||
|
||||
public void GrLine(GrBitMap *base,I8 x1,I8 y1,I8 x2,I8 y2,I8 step=1,I8 start=0)
|
||||
{
|
||||
if (ClipLine(base,&x1,&y1,&x2,&y2))
|
||||
Line(base,x1,y1,0,x2,y2,0,&GrLinePlot,step,start);
|
||||
}
|
||||
|
||||
public void GrCircle(GrBitMap *base,I8 cx,I8 cy,I8 radius,
|
||||
I8 step=1,double start_rad=0,double len_rad=pi2)
|
||||
{
|
||||
Circle(base,cx,cy,0,radius,&GrLinePlot,step,start_rad,len_rad);
|
||||
}
|
||||
|
||||
public void GrEllipse(GrBitMap *base,
|
||||
I8 cx,I8 cy,
|
||||
I8 x_radius,I8 y_radius,
|
||||
double rot_angle=0,
|
||||
I8 step=1,
|
||||
double start_rad=0,
|
||||
double len_rad=pi2)
|
||||
{
|
||||
Ellipse(base,cx,cy,0,x_radius,y_radius,&GrLinePlot,rot_angle,step,start_rad,len_rad);
|
||||
}
|
||||
|
||||
public void Gr2Bezier(GrBitMap *base,P3I4 *ctrl)
|
||||
{
|
||||
Bezier2(base,ctrl,&GrLinePlot);
|
||||
}
|
||||
|
||||
public void Gr3Bezier(GrBitMap *base,P3I4 *ctrl)
|
||||
{
|
||||
Bezier3(base,ctrl,&GrLinePlot);
|
||||
}
|
||||
|
||||
public void Gr2BSpline(GrBitMap *base,P3I4 *ctrl,I8 cnt,BoolU4 closed=FALSE)
|
||||
{
|
||||
BSpline2(base,ctrl,cnt,&GrLinePlot,closed);
|
||||
}
|
||||
|
||||
public void Gr3BSpline(GrBitMap *base,P3I4 *ctrl,I8 cnt,BoolU4 closed=FALSE)
|
||||
{
|
||||
BSpline3(base,ctrl,cnt,&GrLinePlot,closed);
|
||||
}
|
||||
|
||||
public void GrLine2(GrBitMap *base,I8 x1,I8 y1,I8 z1,I8 x2,I8 y2,I8 z2,I8 step=1,I8 start=0)
|
||||
{ //transformation but not pen width
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
GrRotate(base->r,&x1,&y1,&z1);
|
||||
x1+=base->x;
|
||||
y1+=base->y;
|
||||
z1+=base->z;
|
||||
GrRotate(base->r,&x2,&y2,&z2);
|
||||
x2+=base->x;
|
||||
y2+=base->y;
|
||||
z2+=base->z;
|
||||
}
|
||||
if (ClipLine(base,&x1,&y1,&x2,&y2))
|
||||
Line(base,x1,y1,0,x2,y2,0,&GrLinePlot,step,start);
|
||||
}
|
||||
|
||||
void GrLine3Plot(GrBitMap *base,I8 x,I8 y,I8 z)
|
||||
{
|
||||
GrPlot3(base,x,y,z);
|
||||
}
|
||||
|
||||
public void GrLine3(GrBitMap *base,I8 x1,I8 y1,I8 z1,I8 x2,I8 y2,I8 z2,I8 step=1,I8 start=0)
|
||||
{ //transformation with pen width
|
||||
U8 old_flags=base->flags;
|
||||
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
GrRotate(base->r,&x1,&y1,&z1);
|
||||
x1+=base->x;
|
||||
y1+=base->y;
|
||||
z1+=base->z;
|
||||
GrRotate(base->r,&x2,&y2,&z2);
|
||||
x2+=base->x;
|
||||
y2+=base->y;
|
||||
z2+=base->z;
|
||||
}
|
||||
if (ClipLine(base,&x1,&y1,&x2,&y2)) {
|
||||
base->flags&=~BMF_TRANSFORMATION;
|
||||
Line(base,x1,y1,0,x2,y2,0,&GrLine3Plot,step,start);
|
||||
base->flags=old_flags;
|
||||
}
|
||||
}
|
||||
|
||||
public void GrText3(GrBitMap *base,I8 x1,I8 y1,I8 z1,I1 *s)
|
||||
{ //transformation
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
GrRotate(base->r,&x1,&y1,&z1);
|
||||
x1+=base->x;
|
||||
y1+=base->y;
|
||||
z1+=base->z;
|
||||
}
|
||||
GrText(base,x1,y1,s);
|
||||
}
|
||||
|
||||
public void GrCircle3(GrBitMap *base,I8 cx,I8 cy,I8 cz,I8 radius,
|
||||
I8 step=1,double start_rad=0,double len_rad=pi2)
|
||||
{ //transformation with pen width
|
||||
I8 x,y,z;
|
||||
double m1,a1,m2;
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
base->flags&=~BMF_TRANSFORMATION;
|
||||
GrRotate(base->r,&cx,&cy,&cz);
|
||||
cx+=base->x;
|
||||
cy+=base->y;
|
||||
cz+=base->z;
|
||||
|
||||
radius<<=24;
|
||||
|
||||
x=radius; y=0; z=0;
|
||||
GrRotate(base->r,&x,&y,&z);
|
||||
R2P(&m1,&a1,x,y);
|
||||
|
||||
x=0; y=radius; z=0;
|
||||
GrRotate(base->r,&x,&y,&z);
|
||||
m2=Sqrt(x*x+y*y);
|
||||
|
||||
Ellipse(base,cx,cy,cz,
|
||||
m1/0x1000000,m2/0x1000000,
|
||||
&GrLine3Plot,-a1,step,start_rad,len_rad);
|
||||
base->flags|=BMF_TRANSFORMATION;
|
||||
} else
|
||||
Circle(base,cx,cy,cz,radius,&GrLine3Plot,step,start_rad,len_rad);
|
||||
}
|
||||
|
||||
|
||||
public void GrEllipse3(GrBitMap *base,
|
||||
I8 cx,I8 cy,I8 cz,
|
||||
I8 x_radius,I8 y_radius,
|
||||
double rot_angle=0,
|
||||
I8 step=1,
|
||||
double start_rad=0,
|
||||
double len_rad=pi2)
|
||||
{
|
||||
I8 x,y,z;
|
||||
double m1,a1,m2,a2,s,c;
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
base->flags&=~BMF_TRANSFORMATION;
|
||||
GrRotate(base->r,&cx,&cy,&cz);
|
||||
cx+=base->x;
|
||||
cy+=base->y;
|
||||
cz+=base->z;
|
||||
|
||||
c=Cos(rot_angle);
|
||||
s=Sin(rot_angle);
|
||||
|
||||
x_radius<<=24;
|
||||
y_radius<<=24;
|
||||
|
||||
x=x_radius*c;
|
||||
y=x_radius*s;
|
||||
z=0;
|
||||
GrRotate(base->r,&x,&y,&z);
|
||||
R2P(&m1,&a1,x,y);
|
||||
|
||||
x=-y_radius*s;
|
||||
y=y_radius*c;
|
||||
z=0;
|
||||
GrRotate(base->r,&x,&y,&z);
|
||||
R2P(&m2,&a2,x,y);
|
||||
m2=m2*Abs(Sin(a2-a1));
|
||||
|
||||
Ellipse(base,cx,cy,cz,
|
||||
m1/0x1000000,m2/0x1000000,&GrLine3Plot,-a1,step,start_rad,len_rad);
|
||||
base->flags|=BMF_TRANSFORMATION;
|
||||
} else
|
||||
Ellipse(base,cx,cy,cz,x_radius,y_radius,&GrLine3Plot,rot_angle,step,start_rad,len_rad);
|
||||
}
|
||||
|
||||
|
||||
public I8 GrFloodFill3(GrBitMap *base,I8 x1,I8 y1,I8 z1,BoolU4 not_color=TRUE)
|
||||
{ //transformation
|
||||
I8 cnt,old_flags=base->flags;
|
||||
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
GrRotate(base->r,&x1,&y1,&z1);
|
||||
x1+=base->x;
|
||||
y1+=base->y;
|
||||
z1+=base->z;
|
||||
}
|
||||
base->flags&=~BMF_TRANSFORMATION;
|
||||
cnt=GrFloodFill(base,x1,y1,not_color);
|
||||
base->flags=old_flags;
|
||||
return cnt;
|
||||
}
|
||||
|
||||
public void GrBox3(GrBitMap *base,I8 x,I8 y,I8 z,I8 w,I8 h)
|
||||
{ //Clipping and transformation
|
||||
I8 x2,y2,z2,x3,y3,z3;
|
||||
GrBitMap *old_brush=base->brush;
|
||||
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
base->brush=NULL;
|
||||
x2=x+w; y2=y; z2=z;
|
||||
x3=x; y3=y+h; z3=z;
|
||||
GrRotate(base->r,&x,&y,&z);
|
||||
x+=base->x;
|
||||
y+=base->y;
|
||||
z+=base->z;
|
||||
GrRotate(base->r,&x2,&y2,&z2);
|
||||
x2+=base->x;
|
||||
y2+=base->y;
|
||||
z2+=base->z;
|
||||
GrRotate(base->r,&x3,&y3,&z3);
|
||||
x3+=base->x;
|
||||
y3+=base->y;
|
||||
z3+=base->z;
|
||||
Box(base,x,y,z,x2,y2,z2,x3,y3,z3,&GrLinePlot);
|
||||
base->brush=old_brush;
|
||||
} else
|
||||
GrBox(base,x,y,w,h);
|
||||
}
|
||||
|
||||
public BoolU8 GrBlot3(GrBitMap *base,I8 x1,I8 y1,I8 z1,GrBitMap *img)
|
||||
{ //Clipping and transformation
|
||||
I8 reg i,j,w=img->width,h=img->height,old_color=base->color,reg color,
|
||||
d1,dx1,dy1,dz1,
|
||||
reg d2,dx2,dy2,dz2,
|
||||
adx1,ady1,adz1,
|
||||
adx2,ady2,adz2,
|
||||
x2,y2,z2,x3,y3,z3,
|
||||
dw,reg dh,x,y;
|
||||
GrBitMap *old_brush=base->brush;
|
||||
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
x2=x1+w; y2=y1; z2=z1;
|
||||
x3=x1; y3=y1+h; z3=z1;
|
||||
GrRotate(base->r,&x1,&y1,&z1);
|
||||
x1+=base->x;
|
||||
y1+=base->y;
|
||||
z1+=base->z;
|
||||
GrRotate(base->r,&x2,&y2,&z2);
|
||||
x2+=base->x;
|
||||
y2+=base->y;
|
||||
z2+=base->z;
|
||||
GrRotate(base->r,&x3,&y3,&z3);
|
||||
x3+=base->x;
|
||||
y3+=base->y;
|
||||
z3+=base->z;
|
||||
|
||||
dx1=x2-x1; dy1=y2-y1; dz1=z2-z1;
|
||||
dx2=x3-x1; dy2=y3-y1; dz2=z3-z1;
|
||||
adx1=AbsI8(dx1); ady1=AbsI8(dy1); adz1=AbsI8(dz1);
|
||||
adx2=AbsI8(dx2); ady2=AbsI8(dy2); adz2=AbsI8(dz2);
|
||||
|
||||
if (adx1>=ady1)
|
||||
d1=(adx1>=adz1) ? adx1:adz1;
|
||||
else
|
||||
d1=(ady1>=adz1) ? ady1:adz1;
|
||||
d1<<=1;
|
||||
if (d1) {
|
||||
dx1=dx1<<32/d1;
|
||||
dy1=dy1<<32/d1;
|
||||
dz1=dz1<<32/d1;
|
||||
} else
|
||||
return FALSE;
|
||||
|
||||
if (adx2>=ady2)
|
||||
d2=(adx2>=adz2) ? adx2:adz2;
|
||||
else
|
||||
d2=(ady2>=adz2) ? ady2:adz2;
|
||||
d2<<=1;
|
||||
if (d2) {
|
||||
dx2=dx2<<32/d2;
|
||||
dy2=dy2<<32/d2;
|
||||
dz2=dz2<<32/d2;
|
||||
} else
|
||||
return FALSE;
|
||||
|
||||
base->brush=NULL;
|
||||
|
||||
x=0;y=0;
|
||||
dw=w<<32/d1;
|
||||
dh=h<<32/d2;
|
||||
|
||||
x1<<=32; y1<<=32; z1<<=32;
|
||||
for (j=0;j<=d1;j++) {
|
||||
x2=x1; y2=y1; z2=z1;
|
||||
y=0;
|
||||
for (i=0;i<=d2;i++) {
|
||||
color=GrPeek(img,x.i4[1],y.i4[1]);
|
||||
if (color>=0 &&
|
||||
(old_color.u1[3]!=ROPB_TRANSPARENT ||
|
||||
color&0xFFFFFF!=img->bkcolor&0xFFFFFF)) {
|
||||
base->color=old_color&0xFF000000+color;
|
||||
GrPlot(base,x2.i4[1],y2.i4[1]);
|
||||
}
|
||||
x2+=dx2; y2+=dy2; z2+=dz2;
|
||||
y+=dh;
|
||||
}
|
||||
x1+=dx1; y1+=dy1; z1+=dz1;
|
||||
x+=dw;
|
||||
}
|
||||
base->color=old_color;
|
||||
base->brush=old_brush;
|
||||
return TRUE; //TODO: check off screen
|
||||
} else
|
||||
return GrBlot(base,x1,y1,img);
|
||||
}
|
||||
|
||||
public void Gr2Bezier3(GrBitMap *base,P3I4 *ctrl)
|
||||
{
|
||||
I8 i,x,y,z;
|
||||
P3I4 *ctrl2;
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
ctrl2=MAlloc(sizeof(P3I4)*3);
|
||||
for (i=0;i<3;i++) {
|
||||
x=ctrl[i].x;
|
||||
y=ctrl[i].y;
|
||||
z=ctrl[i].z;
|
||||
GrRotate(base->r,&x,&y,&z);
|
||||
ctrl2[i].x=x+base->x;
|
||||
ctrl2[i].y=y+base->y;
|
||||
ctrl2[i].z=z+base->z;
|
||||
}
|
||||
base->flags&=~BMF_TRANSFORMATION;
|
||||
Bezier2(base,ctrl2,&GrLine3Plot);
|
||||
base->flags|=BMF_TRANSFORMATION;
|
||||
Free(ctrl2);
|
||||
} else
|
||||
Bezier2(base,ctrl,&GrLine3Plot);
|
||||
}
|
||||
|
||||
public void Gr3Bezier3(GrBitMap *base,P3I4 *ctrl)
|
||||
{
|
||||
I8 i,x,y,z;
|
||||
P3I4 *ctrl2;
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
ctrl2=MAlloc(sizeof(P3I4)*4);
|
||||
for (i=0;i<4;i++) {
|
||||
x=ctrl[i].x;
|
||||
y=ctrl[i].y;
|
||||
z=ctrl[i].z;
|
||||
GrRotate(base->r,&x,&y,&z);
|
||||
ctrl2[i].x=x+base->x;
|
||||
ctrl2[i].y=y+base->y;
|
||||
ctrl2[i].z=z+base->z;
|
||||
}
|
||||
base->flags&=~BMF_TRANSFORMATION;
|
||||
Bezier3(base,ctrl2,&GrLine3Plot);
|
||||
base->flags|=BMF_TRANSFORMATION;
|
||||
Free(ctrl2);
|
||||
} else
|
||||
Bezier3(base,ctrl,&GrLine3Plot);
|
||||
}
|
||||
|
||||
public void Gr2BSpline3(GrBitMap *base,P3I4 *ctrl,I8 cnt,BoolU4 closed=FALSE)
|
||||
{
|
||||
I8 i,x,y,z;
|
||||
P3I4 *ctrl2;
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
ctrl2=MAlloc(sizeof(P3I4)*cnt);
|
||||
for (i=0;i<cnt;i++) {
|
||||
x=ctrl[i].x;
|
||||
y=ctrl[i].y;
|
||||
z=ctrl[i].z;
|
||||
GrRotate(base->r,&x,&y,&z);
|
||||
ctrl2[i].x=x+base->x;
|
||||
ctrl2[i].y=y+base->y;
|
||||
ctrl2[i].z=z+base->z;
|
||||
}
|
||||
base->flags&=~BMF_TRANSFORMATION;
|
||||
BSpline2(base,ctrl2,cnt,&GrLine3Plot,closed);
|
||||
base->flags|=BMF_TRANSFORMATION;
|
||||
Free(ctrl2);
|
||||
} else
|
||||
BSpline2(base,ctrl,cnt,&GrLine3Plot,closed);
|
||||
}
|
||||
|
||||
public void Gr3BSpline3(GrBitMap *base,P3I4 *ctrl,I8 cnt,BoolU4 closed=FALSE)
|
||||
{
|
||||
I8 i,x,y,z;
|
||||
P3I4 *ctrl2;
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
ctrl2=MAlloc(sizeof(P3I4)*cnt);
|
||||
for (i=0;i<cnt;i++) {
|
||||
x=ctrl[i].x;
|
||||
y=ctrl[i].y;
|
||||
z=ctrl[i].z;
|
||||
GrRotate(base->r,&x,&y,&z);
|
||||
ctrl2[i].x=x+base->x;
|
||||
ctrl2[i].y=y+base->y;
|
||||
ctrl2[i].z=z+base->z;
|
||||
}
|
||||
base->flags&=~BMF_TRANSFORMATION;
|
||||
BSpline3(base,ctrl2,cnt,&GrLine3Plot,closed);
|
||||
base->flags|=BMF_TRANSFORMATION;
|
||||
Free(ctrl2);
|
||||
} else
|
||||
BSpline3(base,ctrl,cnt,&GrLine3Plot,closed);
|
||||
}
|
||||
|
||||
|
||||
void GrLinePlot4(GrBitMap *base,I8 x,I8 y,I8 z)
|
||||
{
|
||||
nounusedwarn z;
|
||||
GrPlot4(base,x,y);
|
||||
}
|
||||
|
||||
public void GrLine4(GrBitMap *base,I8 x1,I8 y1,I8 x2,I8 y2,I8 step=1,I8 start=0)
|
||||
{ //Line with base->brush
|
||||
if (ClipLine(base,&x1,&y1,&x2,&y2))
|
||||
Line(base,x1,y1,0,x2,y2,0,&GrLinePlot4,step,start);
|
||||
}
|
||||
|
||||
public void GrSpeedLine(GrBitMap *base,I8 x1,I8 y1,I8 x2,I8 y2,double speed)
|
||||
{
|
||||
U8 old_flags=base->flags;
|
||||
I8 old_pen_width=base->pen_width;
|
||||
if (ClipLine(base,&x1,&y1,&x2,&y2)) {
|
||||
base->pen_width=base->speedline_scale*speed;
|
||||
base->flags&=~BMF_TRANSFORMATION;
|
||||
GrLine3(base,x1,y1,0,x2,y2,0);
|
||||
base->flags=old_flags;
|
||||
base->pen_width=old_pen_width;
|
||||
}
|
||||
}
|
||||
|
||||
public void GrSpeedLine2(GrBitMap *base,I8 x1,I8 y1,I8 z1,I8 x2,I8 y2,I8 z2,double speed)
|
||||
{ //transformation but not pen width
|
||||
U8 old_flags=base->flags;
|
||||
|
||||
if (base->flags & BMF_TRANSFORMATION) {
|
||||
GrRotate(base->r,&x1,&y1,&z1);
|
||||
x1+=base->x;
|
||||
y1+=base->y;
|
||||
z1+=base->z;
|
||||
GrRotate(base->r,&x2,&y2,&z2);
|
||||
x2+=base->x;
|
||||
y2+=base->y;
|
||||
z2+=base->z;
|
||||
}
|
||||
base->flags&=~BMF_TRANSFORMATION;
|
||||
GrSpeedLine(base,x1,y1,x2,y2,speed);
|
||||
base->flags=old_flags;
|
||||
}
|
||||
|
||||
Binary file not shown.
Reference in new issue
Block a user