SecondReality/GRAB/GFXSAVE.H
2017-09-24 01:45:36 +02:00

336 lines
5.9 KiB
C

/*****************************************************************
Saves gfxdata to file
variables required from outside:
unsigned char pic[]; ;array to 320x200 1BM
int backcol; ;transparent color
int fcporigo; ;1 if origo in the center of area
int fcporigox,fcporigoy ;if ^=2 then origoxy
*****************************************************************/
int writefcporigo(FILE *f1,int x1,int y1,int x2,int y2)
{
int xl=x2-x1+1,yl=y2-y1+1;
int x,y,a,b,c;
if(fcporigo==3)
{
for(x=x1;x<=x2;x++) for(y=y1;y<=y2;y++)
{
if(vram[x+y*320]==1)
{
putw(-y,f1);
putw(-x,f1);
pic[x+y*320]=vram[x+y*320]=vram[1+x+y*320];
}
}
}
else if(fcporigo==2)
{
putw(-fcporigoy,f1);
putw(-fcporigox,f1);
}
else if(fcporigo)
{
putw(-(yl+1)/2,f1);
putw(-(xl+1)/2,f1);
}
else
{
putw(0,f1);
putw(0,f1);
}
}
int savegfxdata(FILE *f1,int x1,int y1,int x2,int y2)
{
int xl=x2-x1+1,yl=y2-y1+1;
int a,x,y,z,c;
unsigned int u,u2,lastp;
putc(0x01,f1);
putc(0,f1);
if(fcporigo==3)
{
for(x=x1;x<=x2;x++) for(y=y1;y<=y2;y++)
{
if(vram[x+y*320]==1)
{
putw(-y,f1);
putw(-x,f1);
pic[x+y*320]=vram[x+y*320]=vram[1+x+y*320];
}
}
}
else if(fcporigo==2)
{
putw(-fcporigoy,f1);
putw(-fcporigox,f1);
}
else if(fcporigo)
{
putw(-yl/2,f1);
putw(-xl/2,f1);
}
else
{
putw(0,f1);
putw(0,f1);
}
putw(yl,f1);
putw(xl,f1);
for(z=0;z<4;z++)
{
for(y=y1;y<=y2;y++)
{
u =(unsigned)y*320+(unsigned)x1+(unsigned)z;
u2=(unsigned)y*320+(unsigned)x2;
lastp=u;
while(u<=u2)
{
if(pic[u]==backcol)
{
while(pic[u]==backcol && u<=u2)
{
for(c=0;u<=u2 && c<127 && pic[u]==backcol;u+=4,c++);
if(u<=u2) putc(c,f1);
}
}
if(u>u2) break;
lastp=u;
for(c=1;u<=u2 && c<63 && pic[u]==pic[u+4] && pic[u]!=backcol;u+=4,c++);
if(c>2)
{
putc((c<<1)|0x80,f1);
putc(pic[lastp],f1);
u+=4;
}
else
{
u=lastp;
if((u2-u)+1>2)
{
for(c=0;u<=u2 && c<63 &&
(pic[u]!=pic[u+4] || pic[u]!=pic[u+8])
&& pic[u]!=backcol;u+=4,c++);
}
else for(c=0;u<=u2 && c<63 && pic[u]!=backcol;u+=4,c++);
if(c!=0)
{
putc((c<<1)|0x81,f1);
for(a=0;a<c;a++)
{
putc(pic[lastp+a*4],f1);
}
}
}
}
putc(0,f1);
#ifdef VPSOFT
pxor(x1,y);
pxor(x2,y);
#endif
}
}
}
int savegfxdata1(FILE *f1,int x1,int y1,int x2,int y2)
{
int xl=x2-x1+1,yl=y2-y1+1;
int a,x,y,c;
unsigned int u,u2,lastp;
putc(0x02,f1);
putc(0,f1);
if(fcporigo==3)
{
for(x=x1;x<=x2;x++) for(y=y1;y<=y2;y++)
{
if(vram[x+y*320]==1)
{
putw(-(y-y1),f1);
putw(-(x-x1),f1);
pic[x+y*320]=vram[x+y*320]=vram[1+x+y*320];
break;
}
}
}
else if(fcporigo==2)
{
putw(-fcporigoy,f1);
putw(-fcporigox,f1);
}
else if(fcporigo)
{
putw(-yl/2,f1);
putw(-xl/2,f1);
}
else
{
putw(0,f1);
putw(0,f1);
}
putw(yl,f1);
putw(xl,f1);
{
for(y=y1;y<=y2;y++)
{
u =(unsigned)y*320+(unsigned)x1;
u2=(unsigned)y*320+(unsigned)x2;
while(u<=u2)
{
if(pic[u]==backcol)
{
while(pic[u]==backcol && u<=u2)
{
for(c=0;u<=u2 && c<127 && pic[u]==backcol;u++,c++);
if(u<=u2) putc(c,f1);
}
}
if(u>u2) break;
lastp=u;
for(c=1;u<u2 && c<63 && pic[u]==pic[u+1] && pic[u]!=backcol;u++,c++);
if(c>2)
{
putc((c<<1)|0x80,f1);
putc(pic[lastp],f1);
u++;
}
else
{
u=lastp;
if((u2-u)+1>2)
{
for(c=0;u<=u2 && c<63 &&
(pic[u]!=pic[u+1] || pic[u]!=pic[u+2])
&& pic[u]!=backcol;u++,c++);
}
else for(c=0;u<=u2 && c<63 && pic[u]!=backcol;u++,c++);
if(c!=0)
{
putc((c<<1)|0x81,f1);
for(a=0;a<c;a++)
{
putc(pic[lastp+a*1],f1);
}
}
}
}
putc(0,f1);
#ifdef VPSOFT
pxor(x1,y);
pxor(x2,y);
#endif
}
}
}
int savegfxdata3(FILE *f1,int x1,int y1,int x2,int y2)
{
int xl=x2-x1+1,yl=y2-y1+1;
int a,x,y,c;
int skip;
unsigned int u,u2,lastp;
y1--;
putw(0x0003,f1);
writefcporigo(f1,x1,y1,x2,y2);
putw(yl+1,f1);
putw(xl,f1);
{
for(x=x1;x<=x2;x++)
{
skip=1;
for(y=y1+1;y<=y2;y++)
{
u=x+y*320;
if(pic[u]==backcol)
{
skip++;
continue;
}
for(c=y;y<=y2+1;y++)
{
u=x+y*320;
if(pic[u]==backcol) break;
}
putc(y-c,f1);
putc(skip,f1); skip=0;
for(a=c;a<y;a++) putc(pic[x+a*320],f1);
y--;
}
putw(0,f1);
#ifdef VPSOFT
pxor(x1,y);
pxor(x2,y);
#endif
}
}
}
int savegfxdatax(FILE *f1,int x1,int y1,int x2,int y2)
{ /* codewise optimized sprite */
int xl=x2-x1+1,yl=y2-y1+1;
int a,x,y,z,c,be,b;
int skip;
unsigned char buf[400],wbuf[16];
unsigned int u,u2,lastp;
putw(0x0004,f1);
writefcporigo(f1,x1,y1,x2,y2);
putw(yl,f1);
putw(xl,f1);
for(z=0;z<4;z++)
{
for(y=y1;y<=y2;y++)
{
memset(buf,backcol,400);
for(be=0,x=x1+z;x<=x2;x+=4)
{
buf[be++]=pic[x+y*320];
}
for(c=b=0;b<be;b+=8)
{
wbuf[0]=0;
for(a=0;a<8;a++)
{
if(buf[a+b]!=backcol)
{
wbuf[a+1]=buf[a+b];
wbuf[0]|=(1<<a);
}
}
if(wbuf[0])
{ // some data!
if(c>0)
{
a=c*8;
while(a>240)
{
putc(0,f1);
putc(240,f1);
a-=240;
}
if(a)
{
putc(0,f1);
putc(a,f1);
}
c=0;
}
putc(wbuf[0],f1);
for(a=0;a<8;a++)
{
if(wbuf[0]&(1<<a))
{
putc(wbuf[a+1],f1);
}
}
}
else c++;
}
putc(0,f1);
putc(0,f1);
#ifdef VPSOFT
pxor(x1,y);
pxor(x2,y);
#endif
}
}
}