diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /dviware/dvidjc |
Initial commit
Diffstat (limited to 'dviware/dvidjc')
-rw-r--r-- | dviware/dvidjc/Makefile | 23 | ||||
-rw-r--r-- | dviware/dvidjc/README.dvidjc | 18 | ||||
-rw-r--r-- | dviware/dvidjc/djgpp/Makefile.dos | 26 | ||||
-rw-r--r-- | dviware/dvidjc/djgpp/dvidjc.c | 995 | ||||
-rw-r--r-- | dviware/dvidjc/dvidjc.c | 994 | ||||
-rw-r--r-- | dviware/dvidjc/example/coldoc.bat | 20 | ||||
-rw-r--r-- | dviware/dvidjc/example/coldoc.tex | 451 | ||||
-rw-r--r-- | dviware/dvidjc/example/colordjc.sty | 129 | ||||
-rw-r--r-- | dviware/dvidjc/example/colordjc.tex | 129 | ||||
-rw-r--r-- | dviware/dvidjc/example/fractal.gif | bin | 0 -> 42601 bytes | |||
-rw-r--r-- | dviware/dvidjc/example/gencoldoc | 18 | ||||
-rw-r--r-- | dviware/dvidjc/example/kreis.gif | bin | 0 -> 2114 bytes | |||
-rw-r--r-- | dviware/dvidjc/example/parskip.sty | 34 | ||||
-rw-r--r-- | dviware/dvidjc/example/texlion.gif | bin | 0 -> 22279 bytes | |||
-rw-r--r-- | dviware/dvidjc/example/vgaca.gif | bin | 0 -> 10673 bytes | |||
-rw-r--r-- | dviware/dvidjc/example/vgacb.gif | bin | 0 -> 13817 bytes | |||
-rw-r--r-- | dviware/dvidjc/turbo-c/dvidjc.c | 995 | ||||
-rw-r--r-- | dviware/dvidjc/turbo-c/dvivgac.c | 1231 | ||||
-rw-r--r-- | dviware/dvidjc/turbo-c/maketcc.bat | 3 | ||||
-rw-r--r-- | dviware/dvidjc/turbo-c/makevga.bat | 2 |
20 files changed, 5068 insertions, 0 deletions
diff --git a/dviware/dvidjc/Makefile b/dviware/dvidjc/Makefile new file mode 100644 index 0000000000..b344ca95d0 --- /dev/null +++ b/dviware/dvidjc/Makefile @@ -0,0 +1,23 @@ +# Compiling everything: + +CC=gcc -O2 -traditional -DBSD -DHAS_STDLIB # Linux + +#CC=gcc -O -DBSD=1 -DHAS_STDLIB # HP-UX + +all: dvi550c dvi500c dvi500 + +dvi550c: dvidjc.c + $(CC) -DDJ550C dvidjc.c -lm -o $@ + strip dvi550c + +dvi500c: dvidjc.c + $(CC) -DDJ500C dvidjc.c -lm -o $@ + strip dvi500c + +dvi500: dvidjc.c + $(CC) dvidjc.c -lm -o $@ + strip dvi500 + +clean: + rm -f *.o dvi550c dvi500c dvi500 + diff --git a/dviware/dvidjc/README.dvidjc b/dviware/dvidjc/README.dvidjc new file mode 100644 index 0000000000..bd0ea9ef58 --- /dev/null +++ b/dviware/dvidjc/README.dvidjc @@ -0,0 +1,18 @@ +Die Treiber des DVIDJC-Paketes The driver programs of the DVIDJC- +unterst"utzen die HP-DeskJet-Drucker package support the HP-DeskJet- +500, 500C und 550C. Im Verzeichnis printers 500, 500C and 550C. The +djgpp sind die ausf"uhrbaren subdir djgpp contains the execut- +Programme enthalten, allerdings ables, but without a probably +ohne eine eventuell notwendige EMU387. necessary EMU387. + +Das Verzeichnis turbo-c enth"alt The subdir turbo-c contains programs +Programme, die mit TCC compiliert und compiled and linked with TCC. +gebunden wurden. + +In example befindet sich die Doku zur The subdir example contains the +Benutzung des Treibers. german doc. + Any volunteers for translation? + + +Wolfgang R. M"uller Heinrich-Heine-Universit"at D"usseldorf Friedhelm Sowa +Universit"atsrechenzentrum Computing Centre
\ No newline at end of file diff --git a/dviware/dvidjc/djgpp/Makefile.dos b/dviware/dvidjc/djgpp/Makefile.dos new file mode 100644 index 0000000000..a5b344f006 --- /dev/null +++ b/dviware/dvidjc/djgpp/Makefile.dos @@ -0,0 +1,26 @@ +all: dvi500.exe dvi500c.exe dvi550c.exe
+
+dvi500.exe : dvidjc.c
+ gcc -DDJ500 -O2 dvidjc.c -lm -lpc -o dvi500
+ strip dvi500
+ coff2exe dvi500
+ del dvi500
+
+dvi500c.exe : dvidjc.c
+ gcc -DDJ500C -O2 dvidjc.c -lm -lpc -o dvi500c
+ strip dvi500c
+ coff2exe dvi500c
+ del dvi500c
+
+dvi550c.exe : dvidjc.c
+ gcc -DDJ550C -O2 dvidjc.c -lm -lpc -o dvi550c
+ strip dvi550c
+ coff2exe dvi550c
+ del dvi550c
+
+clean:
+ del *.o
+ del dvi500
+ del dvi500c
+ del dvi550c
+
diff --git a/dviware/dvidjc/djgpp/dvidjc.c b/dviware/dvidjc/djgpp/dvidjc.c new file mode 100644 index 0000000000..e0a6f62a5f --- /dev/null +++ b/dviware/dvidjc/djgpp/dvidjc.c @@ -0,0 +1,995 @@ +/* (C)opyright 1994 Wolfgang R. Mueller, Computing Centre,
+Heinrich-Heine-University Duesseldorf, Germany,
+wolfgang@uni-duesseldorf.de, +49-211-311-3905.
+This program may be used without any warranty under
+the terms of the GNU general public licence. */
+/* translated from the original TurboPascal source
+partly with p2c, the Pascal-to-C translator */
+
+#undef DJCOLOUR
+#ifdef DJ550C
+ #define DJCOLOUR
+#endif
+#ifdef DJ500C
+ #define DJCOLOUR
+#endif
+
+#define DINA4
+#include <stdio.h>
+
+#ifdef __MSDOS__
+ #ifdef __TURBOC__
+ #include <dos.h>
+ #else
+ #include <pc.h>
+ #endif
+#endif
+
+#ifdef __TURBOC__
+ #include <mem.h>
+ #include <alloc.h>
+ #define malloc farmalloc
+ #define calloc farcalloc
+ #define realloc farrealloc
+ #define free farfree
+#endif
+
+#define uchar unsigned char
+#define ushort unsigned short
+#define ulong unsigned long
+#define ptr void *
+
+#define xmb 294 /* 8.5 inch X 300 dpi / 8 dot per byte*/
+#ifdef __TURBOC__
+#define ymax 47 /* +1=multiple of 8 */
+#else
+#define ymax 839 /* +1=multiple of 8 */
+#endif
+#define linl 299 /* =xmb+2+(xmb+128)div 128 */
+#define maxink 16
+#define smax 100
+
+#ifdef __MSDOS__
+static char tfmprefix[] = "c:\\tex\\fonts\\tfm\\";
+static char fontprefix[] = "c:\\tex\\fonts\\canon\\";
+#else
+static char tfmprefix[] = "/usr/TeX/lib/tex/fonts/";
+static char fontprefix[] = "/usr/TeX/lib/tex/fonts/";
+#endif
+
+typedef struct colpix { uchar cpix, mpix, ypix, kpix; } colpix;
+typedef struct greydesc { uchar maskc, maskm, masky, maskk; } greydesc;
+
+static uchar maskmat[5][4][4] = {
+ { {17,2,5,17},{17,17,8,17},{17,17,17,11},{17,17,14,17} },
+ { {1,17,17,3},{5,17,17,6},{8,10,12,17},{14,16,17,17} },
+ { {17,17,17,17},{17,4,17,17},{17,17,17,17},{17,17,17,12} },
+ { {14,4,16,2},{7,9,5,11},{15,1,13,3},{6,12,8,10} },
+ { {0x88,0x44,0x22,0x11},{0,0,0,0},{0,0,0,0},{0,0,0,0} } };
+
+static FILE *prot=stderr;
+static uchar stackcy[smax], stackma[smax], stackye[smax], stackbl[smax];
+static char STR[99], FOPRE[99], FOMAG[16], FONAM[99], FOLOC[99], FOFUL[99];
+static char prfnam[99] = "prn";
+static char defnam[73];
+static colpix *pxlmem[ymax + 1];
+static greydesc greymask[8];
+static uchar maskb[maxink + 1][4][4];
+
+static uchar zoll, zoll0, vsk1, vsk2, hsk3, prfilout, clearing, prinit = 0;
+static long zoelli;
+static short zilli, lz, colst, xres, yres, xmax;
+static short vskop, hsk1, hsk2, lzd, vchd, prbs, prbe;
+static FILE *prfile;
+static uchar prbuf[2048];
+
+static void Tptr(void *p) { if(p==NULL) {
+ fprintf(prot, " - not enough memory :-( "); exit(1);
+} }
+static void prfeval() {
+ if (!strcmp(".dvi", defnam+strlen(defnam)-4)) defnam[strlen(defnam)-4]=0;
+ if (*prfnam == '\0') sprintf(prfnam, "%s.pcl", defnam);
+ prfilout = (strcmp(prfnam, "prn") != 0);
+ xres = 300; yres = 300; xmax = xmb * 8 + 7;
+ zoll0 = (yres * 12 + ymax) / (ymax + 1);
+ if (prfilout) fprintf(prot, "writing to file %s\n", prfnam);
+}
+static void propen() { if (prinit) return; prinit = 1;
+ prbs=0; prbe=0; if(prfilout) prfile = fopen(prfnam, "w+b");
+}
+static void prflush() { if(prbs>=prbe) return;
+ if(prfilout) fwrite(&prbuf[prbs], prbe - prbs, 1, prfile);
+ if(prbe==2048) prbe=0; prbs=prbe;
+}
+static void put(x) uchar x; {
+ if (prfilout) {
+ if (prbe == 2048) prflush();
+ prbuf[prbe] = x; prbe++;
+ } else
+#ifdef __MSDOS__
+ outportb(0x378,x);
+ while((inportb(0x379)&0x80)==0);
+ outportb(0x37a,13);
+ inportb(0x379);
+ outportb(0x37a,12);
+#else
+ putc(x,stdout);
+#endif
+}
+static void esc(s) char *s; { short i, l;
+ put(0x1b); l = strlen(s);
+ for (i = 0; i < l; i++) put(s[i]);
+}
+static void prclos() {
+ if (!prinit) return;
+ prflush(); prinit = 0;
+ if (prfilout) fclose(prfile);
+}
+static void hardform() { esc("*rbC"); put(0xc); esc("E");
+}
+static void putint(i) short i; {
+ if (i >= 10) putint(i / 10);
+ put(i % 10 + '0');
+}
+static void putbits(c, pbuf) char c; uchar pbuf[linl+1]; {
+ uchar qbuf[linl+1]; short i, j, k, l, m, n; uchar b, ba;
+ n = xmb; while (pbuf[n] == 0 && n >= 0) n--;
+ if (n < 0) m = 0; else {
+ b = pbuf[0]; j = 1; k = 2; l = 2; qbuf[k] = b;
+ for (i = 1; i <= n; i++) { ba = b; b = pbuf[i];
+ if (ba == b) {
+ if (l == k) {
+ if (k == j + 1) k--; else {
+ l++; qbuf[l] = b;
+ if (l - j >= 128) { qbuf[j] = k - j - 2; j = k; }
+ } } else { l++;
+ if (j < k) { qbuf[j] = k - j - 2; j = k; }
+ if (l - j >= 128) {
+ qbuf[j] = 129; j = k + 2; k = j + 1; l = k; qbuf[k] = b;
+ } } } else {
+ if (l == k) { k++;
+ if (k - j > 128) { qbuf[j] = k - j - 2; j = k; k++; }
+ qbuf[k] = b; l = k;
+ } else if (j == k) { qbuf[j] = k - l + 256;
+ j += 2; k = j + 1; l = k; qbuf[k] = b;
+ } else { l++; k = l; qbuf[k] = b;
+ } } }
+ if (l == k) { qbuf[j] = l - j - 1; m = l;
+ } else if (j == k) { qbuf[j] = k - l + 256; m = j + 1;
+ } else { qbuf[j] = l - j - 1; m = l;
+ } }
+ esc("*b"); putint(m); put(c);
+ for (i = 1; i <= m; i++) put(qbuf[i]);
+}
+static short skipper;
+static void hardcopy() { uchar pbuf[linl+1];
+ short x, y; uchar b,nothing; colpix *WITH;
+ propen();
+ if (zilli == 0) {
+ esc("E");
+#ifdef DINA4
+ esc("&l26A");
+#endif
+ esc("&a1N"); esc("*r2360S"); esc("*t300R");
+#ifdef DJ550C
+ esc("*r-4U");
+#endif
+#ifdef DJ500C
+ esc("*r-3U");
+#endif
+ esc("*p0x0Y"); esc("*r0A"); esc("*b2M"); skipper=0;
+ }
+ for (y = 0; y <= ymax; y++) { nothing=1;
+ for (x = 0; x <= xmb; x++) { WITH = &pxlmem[y][x];
+#ifdef DJCOLOUR
+ b = WITH->kpix | (WITH->cpix & WITH->mpix & WITH->ypix);
+#else
+ b = WITH->kpix | (WITH->cpix | WITH->mpix | WITH->ypix);
+#endif
+ WITH->kpix = b;
+#ifdef DJ550C
+ b = ~b; WITH->cpix &= b; WITH->mpix &= b; WITH->ypix &= b;
+#endif
+#ifdef DJ500C
+ WITH->kpix = WITH->cpix | b; WITH->mpix |= b; WITH->ypix |= b;
+#endif
+ if(WITH->kpix|WITH->cpix|WITH->mpix|WITH->ypix) nothing=0;
+ }
+ if(nothing) skipper++; else {
+ if(skipper>0) { esc("*b"); putint(skipper); put('Y'); skipper=0; }
+ for (x = 0; x <= xmb; x++) pbuf[x] = pxlmem[y][x].kpix;
+#ifdef DJ550C
+ putbits('V', pbuf);
+ for (x = 0; x <= xmb; x++) pbuf[x] = pxlmem[y][x].cpix;
+#endif
+#ifdef DJCOLOUR
+ putbits('V', pbuf);
+ for (x = 0; x <= xmb; x++) pbuf[x] = pxlmem[y][x].mpix;
+ putbits('V', pbuf);
+ for (x = 0; x <= xmb; x++) pbuf[x] = pxlmem[y][x].ypix;
+#endif
+ putbits('W', pbuf);
+} } prflush(); }
+static void pixet(y, x, b) ushort y, x; uchar b; {
+ colpix *WITH; greydesc *WITH1;
+ WITH = &pxlmem[y][x]; WITH1 = &greymask[y & 7];
+ if (clearing) { WITH->cpix &= ~b; WITH->mpix &= ~b;
+ WITH->ypix &= ~b; WITH->kpix &= ~b; return;
+ }
+ WITH->cpix |= b & WITH1->maskc; WITH->mpix |= b & WITH1->maskm;
+ WITH->ypix |= b & WITH1->masky; WITH->kpix |= b & WITH1->maskk;
+}
+static void setrect(xl, yl, xh, yh) ushort xl, yl, xh, yh; {
+ ushort x, y, xll, xrr; uchar a, b, c;
+ xll = xl >> 3; xrr = xh >> 3;
+ a = (0xff >> (xl & 7)) & 255; c = 0xff << (7 - (xh & 7));
+ for (y = yl; y <= yh; y++) { b = a;
+ for (x = xll; x <= xrr; x++) {
+ if (x == xrr) b &= c;
+ pixet(y, x, b); b = 0xff;
+} } }
+/*static long prodovz(a, b) ushort a, b; { return ((long)a * (long)b); }
+static long scaled(w, z) long w, z; { long s;
+ union { long l; struct { ushort n, h; } U1; } a, b;
+ a.l = w; b.l = z;
+ s = (((((ulong)prodovz(a.U1.n, b.U1.n)) >> 16) + prodovz(a.U1.n,
+ b.U1.h) + prodovz(a.U1.h, b.U1.n)) >> 4) +
+ (prodovz(a.U1.h, b.U1.h) << 12);
+ if (w < 0) s -= z << 12; return s;
+} */
+static long scaled(w, z) long w, z; { long s; ulong t=w, u=z;
+ /* should return w * z / 2**20 */
+ s = ( ( (((t & 65535L) * (u & 65535L)) >> 16)
+ + (t & 65535L) * (u >> 16)
+ + (t >> 16) * (u & 65535L) ) >> 4)
+ + ( ( (t >> 16) * (u >> 16) ) << 12);
+ if (w < 0) s -= z << 12; return s;
+}
+static char dviname[73];
+static FILE *dvifile;
+static long dvimag;
+static uchar dvibuf[2048];
+static ushort dvibufp, dvibufe;
+
+static void baddvi(s) char *s; {
+ fprintf(prot, "bad dvi: %s\n", s); exit(1);
+}
+static void dvibytes(s, l) char *s; uchar l; { ushort ll;
+ s[l] = '\0'; ll = dvibufe - dvibufp;
+ if (ll >= l) {
+ memmove((ptr)s, (ptr)(&dvibuf[dvibufp]), (long)l);
+ dvibufp += l; return;
+ }
+ if (ll > 0) memmove((ptr)s, (ptr)(&dvibuf[dvibufp]), (long)ll);
+ dvibufe = fread(dvibuf, 1, 2048, dvifile);
+ if (dvibufe + ll < l) baddvi("ends prematurely !");
+ memmove((ptr)(&s[ll]), (ptr)dvibuf, (long)(l - ll));
+ dvibufp = l - ll;
+}
+static uchar dvibyte() { uchar b;
+ if (dvibufp >= dvibufe) { dvibufp = 0;
+ dvibufe = fread(dvibuf, 1, 2048, dvifile);
+ }
+ if (dvibufp >= dvibufe) baddvi("ends prematurely !");
+ b = dvibuf[dvibufp]; dvibufp++; return b;
+}
+static void dviskip(l) long l; { uchar b;
+ while (l > 0) {
+ l += (long)dvibufp - (long)dvibufe;
+ if (l <= 0) dvibufp = dvibufe + l;
+ else { dvibufp = dvibufe; l--; dvibyte(); }
+} }
+static long dvinum(b) uchar b; { uchar i; long n;
+ n = 0;
+ if (dvibufp + b > dvibufe) {
+ for (i = 1; i <= b; i++) n = (n << 8) | dvibyte(); return n;
+ }
+ for (i = 0; i < b; i++) n = (n << 8) | dvibuf[dvibufp + i];
+ dvibufp += b; return n;
+}
+static long dviint(b) uchar b; { uchar i; long n;
+ if (dvibufp + b <= dvibufe) {
+ n = dvibuf[dvibufp];
+ if (n > 127) n -= 256;
+ for (i = 1; i < b; i++) n = (n << 8) | dvibuf[dvibufp + i];
+ dvibufp += b; return n;
+ }
+ n = dvibyte();
+ if (n > 127) n -= 256;
+ for (i = 2; i <= b; i++) n = (n << 8) | dvibyte(); return n;
+}
+static void dviposit(l) long l; { fseek(dvifile, l, 0);
+ dvibufe = fread(dvibuf, 1, 2048, dvifile); dvibufp = 0;
+}
+static void dviopen() { long l; uchar j, em; ushort k;
+ sprintf(STR, "%s.dvi", dviname);
+ if ((dvifile = fopen(STR, "rb"))==0) { strcpy(STR, dviname);
+ if ((dvifile = fopen(STR, "rb"))==0) baddvi("not existing !");
+ }
+ dvibufe = fread(dvibuf, 1, 2, dvifile);
+ if (dvibufe < 2) baddvi("empty !");
+ em = dvibuf[1];
+ if (dvibuf[0] != 247) baddvi("no valid preamble");
+ /* now position to postamble */
+ fseek(dvifile, 0L, 2); l=ftell(dvifile); if(l>2048) l=2048;
+ fseek(dvifile, -l, 2); k = fread(dvibuf, 1, 2048, dvifile);
+ do { k--; } while (k >= 4 && dvibuf[k] != em);
+ if (k < 4) baddvi("no postamble in last 2048 bytes !");
+ dvibufe = k + 1; dvibufp = k - 4; l = dvinum(4);
+ fseek(dvifile, l, 0); dvibufe = fread(dvibuf, 1, 2048, dvifile);
+ dvibufp = 0; dvibyte();
+}
+
+typedef union chdesc { uchar b8[16];
+ struct { short wid, hei, hof, vof; long bmp, tfw; } U1;
+ struct { long tfh, tfd, dum1, dum2; } U2;
+} chdesc;
+typedef struct fontdesc {
+ long dfn; char *fonam; chdesc *chv;
+ long danf; uchar *chm; short mch, fty;
+} fontdesc;
+static fontdesc **fontvect;
+static uchar fontint;
+static FILE *fofil;
+static uchar *achm;
+static uchar fofbyte() { uchar b;
+ if (fread(&b, 1, 1, fofil) <= 0) b = 0; return b;
+}
+static long fofint(b) uchar b; { uchar i; long n;
+ n = fofbyte(); if (n > 127) n -= 256;
+ for (i = 2; i <= b; i++) n = (n << 8) | fofbyte();
+ return n;
+}
+
+static long hs[smax], vs[smax], ws[smax], xs[smax], ys[smax], zs[smax];
+static long cnt[10];
+static uchar bitrev[256];
+static char comment[256];
+static double conv, vconv;
+static long l, landx, landy, newmag;
+static long a, b, c, f, q, h, v, hoff, voff, w, x, y, z;
+static long chk, scf, dsz, fofchk, num, den, mag, spl, lpp, mxh, mxv;
+static int pagnum, pag1, paganz, i, k;
+static ushort s, mst, mpn;
+static char dviori;
+static uchar o, j, post, fini, started, below;
+
+static void initbitrev() { uchar b, i, j, k, m, n;
+ for (m = 0; m <= 3; m++) { n=m;
+#ifdef DJCOLOUR
+ n=3;
+#endif
+ for (i = 0; i <= maxink; i++) {
+ for (j = 0; j <= 3; j++) { b = 0;
+ for (k = 0; k <= 3; k++) {
+ if (maskmat[n][j][k] <= i) b |= maskmat[4][0][k];
+ } maskb[i][m][j] = b; } } }
+ bitrev[0] = 0; m = 0x80; n = 1;
+ while (m) { /* put bits into reverse order within a byte */
+ for (j = 0; j < n; j++) bitrev[j + n] = bitrev[j] | m;
+ n += n; m >>= 1;
+} }
+
+static void tfmdef() { short ll, lh, bc, ec, nw, nh, nd, i;
+ uchar b1, b2, b3; short FORLIM;
+ fontdesc *WITH = fontvect[fontint];
+ sprintf(STR, "%s%s.tfm", tfmprefix, FONAM);
+ fprintf(prot, "trying %s instead", STR);
+ fofil = fopen(STR, "rb");
+ if (fofil==0) { fprintf(prot, " - absent as well :-(\n"); return; }
+ ll = fofint(2); lh = fofint(2); bc = fofint(2); ec = fofint(2);
+ nw = fofint(2); nh = fofint(2); nd = fofint(2); fseek(fofil, 0L, 2);
+ if (ll * 4 > ftell(fofil) || ll < lh + ec - bc + nw + nh + nd + 7) {
+ fprintf(prot, " - not a TFMfile !\n"); fclose(fofil); return;
+ }
+ WITH->mch = ec;
+ Tptr( WITH->chv = (chdesc *)calloc(WITH->mch + 1, sizeof(chdesc)) );
+ fseek(fofil, 24L, 0); fofchk = fofint(4);
+ if (chk != 0) if (fofchk != 0) if (chk != fofchk)
+ fprintf(prot, " *+* wrong checksum *+* ");
+ fseek(fofil, (lh + ec - bc + 7L) * 4, 0);
+ FORLIM = nw + nh + nd;
+ for (i = 0; i < FORLIM; i++)
+ WITH->chv[i].U2.dum1 = scaled(fofint(4), scf);
+ fseek(fofil, lh * 4L + 24, 0);
+ for (i = bc; i <= ec; i++) {
+ b1 = fofbyte(); b2 = fofbyte(); fofbyte(); fofbyte();
+ WITH->chv[i].U1.tfw = WITH->chv[b1].U2.dum1;
+ WITH->chv[i].U2.tfh = WITH->chv[nw + (b2 >> 4)].U2.dum1;
+ WITH->chv[i].U2.tfd = WITH->chv[nw + nh + (b2 & 15)].U2.dum1;
+ }
+ fclose(fofil); WITH->fty = 1; fprintf(prot, " - TFMfile OK\n");
+}
+static void tfmchar() { short hr, vr, br, ar; uchar li, re, ob, un;
+ chdesc *WITH = &fontvect[fontint]->chv[c];
+ switch (dviori) {
+ case 0:
+ hr = (long)(conv * h + 0.5);
+ vr = (long)(vconv * (v - WITH->U2.tfh) + 0.5);
+ br = (long)(conv * (h + WITH->U1.tfw) + 0.5);
+ ar = (long)(vconv * (v + WITH->U2.tfd) + 0.5);
+ break;
+ case 1:
+ hr = (long)(conv * (landx + v - WITH->U2.tfh) + 0.5);
+ vr = (long)(vconv * (landy - h - WITH->U1.tfw) + 0.5);
+ br = (long)(conv * (landx + v + WITH->U2.tfd) + 0.5);
+ ar = (long)(vconv * (landy - h) + 0.5);
+ break;
+ case 3:
+ hr = (long)(conv * (landx - v - WITH->U2.tfd) + 0.5);
+ vr = (long)(vconv * (landy + h) + 0.5);
+ br = (long)(conv * (landx - v + WITH->U2.tfh) + 0.5);
+ ar = (long)(vconv * (landy + h + WITH->U1.tfw) + 0.5);
+ break;
+ case 2:
+ hr = (long)(conv * (landx - h - WITH->U1.tfw) + 0.5);
+ vr = (long)(vconv * (landy - v - WITH->U2.tfd) + 0.5);
+ br = (long)(conv * (landx - h) + 0.5);
+ ar = (long)(vconv * (landy - v + WITH->U2.tfh) + 0.5);
+ break;
+ }
+ li = 1; re = 1; ob = 1; un = 1;
+ if (hr < 0) { hr = 0; li = 0; }
+ if (br > xmax) { br = xmax; re = 0; }
+ vr -= zilli; ar -= zilli;
+ if (vr < 0) { vr = 0; ob = 0; }
+ if (ar > ymax) { ar = ymax; un = 0; below = 1; }
+ if (hr > br) return;
+ if (vr > ar) return;
+ if (ob) setrect(hr, vr, br, vr);
+ if (li) setrect(hr, vr, hr, ar);
+ if (un) setrect(hr, ar, br, ar);
+ if (re) setrect(br, vr, br, ar);
+}
+
+static ushort pkpos;
+static uchar pkn1() { uchar Result;
+ Result = achm[pkpos]; pkpos++; return Result;
+}
+static short pki1() { short b;
+ b = pkn1(); if (b > 127) b -= 256; return b;
+}
+static short pkn2() { short b;
+ b = pkn1(); return (b * 256 + pkn1());
+}
+static short pki2() { short b;
+ b = pkn1(); if (b > 127) b -= 256;
+ return (b * 256 + pkn1());
+}
+static long pkn3() { long b; short c;
+ b = pkn1(); c = pkn1();
+ return ((b * 256 + c) * 256 + pkn1());
+}
+static long pki3() { long b;
+ b = pki1(); return (b * 65536L + pkn2());
+}
+static long pki4() { long b;
+ b = pki2(); return (b * 65536L + pkn2());
+}
+static void pkdef() { long a, l; ushort d; uchar b, bb;
+ uchar terminate; short i, j, c; fontdesc *WITH; chdesc *WITH1;
+ WITH = fontvect[fontint]; sprintf(STR, "%spk", FOFUL);
+ fprintf(prot,"preparing font %ld: %s", f, STR);
+ if( (fofil = fopen(STR, "rb"))==0) {
+ fprintf(prot," not found :-(\n");
+ sprintf(STR, "%spk", FOLOC);
+ fprintf(prot,"preparing font %ld: %s", f, STR);
+ fofil = fopen(STR, "rb");
+ }
+ if (fofil==0) { WITH->mch = -1;
+ fprintf(prot, " - file not found !\n"); return;
+ }
+ if ((fgetc(fofil)!=0xf7)||(fgetc(fofil)!=0x59)){ WITH->mch = -1;
+ fprintf(prot, " - not a PKfile !\n"); fclose(fofil); return;
+ } else {
+ fseek(fofil, 0L, 2); WITH->danf = ftell(fofil);
+ if (WITH->danf > 65520L) { WITH->mch = -1; fclose(fofil);
+ fprintf(prot, " - too big for this driver\n"); return;
+ } else {
+ Tptr( WITH->chv = (chdesc *)calloc(256, sizeof(chdesc)) );
+ Tptr( achm = (uchar *)malloc(WITH->danf) );
+ fseek(fofil, 0L, 0); fread(achm, WITH->danf, 1, fofil);
+ fclose(fofil); WITH->mch = -1; pkpos = 0; terminate = 0;
+ do { b = pkn1();
+ if (b >= 240) {
+ switch (b) {
+ case 240: case 241: case 242: case 243: l = 0;
+ for (i = 240; i <= b; i++) l = (l << 8) + pkn1();
+ pkpos += l; break;
+ case 244: pkpos += 4; break;
+ case 245: terminate = 1; break;
+ case 246: break;
+ case 247: b = pkn1(); i = pkn1();
+ pkpos += i + 4; fofchk = pki4();
+ if (chk != 0) if (fofchk != 0) if (chk != fofchk)
+ fprintf(prot, " *+* wrong checksum *+* ");
+ pkpos += 8; break;
+ case 248: case 249: case 250: case 251:
+ case 252: case 253: case 254: case 255: break;
+ }
+ } else { d = pkpos - 1; bb = b & 7;
+ switch (bb) {
+ case 0: case 1: case 2: case 3:
+ l = bb * 256 + pkn1() - 8; c = pkn1(); break;
+ case 4: case 5: case 6: l = bb - 4;
+ l = (l << 16) + pkn2() - 13; c = pkn1(); break;
+ case 7: l = pki4() - 28; c = pki4(); break;
+ }
+ WITH1 = &WITH->chv[c];
+ switch (bb) {
+ case 0: case 1: case 2: case 3:
+ WITH1->U1.tfw = scaled(pkn3(), scf); pkn1();
+ WITH1->U1.wid = pkn1(); WITH1->U1.hei = pkn1();
+ WITH1->U1.hof = pki1(); WITH1->U1.vof = pki1(); break;
+ case 4: case 5: case 6:
+ WITH1->U1.tfw = scaled(pkn3(), scf); pkn2();
+ WITH1->U1.wid = pkn2(); WITH1->U1.hei = pkn2();
+ WITH1->U1.hof = pki2(); WITH1->U1.vof = pki2(); break;
+ case 7:
+ WITH1->U1.tfw = scaled(pki4(), scf); pki4(); pki4();
+ WITH1->U1.wid = pki4(); WITH1->U1.hei = pki4();
+ WITH1->U1.hof = pki4(); WITH1->U1.vof = pki4(); break;
+ }
+ pkpos += l;
+ if ((unsigned)c <= 255) {
+ if (WITH->mch < c) WITH->mch = c;
+ WITH->chv[c].U1.bmp = d;
+ } } } while (!terminate);
+ if (WITH->mch < 0) fprintf(prot, " - PKfile in error !\n");
+ else fprintf(prot, " - available\n");
+ WITH->chv = (chdesc *) realloc(WITH->chv, 16*(WITH->mch + 1));
+ Tptr( WITH->fonam = (char *) malloc(strlen(STR)+1) );
+ strcpy(WITH->fonam, STR);
+} } }
+static struct { short xs, x, wid1; short ii, j;
+ uchar dd, db; ushort d; uchar white; uchar buf[xmb + 1];
+ uchar bmerk; long repc, count; short dynf, dyng, dynh;
+} Lpkc;
+static uchar pknib() { uchar Result;
+ if (Lpkc.bmerk != 0) {
+ Result = Lpkc.bmerk & 0xf; Lpkc.bmerk = 0; return Result;
+ }
+ Lpkc.bmerk = pkn1(); Result = Lpkc.bmerk >> 4;
+ Lpkc.bmerk |= 0xf0; return Result;
+}
+static long pknum() { uchar i, j, k; long n;
+ k = 1;
+ do { i = pknib(); k++;
+ if (i == 0) {
+ do { j = pknib(); i++; } while (j == 0);
+ n = j;
+ while (i > 0) { i--; n = (n << 4) + pknib(); }
+ n += Lpkc.dyng;
+ } else if (i <= Lpkc.dynf) n = i;
+ else if (i < 14) n = (i << 4) + pknib() + Lpkc.dynh;
+ else if (i == 14) k = 0;
+ else { k = 1; n = 1; }
+ if (k == 1) Lpkc.repc = n;
+ } while (k != 2); return n;
+}
+static void pkline() {
+ if (Lpkc.dynf == 14) {
+ Lpkc.j = Lpkc.wid1 + Lpkc.xs;
+ Lpkc.db += Lpkc.xs;
+ do {
+ if (Lpkc.db < 8) Lpkc.d = (Lpkc.d << 8) | pkn1();
+ else Lpkc.db -= 8;
+ Lpkc.dd = (Lpkc.d >> Lpkc.db) & 255;
+ if (Lpkc.j >= 8) { Lpkc.j -= 8; Lpkc.buf[Lpkc.x] = Lpkc.dd;
+ } else { Lpkc.db += 8 - Lpkc.j;
+ Lpkc.buf[Lpkc.x] = Lpkc.dd & (0xff00L >> Lpkc.j) & 255;
+ Lpkc.j = 0;
+ } Lpkc.x++;
+ } while (Lpkc.j != 0);
+ Lpkc.d &= 0xffffL >> (16 - Lpkc.db); return;
+ }
+ Lpkc.ii = 0; Lpkc.j = Lpkc.wid1; Lpkc.db = 8 - Lpkc.xs; Lpkc.d = 0;
+ if (Lpkc.repc > 0) { Lpkc.repc--; return; }
+ while (Lpkc.j > 0) {
+ if (Lpkc.count == 0) { Lpkc.count = pknum(); Lpkc.white = !Lpkc.white; }
+ Lpkc.dd = Lpkc.db;
+ if (Lpkc.dd > Lpkc.j) Lpkc.dd = Lpkc.j;
+ if (Lpkc.dd > Lpkc.count) Lpkc.dd = Lpkc.count;
+ if (Lpkc.white) Lpkc.db -= Lpkc.dd;
+ else { Lpkc.d += 1 << Lpkc.db;
+ Lpkc.db -= Lpkc.dd; Lpkc.d -= 1 << Lpkc.db;
+ }
+ Lpkc.count -= Lpkc.dd; Lpkc.j -= Lpkc.dd;
+ if (Lpkc.db == 0 || Lpkc.j == 0) {
+ Lpkc.buf[Lpkc.x] = Lpkc.d & 255;
+ Lpkc.x++; Lpkc.d = 0; Lpkc.db = 8;
+} } }
+static void pkchar() { short hr, vr; long bma, bmx;
+ short x1, x2, x3, y1, y2, y; uchar b, bb, mach, mac, mpm, bach;
+ fontdesc *WITH; chdesc *WITH1;
+ WITH = fontvect[fontint]; WITH1 = &WITH->chv[c];
+ pkpos = WITH1->U1.bmp; b = pkn1();
+ Lpkc.white = ((b & 8) == 0); Lpkc.wid1 = WITH1->U1.wid;
+ Lpkc.dynf = b >> 4;
+ Lpkc.dyng = (13 - Lpkc.dynf) * 16 + Lpkc.dynf - 15;
+ Lpkc.dynh = -(Lpkc.dynf + 1) * 15; bb = b & 7;
+ switch (bb) {
+ case 0: case 1: case 2: case 3: pkpos += 10; break;
+ case 4: case 5: case 6: pkpos += 16; break;
+ case 7: pkpos += 36; break;
+ }
+ Lpkc.bmerk = 0; Lpkc.d = 0; Lpkc.db = 0; Lpkc.repc = 0;
+ Lpkc.count = 0; Lpkc.white = !Lpkc.white;
+ switch (dviori) {
+ case 0:
+ hr = (long)(conv * h + 0.5) - WITH1->U1.hof;
+ vr = (long)(vconv * v + 0.5) - WITH1->U1.vof - zilli;
+ if (vr > ymax) below = 1; else {
+ if (vr + WITH1->U1.hei >= 1) {
+ x1 = hr / 8; x2 = (hr + WITH1->U1.wid - 1) / 8;
+ Lpkc.xs = hr & 7; y2 = vr + WITH1->U1.hei - 1;
+ if (y2 > ymax) { y2 = ymax; below = 1; }
+ if (0 <= x1) {
+ if (x2 <= xmb) {
+ for (y = vr; y <= y2; y++) {
+ Lpkc.x = x1; pkline();
+ if (y >= 0) {
+ for (Lpkc.x = x1; Lpkc.x <= x2; Lpkc.x++)
+ pixet(y, Lpkc.x, Lpkc.buf[Lpkc.x]);
+ } } } } } } break;
+ case 1:
+ hr = (long)(conv * (landx + v) + 0.5) - WITH1->U1.vof;
+ vr = (long)(vconv * (landy - h) + 0.5) + WITH1->U1.hof - zilli;
+ if (vr - WITH1->U1.wid + 1 > ymax) below = 1; else {
+ if (vr >= 0) { Lpkc.xs = 0; mac = 0x80; bma = 0; y1 = vr;
+ if (y1 > ymax) { below = 1; bma += ((ulong)(y1 - ymax)) >> 3;
+ mac = 0x80 >> ((y1 - ymax) & 7); y1 = ymax;
+ }
+ y2 = vr - WITH1->U1.wid + 1; if (y2 < 0) y2 = 0;
+ x2 = hr + WITH1->U1.hei - 1; if (x2 > xmax) x2 = xmax;
+ for (x3 = hr; x3 <= x2; x3++) {
+ Lpkc.x = 0; pkline();
+ if (x3 >= 0) {
+ mach = mac; Lpkc.x = ((unsigned)x3) >> 3;
+ mpm = 0x80 >> (x3 & 7); bmx = bma; bach = Lpkc.buf[bmx];
+ for (y = y1; y >= y2; y--) {
+ if ((bach & mach) != 0) pixet(y, Lpkc.x, mpm);
+ mach >>= 1;
+ if (mach == 0) {
+ mach = 0x80; bmx++; bach = Lpkc.buf[bmx];
+ } } } } } } break;
+ case 3:
+ hr = (long)(conv * (landx - v) + 0.5) + WITH1->U1.vof;
+ vr = (long)(vconv * (landy + h) + 0.5) - WITH1->U1.hof - zilli;
+ if (vr > ymax) below = 1; else {
+ if (vr + WITH1->U1.wid >= 1) {
+ Lpkc.xs = 0; mac = 0x80; bma = 0; y1 = vr;
+ if (y1 < 0) { bma += ((unsigned)(-y1)) >> 3;
+ mac = 0x80 >> ((-y1) & 7); y1 = 0;
+ }
+ y2 = vr + WITH1->U1.wid - 1;
+ if (y2 > ymax) { y2 = ymax; below = 1; }
+ x2 = hr - WITH1->U1.hei + 1; if (x2 < 0) x2 = 0;
+ for (x3 = hr; x3 >= x2; x3--) {
+ Lpkc.x = 0; pkline();
+ if (x3 <= xmax) {
+ mach = mac; Lpkc.x = ((unsigned)x3) >> 3;
+ mpm = 0x80 >> (x3 & 7); bmx = bma; bach = Lpkc.buf[bmx];
+ for (y = y1; y <= y2; y++) {
+ if ((bach & mach) != 0) pixet(y, Lpkc.x, mpm);
+ mach >>= 1;
+ if (mach == 0) {
+ mach = 0x80; bmx++; bach = Lpkc.buf[bmx];
+ } } } } } } break;
+ case 2:
+ hr = (long)(conv * (landx - h) + 0.5) + WITH1->U1.hof;
+ vr = (long)(vconv * (landy - v) + 0.5) + WITH1->U1.vof - zilli;
+ if (vr - WITH1->U1.hei + 1 > ymax) below = 1; else {
+ if (vr >= 0) {
+ x1 = hr / 8; x2 = (hr - WITH1->U1.wid + 1) / 8;
+ Lpkc.xs = (7 - hr) & 7; y2 = vr - WITH1->U1.hei + 1;
+ if (y2 < 0) y2 = 0;
+ if (vr > ymax) below = 1;
+ if (0 <= x2) {
+ if (x1 <= xmb) {
+ for (y = vr; y >= y2; y--) {
+ Lpkc.x = xmb - x1; pkline();
+ if (y <= ymax) {
+ for (Lpkc.x = x1; Lpkc.x >= x2; Lpkc.x--)
+ pixet(y, Lpkc.x, bitrev[Lpkc.buf[xmb - Lpkc.x]]);
+ } } } } } } break;
+} }
+
+static void fontdef() { uchar a, b, p, q; fontdesc *WITH;
+ if (f < 0) baddvi("negative fontnumber");
+ b = f & 0xff; a = 0;
+ if ((f > 255) || (fontvect[b] != NULL)) do {
+ if (fontvect[a] == NULL) b = a;
+ else if (fontvect[a]->dfn == f) baddvi("double fontnumber");
+ a++;
+ } while (a);
+ if (fontvect[b] != NULL) baddvi("too many fonts");
+ fontint = b;
+ Tptr( fontvect[b] = (fontdesc *)malloc(sizeof(fontdesc)) );
+ WITH = fontvect[fontint]; WITH->dfn = f;
+ chk = dvinum(4); scf = dvinum(4); dsz = dvinum(4);
+ WITH->chm = NULL; WITH->fty = -1;
+ p = dvibyte(); q = dvibyte(); dvibytes(FONAM, q);
+ if (p == 0) strcpy(FOPRE, fontprefix); else dvibytes(FOPRE, p);
+ sprintf(FOMAG, "%ld",
+ (long)(xres * dvimag / 1000.0 * ((double)scf / dsz) + 0.5));
+#ifdef __MSDOS__
+ sprintf(FOFUL, "%s%s\\%s.", FOPRE, FOMAG, FONAM);
+ sprintf(FOLOC, "%s.", FONAM);
+#else
+ sprintf(FOFUL, "%s%s.%s", FOPRE, FONAM, FOMAG);
+ sprintf(FOLOC, "%s.%s", FONAM, FOMAG);
+#endif
+ pkdef(); if (WITH->mch < 0) tfmdef();
+}
+
+static void fontlod() { uchar b = 0;
+ fontdesc *WITH = fontvect[fontint];
+ WITH->chm = (uchar *)malloc(WITH->danf);
+ if (WITH->chm == NULL) { do {
+ if (fontvect[b] != NULL) {
+ if (fontvect[b]->chm) free(fontvect[b]->chm);
+ fontvect[b]->chm = NULL;
+ } b++;
+ } while (b);
+ Tptr( WITH->chm = (uchar *)malloc(WITH->danf) );
+ }
+ fofil = fopen(WITH->fonam, "rb");
+ fread(WITH->chm, WITH->danf, 1, fofil); fclose(fofil);
+}
+
+static void fontset() { uchar a, b, x;
+ b = f & 0xff; x = 0;
+ if (fontvect[b] != NULL) if (fontvect[b]->dfn == f) x = 1;
+ if (x == 0) { a = 0;
+ do {
+ if (fontvect[a] == NULL) a++;
+ else if (fontvect[a]->dfn != f) a++;
+ else { x = 1; b = a; a = 0; }
+ } while (a != 0);
+ }
+ if (x == 0) baddvi("undefined fontnumber");
+ fontint = b;
+}
+static void putrule() { short hr, vr, br, ar;
+ if (b <= 0) return;
+ switch (dviori) {
+ case 0:
+ hr = (long)(conv * h + 0.5);
+ vr = (long)(vconv * (v - a) + 0.5);
+ br = (long)(conv * b + 0.5); if (br > 0) br--;
+ ar = (long)(vconv * a + 0.5);
+ break;
+ case 1:
+ hr = (long)(conv * (landx + v - a) + 0.5);
+ vr = (long)(vconv * (landy - h - b) + 0.5);
+ br = (long)(conv * a + 0.5);
+ ar = (long)(vconv * b + 0.5); if (ar > 0) ar--;
+ break;
+ case 3:
+ hr = (long)(conv * (landx - v) + 0.5);
+ vr = (long)(vconv * (landy + h) + 0.5);
+ br = (long)(conv * a + 0.5);
+ ar = (long)(vconv * b + 0.5); if (ar > 0) ar--;
+ break;
+ case 2:
+ hr = (long)(conv * (landx - h - b) + 0.5);
+ vr = (long)(vconv * (landy - v) + 0.5);
+ br = (long)(conv * b + 0.5); if (br > 0) br--;
+ ar = (long)(vconv * a + 0.5);
+ break;
+ }
+ vr -= zilli; ar += vr; br += hr;
+ if (hr < 0) hr = 0;
+ if (br > xmax) br = xmax;
+ if (vr < 0) vr = 0;
+ if (ar > ymax) { ar = ymax; below = 1; }
+ if (hr <= br) if (vr <= ar) setrect(hr, vr, br, ar);
+}
+static void putchar_() { fontdesc *WITH; chdesc *WITH1;
+ WITH = fontvect[fontint];
+ if (c > WITH->mch) { q = 0; return; }
+ WITH1 = &WITH->chv[c]; q = WITH1->U1.tfw;
+ if (WITH->fty == 1) { tfmchar(); return; }
+ if (WITH1->U1.bmp == 0) return;
+ if (WITH->chm == NULL) fontlod();
+ achm = WITH->chm; pkchar();
+}
+static void clrpxlmem() { short i; below = 0;
+ for (i = 0; i <= ymax; i++)
+ memset((ptr)pxlmem[i], 0, (xmb+1)*sizeof(colpix));
+}
+static void pagebeg() { uchar j; greydesc *WITH;
+ for (j = 0; j <= 9; j++) cnt[j] = dvinum(4);
+ lpp = dvinum(4); pagnum++;
+ if (pagnum >= pag1) { started = 1; fprintf(prot, "[%d", pagnum); }
+ s = 0; w = 0; x = 0; y = 0; z = 0; zilli = 0; lz = 0; zoll = zoll0;
+ for (j = 0; j <= 7; j++) { WITH = &greymask[j]; WITH->maskc = 0;
+ WITH->maskm = 0; WITH->masky = 0; WITH->maskk = 0xff;
+ }
+ zoelli = ftell(dvifile); zoelli += (long)dvibufp - (long)dvibufe;
+ h = (long)((xres - hoff) / conv + 0.5);
+ v = (long)((yres - voff) / vconv + 0.5);
+ clrpxlmem();
+}
+static void pageend() {
+ if (s != 0) fprintf(prot, "Stack not empty at EOP\n");
+ if (!started) return;
+ hardcopy(); /* fprintf(prot, "/%d", (int)zoll); */
+ if (zoll > 0 && below) { zoll--; dviposit(zoelli);
+ s = 0; w = 0; x = 0; y = 0; z = 0; zilli += ymax + 1;
+ h = (long)((xres - hoff) / conv + 0.5);
+ v = (long)((yres - voff) / vconv + 0.5);
+ clrpxlmem(); return;
+ }
+ hardform(); fprintf(prot, "]");
+ paganz--; if (paganz <= 0) fini = 1;
+}
+static void deffont() { ushort l, m;
+ if (!post) { fontdef(); return; }
+ dviskip(12L); l = dvibyte(); m = dvibyte(); dviskip((long)(l + m));
+}
+static void special() { long i, j, k; char *parm;
+ double x, y, cy, ma, ye, bl; short cle, m, n;
+ if (spl > 255) { fprintf(prot, "special >>");
+ for (i = spl; i > 0; i--) fputc(dvibyte(), prot);
+ fprintf(prot, "<< ignored\n"); return;
+ }
+ dvibytes(comment, (int)spl);
+ if (!memcmp(comment, "landend", 7)) { dviori = 0; return; }
+ if (!memcmp(comment, "landstart", 9)) {
+ if (comment[10] == '1') dviori = 1;
+ else if (comment[10] == '0') dviori = 3;
+ else dviori = 2;
+ sscanf(comment+12, "%lg%lg", &x,&y);
+ j = (long)(x * 65535L + 0.5);
+ k = (long)(y * 65535L + 0.5);
+ switch (dviori) {
+ case 1: landx = h - v; landy = v + j + h; break;
+ case 3: landx = h + k + v; landy = v - h; break;
+ case 2: landx = h + h + k; landy = v + j + v; break;
+ } return; }
+ if (memcmp(comment, "color", 5)) {
+ fprintf(prot, "special >>%s<< ignored", comment); return;
+ }
+ parm = comment+6;
+ if (!memcmp(parm, "pop", 3)) { parm +=4; colst--;
+ if (colst < 0) { colst = 0; fprintf(prot, " color stack underflow"); }
+ } else {
+ if (!memcmp(parm, "push cmyk", 9)) { parm +=10; colst++;
+ if (colst > smax-1) { colst = smax-1;
+ fprintf(prot, " color stack overflow");
+ } }
+ if (sscanf(parm,"%lg%lg%lg%lg",&cy,&ma,&ye,&bl)<4) {
+ fprintf(prot," color: cmyk values <%s> incomplete ",comment); return;
+ }
+ n = (long)(cy * maxink); if (n < 0) n = 0;
+ if (n > maxink) n = maxink; stackcy[colst] = n;
+ n = (long)(ma * maxink); if (n < 0) n = 0;
+ if (n > maxink) n = maxink; stackma[colst] = n;
+ n = (long)(ye * maxink); if (n < 0) n = 0;
+ if (n > maxink) n = maxink; stackye[colst] = n;
+ n = (long)(bl * maxink); if (n < 0) n = 0;
+ if (n > maxink) n = maxink; stackbl[colst] = n;
+ }
+ n = stackcy[colst]; cle = n;
+ for (m = 0; m <= 7; m++) greymask[m].maskc = maskb[n][0][m & 3];
+ n = stackma[colst]; cle += n;
+ for (m = 0; m <= 7; m++) greymask[m].maskm = maskb[n][1][m & 3];
+ n = stackye[colst]; cle += n;
+ for (m = 0; m <= 7; m++) greymask[m].masky = maskb[n][2][m & 3];
+ n = stackbl[colst]; cle += n;
+ for (m = 0; m <= 7; m++) greymask[m].maskk = maskb[n][3][m & 3];
+ clearing = (cle == 0);
+}
+static void preambl() { uchar l;
+ l = dvibyte(); num = dvinum(4); den = dvinum(4);
+ dvimag = dvinum(4); if (newmag != 0) dvimag = newmag;
+ conv = num / 254000.0 * ((double)xres / den) * (dvimag / 1000.0);
+ vconv = num / 254000.0 * ((double)yres / den) * (dvimag / 1000.0);
+ l = dvibyte(); dvibytes(comment, l); fprintf(prot, "%s\n", comment);
+}
+static void postamb() {
+ lpp = dvinum(4); num = dvinum(4); den = dvinum(4);
+ dvimag = dvinum(4); if (newmag != 0) dvimag = newmag;
+ conv = num / 254000.0 * ((double)xres / den) * (dvimag / 1000.0);
+ vconv = num / 254000.0 * ((double)yres / den) * (dvimag / 1000.0);
+ mxv = dvinum(4); mxh = dvinum(4); mst = dvinum(2); mpn = dvinum(2);
+}
+main(int argc, char **argv) { char *parm;
+ post = 0; fini = 0; started = 0; dviori = 0; pagnum = 0;
+ pag1 = 1; paganz = 9999; newmag = 0; q = 0; hoff = 78; voff = 156;
+ for (i = 0; i <= ymax; i++) {
+ Tptr( pxlmem[i] = (colpix *) malloc((xmb+1)*sizeof(colpix)) );
+ }
+ Tptr( fontvect = (fontdesc **) calloc(256, 4) );
+ initbitrev(); colst = 0;
+ stackcy[colst] = 0; stackma[colst] = 0;
+ stackye[colst] = 0; stackbl[colst] = maxink;
+
+ fprintf(prot, "This is the HP Deskjet 550 Color TeX driver, V 94.01 .\n");
+ fprintf(prot, "(C)opyright 1994 Wolfgang R. Mueller, Computing Centre,\n");
+ fprintf(prot, "Heinrich-Heine-University Duesseldorf, Germany\n");
+ if (argc == 1) {
+ fprintf(prot, "Please use with dvifilename and optional parameters\n");
+ fprintf(prot, " -s<starting page> (default: 1 i.e. first in file)\n");
+ fprintf(prot, " -c<number of pages> (default: 9999 i.e. all)\n");
+ fprintf(prot, " -m<new magnification> (default: from DVIfile)\n");
+ fprintf(prot, " -h<horizontal offset> (default: %ld (pixels)\n", hoff);
+ fprintf(prot, " -v<vertical offset> (default: %ld (pixels)\n", voff);
+ fprintf(prot, " -f<font directory> (default: %s)\n", fontprefix);
+ fprintf(prot, " -t<TFMfile directory> (default: %s)\n", tfmprefix);
+ fprintf(prot, " -o<outfile> (default: %s)\n", prfnam);
+ fprintf(prot, " prn for <outfile> goes directly to printer port,\n");
+ fprintf(prot, " empty <outfile> part is replaced by <DVIfile>.pcl\n");
+ exit(0);
+ }
+ strcpy(dviname, "texput");
+ for (j = 1; j < argc; j++) { parm = argv[j];
+ if (parm[0] != '-') { strcpy(dviname, parm);
+ } else { switch (parm[1]) {
+ case 's': case 'S': sscanf(parm+2, "%d", &pag1); break;
+ case 'c': case 'C': sscanf(parm+2, "%d", &paganz); break;
+ case 'f': case 'F': strcpy(fontprefix, parm+2); break;
+ case 't': case 'T': strcpy(tfmprefix, parm+2); break;
+ case 'm': case 'M': sscanf(parm+2, "%ld", &newmag); break;
+ case 'h': case 'H': sscanf(parm+2, "%ld", &hoff); break;
+ case 'v': case 'V': sscanf(parm+2, "%ld", &voff); break;
+ case 'o': case 'O': strcpy(prfnam, parm+2); break;
+ } } }
+ strcpy(defnam, dviname); prfeval(); dviopen(); postamb();
+ do { o = dvibyte(); /* fprintf(prot, "(%u)", (ushort)o); */
+ switch (o) {
+ case 128: case 129: case 130: case 131:
+ c = dvinum(o - 127); if (started) putchar_(); h += q; break;
+ case 132: a = dviint(4); b = dviint(4);
+ if (started) putrule(); h += b; break;
+ case 133: case 134: case 135: case 136:
+ c = dvinum(o - 132); if (started) putchar_(); break;
+ case 137: a = dviint(4); b = dviint(4);
+ if (started) putrule(); break;
+ case 138: break;
+ case 139: pagebeg(); break;
+ case 140: pageend(); break;
+ case 141: if (s < smax) { s++; hs[s - 1] = h; vs[s - 1] = v;
+ ws[s - 1] = w; xs[s - 1] = x; ys[s - 1] = y; zs[s - 1] = z;
+ } else baddvi("stack overflow"); break;
+ case 142: if (s > 0) { h = hs[s - 1]; v = vs[s - 1];
+ w = ws[s - 1]; x = xs[s - 1]; y = ys[s - 1]; z = zs[s - 1]; s--;
+ } else baddvi("stack underflow"); break;
+ case 143: case 144: case 145: case 146:
+ h += dviint(o - 142); break;
+ case 147: h += w; break;
+ case 148: case 149: case 150: case 151:
+ w = dviint(o - 147); h += w; break;
+ case 152: h += x; break;
+ case 153: case 154: case 155: case 156:
+ x = dviint(o - 152); h += x; break;
+ case 157: case 158: case 159: case 160:
+ v += dviint(o - 156); break;
+ case 161: v += y; break;
+ case 162: case 163: case 164: case 165:
+ y = dviint(o - 161); v += y; break;
+ case 166: v += z; break;
+ case 167: case 168: case 169: case 170:
+ z = dviint(o - 166); v += z; break;
+ case 235: case 236: case 237: case 238:
+ f = dvinum(o - 234); if (started) fontset(); break;
+ case 239: case 240: case 241: case 242:
+ spl = dvinum(o - 238); special(); break;
+ case 243: case 244: case 245: case 246:
+ f = dvinum(o - 242); deffont(); break;
+ case 247: preambl(); break;
+ case 248: fini = 1; break;
+ case 249: dviposit(0L); post = 1; break;
+ case 250: case 251: case 252:
+ case 253: case 254: case 255: break;
+ default:
+ if (o <= 127) {
+ c = o; if (started) putchar_(); h += q;
+ } else if (o >= 171 && o <= 234) {
+ f = o - 171; if (started) fontset();
+ } break; } } while (!fini);
+ prclos(); fclose(dvifile); exit(0);
+}
+
\ No newline at end of file diff --git a/dviware/dvidjc/dvidjc.c b/dviware/dvidjc/dvidjc.c new file mode 100644 index 0000000000..efed1e27ca --- /dev/null +++ b/dviware/dvidjc/dvidjc.c @@ -0,0 +1,994 @@ +/* (C)opyright 1994 Wolfgang R. Mueller, Computing Centre, +Heinrich-Heine-University Duesseldorf, Germany, +wolfgang@uni-duesseldorf.de, +49-211-311-3905. +This program may be used without any warranty under +the terms of the GNU general public licence. */ +/* translated from the original TurboPascal source +partly with p2c, the Pascal-to-C translator */ + +#undef DJCOLOUR +#ifdef DJ550C +#define DJCOLOUR +#endif +#ifdef DJ500C +#define DJCOLOUR +#endif + +#define DINA4 +#include <stdio.h> + +#ifdef __MSDOS__ + #ifdef __TURBOC__ + #include <dos.h> + #else + #include <pc.h> + #endif +#endif + +#ifdef __TURBOC__ + #include <mem.h> + #include <alloc.h> + #define malloc farmalloc + #define calloc farcalloc + #define realloc farrealloc + #define free farfree +#endif + +#define uchar unsigned char +#define ushort unsigned short +#define ulong unsigned long +#define ptr void * + +#define xmb 294 /* 8.5 inch X 300 dpi / 8 dot per byte*/ +#ifdef __TURBOC__ +#define ymax 47 /* +1=multiple of 8 */ +#else +#define ymax 839 /* +1=multiple of 8 */ +#endif +#define linl 299 /* =xmb+2+(xmb+128)div 128 */ +#define maxink 16 +#define smax 100 + +#ifdef __MSDOS__ +static char tfmprefix[] = "c:\\tex\\fonts\\tfm\\"; +static char fontprefix[] = "c:\\tex\\fonts\\canon\\"; +#else +static char tfmprefix[] = "/usr/TeX/lib/tex/fonts/"; +static char fontprefix[] = "/usr/TeX/lib/tex/fonts/"; +#endif + +typedef struct colpix { uchar cpix, mpix, ypix, kpix; } colpix; +typedef struct greydesc { uchar maskc, maskm, masky, maskk; } greydesc; + +static uchar maskmat[5][4][4] = { + { {17,2,5,17},{17,17,8,17},{17,17,17,11},{17,17,14,17} }, + { {1,17,17,3},{5,17,17,6},{8,10,12,17},{14,16,17,17} }, + { {17,17,17,17},{17,4,17,17},{17,17,17,17},{17,17,17,12} }, + { {14,4,16,2},{7,9,5,11},{15,1,13,3},{6,12,8,10} }, + { {0x88,0x44,0x22,0x11},{0,0,0,0},{0,0,0,0},{0,0,0,0} } }; + +static FILE *prot=stderr; +static uchar stackcy[smax], stackma[smax], stackye[smax], stackbl[smax]; +static char STR[99], FOPRE[99], FOMAG[16], FONAM[99], FOLOC[99], FOFUL[99]; +static char prfnam[99] = "prn"; +static char defnam[73]; +static colpix *pxlmem[ymax + 1]; +static greydesc greymask[8]; +static uchar maskb[maxink + 1][4][4]; + +static uchar zoll, zoll0, vsk1, vsk2, hsk3, prfilout, clearing, prinit = 0; +static long zoelli; +static short zilli, lz, colst, xres, yres, xmax; +static short vskop, hsk1, hsk2, lzd, vchd, prbs, prbe; +static FILE *prfile; +static uchar prbuf[2048]; + +static void Tptr(void *p) { if(p==NULL) { + fprintf(prot, " - not enough memory :-( "); exit(1); +} } +static void prfeval() { + if (!strcmp(".dvi", defnam+strlen(defnam)-4)) defnam[strlen(defnam)-4]=0; + if (*prfnam == '\0') sprintf(prfnam, "%s.pcl", defnam); + prfilout = (strcmp(prfnam, "prn") != 0); + xres = 300; yres = 300; xmax = xmb * 8 + 7; + zoll0 = (yres * 12 + ymax) / (ymax + 1); + if (prfilout) fprintf(prot, "writing to file %s\n", prfnam); +} +static void propen() { if (prinit) return; prinit = 1; + prbs=0; prbe=0; if(prfilout) prfile = fopen(prfnam, "w+b"); +} +static void prflush() { if(prbs>=prbe) return; + if(prfilout) fwrite(&prbuf[prbs], prbe - prbs, 1, prfile); + prbe=0; prbs=prbe; +} +static void put(x) uchar x; { + if (prfilout) { + if (prbe == 2048) prflush(); + prbuf[prbe] = x; prbe++; + } else +#ifdef __MSDOS__ + outportb(0x378,x); + while((inportb(0x379)&0x80)==0); + outportb(0x37a,13); + inportb(0x379); + outportb(0x37a,12); +#else + putc(x,stdout); +#endif +} +static void esc(s) char *s; { short i, l; + put(0x1b); l = strlen(s); + for (i = 0; i < l; i++) put(s[i]); +} +static void prclos() { + if (!prinit) return; + prflush(); prinit = 0; + if (prfilout) fclose(prfile); +} +static void hardform() { esc("*rbC"); put(0xc); esc("E"); +} +static void putint(i) short i; { + if (i >= 10) putint(i / 10); + put(i % 10 + '0'); +} +static void putbits(c, pbuf) char c; uchar pbuf[linl+1]; { + uchar qbuf[linl+1]; short i, j, k, l, m, n; uchar b, ba; + n = xmb; while (pbuf[n] == 0 && n >= 0) n--; + if (n < 0) m = 0; else { + b = pbuf[0]; j = 1; k = 2; l = 2; qbuf[k] = b; + for (i = 1; i <= n; i++) { ba = b; b = pbuf[i]; + if (ba == b) { + if (l == k) { + if (k == j + 1) k--; else { + l++; qbuf[l] = b; + if (l - j >= 128) { qbuf[j] = k - j - 2; j = k; } + } } else { l++; + if (j < k) { qbuf[j] = k - j - 2; j = k; } + if (l - j >= 128) { + qbuf[j] = 129; j = k + 2; k = j + 1; l = k; qbuf[k] = b; + } } } else { + if (l == k) { k++; + if (k - j > 128) { qbuf[j] = k - j - 2; j = k; k++; } + qbuf[k] = b; l = k; + } else if (j == k) { qbuf[j] = k - l + 256; + j += 2; k = j + 1; l = k; qbuf[k] = b; + } else { l++; k = l; qbuf[k] = b; + } } } + if (l == k) { qbuf[j] = l - j - 1; m = l; + } else if (j == k) { qbuf[j] = k - l + 256; m = j + 1; + } else { qbuf[j] = l - j - 1; m = l; + } } + esc("*b"); putint(m); put(c); + for (i = 1; i <= m; i++) put(qbuf[i]); +} +static short skipper; +static void hardcopy() { uchar pbuf[linl+1]; + short x, y; uchar b,nothing; colpix *WITH; + propen(); + if (zilli == 0) { + esc("E"); +#ifdef DINA4 + esc("&l26A"); +#endif + esc("&a1N"); esc("*r2360S"); esc("*t300R"); +#ifdef DJ550C + esc("*r-4U"); +#endif +#ifdef DJ500C + esc("*r-3U"); +#endif + esc("*p0x0Y"); esc("*r0A"); esc("*b2M"); skipper=0; + } + for (y = 0; y <= ymax; y++) { nothing=1; + for (x = 0; x <= xmb; x++) { WITH = &pxlmem[y][x]; +#ifdef DJCOLOUR + b = WITH->kpix | (WITH->cpix & WITH->mpix & WITH->ypix); +#else + b = WITH->kpix | (WITH->cpix | WITH->mpix | WITH->ypix); +#endif + WITH->kpix = b; +#ifdef DJ550C + b = ~b; WITH->cpix &= b; WITH->mpix &= b; WITH->ypix &= b; +#endif +#ifdef DJ500C + WITH->kpix = WITH->cpix | b; WITH->mpix |= b; WITH->ypix |= b; +#endif + if(WITH->kpix|WITH->cpix|WITH->mpix|WITH->ypix) nothing=0; + } + if(nothing) skipper++; else { + if(skipper>0) { esc("*b"); putint(skipper); put('Y'); skipper=0; } + for (x = 0; x <= xmb; x++) pbuf[x] = pxlmem[y][x].kpix; +#ifdef DJ550C + putbits('V', pbuf); + for (x = 0; x <= xmb; x++) pbuf[x] = pxlmem[y][x].cpix; +#endif +#ifdef DJCOLOUR + putbits('V', pbuf); + for (x = 0; x <= xmb; x++) pbuf[x] = pxlmem[y][x].mpix; + putbits('V', pbuf); + for (x = 0; x <= xmb; x++) pbuf[x] = pxlmem[y][x].ypix; +#endif + putbits('W', pbuf); +} } prflush(); } +static void pixet(y, x, b) ushort y, x; uchar b; { + colpix *WITH; greydesc *WITH1; + WITH = &pxlmem[y][x]; WITH1 = &greymask[y & 7]; + if (clearing) { WITH->cpix &= ~b; WITH->mpix &= ~b; + WITH->ypix &= ~b; WITH->kpix &= ~b; return; + } + WITH->cpix |= b & WITH1->maskc; WITH->mpix |= b & WITH1->maskm; + WITH->ypix |= b & WITH1->masky; WITH->kpix |= b & WITH1->maskk; +} +static void setrect(xl, yl, xh, yh) ushort xl, yl, xh, yh; { + ushort x, y, xll, xrr; uchar a, b, c; + xll = xl >> 3; xrr = xh >> 3; + a = (0xff >> (xl & 7)) & 255; c = 0xff << (7 - (xh & 7)); + for (y = yl; y <= yh; y++) { b = a; + for (x = xll; x <= xrr; x++) { + if (x == xrr) b &= c; + pixet(y, x, b); b = 0xff; +} } } +/*static long prodovz(a, b) ushort a, b; { return ((long)a * (long)b); } +static long scaled(w, z) long w, z; { long s; + union { long l; struct { ushort n, h; } U1; } a, b; + a.l = w; b.l = z; + s = (((((ulong)prodovz(a.U1.n, b.U1.n)) >> 16) + prodovz(a.U1.n, + b.U1.h) + prodovz(a.U1.h, b.U1.n)) >> 4) + + (prodovz(a.U1.h, b.U1.h) << 12); + if (w < 0) s -= z << 12; return s; +} */ +static long scaled(w, z) long w, z; { long s; ulong t=w, u=z; + /* should return w * z / 2**20 */ + s = ( ( (((t & 65535L) * (u & 65535L)) >> 16) + + (t & 65535L) * (u >> 16) + + (t >> 16) * (u & 65535L) ) >> 4) + + ( ( (t >> 16) * (u >> 16) ) << 12); + if (w < 0) s -= z << 12; return s; +} +static char dviname[73]; +static FILE *dvifile; +static long dvimag; +static uchar dvibuf[2048]; +static ushort dvibufp, dvibufe; + +static void baddvi(s) char *s; { + fprintf(prot, "bad dvi: %s\n", s); exit(1); +} +static void dvibytes(s, l) char *s; uchar l; { ushort ll; + s[l] = '\0'; ll = dvibufe - dvibufp; + if (ll >= l) { + memmove((ptr)s, (ptr)(&dvibuf[dvibufp]), (long)l); + dvibufp += l; return; + } + if (ll > 0) memmove((ptr)s, (ptr)(&dvibuf[dvibufp]), (long)ll); + dvibufe = fread(dvibuf, 1, 2048, dvifile); + if (dvibufe + ll < l) baddvi("ends prematurely !"); + memmove((ptr)(&s[ll]), (ptr)dvibuf, (long)(l - ll)); + dvibufp = l - ll; +} +static uchar dvibyte() { uchar b; + if (dvibufp >= dvibufe) { dvibufp = 0; + dvibufe = fread(dvibuf, 1, 2048, dvifile); + } + if (dvibufp >= dvibufe) baddvi("ends prematurely !"); + b = dvibuf[dvibufp]; dvibufp++; return b; +} +static void dviskip(l) long l; { uchar b; + while (l > 0) { + l += (long)dvibufp - (long)dvibufe; + if (l <= 0) dvibufp = dvibufe + l; + else { dvibufp = dvibufe; l--; dvibyte(); } +} } +static long dvinum(b) uchar b; { uchar i; long n; + n = 0; + if (dvibufp + b > dvibufe) { + for (i = 1; i <= b; i++) n = (n << 8) | dvibyte(); return n; + } + for (i = 0; i < b; i++) n = (n << 8) | dvibuf[dvibufp + i]; + dvibufp += b; return n; +} +static long dviint(b) uchar b; { uchar i; long n; + if (dvibufp + b <= dvibufe) { + n = dvibuf[dvibufp]; + if (n > 127) n -= 256; + for (i = 1; i < b; i++) n = (n << 8) | dvibuf[dvibufp + i]; + dvibufp += b; return n; + } + n = dvibyte(); + if (n > 127) n -= 256; + for (i = 2; i <= b; i++) n = (n << 8) | dvibyte(); return n; +} +static void dviposit(l) long l; { fseek(dvifile, l, 0); + dvibufe = fread(dvibuf, 1, 2048, dvifile); dvibufp = 0; +} +static void dviopen() { long l; uchar j, em; ushort k; + sprintf(STR, "%s.dvi", dviname); + if ((dvifile = fopen(STR, "rb"))==0) { strcpy(STR, dviname); + if ((dvifile = fopen(STR, "rb"))==0) baddvi("not existing !"); + } + dvibufe = fread(dvibuf, 1, 2, dvifile); + if (dvibufe < 2) baddvi("empty !"); + em = dvibuf[1]; + if (dvibuf[0] != 247) baddvi("no valid preamble"); + /* now position to postamble */ + fseek(dvifile, 0L, 2); l=ftell(dvifile); if(l>2048) l=2048; + fseek(dvifile, -l, 2); k = fread(dvibuf, 1, 2048, dvifile); + do { k--; } while (k >= 4 && dvibuf[k] != em); + if (k < 4) baddvi("no postamble in last 2048 bytes !"); + dvibufe = k + 1; dvibufp = k - 4; l = dvinum(4); + fseek(dvifile, l, 0); dvibufe = fread(dvibuf, 1, 2048, dvifile); + dvibufp = 0; dvibyte(); +} + +typedef union chdesc { uchar b8[16]; + struct { short wid, hei, hof, vof; long bmp, tfw; } U1; + struct { long tfh, tfd, dum1, dum2; } U2; +} chdesc; +typedef struct fontdesc { + long dfn; char *fonam; chdesc *chv; + long danf; uchar *chm; short mch, fty; +} fontdesc; +static fontdesc **fontvect; +static uchar fontint; +static FILE *fofil; +static uchar *achm; +static uchar fofbyte() { uchar b; + if (fread(&b, 1, 1, fofil) <= 0) b = 0; return b; +} +static long fofint(b) uchar b; { uchar i; long n; + n = fofbyte(); if (n > 127) n -= 256; + for (i = 2; i <= b; i++) n = (n << 8) | fofbyte(); + return n; +} + +static long hs[smax], vs[smax], ws[smax], xs[smax], ys[smax], zs[smax]; +static long cnt[10]; +static uchar bitrev[256]; +static char comment[256]; +static double conv, vconv; +static long l, landx, landy, newmag; +static long a, b, c, f, q, h, v, hoff, voff, w, x, y, z; +static long chk, scf, dsz, fofchk, num, den, mag, spl, lpp, mxh, mxv; +static int pagnum, pag1, paganz, i, k; +static ushort s, mst, mpn; +static char dviori; +static uchar o, j, post, fini, started, below; + +static void initbitrev() { uchar b, i, j, k, m, n; + for (m = 0; m <= 3; m++) { n=m; +#ifdef DJCOLOUR + n=3; +#endif + for (i = 0; i <= maxink; i++) { + for (j = 0; j <= 3; j++) { b = 0; + for (k = 0; k <= 3; k++) { + if (maskmat[n][j][k] <= i) b |= maskmat[4][0][k]; + } maskb[i][m][j] = b; } } } + bitrev[0] = 0; m = 0x80; n = 1; + while (m) { /* put bits into reverse order within a byte */ + for (j = 0; j < n; j++) bitrev[j + n] = bitrev[j] | m; + n += n; m >>= 1; +} } + +static void tfmdef() { short ll, lh, bc, ec, nw, nh, nd, i; + uchar b1, b2, b3; short FORLIM; + fontdesc *WITH = fontvect[fontint]; + sprintf(STR, "%s%s.tfm", tfmprefix, FONAM); + fprintf(prot, "trying %s instead", STR); + fofil = fopen(STR, "rb"); + if (fofil==0) { fprintf(prot, " - absent as well :-(\n"); return; } + ll = fofint(2); lh = fofint(2); bc = fofint(2); ec = fofint(2); + nw = fofint(2); nh = fofint(2); nd = fofint(2); fseek(fofil, 0L, 2); + if (ll * 4 > ftell(fofil) || ll < lh + ec - bc + nw + nh + nd + 7) { + fprintf(prot, " - not a TFMfile !\n"); fclose(fofil); return; + } + WITH->mch = ec; + Tptr( WITH->chv = (chdesc *)calloc(WITH->mch + 1, sizeof(chdesc)) ); + fseek(fofil, 24L, 0); fofchk = fofint(4); + if (chk != 0) if (fofchk != 0) if (chk != fofchk) + fprintf(prot, " *+* wrong checksum *+* "); + fseek(fofil, (lh + ec - bc + 7L) * 4, 0); + FORLIM = nw + nh + nd; + for (i = 0; i < FORLIM; i++) + WITH->chv[i].U2.dum1 = scaled(fofint(4), scf); + fseek(fofil, lh * 4L + 24, 0); + for (i = bc; i <= ec; i++) { + b1 = fofbyte(); b2 = fofbyte(); fofbyte(); fofbyte(); + WITH->chv[i].U1.tfw = WITH->chv[b1].U2.dum1; + WITH->chv[i].U2.tfh = WITH->chv[nw + (b2 >> 4)].U2.dum1; + WITH->chv[i].U2.tfd = WITH->chv[nw + nh + (b2 & 15)].U2.dum1; + } + fclose(fofil); WITH->fty = 1; fprintf(prot, " - TFMfile OK\n"); +} +static void tfmchar() { short hr, vr, br, ar; uchar li, re, ob, un; + chdesc *WITH = &fontvect[fontint]->chv[c]; + switch (dviori) { + case 0: + hr = (long)(conv * h + 0.5); + vr = (long)(vconv * (v - WITH->U2.tfh) + 0.5); + br = (long)(conv * (h + WITH->U1.tfw) + 0.5); + ar = (long)(vconv * (v + WITH->U2.tfd) + 0.5); + break; + case 1: + hr = (long)(conv * (landx + v - WITH->U2.tfh) + 0.5); + vr = (long)(vconv * (landy - h - WITH->U1.tfw) + 0.5); + br = (long)(conv * (landx + v + WITH->U2.tfd) + 0.5); + ar = (long)(vconv * (landy - h) + 0.5); + break; + case 3: + hr = (long)(conv * (landx - v - WITH->U2.tfd) + 0.5); + vr = (long)(vconv * (landy + h) + 0.5); + br = (long)(conv * (landx - v + WITH->U2.tfh) + 0.5); + ar = (long)(vconv * (landy + h + WITH->U1.tfw) + 0.5); + break; + case 2: + hr = (long)(conv * (landx - h - WITH->U1.tfw) + 0.5); + vr = (long)(vconv * (landy - v - WITH->U2.tfd) + 0.5); + br = (long)(conv * (landx - h) + 0.5); + ar = (long)(vconv * (landy - v + WITH->U2.tfh) + 0.5); + break; + } + li = 1; re = 1; ob = 1; un = 1; + if (hr < 0) { hr = 0; li = 0; } + if (br > xmax) { br = xmax; re = 0; } + vr -= zilli; ar -= zilli; + if (vr < 0) { vr = 0; ob = 0; } + if (ar > ymax) { ar = ymax; un = 0; below = 1; } + if (hr > br) return; + if (vr > ar) return; + if (ob) setrect(hr, vr, br, vr); + if (li) setrect(hr, vr, hr, ar); + if (un) setrect(hr, ar, br, ar); + if (re) setrect(br, vr, br, ar); +} + +static ushort pkpos; +static uchar pkn1() { uchar Result; + Result = achm[pkpos]; pkpos++; return Result; +} +static short pki1() { short b; + b = pkn1(); if (b > 127) b -= 256; return b; +} +static short pkn2() { short b; + b = pkn1(); return (b * 256 + pkn1()); +} +static short pki2() { short b; + b = pkn1(); if (b > 127) b -= 256; + return (b * 256 + pkn1()); +} +static long pkn3() { long b; short c; + b = pkn1(); c = pkn1(); + return ((b * 256 + c) * 256 + pkn1()); +} +static long pki3() { long b; + b = pki1(); return (b * 65536L + pkn2()); +} +static long pki4() { long b; + b = pki2(); return (b * 65536L + pkn2()); +} +static void pkdef() { long a, l; ushort d; uchar b, bb; + uchar terminate; short i, j, c; fontdesc *WITH; chdesc *WITH1; + WITH = fontvect[fontint]; sprintf(STR, "%spk", FOFUL); + fprintf(prot,"preparing font %ld: %s", f, STR); + if( (fofil = fopen(STR, "rb"))==0) { + fprintf(prot," not found :-(\n"); + sprintf(STR, "%spk", FOLOC); + fprintf(prot,"preparing font %ld: %s", f, STR); + fofil = fopen(STR, "rb"); + } + if (fofil==0) { WITH->mch = -1; + fprintf(prot, " - file not found !\n"); return; + } + if ((fgetc(fofil)!=0xf7)||(fgetc(fofil)!=0x59)){ WITH->mch = -1; + fprintf(prot, " - not a PKfile !\n"); fclose(fofil); return; + } else { + fseek(fofil, 0L, 2); WITH->danf = ftell(fofil); + if (WITH->danf > 65520L) { WITH->mch = -1; fclose(fofil); + fprintf(prot, " - too big for this driver\n"); return; + } else { + Tptr( WITH->chv = (chdesc *)calloc(256, sizeof(chdesc)) ); + Tptr( achm = (uchar *)malloc(WITH->danf) ); + fseek(fofil, 0L, 0); fread(achm, WITH->danf, 1, fofil); + fclose(fofil); WITH->mch = -1; pkpos = 0; terminate = 0; + do { b = pkn1(); + if (b >= 240) { + switch (b) { + case 240: case 241: case 242: case 243: l = 0; + for (i = 240; i <= b; i++) l = (l << 8) + pkn1(); + pkpos += l; break; + case 244: pkpos += 4; break; + case 245: terminate = 1; break; + case 246: break; + case 247: b = pkn1(); i = pkn1(); + pkpos += i + 4; fofchk = pki4(); + if (chk != 0) if (fofchk != 0) if (chk != fofchk) + fprintf(prot, " *+* wrong checksum *+* "); + pkpos += 8; break; + case 248: case 249: case 250: case 251: + case 252: case 253: case 254: case 255: break; + } + } else { d = pkpos - 1; bb = b & 7; + switch (bb) { + case 0: case 1: case 2: case 3: + l = bb * 256 + pkn1() - 8; c = pkn1(); break; + case 4: case 5: case 6: l = bb - 4; + l = (l << 16) + pkn2() - 13; c = pkn1(); break; + case 7: l = pki4() - 28; c = pki4(); break; + } + WITH1 = &WITH->chv[c]; + switch (bb) { + case 0: case 1: case 2: case 3: + WITH1->U1.tfw = scaled(pkn3(), scf); pkn1(); + WITH1->U1.wid = pkn1(); WITH1->U1.hei = pkn1(); + WITH1->U1.hof = pki1(); WITH1->U1.vof = pki1(); break; + case 4: case 5: case 6: + WITH1->U1.tfw = scaled(pkn3(), scf); pkn2(); + WITH1->U1.wid = pkn2(); WITH1->U1.hei = pkn2(); + WITH1->U1.hof = pki2(); WITH1->U1.vof = pki2(); break; + case 7: + WITH1->U1.tfw = scaled(pki4(), scf); pki4(); pki4(); + WITH1->U1.wid = pki4(); WITH1->U1.hei = pki4(); + WITH1->U1.hof = pki4(); WITH1->U1.vof = pki4(); break; + } + pkpos += l; + if ((unsigned)c <= 255) { + if (WITH->mch < c) WITH->mch = c; + WITH->chv[c].U1.bmp = d; + } } } while (!terminate); free(achm); + if (WITH->mch < 0) fprintf(prot, " - PKfile in error !\n"); + else fprintf(prot, " - available\n"); + WITH->chv = (chdesc *) realloc(WITH->chv, 16*(WITH->mch + 1)); + Tptr( WITH->fonam = (char *) malloc(strlen(STR)+1) ); + strcpy(WITH->fonam, STR); +} } } +static struct { short xs, x, wid1; short ii, j; + uchar dd, db; ushort d; uchar white; uchar buf[xmb + 1]; + uchar bmerk; long repc, count; short dynf, dyng, dynh; +} Lpkc; +static uchar pknib() { uchar Result; + if (Lpkc.bmerk != 0) { + Result = Lpkc.bmerk & 0xf; Lpkc.bmerk = 0; return Result; + } + Lpkc.bmerk = pkn1(); Result = Lpkc.bmerk >> 4; + Lpkc.bmerk |= 0xf0; return Result; +} +static long pknum() { uchar i, j, k; long n; + k = 1; + do { i = pknib(); k++; + if (i == 0) { + do { j = pknib(); i++; } while (j == 0); + n = j; + while (i > 0) { i--; n = (n << 4) + pknib(); } + n += Lpkc.dyng; + } else if (i <= Lpkc.dynf) n = i; + else if (i < 14) n = (i << 4) + pknib() + Lpkc.dynh; + else if (i == 14) k = 0; + else { k = 1; n = 1; } + if (k == 1) Lpkc.repc = n; + } while (k != 2); return n; +} +static void pkline() { + if (Lpkc.dynf == 14) { + Lpkc.j = Lpkc.wid1 + Lpkc.xs; + Lpkc.db += Lpkc.xs; + do { + if (Lpkc.db < 8) Lpkc.d = (Lpkc.d << 8) | pkn1(); + else Lpkc.db -= 8; + Lpkc.dd = (Lpkc.d >> Lpkc.db) & 255; + if (Lpkc.j >= 8) { Lpkc.j -= 8; Lpkc.buf[Lpkc.x] = Lpkc.dd; + } else { Lpkc.db += 8 - Lpkc.j; + Lpkc.buf[Lpkc.x] = Lpkc.dd & (0xff00L >> Lpkc.j) & 255; + Lpkc.j = 0; + } Lpkc.x++; + } while (Lpkc.j != 0); + Lpkc.d &= 0xffffL >> (16 - Lpkc.db); return; + } + Lpkc.ii = 0; Lpkc.j = Lpkc.wid1; Lpkc.db = 8 - Lpkc.xs; Lpkc.d = 0; + if (Lpkc.repc > 0) { Lpkc.repc--; return; } + while (Lpkc.j > 0) { + if (Lpkc.count == 0) { Lpkc.count = pknum(); Lpkc.white = !Lpkc.white; } + Lpkc.dd = Lpkc.db; + if (Lpkc.dd > Lpkc.j) Lpkc.dd = Lpkc.j; + if (Lpkc.dd > Lpkc.count) Lpkc.dd = Lpkc.count; + if (Lpkc.white) Lpkc.db -= Lpkc.dd; + else { Lpkc.d += 1 << Lpkc.db; + Lpkc.db -= Lpkc.dd; Lpkc.d -= 1 << Lpkc.db; + } + Lpkc.count -= Lpkc.dd; Lpkc.j -= Lpkc.dd; + if (Lpkc.db == 0 || Lpkc.j == 0) { + Lpkc.buf[Lpkc.x] = Lpkc.d & 255; + Lpkc.x++; Lpkc.d = 0; Lpkc.db = 8; +} } } +static void pkchar() { short hr, vr; long bma, bmx; + short x1, x2, x3, y1, y2, y; uchar b, bb, mach, mac, mpm, bach; + fontdesc *WITH; chdesc *WITH1; + WITH = fontvect[fontint]; WITH1 = &WITH->chv[c]; + pkpos = WITH1->U1.bmp; b = pkn1(); + Lpkc.white = ((b & 8) == 0); Lpkc.wid1 = WITH1->U1.wid; + Lpkc.dynf = b >> 4; + Lpkc.dyng = (13 - Lpkc.dynf) * 16 + Lpkc.dynf - 15; + Lpkc.dynh = -(Lpkc.dynf + 1) * 15; bb = b & 7; + switch (bb) { + case 0: case 1: case 2: case 3: pkpos += 10; break; + case 4: case 5: case 6: pkpos += 16; break; + case 7: pkpos += 36; break; + } + Lpkc.bmerk = 0; Lpkc.d = 0; Lpkc.db = 0; Lpkc.repc = 0; + Lpkc.count = 0; Lpkc.white = !Lpkc.white; + switch (dviori) { + case 0: + hr = (long)(conv * h + 0.5) - WITH1->U1.hof; + vr = (long)(vconv * v + 0.5) - WITH1->U1.vof - zilli; + if (vr > ymax) below = 1; else { + if (vr + WITH1->U1.hei >= 1) { + x1 = hr / 8; x2 = (hr + WITH1->U1.wid - 1) / 8; + Lpkc.xs = hr & 7; y2 = vr + WITH1->U1.hei - 1; + if (y2 > ymax) { y2 = ymax; below = 1; } + if (0 <= x1) { + if (x2 <= xmb) { + for (y = vr; y <= y2; y++) { + Lpkc.x = x1; pkline(); + if (y >= 0) { + for (Lpkc.x = x1; Lpkc.x <= x2; Lpkc.x++) + pixet(y, Lpkc.x, Lpkc.buf[Lpkc.x]); + } } } } } } break; + case 1: + hr = (long)(conv * (landx + v) + 0.5) - WITH1->U1.vof; + vr = (long)(vconv * (landy - h) + 0.5) + WITH1->U1.hof - zilli; + if (vr - WITH1->U1.wid + 1 > ymax) below = 1; else { + if (vr >= 0) { Lpkc.xs = 0; mac = 0x80; bma = 0; y1 = vr; + if (y1 > ymax) { below = 1; bma += ((ulong)(y1 - ymax)) >> 3; + mac = 0x80 >> ((y1 - ymax) & 7); y1 = ymax; + } + y2 = vr - WITH1->U1.wid + 1; if (y2 < 0) y2 = 0; + x2 = hr + WITH1->U1.hei - 1; if (x2 > xmax) x2 = xmax; + for (x3 = hr; x3 <= x2; x3++) { + Lpkc.x = 0; pkline(); + if (x3 >= 0) { + mach = mac; Lpkc.x = ((unsigned)x3) >> 3; + mpm = 0x80 >> (x3 & 7); bmx = bma; bach = Lpkc.buf[bmx]; + for (y = y1; y >= y2; y--) { + if ((bach & mach) != 0) pixet(y, Lpkc.x, mpm); + mach >>= 1; + if (mach == 0) { + mach = 0x80; bmx++; bach = Lpkc.buf[bmx]; + } } } } } } break; + case 3: + hr = (long)(conv * (landx - v) + 0.5) + WITH1->U1.vof; + vr = (long)(vconv * (landy + h) + 0.5) - WITH1->U1.hof - zilli; + if (vr > ymax) below = 1; else { + if (vr + WITH1->U1.wid >= 1) { + Lpkc.xs = 0; mac = 0x80; bma = 0; y1 = vr; + if (y1 < 0) { bma += ((unsigned)(-y1)) >> 3; + mac = 0x80 >> ((-y1) & 7); y1 = 0; + } + y2 = vr + WITH1->U1.wid - 1; + if (y2 > ymax) { y2 = ymax; below = 1; } + x2 = hr - WITH1->U1.hei + 1; if (x2 < 0) x2 = 0; + for (x3 = hr; x3 >= x2; x3--) { + Lpkc.x = 0; pkline(); + if (x3 <= xmax) { + mach = mac; Lpkc.x = ((unsigned)x3) >> 3; + mpm = 0x80 >> (x3 & 7); bmx = bma; bach = Lpkc.buf[bmx]; + for (y = y1; y <= y2; y++) { + if ((bach & mach) != 0) pixet(y, Lpkc.x, mpm); + mach >>= 1; + if (mach == 0) { + mach = 0x80; bmx++; bach = Lpkc.buf[bmx]; + } } } } } } break; + case 2: + hr = (long)(conv * (landx - h) + 0.5) + WITH1->U1.hof; + vr = (long)(vconv * (landy - v) + 0.5) + WITH1->U1.vof - zilli; + if (vr - WITH1->U1.hei + 1 > ymax) below = 1; else { + if (vr >= 0) { + x1 = hr / 8; x2 = (hr - WITH1->U1.wid + 1) / 8; + Lpkc.xs = (7 - hr) & 7; y2 = vr - WITH1->U1.hei + 1; + if (y2 < 0) y2 = 0; + if (vr > ymax) below = 1; + if (0 <= x2) { + if (x1 <= xmb) { + for (y = vr; y >= y2; y--) { + Lpkc.x = xmb - x1; pkline(); + if (y <= ymax) { + for (Lpkc.x = x1; Lpkc.x >= x2; Lpkc.x--) + pixet(y, Lpkc.x, bitrev[Lpkc.buf[xmb - Lpkc.x]]); + } } } } } } break; +} } + +static void fontdef() { uchar a, b, p, q; fontdesc *WITH; + if (f < 0) baddvi("negative fontnumber"); + b = f & 0xff; a = 0; + if ((f > 255) || (fontvect[b] != NULL)) do { + if (fontvect[a] == NULL) b = a; + else if (fontvect[a]->dfn == f) baddvi("double fontnumber"); + a++; + } while (a); + if (fontvect[b] != NULL) baddvi("too many fonts"); + fontint = b; + Tptr( fontvect[b] = (fontdesc *)malloc(sizeof(fontdesc)) ); + WITH = fontvect[fontint]; WITH->dfn = f; + chk = dvinum(4); scf = dvinum(4); dsz = dvinum(4); + WITH->chm = NULL; WITH->fty = -1; + p = dvibyte(); q = dvibyte(); dvibytes(FONAM, q); + if (p == 0) strcpy(FOPRE, fontprefix); else dvibytes(FOPRE, p); + sprintf(FOMAG, "%ld", + (long)(xres * dvimag / 1000.0 * ((double)scf / dsz) + 0.5)); +#ifdef __MSDOS__ + sprintf(FOFUL, "%s%s\\%s.", FOPRE, FOMAG, FONAM); + sprintf(FOLOC, "%s.", FONAM); +#else + sprintf(FOFUL, "%s%s.%s", FOPRE, FONAM, FOMAG); + sprintf(FOLOC, "%s.%s", FONAM, FOMAG); +#endif + pkdef(); if (WITH->mch < 0) tfmdef(); +} + +static void fontlod() { uchar b = 0; + fontdesc *WITH = fontvect[fontint]; + WITH->chm = (uchar *)malloc(WITH->danf); + if (WITH->chm == NULL) { do { + if (fontvect[b] != NULL) { + if (fontvect[b]->chm) free(fontvect[b]->chm); + fontvect[b]->chm = NULL; + } b++; + } while (b); + Tptr( WITH->chm = (uchar *)malloc(WITH->danf) ); + } + fofil = fopen(WITH->fonam, "rb"); + fread(WITH->chm, WITH->danf, 1, fofil); fclose(fofil); +} + +static void fontset() { uchar a, b, x; + b = f & 0xff; x = 0; + if (fontvect[b] != NULL) if (fontvect[b]->dfn == f) x = 1; + if (x == 0) { a = 0; + do { + if (fontvect[a] == NULL) a++; + else if (fontvect[a]->dfn != f) a++; + else { x = 1; b = a; a = 0; } + } while (a != 0); + } + if (x == 0) baddvi("undefined fontnumber"); + fontint = b; +} +static void putrule() { short hr, vr, br, ar; + if (b <= 0) return; + switch (dviori) { + case 0: + hr = (long)(conv * h + 0.5); + vr = (long)(vconv * (v - a) + 0.5); + br = (long)(conv * b + 0.5); if (br > 0) br--; + ar = (long)(vconv * a + 0.5); + break; + case 1: + hr = (long)(conv * (landx + v - a) + 0.5); + vr = (long)(vconv * (landy - h - b) + 0.5); + br = (long)(conv * a + 0.5); + ar = (long)(vconv * b + 0.5); if (ar > 0) ar--; + break; + case 3: + hr = (long)(conv * (landx - v) + 0.5); + vr = (long)(vconv * (landy + h) + 0.5); + br = (long)(conv * a + 0.5); + ar = (long)(vconv * b + 0.5); if (ar > 0) ar--; + break; + case 2: + hr = (long)(conv * (landx - h - b) + 0.5); + vr = (long)(vconv * (landy - v) + 0.5); + br = (long)(conv * b + 0.5); if (br > 0) br--; + ar = (long)(vconv * a + 0.5); + break; + } + vr -= zilli; ar += vr; br += hr; + if (hr < 0) hr = 0; + if (br > xmax) br = xmax; + if (vr < 0) vr = 0; + if (ar > ymax) { ar = ymax; below = 1; } + if (hr <= br) if (vr <= ar) setrect(hr, vr, br, ar); +} +static void putchar_() { fontdesc *WITH; chdesc *WITH1; + WITH = fontvect[fontint]; + if (c > WITH->mch) { q = 0; return; } + WITH1 = &WITH->chv[c]; q = WITH1->U1.tfw; + if (WITH->fty == 1) { tfmchar(); return; } + if (WITH1->U1.bmp == 0) return; + if (WITH->chm == NULL) fontlod(); + achm = WITH->chm; pkchar(); +} +static void clrpxlmem() { short i; below = 0; + for (i = 0; i <= ymax; i++) + memset((ptr)pxlmem[i], 0, (xmb+1)*sizeof(colpix)); +} +static void pagebeg() { uchar j; greydesc *WITH; + for (j = 0; j <= 9; j++) cnt[j] = dvinum(4); + lpp = dvinum(4); pagnum++; + if (pagnum >= pag1) { started = 1; fprintf(prot, "[%d", pagnum); } + s = 0; w = 0; x = 0; y = 0; z = 0; zilli = 0; lz = 0; zoll = zoll0; + for (j = 0; j <= 7; j++) { WITH = &greymask[j]; WITH->maskc = 0; + WITH->maskm = 0; WITH->masky = 0; WITH->maskk = 0xff; + } + zoelli = ftell(dvifile); zoelli += (long)dvibufp - (long)dvibufe; + h = (long)((xres - hoff) / conv + 0.5); + v = (long)((yres - voff) / vconv + 0.5); + clrpxlmem(); +} +static void pageend() { + if (s != 0) fprintf(prot, "Stack not empty at EOP\n"); + if (!started) return; + hardcopy(); /* fprintf(prot, "/%d", (short)zoll); */ + if (zoll > 0 && below) { zoll--; dviposit(zoelli); + s = 0; w = 0; x = 0; y = 0; z = 0; zilli += ymax + 1; + h = (long)((xres - hoff) / conv + 0.5); + v = (long)((yres - voff) / vconv + 0.5); + clrpxlmem(); return; + } + hardform(); fprintf(prot, "]"); + paganz--; if (paganz <= 0) fini = 1; +} +static void deffont() { ushort l, m; + if (!post) { fontdef(); return; } + dviskip(12L); l = dvibyte(); m = dvibyte(); dviskip((long)(l + m)); +} +static void special() { long i, j, k; char *parm; + double x, y, cy, ma, ye, bl; short cle, m, n; + if (spl > 255) { fprintf(prot, "special >>"); + for (i = spl; i > 0; i--) fputc(dvibyte(), prot); + fprintf(prot, "<< ignored\n"); return; + } + dvibytes(comment, (int)spl); + if (!memcmp(comment, "landend", 7)) { dviori = 0; return; } + if (!memcmp(comment, "landstart", 9)) { + if (comment[10] == '1') dviori = 1; + else if (comment[10] == '0') dviori = 3; + else dviori = 2; + sscanf(comment+12, "%lg%lg", &x,&y); + j = (long)(x * 65535L + 0.5); + k = (long)(y * 65535L + 0.5); + switch (dviori) { + case 1: landx = h - v; landy = v + j + h; break; + case 3: landx = h + k + v; landy = v - h; break; + case 2: landx = h + h + k; landy = v + j + v; break; + } return; } + if (memcmp(comment, "color", 5)) { + fprintf(prot, "special >>%s<< ignored", comment); return; + } + parm = comment+6; + if (!memcmp(parm, "pop", 3)) { parm +=4; colst--; + if (colst < 0) { colst = 0; fprintf(prot, " color stack underflow"); } + } else { + if (!memcmp(parm, "push cmyk", 9)) { parm +=10; colst++; + if (colst > smax-1) { colst = smax-1; + fprintf(prot, " color stack overflow"); + } } + if (sscanf(parm,"%lg%lg%lg%lg",&cy,&ma,&ye,&bl)<4) { + fprintf(prot," color: cmyk values <%s> incomplete ",comment); return; + } + n = (long)(cy * maxink); if (n < 0) n = 0; + if (n > maxink) n = maxink; stackcy[colst] = n; + n = (long)(ma * maxink); if (n < 0) n = 0; + if (n > maxink) n = maxink; stackma[colst] = n; + n = (long)(ye * maxink); if (n < 0) n = 0; + if (n > maxink) n = maxink; stackye[colst] = n; + n = (long)(bl * maxink); if (n < 0) n = 0; + if (n > maxink) n = maxink; stackbl[colst] = n; + } + n = stackcy[colst]; cle = n; + for (m = 0; m <= 7; m++) greymask[m].maskc = maskb[n][0][m & 3]; + n = stackma[colst]; cle += n; + for (m = 0; m <= 7; m++) greymask[m].maskm = maskb[n][1][m & 3]; + n = stackye[colst]; cle += n; + for (m = 0; m <= 7; m++) greymask[m].masky = maskb[n][2][m & 3]; + n = stackbl[colst]; cle += n; + for (m = 0; m <= 7; m++) greymask[m].maskk = maskb[n][3][m & 3]; + clearing = (cle == 0); +} +static void preambl() { uchar l; + l = dvibyte(); num = dvinum(4); den = dvinum(4); + dvimag = dvinum(4); if (newmag != 0) dvimag = newmag; + conv = num / 254000.0 * ((double)xres / den) * (dvimag / 1000.0); + vconv = num / 254000.0 * ((double)yres / den) * (dvimag / 1000.0); + l = dvibyte(); dvibytes(comment, l); fprintf(prot, "%s\n", comment); +} +static void postamb() { + lpp = dvinum(4); num = dvinum(4); den = dvinum(4); + dvimag = dvinum(4); if (newmag != 0) dvimag = newmag; + conv = num / 254000.0 * ((double)xres / den) * (dvimag / 1000.0); + vconv = num / 254000.0 * ((double)yres / den) * (dvimag / 1000.0); + mxv = dvinum(4); mxh = dvinum(4); mst = dvinum(2); mpn = dvinum(2); +} +main(int argc, char **argv) { char *parm; + post = 0; fini = 0; started = 0; dviori = 0; pagnum = 0; + pag1 = 1; paganz = 9999; newmag = 0; q = 0; hoff = 78; voff = 156; + for (i = 0; i <= ymax; i++) { + Tptr( pxlmem[i] = (colpix *) malloc((xmb+1)*sizeof(colpix)) ); + } + Tptr( fontvect = (fontdesc **) calloc(256, 4) ); + initbitrev(); colst = 0; + stackcy[colst] = 0; stackma[colst] = 0; + stackye[colst] = 0; stackbl[colst] = maxink; + + fprintf(prot, "This is the HP Deskjet 550 Color TeX driver, V 94.01 .\n"); + fprintf(prot, "(C)opyright 1994 Wolfgang R. Mueller, Computing Centre,\n"); + fprintf(prot, "Heinrich-Heine-University Duesseldorf, Germany\n"); + if (argc == 1) { + fprintf(prot, "Please use with dvifilename and optional parameters\n"); + fprintf(prot, " -s<starting page> (default: 1 i.e. first in file)\n"); + fprintf(prot, " -c<number of pages> (default: 9999 i.e. all)\n"); + fprintf(prot, " -m<new magnification> (default: from DVIfile)\n"); + fprintf(prot, " -h<horizontal offset> (default: %ld (pixels)\n", hoff); + fprintf(prot, " -v<vertical offset> (default: %ld (pixels)\n", voff); + fprintf(prot, " -f<font directory> (default: %s)\n", fontprefix); + fprintf(prot, " -t<TFMfile directory> (default: %s)\n", tfmprefix); + fprintf(prot, " -o<outfile> (default: %s)\n", prfnam); + fprintf(prot, " prn for <outfile> goes directly to printer port,\n"); + fprintf(prot, " empty <outfile> part is replaced by <DVIfile>.pcl\n"); + exit(0); + } + strcpy(dviname, "texput"); + for (j = 1; j < argc; j++) { parm = argv[j]; + if (parm[0] != '-') { strcpy(dviname, parm); + } else { switch (parm[1]) { + case 's': case 'S': sscanf(parm+2, "%d", &pag1); break; + case 'c': case 'C': sscanf(parm+2, "%d", &paganz); break; + case 'f': case 'F': strcpy(fontprefix, parm+2); break; + case 't': case 'T': strcpy(tfmprefix, parm+2); break; + case 'm': case 'M': sscanf(parm+2, "%ld", &newmag); break; + case 'h': case 'H': sscanf(parm+2, "%ld", &hoff); break; + case 'v': case 'V': sscanf(parm+2, "%ld", &voff); break; + case 'o': case 'O': strcpy(prfnam, parm+2); break; + } } } + strcpy(defnam, dviname); prfeval(); dviopen(); postamb(); + do { o = dvibyte(); /* fprintf(prot, "(%u)", (ushort)o); */ + switch (o) { + case 128: case 129: case 130: case 131: + c = dvinum(o - 127); if (started) putchar_(); h += q; break; + case 132: a = dviint(4); b = dviint(4); + if (started) putrule(); h += b; break; + case 133: case 134: case 135: case 136: + c = dvinum(o - 132); if (started) putchar_(); break; + case 137: a = dviint(4); b = dviint(4); + if (started) putrule(); break; + case 138: break; + case 139: pagebeg(); break; + case 140: pageend(); break; + case 141: if (s < smax) { s++; hs[s - 1] = h; vs[s - 1] = v; + ws[s - 1] = w; xs[s - 1] = x; ys[s - 1] = y; zs[s - 1] = z; + } else baddvi("stack overflow"); break; + case 142: if (s > 0) { h = hs[s - 1]; v = vs[s - 1]; + w = ws[s - 1]; x = xs[s - 1]; y = ys[s - 1]; z = zs[s - 1]; s--; + } else baddvi("stack underflow"); break; + case 143: case 144: case 145: case 146: + h += dviint(o - 142); break; + case 147: h += w; break; + case 148: case 149: case 150: case 151: + w = dviint(o - 147); h += w; break; + case 152: h += x; break; + case 153: case 154: case 155: case 156: + x = dviint(o - 152); h += x; break; + case 157: case 158: case 159: case 160: + v += dviint(o - 156); break; + case 161: v += y; break; + case 162: case 163: case 164: case 165: + y = dviint(o - 161); v += y; break; + case 166: v += z; break; + case 167: case 168: case 169: case 170: + z = dviint(o - 166); v += z; break; + case 235: case 236: case 237: case 238: + f = dvinum(o - 234); if (started) fontset(); break; + case 239: case 240: case 241: case 242: + spl = dvinum(o - 238); special(); break; + case 243: case 244: case 245: case 246: + f = dvinum(o - 242); deffont(); break; + case 247: preambl(); break; + case 248: fini = 1; break; + case 249: dviposit(0L); post = 1; break; + case 250: case 251: case 252: + case 253: case 254: case 255: break; + default: + if (o <= 127) { + c = o; if (started) putchar_(); h += q; + } else if (o >= 171 && o <= 234) { + f = o - 171; if (started) fontset(); + } break; } } while (!fini); + fprintf(prot,"\n"); prclos(); fclose(dvifile); exit(0); +} diff --git a/dviware/dvidjc/example/coldoc.bat b/dviware/dvidjc/example/coldoc.bat new file mode 100644 index 0000000000..1fcae634d7 --- /dev/null +++ b/dviware/dvidjc/example/coldoc.bat @@ -0,0 +1,20 @@ +rem Das ist f"ur MS-DOS +rem Hoffentlich sitzen die Environmentvariablen richtig :-) +bm2font texlion.gif -u2 -an -wn -dn -jn -pn -flionb -kk +bm2font texlion.gif -u2 -an -wn -dn -jn -pn -flionc -kc +bm2font texlion.gif -u2 -an -wn -dn -jn -pn -flionm -km +bm2font texlion.gif -u2 -an -wn -dn -jn -pn -fliony -ky +bm2font fractal.gif -u2 -an -wn -dn -jn -pn -ffractb -kk +bm2font fractal.gif -u2 -an -wn -dn -jn -pn -ffractc -kc +bm2font fractal.gif -u2 -an -wn -dn -jn -pn -ffractm -km +bm2font fractal.gif -u2 -an -wn -dn -jn -pn -ffracty -ky +bm2font kreis.gif -an +bm2font vgaca.gif -u2 -an -wn -dn -jn -pn -fvgacab -kk +bm2font vgaca.gif -u2 -an -wn -dn -jn -pn -fvgacac -kc +bm2font vgaca.gif -u2 -an -wn -dn -jn -pn -fvgacam -km +bm2font vgaca.gif -u2 -an -wn -dn -jn -pn -fvgacay -ky +bm2font vgacb.gif -u2 -an -wn -dn -jn -pn -fvgacbb -kk +bm2font vgacb.gif -u2 -an -wn -dn -jn -pn -fvgacbc -kc +bm2font vgacb.gif -u2 -an -wn -dn -jn -pn -fvgacbm -km +bm2font vgacb.gif -u2 -an -wn -dn -jn -pn -fvgacby -ky +latex coldoc diff --git a/dviware/dvidjc/example/coldoc.tex b/dviware/dvidjc/example/coldoc.tex new file mode 100644 index 0000000000..bb2eacb79a --- /dev/null +++ b/dviware/dvidjc/example/coldoc.tex @@ -0,0 +1,451 @@ +\documentstyle[11pt,german,dina4,colordvi,colordjc,parskip]{article} +\begin{document} +\thispagestyle{empty} +\begin{center} +{\huge\sf Die DVIDJC--Treiber} + +\Large\sf f"ur die Tintenstrahldrucker\\ +DeskJet 500, DeskJet 500C und DeskJet 550C + +\large\sf Wolfgang R.~M"uller, Friedhelm Sowa\\ +Heinrich--Heine--Universit"at D"usseldorf\\ +Universit"atsrechenzentrum +\end{center} +\vfill +\huge +\hskip 30mm The Winner is ... + +\vspace{10mm} +\loadcmykpic[lionc,lionm,liony,lionb] +\centerline{\cmykpic[lionc,lionm,liony,lionb]} + +\vspace{10mm} +\hskip 70mm ...~\Huge\bf\TeX +\vfill +\normalsize +\newpage +\begin{abstract} +Die Treiberprogramme {\tt dvi500}, {\tt dvi500c} und {\tt dvi550c} +unterst"utzen die von Jim Hafner und Tom Rokicki eingef"uhrten +Spezifikationen zur Ausgabe von farbigem Text in einem \TeX{}--Doku"-ment. +Eine Modifikation von {\tt colordvi.sty} war jedoch insofern notwendig, +als die Kommandos zur Festlegung einer Farbe auf den Treiber {\tt dvips} +abgestimmt waren. Diese "Anderung wird mit {\tt colordjc.sty} vorgenommen. +Die Kompatibilit"at dieser nunmehr ger"ateunabh"angigen Definitionen zu +{\tt dvips} ist sichergestellt. + +Zusammen mit {\sf BM2FONT}, Version 3.0 vom Januar 1994, besteht die +M"oglichkeit, farbige Graphiken in den Text zu integrieren. Dazu wird +in vier Programml"aufen das Bild in seine Farbkomponenten Cyan, Magenta, +Gelb und Schwarz (cmyk) separiert. {\sf BM2FONT} erzeugt vier Abbildungen, +die gleiche Abmessungen haben und "ubereinandergelagert werden. +\end{abstract} + +\section*{Das dvidjc--Paket} + +Das Paket besteht aus dem Source--Code {\tt dvidjc.c}, einem Makefile +f"ur {\sc Unix}--Systeme sowie den analogen Dateien f"ur den GNU C--Compiler +und den Turbo--C--Compiler von Borland f"ur DOS--PC's. In den +Unterverzeichnissen {\tt djgpp} und {\tt turbo-c} sind die ausf"uhrbaren +Programme {\tt dvi500.exe}, {\tt dvi500c.exe} und {\tt dvi550c.exe} +enthalten. Das Unterverzeichnis {\tt example} beinhaltet diese Dokumentation +sowie alle erforderlichen Dateien, die zur Erzeugung dieser Dokumentation +notwendig sind. F"ur {\sc Unix} und MS--DOS stehen entsprechende Prozeduren +zur Verf"ugung. + +\begin{verbatim} +bm2font texlion.gif -u2 -wn -dn -jn -pn -flionb -kk +bm2font texlion.gif -u2 -wn -dn -jn -pn -flionc -kc +bm2font texlion.gif -u2 -wn -dn -jn -pn -flionm -km +bm2font texlion.gif -u2 -wn -dn -jn -pn -fliony -ky +bm2font kreis.gif +latex coldoc +\end{verbatim} + +Es wird davon ausgegangen, da"s {\sf BM2FONT} Version 3.0 zur Generierung +der Graphik--Zeichens"atze verwendet wird. Zum gegenw"artigen Zeitpunkt +(Feberuar 1994) steht noch kein aktualisiertes Handbuch zur Verf"ugung. +Aus diesem Grund erfolgt an dieser Stelle die Erl"auterung der Optionen +{\tt -j} und {\tt -k}: + +\begin{table}[hbt]\centering +\begin{tabular}{lp{120mm}} +{\tt -j}& F"ur farbige Graphiken ist es erforderlich, da"s die Farbausz"uge +gleiche Dimensionen haben. Bisherige Versionen von {\sf BM2FONT} haben +umrahmende wei"se Fl"achen, die aus nicht gesetzten Pixeln bestehen, +aus der Graphik entfernt. Dies ist bei Farbausz"ugen nicht sinnvoll, es mu"s +also die Option {-jn} benutzt werden.\\ +{\tt -k}& Hiermit wird f"ur die aktuelle Verarbeitung festgelegt, f"ur +welche Grundfarbe der Auszug angefertigt werden soll. Es steht {\tt -kk} +f"ur Schwarz, {\tt -kc} f"ur Cyan, {\tt -km} f"ur Magenta und {\tt -ky} f"ur +Gelb. +\end{tabular} +\end{table} + +Sowohl das {\tt dvidjc}--Paket als auch {\sf BM2FONT} sind auf dem +DANTE--Server {\tt ftp.dante.de} ver"-f"ug"-bar. In K"urze werden die +Softwarepakete auch auf dem zur Zeit noch im Aufbau befindlichen FTP--Server +{\tt ftp.rz.uni-duesseldorf.de} des Universit"atsrechenzentrums der +Heinrich--Heine--Universit"at D"us"-sel"-dorf bereit stehen. + +Aus aktuellem Anla"s sei darauf hingewiesen, da"s die "Ubernahme der Pakete +in eine Mailbox oder in den Bestand eines Public--Domain--Verlages nur +vollst"andig inklusive der Dokumentationen erfolgen darf. + +\section*{Die Optionen der Treiber} + +Bei Aufruf der Treiber ohne Parameter wird eine "Ubersicht der +unterst"utzten Optionen ausgegeben: + +\begin{verbatim} + -s<starting page> (default: 1 i.e. first in file) + -c<number of pages> (default: 9999 i.e. all) + -m<new magnification> (default: from DVIfile) + -h<horizontal offset> (default: 78 (pixels) + -v<vertical offset> (default: 156 (pixels) + -f<font directory> (default: /usr/TeX/lib/tex/fonts/) + -t<TFMfile directory> (default: /usr/TeX/lib/tex/fonts/) + -o<outfile> (default: prn) +\end{verbatim} + +Die Einstellungen f"ur den Offset sind mit {\tt testa4.tex} ermittelt +worden. F"ur abweichende Papierformate trifft diese Voreinstellung unter +Umst"anden nicht zu. + +Die Ausgabe geht bei Voreinstellung {\tt prn} unter MS--DOS auf den +Printerport, unter {\sc Unix} nach {\tt stdout}. Es empfiehlt sich also +unter {\sc Unix} {\tt dvi550c coldoc | lpr -Plpxyz -}, wenn die Ausgabe +direkt auf Papier erfolgen soll. + +\section*{Farbe ausw"ahlen} + +"Ublicherweise bedient man sich {\tt colordvi.sty} von Jim Hafner +und Tom Rokicki, um Farbe in \TeX{} zu bringen. Diese Makros sind +jedoch auf den PostScript--Treiber {\tt dvips} ausgerichtet, der +die CMYK--Anteile der im Stylefile vordefinierten Farben aus der +Datei {\tt color.pro} entnimmt, w"ahrend als Literal zum Beispiel f"ur +die Farbe \verb?\Red? im \verb?\special?--Kommando {\tt color push cmyk Red} +geschrieben wird. Da nicht unbedingt vorauszusetzen ist, da"s zu einem +DeskJet--Drucker {\tt color.pro} geh"ort, schien es sinnvoll zu sein, die +Definition f"ur \verb?\newColor? so abzu"andern, da"s schon in der DVI--Datei +die Information "uber die CMYK--Farbanteile enthalten ist. Dies wird in +{\tt colordjc.sty} vorgenommen: + +\begin{verbatim} +\def\newColor #1 #2{\expandafter\def\csname #1\endcsname##1{\special + {color push cmyk #2}##1\special{color pop}} + \expandafter\def\csname text#1\endcsname{\subdef{#1} + \special{color #1}}}% +\end{verbatim} + +Entsprechend sind die vordefinierten Farben mit zum Beispiel + +\begin{verbatim} +\newColor Mahogany {0 0.85 0.87 0.35 } +\newColor Maroon {0 0.87 0.68 0.32 } +\newColor BrickRed {0 0.89 0.94 0.28 } +\newColor Red {0 1 1 0 } +\newColor OrangeRed {0 1 0.50 0 } +\newColor RubineRed {0 1 0.13 0 } +\newColor WildStrawberry {0 0.96 0.39 0 } +\end{verbatim} + +\noindent festgelegt. Diese Farbanteile sind aus {\tt color.pro} entnommen. +Zu Anfang eines \LaTeX{}--Dokuments setzten die dvidjc--Treiber also +eine Stilbeschreibung voraus, die diese Modifikation aktiviert: + +\begin{center} +\verb?\documentstyle[...,?\Green{{\tt colordvi,colordjc}}\verb?,...]{article}? +\end{center} + +Um nun einen \Blue{Text} blau zu drucken, ist lediglich +\Color{0 1 1 0 }{{\tt\char92{}Blue\char123{}Text\char125}} anzugeben. +Der in den geschweiften Klammern gesetzte Text wird nach dem +{\em push and pop}--Prinzip gef"arbt, soda"s auch eine \Red{Schachtelung +\RoyalBlue{von} Farben} einfach m"oglich ist. Bei F"arbung gr"o"serer +Textpassagen ist im Fall von Seitenumbr"uchen nicht gew"ahrleistet, da"s +Kopf-- oder Fu"szeilen in der urspr"unglich vorgesehenen Farbe gedruckt +werden, da die Farbwahl nicht an einen Zeichensatz gebunden ist, sondern +auf den Text wirkt, der zwischen den Operationscodes f"ur \verb?\special? +in der DVI--Datei steht. + +\section*{Farbige Bilder} + +Die Integration von farbigen Abbildungen in \TeX{} und \LaTeX{} kann +in der gegenw"artigen Version nur "uber Farbausz"uge erfolgen, die +mit {\sf BM2FONT} erzeugt wurden. Im Augenblick ist noch nicht entschieden, +ob eine Unterst"utzung der \verb?\special?--Kommandos der Treiber aus dem +em\TeX{}--Paket implementiert werden soll oder auf eine normierte +Schnittstelle gewartet wird. + +In {\tt colordjc.sty} sind die Makros \verb?\cmykpic? und \verb?\fcmykpic? +definiert, die die Farbausz"uge mit oder ohne schwarze Umrandung +"ubereinander setzen. Als Argumente der Makros werden die Namen der +Farbausz"uge, getrennt durch Kommata, erwartet. Zuvor sind mit +\verb?\loadcmykpic? die Makros zum setzen der Ausz"uge zu laden. + +\begin{center} +\verb?\loadcmykpic[fractc,fractm,fracty,fractb]? +\end{center} + +\loadcmykpic[fractc,fractm,fracty,fractb] +\small +\begin{tabular}{|c|c|} +\hline +&\\ +\cmykpic[fractc,fractm,fracty,fractb]& +\fcmykpic[fractc,fractm,fracty,fractb]\\ +\verb?\cmykpic[fractc,fractm,fracty,fractb]?& +\verb?\fcmykpic[fractc,fractm,fracty,fractb]?\\ +\hline +\end{tabular} +\normalsize + +Wie bereits erw"ahnt, werden vom Treiber {\tt dvips} die modifizierten +Kommandos zur Farbauswahl unterst"utzt. Der generierte PostScript--Code +unterscheidet sich jedoch in der Wirkung bei der Ausgabe von den Ausdrucken, +die mit den dvidrv--Treibern erzeugt werden, wenn explizit --- wie im Fall +von Farbbildern --- Fl"achen in den Grundfarben Cyan, Magenta, Gelb oder +Schwarz "ubereinander gesetzt werden. Dazu ein Beispiel, wie es von +den dvidjc--Treibern erzeugt wird: + +\input kreis +\unitlength1mm +\begin{center} +\begin{picture}(127,52) +\put(0,12){ +\vbox to 30mm{\hsize=30mm\Yellow{\hrule height 30mm depth0pt}\vskip-30mm +\hrule height0pt depth0pt\vfill +\ \hfill{\Magenta{\huge\TeX}}\hfill\ \vfill}} +\put(35,17){\Cyan{\copy\kreisbox}} +\put(58,17){\Magenta{\copy\kreisbox}} +\put(45,0){\Yellow{\copy\kreisbox}} +\put(97,12){ +\vbox to 30mm{\hsize=30mm\Yellow{\hrule height 30mm depth0pt}\vskip-30mm% +\hrule height0pt depth0pt\vfill% +\ \hfill{\Cyan{\huge\LaTeX}}\hfill\ \vfill} +} +\end{picture} +\end{center} + +Die Abbildung zeigt links die Mischfarben, die enstehen, wenn Gelb und Magenta +"ubereinandergedruckt werden. In der Mitte zeigen die "uberlagerten Fl"achen +die Komplement"arfarben von Cyan, Magenta und Gelb. Hier ist anzumerken, +da"s beim DeskJet500 und auch bei Laserdruckern mit PCL--Unter"utzung die +Farben durch entsprechende Graustufen dargestellt werden. Rechts ist die +Mischung von Gelb und Cyan zu sehen. Aufgrund dieses Prinzips ergeben die +mit {\sf BM2FONT} erzeugten Abbildungen eine, den M"oglichkeiten der Drucker +entsprechende, nat"urliche Widergabe der Bilder. + +Die obige Abbildung, ausgegeben "uber {\tt dvips} auf einem +PostScript--Farbdrucker, sieht wie folgt aus: + +\begin{center} +\begin{picture}(127,52) +\put(0,12){\vbox to 30mm{\hsize=30mm\Yellow{\hrule height 30mm depth0pt}% +\vskip-30mm\hrule height0pt depth0pt\vfill +\ \hfill{\White{\huge\TeX}}\hfill\ \vfill +\hrule height0pt depth0pt\vskip-30mm +\hrule height0pt depth0pt\vfill +\ \hfill{\Magenta{\huge\TeX}}\hfill\ \vfill}} +\put(35,17){\Cyan{\copy\kreisbox}} +\put(58,17){\White{\copy\kreisbox}} +\put(58,17){\Magenta{\copy\kreisbox}} +\put(45,0){\White{\copy\kreisbox}} +\put(45,0){\Yellow{\copy\kreisbox}} +\put(97,12){ +\vbox to 30mm{\hsize=30mm\Yellow{\hrule height 30mm depth0pt}% +\vskip-30mm% +\hrule height0pt depth0pt\vfill% +\ \hfill{\White{\huge\LaTeX}}\hfill\ \vfill +\hrule height0pt depth0pt\vskip-30mm% +\hrule height0pt depth0pt\vfill% +\ \hfill{\Cyan{\huge\LaTeX}}\hfill\ \vfill} +} +\end{picture} +\end{center} + +Es enstehen keine Mischfarben, weil PostScript die Fl"achen nicht +transparent "ubereinander setzt. Dies ist der Grund, warum farbige +Komponenten nicht in gleicher Weise von {\tt dvips} und den dvidjc--Treibern +widergegeben werden, wenn sie explizit "ubereinandergesetzt werden. +Um mit den dvidjc--Treibern gleiche Effekte wie mit {\tt dvips} zu erzielen, +ist das vorherige Ausstanzen einer Fl"ache notwendig, um dorthinein den +Text der anderen Farbe zu setzen. Dies wurde in obiger Abbildung innerhalb +einer \LaTeX{}--picture--Umgebung f"ur die linke Fl"ache wie folgt realisiert: + +\begin{verbatim} +\put(0,12){\vbox to 30mm{\hsize=30mm\Yellow{\hrule height 30mm depth0pt}% +\vskip-30mm\hrule height0pt depth0pt\vfill +\ \hfill{\White{\huge\TeX}}\hfill\ \vfill +\hrule height0pt depth0pt\vskip-30mm +\hrule height0pt depth0pt\vfill +\ \hfill{\Magenta{\huge\TeX}}\hfill\ \vfill}} +\end{verbatim} + +Die Kreise wurden mit den folgenden Kommandos in die Abbildung gesetzt: + +\begin{verbatim} +\put(35,17){\Cyan{\copy\kreisbox}} +\put(58,17){\White{\copy\kreisbox}} +\put(58,17){\Magenta{\copy\kreisbox}} +\put(45,0){\White{\copy\kreisbox}} +\put(45,0){\Yellow{\copy\kreisbox}} +\end{verbatim} + +\section*{Farbenpracht} + +\advance\textwidth 5mm +\advance\hsize 5mm +\begin{tabular}{|l|llll|l|llll|} +\hline +Farbe&\multicolumn{4}{c|}{Farbanteile}& +Farbe&\multicolumn{4}{c|}{Farbanteile}\\ +\cline{2-5}\cline{7-10} + &c&m&y&k& &c&m&y&k\\ +\hline +{\bf\GreenYellow{GreenYellow}} &0.15&0&0.69&0& +{\bf\Yellow{Yellow}} &0&0&1&0\\ +{\bf\Goldenrod{Goldenrod}} &0&0.10&0.84&0& +{\bf\Dandelion{Dandelion}} &0&0.29&0.84&0\\ +{\bf\Apricot{Apricot}} &0&0.32&0.52&0& +{\bf\Peach{Peach}} &0&0.50&0.70&0\\ +{\bf\Melon{Melon}} &0&0.46&0.50&0& +{\bf\YellowOrange{YellowOrange}} &0&0.42&1&0\\ +{\bf\Orange{Orange}} &0&0.61&0.87&0& +{\bf\BurntOrange{BurntOrange}} &0&0.51&1&0\\ +{\bf\Bittersweet{Bittersweet}} &0&0.75&1&0.24& +{\bf\RedOrange{RedOrange}} &0&0.77&0.87&0\\ +{\bf\Mahogany{Mahogany}} &0&0.85&0.87&0.35& +{\bf\Maroon{Maroon}} &0&0.87&0.68&0.32\\ +{\bf\BrickRed{BrickRed}} &0&0.89&0.94&0.2& +{\bf\Red{Red}} &0&1&1&0\\ +{\bf\OrangeRed{OrangeRed}} &0&1&0.50&0& +{\bf\RubineRed{RubineRed}} &0&1&0.13&0\\ +{\bf\WildStrawberry{WildStrawberry}} &0&0.96&0.39&0& +{\bf\Salmon{Salmon}} &0&0.53&0.38&0\\ +{\bf\CarnationPink{CarnationPink}} &0&0.63&0&0& +{\bf\Magenta{Magenta}} &0&1&0&0\\ +{\bf\VioletRed{VioletRed}} &0&0.81&0&0& +{\bf\Rhodamine{Rhodamine}} &0&0.82&0&0\\ +{\bf\Mulberry{Mulberry}} &0.34&0.90&0&0.02& +{\bf\RedViolet{RedViolet}} &0.07&0.90&0&0.34\\ +{\bf\Fuchsia{Fuchsia}} &0.47&0.91&0&0.0& +{\bf\Lavender{Lavender}} &0&0.48&0&0\\ +{\bf\Thistle{Thistle}} &0.12&0.59&0&0& +{\bf\Orchid{Orchid}} &0.32&0.64&0&0\\ +{\bf\DarkOrchid{DarkOrchid}} &0.40&0.80&0.20&0& +{\bf\Purple{Purple}} &0.45&0.86&0&0\\ +{\bf\Plum{Plum}} &0.50&1&0&0& +{\bf\Violet{Violet}} &0.79&0.88&0&0\\ +{\bf\RoyalPurple{RoyalPurple}} &0.75&0.90&0&0& +{\bf\BlueViolet{BlueViolet}} &0.86&0.91&0&0.0\\ +{\bf\Periwinkle{Periwinkle}} &0.57&0.55&0&0& +{\bf\CadetBlue{CadetBlue}} &0.62&0.57&0.23&0\\ +{\bf\CornflowerBlue{CornflowerBlue}} &0.65&0.13&0&0& +{\bf\MidnightBlue{MidnightBlue}} &0.98&0.13&0&0.43\\ +{\bf\NavyBlue{NavyBlue}} &0.94&0.54&0&0& +{\bf\RoyalBlue{RoyalBlue}} &1&0.50&0&0\\ +{\bf\Blue{Blue}} &1&1&0&0& +{\bf\Cerulean{Cerulean}} &0.94&0.11&0&0\\ +{\bf\Cyan{Cyan}} &1&0&0&0& +{\bf\ProcessBlue{ProcessBlue}} &0.96&0&0&0\\ +{\bf\SkyBlue{SkyBlue}} &0.62&0&0.12&0& +{\bf\Turquoise{Turquoise}} &0.85&0&0.20&0\\ +{\bf\TealBlue{TealBlue}} &0.86&0&0.34&0.02& +{\bf\Aquamarine{Aquamarine}} &0.82&0&0.30&0\\ +{\bf\BlueGreen{BlueGreen}} &0.85&0&0.33&0& +{\bf\Emerald{Emerald}} &1&0&0.50&0\\ +{\bf\JungleGreen{JungleGreen}} &0.99&0&0.52&0& +{\bf\SeaGreen{SeaGreen}} &0.69&0&0.50&0\\ +{\bf\Green{Green}} &1&0&1&0& +{\bf\ForestGreen{ForestGreen}} &0.91&0&0.88&0.12\\ +{\bf\PineGreen{PineGreen}} &0.92&0&0.59&0.2& +{\bf\LimeGreen{LimeGreen}} &0.50&0&1&0\\ +{\bf\YellowGreen{YellowGreen}} &0.44&0&0.74&0& +{\bf\SpringGreen{SpringGreen}} &0.26&0&0.76&0\\ +{\bf\OliveGreen{OliveGreen}} &0.64&0&0.95&0.40& +{\bf\RawSienna{RawSienna}} &0&0.72&1&0.45\\ +{\bf\Sepia{Sepia}} &0&0.83&1&0.70& +{\bf\Brown{Brown}} &0&0.81&1&0.60\\ +{\bf\Tan{Tan}} &0.14&0.42&0.56&0& +{\bf\Gray{Gray}} &0&0&0&0.50\\ +{\bf\Black{Black}} &0&0&0&1& +{\bf\White{White}} &0&0&0&0\\ +\hline +\end{tabular} +\newpage + +\section*{Preview} + +F"ur DOS--PC's steht der Previewer {\tt dvivgac.exe} zur Verf"ugung, +der in gleicher Weise wie die DVIDJC--Treiber die Farb--\verb?\special?'s von +{\tt colordjc.sty} unterst"utzt. Die Optionen des Previewers entsprechen +denen der Druckertreiber. Nach dem Aufruf des Programms wird die erste +Seite des Dokuments angezeigt, rechts erscheinen Hinweise zur Handhabung +w"ahrend der Anzeige. +\vfill +\loadcmykpic[vgacac,vgacam,vgacay,vgacab] +\centerline{\fcmykpic[vgacac,vgacam,vgacay,vgacab]} +\vfill +Nach Bet"atigung einer Taste zur Steuerung der Lupe wird rechts der +aktuell gew"ahlte Bildausschnitt angezeigt, in der Gesamtansicht +dargestellt durch ein umrandetes Rechteck. +\vfill +\loadcmykpic[vgacbc,vgacbm,vgacby,vgacbb] +\centerline{\fcmykpic[vgacbc,vgacbm,vgacby,vgacbb]} +\newpage +Der Quellcode von {\tt dvivgac.c}, der zusammen mit der Quelle der +DVIDJC--Treiber bereitgestellt wird, soll als Anregung f"ur die +Weiterentwicklung existierender Previewer dienen, die in Zukunft +vielleicht h"ohere Aufl"osungen der verschiedenen Graphikkarten +unterst"utzen. Dies ist sicherlich deswegen angebracht, weil {\tt dvivgac} +nur eine Aufl"osung von {\tt 640 x 480} verwendet und demzufolge +zwar ein "Uberblick "uber den Aufbau einer Seite geben kann, die +Lesbarkeit aber W"unsche offen l"a"st. + +\section*{Umfang der Distribution} + +\begin{table}[htb]\centering +\begin{tabular}{|l|l|} +\hline +{\tt Makefile }& {\bf f"ur Unix}\\ +{\tt README.dvidjc }& \\ +{\tt dvidjc.c }& Quelle \\ +\hline +{\tt djgpp/ }& {\bf f"ur GCC--Fans}\\ +{\tt djgpp/Makefile.dos }& \\ +{\tt djgpp/dvi500.exe }& Schwarz--Wei"s\\ +{\tt djgpp/dvi500c.exe }& CMY\\ +{\tt djgpp/dvi550c.exe }& CMYK\\ +{\tt djgpp/dvidjc.c }& Quelle mit CRLF\\ +\hline +{\tt turbo-c/ }& {\bf f"ur Ungeduldige}\\ +{\tt turbo-c/dvi500.exe }& Schwarz--Wei"s\\ +{\tt turbo-c/dvi500c.exe }& CMY\\ +{\tt turbo-c/dvi550c.exe }& CMYK\\ +{\tt turbo-c/dvivgac.exe }& Previewer\\ +{\tt turbo-c/maketcc.bat }& \\ +{\tt turbo-c/makevga.bat }& \\ +{\tt turbo-c/dvidjc.c }& Quelle mit CRLF\\ +{\tt turbo-c/dvivgac.c }& Quelle des Previewers\\ +\hline +{\tt example/ }& {\bf Dokumentation}\\ +{\tt example/gencoldoc }& Erzeugt die Doku\\ +{\tt example/coldoc.bat }& dito unter DOS\\ +{\tt example/coldoc.tex }& \\ +{\tt example/colordjc.sty}& \\ +{\tt example/parskip.sty }& \\ +{\tt example/colordjc.tex}& \\ +{\tt example/fractal.gif }& Bilder\\ +{\tt example/kreis.gif }& zur\\ +{\tt example/texlion.gif }& Dokumentation\\ +{\tt example/vgaca.gif }& Screendump des Previews\\ +{\tt example/vgacb.gif }& Screendump mit Lupe\\ +\hline +\end{tabular} +\end{table} +\vfill +\noindent Wolfgang R.~M"uller\hfill Friedhelm Sowa\\ +{\em wolfgang@uni-duesseldorf.de\hfill sowa@convex.rz.uni-duesseldorf.de} +\end{document} diff --git a/dviware/dvidjc/example/colordjc.sty b/dviware/dvidjc/example/colordjc.sty new file mode 100644 index 0000000000..f4eed8efb3 --- /dev/null +++ b/dviware/dvidjc/example/colordjc.sty @@ -0,0 +1,129 @@ +% This is COLORDJC.STY(TEX) in text format, as of January 12, 1994, +% by Friedhelm Sowa, sowa@convex.rz.uni-duesseldorf.de +% The macros guarantee compatibility between the dvips driver +% and the dvidjc driver. +% +% Base is colordvi.sty, written by Jim Hafner, modified by Tom Rokicki. +% +\def\newColor #1 #2{\expandafter\def\csname #1\endcsname##1{\special + {color push cmyk #2}##1\special{color pop}} + \expandafter\def\csname text#1\endcsname{\subdef{#1} + \special{color #1}}}% +% +% Here are the color names and their PANTONE match (approximately) +% +\newColor GreenYellow {0.15 0 0.69 0 } % GreenYellow Approximate PANTONE 388 +\newColor Yellow {0 0 1 0 } % Yellow Approximate PANTONE YELLOW +\newColor Goldenrod {0 0.10 0.84 0 } % Goldenrod Approximate PANTONE 109 +\newColor Dandelion {0 0.29 0.84 0 } % Dandelion Approximate PANTONE 123 +\newColor Apricot {0 0.32 0.52 0 } % Apricot Approximate PANTONE 1565 +\newColor Peach {0 0.50 0.70 0 } % Peach Approximate PANTONE 164 +\newColor Melon {0 0.46 0.50 0 } % Melon Approximate PANTONE 177 +\newColor YellowOrange {0 0.42 1 0 } % YellowOrange Approximate PANTONE 130 +\newColor Orange {0 0.61 0.87 0 } % Orange Approximate PANTONE ORANGE-021 +\newColor BurntOrange {0 0.51 1 0 } % BurntOrange Approximate PANTONE 388 +\newColor Bittersweet {0 0.75 1 0.24 } % Bittersweet Approximate PANTONE 167 +\newColor RedOrange {0 0.77 0.87 0 } % RedOrange Approximate PANTONE 179 +\newColor Mahogany {0 0.85 0.87 0.35 } % Mahogany Approximate PANTONE 484 +\newColor Maroon {0 0.87 0.68 0.32 } % Maroon Approximate PANTONE 201 +\newColor BrickRed {0 0.89 0.94 0.28 } % BrickRed Approximate PANTONE 1805 +\newColor Red {0 1 1 0 } % Red VERY-Approx PANTONE RED +\newColor OrangeRed {0 1 0.50 0 } % OrangeRed No PANTONE match +\newColor RubineRed {0 1 0.13 0 } % RubineRed Approximate PANTONE RUBINE-RED +\newColor WildStrawberry {0 0.96 0.39 0 } % WildStrawberry Approximate PANTONE 206 +\newColor Salmon {0 0.53 0.38 0 } % Salmon Approximate PANTONE 183 +\newColor CarnationPink {0 0.63 0 0 } % CarnationPink Approximate PANTONE 218 +\newColor Magenta {0 1 0 0 } % Magenta Approximate PANTONE PROCESS-MAGENTA +\newColor VioletRed {0 0.81 0 0 } % VioletRed Approximate PANTONE 219 +\newColor Rhodamine {0 0.82 0 0 } % Rhodamine Approximate PANTONE RHODAMINE-RED +\newColor Mulberry {0.34 0.90 0 0.02 } % Mulberry Approximate PANTONE 241 +\newColor RedViolet {0.07 0.90 0 0.34 } % RedViolet Approximate PANTONE 234 +\newColor Fuchsia {0.47 0.91 0 0.08 } % Fuchsia Approximate PANTONE 248 +\newColor Lavender {0 0.48 0 0 } % Lavender Approximate PANTONE 223 +\newColor Thistle {0.12 0.59 0 0 } % Thistle Approximate PANTONE 245 +\newColor Orchid { 0.32 0.64 0 0 } % Orchid Approximate PANTONE 252 +\newColor DarkOrchid {0.40 0.80 0.20 0 } % DarkOrchid No PANTONE match +\newColor Purple {0.45 0.86 0 0 } % Purple Approximate PANTONE PURPLE +\newColor Plum {0.50 1 0 0 } % Plum VERY-Approx PANTONE 518 +\newColor Violet {0.79 0.88 0 0 } % Violet Approximate PANTONE VIOLET +\newColor RoyalPurple {0.75 0.90 0 0 } % RoyalPurple Approximate PANTONE 267 +\newColor BlueViolet {0.86 0.91 0 0.04 } % BlueViolet Approximate PANTONE 2755 +\newColor Periwinkle {0.57 0.55 0 0 } % Periwinkle Approximate PANTONE 2715 +\newColor CadetBlue {0.62 0.57 0.23 0 } % CadetBlue Approximate PANTONE (534+535)/2 +\newColor CornflowerBlue {0.65 0.13 0 0 } % CornflowerBlue Approximate PANTONE 292 +\newColor MidnightBlue {0.98 0.13 0 0.43 }% MidnightBlue Approximate PANTONE 302 +\newColor NavyBlue {0.94 0.54 0 0 } % NavyBlue Approximate PANTONE 293 +\newColor RoyalBlue {1 0.50 0 0 } % RoyalBlue No PANTONE match +\newColor Blue {1 1 0 0 } % Blue Approximate PANTONE BLUE-072 +\newColor Cerulean {0.94 0.11 0 0 } % Cerulean Approximate PANTONE 3005 +\newColor Cyan {1 0 0 0 } % Cyan Approximate PANTONE PROCESS-CYAN +\newColor ProcessBlue {0.96 0 0 0 } % ProcessBlue Approximate PANTONE PROCESS-BLUE +\newColor SkyBlue {0.62 0 0.12 0 } % SkyBlue Approximate PANTONE 2985 +\newColor Turquoise {0.85 0 0.20 0 } % Turquoise Approximate PANTONE (312+313)/2 +\newColor TealBlue {0.86 0 0.34 0.02 } % TealBlue Approximate PANTONE 3145 +\newColor Aquamarine {0.82 0 0.30 0 } % Aquamarine Approximate PANTONE 3135 +\newColor BlueGreen {0.85 0 0.33 0 } % BlueGreen Approximate PANTONE 320 +\newColor Emerald {1 0 0.50 0 } % Emerald No PANTONE match +\newColor JungleGreen {0.99 0 0.52 0 } % JungleGreen Approximate PANTONE 328 +\newColor SeaGreen {0.69 0 0.50 0 } % SeaGreen Approximate PANTONE 3268 +\newColor Green {1 0 1 0 } % Green VERY-Approx PANTONE GREEN +\newColor ForestGreen {0.91 0 0.88 0.12 } % ForestGreen Approximate PANTONE 349 +\newColor PineGreen {0.92 0 0.59 0.25 } % PineGreen Approximate PANTONE 323 +\newColor LimeGreen {0.50 0 1 0 } % LimeGreen No PANTONE match +\newColor YellowGreen {0.44 0 0.74 0 } % YellowGreen Approximate PANTONE 375 +\newColor SpringGreen {0.26 0 0.76 0 } % SpringGreen Approximate PANTONE 381 +\newColor OliveGreen {0.64 0 0.95 0.40 } % OliveGreen Approximate PANTONE 582 +\newColor RawSienna {0 0.72 1 0.45 } % RawSienna Approximate PANTONE 154 +\newColor Sepia {0 0.83 1 0.70 } % Sepia Approximate PANTONE 161 +\newColor Brown {0 0.81 1 0.60 } % Brown Approximate PANTONE 1615 +\newColor Tan {0.14 0.42 0.56 0 } % Tan No PANTONE match +\newColor Gray {0 0 0 0.50 } % Gray Approximate PANTONE COOL-GRAY-8 +\newColor Black {0 0 0 1 } % Black Approximate PANTONE PROCESS-BLACK +\newColor White {0 0 0 0 } % White No PANTONE match + +% Now we make sure that we initialize the global color to Black +\subdef{Black} + +% Here we have a macro for typesetting a coloured graphic. Colour +% separation is assumed to be done by bm2font version 3.0. +% When using bitmap files instead of TeXfonts it should work in a +% similar way. +\def\loadcmykpic[#1,#2,#3,#4]{ +\input{#1} +\input{#2} +\input{#3} +\input{#4} +} + +\def\cmykpic[#1,#2,#3,#4]{% +\ifvmode\leavevmode\fi +\dimen0\expandafter\ht\csname #4box\endcsname% +\vbox to\dimen0{\hsize=\wd0\offinterlineskip\parindent0pt% +\Cyan{\expandafter\copy\csname #1box\endcsname}\vskip-\dimen0 +\Magenta{\expandafter\copy\csname #2box\endcsname}\vskip-\dimen0 +\Yellow{\expandafter\copy\csname #3box\endcsname}\vskip-\dimen0 +\Black{\expandafter\copy\csname #4box\endcsname}\vss} +} + +\def\fcmykpic[#1,#2,#3,#4]{% +\ifvmode\leavevmode\fi +\dimen0\expandafter\ht\csname #4box\endcsname +\ifx\frame\undefined +\vbox{% +\hsize\expandafter\wd\csname #4box\endcsname +\advance\hsize .8pt \hrule% +\hbox to\hsize% +{\vrule\hfill\vbox to\dimen0{\offinterlineskip% +\Cyan{\expandafter\copy\csname #1box\endcsname}\vskip-\dimen0 +\Magenta{\expandafter\copy\csname #2box\endcsname}\vskip-\dimen0 +\Yellow{\expandafter\copy\csname #3box\endcsname}\vskip-\dimen0 +\Black{\expandafter\copy\csname #4box\endcsname} +}\hfill\vrule}\hrule\vss} +\else +\frame{\vbox to\dimen0{\hsize=\wd0\offinterlineskip% +\Cyan{\expandafter\copy\csname #1box\endcsname}\vskip-\dimen0 +\Magenta{\expandafter\copy\csname #2box\endcsname}\vskip-\dimen0 +\Yellow{\expandafter\copy\csname #3box\endcsname}\vskip-\dimen0 +\Black{\expandafter\copy\csname #4box\endcsname}\vss}} +\fi +} diff --git a/dviware/dvidjc/example/colordjc.tex b/dviware/dvidjc/example/colordjc.tex new file mode 100644 index 0000000000..f4eed8efb3 --- /dev/null +++ b/dviware/dvidjc/example/colordjc.tex @@ -0,0 +1,129 @@ +% This is COLORDJC.STY(TEX) in text format, as of January 12, 1994, +% by Friedhelm Sowa, sowa@convex.rz.uni-duesseldorf.de +% The macros guarantee compatibility between the dvips driver +% and the dvidjc driver. +% +% Base is colordvi.sty, written by Jim Hafner, modified by Tom Rokicki. +% +\def\newColor #1 #2{\expandafter\def\csname #1\endcsname##1{\special + {color push cmyk #2}##1\special{color pop}} + \expandafter\def\csname text#1\endcsname{\subdef{#1} + \special{color #1}}}% +% +% Here are the color names and their PANTONE match (approximately) +% +\newColor GreenYellow {0.15 0 0.69 0 } % GreenYellow Approximate PANTONE 388 +\newColor Yellow {0 0 1 0 } % Yellow Approximate PANTONE YELLOW +\newColor Goldenrod {0 0.10 0.84 0 } % Goldenrod Approximate PANTONE 109 +\newColor Dandelion {0 0.29 0.84 0 } % Dandelion Approximate PANTONE 123 +\newColor Apricot {0 0.32 0.52 0 } % Apricot Approximate PANTONE 1565 +\newColor Peach {0 0.50 0.70 0 } % Peach Approximate PANTONE 164 +\newColor Melon {0 0.46 0.50 0 } % Melon Approximate PANTONE 177 +\newColor YellowOrange {0 0.42 1 0 } % YellowOrange Approximate PANTONE 130 +\newColor Orange {0 0.61 0.87 0 } % Orange Approximate PANTONE ORANGE-021 +\newColor BurntOrange {0 0.51 1 0 } % BurntOrange Approximate PANTONE 388 +\newColor Bittersweet {0 0.75 1 0.24 } % Bittersweet Approximate PANTONE 167 +\newColor RedOrange {0 0.77 0.87 0 } % RedOrange Approximate PANTONE 179 +\newColor Mahogany {0 0.85 0.87 0.35 } % Mahogany Approximate PANTONE 484 +\newColor Maroon {0 0.87 0.68 0.32 } % Maroon Approximate PANTONE 201 +\newColor BrickRed {0 0.89 0.94 0.28 } % BrickRed Approximate PANTONE 1805 +\newColor Red {0 1 1 0 } % Red VERY-Approx PANTONE RED +\newColor OrangeRed {0 1 0.50 0 } % OrangeRed No PANTONE match +\newColor RubineRed {0 1 0.13 0 } % RubineRed Approximate PANTONE RUBINE-RED +\newColor WildStrawberry {0 0.96 0.39 0 } % WildStrawberry Approximate PANTONE 206 +\newColor Salmon {0 0.53 0.38 0 } % Salmon Approximate PANTONE 183 +\newColor CarnationPink {0 0.63 0 0 } % CarnationPink Approximate PANTONE 218 +\newColor Magenta {0 1 0 0 } % Magenta Approximate PANTONE PROCESS-MAGENTA +\newColor VioletRed {0 0.81 0 0 } % VioletRed Approximate PANTONE 219 +\newColor Rhodamine {0 0.82 0 0 } % Rhodamine Approximate PANTONE RHODAMINE-RED +\newColor Mulberry {0.34 0.90 0 0.02 } % Mulberry Approximate PANTONE 241 +\newColor RedViolet {0.07 0.90 0 0.34 } % RedViolet Approximate PANTONE 234 +\newColor Fuchsia {0.47 0.91 0 0.08 } % Fuchsia Approximate PANTONE 248 +\newColor Lavender {0 0.48 0 0 } % Lavender Approximate PANTONE 223 +\newColor Thistle {0.12 0.59 0 0 } % Thistle Approximate PANTONE 245 +\newColor Orchid { 0.32 0.64 0 0 } % Orchid Approximate PANTONE 252 +\newColor DarkOrchid {0.40 0.80 0.20 0 } % DarkOrchid No PANTONE match +\newColor Purple {0.45 0.86 0 0 } % Purple Approximate PANTONE PURPLE +\newColor Plum {0.50 1 0 0 } % Plum VERY-Approx PANTONE 518 +\newColor Violet {0.79 0.88 0 0 } % Violet Approximate PANTONE VIOLET +\newColor RoyalPurple {0.75 0.90 0 0 } % RoyalPurple Approximate PANTONE 267 +\newColor BlueViolet {0.86 0.91 0 0.04 } % BlueViolet Approximate PANTONE 2755 +\newColor Periwinkle {0.57 0.55 0 0 } % Periwinkle Approximate PANTONE 2715 +\newColor CadetBlue {0.62 0.57 0.23 0 } % CadetBlue Approximate PANTONE (534+535)/2 +\newColor CornflowerBlue {0.65 0.13 0 0 } % CornflowerBlue Approximate PANTONE 292 +\newColor MidnightBlue {0.98 0.13 0 0.43 }% MidnightBlue Approximate PANTONE 302 +\newColor NavyBlue {0.94 0.54 0 0 } % NavyBlue Approximate PANTONE 293 +\newColor RoyalBlue {1 0.50 0 0 } % RoyalBlue No PANTONE match +\newColor Blue {1 1 0 0 } % Blue Approximate PANTONE BLUE-072 +\newColor Cerulean {0.94 0.11 0 0 } % Cerulean Approximate PANTONE 3005 +\newColor Cyan {1 0 0 0 } % Cyan Approximate PANTONE PROCESS-CYAN +\newColor ProcessBlue {0.96 0 0 0 } % ProcessBlue Approximate PANTONE PROCESS-BLUE +\newColor SkyBlue {0.62 0 0.12 0 } % SkyBlue Approximate PANTONE 2985 +\newColor Turquoise {0.85 0 0.20 0 } % Turquoise Approximate PANTONE (312+313)/2 +\newColor TealBlue {0.86 0 0.34 0.02 } % TealBlue Approximate PANTONE 3145 +\newColor Aquamarine {0.82 0 0.30 0 } % Aquamarine Approximate PANTONE 3135 +\newColor BlueGreen {0.85 0 0.33 0 } % BlueGreen Approximate PANTONE 320 +\newColor Emerald {1 0 0.50 0 } % Emerald No PANTONE match +\newColor JungleGreen {0.99 0 0.52 0 } % JungleGreen Approximate PANTONE 328 +\newColor SeaGreen {0.69 0 0.50 0 } % SeaGreen Approximate PANTONE 3268 +\newColor Green {1 0 1 0 } % Green VERY-Approx PANTONE GREEN +\newColor ForestGreen {0.91 0 0.88 0.12 } % ForestGreen Approximate PANTONE 349 +\newColor PineGreen {0.92 0 0.59 0.25 } % PineGreen Approximate PANTONE 323 +\newColor LimeGreen {0.50 0 1 0 } % LimeGreen No PANTONE match +\newColor YellowGreen {0.44 0 0.74 0 } % YellowGreen Approximate PANTONE 375 +\newColor SpringGreen {0.26 0 0.76 0 } % SpringGreen Approximate PANTONE 381 +\newColor OliveGreen {0.64 0 0.95 0.40 } % OliveGreen Approximate PANTONE 582 +\newColor RawSienna {0 0.72 1 0.45 } % RawSienna Approximate PANTONE 154 +\newColor Sepia {0 0.83 1 0.70 } % Sepia Approximate PANTONE 161 +\newColor Brown {0 0.81 1 0.60 } % Brown Approximate PANTONE 1615 +\newColor Tan {0.14 0.42 0.56 0 } % Tan No PANTONE match +\newColor Gray {0 0 0 0.50 } % Gray Approximate PANTONE COOL-GRAY-8 +\newColor Black {0 0 0 1 } % Black Approximate PANTONE PROCESS-BLACK +\newColor White {0 0 0 0 } % White No PANTONE match + +% Now we make sure that we initialize the global color to Black +\subdef{Black} + +% Here we have a macro for typesetting a coloured graphic. Colour +% separation is assumed to be done by bm2font version 3.0. +% When using bitmap files instead of TeXfonts it should work in a +% similar way. +\def\loadcmykpic[#1,#2,#3,#4]{ +\input{#1} +\input{#2} +\input{#3} +\input{#4} +} + +\def\cmykpic[#1,#2,#3,#4]{% +\ifvmode\leavevmode\fi +\dimen0\expandafter\ht\csname #4box\endcsname% +\vbox to\dimen0{\hsize=\wd0\offinterlineskip\parindent0pt% +\Cyan{\expandafter\copy\csname #1box\endcsname}\vskip-\dimen0 +\Magenta{\expandafter\copy\csname #2box\endcsname}\vskip-\dimen0 +\Yellow{\expandafter\copy\csname #3box\endcsname}\vskip-\dimen0 +\Black{\expandafter\copy\csname #4box\endcsname}\vss} +} + +\def\fcmykpic[#1,#2,#3,#4]{% +\ifvmode\leavevmode\fi +\dimen0\expandafter\ht\csname #4box\endcsname +\ifx\frame\undefined +\vbox{% +\hsize\expandafter\wd\csname #4box\endcsname +\advance\hsize .8pt \hrule% +\hbox to\hsize% +{\vrule\hfill\vbox to\dimen0{\offinterlineskip% +\Cyan{\expandafter\copy\csname #1box\endcsname}\vskip-\dimen0 +\Magenta{\expandafter\copy\csname #2box\endcsname}\vskip-\dimen0 +\Yellow{\expandafter\copy\csname #3box\endcsname}\vskip-\dimen0 +\Black{\expandafter\copy\csname #4box\endcsname} +}\hfill\vrule}\hrule\vss} +\else +\frame{\vbox to\dimen0{\hsize=\wd0\offinterlineskip% +\Cyan{\expandafter\copy\csname #1box\endcsname}\vskip-\dimen0 +\Magenta{\expandafter\copy\csname #2box\endcsname}\vskip-\dimen0 +\Yellow{\expandafter\copy\csname #3box\endcsname}\vskip-\dimen0 +\Black{\expandafter\copy\csname #4box\endcsname}\vss}} +\fi +} diff --git a/dviware/dvidjc/example/fractal.gif b/dviware/dvidjc/example/fractal.gif Binary files differnew file mode 100644 index 0000000000..7178d441df --- /dev/null +++ b/dviware/dvidjc/example/fractal.gif diff --git a/dviware/dvidjc/example/gencoldoc b/dviware/dvidjc/example/gencoldoc new file mode 100644 index 0000000000..909cdd893f --- /dev/null +++ b/dviware/dvidjc/example/gencoldoc @@ -0,0 +1,18 @@ +bm2font texlion.gif -u2 -wn -dn -jn -pn -flionb -kk +bm2font texlion.gif -u2 -wn -dn -jn -pn -flionc -kc +bm2font texlion.gif -u2 -wn -dn -jn -pn -flionm -km +bm2font texlion.gif -u2 -wn -dn -jn -pn -fliony -ky +bm2font fractal.gif -u2 -wn -dn -jn -pn -ffractb -kk +bm2font fractal.gif -u2 -wn -dn -jn -pn -ffractc -kc +bm2font fractal.gif -u2 -wn -dn -jn -pn -ffractm -km +bm2font fractal.gif -u2 -wn -dn -jn -pn -ffracty -ky +bm2font kreis.gif +bm2font vgaca.gif -u2 -wn -dn -jn -pn -fvgacab -kk +bm2font vgaca.gif -u2 -wn -dn -jn -pn -fvgacac -kc +bm2font vgaca.gif -u2 -wn -dn -jn -pn -fvgacam -km +bm2font vgaca.gif -u2 -wn -dn -jn -pn -fvgacay -ky +bm2font vgacb.gif -u2 -wn -dn -jn -pn -fvgacbb -kk +bm2font vgacb.gif -u2 -wn -dn -jn -pn -fvgacbc -kc +bm2font vgacb.gif -u2 -wn -dn -jn -pn -fvgacbm -km +bm2font vgacb.gif -u2 -wn -dn -jn -pn -fvgacby -ky +latex coldoc diff --git a/dviware/dvidjc/example/kreis.gif b/dviware/dvidjc/example/kreis.gif Binary files differnew file mode 100644 index 0000000000..687b9cb898 --- /dev/null +++ b/dviware/dvidjc/example/kreis.gif diff --git a/dviware/dvidjc/example/parskip.sty b/dviware/dvidjc/example/parskip.sty new file mode 100644 index 0000000000..107766760c --- /dev/null +++ b/dviware/dvidjc/example/parskip.sty @@ -0,0 +1,34 @@ +% This is PARSKIP.STY by H.Partl, TU Wien, as of 19 Jan 1989. +% Document Style Option to be used with any style and with any size. +% It produces the following Paragraph Layout: +% Zero Parindent and non-zero Parskip. The stretchable glue in \parskip +% helps LaTeX in finding the best place for page breaks. + +\parskip=0.5\baselineskip \advance\parskip by 0pt plus 2pt +\parindent=\z@ + +% To accompany this, the vertical spacing in the list environments is changed +% to use the same as \parskip in all relevant places (for normalsize only): +% \parsep = \parskip +% \itemsep = \z@ % add nothing to \parskip between items +% \topsep = \z@ % add nothing to \parskip before first item + +\def\@listI{\leftmargin\leftmargini + \partopsep\z@ % added by G. Partosch + \topsep\z@ \parsep\parskip \itemsep\z@} +\let\@listi\@listI +\@listi + +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth-\labelsep + \partopsep\z@ % added by G. Partosch + \topsep\z@ \parsep\parskip \itemsep\z@} + +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii\advance\labelwidth-\labelsep + \partopsep\z@ % added by G. Partosch + \topsep\z@ \parsep\parskip \itemsep\z@} + +% Note that listiv, listv and listvi don't change vertical parameters. + +\endinput
\ No newline at end of file diff --git a/dviware/dvidjc/example/texlion.gif b/dviware/dvidjc/example/texlion.gif Binary files differnew file mode 100644 index 0000000000..3ab413843f --- /dev/null +++ b/dviware/dvidjc/example/texlion.gif diff --git a/dviware/dvidjc/example/vgaca.gif b/dviware/dvidjc/example/vgaca.gif Binary files differnew file mode 100644 index 0000000000..cd54e88f41 --- /dev/null +++ b/dviware/dvidjc/example/vgaca.gif diff --git a/dviware/dvidjc/example/vgacb.gif b/dviware/dvidjc/example/vgacb.gif Binary files differnew file mode 100644 index 0000000000..5ed5c20be3 --- /dev/null +++ b/dviware/dvidjc/example/vgacb.gif diff --git a/dviware/dvidjc/turbo-c/dvidjc.c b/dviware/dvidjc/turbo-c/dvidjc.c new file mode 100644 index 0000000000..e0a6f62a5f --- /dev/null +++ b/dviware/dvidjc/turbo-c/dvidjc.c @@ -0,0 +1,995 @@ +/* (C)opyright 1994 Wolfgang R. Mueller, Computing Centre,
+Heinrich-Heine-University Duesseldorf, Germany,
+wolfgang@uni-duesseldorf.de, +49-211-311-3905.
+This program may be used without any warranty under
+the terms of the GNU general public licence. */
+/* translated from the original TurboPascal source
+partly with p2c, the Pascal-to-C translator */
+
+#undef DJCOLOUR
+#ifdef DJ550C
+ #define DJCOLOUR
+#endif
+#ifdef DJ500C
+ #define DJCOLOUR
+#endif
+
+#define DINA4
+#include <stdio.h>
+
+#ifdef __MSDOS__
+ #ifdef __TURBOC__
+ #include <dos.h>
+ #else
+ #include <pc.h>
+ #endif
+#endif
+
+#ifdef __TURBOC__
+ #include <mem.h>
+ #include <alloc.h>
+ #define malloc farmalloc
+ #define calloc farcalloc
+ #define realloc farrealloc
+ #define free farfree
+#endif
+
+#define uchar unsigned char
+#define ushort unsigned short
+#define ulong unsigned long
+#define ptr void *
+
+#define xmb 294 /* 8.5 inch X 300 dpi / 8 dot per byte*/
+#ifdef __TURBOC__
+#define ymax 47 /* +1=multiple of 8 */
+#else
+#define ymax 839 /* +1=multiple of 8 */
+#endif
+#define linl 299 /* =xmb+2+(xmb+128)div 128 */
+#define maxink 16
+#define smax 100
+
+#ifdef __MSDOS__
+static char tfmprefix[] = "c:\\tex\\fonts\\tfm\\";
+static char fontprefix[] = "c:\\tex\\fonts\\canon\\";
+#else
+static char tfmprefix[] = "/usr/TeX/lib/tex/fonts/";
+static char fontprefix[] = "/usr/TeX/lib/tex/fonts/";
+#endif
+
+typedef struct colpix { uchar cpix, mpix, ypix, kpix; } colpix;
+typedef struct greydesc { uchar maskc, maskm, masky, maskk; } greydesc;
+
+static uchar maskmat[5][4][4] = {
+ { {17,2,5,17},{17,17,8,17},{17,17,17,11},{17,17,14,17} },
+ { {1,17,17,3},{5,17,17,6},{8,10,12,17},{14,16,17,17} },
+ { {17,17,17,17},{17,4,17,17},{17,17,17,17},{17,17,17,12} },
+ { {14,4,16,2},{7,9,5,11},{15,1,13,3},{6,12,8,10} },
+ { {0x88,0x44,0x22,0x11},{0,0,0,0},{0,0,0,0},{0,0,0,0} } };
+
+static FILE *prot=stderr;
+static uchar stackcy[smax], stackma[smax], stackye[smax], stackbl[smax];
+static char STR[99], FOPRE[99], FOMAG[16], FONAM[99], FOLOC[99], FOFUL[99];
+static char prfnam[99] = "prn";
+static char defnam[73];
+static colpix *pxlmem[ymax + 1];
+static greydesc greymask[8];
+static uchar maskb[maxink + 1][4][4];
+
+static uchar zoll, zoll0, vsk1, vsk2, hsk3, prfilout, clearing, prinit = 0;
+static long zoelli;
+static short zilli, lz, colst, xres, yres, xmax;
+static short vskop, hsk1, hsk2, lzd, vchd, prbs, prbe;
+static FILE *prfile;
+static uchar prbuf[2048];
+
+static void Tptr(void *p) { if(p==NULL) {
+ fprintf(prot, " - not enough memory :-( "); exit(1);
+} }
+static void prfeval() {
+ if (!strcmp(".dvi", defnam+strlen(defnam)-4)) defnam[strlen(defnam)-4]=0;
+ if (*prfnam == '\0') sprintf(prfnam, "%s.pcl", defnam);
+ prfilout = (strcmp(prfnam, "prn") != 0);
+ xres = 300; yres = 300; xmax = xmb * 8 + 7;
+ zoll0 = (yres * 12 + ymax) / (ymax + 1);
+ if (prfilout) fprintf(prot, "writing to file %s\n", prfnam);
+}
+static void propen() { if (prinit) return; prinit = 1;
+ prbs=0; prbe=0; if(prfilout) prfile = fopen(prfnam, "w+b");
+}
+static void prflush() { if(prbs>=prbe) return;
+ if(prfilout) fwrite(&prbuf[prbs], prbe - prbs, 1, prfile);
+ if(prbe==2048) prbe=0; prbs=prbe;
+}
+static void put(x) uchar x; {
+ if (prfilout) {
+ if (prbe == 2048) prflush();
+ prbuf[prbe] = x; prbe++;
+ } else
+#ifdef __MSDOS__
+ outportb(0x378,x);
+ while((inportb(0x379)&0x80)==0);
+ outportb(0x37a,13);
+ inportb(0x379);
+ outportb(0x37a,12);
+#else
+ putc(x,stdout);
+#endif
+}
+static void esc(s) char *s; { short i, l;
+ put(0x1b); l = strlen(s);
+ for (i = 0; i < l; i++) put(s[i]);
+}
+static void prclos() {
+ if (!prinit) return;
+ prflush(); prinit = 0;
+ if (prfilout) fclose(prfile);
+}
+static void hardform() { esc("*rbC"); put(0xc); esc("E");
+}
+static void putint(i) short i; {
+ if (i >= 10) putint(i / 10);
+ put(i % 10 + '0');
+}
+static void putbits(c, pbuf) char c; uchar pbuf[linl+1]; {
+ uchar qbuf[linl+1]; short i, j, k, l, m, n; uchar b, ba;
+ n = xmb; while (pbuf[n] == 0 && n >= 0) n--;
+ if (n < 0) m = 0; else {
+ b = pbuf[0]; j = 1; k = 2; l = 2; qbuf[k] = b;
+ for (i = 1; i <= n; i++) { ba = b; b = pbuf[i];
+ if (ba == b) {
+ if (l == k) {
+ if (k == j + 1) k--; else {
+ l++; qbuf[l] = b;
+ if (l - j >= 128) { qbuf[j] = k - j - 2; j = k; }
+ } } else { l++;
+ if (j < k) { qbuf[j] = k - j - 2; j = k; }
+ if (l - j >= 128) {
+ qbuf[j] = 129; j = k + 2; k = j + 1; l = k; qbuf[k] = b;
+ } } } else {
+ if (l == k) { k++;
+ if (k - j > 128) { qbuf[j] = k - j - 2; j = k; k++; }
+ qbuf[k] = b; l = k;
+ } else if (j == k) { qbuf[j] = k - l + 256;
+ j += 2; k = j + 1; l = k; qbuf[k] = b;
+ } else { l++; k = l; qbuf[k] = b;
+ } } }
+ if (l == k) { qbuf[j] = l - j - 1; m = l;
+ } else if (j == k) { qbuf[j] = k - l + 256; m = j + 1;
+ } else { qbuf[j] = l - j - 1; m = l;
+ } }
+ esc("*b"); putint(m); put(c);
+ for (i = 1; i <= m; i++) put(qbuf[i]);
+}
+static short skipper;
+static void hardcopy() { uchar pbuf[linl+1];
+ short x, y; uchar b,nothing; colpix *WITH;
+ propen();
+ if (zilli == 0) {
+ esc("E");
+#ifdef DINA4
+ esc("&l26A");
+#endif
+ esc("&a1N"); esc("*r2360S"); esc("*t300R");
+#ifdef DJ550C
+ esc("*r-4U");
+#endif
+#ifdef DJ500C
+ esc("*r-3U");
+#endif
+ esc("*p0x0Y"); esc("*r0A"); esc("*b2M"); skipper=0;
+ }
+ for (y = 0; y <= ymax; y++) { nothing=1;
+ for (x = 0; x <= xmb; x++) { WITH = &pxlmem[y][x];
+#ifdef DJCOLOUR
+ b = WITH->kpix | (WITH->cpix & WITH->mpix & WITH->ypix);
+#else
+ b = WITH->kpix | (WITH->cpix | WITH->mpix | WITH->ypix);
+#endif
+ WITH->kpix = b;
+#ifdef DJ550C
+ b = ~b; WITH->cpix &= b; WITH->mpix &= b; WITH->ypix &= b;
+#endif
+#ifdef DJ500C
+ WITH->kpix = WITH->cpix | b; WITH->mpix |= b; WITH->ypix |= b;
+#endif
+ if(WITH->kpix|WITH->cpix|WITH->mpix|WITH->ypix) nothing=0;
+ }
+ if(nothing) skipper++; else {
+ if(skipper>0) { esc("*b"); putint(skipper); put('Y'); skipper=0; }
+ for (x = 0; x <= xmb; x++) pbuf[x] = pxlmem[y][x].kpix;
+#ifdef DJ550C
+ putbits('V', pbuf);
+ for (x = 0; x <= xmb; x++) pbuf[x] = pxlmem[y][x].cpix;
+#endif
+#ifdef DJCOLOUR
+ putbits('V', pbuf);
+ for (x = 0; x <= xmb; x++) pbuf[x] = pxlmem[y][x].mpix;
+ putbits('V', pbuf);
+ for (x = 0; x <= xmb; x++) pbuf[x] = pxlmem[y][x].ypix;
+#endif
+ putbits('W', pbuf);
+} } prflush(); }
+static void pixet(y, x, b) ushort y, x; uchar b; {
+ colpix *WITH; greydesc *WITH1;
+ WITH = &pxlmem[y][x]; WITH1 = &greymask[y & 7];
+ if (clearing) { WITH->cpix &= ~b; WITH->mpix &= ~b;
+ WITH->ypix &= ~b; WITH->kpix &= ~b; return;
+ }
+ WITH->cpix |= b & WITH1->maskc; WITH->mpix |= b & WITH1->maskm;
+ WITH->ypix |= b & WITH1->masky; WITH->kpix |= b & WITH1->maskk;
+}
+static void setrect(xl, yl, xh, yh) ushort xl, yl, xh, yh; {
+ ushort x, y, xll, xrr; uchar a, b, c;
+ xll = xl >> 3; xrr = xh >> 3;
+ a = (0xff >> (xl & 7)) & 255; c = 0xff << (7 - (xh & 7));
+ for (y = yl; y <= yh; y++) { b = a;
+ for (x = xll; x <= xrr; x++) {
+ if (x == xrr) b &= c;
+ pixet(y, x, b); b = 0xff;
+} } }
+/*static long prodovz(a, b) ushort a, b; { return ((long)a * (long)b); }
+static long scaled(w, z) long w, z; { long s;
+ union { long l; struct { ushort n, h; } U1; } a, b;
+ a.l = w; b.l = z;
+ s = (((((ulong)prodovz(a.U1.n, b.U1.n)) >> 16) + prodovz(a.U1.n,
+ b.U1.h) + prodovz(a.U1.h, b.U1.n)) >> 4) +
+ (prodovz(a.U1.h, b.U1.h) << 12);
+ if (w < 0) s -= z << 12; return s;
+} */
+static long scaled(w, z) long w, z; { long s; ulong t=w, u=z;
+ /* should return w * z / 2**20 */
+ s = ( ( (((t & 65535L) * (u & 65535L)) >> 16)
+ + (t & 65535L) * (u >> 16)
+ + (t >> 16) * (u & 65535L) ) >> 4)
+ + ( ( (t >> 16) * (u >> 16) ) << 12);
+ if (w < 0) s -= z << 12; return s;
+}
+static char dviname[73];
+static FILE *dvifile;
+static long dvimag;
+static uchar dvibuf[2048];
+static ushort dvibufp, dvibufe;
+
+static void baddvi(s) char *s; {
+ fprintf(prot, "bad dvi: %s\n", s); exit(1);
+}
+static void dvibytes(s, l) char *s; uchar l; { ushort ll;
+ s[l] = '\0'; ll = dvibufe - dvibufp;
+ if (ll >= l) {
+ memmove((ptr)s, (ptr)(&dvibuf[dvibufp]), (long)l);
+ dvibufp += l; return;
+ }
+ if (ll > 0) memmove((ptr)s, (ptr)(&dvibuf[dvibufp]), (long)ll);
+ dvibufe = fread(dvibuf, 1, 2048, dvifile);
+ if (dvibufe + ll < l) baddvi("ends prematurely !");
+ memmove((ptr)(&s[ll]), (ptr)dvibuf, (long)(l - ll));
+ dvibufp = l - ll;
+}
+static uchar dvibyte() { uchar b;
+ if (dvibufp >= dvibufe) { dvibufp = 0;
+ dvibufe = fread(dvibuf, 1, 2048, dvifile);
+ }
+ if (dvibufp >= dvibufe) baddvi("ends prematurely !");
+ b = dvibuf[dvibufp]; dvibufp++; return b;
+}
+static void dviskip(l) long l; { uchar b;
+ while (l > 0) {
+ l += (long)dvibufp - (long)dvibufe;
+ if (l <= 0) dvibufp = dvibufe + l;
+ else { dvibufp = dvibufe; l--; dvibyte(); }
+} }
+static long dvinum(b) uchar b; { uchar i; long n;
+ n = 0;
+ if (dvibufp + b > dvibufe) {
+ for (i = 1; i <= b; i++) n = (n << 8) | dvibyte(); return n;
+ }
+ for (i = 0; i < b; i++) n = (n << 8) | dvibuf[dvibufp + i];
+ dvibufp += b; return n;
+}
+static long dviint(b) uchar b; { uchar i; long n;
+ if (dvibufp + b <= dvibufe) {
+ n = dvibuf[dvibufp];
+ if (n > 127) n -= 256;
+ for (i = 1; i < b; i++) n = (n << 8) | dvibuf[dvibufp + i];
+ dvibufp += b; return n;
+ }
+ n = dvibyte();
+ if (n > 127) n -= 256;
+ for (i = 2; i <= b; i++) n = (n << 8) | dvibyte(); return n;
+}
+static void dviposit(l) long l; { fseek(dvifile, l, 0);
+ dvibufe = fread(dvibuf, 1, 2048, dvifile); dvibufp = 0;
+}
+static void dviopen() { long l; uchar j, em; ushort k;
+ sprintf(STR, "%s.dvi", dviname);
+ if ((dvifile = fopen(STR, "rb"))==0) { strcpy(STR, dviname);
+ if ((dvifile = fopen(STR, "rb"))==0) baddvi("not existing !");
+ }
+ dvibufe = fread(dvibuf, 1, 2, dvifile);
+ if (dvibufe < 2) baddvi("empty !");
+ em = dvibuf[1];
+ if (dvibuf[0] != 247) baddvi("no valid preamble");
+ /* now position to postamble */
+ fseek(dvifile, 0L, 2); l=ftell(dvifile); if(l>2048) l=2048;
+ fseek(dvifile, -l, 2); k = fread(dvibuf, 1, 2048, dvifile);
+ do { k--; } while (k >= 4 && dvibuf[k] != em);
+ if (k < 4) baddvi("no postamble in last 2048 bytes !");
+ dvibufe = k + 1; dvibufp = k - 4; l = dvinum(4);
+ fseek(dvifile, l, 0); dvibufe = fread(dvibuf, 1, 2048, dvifile);
+ dvibufp = 0; dvibyte();
+}
+
+typedef union chdesc { uchar b8[16];
+ struct { short wid, hei, hof, vof; long bmp, tfw; } U1;
+ struct { long tfh, tfd, dum1, dum2; } U2;
+} chdesc;
+typedef struct fontdesc {
+ long dfn; char *fonam; chdesc *chv;
+ long danf; uchar *chm; short mch, fty;
+} fontdesc;
+static fontdesc **fontvect;
+static uchar fontint;
+static FILE *fofil;
+static uchar *achm;
+static uchar fofbyte() { uchar b;
+ if (fread(&b, 1, 1, fofil) <= 0) b = 0; return b;
+}
+static long fofint(b) uchar b; { uchar i; long n;
+ n = fofbyte(); if (n > 127) n -= 256;
+ for (i = 2; i <= b; i++) n = (n << 8) | fofbyte();
+ return n;
+}
+
+static long hs[smax], vs[smax], ws[smax], xs[smax], ys[smax], zs[smax];
+static long cnt[10];
+static uchar bitrev[256];
+static char comment[256];
+static double conv, vconv;
+static long l, landx, landy, newmag;
+static long a, b, c, f, q, h, v, hoff, voff, w, x, y, z;
+static long chk, scf, dsz, fofchk, num, den, mag, spl, lpp, mxh, mxv;
+static int pagnum, pag1, paganz, i, k;
+static ushort s, mst, mpn;
+static char dviori;
+static uchar o, j, post, fini, started, below;
+
+static void initbitrev() { uchar b, i, j, k, m, n;
+ for (m = 0; m <= 3; m++) { n=m;
+#ifdef DJCOLOUR
+ n=3;
+#endif
+ for (i = 0; i <= maxink; i++) {
+ for (j = 0; j <= 3; j++) { b = 0;
+ for (k = 0; k <= 3; k++) {
+ if (maskmat[n][j][k] <= i) b |= maskmat[4][0][k];
+ } maskb[i][m][j] = b; } } }
+ bitrev[0] = 0; m = 0x80; n = 1;
+ while (m) { /* put bits into reverse order within a byte */
+ for (j = 0; j < n; j++) bitrev[j + n] = bitrev[j] | m;
+ n += n; m >>= 1;
+} }
+
+static void tfmdef() { short ll, lh, bc, ec, nw, nh, nd, i;
+ uchar b1, b2, b3; short FORLIM;
+ fontdesc *WITH = fontvect[fontint];
+ sprintf(STR, "%s%s.tfm", tfmprefix, FONAM);
+ fprintf(prot, "trying %s instead", STR);
+ fofil = fopen(STR, "rb");
+ if (fofil==0) { fprintf(prot, " - absent as well :-(\n"); return; }
+ ll = fofint(2); lh = fofint(2); bc = fofint(2); ec = fofint(2);
+ nw = fofint(2); nh = fofint(2); nd = fofint(2); fseek(fofil, 0L, 2);
+ if (ll * 4 > ftell(fofil) || ll < lh + ec - bc + nw + nh + nd + 7) {
+ fprintf(prot, " - not a TFMfile !\n"); fclose(fofil); return;
+ }
+ WITH->mch = ec;
+ Tptr( WITH->chv = (chdesc *)calloc(WITH->mch + 1, sizeof(chdesc)) );
+ fseek(fofil, 24L, 0); fofchk = fofint(4);
+ if (chk != 0) if (fofchk != 0) if (chk != fofchk)
+ fprintf(prot, " *+* wrong checksum *+* ");
+ fseek(fofil, (lh + ec - bc + 7L) * 4, 0);
+ FORLIM = nw + nh + nd;
+ for (i = 0; i < FORLIM; i++)
+ WITH->chv[i].U2.dum1 = scaled(fofint(4), scf);
+ fseek(fofil, lh * 4L + 24, 0);
+ for (i = bc; i <= ec; i++) {
+ b1 = fofbyte(); b2 = fofbyte(); fofbyte(); fofbyte();
+ WITH->chv[i].U1.tfw = WITH->chv[b1].U2.dum1;
+ WITH->chv[i].U2.tfh = WITH->chv[nw + (b2 >> 4)].U2.dum1;
+ WITH->chv[i].U2.tfd = WITH->chv[nw + nh + (b2 & 15)].U2.dum1;
+ }
+ fclose(fofil); WITH->fty = 1; fprintf(prot, " - TFMfile OK\n");
+}
+static void tfmchar() { short hr, vr, br, ar; uchar li, re, ob, un;
+ chdesc *WITH = &fontvect[fontint]->chv[c];
+ switch (dviori) {
+ case 0:
+ hr = (long)(conv * h + 0.5);
+ vr = (long)(vconv * (v - WITH->U2.tfh) + 0.5);
+ br = (long)(conv * (h + WITH->U1.tfw) + 0.5);
+ ar = (long)(vconv * (v + WITH->U2.tfd) + 0.5);
+ break;
+ case 1:
+ hr = (long)(conv * (landx + v - WITH->U2.tfh) + 0.5);
+ vr = (long)(vconv * (landy - h - WITH->U1.tfw) + 0.5);
+ br = (long)(conv * (landx + v + WITH->U2.tfd) + 0.5);
+ ar = (long)(vconv * (landy - h) + 0.5);
+ break;
+ case 3:
+ hr = (long)(conv * (landx - v - WITH->U2.tfd) + 0.5);
+ vr = (long)(vconv * (landy + h) + 0.5);
+ br = (long)(conv * (landx - v + WITH->U2.tfh) + 0.5);
+ ar = (long)(vconv * (landy + h + WITH->U1.tfw) + 0.5);
+ break;
+ case 2:
+ hr = (long)(conv * (landx - h - WITH->U1.tfw) + 0.5);
+ vr = (long)(vconv * (landy - v - WITH->U2.tfd) + 0.5);
+ br = (long)(conv * (landx - h) + 0.5);
+ ar = (long)(vconv * (landy - v + WITH->U2.tfh) + 0.5);
+ break;
+ }
+ li = 1; re = 1; ob = 1; un = 1;
+ if (hr < 0) { hr = 0; li = 0; }
+ if (br > xmax) { br = xmax; re = 0; }
+ vr -= zilli; ar -= zilli;
+ if (vr < 0) { vr = 0; ob = 0; }
+ if (ar > ymax) { ar = ymax; un = 0; below = 1; }
+ if (hr > br) return;
+ if (vr > ar) return;
+ if (ob) setrect(hr, vr, br, vr);
+ if (li) setrect(hr, vr, hr, ar);
+ if (un) setrect(hr, ar, br, ar);
+ if (re) setrect(br, vr, br, ar);
+}
+
+static ushort pkpos;
+static uchar pkn1() { uchar Result;
+ Result = achm[pkpos]; pkpos++; return Result;
+}
+static short pki1() { short b;
+ b = pkn1(); if (b > 127) b -= 256; return b;
+}
+static short pkn2() { short b;
+ b = pkn1(); return (b * 256 + pkn1());
+}
+static short pki2() { short b;
+ b = pkn1(); if (b > 127) b -= 256;
+ return (b * 256 + pkn1());
+}
+static long pkn3() { long b; short c;
+ b = pkn1(); c = pkn1();
+ return ((b * 256 + c) * 256 + pkn1());
+}
+static long pki3() { long b;
+ b = pki1(); return (b * 65536L + pkn2());
+}
+static long pki4() { long b;
+ b = pki2(); return (b * 65536L + pkn2());
+}
+static void pkdef() { long a, l; ushort d; uchar b, bb;
+ uchar terminate; short i, j, c; fontdesc *WITH; chdesc *WITH1;
+ WITH = fontvect[fontint]; sprintf(STR, "%spk", FOFUL);
+ fprintf(prot,"preparing font %ld: %s", f, STR);
+ if( (fofil = fopen(STR, "rb"))==0) {
+ fprintf(prot," not found :-(\n");
+ sprintf(STR, "%spk", FOLOC);
+ fprintf(prot,"preparing font %ld: %s", f, STR);
+ fofil = fopen(STR, "rb");
+ }
+ if (fofil==0) { WITH->mch = -1;
+ fprintf(prot, " - file not found !\n"); return;
+ }
+ if ((fgetc(fofil)!=0xf7)||(fgetc(fofil)!=0x59)){ WITH->mch = -1;
+ fprintf(prot, " - not a PKfile !\n"); fclose(fofil); return;
+ } else {
+ fseek(fofil, 0L, 2); WITH->danf = ftell(fofil);
+ if (WITH->danf > 65520L) { WITH->mch = -1; fclose(fofil);
+ fprintf(prot, " - too big for this driver\n"); return;
+ } else {
+ Tptr( WITH->chv = (chdesc *)calloc(256, sizeof(chdesc)) );
+ Tptr( achm = (uchar *)malloc(WITH->danf) );
+ fseek(fofil, 0L, 0); fread(achm, WITH->danf, 1, fofil);
+ fclose(fofil); WITH->mch = -1; pkpos = 0; terminate = 0;
+ do { b = pkn1();
+ if (b >= 240) {
+ switch (b) {
+ case 240: case 241: case 242: case 243: l = 0;
+ for (i = 240; i <= b; i++) l = (l << 8) + pkn1();
+ pkpos += l; break;
+ case 244: pkpos += 4; break;
+ case 245: terminate = 1; break;
+ case 246: break;
+ case 247: b = pkn1(); i = pkn1();
+ pkpos += i + 4; fofchk = pki4();
+ if (chk != 0) if (fofchk != 0) if (chk != fofchk)
+ fprintf(prot, " *+* wrong checksum *+* ");
+ pkpos += 8; break;
+ case 248: case 249: case 250: case 251:
+ case 252: case 253: case 254: case 255: break;
+ }
+ } else { d = pkpos - 1; bb = b & 7;
+ switch (bb) {
+ case 0: case 1: case 2: case 3:
+ l = bb * 256 + pkn1() - 8; c = pkn1(); break;
+ case 4: case 5: case 6: l = bb - 4;
+ l = (l << 16) + pkn2() - 13; c = pkn1(); break;
+ case 7: l = pki4() - 28; c = pki4(); break;
+ }
+ WITH1 = &WITH->chv[c];
+ switch (bb) {
+ case 0: case 1: case 2: case 3:
+ WITH1->U1.tfw = scaled(pkn3(), scf); pkn1();
+ WITH1->U1.wid = pkn1(); WITH1->U1.hei = pkn1();
+ WITH1->U1.hof = pki1(); WITH1->U1.vof = pki1(); break;
+ case 4: case 5: case 6:
+ WITH1->U1.tfw = scaled(pkn3(), scf); pkn2();
+ WITH1->U1.wid = pkn2(); WITH1->U1.hei = pkn2();
+ WITH1->U1.hof = pki2(); WITH1->U1.vof = pki2(); break;
+ case 7:
+ WITH1->U1.tfw = scaled(pki4(), scf); pki4(); pki4();
+ WITH1->U1.wid = pki4(); WITH1->U1.hei = pki4();
+ WITH1->U1.hof = pki4(); WITH1->U1.vof = pki4(); break;
+ }
+ pkpos += l;
+ if ((unsigned)c <= 255) {
+ if (WITH->mch < c) WITH->mch = c;
+ WITH->chv[c].U1.bmp = d;
+ } } } while (!terminate);
+ if (WITH->mch < 0) fprintf(prot, " - PKfile in error !\n");
+ else fprintf(prot, " - available\n");
+ WITH->chv = (chdesc *) realloc(WITH->chv, 16*(WITH->mch + 1));
+ Tptr( WITH->fonam = (char *) malloc(strlen(STR)+1) );
+ strcpy(WITH->fonam, STR);
+} } }
+static struct { short xs, x, wid1; short ii, j;
+ uchar dd, db; ushort d; uchar white; uchar buf[xmb + 1];
+ uchar bmerk; long repc, count; short dynf, dyng, dynh;
+} Lpkc;
+static uchar pknib() { uchar Result;
+ if (Lpkc.bmerk != 0) {
+ Result = Lpkc.bmerk & 0xf; Lpkc.bmerk = 0; return Result;
+ }
+ Lpkc.bmerk = pkn1(); Result = Lpkc.bmerk >> 4;
+ Lpkc.bmerk |= 0xf0; return Result;
+}
+static long pknum() { uchar i, j, k; long n;
+ k = 1;
+ do { i = pknib(); k++;
+ if (i == 0) {
+ do { j = pknib(); i++; } while (j == 0);
+ n = j;
+ while (i > 0) { i--; n = (n << 4) + pknib(); }
+ n += Lpkc.dyng;
+ } else if (i <= Lpkc.dynf) n = i;
+ else if (i < 14) n = (i << 4) + pknib() + Lpkc.dynh;
+ else if (i == 14) k = 0;
+ else { k = 1; n = 1; }
+ if (k == 1) Lpkc.repc = n;
+ } while (k != 2); return n;
+}
+static void pkline() {
+ if (Lpkc.dynf == 14) {
+ Lpkc.j = Lpkc.wid1 + Lpkc.xs;
+ Lpkc.db += Lpkc.xs;
+ do {
+ if (Lpkc.db < 8) Lpkc.d = (Lpkc.d << 8) | pkn1();
+ else Lpkc.db -= 8;
+ Lpkc.dd = (Lpkc.d >> Lpkc.db) & 255;
+ if (Lpkc.j >= 8) { Lpkc.j -= 8; Lpkc.buf[Lpkc.x] = Lpkc.dd;
+ } else { Lpkc.db += 8 - Lpkc.j;
+ Lpkc.buf[Lpkc.x] = Lpkc.dd & (0xff00L >> Lpkc.j) & 255;
+ Lpkc.j = 0;
+ } Lpkc.x++;
+ } while (Lpkc.j != 0);
+ Lpkc.d &= 0xffffL >> (16 - Lpkc.db); return;
+ }
+ Lpkc.ii = 0; Lpkc.j = Lpkc.wid1; Lpkc.db = 8 - Lpkc.xs; Lpkc.d = 0;
+ if (Lpkc.repc > 0) { Lpkc.repc--; return; }
+ while (Lpkc.j > 0) {
+ if (Lpkc.count == 0) { Lpkc.count = pknum(); Lpkc.white = !Lpkc.white; }
+ Lpkc.dd = Lpkc.db;
+ if (Lpkc.dd > Lpkc.j) Lpkc.dd = Lpkc.j;
+ if (Lpkc.dd > Lpkc.count) Lpkc.dd = Lpkc.count;
+ if (Lpkc.white) Lpkc.db -= Lpkc.dd;
+ else { Lpkc.d += 1 << Lpkc.db;
+ Lpkc.db -= Lpkc.dd; Lpkc.d -= 1 << Lpkc.db;
+ }
+ Lpkc.count -= Lpkc.dd; Lpkc.j -= Lpkc.dd;
+ if (Lpkc.db == 0 || Lpkc.j == 0) {
+ Lpkc.buf[Lpkc.x] = Lpkc.d & 255;
+ Lpkc.x++; Lpkc.d = 0; Lpkc.db = 8;
+} } }
+static void pkchar() { short hr, vr; long bma, bmx;
+ short x1, x2, x3, y1, y2, y; uchar b, bb, mach, mac, mpm, bach;
+ fontdesc *WITH; chdesc *WITH1;
+ WITH = fontvect[fontint]; WITH1 = &WITH->chv[c];
+ pkpos = WITH1->U1.bmp; b = pkn1();
+ Lpkc.white = ((b & 8) == 0); Lpkc.wid1 = WITH1->U1.wid;
+ Lpkc.dynf = b >> 4;
+ Lpkc.dyng = (13 - Lpkc.dynf) * 16 + Lpkc.dynf - 15;
+ Lpkc.dynh = -(Lpkc.dynf + 1) * 15; bb = b & 7;
+ switch (bb) {
+ case 0: case 1: case 2: case 3: pkpos += 10; break;
+ case 4: case 5: case 6: pkpos += 16; break;
+ case 7: pkpos += 36; break;
+ }
+ Lpkc.bmerk = 0; Lpkc.d = 0; Lpkc.db = 0; Lpkc.repc = 0;
+ Lpkc.count = 0; Lpkc.white = !Lpkc.white;
+ switch (dviori) {
+ case 0:
+ hr = (long)(conv * h + 0.5) - WITH1->U1.hof;
+ vr = (long)(vconv * v + 0.5) - WITH1->U1.vof - zilli;
+ if (vr > ymax) below = 1; else {
+ if (vr + WITH1->U1.hei >= 1) {
+ x1 = hr / 8; x2 = (hr + WITH1->U1.wid - 1) / 8;
+ Lpkc.xs = hr & 7; y2 = vr + WITH1->U1.hei - 1;
+ if (y2 > ymax) { y2 = ymax; below = 1; }
+ if (0 <= x1) {
+ if (x2 <= xmb) {
+ for (y = vr; y <= y2; y++) {
+ Lpkc.x = x1; pkline();
+ if (y >= 0) {
+ for (Lpkc.x = x1; Lpkc.x <= x2; Lpkc.x++)
+ pixet(y, Lpkc.x, Lpkc.buf[Lpkc.x]);
+ } } } } } } break;
+ case 1:
+ hr = (long)(conv * (landx + v) + 0.5) - WITH1->U1.vof;
+ vr = (long)(vconv * (landy - h) + 0.5) + WITH1->U1.hof - zilli;
+ if (vr - WITH1->U1.wid + 1 > ymax) below = 1; else {
+ if (vr >= 0) { Lpkc.xs = 0; mac = 0x80; bma = 0; y1 = vr;
+ if (y1 > ymax) { below = 1; bma += ((ulong)(y1 - ymax)) >> 3;
+ mac = 0x80 >> ((y1 - ymax) & 7); y1 = ymax;
+ }
+ y2 = vr - WITH1->U1.wid + 1; if (y2 < 0) y2 = 0;
+ x2 = hr + WITH1->U1.hei - 1; if (x2 > xmax) x2 = xmax;
+ for (x3 = hr; x3 <= x2; x3++) {
+ Lpkc.x = 0; pkline();
+ if (x3 >= 0) {
+ mach = mac; Lpkc.x = ((unsigned)x3) >> 3;
+ mpm = 0x80 >> (x3 & 7); bmx = bma; bach = Lpkc.buf[bmx];
+ for (y = y1; y >= y2; y--) {
+ if ((bach & mach) != 0) pixet(y, Lpkc.x, mpm);
+ mach >>= 1;
+ if (mach == 0) {
+ mach = 0x80; bmx++; bach = Lpkc.buf[bmx];
+ } } } } } } break;
+ case 3:
+ hr = (long)(conv * (landx - v) + 0.5) + WITH1->U1.vof;
+ vr = (long)(vconv * (landy + h) + 0.5) - WITH1->U1.hof - zilli;
+ if (vr > ymax) below = 1; else {
+ if (vr + WITH1->U1.wid >= 1) {
+ Lpkc.xs = 0; mac = 0x80; bma = 0; y1 = vr;
+ if (y1 < 0) { bma += ((unsigned)(-y1)) >> 3;
+ mac = 0x80 >> ((-y1) & 7); y1 = 0;
+ }
+ y2 = vr + WITH1->U1.wid - 1;
+ if (y2 > ymax) { y2 = ymax; below = 1; }
+ x2 = hr - WITH1->U1.hei + 1; if (x2 < 0) x2 = 0;
+ for (x3 = hr; x3 >= x2; x3--) {
+ Lpkc.x = 0; pkline();
+ if (x3 <= xmax) {
+ mach = mac; Lpkc.x = ((unsigned)x3) >> 3;
+ mpm = 0x80 >> (x3 & 7); bmx = bma; bach = Lpkc.buf[bmx];
+ for (y = y1; y <= y2; y++) {
+ if ((bach & mach) != 0) pixet(y, Lpkc.x, mpm);
+ mach >>= 1;
+ if (mach == 0) {
+ mach = 0x80; bmx++; bach = Lpkc.buf[bmx];
+ } } } } } } break;
+ case 2:
+ hr = (long)(conv * (landx - h) + 0.5) + WITH1->U1.hof;
+ vr = (long)(vconv * (landy - v) + 0.5) + WITH1->U1.vof - zilli;
+ if (vr - WITH1->U1.hei + 1 > ymax) below = 1; else {
+ if (vr >= 0) {
+ x1 = hr / 8; x2 = (hr - WITH1->U1.wid + 1) / 8;
+ Lpkc.xs = (7 - hr) & 7; y2 = vr - WITH1->U1.hei + 1;
+ if (y2 < 0) y2 = 0;
+ if (vr > ymax) below = 1;
+ if (0 <= x2) {
+ if (x1 <= xmb) {
+ for (y = vr; y >= y2; y--) {
+ Lpkc.x = xmb - x1; pkline();
+ if (y <= ymax) {
+ for (Lpkc.x = x1; Lpkc.x >= x2; Lpkc.x--)
+ pixet(y, Lpkc.x, bitrev[Lpkc.buf[xmb - Lpkc.x]]);
+ } } } } } } break;
+} }
+
+static void fontdef() { uchar a, b, p, q; fontdesc *WITH;
+ if (f < 0) baddvi("negative fontnumber");
+ b = f & 0xff; a = 0;
+ if ((f > 255) || (fontvect[b] != NULL)) do {
+ if (fontvect[a] == NULL) b = a;
+ else if (fontvect[a]->dfn == f) baddvi("double fontnumber");
+ a++;
+ } while (a);
+ if (fontvect[b] != NULL) baddvi("too many fonts");
+ fontint = b;
+ Tptr( fontvect[b] = (fontdesc *)malloc(sizeof(fontdesc)) );
+ WITH = fontvect[fontint]; WITH->dfn = f;
+ chk = dvinum(4); scf = dvinum(4); dsz = dvinum(4);
+ WITH->chm = NULL; WITH->fty = -1;
+ p = dvibyte(); q = dvibyte(); dvibytes(FONAM, q);
+ if (p == 0) strcpy(FOPRE, fontprefix); else dvibytes(FOPRE, p);
+ sprintf(FOMAG, "%ld",
+ (long)(xres * dvimag / 1000.0 * ((double)scf / dsz) + 0.5));
+#ifdef __MSDOS__
+ sprintf(FOFUL, "%s%s\\%s.", FOPRE, FOMAG, FONAM);
+ sprintf(FOLOC, "%s.", FONAM);
+#else
+ sprintf(FOFUL, "%s%s.%s", FOPRE, FONAM, FOMAG);
+ sprintf(FOLOC, "%s.%s", FONAM, FOMAG);
+#endif
+ pkdef(); if (WITH->mch < 0) tfmdef();
+}
+
+static void fontlod() { uchar b = 0;
+ fontdesc *WITH = fontvect[fontint];
+ WITH->chm = (uchar *)malloc(WITH->danf);
+ if (WITH->chm == NULL) { do {
+ if (fontvect[b] != NULL) {
+ if (fontvect[b]->chm) free(fontvect[b]->chm);
+ fontvect[b]->chm = NULL;
+ } b++;
+ } while (b);
+ Tptr( WITH->chm = (uchar *)malloc(WITH->danf) );
+ }
+ fofil = fopen(WITH->fonam, "rb");
+ fread(WITH->chm, WITH->danf, 1, fofil); fclose(fofil);
+}
+
+static void fontset() { uchar a, b, x;
+ b = f & 0xff; x = 0;
+ if (fontvect[b] != NULL) if (fontvect[b]->dfn == f) x = 1;
+ if (x == 0) { a = 0;
+ do {
+ if (fontvect[a] == NULL) a++;
+ else if (fontvect[a]->dfn != f) a++;
+ else { x = 1; b = a; a = 0; }
+ } while (a != 0);
+ }
+ if (x == 0) baddvi("undefined fontnumber");
+ fontint = b;
+}
+static void putrule() { short hr, vr, br, ar;
+ if (b <= 0) return;
+ switch (dviori) {
+ case 0:
+ hr = (long)(conv * h + 0.5);
+ vr = (long)(vconv * (v - a) + 0.5);
+ br = (long)(conv * b + 0.5); if (br > 0) br--;
+ ar = (long)(vconv * a + 0.5);
+ break;
+ case 1:
+ hr = (long)(conv * (landx + v - a) + 0.5);
+ vr = (long)(vconv * (landy - h - b) + 0.5);
+ br = (long)(conv * a + 0.5);
+ ar = (long)(vconv * b + 0.5); if (ar > 0) ar--;
+ break;
+ case 3:
+ hr = (long)(conv * (landx - v) + 0.5);
+ vr = (long)(vconv * (landy + h) + 0.5);
+ br = (long)(conv * a + 0.5);
+ ar = (long)(vconv * b + 0.5); if (ar > 0) ar--;
+ break;
+ case 2:
+ hr = (long)(conv * (landx - h - b) + 0.5);
+ vr = (long)(vconv * (landy - v) + 0.5);
+ br = (long)(conv * b + 0.5); if (br > 0) br--;
+ ar = (long)(vconv * a + 0.5);
+ break;
+ }
+ vr -= zilli; ar += vr; br += hr;
+ if (hr < 0) hr = 0;
+ if (br > xmax) br = xmax;
+ if (vr < 0) vr = 0;
+ if (ar > ymax) { ar = ymax; below = 1; }
+ if (hr <= br) if (vr <= ar) setrect(hr, vr, br, ar);
+}
+static void putchar_() { fontdesc *WITH; chdesc *WITH1;
+ WITH = fontvect[fontint];
+ if (c > WITH->mch) { q = 0; return; }
+ WITH1 = &WITH->chv[c]; q = WITH1->U1.tfw;
+ if (WITH->fty == 1) { tfmchar(); return; }
+ if (WITH1->U1.bmp == 0) return;
+ if (WITH->chm == NULL) fontlod();
+ achm = WITH->chm; pkchar();
+}
+static void clrpxlmem() { short i; below = 0;
+ for (i = 0; i <= ymax; i++)
+ memset((ptr)pxlmem[i], 0, (xmb+1)*sizeof(colpix));
+}
+static void pagebeg() { uchar j; greydesc *WITH;
+ for (j = 0; j <= 9; j++) cnt[j] = dvinum(4);
+ lpp = dvinum(4); pagnum++;
+ if (pagnum >= pag1) { started = 1; fprintf(prot, "[%d", pagnum); }
+ s = 0; w = 0; x = 0; y = 0; z = 0; zilli = 0; lz = 0; zoll = zoll0;
+ for (j = 0; j <= 7; j++) { WITH = &greymask[j]; WITH->maskc = 0;
+ WITH->maskm = 0; WITH->masky = 0; WITH->maskk = 0xff;
+ }
+ zoelli = ftell(dvifile); zoelli += (long)dvibufp - (long)dvibufe;
+ h = (long)((xres - hoff) / conv + 0.5);
+ v = (long)((yres - voff) / vconv + 0.5);
+ clrpxlmem();
+}
+static void pageend() {
+ if (s != 0) fprintf(prot, "Stack not empty at EOP\n");
+ if (!started) return;
+ hardcopy(); /* fprintf(prot, "/%d", (int)zoll); */
+ if (zoll > 0 && below) { zoll--; dviposit(zoelli);
+ s = 0; w = 0; x = 0; y = 0; z = 0; zilli += ymax + 1;
+ h = (long)((xres - hoff) / conv + 0.5);
+ v = (long)((yres - voff) / vconv + 0.5);
+ clrpxlmem(); return;
+ }
+ hardform(); fprintf(prot, "]");
+ paganz--; if (paganz <= 0) fini = 1;
+}
+static void deffont() { ushort l, m;
+ if (!post) { fontdef(); return; }
+ dviskip(12L); l = dvibyte(); m = dvibyte(); dviskip((long)(l + m));
+}
+static void special() { long i, j, k; char *parm;
+ double x, y, cy, ma, ye, bl; short cle, m, n;
+ if (spl > 255) { fprintf(prot, "special >>");
+ for (i = spl; i > 0; i--) fputc(dvibyte(), prot);
+ fprintf(prot, "<< ignored\n"); return;
+ }
+ dvibytes(comment, (int)spl);
+ if (!memcmp(comment, "landend", 7)) { dviori = 0; return; }
+ if (!memcmp(comment, "landstart", 9)) {
+ if (comment[10] == '1') dviori = 1;
+ else if (comment[10] == '0') dviori = 3;
+ else dviori = 2;
+ sscanf(comment+12, "%lg%lg", &x,&y);
+ j = (long)(x * 65535L + 0.5);
+ k = (long)(y * 65535L + 0.5);
+ switch (dviori) {
+ case 1: landx = h - v; landy = v + j + h; break;
+ case 3: landx = h + k + v; landy = v - h; break;
+ case 2: landx = h + h + k; landy = v + j + v; break;
+ } return; }
+ if (memcmp(comment, "color", 5)) {
+ fprintf(prot, "special >>%s<< ignored", comment); return;
+ }
+ parm = comment+6;
+ if (!memcmp(parm, "pop", 3)) { parm +=4; colst--;
+ if (colst < 0) { colst = 0; fprintf(prot, " color stack underflow"); }
+ } else {
+ if (!memcmp(parm, "push cmyk", 9)) { parm +=10; colst++;
+ if (colst > smax-1) { colst = smax-1;
+ fprintf(prot, " color stack overflow");
+ } }
+ if (sscanf(parm,"%lg%lg%lg%lg",&cy,&ma,&ye,&bl)<4) {
+ fprintf(prot," color: cmyk values <%s> incomplete ",comment); return;
+ }
+ n = (long)(cy * maxink); if (n < 0) n = 0;
+ if (n > maxink) n = maxink; stackcy[colst] = n;
+ n = (long)(ma * maxink); if (n < 0) n = 0;
+ if (n > maxink) n = maxink; stackma[colst] = n;
+ n = (long)(ye * maxink); if (n < 0) n = 0;
+ if (n > maxink) n = maxink; stackye[colst] = n;
+ n = (long)(bl * maxink); if (n < 0) n = 0;
+ if (n > maxink) n = maxink; stackbl[colst] = n;
+ }
+ n = stackcy[colst]; cle = n;
+ for (m = 0; m <= 7; m++) greymask[m].maskc = maskb[n][0][m & 3];
+ n = stackma[colst]; cle += n;
+ for (m = 0; m <= 7; m++) greymask[m].maskm = maskb[n][1][m & 3];
+ n = stackye[colst]; cle += n;
+ for (m = 0; m <= 7; m++) greymask[m].masky = maskb[n][2][m & 3];
+ n = stackbl[colst]; cle += n;
+ for (m = 0; m <= 7; m++) greymask[m].maskk = maskb[n][3][m & 3];
+ clearing = (cle == 0);
+}
+static void preambl() { uchar l;
+ l = dvibyte(); num = dvinum(4); den = dvinum(4);
+ dvimag = dvinum(4); if (newmag != 0) dvimag = newmag;
+ conv = num / 254000.0 * ((double)xres / den) * (dvimag / 1000.0);
+ vconv = num / 254000.0 * ((double)yres / den) * (dvimag / 1000.0);
+ l = dvibyte(); dvibytes(comment, l); fprintf(prot, "%s\n", comment);
+}
+static void postamb() {
+ lpp = dvinum(4); num = dvinum(4); den = dvinum(4);
+ dvimag = dvinum(4); if (newmag != 0) dvimag = newmag;
+ conv = num / 254000.0 * ((double)xres / den) * (dvimag / 1000.0);
+ vconv = num / 254000.0 * ((double)yres / den) * (dvimag / 1000.0);
+ mxv = dvinum(4); mxh = dvinum(4); mst = dvinum(2); mpn = dvinum(2);
+}
+main(int argc, char **argv) { char *parm;
+ post = 0; fini = 0; started = 0; dviori = 0; pagnum = 0;
+ pag1 = 1; paganz = 9999; newmag = 0; q = 0; hoff = 78; voff = 156;
+ for (i = 0; i <= ymax; i++) {
+ Tptr( pxlmem[i] = (colpix *) malloc((xmb+1)*sizeof(colpix)) );
+ }
+ Tptr( fontvect = (fontdesc **) calloc(256, 4) );
+ initbitrev(); colst = 0;
+ stackcy[colst] = 0; stackma[colst] = 0;
+ stackye[colst] = 0; stackbl[colst] = maxink;
+
+ fprintf(prot, "This is the HP Deskjet 550 Color TeX driver, V 94.01 .\n");
+ fprintf(prot, "(C)opyright 1994 Wolfgang R. Mueller, Computing Centre,\n");
+ fprintf(prot, "Heinrich-Heine-University Duesseldorf, Germany\n");
+ if (argc == 1) {
+ fprintf(prot, "Please use with dvifilename and optional parameters\n");
+ fprintf(prot, " -s<starting page> (default: 1 i.e. first in file)\n");
+ fprintf(prot, " -c<number of pages> (default: 9999 i.e. all)\n");
+ fprintf(prot, " -m<new magnification> (default: from DVIfile)\n");
+ fprintf(prot, " -h<horizontal offset> (default: %ld (pixels)\n", hoff);
+ fprintf(prot, " -v<vertical offset> (default: %ld (pixels)\n", voff);
+ fprintf(prot, " -f<font directory> (default: %s)\n", fontprefix);
+ fprintf(prot, " -t<TFMfile directory> (default: %s)\n", tfmprefix);
+ fprintf(prot, " -o<outfile> (default: %s)\n", prfnam);
+ fprintf(prot, " prn for <outfile> goes directly to printer port,\n");
+ fprintf(prot, " empty <outfile> part is replaced by <DVIfile>.pcl\n");
+ exit(0);
+ }
+ strcpy(dviname, "texput");
+ for (j = 1; j < argc; j++) { parm = argv[j];
+ if (parm[0] != '-') { strcpy(dviname, parm);
+ } else { switch (parm[1]) {
+ case 's': case 'S': sscanf(parm+2, "%d", &pag1); break;
+ case 'c': case 'C': sscanf(parm+2, "%d", &paganz); break;
+ case 'f': case 'F': strcpy(fontprefix, parm+2); break;
+ case 't': case 'T': strcpy(tfmprefix, parm+2); break;
+ case 'm': case 'M': sscanf(parm+2, "%ld", &newmag); break;
+ case 'h': case 'H': sscanf(parm+2, "%ld", &hoff); break;
+ case 'v': case 'V': sscanf(parm+2, "%ld", &voff); break;
+ case 'o': case 'O': strcpy(prfnam, parm+2); break;
+ } } }
+ strcpy(defnam, dviname); prfeval(); dviopen(); postamb();
+ do { o = dvibyte(); /* fprintf(prot, "(%u)", (ushort)o); */
+ switch (o) {
+ case 128: case 129: case 130: case 131:
+ c = dvinum(o - 127); if (started) putchar_(); h += q; break;
+ case 132: a = dviint(4); b = dviint(4);
+ if (started) putrule(); h += b; break;
+ case 133: case 134: case 135: case 136:
+ c = dvinum(o - 132); if (started) putchar_(); break;
+ case 137: a = dviint(4); b = dviint(4);
+ if (started) putrule(); break;
+ case 138: break;
+ case 139: pagebeg(); break;
+ case 140: pageend(); break;
+ case 141: if (s < smax) { s++; hs[s - 1] = h; vs[s - 1] = v;
+ ws[s - 1] = w; xs[s - 1] = x; ys[s - 1] = y; zs[s - 1] = z;
+ } else baddvi("stack overflow"); break;
+ case 142: if (s > 0) { h = hs[s - 1]; v = vs[s - 1];
+ w = ws[s - 1]; x = xs[s - 1]; y = ys[s - 1]; z = zs[s - 1]; s--;
+ } else baddvi("stack underflow"); break;
+ case 143: case 144: case 145: case 146:
+ h += dviint(o - 142); break;
+ case 147: h += w; break;
+ case 148: case 149: case 150: case 151:
+ w = dviint(o - 147); h += w; break;
+ case 152: h += x; break;
+ case 153: case 154: case 155: case 156:
+ x = dviint(o - 152); h += x; break;
+ case 157: case 158: case 159: case 160:
+ v += dviint(o - 156); break;
+ case 161: v += y; break;
+ case 162: case 163: case 164: case 165:
+ y = dviint(o - 161); v += y; break;
+ case 166: v += z; break;
+ case 167: case 168: case 169: case 170:
+ z = dviint(o - 166); v += z; break;
+ case 235: case 236: case 237: case 238:
+ f = dvinum(o - 234); if (started) fontset(); break;
+ case 239: case 240: case 241: case 242:
+ spl = dvinum(o - 238); special(); break;
+ case 243: case 244: case 245: case 246:
+ f = dvinum(o - 242); deffont(); break;
+ case 247: preambl(); break;
+ case 248: fini = 1; break;
+ case 249: dviposit(0L); post = 1; break;
+ case 250: case 251: case 252:
+ case 253: case 254: case 255: break;
+ default:
+ if (o <= 127) {
+ c = o; if (started) putchar_(); h += q;
+ } else if (o >= 171 && o <= 234) {
+ f = o - 171; if (started) fontset();
+ } break; } } while (!fini);
+ prclos(); fclose(dvifile); exit(0);
+}
+
\ No newline at end of file diff --git a/dviware/dvidjc/turbo-c/dvivgac.c b/dviware/dvidjc/turbo-c/dvivgac.c new file mode 100644 index 0000000000..77504304dc --- /dev/null +++ b/dviware/dvidjc/turbo-c/dvivgac.c @@ -0,0 +1,1231 @@ +/* This is the color TeX previewer DVIVGA */ +/* (C)opyright 1994 Wolfgang R. Mueller, Computing Centre, +Heinrich-Heine-University Duesseldorf, Germany, +wolfgang@uni-duesseldorf.de, +49-211-311-3905. +This program may be used without any warranty under +the terms of the GNU general public licence. */ +/* translated from the original TurboPascal source +partly with p2c, the Pascal-to-C translator */ + +#include <stdio.h> +#ifdef __TURBOC__ + #include <mem.h> + #include <alloc.h> + #define malloc farmalloc + #define calloc farcalloc + #define realloc farrealloc + #define free farfree +#endif + +#define uchar unsigned char +#define ushort unsigned short +#define ulong unsigned long +#define ptr void * + +#define maxink 16 +#define inkshift 4 /* maxink == 1<<inkshift */ +#define smax 100 +#define xm 319 +#define ym 447 + +#ifdef __MSDOS__ +static char tfmprefix[] = "c:\\tex\\fonts\\tfm\\"; +static char fontprefix[] = "c:\\tex\\fonts\\canon\\"; +#else +static char tfmprefix[] = "/usr/TeX/lib/tex/fonts/"; +static char fontprefix[] = "/usr/TeX/lib/tex/fonts/"; +#endif + +static uchar maskmat[5][4] = { + {14,4,16,2},{7,9,5,11},{15,1,13,3},{6,12,8,10},{0x88,0x44,0x22,0x11}}; +typedef struct greydesc { uchar maskc, maskm, masky; } greydesc; + +static uchar stackcy[smax], stackma[smax], stackye[smax], stackbl[smax]; +static char STR[99], FOPRE[99], FOMAG[16], FONAM[99], FOLOC[99], FOFUL[99]; +static greydesc greymask[8]; +static uchar maskb[maxink + 1][4]; +static uchar cb[256], *pxlmem[ym+1]; + +static uchar alles, clearing, fini; +static short colst, xres=300, yres=300, xmax, hoff, voff; +static ushort darkfac; +static short xmb, ymax, hoffa=0, voffa=0; +static ulong zoelli; +static FILE *prot=stderr; + +static void finale(); +static void Tptr(p) void *p; { if(p==NULL) { + fprintf(prot, " - not enough memory :-( "); finale(); + } /* else fprintf(prot, "(free:%ld)", (long)coreleft());*/ +} +static void initpxmem() { short i; + for (i = 0; i <= ym; i++) Tptr(pxlmem[i] = (uchar *)malloc(xm + 1)); +} +static void clrpxlmem() { short i; + for (i = 0; i <= ym; i++) memset(pxlmem[i], 0, xm + 1); +} +static void pixet(y, x, b) ushort y, x; uchar b; { + uchar *wo; greydesc *WITH1; + wo = pxlmem[y] + x; WITH1 = &greymask[y & 7]; + if (clearing) * wo &= ~b; else * wo |= (b & WITH1->maskc); + if (clearing) *(wo +40) &= ~b; else *(wo +40) |= (b & WITH1->maskm); + if (clearing) *(wo +80) &= ~b; else *(wo +80) |= (b & WITH1->masky); +} +static void paxet(y, x, b) ushort y, x; uchar b; { + uchar *wo = pxlmem[y] + x; + if (clearing) *wo = (*wo * (64 - b)) >> 6; + else *wo += ((ushort)b * darkfac) >> inkshift; +} +static ushort vertfac=7; +static void verteil(x, w, y, h, xp, yp, zp) + ushort x, w, y, h, *xp, *yp, *zp; { + ushort xp1, yp1, zp1, xp2, yp2, zp2, wh, tau; ushort b; + if (w + h > 2) { + if (w > h) { wh = w >> 1; + verteil(x, wh, y, h, &xp1, &yp1, &zp1); + verteil(x + wh, w - wh, y, h, &xp2, &yp2, &zp2); + } else { wh = h >> 1; + verteil(x, w, y, wh, &xp1, &yp1, &zp1); + verteil(x, w, y + wh, h - wh, &xp2, &yp2, &zp2); + } + if (zp2 > zp1) { + tau = xp1; xp1 = xp2; xp2 = tau; tau = yp1; yp1 = yp2; yp2 = tau; + } *zp = zp1 + zp2; + if (*zp < 64) { *xp = xp1; *yp = yp1; return; } + pxlmem[xp1][yp1] += 1; *zp -= 64; *xp = xp2; *yp = yp2; return; + } + *xp = x; *yp = y; b = pxlmem[x][y]; if(b>64) b=64; b*=vertfac; + pxlmem[x][y] = b >> 6; *zp = b & 63; +} +#ifdef __TURBOC__ +#include <conio.h> +#include <dos.h> +#include <bios.h> +#define BIOI 0x10 +static uchar *vgamem=(uchar *)0xa0000000; +static ushort savemode; +static void dispinit() { uchar ret, *p; short i; + _AX = 0x0f00; geninterrupt(BIOI); ret=_AL; savemode=ret; + _AX = 0x1a00; geninterrupt(BIOI); ret=_AL; + if(ret != 0x1a) { fprintf(prot, "Only VGA supported !\n"); exit(1); } + initpxmem(); vgamem+=80*(480-ym-1); +} +static void dispopen() { ushort i; uchar *p; + /*while(!kbhit()) ;*/ + if (alles) { xmax = xm * 8 + 7; ymax = ym * 8 + 7; } + else { xmb = xm >> 3; xmax = xm; ymax = ym; } + clrpxlmem(); if (alles < 3) return; + _AX = 0x12; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x0000; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x0101; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x0202; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x0303; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x0404; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x0505; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x0606; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x0707; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x0708; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x0709; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x070a; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x070b; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x070c; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x070d; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x070e; geninterrupt(BIOI); + _AX = 0x1000; _BX = 0x070f; geninterrupt(BIOI); + if (vertfac == 7) { + _AX = 0x1010; _BX = 0x0000; _CX = 0x3f3f; _DH = 0x3f; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0001; _CX = 0x3636; _DH = 0x36; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0002; _CX = 0x2d2d; _DH = 0x2d; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0003; _CX = 0x2424; _DH = 0x24; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0004; _CX = 0x1b1b; _DH = 0x1b; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0005; _CX = 0x1212; _DH = 0x12; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0006; _CX = 0x0909; _DH = 0x09; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0007; _CX = 0x0000; _DH = 0x00; geninterrupt(BIOI); + } else { + _AX = 0x1010; _BX = 0x0000; _CX = 0x3f3f; _DH = 0x3f; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0001; _CX = 0x3f00; _DH = 0x3f; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0002; _CX = 0x3f3f; _DH = 0x00; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0003; _CX = 0x3f00; _DH = 0x00; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0004; _CX = 0x003f; _DH = 0x3f; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0005; _CX = 0x0000; _DH = 0x3f; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0006; _CX = 0x003f; _DH = 0x00; geninterrupt(BIOI); + _AX = 0x1010; _BX = 0x0007; _CX = 0x0000; _DH = 0x00; geninterrupt(BIOI); + } gotoxy(9,1); + printf("The HHU TeX colour Previewer (V 94.03) distributed by DANTE e.V."); + gotoxy(25,2); + printf("supporting \\special{color ...}"); + outportb(0x3c4,2); outportb(0x3c5,8); + for (i=0, p=vgamem+39; i<=ym; i++, p+=80) *p=0x01; + memset(vgamem-80, 0xff, 80); + gotoxy(43,4); printf("p(revious page) or backspace"); + gotoxy(43,5); printf("n(ext page) or enter or spacebar"); + gotoxy(43,6); printf("c(olour) g(rey) q(uit)"); + gotoxy(43,8); printf("Moving Magnifying Glass"); + gotoxy(43,10); printf("l(eft) r(ight) u(p) d(own)"); + gotoxy(43,11); printf(" ALT-ed: small stepsize"); + gotoxy(43,12); printf(" unshifted: medium stepsize"); + gotoxy(43,13); printf(" shifted: large stepsize"); + gotoxy(43,15); printf("cursor keys give medium,"); + gotoxy(43,16); printf("CTRL+left/right arrow large,"); + gotoxy(43,17); printf("PGUP/PGDOWN large stepsize"); + gotoxy(43,19); printf("HOME upper left corner"); + gotoxy(43,20); printf("END lower right corner"); + gotoxy(43,22); printf("Any of those keys activates"); + gotoxy(43,23); printf("the magnifying glass here."); +} +static uchar shiftab[4]={1,2,4,4}; +static void dispcopy() { ushort i, j, k; uchar b, *p, *q, l; + if (alles) { + if (vertfac == 7) { + alles = 0; + verteil(0, ym + 1, 0, xm + 1, &i, &j, &k); + for (l = 0; l < 3; l++) { + outportb(0x3c4,2); outportb(0x3c5,shiftab[l]); + for (j = 0; j <= ym; j++) { p = vgamem + j * 80; q = pxlmem[j]; + for (k = 0; k <= xm; k++) { + if ((k & 7) == 0) b = (*q & 0x01); + else { b = (b << 1) | (*q & 0x01); + if ((k & 7) == 7) *p++ = b; + } *q++ >>=1; + } } } + } else { switch (alles) { + case 3: outportb(0x3c4,2); outportb(0x3c5,2); break; + case 2: outportb(0x3c4,2); outportb(0x3c5,4); break; + case 1: outportb(0x3c4,2); outportb(0x3c5,1); break; + } alles--; + verteil(0, ym + 1, 0, xm + 1, &i, &j, &k); + for (j = 0; j <= ym; j++) { p = vgamem + j * 80; q = pxlmem[j]; + for (k = 0; k <= xm; k++) { + if ((k & 7) == 0) b = *q++; + else { b = (b << 1) | *q++; + if ((k & 7) == 7) *p++ = b; + } } } } + } else { ushort x1,x2,x,y1,y2,y; + outportb(0x3ce,4); outportb(0x3cf,3); + outportb(0x3c4,2); outportb(0x3c5,8); + x1 = (hoffa + xres) >> 3; x2 = x1 + (xm >> 3); + y1 = (voffa + yres) >> 3; y2 = y1 + (ym >> 3); + for (x=x1; x<=x2; x++) for (y=y1; y<=y2; y++) + if ((x==x1)||(x==x2)||(y==y1)||(y==y2)) + vgamem[y*80+(x>>3)] &= 0xff7f >> (x & 7); + hoffa = hoff; voffa = voff; + x1 = (hoffa + xres) >> 3; x2 = x1 + (xm >> 3); + y1 = (voffa + yres) >> 3; y2 = y1 + (ym >> 3); + for (x=x1; x<=x2; x++) for (y=y1; y<=y2; y++) + if ((x==x1)||(x==x2)||(y==y1)||(y==y2)) + vgamem[y*80+(x>>3)] |= 0x0080 >> (x & 7); + outportb(0x3c4,2); outportb(0x3c5,2); + for (j = 0, p = vgamem + 40; j <= ym; j++, p += 80) + memcpy(p, pxlmem[j] , 40); + outportb(0x3c4,2); outportb(0x3c5,4); + for (j = 0, p = vgamem + 40; j <= ym; j++, p += 80) + memcpy(p, pxlmem[j] + 40, 40); + outportb(0x3c4,2); outportb(0x3c5,1); + for (j = 0, p = vgamem + 40; j <= ym; j++, p += 80) + memcpy(p, pxlmem[j] + 80, 40); +} } + +static void dispclos() { _AX = savemode; geninterrupt(BIOI); +} +static char evalkbd() { char np=0; while (! kbhit()) ; + hoff += xres; voff += yres; + while (kbhit()) { + switch (getch()) { + case 'h': case 'H': hoff=0; voff=0; break; + case 'u': voff-=64; break; + case 'U': voff-=256; break; + case 'd': voff+=64; break; + case 'D': voff+=256; break; + case 'l': hoff-=64; break; + case 'L': hoff-=256; break; + case 'r': hoff+=64; break; + case 'R': hoff+=256; break; + case 'q': case 'Q': fini=1; break; + case 'n': case 'N': case 13: case ' ': np=1; break; + case 'p': case 'P': case 8: np=-1; break; + case 'c': vertfac=1; alles=3; break; + case 'g': vertfac=7; alles=3; break; + case 0: switch (getch()) { + case 19: hoff+=8; break; + case 22: voff-=8; break; + case 32: voff+=8; break; + case 38: hoff-=8; break; + case 71: hoff=0; voff=0; break; + case 72: voff-=64; break; + case 73: voff-=256; break; + case 75: hoff-=64; break; + case 77: hoff+=64; break; + case 79: hoff=xm << 3; voff=ym << 3; break; + case 80: voff+=64; break; + case 81: voff+=256; break; + case 115: hoff-=256; break; + case 116: hoff+=256; break; + } break; + } + } + if (hoff<0) hoff=0; if (hoff>xm*7-1) hoff=xm*7-1; hoff -= xres; + if (voff<0) voff=0; if (voff>ym*7+7) voff=ym*7+7; voff -= yres; + return(np); +} +#endif +static void setrect(xl, yl, xh, yh) ushort xl, yl, xh, yh; { + ushort x, y, xll, xrr; uchar a, b, c; + xll = xl >> 3; xrr = xh >> 3; + a = (0xff >> (xl & 7)) & 255; c = 0xff << (7 - (xh & 7)); + for (y = yl; y <= yh; y++) { b = a; + for (x = xll; x <= xrr; x++) { + if (x == xrr) b &= c; + pixet(y, x, b); b = 0xff; +} } } +static void setract(xl, yl, xh, yh) ushort xl, yl, xh, yh; { + ushort xlb, xhb, ylb, yhb, x, y; uchar xf, yf; + xlb = xl >> 3; xhb = xh >> 3; ylb = yl >> 3; yhb = yh >> 3; + if (xlb == xhb) { xf = xh - xl + 1; + if (ylb == yhb) { paxet(ylb, xlb, xf * (yh - yl + 1)); } else { + paxet(ylb, xlb, xf * (8 - (yl & 7))); + paxet(yhb, xlb, xf * ((yh & 7) + 1)); + for (y = ylb + 1; y < yhb; y++) paxet(y, xlb, xf * 8); + } } else if (ylb == yhb) { yf = yh - yl + 1; + paxet(ylb, xlb, yf * (8 - (xl & 7))); + paxet(ylb, xhb, yf * ((xh & 7) + 1)); + for (x = xlb + 1; x < xhb; x++) paxet(ylb, x, yf * 8); + } else { xf = 8 - (xl & 7); + for (x = xlb; x <= xhb; x++) { + yf = 8 - (yl & 7); if (x == xhb) xf = (xh & 7) + 1; + for (y = ylb; y <= yhb; y++) { + if (y == yhb) yf = (yh & 7) + 1; paxet(y, x, xf * yf); yf = 8; + } xf = 8; +} } } + +static char dviname[73]; +static FILE *dvifile; +static long dvimag; +static uchar dvibuf[2048]; +static ushort dvibufp, dvibufe; + +static void baddvi(s) char *s; { + fprintf(prot, "bad dvi: %s\n", s); dispclos(); exit(1); +} +static void dvibytes(s, l) char *s; uchar l; { ushort ll; + s[l] = '\0'; ll = dvibufe - dvibufp; + if (ll >= l) { + memmove((ptr)s, (ptr)(&dvibuf[dvibufp]), (long)l); + dvibufp += l; return; + } + if (ll > 0) memmove((ptr)s, (ptr)(&dvibuf[dvibufp]), (long)ll); + dvibufe = fread(dvibuf, 1, 2048, dvifile); + if (dvibufe + ll < l) baddvi("ends prematurely !"); + memmove((ptr)(&s[ll]), (ptr)dvibuf, (long)(l - ll)); + dvibufp = l - ll; +} +static uchar dvibyte() { uchar b; + if (dvibufp >= dvibufe) { dvibufp = 0; + dvibufe = fread(dvibuf, 1, 2048, dvifile); + } + if (dvibufp >= dvibufe) baddvi("ends prematurely !"); + b = dvibuf[dvibufp]; dvibufp++; return b; +} +static void dviskip(l) long l; { uchar b; + while (l > 0) { + l += (long)dvibufp - (long)dvibufe; + if (l <= 0) dvibufp = dvibufe + l; + else { dvibufp = dvibufe; l--; dvibyte(); } +} } +static long dvinum(b) uchar b; { uchar i; long n; + n = 0; + if (dvibufp + b > dvibufe) { + for (i = 1; i <= b; i++) n = (n << 8) | dvibyte(); return n; + } + for (i = 0; i < b; i++) n = (n << 8) | dvibuf[dvibufp + i]; + dvibufp += b; return n; +} +static long dviint(b) uchar b; { uchar i; long n; + if (dvibufp + b <= dvibufe) { + n = dvibuf[dvibufp]; + if (n > 127) n -= 256; + for (i = 1; i < b; i++) n = (n << 8) | dvibuf[dvibufp + i]; + dvibufp += b; return n; + } + n = dvibyte(); + if (n > 127) n -= 256; + for (i = 2; i <= b; i++) n = (n << 8) | dvibyte(); return n; +} +static void dviposit(l) long l; { fseek(dvifile, l, 0); + dvibufe = fread(dvibuf, 1, 2048, dvifile); dvibufp = 0; +} +static void dviopen() { long l; uchar j, em; ushort k; + sprintf(STR, "%s.dvi", dviname); + if ((dvifile = fopen(STR, "rb"))==0) { strcpy(STR, dviname); + if ((dvifile = fopen(STR, "rb"))==0) baddvi("not existing !"); + } + dvibufe = fread(dvibuf, 1, 2, dvifile); + if (dvibufe < 2) baddvi("empty !"); + em = dvibuf[1]; + if (dvibuf[0] != 247) baddvi("no valid preamble"); + /* now position to postamble */ + fseek(dvifile, 0L, 2); l=ftell(dvifile); if(l>2048) l=2048; + fseek(dvifile, -l, 2); k = fread(dvibuf, 1, 2048, dvifile); + do { k--; } while (k >= 4 && dvibuf[k] != em); + if (k < 4) baddvi("no postamble in last 2048 bytes !"); + dvibufe = k + 1; dvibufp = k - 4; l = dvinum(4); + fseek(dvifile, l, 0); dvibufe = fread(dvibuf, 1, 2048, dvifile); + dvibufp = 0; dvibyte(); +} + +typedef union chdesc { uchar b8[16]; + struct { short wid, hei, hof, vof; long bmp, tfw; } U1; + struct { long tfh, tfd, dum1, dum2; } U2; +} chdesc; +typedef struct fontdesc { + long dfn; char *fonam; chdesc *chv; + long danf; uchar *chm; short mch, fty; +} fontdesc; +static fontdesc **fontvect; +static uchar fontint; +static FILE *fofil; +static uchar *achm, *pkbuf; +static uchar fofbyte() { uchar b; + if (fread(&b, 1, 1, fofil) <= 0) b = 0; return b; +} +static long fofint(b) uchar b; { uchar i; long n; + n = fofbyte(); if (n > 127) n -= 256; + for (i = 2; i <= b; i++) n = (n << 8) | fofbyte(); + return n; +} + +static long hs[smax], vs[smax], ws[smax], xs[smax], ys[smax], zs[smax]; +static long cnt[10]; +static uchar bitrev[256]; +static char comment[256]; +static double conv, vconv; +static long l, landx, landy, newmag; +static long a, b, c, f, q, h, v, w, x, y, z; +static long chk, scf, dsz, fofchk, num, den, mag, spl, lpp, mxh, mxv; +static int pagnum, pag1, paganz, i, k; +static ushort s, mst, mpn; +static char dviori; +static uchar o, j, post, started, below; + +static void initbitrev() { uchar b, i, j, k, m, n; + for (i = 0; i <= maxink; i++) { + for (j = 0; j <= 3; j++) { b = 0; + for (k = 0; k <= 3; k++) { + if (maskmat[j][k] <= i) b |= maskmat[4][k]; + } maskb[i][j] = b; } } + cb[0] = 0; bitrev[0] = 0; m = 0x80; n = 1; + while (m) { /* count bits / put bits into reverse order within a byte */ + for (j = 0; j < n; j++) { cb[j + n] = cb[j] + 1; + bitrev[j + n] = bitrev[j] | m; + } n += n; m >>= 1; +} } +/*static long prodovz(a, b) ushort a, b; { return ((long)a * (long)b); } +static long scaled(w) long w; { long s; + union { long l; struct { ushort n, h; } U1; } a, b; + a.l = w; b.l = scf; + s = (((((ulong)prodovz(a.U1.n, b.U1.n)) >> 16) + prodovz(a.U1.n, + b.U1.h) + prodovz(a.U1.h, b.U1.n)) >> 4) + + (prodovz(a.U1.h, b.U1.h) << 12); + if (w < 0) s -= scf << 12; return s; +}*/ +static long scaled(w) long w; { long s; ulong t=w, u=scf; + /* should return w * scf / 2**20 */ + s = ( ( (((t & 65535L) * (u & 65535L)) >> 16) + + (t & 65535L) * (u >> 16) + + (t >> 16) * (u & 65535L) ) >> 4) + + ( ( (t >> 16) * (u >> 16) ) << 12); + if (w < 0) s -= scf << 12; return s; +} + +static void tfmdef() { short ll, lh, bc, ec, nw, nh, nd, i; + uchar b1, b2, b3; short FORLIM; + fontdesc *WITH = fontvect[fontint]; + sprintf(STR, "%s%s.tfm", tfmprefix, FONAM); + fprintf(prot, "trying %s instead", STR); + fofil = fopen(STR, "rb"); + if (fofil==0) { fprintf(prot, " - absent as well :-(\n"); return; } + ll = fofint(2); lh = fofint(2); bc = fofint(2); ec = fofint(2); + nw = fofint(2); nh = fofint(2); nd = fofint(2); fseek(fofil, 0L, 2); + if (ll * 4 > ftell(fofil) || ll < lh + ec - bc + nw + nh + nd + 7) { + fprintf(prot, " - not a TFMfile !\n"); fclose(fofil); return; + } + WITH->mch = ec; + Tptr( WITH->chv = (chdesc *)calloc(WITH->mch + 1, sizeof(chdesc)) ); + fseek(fofil, 24L, 0); fofchk = fofint(4); + if (chk != 0) if (fofchk != 0) if (chk != fofchk) + fprintf(prot, " *+* wrong checksum *+* "); + fseek(fofil, (lh + ec - bc + 7L) * 4, 0); + FORLIM = nw + nh + nd; + for (i = 0; i < FORLIM; i++) + WITH->chv[i].U2.dum1 = scaled(fofint(4)); + fseek(fofil, lh * 4L + 24, 0); + for (i = bc; i <= ec; i++) { + b1 = fofbyte(); b2 = fofbyte(); fofbyte(); fofbyte(); + WITH->chv[i].U1.tfw = WITH->chv[b1].U2.dum1; + WITH->chv[i].U2.tfh = WITH->chv[nw + (b2 >> 4)].U2.dum1; + WITH->chv[i].U2.tfd = WITH->chv[nw + nh + (b2 & 15)].U2.dum1; + } + fclose(fofil); WITH->fty = 1; fprintf(prot, " - TFMfile OK\n"); +} +static void tfmchar() { short hr, vr, br, ar; uchar li, re, ob, un; + chdesc *WITH = &fontvect[fontint]->chv[c]; + switch (dviori) { + case 0: + hr = (short)(conv * h + 0.5)-hoff; + vr = (short)(vconv * (v - WITH->U2.tfh) + 0.5)-voff; + br = (short)(conv * (h + WITH->U1.tfw) + 0.5)-hoff; + ar = (short)(vconv * (v + WITH->U2.tfd) + 0.5)-voff; + break; + case 1: + hr = (short)(conv * (landx + v - WITH->U2.tfh) + 0.5)-hoff; + vr = (short)(vconv * (landy - h - WITH->U1.tfw) + 0.5)-voff; + br = (short)(conv * (landx + v + WITH->U2.tfd) + 0.5)-hoff; + ar = (short)(vconv * (landy - h) + 0.5)-voff; + break; + case 3: + hr = (short)(conv * (landx - v - WITH->U2.tfd) + 0.5)-hoff; + vr = (short)(vconv * (landy + h) + 0.5)-voff; + br = (short)(conv * (landx - v + WITH->U2.tfh) + 0.5)-hoff; + ar = (short)(vconv * (landy + h + WITH->U1.tfw) + 0.5)-voff; + break; + case 2: + hr = (short)(conv * (landx - h - WITH->U1.tfw) + 0.5)-hoff; + vr = (short)(vconv * (landy - v - WITH->U2.tfd) + 0.5)-voff; + br = (short)(conv * (landx - h) + 0.5)-hoff; + ar = (short)(vconv * (landy - v + WITH->U2.tfh) + 0.5)-voff; + break; + } + li = 1; re = 1; ob = 1; un = 1; + if (hr < 0) { hr = 0; li = 0; } + if (br > xmax) { br = xmax; re = 0; } + if (vr < 0) { vr = 0; ob = 0; } + if (ar > ymax) { ar = ymax; un = 0; below = 1; } + if (hr > br) return; + if (vr > ar) return; + if (ob) setrect(hr, vr, br, vr); + if (li) setrect(hr, vr, hr, ar); + if (un) setrect(hr, ar, br, ar); + if (re) setrect(br, vr, br, ar); +} +static void drawract(xl, yl, xh, yh) ushort xl, yl, xh, yh; { + ushort xlb, xhb, ylb, yhb, x, y; uchar xf, yf; + xlb = xl >> 3; xhb = xh >> 3; ylb = yl >> 3; yhb = yh >> 3; + if (xlb == xhb) { xf = xh - xl; + if (ylb == yhb) { paxet(ylb, xlb, (xf + yh - yl) << 1); } else { + paxet(ylb, xlb, xf - ((yl & 7) << 1) + 15); + paxet(yhb, xlb, xf + ((yh & 7) << 1) + 1); + for (y = ylb + 1; y < yhb; y++) paxet(y, xlb, maxink); return; + } } else if (ylb == yhb) { yf = yh - yl; + paxet(ylb, xlb, yf - ((xl & 7) << 1) + 15); + paxet(ylb, xhb, yf + ((xh & 7) << 1) + 1); + for (x = xlb + 1; x < xhb; x++) paxet(ylb, x, maxink); return; + } else { + for (x = xlb + 1; x < xhb; x++) { paxet(ylb, x, 8); paxet(yhb, x, 8); } + for (y = ylb + 1; y < yhb; y++) { paxet(y, xlb, 8); paxet(y, xhb, 8); } + paxet(ylb, xlb, 15 - (yl & 7) - (xl & 7)); + paxet(ylb, xhb, (xh & 7) - (yl & 7) + 8); + paxet(yhb, xlb, (yh & 7) - (xl & 7) + 8); + paxet(yhb, xhb, (xh & 7) + (yh & 7) + 1); +} } +static void tfmcher() { short hr, vr, br, ar; + chdesc *WITH = &fontvect[fontint]->chv[c]; + switch (dviori) { + case 0: + hr = (short)(conv * h + 0.5); + vr = (short)(vconv * (v - WITH->U2.tfh) + 0.5); + br = (short)(conv * (h + WITH->U1.tfw) + 0.5); + ar = (short)(vconv * (v + WITH->U2.tfd) + 0.5); + break; + case 1: + hr = (short)(conv * (landx + v - WITH->U2.tfh) + 0.5); + vr = (short)(vconv * (landy - h - WITH->U1.tfw) + 0.5); + br = (short)(conv * (landx + v + WITH->U2.tfd) + 0.5); + ar = (short)(vconv * (landy - h) + 0.5); + break; + case 3: + hr = (short)(conv * (landx - v - WITH->U2.tfd) + 0.5); + vr = (short)(vconv * (landy + h) + 0.5); + br = (short)(conv * (landx - v + WITH->U2.tfh) + 0.5); + ar = (short)(vconv * (landy + h + WITH->U1.tfw) + 0.5); + break; + case 2: + hr = (short)(conv * (landx - h - WITH->U1.tfw) + 0.5); + vr = (short)(vconv * (landy - v - WITH->U2.tfd) + 0.5); + br = (short)(conv * (landx - h) + 0.5); + ar = (short)(vconv * (landy - v + WITH->U2.tfh) + 0.5); + break; + } + if (hr < 0) hr = 0; if (br > xmax) br = xmax; + if (vr < 0) vr = 0; if (ar > ymax) ar = ymax; + if (hr <= br) if (vr <= ar) drawract(hr, vr, br, ar); +} + +#define PKN1 *achm++ +static short pki1() { short b; + b = PKN1; if (b > 127) b -= 256; return b; +} +static short pkn2() { short b; + b = PKN1; return (b * 256 + PKN1); +} +static short pki2() { short b; + b = PKN1; if (b > 127) b -= 256; + return (b * 256 + PKN1); +} +static long pkn3() { long b; short c; + b = PKN1; c = PKN1; + return ((b * 256 + c) * 256 + PKN1); +} +static long pki3() { long b; + b = pki1(); return (b * 65536L + pkn2()); +} +static long pki4() { long b; + b = pki2(); return (b * 65536L + pkn2()); +} +static void pkdef() { long a, l; ushort d; uchar b, bb; + uchar terminate; short i, j, c; fontdesc *WITH; chdesc *WITH1; + WITH = fontvect[fontint]; sprintf(STR, "%spk", FOFUL); + fprintf(prot,"preparing font %ld: %s", f, STR); + if( (fofil = fopen(STR, "rb"))==0) { + fprintf(prot," not found :-(\n"); + sprintf(STR, "%spk", FOLOC); + fprintf(prot,"preparing font %ld: %s", f, STR); + fofil = fopen(STR, "rb"); + } + if (fofil==0) { WITH->mch = -1; + fprintf(prot, " - file not found !\n"); return; + } + if ((fgetc(fofil)!=0xf7)||(fgetc(fofil)!=0x59)){ WITH->mch = -1; + fprintf(prot, " - not a PKfile !\n"); fclose(fofil); return; + } else { + fseek(fofil, 0L, 2); WITH->danf = ftell(fofil); + if (WITH->danf > 65520L) { WITH->mch = -1; fclose(fofil); + fprintf(prot, " - too big for this driver\n"); return; + } else { + Tptr( WITH->chv = (chdesc *)calloc(256, sizeof(chdesc)) ); + Tptr( pkbuf = (uchar *)malloc(WITH->danf) ); + fseek(fofil, 0L, 0); fread(pkbuf, WITH->danf, 1, fofil); + fclose(fofil); WITH->mch = -1; achm=pkbuf; terminate = 0; + do { b = PKN1; + if (b >= 240) { + switch (b) { + case 240: case 241: case 242: case 243: l = 0; + for (i = 240; i <= b; i++) l = (l << 8) + PKN1; + achm += l; break; + case 244: achm += 4; break; + case 245: terminate = 1; break; + case 246: break; + case 247: b = PKN1; i = PKN1; + achm += i + 4; fofchk = pki4(); + if (chk != 0) if (fofchk != 0) if (chk != fofchk) + fprintf(prot, " *+* wrong checksum *+* "); + achm += 8; break; + case 248: case 249: case 250: case 251: + case 252: case 253: case 254: case 255: break; + } + } else { d = (achm - pkbuf) - 1; bb = b & 7; + switch (bb) { + case 0: case 1: case 2: case 3: + l = bb * 256 + PKN1 - 8; c = PKN1; break; + case 4: case 5: case 6: l = bb - 4; + l = (l << 16) + pkn2() - 13; c = PKN1; break; + case 7: l = pki4() - 28; c = pki4(); break; + } + WITH1 = &WITH->chv[c]; + switch (bb) { + case 0: case 1: case 2: case 3: + WITH1->U1.tfw = scaled(pkn3()); PKN1; + WITH1->U1.wid = PKN1; WITH1->U1.hei = PKN1; + WITH1->U1.hof = pki1(); WITH1->U1.vof = pki1(); break; + case 4: case 5: case 6: + WITH1->U1.tfw = scaled(pkn3()); pkn2(); + WITH1->U1.wid = pkn2(); WITH1->U1.hei = pkn2(); + WITH1->U1.hof = pki2(); WITH1->U1.vof = pki2(); break; + case 7: + WITH1->U1.tfw = scaled(pki4()); pki4(); pki4(); + WITH1->U1.wid = pki4(); WITH1->U1.hei = pki4(); + WITH1->U1.hof = pki4(); WITH1->U1.vof = pki4(); break; + } + achm += l; + if ((unsigned)c <= 255) { + if (WITH->mch < c) WITH->mch = c; + WITH->chv[c].U1.bmp = d; + } } } while (!terminate); free(pkbuf); + if (WITH->mch < 0) fprintf(prot, " - PKfile in error !\n"); + else fprintf(prot, " - available\n"); + WITH->chv = (chdesc *) realloc(WITH->chv, 16*(WITH->mch + 1)); + Tptr( WITH->fonam = (char *) malloc(strlen(STR)+1) ); + strcpy(WITH->fonam, STR); +} } } +static struct { long repc, count; short xs, wid1, dynf, dyng, dynh; + ushort d; uchar db, white, bmerk, buf[ym + 1]; +} Lpkc; +static uchar pknib() { uchar Result; + if (Lpkc.bmerk != 0) { + Result = Lpkc.bmerk & 0xf; Lpkc.bmerk = 0; return Result; + } + Lpkc.bmerk = PKN1; Result = Lpkc.bmerk >> 4; + Lpkc.bmerk |= 0xf0; return Result; +} +static long pknum() { uchar i, j, k; long n; + k = 1; + do { i = pknib(); k++; + if (i == 0) { + do { j = pknib(); i++; } while (j == 0); + n = j; + while (i > 0) { i--; n = (n << 4) + pknib(); } + n += Lpkc.dyng; + } else if (i <= Lpkc.dynf) n = i; + else if (i < 14) n = (i << 4) + pknib() + Lpkc.dynh; + else if (i == 14) k = 0; + else { k = 1; n = 1; } + if (k == 1) Lpkc.repc = n; + } while (k != 2); return n; +} +static void pkline() { short j, x=0; uchar dd; + if (Lpkc.dynf == 14) { + j = Lpkc.wid1 + Lpkc.xs; + Lpkc.db += Lpkc.xs; + do { + if (Lpkc.db < 8) Lpkc.d = (Lpkc.d << 8) | PKN1; + else Lpkc.db -= 8; + dd = (Lpkc.d >> Lpkc.db) & 255; + if (j >= 8) { j -= 8; Lpkc.buf[x] = dd; + } else { Lpkc.db += 8 - j; + Lpkc.buf[x] = dd & (0xff00L >> j) & 255; + j = 0; + } x++; + } while (j != 0); + Lpkc.d &= 0xffffL >> (16 - Lpkc.db); return; + } + j = Lpkc.wid1; Lpkc.db = 8 - Lpkc.xs; Lpkc.d = 0; + if (Lpkc.repc > 0) { Lpkc.repc--; return; } + while (j > 0) { + if (Lpkc.count == 0) { Lpkc.count = pknum(); Lpkc.white = !Lpkc.white; } + dd = Lpkc.db; + if (dd > j) dd = j; + if (dd > Lpkc.count) dd = Lpkc.count; + if (Lpkc.white) Lpkc.db -= dd; + else { Lpkc.d += 1 << Lpkc.db; + Lpkc.db -= dd; Lpkc.d -= 1 << Lpkc.db; + } + Lpkc.count -= dd; j -= dd; + if (Lpkc.db == 0 || j == 0) { + Lpkc.buf[x] = Lpkc.d & 255; + x++; Lpkc.d = 0; Lpkc.db = 8; +} } } +static void pkchar() { short hr, vr; long bma, bmx; + short x, x1, x2, x3, y1, y2, y; uchar b, bb, mach, mac, mpm, bach; + fontdesc *WITH; chdesc *WITH1; + WITH = fontvect[fontint]; WITH1 = &WITH->chv[c]; + achm += WITH1->U1.bmp; b = PKN1; + Lpkc.white = ((b & 8) == 0); Lpkc.wid1 = WITH1->U1.wid; + Lpkc.dynf = b >> 4; + Lpkc.dyng = (13 - Lpkc.dynf) * 16 + Lpkc.dynf - 15; + Lpkc.dynh = -(Lpkc.dynf + 1) * 15; bb = b & 7; + switch (bb) { + case 0: case 1: case 2: case 3: achm += 10; break; + case 4: case 5: case 6: achm += 16; break; + case 7: achm += 36; break; + } + Lpkc.bmerk = 0; Lpkc.d = 0; Lpkc.db = 0; Lpkc.repc = 0; + Lpkc.count = 0; Lpkc.white = !Lpkc.white; + switch (dviori) { + case 0: + hr = (short)(conv * h + 0.5) - WITH1->U1.hof-hoff; + vr = (short)(vconv * v + 0.5) - WITH1->U1.vof-voff; + if (vr > ymax) below = 1; else { + if (vr + WITH1->U1.hei >= 1) { + x1 = (hr & -8L) / 8; x2 = ((hr + WITH1->U1.wid - 1) & -8L) / 8; + Lpkc.xs = hr & 7; y2 = vr + WITH1->U1.hei - 1; + if (y2 > ymax) { y2 = ymax; below = 1; } + x3 = x1; if (x3 < 0) x3 = 0; if (x2 > xmb) x2 = xmb; + if (x3 <= x2) { + for (y = vr; y <= y2; y++) { pkline(); + if (y >= 0) { + for (x = x3; x <= x2; x++) + pixet(y, x, Lpkc.buf[x-x1]); + } } } } } break; + case 1: + hr = (short)(conv * (landx + v) + 0.5) - WITH1->U1.vof-hoff; + vr = (short)(vconv * (landy - h) + 0.5) + WITH1->U1.hof-voff; + if (vr - WITH1->U1.wid + 1 > ymax) below = 1; else { + if (vr >= 0) { Lpkc.xs = 0; mac = 0x80; bma = 0; y1 = vr; + if (y1 > ymax) { below = 1; bma += ((ulong)(y1 - ymax)) >> 3; + mac = 0x80 >> ((y1 - ymax) & 7); y1 = ymax; + } + y2 = vr - WITH1->U1.wid + 1; if (y2 < 0) y2 = 0; + x2 = hr + WITH1->U1.hei - 1; if (x2 > xmax) x2 = xmax; + for (x3 = hr; x3 <= x2; x3++) { pkline(); + if (x3 >= 0) { + mach = mac; x = ((unsigned)x3) >> 3; + mpm = 0x80 >> (x3 & 7); bmx = bma; bach = Lpkc.buf[bmx]; + for (y = y1; y >= y2; y--) { + if ((bach & mach) != 0) pixet(y, x, mpm); + mach >>= 1; + if (mach == 0) { + mach = 0x80; bmx++; bach = Lpkc.buf[bmx]; + } } } } } } break; + case 3: + hr = (short)(conv * (landx - v) + 0.5) + WITH1->U1.vof-hoff; + vr = (short)(vconv * (landy + h) + 0.5) - WITH1->U1.hof-voff; + if (vr > ymax) below = 1; else { + if (vr + WITH1->U1.wid >= 1) { + Lpkc.xs = 0; mac = 0x80; bma = 0; y1 = vr; + if (y1 < 0) { bma += ((unsigned)(-y1)) >> 3; + mac = 0x80 >> ((-y1) & 7); y1 = 0; + } + y2 = vr + WITH1->U1.wid - 1; + if (y2 > ymax) { y2 = ymax; below = 1; } + x2 = hr - WITH1->U1.hei + 1; if (x2 < 0) x2 = 0; + for (x3 = hr; x3 >= x2; x3--) { pkline(); + if (x3 <= xmax) { + mach = mac; x = ((unsigned)x3) >> 3; + mpm = 0x80 >> (x3 & 7); bmx = bma; bach = Lpkc.buf[bmx]; + for (y = y1; y <= y2; y++) { + if ((bach & mach) != 0) pixet(y, x, mpm); + mach >>= 1; + if (mach == 0) { + mach = 0x80; bmx++; bach = Lpkc.buf[bmx]; + } } } } } } break; + case 2: + hr = (short)(conv * (landx - h) + 0.5) + WITH1->U1.hof-hoff; + vr = (short)(vconv * (landy - v) + 0.5) + WITH1->U1.vof-hoff; + if (vr - WITH1->U1.hei + 1 > ymax) below = 1; else { + if (vr >= 0) { + x1 = (hr & -8L) / 8; x2 = ((hr - WITH1->U1.wid + 1) & -8L) / 8; + Lpkc.xs = (7 - hr) & 7; y2 = vr - WITH1->U1.hei + 1; + if (y2 < 0) y2 = 0; + if (vr > ymax) below = 1; + if (x2 < 0) x2 = 0; x3 = x1; if (x3 > xmb) x3 = xmb; + if (x2 <= x3) { + for (y = vr; y >= y2; y--) { pkline(); + if (y <= ymax) { + for (x = x3; x >= x2; x--) + pixet(y, x, bitrev[Lpkc.buf[x1 - x]]); + } } } } } break; +} } +static void pklene() { short j; uchar dd; short s = 0; + if (Lpkc.dynf == 14) { j = Lpkc.wid1 + Lpkc.xs; Lpkc.db += Lpkc.xs; + do { + if (Lpkc.db < 8) Lpkc.d = (Lpkc.d << 8) | PKN1; + else Lpkc.db -= 8; + dd = (Lpkc.d >> Lpkc.db) & 255; + if (j >= 8) { j -= 8; Lpkc.buf[s] = cb[dd]; + } else { Lpkc.db += 8 - j; + Lpkc.buf[s] = cb[dd & (0xff00L >> j) & 255]; j = 0; + } s++; + } while (j != 0); + Lpkc.d &= 0xffffL >> (16 - Lpkc.db); return; + } + j = Lpkc.wid1; Lpkc.db = 8 - Lpkc.xs; Lpkc.d = 0; + if (Lpkc.repc > 0) { Lpkc.repc--; return; } + while (j > 0) { + if (Lpkc.count == 0) { Lpkc.count = pknum(); Lpkc.white = !Lpkc.white; } + dd = Lpkc.db; if (dd > j) dd = j; + if (dd > Lpkc.count) dd = Lpkc.count; + if (!Lpkc.white) Lpkc.d += dd; + Lpkc.db -= dd; Lpkc.count -= dd; j -= dd; + if (Lpkc.db == 0 || j == 0) { + Lpkc.buf[s] = Lpkc.d; s++; Lpkc.d = 0; Lpkc.db = 8; +} } } +static void pkcher() { short hr, vr, br, ar; + ushort s, s1, s2, t, t1, t2; + uchar ts, te, tr, tt, b, bb; uchar sum[ym + 1]; + fontdesc *WITH; chdesc *WITH1; + WITH = fontvect[fontint]; WITH1 = &WITH->chv[c]; + achm += WITH1->U1.bmp; b = PKN1; + Lpkc.white = ((b & 8) == 0); Lpkc.wid1 = WITH1->U1.wid; + Lpkc.dynf = b >> 4; + Lpkc.dyng = (13 - Lpkc.dynf) * 16 + Lpkc.dynf - 15; + Lpkc.dynh = -(Lpkc.dynf + 1) * 15; bb = b & 7; + switch (bb) { + case 0: case 1: case 2: case 3: achm += 10; break; + case 4: case 5: case 6: achm += 16; break; + case 7: achm += 36; break; + } + Lpkc.bmerk = 0; Lpkc.d = 0; Lpkc.db = 0; Lpkc.repc = 0; + Lpkc.count = 0; Lpkc.white = !Lpkc.white; + switch (dviori) { + case 0: + hr = (short)(conv * h + 0.5) - WITH1->U1.hof; + br = hr + WITH1->U1.wid - 1; + vr = (short)(vconv * v + 0.5) - WITH1->U1.vof; + ar = vr + WITH1->U1.hei - 1; + if (vr >= 0) if (ar <= ymax) if (hr >= 0) if (br <= xmax) { + s1 = hr >> 3; s2 = br >> 3; Lpkc.xs = hr & 7; + t1 = vr >> 3; t2 = ar >> 3; ts = vr & 7; + te = 7; tr = ar & 7; + for (t = t1; t <= t2; t++) { if (t == t2) te = tr; + for (s = s1; s <= s2; s++) sum[s] = 0; + for (tt = ts; tt <= te; tt++) { pklene(); + for (s = s1; s <= s2; s++) sum[s] += Lpkc.buf[s - s1]; + } ts = 0; for (s = s1; s <= s2; s++) paxet(t, s, sum[s]); + } } break; + case 1: + hr = (short)(conv * (landx + v) + 0.5) - WITH1->U1.vof; + br = hr + WITH1->U1.hei - 1; + vr = (short)(vconv * (landy - h) + 0.5) + WITH1->U1.hof; + ar = vr - WITH1->U1.wid + 1; + if (ar >= 0) if (vr <= ymax) if (hr >= 0) if (br <= xmax) { + s1 = vr >> 3; s2 = ar >> 3; Lpkc.xs = 7 - (vr & 7); + t1 = hr >> 3; t2 = br >> 3; ts = hr & 7; + te = 7; tr = br & 7; + for (t = t1; t <= t2; t++) { if (t == t2) te = tr; + for (s = s1; s >= s2; s--) sum[s] = 0; + for (tt = ts; tt <= te; tt++) { pklene(); + for (s = s1; s >= s2; s--) sum[s] += Lpkc.buf[s1 - s]; + } ts = 0; for (s = s1; s >= s2; s--) paxet(s, t, sum[s]); + } } break; + case 3: + hr = (short)(conv * (landx - v) + 0.5) + WITH1->U1.vof; + br = hr - WITH1->U1.hei + 1; + vr = (short)(vconv * (landy + h) + 0.5) - WITH1->U1.hof; + ar = vr + WITH1->U1.wid - 1; + if (vr >= 0) if (ar <= ymax) if (br >= 0) if (hr <= xmax) { + s1 = vr >> 3; s2 = ar >> 3; Lpkc.xs = vr & 7; + t1 = hr >> 3; t2 = br >> 3; ts = 7 - (hr & 7); + te = 7; tr = 7 - (br & 7); + for (t = t1; t >= t2; t--) { if (t == t2) te = tr; + for (s = s1; s <= s2; s++) sum[s] = 0; + for (tt = ts; tt <= te; tt++) { pklene(); + for (s = s1; s <= s2; s++) sum[s] += Lpkc.buf[s - s1]; + } ts = 0; for (s = s1; s <= s2; s++) paxet(s, t, sum[s]); + } } break; + case 2: + hr = (short)(conv * (landx - h) + 0.5) + WITH1->U1.hof; + br = hr - WITH1->U1.wid + 1; + vr = (short)(vconv * (landy - v) + 0.5) + WITH1->U1.vof; + ar = vr - WITH1->U1.hei + 1; + if (ar >= 0) if (vr <= ymax) if (br >= 0) if (hr <= xmax) { + s1 = hr >> 3; s2 = br >> 3; Lpkc.xs = 7 - (hr & 7); + t1 = vr >> 3; t2 = ar >> 3; ts = 7 - (vr & 7); + te = 7; tr = 7 - (ar & 7); + for (t = t1; t >= t2; t--) { if (t == t2) te = tr; + for (s = s1; s >= s2; s--) sum[s] = 0; + for (tt = ts; tt <= te; tt++) { pklene(); + for (s = s1; s >= s2; s--) sum[s] += Lpkc.buf[s1 - s]; + } ts = 0; for (s = s1; s >= s2; s--) paxet(t, s, sum[s]); + } } break; +} } + +static void fontdef() { uchar a, b, p, q; fontdesc *WITH; + if (f < 0) baddvi("negative fontnumber"); + b = f & 0xff; a = 0; + if ((f > 255) || (fontvect[b] != NULL)) do { + if (fontvect[a] == NULL) b = a; + else if (fontvect[a]->dfn == f) baddvi("double fontnumber"); + a++; + } while (a); + if (fontvect[b] != NULL) baddvi("too many fonts"); + fontint = b; + Tptr( fontvect[b] = (fontdesc *)malloc(sizeof(fontdesc)) ); + WITH = fontvect[fontint]; WITH->dfn = f; + chk = dvinum(4); scf = dvinum(4); dsz = dvinum(4); + WITH->chm = NULL; WITH->fty = -1; + p = dvibyte(); q = dvibyte(); dvibytes(FONAM, q); + if (p == 0) strcpy(FOPRE, fontprefix); else dvibytes(FOPRE, p); + sprintf(FOMAG, "%ld", + (long)(xres * dvimag / 1000.0 * ((double)scf / dsz) + 0.5)); +#ifdef __MSDOS__ + sprintf(FOFUL, "%s%s\\%s.", FOPRE, FOMAG, FONAM); + sprintf(FOLOC, "%s.", FONAM); +#else + sprintf(FOFUL, "%s%s.%s", FOPRE, FONAM, FOMAG); + sprintf(FOLOC, "%s.%s", FONAM, FOMAG); +#endif + pkdef(); if (WITH->mch < 0) tfmdef(); +} + +static void fontlod() { uchar b = 0; + fontdesc *WITH = fontvect[fontint]; + WITH->chm = (uchar *)malloc(WITH->danf); + if (WITH->chm == NULL) { do { + if (fontvect[b] != NULL) { + if (fontvect[b]->chm) free(fontvect[b]->chm); + fontvect[b]->chm = NULL; + } b++; + } while (b); + Tptr( WITH->chm = (uchar *)malloc(WITH->danf) ); + } + fofil = fopen(WITH->fonam, "rb"); + fread(WITH->chm, WITH->danf, 1, fofil); fclose(fofil); +} + +static void fontset() { uchar a, b, x; + b = f & 0xff; x = 0; + if (fontvect[b] != NULL) if (fontvect[b]->dfn == f) x = 1; + if (x == 0) { a = 0; + do { + if (fontvect[a] == NULL) a++; + else if (fontvect[a]->dfn != f) a++; + else { x = 1; b = a; a = 0; } + } while (a != 0); + } + if (x == 0) baddvi("undefined fontnumber"); + fontint = b; +} +static void putrale() { short hr, vr, br, ar; + if (b <= 0) return; + switch (dviori) { + case 0: + hr = (short)(conv * h + 0.5); + vr = (short)(vconv * (v - a) + 0.5); + br = (short)(conv * b + 0.5); if (br > 0) br--; + ar = (short)(vconv * a + 0.5); + break; + case 1: + hr = (short)(conv * (landx + v - a) + 0.5); + vr = (short)(vconv * (landy - h - b) + 0.5); + br = (short)(conv * a + 0.5); + ar = (short)(vconv * b + 0.5); if (ar > 0) ar--; + break; + case 3: + hr = (short)(conv * (landx - v) + 0.5); + vr = (short)(vconv * (landy + h) + 0.5); + br = (short)(conv * a + 0.5); + ar = (short)(vconv * b + 0.5); if (ar > 0) ar--; + break; + case 2: + hr = (short)(conv * (landx - h - b) + 0.5); + vr = (short)(vconv * (landy - v) + 0.5); + br = (short)(conv * b + 0.5); if (br > 0) br--; + ar = (short)(vconv * a + 0.5); + break; + } + ar += vr; br += hr; + if (hr < 0) hr = 0; + if (br > xmax) br = xmax; + if (vr < 0) vr = 0; + if (ar > ymax) { ar = ymax; below = 1; } + if (hr <= br) if (vr <= ar) { + setract(hr, vr, br, ar); +} } +static void putrule() { short hr, vr, br, ar; + if (b <= 0) return; + if (alles) { putrale(); return; } + switch (dviori) { + case 0: + hr = (short)(conv * h + 0.5)-hoff; + vr = (short)(vconv * (v - a) + 0.5)-voff; + br = (short)(conv * b + 0.5); if (br > 0) br--; + ar = (short)(vconv * a + 0.5); + break; + case 1: + hr = (short)(conv * (landx + v - a) + 0.5)-hoff; + vr = (short)(vconv * (landy - h - b) + 0.5)-voff; + br = (short)(conv * a + 0.5); + ar = (short)(vconv * b + 0.5); if (ar > 0) ar--; + break; + case 3: + hr = (short)(conv * (landx - v) + 0.5)-hoff; + vr = (short)(vconv * (landy + h) + 0.5)-voff; + br = (short)(conv * a + 0.5); + ar = (short)(vconv * b + 0.5); if (ar > 0) ar--; + break; + case 2: + hr = (short)(conv * (landx - h - b) + 0.5)-hoff; + vr = (short)(vconv * (landy - v) + 0.5)-voff; + br = (short)(conv * b + 0.5); if (br > 0) br--; + ar = (short)(vconv * a + 0.5); + break; + } + ar += vr; br += hr; + if (hr < 0) hr = 0; + if (br > xmax) br = xmax; + if (vr < 0) vr = 0; + if (ar > ymax) { ar = ymax; below = 1; } + if (hr <= br) if (vr <= ar) { + setrect(hr, vr, br, ar); +} } +static void putchar_() { fontdesc *WITH; chdesc *WITH1; + WITH = fontvect[fontint]; + if (c > WITH->mch) { q = 0; return; } + WITH1 = &WITH->chv[c]; q = WITH1->U1.tfw; + if (WITH->fty == 1) { if (alles) tfmcher(); else tfmchar(); return; } + if (WITH1->U1.bmp == 0) return; + if (WITH->chm == NULL) fontlod(); + achm = WITH->chm; if(alles) pkcher(); else pkchar(); +} +static void pageinit() { greydesc *WITH; + s = 0; w = 0; x = 0; y = 0; z = 0; + if (alles) { + h = (long)(xres / conv + 0.5); + v = (long)(yres / vconv + 0.5); + } else { h = 0; v = 0; } + for (j = 0; j <= 7; j++) { WITH = &greymask[j]; + WITH->maskc = 0xff; WITH->maskm = 0xff; WITH->masky = 0xff; + } darkfac = maxink; +} +static void pagebeg() { uchar j; + for (j = 0; j <= 9; j++) cnt[j] = dvinum(4); + lpp = dvinum(4); pagnum++; alles = 3; + if (pagnum >= pag1) { started = 1; } + zoelli = ftell(dvifile); zoelli += (long)dvibufp - (long)dvibufe; + dispopen(); pageinit(); +} +static void pageend() { char np; + if (s != 0) fprintf(prot, "Stack not empty at EOP\n"); + if (!started) return; dispcopy(); + if (alles) np = 0; else np = evalkbd(); + if (np == 0) { dviposit(zoelli); pageinit(); + dispopen(); + } + if (np < 0) if (lpp) dviposit(lpp); +} +static void deffont() { ushort l, m; + if (!post) { fontdef(); return; } + dviskip(12L); l = dvibyte(); m = dvibyte(); dviskip((long)(l + m)); +} +static void special() { long i, j, k; char *parm; + double x, y, cy, ma, ye, bl; short cle, m, n, b; + if (spl > 255) { fprintf(prot, "special >>"); + for (i = spl; i > 0; i--) fputc(dvibyte(), prot); + fprintf(prot, "<< ignored\n"); return; + } + dvibytes(comment, (int)spl); + if (!memcmp(comment, "landend", 7)) { dviori = 0; return; } + if (!memcmp(comment, "landstart", 9)) { + if (comment[10] == '1') dviori = 1; + else if (comment[10] == '0') dviori = 3; + else dviori = 2; + sscanf(comment+12, "%lg%lg", &x,&y); + j = (long)(x * 65535L + 0.5); + k = (long)(y * 65535L + 0.5); + switch (dviori) { + case 1: landx = h - v; landy = v + j + h; break; + case 3: landx = h + k + v; landy = v - h; break; + case 2: landx = h + h + k; landy = v + j + v; break; + } return; } + if (memcmp(comment, "color", 5)) { + fprintf(prot, "special >>%s<< ignored", comment); return; + } + parm = comment+6; + if (!memcmp(parm, "pop", 3)) { parm +=4; colst--; + if (colst < 0) { colst = 0; fprintf(prot, " color stack underflow"); } + } else { + if (!memcmp(parm, "push cmyk", 9)) { parm +=10; colst++; + if (colst > smax-1) { colst = smax-1; + fprintf(prot, " color stack overflow"); + } } + if (sscanf(parm,"%lg%lg%lg%lg",&cy,&ma,&ye,&bl)<4) { + fprintf(prot," color: cmyk values <%s> incomplete ",comment); return; + } + cy+=bl; ma+=bl; ye+=bl; bl=cy*0.3+ma*0.59+ye*0.11; + n = (short)(cy * maxink); if (n < 0) n = 0; + if (n > maxink) n = maxink; stackcy[colst] = n; + n = (short)(ma * maxink); if (n < 0) n = 0; + if (n > maxink) n = maxink; stackma[colst] = n; + n = (short)(ye * maxink); if (n < 0) n = 0; + if (n > maxink) n = maxink; stackye[colst] = n; + n = (short)(bl * maxink); if (n < 0) n = 0; + if (n > maxink) n = maxink; stackbl[colst] = n; + } + b = stackbl[colst]; cle = b; + n = stackcy[colst]; cle += n; if (alles == 3) darkfac = n; + for (m = 0; m <= 7; m++) + greymask[m].maskc = maskb[n][m & 3]; + n = stackma[colst]; cle += n; if (alles == 2) darkfac = n; + for (m = 0; m <= 7; m++) + greymask[m].maskm = maskb[n][m & 3]; + n = stackye[colst]; cle += n; if (alles == 1) darkfac = n; + for (m = 0; m <= 7; m++) + greymask[m].masky = maskb[n][m & 3]; + clearing = (cle == 0); if (vertfac == 7) darkfac = b; +} +static void preambl() { uchar l; + l = dvibyte(); num = dvinum(4); den = dvinum(4); + dvimag = dvinum(4); if (newmag != 0) dvimag = newmag; + conv = num / 254000.0 * ((double)xres / den) * (dvimag / 1000.0); + vconv = num / 254000.0 * ((double)yres / den) * (dvimag / 1000.0); + l = dvibyte(); dvibytes(comment, l); fprintf(prot, "%s\n", comment); +} +static void postamb() { + lpp = dvinum(4); num = dvinum(4); den = dvinum(4); + dvimag = dvinum(4); if (newmag != 0) dvimag = newmag; + conv = num / 254000.0 * ((double)xres / den) * (dvimag / 1000.0); + vconv = num / 254000.0 * ((double)yres / den) * (dvimag / 1000.0); + mxv = dvinum(4); mxh = dvinum(4); mst = dvinum(2); mpn = dvinum(2); + +} + +main(int argc, char **argv) { char *parm; + post = 0; fini = 0; started = 0; dviori = 0; pagnum = 0; + pag1 = 1; paganz = 9999; newmag = 0; q = 0; hoff = -xres; voff = -yres; + Tptr( fontvect = (fontdesc **) calloc(256, 4) ); + initbitrev(); colst = 0; dispinit(); + stackcy[colst] = maxink; stackma[colst] = maxink; + stackye[colst] = maxink; stackbl[colst] = maxink; + + fprintf(prot, "This is the VGA Color TeX driver, V 94.02 .\n"); + fprintf(prot, "(C)opyright 1994 Wolfgang R. Mueller, Computing Centre,\n"); + fprintf(prot, "Heinrich-Heine-University Duesseldorf, Germany\n"); + if (argc == 1) { + fprintf(prot, "Please use with dvifilename and optional parameters\n"); + fprintf(prot, " -s<starting page> (default: 1 i.e. first in file)\n"); + fprintf(prot, " -m<new magnification> (default: from DVIfile)\n"); + fprintf(prot, " -f<font directory> (default: %s)\n", fontprefix); + fprintf(prot, " -t<TFMfile directory> (default: %s)\n", tfmprefix); + exit(0); + } + strcpy(dviname, "texput"); + for (j = 1; j < argc; j++) { parm = argv[j]; + if (parm[0] != '-') { strcpy(dviname, parm); + } else { switch (parm[1]) { + case 's': case 'S': sscanf(parm+2, "%d", &pag1); break; + case 'f': case 'F': strcpy(fontprefix, parm+2); break; + case 't': case 'T': strcpy(tfmprefix, parm+2); break; + case 'm': case 'M': sscanf(parm+2, "%ld", &newmag); break; + } } } + dviopen(); postamb(); + do { o = dvibyte(); /* fprintf(prot, "(%u)", (ushort)o); */ + if (o <= 127) { + c = o; if (started) putchar_(); h += q; + } else if (o >= 171 && o <= 234) { + f = o - 171; if (started) fontset(); + } else switch (o) { + case 128: case 129: case 130: case 131: + c = dvinum(o - 127); if (started) putchar_(); h += q; break; + case 132: a = dviint(4); b = dviint(4); + if (started) putrule(); h += b; break; + case 133: case 134: case 135: case 136: + c = dvinum(o - 132); if (started) putchar_(); break; + case 137: a = dviint(4); b = dviint(4); + if (started) putrule(); break; + case 138: break; + case 139: pagebeg(); break; + case 140: pageend(); break; + case 141: if (s < smax) { s++; hs[s - 1] = h; vs[s - 1] = v; + ws[s - 1] = w; xs[s - 1] = x; ys[s - 1] = y; zs[s - 1] = z; + } else baddvi("stack overflow"); break; + case 142: if (s > 0) { h = hs[s - 1]; v = vs[s - 1]; + w = ws[s - 1]; x = xs[s - 1]; y = ys[s - 1]; z = zs[s - 1]; s--; + } else baddvi("stack underflow"); break; + case 143: case 144: case 145: case 146: + h += dviint(o - 142); break; + case 147: h += w; break; + case 148: case 149: case 150: case 151: + w = dviint(o - 147); h += w; break; + case 152: h += x; break; + case 153: case 154: case 155: case 156: + x = dviint(o - 152); h += x; break; + case 157: case 158: case 159: case 160: + v += dviint(o - 156); break; case 161: v += y; break; + case 162: case 163: case 164: case 165: + y = dviint(o - 161); v += y; break; + case 166: v += z; break; + case 167: case 168: case 169: case 170: + z = dviint(o - 166); v += z; break; + case 235: case 236: case 237: case 238: + f = dvinum(o - 234); if (started) fontset(); break; + case 239: case 240: case 241: case 242: + spl = dvinum(o - 238); special(); break; + case 243: case 244: case 245: case 246: + f = dvinum(o - 242); deffont(); break; + case 247: preambl(); break; + case 248: fini = 1; break; + case 249: dviposit(0L); post = 1; break; + case 250: case 251: case 252: + case 253: case 254: case 255: break; + } } while (!fini); + dispclos(); fclose(dvifile); exit(0); +} +static void finale() { dispclos(); exit(1); } diff --git a/dviware/dvidjc/turbo-c/maketcc.bat b/dviware/dvidjc/turbo-c/maketcc.bat new file mode 100644 index 0000000000..e4306f682c --- /dev/null +++ b/dviware/dvidjc/turbo-c/maketcc.bat @@ -0,0 +1,3 @@ +tcc -edvi550c -ml -DDJ550C -I. -L. dvidjc.c
+tcc -edvi500c -ml -DDJ500C -I. -L. dvidjc.c
+tcc -edvi500 -ml -DDJ500 -I. -L. dvidjc.c
diff --git a/dviware/dvidjc/turbo-c/makevga.bat b/dviware/dvidjc/turbo-c/makevga.bat new file mode 100644 index 0000000000..5aab8731ca --- /dev/null +++ b/dviware/dvidjc/turbo-c/makevga.bat @@ -0,0 +1,2 @@ +tcc -edvivgac -ml -I. -L. dvivgac.c
+
\ No newline at end of file |