home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1994 #1
/
monster.zip
/
monster
/
PROG_C
/
VGAGRAPH.ZIP
/
BGI.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-12-12
|
5KB
|
243 lines
#include <math.h>
#include <string.h>
#include <alloc.h>
#include <io.h>
#include <fcntl.h>
#include <dos.h>
#include <stdlib.h>
#include <stat.h>
#include "allproc.h"
long dx,dy,dsh,hhy,nhhy,hy;
unsigned int bgilen,wxx,offs,xs,ys;
unsigned char base;
unsigned char tabl[18],coly[600];
char *fontptr;
char *ch;
void sizechar(float x,float y,int typf)
{
dx=floor(64*x);
dy=floor(64*y);
hhy=(((hy*dy) >> 6)*11) >> 3;
nhhy=((hhy*(dx >> 4))/(dy >> 4))/30;
if (typf==1) nhhy=0;
}
char ldfontbgi(char *fname,char *p)
{
int f;
long l;
unsigned int i,j,k;
char *ch;
if (strlen(fname)!=0)
{
f=open(fname,O_BINARY | S_IREAD);
if (f==-1) return(1);
l = filelength(f);
bgilen=l;
if (coreleft()<l) return(1);
fontptr=(char *)malloc(l);
read(f,fontptr,l);
close(f);
ch=fontptr;
if ((ch[0]!='P') || (ch[1]!='K') ||
(ch[2]!=8) || (ch[3]!=8))
{ free(fontptr);return(1);}
}
else
{
fontptr=p;
ch=p;
if ((ch[0]!='P') || (ch[1]!='K') || (ch[2]!=8) || (ch[3]!=8)) return(1);
bgilen=0;
}
i = 0;
while ((ch[i]!=0x1A) || (i==l)) i=i+1;
if (i==l) return(1);
base=ch[i+1];
for (i=0;i<=16;i++) tabl[i]=ch[base+i];
offs=base+(long)(tabl[6] << 8) + (long)(tabl[5]);
i=tabl[10];
j=tabl[8];
i=256-i;
hy=j+i;
return(0);
}
void freefontbgi()
{
if (bgilen!=0) free(fontptr);
}
int test_coord(unsigned int xy)
{
asm{
mov cx,xy
xchg ch,cl
xor ax,ax
test ch,0x80
je m1
mov ax,2
}
m1:
asm{
test cl,0x80
je m2
inc al
}
m2:
return(_AX);
}
unsigned int convert_xy(char x)
{
char cod;
unsigned int i;
asm{
push dx
mov al,x
xor dx,dx
and al,0x7F
mov bl,al
xor bh,bh
and al,0x40
je m1
dec bh
dec dx
or bl,0x80
}
m1: asm{
mov ax,bx
pop dx
}
return(_AX);
}
void lines(int x1,int y1,int x2,int y2,int typ,int cole)
{
int i,w,d,dx,dy,x,y,ainc,binc,yinc,xinc;
if ((typ==0) || (peekb(0x0,0x0449)!=0x13))
for (i=0;i<=nhhy;i++) line(x1+i,y1,x2+i,y2,cole);
else
{
dx=x2-x1;
dy=y2-y1;
if (abs(dx)>=abs(dy))
{
if (x1>x2){ w=x1;x1=x2;x2=w;w=y1;y1=y2;y2=w;}
if (y2>y1) yinc=1; else yinc=-1;
dx=x2-x1;
dy=abs(y2-y1);
d=dy*2 - dx;
ainc=(dy-dx)*2;
binc=dy*2;
x=x1;
y=y1;
line(x,y,x+nhhy,y,coly[y-ys]);
for (x=(x1+1);x<=x2;x++)
{
if (d>0)
{
y+=yinc;
d+=ainc;
}
else d+=binc;
line(x,y,x+nhhy,y,coly[y-ys]);
}
}
else
{
if (y1>y2){ w=x1;x1=x2;x2=w;w=y1;y1=y2;y2=w;}
if (x2>x1) xinc=1; else xinc=-1;
dy=y2-y1;
dx=abs(x2-x1);
d=dx*2 - dy;
ainc=(dx-dy)*2;
binc=dx*2;
x=x1;
y=y1;
line(x,y,x+nhhy,y,coly[y-ys]);
for (y=(y1+1);y<=y2;y++)
{
if (d>0)
{
x+=xinc;
d+=ainc;
}
else d+=binc;
line(x,y,x+nhhy,y,coly[y-ys]);
}
}
}
}
void bgitext(int x00,int y00,char *str,char cols,char cole,char typ)
{
long xx1,yy1,xx2,yy2,xxx,yyy,k;
long x0,y0,x,y,j,i,x1,y1,x2,y2;
unsigned int ofs1,xy;
if (peekb(0x0,0x0449)!=0x13)
for (i=1;i<=hhy;i++) coly[i]=cole;
else
{
if (typ==0) for (i=0;i<=hhy;i++) coly[i]=cols;
if (typ==1) for (i=0;i<=hhy;i++) coly[i]=((cols-cole)*(i-1))/(hhy-1)+cole;
j=(hhy*6)/10;
if (typ==2)
for (i=0;i<=hhy;i++) if (i<j) coly[i]=((cole-cols)*(i-1))/(j-1)+cols;
else coly[i]=((cols-cole)*(i-j))/(j-1)+cole;
}
x=x00;y=y00;
ys=y00;
x00=((x00*dx) >> 6)-x00;
y00=((y00*dy) >> 6)-y00;
for (i=0;i<strlen(str);i++)
{
k=((int)(str[i]) - (int)(tabl[4]))*2 + 0x10+base;
ch = fontptr;
ofs1=(unsigned char )ch[k]+((unsigned char )(ch[k+1]) << 8);
ch = (fontptr+offs+ofs1);
j=0;x1=0;y1=0;
L: xy = (unsigned char )ch[j*2]+((unsigned char )(ch[j*2+1]) << 8);
j=j+1;
k=test_coord(xy);
if (k==2)
{
x1 = convert_xy( xy & 0xFF);
y1 = convert_xy( xy >> 8 );
}
if (k==3)
{
x2 = convert_xy( xy & 0xFF);
y2 = convert_xy( xy >> 8 );
x0 = x1; y0 = y1; x1 = x2; y1 = y2;
xx1=((x+x0)*dx) >> 6;
yy1=((y+hy-y0)*dy) >> 6;
xx2=((x+x2)*dx) >> 6;
yy2=((y+hy-y2)*dy) >> 6;
xx1=xx1-x00;
yy1=yy1-y00;
xx2=xx2-x00;
yy2=yy2-y00;
lines( xx1, yy1, xx2, yy2,typ,cols);
}
if (k==0)
{
x = x + x1 ;
}
if ( k != 0) goto L;
}
}