Example of drawing lines in the c programming language
Linemake.C is a tester program to test the
implementation of the complex line drawing
function
vga_drawline(int xsrc,int ysrc,int xdest,int ydest);
within the wgslater.c posted elsewhere on
the Internet.
Four integers are entered one on each line.
Then linemake.c draws one line.
linemake.c uses floating point numbers to store
up to 60 bits of font data for each character
with up to 51 bits in the mantissia and 9 bits
in the exponent.
Octal digits store line drawing commands for each
character. Non-zero numbers in groups of four
digits draw each line within each
character. Characters are limited to only five
lines at the most.
wgslater.c is posted elsewhere on the Internet
and is used as a header file to implement vga.h
functions in an XWindows environment. This program
linemake.c was made to test the line drawing capability
of wgslater.c
linemake.c is next */
// first line of linemake.c
#include"zackvga.h"
// linemake.c is written by Eric Matteson
// permission is granted to copy this source
// code file linemake.c and to publish it on
// the internet and to use it at least for
// non-profit use.
// This linemake.c is designed to be compiled with
// seperate header files zackvga.h and wgslater.c
// to run in pretend vga.h mode on XWindows
// gcc -Wall linemake.c -L/usr/X11R6/lib -lX11 -o linemake.out
// ./linemake.out
// global variables
int ia[16];
double df[256];
char ch[4000];
int zerotext,zmtextbase,zmctr,zmlim,xlimit,ylimit;
int zisline;
double kellylt;
// -------------------------------------------------
int zabonedig(char* zfonz,int riflsub);
double beldzeed(int denompowbe);
void deweyencode(double zelmemb[],int zelcoz[],char* lfwnz);
void dlfl(double lfonb[],int liflsub,int liflhmany,
char* zafonl);
void fillfl(double* lfonz,int fillposxy[]);
int powfpwrite(char* wasmant,int waswid,
int wasbase,double wasvali);
void lfcopy(int lfcposxy[],char lfctarg[],char* lfcsrc);
void deweydecode(int* edrawlist,double* defona,char wrdew);
void drawonec(int dcposxy[],double* defonh,char onerdaw);
void drawonel(int lcposxy[],double* lefonh,char* oneldaw);
void drawonepg(int pgposxy[],double* pgfonh,char* onepgdaw);
void lfscroll(int scrposxy[],char scrblock[]);
int ldvread(char* ldvfrom,int ldvbigsub,int ldvrwid,
int ldvbase);
int nzlfkeyline(int keyposxy[],double* zkfon,
char keyblock[]);
void fullfpshow(char* fpwblock,int fpwposxy[],
double fpwfrom);
void zack_fillrect(int xul,int yul,int zmowid,int zmohgt);
// ----------------------------------------------------------
int zabonedig(char* zfonz,int riflsub)
{
int beldresd,deweyresd;
deweyresd=(int)(*(zfonz+riflsub));
if(deweyresd < 0)deweyresd = deweyresd + 256;
beldresd = 17;
if((deweyresd >= 48)&&(deweyresd <= 57))
{
beldresd=deweyresd-48;
}
if((deweyresd >= 65)&&(deweyresd <= 70))
{
beldresd=deweyresd-55;
}
if((deweyresd >= 97)&&(deweyresd <= 102))
{
beldresd=deweyresd-87;
}
return beldresd;
}
double beldzeed(int denompowbe)
{
double yeldzeed,yeldunder;
int eltbectr;
eltbectr=0;
yeldzeed = 1.0;
yeldunder = 1.0 / 8.0;
while(eltbectr < denompowbe)
{
yeldzeed = yeldzeed * yeldunder;
eltbectr = eltbectr + 1;
}
return yeldzeed;
}
void deweyencode(double zelmemb[],int zelcoz[],char* lfwnz)
{
double denres,denexp,denterp,denfac,dendig;
int zelcez,zeltcr,denallow,zelexp,keliexp;
double kellyexp;
zelcez=zelcoz[0];
denterp=beldzeed(1);
denfac=denterp;
denallow=1;
while(denallow > 0)
{
zeltcr=zabonedig(lfwnz,zelcez);
if(zeltcr < 16)denallow=0;
if(zelcez >= 80)denallow=0;
if(denallow > 0)zelcez=zelcez+1;
}
zelexp=0;
denallow=1;
keliexp=0;
while((denallow > 0)&&(keliexp < 3))
{
zeltcr = zabonedig(lfwnz,zelcez);
if(zeltcr > 15)denallow=0;
if(zelcez >= 80)denallow=0;
if(denallow > 0)
{
zelexp=zelexp*8;
zelexp=zelexp+zeltcr;
zelcez=zelcez+1;
keliexp=keliexp+1;
}
if(zeltcr < 1)denallow=0;
}
denres = 0.0;
while(denallow > 0)
{
zeltcr=zabonedig(lfwnz,zelcez);
if(zeltcr > 15)denallow=0;
if(zelcez >= 80)denallow=0;
dendig=(double)zeltcr;
if(denallow > 0)
{
denres=denres+(denterp * dendig);
denterp=denterp*denfac;
zelcez=zelcez+1;
}
if(zeltcr < 1)denallow=0;
}
denallow=0;
kellyexp=8.0;
dendig=beldzeed(257);
while(denallow < zelexp)
{
dendig=dendig*kellyexp;
denallow=denallow+1;
}
denres=denres*dendig;
zelmemb[0]=denres;
zelcoz[0]=zelcez;
// end of deweyencode
}
void dlfl(double lfonb[],int liflsub,int liflhmany,
char* zafonl)
{
double onefonz[1];
int beflsub[1];
int ctrlfl;
ctrlfl = 0;
// too far to right beflsub[0]=liflsub+ctrlfl;
beflsub[0]=0;
while(ctrlfl < liflhmany)
{
// beflsub[0]=liflsub+ctrlfl;
deweyencode(onefonz,beflsub,zafonl);
lfonb[liflsub+ctrlfl]=onefonz[0];
ctrlfl=ctrlfl+1;
}
}
void fillfl(double* lfonz,int fillposxy[])
{
// Line drawing type of font
// sets of four octal digits
// xposa yposa sizea drawtypea
// xpos 1-5 within 0-6 wid 7
// ypos 1-7 within 0-8 hgt 9
// drawtypea 1 to 4
// 1 right EAST
// 2 down SOUTH
// 3 lower right SOUTHEAST
// 4 upper right NORTHEAST
dlfl(lfonz,0,8,"0-0-0-0-0-0-0-0-------------------------");
dlfl(lfonz,8,8,"0-0-0-0-0-0-0-0-------------------------");
dlfl(lfonz,16,8,"0-0-0-0-0-0-0-0------------------------");
dlfl(lfonz,24,8,"0-0-0-0-0-0-0-0------------------------");
// 32 blank ! doublequotes
dlfl(lfonz,32,3,"0-31423612-2222422213214321------------");
// 35 #
dlfl(lfonz,35,1,"2172417213511551-----------------------");
// 36 $
dlfl(lfonz,36,1,"11511122125317513172-------------------");
// 37 %
dlfl(lfonz,37,1,"16543122132153323731-------------------");
// 38 & singlequote
dlfl(lfonz,38,2,"13421451175151622334-13111422----------");
// 40 ( )
dlfl(lfonz,40,2,"133415331332-313353323734--------------");
// 42 * + , -
dlfl(lfonz,42,4,"165412533252-14513252-55114621-1441----");
// 46 . /
dlfl(lfonz,46,2,"36224622-1654--------------------------");
// 48 0 1
dlfl(lfonz,48,2,"1172517221312731-41622224--------------");
// 50 2 3
dlfl(lfonz,50,2,"51421442114124312741-1141144117415172--");
// 52 4 5
dlfl(lfonz,52,2,"114224315172-11425442214124312731------");
// 54 6 7
dlfl(lfonz,54,2,"54421172214124312731-11511654----------");
// 56 8
dlfl(lfonz,56,1,"21312431273151721172-------------------");
// 57 9 : ;
dlfl(lfonz,57,2,"21312431273151721142-33113511----------");
// 59 ; < =
dlfl(lfonz,59,3,"331125213611-14441443-13411541---------");
// 62 > ?
dlfl(lfonz,62,2,"17441143-3431513211413532--------------");
// 64 @ A
dlfl(lfonz,64,2,"33323533517211511172-2131243111725172--");
// 66 B C
dlfl(lfonz,66,2,"21432443244127411172-115117511252------");
// 68 D
dlfl(lfonz,68,1,"31335322273411721121-------------------");
// 69 E F
dlfl(lfonz,69,2,"2141244127411172-117221412441----------");
// 71 G H
dlfl(lfonz,71,2,"34331421274121411172-243151721172------");
// 73 I J K
dlfl(lfonz,73,3,"213127313252-17415172-244435331172-----");
// 76 L M N
dlfl(lfonz,76,3,"27411172-3334113352621262-233351721172-");
// 79 O P
dlfl(lfonz,79,2,"13344223544214422731-2431113151421172--");
// 81 Q R
dlfl(lfonz,81,2,"1151124215543333-24311141514211721443--");
// 83 S T
dlfl(lfonz,83,2,"21213731145154421142-11513262----------");
// 85 U V
dlfl(lfonz,85,2,"273151721172-3734144312225232----------");
// 87 W X Y
dlfl(lfonz,87,3,"1744343351621162-16541253-333411333442-");
// 90 Z [ backslash
dlfl(lfonz,90,3,"165411511751-113117311252-1253---------");
// 93 ] ^ _
dlfl(lfonz,93,3,"313137315252-311122114211-1751---------");
// 96 graveaccentbackwardssinglequotebelowsquiggley a
dlfl(lfonz,96,2,"211132111-11411441174115225172---------");
// 98 b c
dlfl(lfonz,98,2,"2431273154421172-244127411442----------");
// 100 d
dlfl(lfonz,100,1,"1442243127315172----------------------");
// 101 e f
dlfl(lfonz,101,2,"24315142213111722731-214124211162-----");
// 103 g h
dlfl(lfonz,103,2,"2334233351722731-244155321172---------");
// 105 i j k
dlfl(lfonz,105,3,"33423111-273153525111-343434332252----");
// 108 l m
dlfl(lfonz,108,2,"22523631-3634143315325532-------------");
// 110 n o
dlfl(lfonz,110,2,"134314325332-1534373415333333---------");
// 112 p q
dlfl(lfonz,112,2,"4332232125211352-11511451514211423342-");
// 114 r s
dlfl(lfonz,114,2,"14411532-12411232143127341741---------");
// 116 t u v
dlfl(lfonz,116,3,"13513362-144254422731-37341533--------");
// 119 w x
dlfl(lfonz,119,2,"3533173414425442-17441443-------------");
// 121 y z
dlfl(lfonz,121,2,"353413333532-174414312731-------------");
// 123 { | }
dlfl(lfonz,123,2,"3131373114213172-31323532-------------");
// 125 } ~
dlfl(lfonz,125,2,"1131317234311731-222131235111---------");
// 127
dlfl(lfonz,127,9,"0-0-0-0-0-0-0-0-0---------------------");
dlfl(lfonz,136,8,"0-0-0-0-0-0-0-0-----------------------");
dlfl(lfonz,144,16,"0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0------");
dlfl(lfonz,160,16,"0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0------");
dlfl(lfonz,176,16,"0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0------");
dlfl(lfonz,192,16,"0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0------");
dlfl(lfonz,208,16,"0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0------");
dlfl(lfonz,224,16,"0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0------");
dlfl(lfonz,240,16,"0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0------");
// later bottom of initializer after expansion
fillposxy[0]=0;
fillposxy[1]=14;
// 1 hgt
fillposxy[2]=0;
fillposxy[3]=0;
fillposxy[4]=0;
fillposxy[5]=15;
fillposxy[6]=0;
fillposxy[7]=0;
fillposxy[8]=0;
fillposxy[9]=3;
fillposxy[10]=4;
fillposxy[11]=10;
// implied dim fillposxy[12];
}
// end of fillfl
int powfpwrite(char* wasmant,int waswid,
int wasbase,double wasvali)
{
int sowfpwrite,sowctr,fpwritectr,wasbminus,sowallow;
double shrinkval,sowfact,sowudfact,sowcmp;
double wasvabs;
int fpwrneg;
fpwrneg=0;
wasvabs=wasvali;
if(wasvali < 0)
{
wasvabs = 0.0 - wasvali;
fpwrneg=1;
}
sowfact=(double)wasbase;
sowudfact = 1.0 / sowfact;
shrinkval=wasvabs;
sowctr=0;
if(wasvabs >= 1.0)
{
while(shrinkval >= 1.0)
{
shrinkval = shrinkval / sowfact;
sowctr=sowctr+1;
}
}
if((wasvabs < sowudfact)&&(shrinkval > 0.0))
{
while((shrinkval < sowudfact)&&(shrinkval > 0.0))
{
shrinkval = shrinkval * sowfact;
sowctr = sowctr - 1;
}
}
sowfpwrite=sowctr;
wasbminus=wasbase-1;
fpwritectr=0;
while(fpwritectr < waswid)
{
sowctr=0;
sowallow=1;
while(sowallow > 0)
{
sowcmp=shrinkval-sowudfact;
if(sowcmp < 0.0)sowallow=0;
if(sowallow > 0)shrinkval=sowcmp;
if(sowallow > 0)sowctr=sowctr+1;
if(sowctr >= wasbminus)sowallow=0;
}
shrinkval=shrinkval*sowfact;
if(sowctr > 9)sowctr=sowctr+39;
sowctr=sowctr+48;
*(wasmant+fpwritectr)=(char)sowctr;
fpwritectr=fpwritectr+1;
}
return sowfpwrite;
}
// end of powfpwrite
void lfcopy(int lfcposxy[],char lfctarg[],char* lfcsrc)
{
int kflctr,kflbase,kflallow;
char lfcbucket;
kflbase=(lfcposxy[1]-1)*80;
kflctr=0;
kflallow=1;
while(kflallow > 0)
{
lfcbucket = *(lfcsrc + kflctr);
if(lfcbucket == '!')kflallow=0;
if(lfcbucket < '\40')kflallow=0;
if(kflallow > 0)
{
lfctarg[kflbase + kflctr]=lfcbucket;
kflctr=kflctr+1;
if(kflctr >= 70)kflallow=0;
}
}
while(kflctr < 80)
{
lfctarg[kflbase + kflctr] = '\40';
kflctr=kflctr+1;
}
}
void deweydecode(int* edrawlist,double* defona,char wrdew)
{
int depower,wrmalc,dedewctr;
char decliney[20];
double bfong;
wrmalc = (int)wrdew;
if(wrmalc < 0)wrmalc=wrmalc+256;
bfong = *(defona + wrmalc);
depower = 257 + powfpwrite(decliney,17,8,bfong);
dedewctr=3;
while(dedewctr < 20)
{
*(edrawlist + dedewctr)=(int)decliney[dedewctr-3];
dedewctr=dedewctr+1;
}
depower=depower+512;
bfong=(double)depower;
depower=powfpwrite(decliney,5,8,bfong);
dedewctr=0;
while(dedewctr < 3)
{
*(edrawlist + dedewctr)=(int)decliney[dedewctr + 1];
dedewctr=dedewctr+1;
}
// end of deweydecode
}
void drawonec(int dcposxy[],double* defonh,char onerdaw)
{
int xdobase,ydobase,cdoxposa,cdoyposa,cdosizea,cdotype;
int codhold[20];
int cdofivectr;
xdobase=(dcposxy[0]*7)+dcposxy[2];
ydobase=(dcposxy[1]*9)+dcposxy[3];
deweydecode(codhold,defonh,onerdaw);
cdotype=5;
cdofivectr=0;
while(cdofivectr < 20)
{
cdoxposa=codhold[cdofivectr]+xdobase-48;
cdoyposa=codhold[cdofivectr + 1]+ydobase-48;
cdosizea=codhold[cdofivectr + 2]-48;
cdotype=codhold[cdofivectr + 3]-48;
if(cdotype == 1)
{
vga_drawline(cdoxposa,cdoyposa,(cdoxposa+cdosizea),
cdoyposa);
}
if(cdotype == 2)
{
vga_drawline(cdoxposa,cdoyposa,cdoxposa,
(cdoyposa+cdosizea));
}
if(cdotype == 3)
{
vga_drawline(cdoxposa,cdoyposa,(cdoxposa+cdosizea),
(cdoyposa+cdosizea));
}
if(cdotype == 4)
{
vga_drawline(cdoxposa,cdoyposa,(cdoxposa+cdosizea),
(cdoyposa-cdosizea));
}
cdofivectr=cdofivectr+4;
}
}
void drawonel(int lcposxy[],double* lefonh,char* oneldaw)
{
int dloctrx,dlosavx,dlosub,dlocy,dlocolor;
char oneldar;
dlosavx=lcposxy[0];
// lcposxy
// 0 x7
// 1 y9
// 2 bax
// 3 bay
// 4 fgc foreground color
// 5 bgc background color
// 6 keypos
// 7 currkey
// 8 fpxa
// 9 fpew
// 10 fpmw
// 11 fpbase
dlosub=lcposxy[1]*80;
dloctrx=0;
dlocy=(lcposxy[1]*9)+lcposxy[3];
dlocolor=lcposxy[5];
vga_setcolor(dlocolor);
while(dloctrx < 9)
{
vga_drawline(0,(dlocy + dloctrx),559,(dlocy + dloctrx));
dloctrx=dloctrx+1;
}
dlocolor=lcposxy[4];
vga_setcolor(dlocolor);
dloctrx=0;
while(dloctrx < 80)
{
oneldar = *(oneldaw + (dlosub + dloctrx));
lcposxy[0]=dloctrx;
drawonec(lcposxy,lefonh,oneldar);
dloctrx=dloctrx+1;
}
lcposxy[0]=dlosavx;
}
// end of drawonel pg 982
void drawonepg(int pgposxy[],double* pgfonh,char* onepgdaw)
{
int dloctry,dlosavy;
dlosavy=pgposxy[1];
dloctry=0;
while(dloctry < dlosavy)
{
pgposxy[1]=dloctry;
drawonel(pgposxy,pgfonh,onepgdaw);
dloctry=dloctry+1;
}
pgposxy[1]=dlosavy;
}
void lfscroll(int scrposxy[],char scrblock[])
{
int scrhgtl,scrotr,scritr,scrbtr;
scrhgtl=scrposxy[1]-1;
scrotr=0;
scrbtr=0;
while(scrotr < scrhgtl)
{
scritr=0;
while(scritr < 80)
{
scrblock[scrbtr + scritr] = scrblock[scrbtr+80+scritr];
scritr=scritr+1;
}
scrbtr=scrbtr+80;
scrotr=scrotr+1;
}
scritr=0;
while(scritr < 80)
{
scrblock[scrbtr + scritr] = '\40';
scritr=scritr+1;
}
}
int ldvread(char* ldvfrom,int ldvbigsub,int ldvrwid,
int ldvbase)
{
int ldvres,ldvabase,ldvsbase,ldvrctr,ldvrsub,ldvrterm;
int ldvrallow;
ldvsbase=0;
ldvres=0;
ldvabase=ldvbase;
if(ldvbase < 0)
{
ldvabase = 0 - ldvbase;
ldvsbase = 1;
}
ldvrctr = 0;
ldvrallow = 1;
while(ldvrallow > 0)
{
ldvrsub=ldvrctr+ldvbigsub;
ldvrterm=zabonedig(ldvfrom,ldvrsub);
if(ldvrterm < 16)ldvrallow=0;
if(ldvrallow > 0)ldvrctr=ldvrctr+1;
if(ldvrctr >= ldvrwid)ldvrallow=0;
}
ldvrallow=0;
if(ldvrctr < ldvrwid)ldvrallow=1;
while(ldvrallow > 0)
{
ldvrsub=ldvbigsub+ldvrctr;
ldvrterm=zabonedig(ldvfrom,ldvrsub);
if(ldvrterm > 15)ldvrallow=0;
if(ldvrallow > 0)
{
ldvres=ldvres*ldvabase;
ldvres=ldvres+ldvrterm;
ldvrctr=ldvrctr+1;
if(ldvrctr >= ldvrwid)ldvrallow=0;
}
}
if(ldvsbase == 1)ldvres=ldvrctr;
return ldvres;
}
// bottom of ldvread
int nzlfkeyline(int keyposxy[],double* zkfon,
char keyblock[])
{
int zkeysub,zkeyres,zkeyval,zkeybase,teekey;
teekey=0;
keyposxy[7]=0;
while(teekey == 0)
{
teekey=vga_getkey();
}
while(teekey != 0)
{
keyposxy[7]=keyposxy[7]*256;
keyposxy[7]=keyposxy[7]+teekey;
teekey=vga_getkey();
}
zkeyres=vga_getydim();
zkeyres=zkeyres-(9*keyposxy[1]);
keyposxy[3]=zkeyres;
zkeyres=0;
zkeyval=keyposxy[7];
zkeybase=(keyposxy[1]-1)*80;
zkeysub=keyposxy[6];
if((zkeyval == 8)||(zkeyval == 127))
{
if(zkeysub > 0)zkeysub=zkeysub-1;
keyblock[zkeysub + zkeybase]='\40';
}
if((zkeyval >= 32)||(zkeyval <= 126))
{
if(zkeysub < 80)
{
keyblock[zkeysub + zkeybase]=(char)zkeyval;
zkeysub=zkeysub+1;
if(zkeysub >= 80)zkeyres=1;
}
}
if(zkeyval == 10)zkeyres=1;
if(zkeyval == 13)zkeyres=1;
keyposxy[6]=zkeysub;
// keyposxy[6] is position and needs previous initialization
drawonepg(keyposxy,zkfon,keyblock);
return zkeyres;
}
void fullfpshow(char* fpwblock,int fpwposxy[],
double fpwfrom)
{
double ppwfrom,ppefrom,ppetiny;
int fpxa,fpew,fpmw,fpbase,fpsle,fpsptr;
int fpeval;
char* lpfpsptr;
fpxa=fpwposxy[8];
fpew=fpwposxy[9];
fpmw=fpwposxy[10];
fpbase=fpwposxy[11];
fpsle=fpxa+((fpwposxy[1]-1)*80);
fpsptr=0;
ppefrom = 1.0;
ppetiny=beldzeed(4);
ppwfrom = (double)fpbase;
while(fpsptr < fpew)
{
ppefrom = ppefrom * ppwfrom;
fpsptr = fpsptr + 1;
}
lpfpsptr=fpwblock+fpsle;
*lpfpsptr = '+';
lpfpsptr=fpwblock+fpsle+1;
*lpfpsptr = '\40';
ppwfrom=fpwfrom;
lpfpsptr=fpwblock+fpsle;
if(fpwfrom < 0.0)
{
ppwfrom = 0.0 - fpwfrom;
*lpfpsptr = '-';
}
fpsptr=fpsle+2;
lpfpsptr=fpwblock+fpsptr;
fpeval=powfpwrite(lpfpsptr,fpmw,fpbase,ppwfrom);
fpsptr=fpsle+fpmw+2;
*(fpwblock + fpsptr)='\40';
fpsptr=fpsle+fpmw+3;
*(fpwblock+fpsptr)='E';
fpsptr=fpsle+fpmw+4;
if(fpeval >= 0)
{
*(fpwblock+fpsptr)='+';
ppefrom = ppefrom + (double)fpeval;
}
if(fpeval < 0)
{
*(fpwblock+fpsptr)='-';
ppefrom = ppefrom - (double)fpeval;
}
fpsptr=fpsle+fpmw+5;
lpfpsptr=fpwblock+fpsptr;
ppefrom=ppefrom+ppetiny;
fpeval=powfpwrite(lpfpsptr,(fpew+1),fpbase,ppefrom);
fpsptr=fpsle+fpmw+5;
*(fpwblock + fpsptr)='\40';
fpsptr=fpsle+fpmw+6+fpew;
*(fpwblock+fpsptr)='\40';
}
void zack_fillrect(int xul,int yul,int zmowid,int zmohgt)
{
int beldxc,beldyc;
beldyc=0;
while(beldyc < zmohgt)
{
beldxc=0;
while(beldxc < zmowid)
{
vga_drawpixel((xul + beldxc),(yul + beldyc));
beldxc=beldxc+1;
}
beldyc=beldyc+1;
}
}
int zackmain(int skipzmi,char** unusedcp)
{
fillfl(df,ia);
zmctr=0;
zmtextbase=(ia[1]-1)*80;
zmlim=ia[1];
while(zmctr < zmlim)
{
lfscroll(ia,ch);
zmctr=zmctr+1;
}
vga_init();
zerotext=vga_getcurrentmode();
if(vga_hasmode(G640x480x16) != 0)
{
// depth = 2
vga_setmode(G640x480x16);
ia[3]=vga_getydim();
ia[3]=ia[3]-(ia[1]*9);
xlimit=vga_getxdim();
ylimit=ia[3]-1;
vga_setcolor(13);
zack_fillrect(0,0,xlimit,ylimit);
lfcopy(ia,ch,"Line drawing test written by Eric Matteson!");
lfscroll(ia,ch);
lfcopy(ia,ch,"needs four numbers startx starty endx endy!");
lfscroll(ia,ch);
lfcopy(ia,ch,"Maximum x value is!");
lfscroll(ia,ch);
lfcopy(ia,ch,"-!");
kellylt=(double)xlimit;
ia[8]=0;
fullfpshow(ch,ia,kellylt);
lfscroll(ia,ch);
// -----------------------------
lfcopy(ia,ch,"Maximum y value is!");
lfscroll(ia,ch);
lfcopy(ia,ch,"-!");
kellylt=(double)ylimit;
ia[8]=0;
fullfpshow(ch,ia,kellylt);
lfscroll(ia,ch);
// -----------------------------
lfcopy(ia,ch,"Miniumum values are zero!");
lfscroll(ia,ch);
lfcopy(ia,ch,"press enter after entering each integer. !");
lfscroll(ia,ch);
lfcopy(ia,ch,"Just one integer number at a time. !");
lfscroll(ia,ch);
// ----------------------------------------------------
lfcopy(ia,ch,"Enter value for startx !");
lfscroll(ia,ch);
drawonepg(ia,df,ch);
ia[6]=0;
lfcopy(ia,ch,"h!");
zmctr=0;
while(zmctr == 0)
{
zmctr = nzlfkeyline(ia,df,ch);
}
ia[12]=ldvread(ch,zmtextbase,4,10);
lfscroll(ia,ch);
// --------------------------------------------------LR
// ----------------------------------------------------
lfcopy(ia,ch,"Enter value for starty !");
lfscroll(ia,ch);
drawonepg(ia,df,ch);
ia[6]=0;
lfcopy(ia,ch,"h!");
zmctr=0;
while(zmctr == 0)
{
zmctr = nzlfkeyline(ia,df,ch);
}
ia[13]=ldvread(ch,zmtextbase,4,10);
lfscroll(ia,ch);
// --------------------------------------------------LR
// ----------------------------------------------------
lfcopy(ia,ch,"Enter value for endx !");
lfscroll(ia,ch);
drawonepg(ia,df,ch);
ia[6]=0;
lfcopy(ia,ch,"h!");
zmctr=0;
while(zmctr == 0)
{
zmctr = nzlfkeyline(ia,df,ch);
}
ia[14]=ldvread(ch,zmtextbase,4,10);
lfscroll(ia,ch);
// --------------------------------------------------LR
// ----------------------------------------------------
lfcopy(ia,ch,"Enter value for endy !");
lfscroll(ia,ch);
drawonepg(ia,df,ch);
ia[6]=0;
lfcopy(ia,ch,"h!");
zmctr=0;
while(zmctr == 0)
{
zmctr = nzlfkeyline(ia,df,ch);
}
ia[15]=ldvread(ch,zmtextbase,4,10);
lfscroll(ia,ch);
// --------------------------------------------------LR
if(ia[12] < 0)ia[12]=0;
if(ia[13] < 0)ia[13]=0;
if(ia[14] < 0)ia[14]=0;
if(ia[15] < 0)ia[15]=0;
zisline=0;
if(ia[12] > 1999)zisline=1;
if(ia[13] > 1999)zisline=1;
if(ia[14] > 1999)zisline=1;
if(ia[15] > 1999)zisline=1;
if(ia[12] > xlimit)ia[12]=xlimit;
if(ia[13] > ylimit)ia[13]=ylimit;
if(ia[14] > xlimit)ia[14]=xlimit;
if(ia[15] > ylimit)ia[15]=ylimit;
if(zisline == 0)
{
vga_setcolor(0);
// depth = 3
vga_drawline((ia[12]),(ia[13]),(ia[14]),(ia[15]));
lfcopy(ia,ch,"04 linemake.c of December 7,2006!");
lfscroll(ia,ch);
lfcopy(ia,ch,"printing coordinates of endpoints!");
lfscroll(ia,ch);
lfcopy(ia,ch,"Y!");
kellylt=(double)ia[12];
kellylt=kellylt + (1.0 / 10000.0);
ia[8]=0;
fullfpshow(ch,ia,kellylt);
kellylt=(double)ia[13];
kellylt=kellylt + (1.0 / 10000.0);
ia[8]=30;
fullfpshow(ch,ia,kellylt);
lfscroll(ia,ch);
lfcopy(ia,ch,"Y!");
kellylt=(double)ia[14];
kellylt=kellylt + (1.0 / 10000.0);
ia[8]=0;
fullfpshow(ch,ia,kellylt);
kellylt=(double)ia[15];
kellylt=kellylt + (1.0 / 10000.0);
ia[8]=30;
fullfpshow(ch,ia,kellylt);
lfscroll(ia,ch);
drawonepg(ia,df,ch);
// ------------------------
lfcopy(ia,ch,"Press enter to quit!");
lfscroll(ia,ch);
drawonepg(ia,df,ch);
ia[6]=0;
lfcopy(ia,ch,"-!");
zmctr=0;
while(zmctr == 0)
{
zmctr = nzlfkeyline(ia,df,ch);
}
vga_setmode(zerotext);
}
// depth = 2
if(zisline == 1)
{
lfscroll(ia,ch);
// depth = 3
lfcopy(ia,ch,"number is outrageously large. Entering key!");
lfscroll(ia,ch);
lfcopy(ia,ch,"testing mode. press enter to quit!");
lfscroll(ia,ch);
drawonepg(ia,df,ch);
zmctr=66;
zmlim=0;
while(zmctr != 10)
{
while(zmlim == 0)
{
zmlim=vga_getkey();
}
xlimit=0;
while(zmlim != 0)
{
zmctr=zmlim;
kellylt=(double)zmctr;
kellylt = kellylt + (1.0 / 10000.0);
ia[8]=xlimit;
xlimit=xlimit+20;
fullfpshow(ch,ia,kellylt);
zmlim=vga_getkey();
}
lfscroll(ia,ch);
drawonepg(ia,df,ch);
}
// -------
}
}
zmctr=0;
return zmctr;
}
// last line of linemake.c
/* After last line of linemake.c
--------------------------------