LTCD_070816.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:45:20 +02:00
1 parent d14bbc24f9
commit 0e9364ff4c
506 files changed
+157705 -41812

No files matched your search

+13
View File
@@ -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
+569
View File
@@ -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"
+728
View File
@@ -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.