#include "defs.h" #include "comp.h" #include "cmd.h" #include "osbind.h" #define MAXCMD 100 /* # commands in line */ #define MAXCHR 800 /* # char/cmd in line */ #define tsp 119 /* flash pos Thin SPace */ #define nsp 120 /* flash pos eN SPace */ #define msp 121 /* flash pos eM SPace */ /* Externals */ extern char *realloc(); extern unsigned char ptsfpos[256], mcsdbl[303]; /* IFont Layout tables */ extern struct slvll *slv; /* local GO slave list */ extern int vpage_size; /* Vertical Page Size */ /* ATARI */ extern int ptsarray[]; /* Locals */ static char ker, ichfg, fhfg, rvofg; /* some local flags */ static char Kapp; /* Kerning apply flag */ static int splen; /* space length holder */ static unsigned spcnt, ispcnt, ccnt, cmdcnt; /* various counters */ static unsigned prepos; /* PREvious char POS. */ static unsigned ichcnt, ichwid, /* Insert CHar. vars */ ichpos[MAXCMD]; static unsigned rvopsiz, topval, botval, /* Reverse Video vars */ pvlsp, pvbot; static unsigned long cmdrec[MAXCMD]; /* tag CoMmanD RECord */ static struct { unsigned char acf; /* floating accent flag */ unsigned pos; /* position in chinln[] */ } chs; /* CHar. State struct. */ static struct { unsigned char fg; /* char flag from font */ unsigned char ch; /* its flash position */ int wid; /* its composed width */ } chinln[MAXCHR]; /* Char. IN LiNe array */ /* Globals */ char fofg; /* Flash Only flag */ char cpjm; /* line justified mode */ char advld, rldld; /* Accumulative leading */ unsigned disp; /* Xdisplacement from 0 */ unsigned char *utinpt; /* slave input pointer */ struct slvll *Bslv; /* Bend slave list ptr */ unsigned init_x; /* initial X from Atari */ unsigned long init_y; /* initial Y from Atari */ unsigned long last_y; /* Bend last Y known */ int TYF_handle; /* TYsetter file handle */ int TYF_Gx0, TYF_Gy0; /* Graphics file X0,Y0, */ int TYF_Gx1, TYF_Gy1; /* Graphics file X1,Y1, */ int TYF_Gtype; /* Graphics file type, */ char *TYF_Gfile; /* filename or cmd ptr */ /* Justification & Slave generation processor. Only called by dotext(). Returns pointer to next text if cpabt is 0 or 8 else -1L for all other true values of cpabt. Set cpabt: 0 -- no error 4 -- line measure too short 7 -- no memory for tag support 8 -- Hit Region Feed */ unsigned char *bend(text,done) struct textobj *text; int *done; { unsigned char *inptr, c, noerr; cpabt = 0; if (text->begtext >= free_start) { /* no text return... */ *done = 1; return(-1L); } else *done = 0; setslvlist(text); /* setup slave list */ if (cpabt == 7) /* memory error quit... */ return(-1L); initbcomp(); /* initialize Bend vars */ inptr = text->begtext; /* set text scan pter */ while (!cpabt && inptr < free_start) /* until end of buffer */ switch(c = *inptr++) { case ' ': /* space band */ Kapp = 0; cmpval = avcval = 0; /* no CComp... */ prepos = ccnt; chinln[ccnt].fg = 0; chinln[ccnt].ch = SPC; splen += (chinln[ccnt++].wid /* update space length */ = cwfrw(spbval,0)); /* by min space band... */ ++spcnt; /* update space counter */ break; case hrt: /* hard return */ case srt: /* soft return */ case Rf: /* Region Feed */ if (line_ck()) /* final check */ goto out; /* error quit.. */ inptr += 2; /* skip cr-lf */ if (c == Rf) /* Region Feed */ cpabt = 8; /* Stop now... */ else if (dpreset()) /* reach depth? */ goto out; break; case cr: /* carr. return */ ++inptr; /* skip over lf */ break; case DH: /* disc. hyphen */ case lf: /* line feed */ break; /* ignore them */ case QL: /* quad left */ Kapp = 0; cpjm = AL; break; case QR: /* quad right */ Kapp = 0; cpjm = AR; break; case QC: /* quad center */ Kapp = 0; cpjm = AC; break; case STAG: /* start TAG */ in_tag(*inptr++,0,1); cmpval = avcval = 0; /* no CComp... */ Kapp = 0; break; case ETAG: /* end TAG */ out_tag(*inptr++,0,1); cmpval = avcval = 0; /* no CComp... */ Kapp = 0; break; case PTAG: /* PI TAG */ storech(*inptr++); break; case sHY: case sDH: /* soft hyphens */ c = '-'; default: /* other chars */ bcwidth(c); break; } if (ccnt && !cpabt) /* if there are chars.. */ line_ck(); /* final check on line */ out: funct_comm(SLVEOB,0); /* place End Of Block */ noerr = (!cpabt || cpabt == 8); *done = (noerr && inptr >= free_start); if (noerr) { last_y = init_y + cdep; /* save last Y known */ Bslv->bufptr = realloc /* reallocate slave... */ (Bslv->bufptr,utinpt - Bslv->bufptr); } return(noerr ? inptr:(unsigned char *)-1L); } /* Routine to reset some composition parameters for new line */ Lreset() { disp = init_x; smsz = cp.ssiz; cpjm = cp.jstmd; ispcnt = spcnt = ichcnt = cmdcnt = ccnt = cct = 0; clen = splen = ichwid = 0; rvopsiz = 0; ichfg = fhfg = 0; chs.acf = 0; chs.pos = 0; Kapp = 0; cmpval = avcval = 0; } /* Routine to intialize all default composition parameters on entry to Bend()... */ initbcomp() { advld = rldld = 0; pvbot = pvlsp = 0; fofg = 0; spbval = cp.minsp + cp.prfsp; /* set space value... */ cdep = cp.lnsp; /* set start depth */ rvofg = cp.rvomd; Bslv = slv; utinpt = Bslv->bufptr; /* init slave pointer */ Lreset(); /* reset line vars... */ funct_comm(pt_typ,cp.ptsz); /* setup point, */ funct_comm(s_size,cp.ssiz); /* set size */ typeface(cp.font); /* place Font info... */ to_new_y(); /* place move FWD | REV */ } /* Routine to return current Char. Comp. value (Auto + Manual) */ chcomp() { int temp = 0; if (cp.mcomp) { temp += cmpval; if (!chs.acf) cmpval = cp.mcomp; } if (cp.acomp) { temp += avcval; if (!chs.acf) avcval = acmp; } return(temp); } /* Routine to advance Bend depth */ dpreset() { if ((cdep + cp.lnsp) >= cp.depth) /* break point reached */ return(1); else { ad_dp(); Lreset(); /* reset for next line */ return(0); } } /* Function to do final line check (space justification and slave generation) */ line_ck() { int erf = 0; if (chs.acf) { /* Faccent only at eol */ ++cct; /* count it... */ clen += chinln[chs.pos].wid; } if (cct || ichcnt) /* some chars in line */ erf = just_space(cp.llen-splen-clen); /* go justify */ else { /* or some cmds or none */ if (rvofg) /* check RVO to setup */ set_rev_par(); if (cmdcnt) /* if some cmds do them */ funct_call(0,0,0,0); if (rvofg) /* check RVO to close */ rev_video(OFF); } return(erf); } /* Function to justify extra space in line... */ just_space(ex_sp) int ex_sp; { int i, v, val, chct; int minlsp, maxlsp, cw; if (ichcnt) { /* IC cmd(s) ? */ if (ex_sp < 0) /* if no space */ for (i = 0;i < ichcnt;++i) /* find all ICs */ chinln[ichpos[i]-1].fg = 0; /* to disable.. */ else if (ex_sp <= ichwid) { /* enough space */ for (i = 0;i < ichcnt;++i) { /* for all ICs */ cw = chinln[ichpos[i]].wid; /* get IC width */ if (cw <= ex_sp) { /* space left ? */ ex_sp -= cw; /* (-) IC width */ ichpos[i] = 1; /* set min of 1 */ } else chinln[ichpos[i]-1].fg = 0; /* or disable.. */ } ichwid = 0; /* no IC width */ } } if (cpjm != AJ && /* Non Justify mode and */ ex_sp > 0 && !ispcnt && !ichcnt) { /* extra space found.. */ if (cpjm == AR) /* quad right */ disp += ex_sp; /* add to left */ else if (cpjm == AC) /* quad center */ disp += (ex_sp / 2); /* add 1/2 only */ } if (rvofg) /* check RVO to setup */ set_rev_par(); if (ex_sp < 0) { /* Negative space case */ if (!spcnt) /* no spaceband */ v = minlsp = 0; /* no (+) space */ else { v = cwfrw(cp.prfsp,1); /* get Prf diff */ minlsp = v * spcnt; /* to (+) space */ } if ((ex_sp + minlsp) >= 0) { /* Min|Prf range*/ ex_sp = ~ex_sp + 1; funct_call(-(ex_sp/spcnt),-(ex_sp%spcnt),0,0); } else if (cp.ltsmd && cp.nlts && cct > 1) { /* LTSpace on */ ex_sp += minlsp; /* (+) space... */ chct = cct - 1; minlsp = cwfrw(cp.nlts,1) * chct; /* get LTS diff */ if ((ex_sp + minlsp) >= 0) { /* -LTS range */ ex_sp = ~ex_sp + 1; funct_call(-v,0,-(ex_sp/chct),-(ex_sp%chct)); } else cpabt = 4; /* line overset */ } else cpabt = 4; /* line overset */ } else if ((!ispcnt && !ichcnt) || /* no ISpace or IChar */ ( ichcnt && !ichwid)) { /* or IC being counted */ if (cpjm == AJ && ex_sp && cct > 1) { /* Justify & extra Sp */ chct = cct - 1; if (cp.plts) { /* +LTS active */ val = cwfrw(cp.plts,1); /* get +LTS to */ minlsp = val * chct; /* spread extra */ } else val = minlsp = 0; /* no +LTS... */ if (spcnt) { /* Spacebands ? */ v = cwfrw(cp.maxsp,1); /* get MaxSp to */ maxlsp = v * spcnt; /* spread extra */ if ( !cp.ltsmd || /* LTSpace off */ ex_sp <= maxlsp ) /* extra fit Sp */ /* spread to Sp */ funct_call(ex_sp/spcnt,ex_sp%spcnt,0,0); else { /* +LTS range */ ex_sp -= maxlsp; /* take off Sp */ if (ex_sp <= minlsp) /* extra fit LTS*/ /* spread to Ch */ funct_call(v,0,ex_sp/chct,ex_sp%chct); else { /* extra > +LTS */ ex_sp -= minlsp; funct_call(v+(ex_sp/spcnt),ex_sp%spcnt,val,0); } } } else /* no space... */ if (cp.ltsmd) { /* LTSpace on */ if (ex_sp < ((val *= 3) * chct)) /* extra <+3LTS */ funct_call(0,0,ex_sp/chct,ex_sp%chct); else funct_call(0,0,val,0); /* spread +3LTS */ } else funct_call(0,0,0,0); /* just output */ } else funct_call(0,0,0,0); /* act as Non Justify */ } else if (ex_sp > 0) { /* Positive space case */ if (ichcnt) { /* there are IC(s)... */ cw = ex_sp / ichcnt; /* spread to IC */ val = ex_sp % ichcnt; /* extra remain */ ex_sp = 0; for (i = 0;i < ichcnt;++i) { if (val) v = 1, --val; /* use remain */ else v = 0; if ( chinln[ichpos[i]].ch == msp || /* IC EM Space */ chinln[ichpos[i]].ch == nsp || /* IC EN Space */ chinln[ichpos[i]].ch == tsp ) /* IC TH Space */ chinln[ichpos[i]].wid = cw + v; else { /* IC normal Ch */ if (chinln[ichpos[i]].wid) { /* valid width */ ex_sp += (chinln[ichpos[i]-1].wid = (cw+v)%chinln[ichpos[i]].wid); if (cw) /* set # of Ch */ ichpos[i]= (cw+v)/chinln[ichpos[i]].wid; } else { cpabt = 4; goto out; } /* what ? error */ } } } if (ex_sp) { if (ispcnt) /* spread to IS */ funct_call(ex_sp/ispcnt,ex_sp%ispcnt,0,0); else if (spcnt) /* spread to Sp */ funct_call(ex_sp/spcnt,ex_sp%spcnt,0,0); else funct_call(0,0,0,0); /* all other Ch */ } else funct_call(0,0,0,0); /* just output */ } else funct_call(0,0,0,0); /* just output slave... */ out: if (rvofg) /* check RVO to close */ rev_video(OFF); return(cpabt); } /* Slave generator and Extra space justificator sw : space width ex_spw : extra space remainder cw : LTS value on character ex_chw : extra LTS remainder */ funct_call(sw,ex_spw,cw,ex_chw) int sw, ex_spw, cw, ex_chw; { int i, j, k, l, v; i = k = l = 0; /* zero indexes */ while (i < ccnt && !cpabt) { /* scan chinln[] for... */ if (chinln[i].ch == IC) { /* Ins Char cmd */ if (chinln[i].fg) /* check valid */ switch(chinln[++i].ch) { /* check type */ case SPC: /* word space */ disp += (chinln[i].wid + sw); if (ex_spw) { /* space left.. */ --ex_spw; ++disp; } break; case msp: case nsp: case tsp: /* fixed spaces */ disp += chinln[i].wid; ++k; /* bump ICcount */ break; default: /* other chars */ if (chinln[i-1].wid && !ispcnt && !spcnt) { /* space left.. */ v = chinln[i-1].wid % 2; chinln[i-1].wid /= 2; disp += (chinln[i-1].wid + v); } for (j = 0;j < ichpos[k];++j) if (fhfg) /* no flash on */ disp += chinln[i].wid; /* skip width */ else long_char_for(chinln[i].ch,chinln[i].wid); if (chinln[i-1].wid && !ispcnt && !spcnt) disp += chinln[i-1].wid; /* space left.. */ ++k; /* bump ICcount */ break; } else ++i; /* else skip it */ } else if (chinln[i].ch == CMDCH) { /* Tag commands */ switch(chinln[i].wid) { case 1: /* point size */ funct_comm(pt_typ,(int)cmdrec[l]); break; case 2: /* set size */ funct_comm(s_size,(int)cmdrec[l]); break; case 3: /* Font */ typeface((int)cmdrec[l]); break; case 4: /* Adv leading */ funct_comm(ver_mov_for,(int)cmdrec[l]); break; case 5: /* Rev leading */ funct_comm(ver_mov_rev,(int)cmdrec[l]); break; case 6: /* Move Right */ disp += (unsigned)cmdrec[l]; break; case 7: /* Move Left */ disp -= (unsigned)cmdrec[l]; break; case 11: /* Rev. Video */ if (cmdrec[l]) { set_rev_par(); rvofg = ON; } else rev_video(rvofg = OFF); break; case 14: /* Flash Only */ fhfg = (char)cmdrec[l]; break; } ++l; /* next command */ } else if (chinln[i].ch == SPC) { /* word space */ if (!ispcnt || sw < 0 || ex_spw < 0) { if (ex_spw > 0) {--ex_spw; ++chinln[i].wid;} if (ex_spw < 0) {++ex_spw; --chinln[i].wid;} disp += (chinln[i].wid + sw); } else disp += chinln[i].wid; } else { /* other chars */ if (chinln[i].ch == msp || chinln[i].ch == nsp || chinln[i].ch == tsp) { /* fixed spaces */ if (!ispcnt) { if (ex_spw > 0) {--ex_spw; ++chinln[i].wid;} if (ex_spw < 0) {++ex_spw; --chinln[i].wid;} } disp += chinln[i].wid; } else { /* all others.. */ if (cw || ex_chw) { if (chinln[i].fg & 0x04) /* accent char */ chinln[i].wid += (cw / 2); else { /* normal char */ chinln[i].wid += cw; if (ex_chw > 0) {--ex_chw; ++chinln[i].wid;} if (ex_chw < 0) {++ex_chw; --chinln[i].wid;} } } if (fhfg) /* no flash on */ disp += chinln[i].wid; /* skip width */ else long_char_for(chinln[i].ch,chinln[i].wid); } } ++i; /* next in chinln[]... */ } /* end of scan loop... */ if (cp.rvomd && cct) pvlsp = (unsigned)cp.lnsp; else pvbot = pvlsp = 0; if (setp.omod == 2) { /* for CG 8200 only */ funct_comm(hor_mov_dir,1); funct_comm(hor_pos,0); funct_comm(hor_mov_dir,0); } } /* Routine to setup Typeface info */ typeface(ftn) int ftn; { if (ckfont(ftn)) { /* set font pointer */ loadrval(); /* load Rev Video vals */ funct_comm(ty_face,ftn,pftpt+2);/* place font # command */ } } /* Function to get flash position, store it then calculate its width. */ bcwidth(c) unsigned char c; { unsigned char fp; unsigned i; if (c == TSP) /* all fixed spaces... */ fp = tsp; else if (c == NSP) fp = nsp; else if (c == MSP) fp = msp; else fp = ptsfpos[c]; /* get flash position */ if (fp == 254) { /* if doublet case... */ for (i = 0; i < 303 && mcsdbl[i] != c; /* find it in table... */ i += 3); if (i >= 303) { /* no match error... */ chs.acf = 0; return; } if (!storech(mcsdbl[i+1])) /* do floating accent */ return; fp = mcsdbl[i+2]; /* then normal char. */ } storech(fp); } /* Routine to store flash position and calculate its width. */ storech(fp) unsigned char fp; { if (fp > msp || !width(fp)) return(chs.acf = 0); else return(1); } /* Routine to calculate Bend character width. */ width(fp) unsigned char fp; { int cw, aw, kerval; unsigned char rw, *p; p = pftpt + 49 + (unsigned)fp * 2; /* offset to get width */ if ((rw = *p) != 0xff) { cw = cwfrw(rw,0); if (chs.acf) { chs.acf = 0; cw -= chcomp(); if (cw < 0) cw = 0; kerval = bkerning(fp,1); if (kerval) subchwid(prepos,kerval); prepos = ccnt; aw = chinln[chs.pos].wid; if (cw < aw) cw = aw; /* Ch Width < Accent W */ clen += (cw - aw); chinln[ccnt ].ch = chinln[chs.pos].ch; chinln[chs.pos].ch = fp; /* swap accent to 2nd */ chinln[chs.pos].wid = (cw - aw) / 2; chinln[ccnt ].wid = cw - chinln[chs.pos].wid; Kapp = 1; ++cct; ++ccnt; } else { chinln[ccnt].fg = *(p + 1); chs.acf = chinln[ccnt].fg & 0x04; /* accent bit ? */ chs.pos = ccnt; cw -= chcomp(); if (cw < 0) cw = 0; kerval = bkerning(fp,0); if (fofg) { /* flash only.. */ chinln[ccnt].wid = 0; if (!chs.acf) fofg = 0; } else { if (!chs.acf) { if (kerval) { clen -= kerval; chinln[prepos].wid -= kerval; if (chinln[prepos].wid < 0) chinln[prepos].wid = 0; } } chinln[ccnt].wid = cw; if (!ichfg) { if (!chs.acf) { ++cct; prepos = ccnt; Kapp = 1; } clen += chinln[ccnt].wid; } else { ichwid += cw; if (!chs.acf) ichfg = 0; } } chinln[ccnt++].ch= fp; } if (cp.rvomd && cp.ptsz > rvopsiz) rvopsiz = cp.ptsz; return(1); } else return(0); } char bgetkerval(fp,mode) unsigned char fp; int mode; { unsigned char *ptr, v; char min = 127; unsigned i, found; if (!txkn) /* no sector kerning */ return(0); ptr = pftpt + 289 + ((unsigned)fp * 4); if (!Kapp) ker = 0; else if (!mode) ker ^= 1; for (i = 0;i < 4;++i,++ptr) { if (mode) { if (kern[ker].rval[i] > (v = *ptr & 0x0f)) kern[ker].rval[i] = v; if (kern[ker].lval[i] > (v = *ptr >> 4)) kern[ker].lval[i] = v; } else { kern[ker].rval[i] = *ptr & 0x0f; kern[ker].lval[i] = *ptr >> 4; } } if (Kapp) for (i = 0;i < 4;++i) { if (ker) { kern[0].rval[i] += kern[1].lval[i]; if (min > kern[0].rval[i]) min = kern[0].rval[i]; } else { kern[1].rval[i] += kern[0].lval[i]; if (min > kern[1].rval[i]) min = kern[1].rval[i]; } } else return(0); if (kpval) /* if kern pair exist */ for ( ptr = kpptr, i = found = 0; i < kpval && !found; ++i, ptr += 3 ) if (chinln[prepos].ch == *ptr && fp == *(ptr+1)) { found = 1; min += *(ptr+2); } return(min); } bkerning(fp,mode) unsigned char fp; int mode; { char kval; if (!cp.kernmd) return(0); kval = bgetkerval(fp,mode); if (kval) { if (kval < 0) { kval = ~kval + 1; return(0 - cwfrw(kval,0)); } else return(cwfrw(kval,0)); } else return(0); } subchwid(pos,val) int pos, val; { if (chinln[pos].fg & 0x04) { /* accent bit ? */ chinln[pos-1].wid -= (val / 2); chinln[pos ].wid -= (val - (val / 2)); } else chinln[pos].wid -= val; if (chinln[pos].wid < 0) chinln[pos].wid = 0; clen -= val; } loadrval() { union { unsigned char arr[6]; unsigned val[3]; } rvo; f_move(pftpt + 45,rvo.arr,6); topval = rvo.val[2] - rvo.val[0]; /* rvo top window value */ botval = rvo.val[1] - rvo.val[2]; /* rvo bot window value */ } ad_dp() { cdep += cp.lnsp; /* add LSpace */ funct_comm(ver_mov_for,(unsigned)cp.lnsp); /* move down */ } rev_video(mode) int mode; { funct_comm(hor_pos,disp); funct_comm(rev_typ,mode); } set_rev_par() { unsigned long temp1, temp2; if (rvopsiz) { temp1 = ((long)rvopsiz * (long)topval * 3L) / 2084L; temp2 = ((long)rvopsiz * (long)botval * 3L) / 2084L; if ((temp1 + (long)pvbot) <= (long)pvlsp) { temp1 = (long)pvlsp - (long)pvbot; temp2 = ((long)pvlsp / 2L) - (long)temp2; } funct_comm(rev_wind_top,(unsigned)temp1); funct_comm(rev_wind_bot,(unsigned)temp2); pvbot = (unsigned)temp2; } else { funct_comm(rev_wind_top,0); funct_comm(rev_wind_bot,0); } rev_video(ON); } static to_new_y() { unsigned long new_y; new_y = init_y + cp.lnsp; if (new_y > last_y) funct_comm(ver_mov_for, (unsigned)(new_y - last_y)); /* move forward */ else if (new_y < last_y) funct_comm(ver_mov_rev, (unsigned)(last_y - new_y)); /* move bckward */ } in_cmmd(funct,arg) int funct; unsigned long arg; { chinln[ccnt ].fg = 0; chinln[ccnt ].ch = CMDCH; /* store Tag command */ chinln[ccnt++].wid = funct; /* store functN type */ cmdrec[cmdcnt++] = arg; /* store Tag argument */ } IC_cmd(ch,fpmode) unsigned char ch, fpmode; { chinln[ccnt].fg = 1; chinln[ccnt].ch = IC; /* store IC command */ chinln[ccnt].wid = 0; /* no width for IC cmd */ if (!fpmode && ch == ' ') { ++ccnt; ++ispcnt; chinln[ccnt].ch = SPC; /* store SPC (space) */ chinln[ccnt++].wid = 0; /* no width for IC cmd */ } else { ichpos[ichcnt++] = ++ccnt; /* pos to be inserted */ cmpval = avcval = 0; /* no CComp for IChar */ ichfg = 1; /* set IC flag before */ if (fpmode) storech(ch); else bcwidth(ch); /* setting up ch width */ } } static BEfct0() { int i; i = setp.omod; i <<= 8; i += get_pgtype(); funct_comm(st_take,i); /* place Start of Take */ funct_comm(USRPGN,1); /* place Start Page # */ funct_comm(SLVEOB,0); /* place End Of Block */ last_y = 0L; } static BEfct1() { funct_comm(SLVEOD,0); /* place End Of Data */ } static BEfct2() { if (last_y > 0) /* move to top page */ funct_comm(ver_mov_rev,(unsigned)last_y); funct_comm(SLVEOB,0); /* place End Of Block */ last_y = 0L; } static BEfct3() { funct_comm(next_pg,0); /* use GOG next page */ funct_comm(SLVEOB,0); /* place End Of Block */ last_y = 0L; } static BEfct4() /* For graphics mode 5 */ { funct_comm(graphic,TYF_Gtype); /* insert VP command */ funct_comm(SLVEOB,0); /* place End Of Block */ } static BEfct5() /* For other gr. modes */ { int fbuff[5]; funct_comm(graphic,TYF_Gtype); /* insert VP command */ fbuff[0] = strlen(TYF_Gfile) + 11; /* place count */ fbuff[1] = TYF_Gx0; /* place x0 */ fbuff[2] = TYF_Gy0; /* place y0 */ fbuff[3] = TYF_Gx1 - TYF_Gx0 + 1; /* place Width */ fbuff[4] = TYF_Gy1 - TYF_Gy0 + 1; /* place Height */ movcmds(fbuff,10); movcmds(TYF_Gfile,fbuff[0] - 10); /* place filename */ funct_comm(SLVEOB,0); /* place End Of Block */ } static ins_slave(fct) int (*fct)(); { struct textobj temp; temp.slvlist = (struct slvll *)0; setslvlist(&temp); if (cpabt) return(0); Bslv = slv; utinpt = Bslv->bufptr; /* init slave pointer */ (*fct)(); /* do slave function */ if (cpabt) return(0); else return(writeslv(temp.slvlist)); } Start_TYF() { return(ins_slave(BEfct0)); } End_TYF() { return(ins_slave(BEfct1)); } topPge_TYF() { return(ins_slave(BEfct2)); } newPge_TYF() { return(ins_slave(BEfct3)); } insGR_TYF(op,count,glgrattr) int op, count; int glgrattr[]; { int fbuff[7]; if (TYF_Gtype == 5) { /* For graphics mode 5 */ if (!ins_slave(BEfct4)) /* insert VP command */ return(0); fbuff[0] = 36 + (4 * count); /* count + x0 + y0 + width + */ /* height + op + pts count + */ /* glgrattr + points */ fbuff[1] = TYF_Gx0; /* place x0 */ fbuff[2] = TYF_Gy0; /* place y0 */ fbuff[3] = TYF_Gx1 - TYF_Gx0 + 1; /* place Width */ fbuff[4] = TYF_Gy1 - TYF_Gy0 + 1; /* place Height */ fbuff[5] = op; /* place opcode */ fbuff[6] = count; Fwrite(TYF_handle,14L,fbuff); Fwrite(TYF_handle,22L,glgrattr); Fwrite(TYF_handle,(long)(4L*(long)count),ptsarray); return(1); } else return(ins_slave(BEfct5)); } writeslv(slvlist) struct slvll *slvlist; { struct slvll *slvptr = slvlist; int cnt, retc = 1; if (slvptr != (struct slvll *)0L) { for (;;) { cnt = countslaveB(slvptr->bufptr); if (cnt && write(TYF_handle,slvptr->bufptr,cnt) != cnt) { retc = 0; break; } if (slvptr->fptr == (struct slvll *)0L) break; else slvptr = slvptr->fptr; } freeslvlist(slvlist); } return(retc); } /* */ countslaveB(sptr) unsigned char *sptr; { unsigned char command, *eptr; unsigned code, brk, cmd_len, cnt; brk = cnt = 0; eptr = sptr + UTSIZE; do { code = get_argument(sptr); /* get encoded word */ if (!(code & 0xFF00)) /* check if NULL cmd */ cmd_len = 1; else cmd_len = 3; if ((code & 0x8080) == 0x8080) { command = *sptr & 0x7f; switch (command) { case (SLVEOD): /* end of data */ brk = 1; break; case (SLVEOB): /* end of block */ brk = 2; break; case (ty_face): /* font command */ cmd_len = 9; break; case (graphic): /* VP command */ if (*(sptr+2) < 5) cmd_len += get_argument(sptr+3); break; } } sptr += cmd_len; if (brk != 2) cnt += cmd_len; } while (!brk && sptr < eptr); return(cnt); }