/* Output from p2c, the Pascal-to-C translator */ /* From input file "bm2font.pas" */ /*1:*/ #include "p2c.h" /* p2c: bm2font.pas, line 1: * Note: Unexpected name "texfile" in program header [262] */ /* p2c: bm2font.pas, line 1: * Note: Unexpected name "tfmfile" in program header [262] */ /* p2c: bm2font.pas, line 1: * Note: Unexpected name "pxlfile" in program header [262] */ /* p2c: bm2font.pas, line 1: * Note: Unexpected name "bitmap" in program header [262] */ /* p2c: bm2font.pas, line 1: * Note: Unexpected name "tmpfil" in program header [262] */ /*logfile,*/ typedef uchar ebts; typedef short halfk; typedef long dynlong[52][129]; typedef unsigned short dynword[52][129]; typedef short korbyte[511]; typedef short spreadbyte[256]; /*55:*/ typedef unsigned short pxlstr; typedef ebts pxla[65522L]; /*:55*/ /*59:*/ typedef short pxlba[32761]; /*:59*/ /*91:*/ typedef uchar dmatrix[7][7]; /*:91*/ #define maxmemsize 32760 /*92:*/ Static dmatrix ditherm = { { 1, 3, 6, 10, 18, 26, 38 }, { 2, 4, 8, 12, 20, 28, 40 }, { 5, 7, 9, 14, 22, 30, 42 }, { 11, 13, 15, 16, 24, 32, 44 }, { 17, 19, 21, 23, 25, 34, 46 }, { 27, 29, 31, 33, 35, 36, 48 }, { 37, 39, 41, 43, 45, 47, 49 } }; /*:92*/ /*:1*/ /*2:*/ Static ebts hrep, vrep, xrep, yrep, patswitch, usecol, pminval, pmaxval, bufsh, nextbuf, tmpcolor, invbyte, invbit, xratio, yratio; Static unsigned short tpal[256]; Static long bitspsam, rowspstrip; Static unsigned short photoinf; Static short colpos; Static ebts pxllook[256]; Static ebts lutone[256]; Static ebts lutvga[256]; Static ebts lutsl[256]; Static double spreadcol, patref, greyunit; Static short greykor; Static short *gkorh, *gkordivp; Static short *spreadvals; Static short hktab[256]; Static boolean cspread; Static unsigned short bhell[256]; Static boolean cmyk, cyan, magenta, yellow, black, saveblack; Static short colcyan, colblack, colmagenta, colyellow; Static dmatrix colmatrix; Static unsigned short pxlcolor; Static boolean greypxl, egastretch, ledprinter, distribute, giftemp, pcxtemp; Static short maxcol; Static long usepxl, vusepxl, brightness; Static short greypix; Static ebts pattern[4][197][7]; Static ebts ipattern[4][197][7]; Static unsigned short tab[64][3]; Static uchar ccol; Static Char cref[77]; Static ebts b1[3000]; Static ebts b2[3000]; Static ebts b3[3000]; Static ebts b4[3000]; Static long linepos_, posbit; Static halfk dbuf; Static boolean clipon, zeroline, zerorow, nameok, fok; Static Char cmd[256]; Static Char bmname[256]; Static Char font[256]; Static Char tmpname[256]; Static Char fontpre[256]; Static Char fontupc[256]; Static ebts curpat[2]; Static short gbufp, gbufpp; Static halfk pxlinlen, zeropads; Static short mapwidth, mapheight, maplines, freelines; Static long mapinlen, newwidth, newheight; Static short a, b, f, nf, g, ng, ly, lx, minx, maxx, i, nj, j, v, k, pk, pkn; Static uchar pm, pn; Static unsigned short pl, pb; Static uchar c, cb; Static long fh, sh, fw, sw; Static unsigned short lf, lh, bc, ec, nw, nh, nd, ni, nl, nk, ne, np; Static union { uchar b[4]; long i; } cx; Static long checksum, dsize; Static long tabdsize[52]; Static long (*width)[129], (*height)[129]; Static unsigned short (*yoffset)[129], (*pwidth)[129], (*pheight)[129]; Static long dirpoint[129]; Static pxlstr pkpoint[129]; Static long hres, vres; Static double truehres, truevres; Static long noffonts, nofchars, mincharpf; Static uchar charpf[53]; /*logfile,*/ Static FILE *texfile; Static FILE *bitmap, *pxlfile, *tmpfil; Static short filestat; Static unsigned short gi; Static boolean invert; Static unsigned short cv, dv, lv; Static Char comment[256]; Static Char aliasname[256]; Static boolean aliasused; Static double mapdiv; Static long pkwidth, pkheight; Static boolean nowhite, halfinch; Static pxlstr nextmemfree; /*25:*/ Static ebts cutrep, outputbyte; Static halfk cutlen; Static boolean cutgrey; /*:25*/ /*53:*/ Static Char tfmstr[256]; Static uchar tfmb; Static FILE *tfmfile; /*:53*/ /*56:*/ Static uchar *pxlbm; Static pxlstr pxlbmi; /*:56*/ /*58:*/ Static uchar *pkbm; Static short *repbm; Static pxlstr pkloc; /*:58*/ /*62:*/ Static short bitweight; /*:62*/ /*64:*/ Static ebts car; /*:64*/ /*69:*/ Static short cxoff, cyoff; /*:69*/ /*73:*/ Static short power[9]; /*:73*/ /*93:*/ Static double valinc, redval, grx, grxzero; Static long gradint; Static uchar *greymem; Static long pgreymem; Static boolean randomst, newrandom; Static Char texfile_NAME[_FNSIZE]; Static Char bitmap_NAME[_FNSIZE]; Static Char pxlfile_NAME[_FNSIZE]; Static Char tmpfil_NAME[_FNSIZE]; Static Char tfmfile_NAME[_FNSIZE]; /*:93*/ /*:2*/ /*6:*/ Static uchar korrlastb(i, j) uchar i; short j; { ebts k; k = 8 - j; if (k > 0) { i >>= k; i <<= k; } return i; } /*:6*/ /*7:*/ Static uchar pxladd(i, j, k) uchar i, j; short k; { i = (i << k) & 255; j >>= k; return (i | j); } /*:7*/ /*8:*/ Static unsigned short getcolor() { halfk j, k; unsigned short a, o; ebts savcol, lcol, rcol, l, r; if (cutgrey) { if ((cutrep & 127) == 0) { if (cutrep == 128) colpos++; cutrep = b1[(halfk)colpos]; colpos++; } savcol = b1[(halfk)colpos]; if (cutrep < 128) colpos++; cutrep--; return savcol; } a = colpos; colpos += bitspsam; o = a + bitspsam - 1; l = a & 7; r = (o + 1) & 7; k = o >> 3; j = a >> 3; lcol = b1[j]; rcol = b1[k]; if (k != j) { savcol = lcol << l; savcol = (savcol >> (l - r)) ^ (rcol >> (8 - r)); return savcol; } savcol = lcol << l; savcol >>= l; if (r > 0) savcol >>= 8 - r; return savcol; } /*:8*/ /*10:*/ Static Void sepcols(cr, cg, cb) uchar cr, cg, cb; { colcyan = 255 - cr; colmagenta = 255 - cg; colyellow = 255 - cb; if (colcyan != colmagenta || colcyan != colyellow || colmagenta != colyellow) { colcyan -= colmagenta / 3; if (colcyan < 0) colcyan = 0; colmagenta -= colyellow / 3; if (colmagenta < 0) colmagenta = 0; } colblack = colcyan; if (colblack > colmagenta) colblack = colmagenta; if (colblack > colyellow) colblack = colyellow; } /*:10*/ /*11:*/ Static Char *numtostr(Result, i) Char *Result; long i; { Char nstr[256]; sprintf(nstr, "%ld", i); return strcpy(Result, nstr); } /*:9*/ /*10:*/ Static Void korrfont() { uchar i, j; i = strpos2(font, "/", 1); while (i > 0) { strdelete((Anyptr)font, 1, i); i = strpos2(font, "/", 1); } j = strlen(font); i = strpos2(font, ".", 1); if (i != 0) strdelete((Anyptr)font, i, j - i + 1); if (strlen(font) > 7) font[7] = '\0'; } /*:10*/ /*11:*/ Static Void whatistrue() { hres = (long)floor(truehres + 0.5); vres = (long)floor(truevres + 0.5); if (halfinch) { hres /= 2; vres /= 2; } hres -= hres & 7; if (hres * vres <= 262136L) return; if (truehres > truevres) { hres = (long)sqrt(262136.0) - 31; vres = (long)(hres * truevres / truehres); return; } if (truevres > truehres) { vres = (long)sqrt(262136.0) - 31; hres = (long)(vres * truehres / truevres); } else { hres = (long)sqrt(262136.0) - 31; vres = hres; } } /*:11*/ /*12:*/ Static Void outfix(k) long k; { short a; long f; char j; long delta; union { ebts b[4]; long i; } ax; char dig[12]; ax.i = k; #ifdef INTEL a = (long)ax.b[3] * 16 + ax.b[2] / 16; f = ((ax.b[2] & 15) * 256 + ax.b[1]) * 256 + ax.b[0]; #else a = (long)ax.b[0] * 16 + ax.b[1] / 16; f = ((ax.b[1] & 15) * 256 + ax.b[2]) * 256 + ax.b[3]; #endif if (a > 2047) { putc('-', texfile); a = 4096 - a; if (f > 0) { f = 1048576L - f; a--; } } j = 0; do { dig[j] = a % 10; a /= 10; j++; } while (a != 0); do { j--; fprintf(texfile, "%d", dig[j]); } while (j != 0); putc('.', texfile); f = f * 10 + 5; delta = 10; do { if (delta > 1048576L) f += 524288L - delta / 2; fprintf(texfile, "%ld", f / 1048576L); f = f % 1048576L * 10; /* p2c: bm2font.pas, line 102: * Note: Using % for possibly-negative arguments [317] */ delta *= 10; } while (f > delta); } /*:12*/ /*13:*/ Static Void fileproblem() { printf("file-error %d : ", filestat); switch (filestat) { case 2: printf("file not found"); break; case 3: printf("path not found"); break; case 4: printf("too many files open"); break; case 5: printf("file access denied"); break; case 6: printf("invalid file handle"); break; case 12: printf("invalid file access mode"); break; case 15: printf("invalid drive number"); break; case 101: printf("disk full"); break; default: printf("ask a tpc guru"); break; } printf("!\n"); if (pcxtemp) /* p2c: bm2font.pas, line 112: Note: Called procedure Exec [285] */ #ifdef MSDOS Exec("del", "pcxtemp.tmp"); #else Exec("rm", "pcxtemp.tmp"); #endif if (giftemp) /* p2c: bm2font.pas, line 112: Note: Called procedure Exec [285] */ #ifdef MSDOS Exec("del", "giftemp.tmp"); #else Exec("rm", "giftemp.tmp"); #endif if (greypxl) /* p2c: bm2font.pas, line 112: Note: Called procedure Exec [285] */ #ifdef MSDOS Exec("del", tmpname); #else Exec("rm", tmpname); #endif } /*:13*/ /*14:*/ Static Void opentempfile() { strcpy(tmpname, "pcxtemp.tmp"); strcpy(tmpfil_NAME, "pcxtemp.tmp"); filestat = P_ioresult; if (filestat == 0) fok = false; else fok = true; if (fok) { printf("tempfile pcxtemp.tmp not accessable, abort\n"); fileproblem(); _Escape(0); } if (tmpfil != NULL) tmpfil = freopen(tmpfil_NAME, "w+b", tmpfil); else tmpfil = fopen(tmpfil_NAME, "w+b"); _SETIO(tmpfil != NULL, FileNotFound); filestat = P_ioresult; if (filestat == 0) fok = false; else fok = true; if (!fok) return; printf("Unable to create pcxtmp.tmp, abort\n"); fileproblem(); _Escape(0); } /*:14*/ /*15:*/ Static Void picstretch() { short FORLIM; printf("Stretching the picture because of odd aspect ratio\n"); posbit = 0; giftemp = true; strcpy(tmpname, "giftemp.tmp"); strcpy(tmpfil_NAME, "giftemp.tmp"); filestat = P_ioresult; if (filestat == 0) fok = false; else fok = true; if (fok) { printf("tempfile giftemp.tmp not accessable, abort\n"); fileproblem(); _Escape(0); } if (tmpfil != NULL) tmpfil = freopen(tmpfil_NAME, "w+b", tmpfil); else tmpfil = fopen(tmpfil_NAME, "w+b"); if (tmpfil == NULL) _EscIO(FileNotFound); while (!P_eof(bitmap)) { fread(b1, mapinlen, 1, bitmap); if (posbit == xratio) { if (bitspsam == 8) { FORLIM = mapinlen; for (gbufp = 0; gbufp < FORLIM; gbufp++) b3[gbufp] = ((unsigned)(b3[gbufp] + b1[gbufp])) >> 1; } else if (bitspsam == 4) { FORLIM = mapinlen; for (gbufp = 0; gbufp < FORLIM; gbufp++) { b = ((unsigned)((b3[gbufp] >> 4) + (b1[gbufp] >> 4))) >> 1; c = ((unsigned)((b3[gbufp] & 15) + (b1[gbufp] & 15))) >> 1; b3[gbufp] = (b << 4) + c; } } /* p2c: bm2font.pas, line 131: * Note: Can't interpret size in BLOCKWRITE [174] */ _SETIO(fwrite(b3, mapinlen, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } posbit = 0; } posbit++; if (posbit == xratio) { FORLIM = mapinlen; for (gbufp = 0; gbufp < FORLIM; gbufp++) b3[gbufp] = b1[gbufp]; } /* p2c: bm2font.pas, line 135: * Note: Can't interpret size in BLOCKWRITE [174] */ _SETIO(fwrite(b1, mapinlen, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } } /* p2c: bm2font.pas, line 126: * Note: Can't interpret size in BLOCKREAD [174] */ if (bitmap != NULL) fclose(bitmap); bitmap = NULL; if (tmpfil != NULL) fclose(tmpfil); tmpfil = NULL; strcpy(bitmap_NAME, "giftemp.tmp"); if (bitmap != NULL) bitmap = freopen(bitmap_NAME, "r+b", bitmap); else bitmap = fopen(bitmap_NAME, "r+b"); if (bitmap == NULL) _EscIO(FileNotFound); posbit = 0; cutgrey = false; if (pcxtemp) { /* p2c: bm2font.pas, line 140: Note: Called procedure Exec [285] */ #ifdef MSDOS Exec("del", "pcxtemp.tmp"); #else Exec("rm", "pcxtemp.tmp"); #endif pcxtemp = false; } } /*:15*/ /*16:*/ Static Void scaling() { /*17:*/ long newh, newv, counth, countv; double scaleh, scalev, ledfac, repfac; boolean grver, grhor, remlast; short FORLIM; if (ledprinter) ledfac = 0.5; else ledfac = 0.0; if (hrep != 1) repfac = 2.0; else repfac = 1.0; if (!greypxl) { usepxl = 1; vusepxl = 1; bitspsam = 1; } if (newwidth != 0) newwidth = (long)floor( newwidth * truehres / 25.4 / (repfac * (usepxl + ledfac)) + 0.5); if (newheight != 0) newheight = (long)floor( newheight * truevres / 25.4 / (repfac * (vusepxl + ledfac)) + 0.5); if (newheight == 0) newheight = (long)floor((double)mapheight / mapwidth * newwidth + 0.5); if (newwidth == 0) newwidth = (long)floor((double)mapwidth / mapheight * newheight + 0.5); printf("Scaling the picture from %dx%d", mapwidth, mapheight); printf(" to %ldx%ld pixels\n", newwidth, newheight); grver = (newheight > mapheight); grhor = (newwidth > mapwidth); if (grhor) scaleh = newwidth / (newwidth - mapwidth + 1.0); else scaleh = mapwidth / (mapwidth - newwidth + 1.0); if (grver) /*:17*/ scalev = newheight / (newheight - mapheight + 1.0); else scalev = mapheight / (mapheight - newheight + 1.0); /*18:*/ if (giftemp) strcpy(tmpname, "pcxtemp.tmp"); else strcpy(tmpname, "giftemp.tmp"); strcpy(tmpfil_NAME, tmpname); filestat = P_ioresult; if (filestat == 0) fok = false; else fok = true; if (fok) { printf("tempfile %s not accessable, abort\n", tmpname); fileproblem(); _Escape(0); } if (tmpfil != NULL) tmpfil = freopen(tmpfil_NAME, "w+b", tmpfil); else tmpfil = fopen(tmpfil_NAME, "w+b"); if (tmpfil == NULL) _EscIO(FileNotFound); /*:18*/ pxlinlen = (halfk)(((unsigned long)(mapwidth * bitspsam + 7)) >> 3); greypix = mapwidth; if (cutgrey) { checksum = mapheight; pxlinlen = cutlen; } else checksum = mapheight; pl = 0; fseek(bitmap, posbit, 0); for (pk = 0; pk <= 255; pk++) lutsl[pk] = pk << (8 - bitspsam); newv = 1; countv = 0; remlast = false; do { pxlinlen = fread(b1, 1, pxlinlen, bitmap); colpos = 0; cutrep = 0; gbufpp = (newwidth * bitspsam + 7) / 8; memset((Anyptr)b4, invbyte, sizeof(uchar) * 1500L); FORLIM = greypix; for (pk = 0; pk < FORLIM; pk++) b4[pk] = getcolor(); if (remlast) { FORLIM = greypix; for (pk = 0; pk < FORLIM; pk++) b4[pk] = (b2[pk] * 2 + b4[pk]) / 3; remlast = false; } gbufp = 0; cb = 0; /* p2c: bm2font.pas, line 172: * Note: Can't interpret size in FILLCHAR [174] */ memset((Anyptr)b3, invbyte, (long)gbufpp); newh = 1; counth = 0; pk = 0; while (pk < greypix) { /*19:*/ cb = lutsl[b4[pk]]; dbuf = ((unsigned)gbufp) >> 3; bufsh = gbufp & 7; nextbuf = bufsh + bitspsam; switch (bufsh) { case 0: b3[dbuf] = cb; break; default: b3[dbuf] ^= cb >> bufsh; if (nextbuf > 8) b3[dbuf + 1] = cb << (8 - bufsh); break; } gbufp += bitspsam; pk++; counth++; if (counth != (long)floor(newh * scaleh + 0.5)) continue; if (grhor) { while (counth >= (long)floor(newh * scaleh + 0.5)) { if (pk == greypix) cb = lutsl[(b4[pk - 1] * 2 + b4[pk - 2]) / 3]; else cb = lutsl[(b4[pk] * 2 + b4[pk - 1]) / 3]; dbuf = ((unsigned)gbufp) >> 3; bufsh = gbufp & 7; nextbuf = bufsh + bitspsam; switch (bufsh) { case 0: b3[dbuf] = cb; break; default: b3[dbuf] ^= cb >> bufsh; if (nextbuf > 8) b3[dbuf + 1] = cb << (8 - bufsh); break; } gbufp += bitspsam; counth++; newh++; } continue; } while (counth == (long)floor(newh * scaleh + 0.5)) { b4[pk + 1] = (b4[pk + 1] * 2 + b4[pk]) / 3; pk++; newh++; counth++; } } /*:19*/ if (bitspsam == 1) { dbuf = ((unsigned)gbufp) >> 3; bufsh = gbufp & 7; if (dbuf < gbufpp) { cb = invbyte; b3[dbuf] ^= cb >> bufsh; } } /* p2c: bm2font.pas, line 191: * Note: Can't interpret size in BLOCKWRITE [174] */ fwrite(b3, gbufpp, 1, tmpfil); checksum--; /*20:*/ countv++; if (cutgrey) pxlinlen = (halfk)(b1[pxlinlen - 1] * 256 + b1[pxlinlen - 2] + 2); if (countv == (long)floor(newv * scalev + 0.5)) { /*:20*/ if (grver) { while (countv >= (long)floor(newv * scalev + 0.5)) { fwrite(b3, gbufpp, 1, tmpfil); countv++; newv++; } /* p2c: bm2font.pas, line 194: * Note: Can't interpret size in BLOCKWRITE [174] */ } else { while (countv == (long)floor(newv * scalev + 0.5)) { pxlinlen = fread(b1, 1, pxlinlen, bitmap); colpos = 0; cutrep = 0; FORLIM = greypix; for (pk = 0; pk < FORLIM; pk++) b2[pk] = getcolor(); remlast = true; if (checksum > 0) checksum--; if (cutgrey) pxlinlen = (halfk)(b1[pxlinlen - 1] * 256 + b1[pxlinlen - 2] + 2); newv++; countv++; } /* p2c: bm2font.pas, line 196: * Note: Can't interpret size in BLOCKREAD [174] */ } } } while (checksum != 0); /* p2c: bm2font.pas, line 168: * Note: Can't interpret size in BLOCKREAD [174] */ if (bitmap != NULL) fclose(bitmap); bitmap = NULL; if (tmpfil != NULL) fclose(tmpfil); tmpfil = NULL; /*21:*/ if (giftemp) { /*:21*/ /* p2c: bm2font.pas, line 206: Note: Called procedure Exec [285] */ #ifdef MSDOS Exec("del", "giftemp.tmp"); #else Exec("rm", "giftemp.tmp"); #endif giftemp = false; pcxtemp = true; } else { /* p2c: bm2font.pas, line 206: Note: Called procedure Exec [285] */ #ifdef MSDOS Exec("del", "pcxtemp.tmp"); #else Exec("rm", "pcxtemp.tmp"); #endif giftemp = true; pcxtemp = false; } strcpy(bitmap_NAME, tmpname); if (bitmap != NULL) bitmap = freopen(bitmap_NAME, "r+b", bitmap); else bitmap = fopen(bitmap_NAME, "r+b"); if (bitmap == NULL) _EscIO(FileNotFound); posbit = 0; cutgrey = false; mapheight = newheight; mapwidth = newwidth; if (bitspsam == 1) pxlinlen = (mapwidth + 7) / 8; mapheight = (P_maxpos(bitmap)) / ((mapwidth * bitspsam + 7) / 8); } /*:16*/ /* Local variables for tifint: */ struct LOC_tifint { boolean le; uchar tb[3000]; } ; /*:22*/ /*23:*/ Local unsigned short tifword(ba, LINK) unsigned short ba; struct LOC_tifint *LINK; { if (LINK->le) return ((unsigned short)LINK->tb[ba] + (unsigned short)LINK->tb[ba + 1] * 256); else return ((unsigned short)(LINK->tb[ba] * 256) + (unsigned short)LINK->tb[ba + 1]); } Local long tiflong(ba, LINK) unsigned short ba; struct LOC_tifint *LINK; { if (LINK->le) return ((long)tifword(ba, LINK) + (long)tifword(ba + 2, LINK) * 65536L); else return (LINK->tb[ba] * 16777216 + LINK->tb[ba + 1] * 65536 + LINK->tb[ba + 2] * 256 + (long)LINK->tb[ba + 3]); } Local unsigned short tiftwobyte(ba, LINK) unsigned short ba; struct LOC_tifint *LINK; { if (LINK->le) return ((unsigned short)LINK->tb[ba] + (unsigned short)LINK->tb[ba + 1] * 256); else return ((unsigned short)(LINK->tb[ba] * 256) + (unsigned short)LINK->tb[ba + 1]); } /*22:*/ Static Void tifint() { /*:23*/ struct LOC_tifint V; unsigned short i, j, l, m, tl; long ll; uchar tp; boolean strips, tiffrgb; unsigned short ttype; long tiftemp; ebts tiffbuf[3]; unsigned short FORLIM; uchar FORLIM1; unsigned short FORLIM2; /*24:*/ strips = false; tl = fread(V.tb, 1, sizeof(uchar) * 1199, bitmap); V.le = (V.tb[1] == 'I'); ll = tiflong(4, &V); if (ll > 900) { printf("I can't digest this\n"); _Escape(0); } l = ll; m = tiftwobyte(l, &V); l += 2; for (i = 1; i <= m; i++) { j = tiftwobyte(l, &V); ttype = tiftwobyte(l + 2, &V); if (ttype == 3) tiftemp = tifword(l + 8, &V); else tiftemp = tiflong(l + 8, &V); switch (j) { case 256: mapwidth = tiftemp; break; case 257: mapheight = tiftemp; break; case 258: if (tiftemp > 1) { greypxl = true; bitspsam = tiftemp; if (bitspsam > 8) { printf("Assuming 8 greyshades\n"); bitspsam = 8; } mapdiv = 1.0; FORLIM1 = bitspsam; for (tp = 1; tp <= FORLIM1; tp++) mapdiv *= 2; mapdiv /= 16; } break; case 259: if (tiftemp > 1) { printf("No compression supported\n"); _Escape(0); } break; case 262: photoinf = tiftemp; if (photoinf > 1) tiffrgb = true; else tiffrgb = false; if (photoinf == 0) invert = !invert; if (invert) { invbit = 0; invbyte = 0; } else { invbit = 1; invbyte = 255; } photoinf = 15; break; case 273: if (tiflong(l + 4, &V) != 1) strips = true; posbit = tiftemp; break; case 277: if (tiftemp == 3) tiffrgb = true; else tiffrgb = false; break; case 278: rowspstrip = tiftemp; break; case 290: greyunit = 1.0; FORLIM1 = tifword(l + 4, &V); for (tp = 1; tp <= FORLIM1; tp++) greyunit /= 10; break; case 291: FORLIM1 = tiflong(l + 4, &V); for (tp = 0; tp < FORLIM1; tp++) tpal[tp] = V.tb[l + tp + 8]; break; } l += 12; if (l >= tl) { tl = fread(V.tb, 1, sizeof(uchar) * 1199, bitmap); l = 0; } } if (strips) { fseek(bitmap, posbit, 0); l = fread(V.tb, 1, sizeof(uchar) * 2, bitmap); posbit = tiflong(0, &V); } if (!tiffrgb) return; opentempfile(); fseek(bitmap, posbit, 0); FORLIM = mapheight; for (j = 1; j <= FORLIM; j++) { FORLIM2 = mapwidth; for (i = 0; i < FORLIM2; i++) { l = fread(tiffbuf, 1, 3, bitmap); if (cmyk) { sepcols(tiffbuf[0], tiffbuf[1], tiffbuf[2]); if (cyan) b3[i] = 255 - colcyan; if (magenta) b3[i] = 255 - colmagenta; if (yellow) b3[i] = 255 - colyellow; if (black) b3[i] = 255 - colblack; } else b3[i] = (long)floor(tiffbuf[0] * 0.287 + tiffbuf[1] * 0.589 + tiffbuf[2] * 0.114 + 0.5); } /* p2c: bm2font.pas, line 244: * Note: Can't interpret size in BLOCKREAD [174] */ /* p2c: bm2font.pas, line 257: * Note: Can't interpret size in BLOCKWRITE [174] */ fwrite(b3, mapwidth, 1, tmpfil); } if (bitmap != NULL) fclose(bitmap); bitmap = NULL; if (tmpfil != NULL) fclose(tmpfil); tmpfil = NULL; strcpy(bitmap_NAME, "pcxtemp.tmp"); if (bitmap != NULL) bitmap = freopen(bitmap_NAME, "r+b", bitmap); else bitmap = fopen(bitmap_NAME, "r+b"); if (bitmap == NULL) _EscIO(FileNotFound); posbit = 0; pcxtemp = true; mapinlen = mapwidth; } /*:24*/ /*26:*/ Static Void cutint() { long FORLIM; short FORLIM1; pxlinlen = 8; /* p2c: bm2font.pas, line 241: * Note: Can't interpret size in BLOCKREAD [174] */ pxlinlen = fread(b1, 1, pxlinlen, bitmap); if (pxlinlen != 8) { printf("CUT file too small!\n"); _Escape(0); } mapheight = b1[3] * 256 + b1[2]; mapwidth = b1[1] * 256 + b1[0]; photoinf = 15; mapdiv = 16.0; posbit = 8; cutlen = b1[7] * 256 + b1[6] + 2; bitspsam = 8; cutgrey = true; greypxl = true; if (!egastretch) return; mapinlen = mapwidth; printf("Shrinking the CUT picture because of odd aspect ratio\n"); giftemp = true; strcpy(tmpname, "giftemp.tmp"); strcpy(tmpfil_NAME, "giftemp.tmp"); filestat = P_ioresult; if (filestat == 0) fok = false; else fok = true; if (fok) { printf("tempfile giftemp.tmp not accessable, abort\n"); fileproblem(); _Escape(0); } if (tmpfil != NULL) tmpfil = freopen(tmpfil_NAME, "w+b", tmpfil); else tmpfil = fopen(tmpfil_NAME, "w+b"); if (tmpfil == NULL) _EscIO(FileNotFound); xratio = 2; posbit = 0; pxlinlen = cutlen; FORLIM = mapheight; for (checksum = 1; checksum <= FORLIM; checksum++) { pxlinlen = fread(b1, 1, pxlinlen, bitmap); colpos = 0; cutrep = 0; FORLIM1 = mapinlen; for (pk = 0; pk < FORLIM1; pk++) b2[pk] = getcolor(); posbit++; FORLIM1 = mapinlen; for (gbufp = 0; gbufp < FORLIM1; gbufp++) b3[gbufp] = b2[gbufp]; if (posbit < xratio) { _SETIO(fwrite(b2, mapinlen, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } } /* p2c: bm2font.pas, line 256: * Note: Can't interpret size in BLOCKWRITE [174] */ if (posbit > xratio) { FORLIM1 = mapinlen; for (gbufp = 0; gbufp < FORLIM1; gbufp++) b3[gbufp] = ((unsigned)(b3[gbufp] + b2[gbufp])) >> 1; /* p2c: bm2font.pas, line 261: * Note: Can't interpret size in BLOCKWRITE [174] */ _SETIO(fwrite(b3, mapinlen, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } posbit = 0; if (xratio == 2) xratio = 3; else xratio = 2; } pxlinlen = (halfk)(b1[pxlinlen - 1] * 256 + b1[pxlinlen - 2] + 2); } /* p2c: bm2font.pas, line 253: * Note: Can't interpret size in BLOCKREAD [174] */ if (bitmap != NULL) fclose(bitmap); bitmap = NULL; if (tmpfil != NULL) fclose(tmpfil); tmpfil = NULL; strcpy(bitmap_NAME, "giftemp.tmp"); if (bitmap != NULL) bitmap = freopen(bitmap_NAME, "r+b", bitmap); else bitmap = fopen(bitmap_NAME, "r+b"); if (bitmap == NULL) _EscIO(FileNotFound); cutgrey = false; posbit = 0; } typedef unsigned short tabcode[4097]; typedef uchar bytecod[4097]; typedef uchar ilaced[4]; typedef uchar ebts_; typedef long gifmask[13]; /* Local variables for gifint: */ struct LOC_gifint { ilaced ioff, ijump; long lvr, linepos; ebts_ logvr, codesample, modus, gifshift, nextbuf, bufsh; unsigned short maxcode, hh; short ec, ki; unsigned short hell[256]; ebts_ gifbuf[3000]; unsigned short codepos, gifinlen, gotinlen; long codesav; unsigned short dbuf, linebytes; } ; /*:27*/ /*28:*/ Local uchar getgif(LINK) struct LOC_gifint *LINK; { /* p2c: bm2font.pas, line 279: * Note: Can't interpret size in BLOCKREAD [174] */ fread(b1, 1, 1, bitmap); return (b1[0]); } Local Void gifout(b, LINK) unsigned short b; struct LOC_gifint *LINK; { short i, FORLIM; ebts_ ibits; if (gbufpp < 3000) b2[gbufpp] = LINK->hell[b]; gbufpp++; if (gbufpp != LINK->hh) return; LINK->codepos = 0; /* p2c: bm2font.pas, line 282: * Note: Can't interpret size in FILLCHAR [174] */ memset((Anyptr)LINK->gifbuf, invbyte, 3000L); FORLIM = LINK->hh; for (i = 0; i < FORLIM; i++) { LINK->dbuf = LINK->codepos / 8; LINK->bufsh = LINK->codepos & 7; LINK->nextbuf = LINK->bufsh + bitspsam; cb = lutsl[b2[i]]; if (LINK->bufsh == 0) LINK->gifbuf[LINK->dbuf] = cb; else { LINK->gifbuf[LINK->dbuf] |= cb >> LINK->bufsh; if (LINK->nextbuf > 8) LINK->gifbuf[LINK->dbuf + 1] = cb << (8 - LINK->bufsh); } LINK->codepos += bitspsam; } if (LINK->modus == 1) fseek(tmpfil, LINK->linepos, 0); if (bitspsam == 1) { i = 8 - (LINK->hh & 7); if (i != 8) { cb = LINK->gifbuf[LINK->dbuf] >> i; cb <<= i; LINK->gifbuf[LINK->dbuf] = cb; cb = invbit; for (ibits = 1; ibits <= i; ibits++) { LINK->gifbuf[LINK->dbuf] ^= cb; cb <<= 1; } } } /* p2c: bm2font.pas, line 291: * Note: Can't interpret size in BLOCKWRITE [174] */ _SETIO(fwrite(LINK->gifbuf, LINK->linebytes, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } LINK->lvr++; gbufpp = 0; LINK->linepos += LINK->linebytes * LINK->ijump[LINK->logvr]; if (LINK->linepos >= P_maxpos(tmpfil)-1) { LINK->logvr++; LINK->linepos = LINK->ioff[LINK->logvr] * LINK->linebytes; } } Local unsigned short gifcode(LINK) struct LOC_gifint *LINK; { unsigned short Result; static gifmask codemask = { 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095 }; long codebyte; while (LINK->gifshift < LINK->codesample) { codebyte = b1[gbufp]; gbufp++; if (gbufp == LINK->gifinlen) { LINK->gifinlen = getgif(LINK); /* p2c: bm2font.pas, line 303: * Note: Can't interpret size in BLOCKREAD [174] */ LINK->gotinlen = fread(b1, 1, LINK->gifinlen, bitmap); gbufp = 0; if (LINK->gifinlen == 0) printf("Code zero, proceeding\n"); if (LINK->gotinlen != LINK->gifinlen) { b1[LINK->gotinlen] = LINK->ec; LINK->gifinlen = LINK->gotinlen + 1; } } LINK->codesav |= codebyte << LINK->gifshift; LINK->gifshift += 8; } Result = LINK->codesav & codemask[LINK->codesample]; LINK->codesav = ((unsigned long)LINK->codesav) >> LINK->codesample; LINK->gifshift -= LINK->codesample; LINK->ki++; if (LINK->ki > LINK->maxcode && LINK->codesample < 12) { LINK->codesample++; LINK->maxcode = 1 << LINK->codesample; } return Result; } /*:26*/ /*27:*/ Static Void gifint() { /*:28*/ struct LOC_gifint V; static ilaced ioff = { 0, 4, 2, 1 }; static ilaced ijump = { 8, 8, 4, 2 }; unsigned short a, g, hi, vi, vh, hr, vr; short merk, ic, codegif, i; ebts_ colmap, b, col, bpp; ebts_ gpal[256][3]; unsigned short *codtab; unsigned short folge, minhell, maxhell; uchar *anf; Char hexbyte[7]; short FORLIM; /*29:*/ memcpy(V.ioff, ioff, sizeof(ilaced)); memcpy(V.ijump, ijump, sizeof(ilaced)); printf("Decoding GIF file\n"); V.logvr = 0; V.codesav = 0; V.lvr = 0; minhell = 9999; maxhell = 0; codtab = (unsigned short *)Malloc(sizeof(tabcode)); anf = (uchar *)Malloc(sizeof(bytecod)); opentempfile(); *hexbyte = '\0'; for (i = 1; i <= 3; i++) { sprintf(hexbyte + strlen(hexbyte), "%c", getgif(&V)); /* p2c: bm2font.pas, line 313: * Note: Possible string truncation in assignment [145] */ } if (strcmp(hexbyte, "GIF")) { printf("This file is NOT a gif file!\n"); _Escape(0); } for (i = 1; i <= 3; i++) { sprintf(hexbyte + strlen(hexbyte), "%c", getgif(&V)); /* p2c: bm2font.pas, line 315: * Note: Possible string truncation in assignment [145] */ } if (strcmp(hexbyte, "GIF87a") && strcmp(hexbyte, "GIF89a")) { printf("The program only supports version 87a and 89a!\n"); _Escape(0); } b = getgif(&V); hr = b; b = getgif(&V); hr += b * 256; b = getgif(&V); vr = b; b = getgif(&V); vr += b * 256; if (hr == 640 && vr == 350) { xratio = 3; yratio = 4; } b = getgif(&V); colmap = b & 128; colmap >>= 7; col = b & 112; col >>= 4; col++; bitspsam = b & 7; bitspsam++; b = getgif(&V); b = getgif(&V); if (colmap == 1) { /*30:*/ g = 1; FORLIM = bitspsam; for (i = 1; i <= FORLIM; i++) g *= 2; for (i = 0; i < g; i++) { for (j = 0; j <= 2; j++) gpal[i][j] = getgif(&V); if (cmyk) { sepcols(gpal[i][0], gpal[i][1], gpal[i][2]); if (cyan) V.hell[i] = 255 - colcyan; if (magenta) V.hell[i] = 255 - colmagenta; if (yellow) V.hell[i] = 255 - colyellow; if (black) V.hell[i] = 255 - colblack; bhell[V.hell[i]] = 255 - colblack; } else V.hell[i] = (long)floor(gpal[i][0] * 0.287 + gpal[i][1] * 0.589 + gpal[i] [2] * 0.114 + 0.5); if (V.hell[i] > maxhell) maxhell = V.hell[i]; } if (bitspsam > 1) { for (i = 0; i < g; i++) V.hell[i] = (long)floor((double)V.hell[i] / maxhell * (g - 1) + 0.5); for (i = 0; i < g; i++) bhell[i] = (long)floor((double)bhell[i] / maxhell * (g - 1) + 0.5); } else { V.hell[0] = 0; V.hell[1] = 1; bhell[0] = 0; bhell[1] = 1; } } b = getgif(&V); if (b != 44) { /*31:*/ while (b != 44) { /*:31*/ b = getgif(&V); switch (b) { case 249: a = getgif(&V); for (g = 0; g <= a; g++) b = getgif(&V); break; case 254: a = getgif(&V); while (a != 0) { for (g = 0; g <= a; g++) b = getgif(&V); a = b; if (P_eof(bitmap)) { printf("file ended while looking for image\n"); _Escape(0); } } break; case 1: case 255: a = getgif(&V); for (g = 1; g <= a; g++) b = getgif(&V); a = getgif(&V); while (a != 0) { for (g = 0; g <= a; g++) b = getgif(&V); a = b; if (P_eof(bitmap)) { printf("file ended while looking for image\n"); _Escape(0); } } break; } b = getgif(&V); if (P_eof(bitmap)) { printf("file ended while looking for image\n"); _Escape(0); } } } b = getgif(&V); hi = b; b = getgif(&V); hi += b * 256; b = getgif(&V); vi = b; b = getgif(&V); vi += b * 256; b = getgif(&V); V.hh = b; b = getgif(&V); V.hh += b * 256; b = getgif(&V); vh = b; b = getgif(&V); vh += b * 256; if (V.hh != hr || vh != vr) printf("No fragments supported!\n"); V.linebytes = (V.hh * bitspsam + (bitspsam - 1)+7) / 8; if (V.linebytes > 3000) { V.linebytes = 3000; printf("Sorry, had to cut picture to a width of 3000 bytes\n"); } b = getgif(&V); col = b & 128; col >>= 7; if (col != 0) { bitspsam = b & 7; bitspsam++; /*30:*/ g = 1; FORLIM = bitspsam; for (i = 1; i <= FORLIM; i++) g *= 2; for (i = 0; i < g; i++) { for (j = 0; j <= 2; j++) gpal[i][j] = getgif(&V); if (cmyk) { sepcols(gpal[i][0], gpal[i][1], gpal[i][2]); if (cyan) V.hell[i] = 255 - colcyan; if (magenta) V.hell[i] = 255 - colmagenta; if (yellow) V.hell[i] = 255 - colyellow; if (black) V.hell[i] = 255 - colblack; bhell[V.hell[i]] = 255 - colblack; } else V.hell[i] = (long)floor(gpal[i][0] * 0.287 + gpal[i][1] * 0.589 + gpal[i] [2] * 0.114 + 0.5); if (V.hell[i] > maxhell) maxhell = V.hell[i]; } for (i = 0; i < g; i++) V.hell[i] = (long)floor((double)V.hell[i] / maxhell * (g - 1) + 0.5); for (i = 0; i < g; i++) /*:30*/ bhell[i] = (long)floor((double)bhell[i] / maxhell * (g - 1) + 0.5); } for (pk = 0; pk <= 255; pk++) lutsl[pk] = pk << (8 - bitspsam); V.modus = b << 1; V.modus >>= 7; if (V.modus == 0) printf("Image is loaded sequentially.\n"); else printf("Interlaced mode, loading the image will take more time.\n"); if (V.modus != 0) { memset((Anyptr)V.gifbuf, invbyte, 3000L); for (i = 1; i <= vh; i++) { _SETIO(fwrite(V.gifbuf, V.linebytes, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } } /* p2c: bm2font.pas, line 379: * Note: Can't interpret size in BLOCKWRITE [174] */ V.linepos = 0; V.logvr = 0; fseek(tmpfil, 0L, 0); } /* p2c: bm2font.pas, line 378: * Note: Can't interpret size in FILLCHAR [174] */ bpp = b << 5; bpp >>= 5; bpp++; bpp = getgif(&V); g = 1 << bpp; ic = 1 << bpp; V.ec = ic + 1; V.codesample = bpp + 1; V.maxcode = 1 << V.codesample; for (i = 0; i <= 4095; i++) codtab[i] = 4098; V.ki = V.ec + 1; a = 4098; gbufpp = 0; V.gifshift = 0; V.gifinlen = getgif(&V); /* p2c: bm2font.pas, line 387: * Note: Can't interpret size in BLOCKREAD [174] */ fread(b1, V.gifinlen, 1, bitmap); gbufp = 0; if (V.gifinlen == 0) _Escape(0); merk = 0; /*32:*/ while (V.lvr < vh) { /*:32*/ codegif = gifcode(&V); if (codegif == V.ec) { printf("End of code before gif image completed!\n"); V.lvr = vh; continue; } if (codegif == ic) { for (i = 0; i <= 4095; i++) codtab[i] = 4098; V.ki = V.ec + 1; V.codesample = bpp + 1; V.maxcode = 1 << V.codesample; a = 4098; continue; } if (codegif < ic) gifout(codegif, &V); else { if (codtab[codegif] == 4098) { if (codegif != V.ki - 2) { printf("Bytes are mangled!\n"); _Escape(0); } folge = a; merk++; while (folge > ic) folge = codtab[folge]; b3[merk] = folge; anf[V.ki - 2] = folge; folge = a; } else folge = codegif; while (folge > ic && folge <= 4095) { merk++; b3[merk] = anf[folge]; folge = codtab[folge]; } merk++; b3[merk] = folge; while (merk > 0) { gifout(b3[merk], &V); merk--; } } if (a != 4098) { codtab[V.ki - 2] = a; if (codegif == V.ki - 2) { folge = a; while (folge > ic) folge = codtab[folge]; anf[V.ki - 2] = folge; } else { folge = codegif; while (folge > ic) folge = codtab[folge]; anf[V.ki - 2] = folge; } } a = codegif; } if (bitmap != NULL) fclose(bitmap); bitmap = NULL; if (tmpfil != NULL) fclose(tmpfil); tmpfil = NULL; if (bitspsam > 1) greypxl = true; mapinlen = V.linebytes; strcpy(bitmap_NAME, "pcxtemp.tmp"); if (bitmap != NULL) bitmap = freopen(bitmap_NAME, "r+b", bitmap); else bitmap = fopen(bitmap_NAME, "r+b"); if (bitmap == NULL) _EscIO(FileNotFound); pcxtemp = true; if (egastretch) { if (xratio + 1 == yratio) picstretch(); } posbit = 0; mapdiv = 1.0; FORLIM = bitspsam; for (i = 1; i <= FORLIM; i++) mapdiv *= 2; mapdiv /= 16; } /*:29*/ /*33:*/ Static uchar getpcx() { uchar Result; if (gbufp == pxlinlen) { gbufp = 0; pxlinlen = fread(b1, 1, sizeof(uchar) * 320, bitmap); } Result = b1[gbufp]; gbufp++; return Result; } /*:33*/ /*34:*/ Static long longpcx() { long bl; ebts pb; pb = getpcx(); bl = pb; pb = getpcx(); bl += pb * 256; pb = getpcx(); bl += pb * 65536; pb = getpcx(); bl += pb * 16777216; return bl; } /*:34*/ /*35:*/ Static unsigned short wordpcx() { unsigned short bl; ebts pb; pb = getpcx(); bl = pb; pb = getpcx(); bl += pb * 256; return bl; } /*:35*/ /*36:*/ Static Void pcxint() { unsigned short i, ki, k, hi, hh, vi, vh, hr, vr, bzf; ebts xb, j, b, a, col, bps, ibits, pcxver, pcxcomp; ebts gpal[256][3]; unsigned short hell[256]; unsigned short FORLIM; short FORLIM1; printf("Analysing PCX file %s\n", bmname); gbufp = 640; pxlinlen = 640; b = getpcx(); if (b != 10 && b != 205) { printf("What a bad joke!\n"); printf("This is NOT a PCX file!\n"); _Escape(0); } if (b == 205) printf("First byte 205, file seems to be captured!\n"); /*37:*/ pcxver = getpcx(); pcxcomp = getpcx(); bps = getpcx(); hi = getpcx(); b = getpcx(); hi += b * 256; vi = getpcx(); b = getpcx(); vi += b * 256; hh = getpcx(); b = getpcx(); hh += b * 256; vh = getpcx(); b = getpcx(); vh += b * 256; hr = getpcx(); b = getpcx(); hr += b * 256; vr = getpcx(); b = getpcx(); vr += b * 256; if (hr == 640 && vr == 350) { xratio = 3; yratio = 4; } if (hr == 320 && vr == 200) { xratio = 5; yratio = 6; } hh -= hi; vh -= vi; mapwidth = hh; for (i = 0; i <= 15; i++) { for (j = 0; j <= 2; j++) gpal[i][j] = getpcx(); } b = getpcx(); col = getpcx(); bzf = getpcx(); b = getpcx(); bzf += b * 256; hh = bzf; b = getpcx(); b = getpcx(); for (i = 70; i <= 127; i++) b = getpcx(); bitspsam = bps; if (col == 4) { bitspsam = 4; greypxl = true; } else if (bps > 1) { bitspsam = bps; greypxl = true; } mapinlen = ((unsigned long)(mapwidth * bitspsam + 7)) >> 3; /*:37*/ /*38:*/ for (i = 0; i <= 15; i++) { if (cmyk) { sepcols(gpal[i][0], gpal[i][1], gpal[i][2]); if (cyan) hell[i] = 255 - colcyan; if (magenta) hell[i] = 255 - colmagenta; if (yellow) hell[i] = 255 - colyellow; if (black) hell[i] = 255 - colblack; hell[i] /= 16; if (hell[i] > 15) hell[i] = 15; bhell[hell[i]] = 0; } else hell[i] = (long)(gpal[i][0] / 16.0 * 0.287 + gpal[i][1] / 16.0 * 0.589 + gpal[i][2] / 16.0 * 0.114); } for (i = 0; i <= 15; i++) { if (hell[i] > 15) hell[i] = 15; } for (i = 0; i <= 15; i++) { if (bhell[i] > 15) bhell[i] = 15; } opentempfile(); /*:38*/ if (pcxver == 5 && bitspsam > 4) { /*39:*/ gbufp = 640; pxlinlen = 640; posbit = P_maxpos(bitmap); posbit -= 769; fseek(bitmap, posbit, 0); b = getpcx(); if (b != 12) { printf("No valid information in 256 colors palette\n"); printf("Using standard 16 colors palette\n"); } else { for (i = 0; i <= 255; i++) { for (j = 0; j <= 2; j++) gpal[i][j] = getpcx(); if (cmyk) { sepcols(gpal[i][0], gpal[i][1], gpal[i][2]); if (cyan) hell[i] = 255 - colcyan; if (magenta) hell[i] = 255 - colmagenta; if (yellow) hell[i] = 255 - colyellow; if (black) hell[i] = 255 - colblack; bhell[hell[i]] = 255 - colblack; } else hell[i] = (long)floor(gpal[i][0] * 0.287 + gpal[i][1] * 0.589 + gpal[i] [2] * 0.114 + 0.5); } } fseek(bitmap, 128L, 0); gbufp = 640; pxlinlen = 640; } /*:39*/ /*40:*/ a = 0; for (i = 0; i <= vh; i++) { /*:40*/ FORLIM1 = mapinlen; for (gbufpp = 0; gbufpp < FORLIM1; gbufpp++) b3[gbufpp] = 0; for (j = 0; j < col; j++) { gbufpp = 0; for (k = 1; k <= hh; k++) { if (a == 0) { b = getpcx(); if ((b & 0xc0) == 0xc0) { a = (b & 0x3f) - 1; b = getpcx(); } } else a--; if (col == 4) { for (ibits = 0; ibits <= 7; ibits++) { ki = gbufpp * 4 + (ibits >> 1); xb = b << ibits; xb >>= 7; xb <<= j; xb <<= (1 - (ibits & 1)) << 2; b3[ki] ^= xb; } } else { b3[gbufpp] = b; if (gbufpp == mapinlen - 1 && bitspsam == 1) { ki = 8 - (mapwidth & 7); if (ki != 8) { xb = b3[gbufpp] >> ki; xb <<= ki; b3[gbufpp] = xb; xb = invbit; for (ibits = 1; ibits <= ki; ibits++) { b3[gbufpp] ^= xb; xb <<= 1; } } } } gbufpp++; } } if (col == 4) { gbufpp = 0; hi = (hh - 1) * 4 + 3; for (k = 0; k <= hi; k++) { b3[gbufpp] = (hell[b3[k] >> 4] << 4) + hell[b3[k] & 15]; gbufpp++; } } else if (bps == 8 && pcxver == 5) { hi = hh - 1; for (k = 0; k <= hi; k++) b3[k] = hell[b3[k]]; gbufpp = hh; } /* p2c: bm2font.pas, line 489: * Note: Can't interpret size in BLOCKWRITE [174] */ _SETIO(fwrite(b3, mapinlen, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } if (hr == 640 && vr == 200) { _SETIO(fwrite(b3, mapinlen, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } } /* p2c: bm2font.pas, line 492: * Note: Can't interpret size in BLOCKWRITE [174] */ } if (bitmap != NULL) fclose(bitmap); bitmap = NULL; if (tmpfil != NULL) fclose(tmpfil); tmpfil = NULL; strcpy(bitmap_NAME, "pcxtemp.tmp"); if (bitmap != NULL) bitmap = freopen(bitmap_NAME, "rb", bitmap); else bitmap = fopen(bitmap_NAME, "rb"); if (bitmap == NULL) _EscIO(FileNotFound); pcxtemp = true; if (egastretch) { if (xratio + 1 == yratio) picstretch(); } posbit = 0; mapdiv = 1.0; FORLIM = bitspsam; for (i = 1; i <= FORLIM; i++) mapdiv *= 2; mapdiv /= 16; } /* Local variables for iffint: */ struct LOC_iffint { unsigned short hi, hh, vi, vh, compr; uchar a, b, col, bps; uchar gpal[256][3]; unsigned short hell[256]; Char bmstr[256]; long bmsize, bmoff, bl; } ; /*:41*/ /*42:*/ Local long ifflong(LINK) struct LOC_iffint *LINK; { ebts k; fread(b1, 4, 1, bitmap); LINK->bl = b1[0]; for (k = 1; k <= 3; k++) LINK->bl = LINK->bl * 256 + b1[k]; return LINK->bl; } /*:42*/ /*43:*/ Local unsigned short iffword(LINK) struct LOC_iffint *LINK; { fread(b1, 2, 1, bitmap); return (b1[0] * 256 + b1[1]); } /*:43*/ /*44:*/ Local Void junkchunk(LINK) struct LOC_iffint *LINK; { if (LINK->bmsize > P_maxpos(bitmap)) { printf("File endend while reading junk\n"); _Escape(0); } while (LINK->bmsize > 0) { fread(&LINK->b, 1, 1, bitmap); LINK->bmsize--; } /* p2c: bm2font.pas, line 509: * Note: Can't interpret size in BLOCKREAD [174] */ } /*:44*/ /*45:*/ Local Void checkchunk(LINK) struct LOC_iffint *LINK; { short i, j, FORLIM; if (!strcmp(LINK->bmstr, "BMHD")) { LINK->bmsize = ifflong(LINK); if (LINK->bmsize & 1) LINK->bmsize++; LINK->hh = iffword(LINK); LINK->vh = iffword(LINK); LINK->hi = iffword(LINK); LINK->vi = iffword(LINK); /* p2c: bm2font.pas, line 513: * Note: Can't interpret size in BLOCKREAD [174] */ fread(&LINK->bps, 1, 1, bitmap); /* p2c: bm2font.pas, line 513: * Note: Can't interpret size in BLOCKREAD [174] */ fread(&LINK->b, 1, 1, bitmap); /* p2c: bm2font.pas, line 514: * Note: Can't interpret size in BLOCKREAD [174] */ fread(&LINK->b, 1, 1, bitmap); LINK->compr = LINK->b; for (i = 1; i <= 4; i++) fread(&xratio, 1, 1, bitmap); /* p2c: bm2font.pas, line 515: * Note: Can't interpret size in BLOCKREAD [174] */ /* p2c: bm2font.pas, line 515: * Note: Can't interpret size in BLOCKREAD [174] */ fread(&yratio, 1, 1, bitmap); LINK->bmsize -= 16; junkchunk(LINK); if (LINK->bps == 1) { LINK->col = 1; return; } if (LINK->bps == 4) LINK->col = 15; else LINK->col = 255; return; } if (!strcmp(LINK->bmstr, "CMAP")) { LINK->bmsize = ifflong(LINK); LINK->col = LINK->bmsize / 3 - 1; FORLIM = LINK->col; for (i = 0; i <= FORLIM; i++) { for (j = 0; j <= 2; j++) { fread(&LINK->b, 1, 1, bitmap); LINK->gpal[i][j] = LINK->b; } /* p2c: bm2font.pas, line 519: * Note: Can't interpret size in BLOCKREAD [174] */ if (cmyk) { colcyan = 255 - LINK->gpal[i][0]; colmagenta = 255 - LINK->gpal[i][1]; colyellow = 255 - LINK->gpal[i][2]; if (colcyan != colmagenta || colcyan != colyellow || colmagenta != colyellow) { colcyan -= colmagenta / 3; if (colcyan < 0) colcyan = 0; colmagenta -= colyellow / 3; if (colmagenta < 0) colmagenta = 0; } colblack = colcyan; if (colblack > colmagenta) colblack = colmagenta; if (colblack > colyellow) colblack = colyellow; if (cyan) LINK->hell[i] = 255 - colcyan; if (magenta) LINK->hell[i] = 255 - colmagenta; if (yellow) LINK->hell[i] = 255 - colyellow; if (black) LINK->hell[i] = 255 - colblack; } else LINK->hell[i] = (long)floor(LINK->gpal[i][0] * 0.287 + LINK->gpal[i] [1] * 0.589 + LINK->gpal[i][2] * 0.114 + 0.5); LINK->hell[i] = (long)(LINK->hell[i] / (256.0 / (LINK->col + 1))); bhell[LINK->hell[i]] = (long)(255 - colblack / (256.0 / (LINK->col + 1))); } if (LINK->bmsize & 1) fread(&LINK->b, 1, 1, bitmap); /* p2c: bm2font.pas, line 534: * Note: Can't interpret size in BLOCKREAD [174] */ return; } if (!strcmp(LINK->bmstr, "CRNG")) { LINK->bmsize = ifflong(LINK); LINK->bmoff = iffword(LINK); LINK->bmoff = iffword(LINK); LINK->bmoff = iffword(LINK); /* p2c: bm2font.pas, line 536: * Note: Can't interpret size in BLOCKREAD [174] */ fread(&LINK->b, 1, 1, bitmap); /* p2c: bm2font.pas, line 537: * Note: Can't interpret size in BLOCKREAD [174] */ fread(&LINK->a, 1, 1, bitmap); if (LINK->bmsize & 1) fread(&LINK->b, 1, 1, bitmap); /* p2c: bm2font.pas, line 537: * Note: Can't interpret size in BLOCKREAD [174] */ return; } LINK->bmsize = ifflong(LINK); if (LINK->bmsize & 1) LINK->bmsize++; junkchunk(LINK); } /*:36*/ /*41:*/ Static Void iffint() { /*:45*/ struct LOC_iffint V; unsigned short ohh; uchar cb; short FORLIM, FORLIM1; /*46:*/ printf("Analysing IFF file %s\n", bmname); opentempfile(); fread(V.bmstr, 4, 1, bitmap); V.bmstr[4] = '\0'; if (strcmp(V.bmstr, "FORM")) { printf("Graphic file not stored as Interchange File Format\n"); _Escape(0); } V.bmsize = ifflong(&V) + 8; if (V.bmsize != P_maxpos(bitmap)) { printf("File is incomplete, should contain %ld\n", V.bmsize); _Escape(0); } fread(V.bmstr, 4, 1, bitmap); V.bmstr[4] = '\0'; if (strcmp(V.bmstr, "ILBM")) printf("Type of file is %s, should be ILBM\n", V.bmstr); fread(V.bmstr, 4, 1, bitmap); V.bmstr[4] = '\0'; while (strcmp(V.bmstr, "BODY")) { if (P_eof(bitmap)) { printf("No graphics information available\n"); _Escape(0); } checkchunk(&V); fread(V.bmstr, 4, 1, bitmap); V.bmstr[4] = '\0'; } V.bmsize = ifflong(&V); V.hh = (V.hh * V.bps + 7) / 8; ohh = V.hh; if (ohh & 1) ohh++; FORLIM = V.vh; for (i = 1; i <= FORLIM; i++) { if (P_eof(bitmap)) { printf("ende\n"); _Escape(0); } if (V.compr == 0) fread(b3, ohh, 1, bitmap); else { /*47:*/ gbufp = 0; while (gbufp < ohh) { fread(&V.b, 1, 1, bitmap); V.bmoff++; if (V.b < 128) { V.b++; /* p2c: bm2font.pas, line 555: * Note: Can't interpret size in BLOCKREAD [174] */ fread(&b3[gbufp], V.b, 1, bitmap); gbufp += V.b; continue; } if (V.b <= 128) continue; /* p2c: bm2font.pas, line 556: * Note: Can't interpret size in BLOCKREAD [174] */ fread(&V.a, 1, 1, bitmap); V.b = 257 - V.b; while (V.b > 0) { b3[gbufp] = V.a; gbufp++; V.b--; } } /* p2c: bm2font.pas, line 554: * Note: Can't interpret size in BLOCKREAD [174] */ } /*:47*/ /* p2c: bm2font.pas, line 553: * Note: Can't interpret size in BLOCKREAD [174] */ if (V.bps == 4) { /*48:*/ gi = 0; FORLIM1 = V.hh; for (gbufpp = 0; gbufpp < FORLIM1; gbufpp++) b2[gbufpp] = 0; V.a = 0; FORLIM1 = V.hh; for (gbufpp = 0; gbufpp < FORLIM1; gbufpp++) { V.b = b3[gbufpp]; for (j = 0; j <= 3; j++) { cb = V.b & 128; cb >>= 3 - V.a; b2[gi] ^= cb; V.b <<= 1; cb = V.b & 128; cb >>= 7 - V.a; b2[gi] ^= cb; V.b <<= 1; gi++; } if (gi >= V.hh) { gi = 0; V.a++; } } FORLIM1 = V.hh; for (gbufpp = 0; gbufpp < FORLIM1; gbufpp++) b3[gbufpp] = b2[gbufpp]; gi = 0; FORLIM1 = V.hh; for (gbufpp = 0; gbufpp < FORLIM1; gbufpp++) { b2[gi] = (V.hell[b3[gbufpp] >> 4] << 4) + V.hell[b3[gbufpp] & 15]; gi++; } /*:48*/ } else if (V.bps == 8) { FORLIM1 = V.hh; for (gbufp = 0; gbufp < FORLIM1; gbufp++) b2[gbufp] = V.hell[b3[gbufp]]; } else { FORLIM1 = V.hh; for (gbufp = 0; gbufp < FORLIM1; gbufp++) b2[gbufp] = b3[gbufp]; } /* p2c: bm2font.pas, line 568: * Note: Can't interpret size in BLOCKWRITE [174] */ _SETIO(fwrite(b2, V.hh, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } } if (bitmap != NULL) fclose(bitmap); bitmap = NULL; if (tmpfil != NULL) fclose(tmpfil); tmpfil = NULL; mapinlen = V.hh; bitspsam = V.bps; posbit = 0; strcpy(bitmap_NAME, "pcxtemp.tmp"); if (bitmap != NULL) bitmap = freopen(bitmap_NAME, "rb", bitmap); else bitmap = fopen(bitmap_NAME, "rb"); if (bitmap == NULL) _EscIO(FileNotFound); pcxtemp = true; if (egastretch) { if (xratio + 1 == yratio) picstretch(); } posbit = 0; if (bitspsam > 1) greypxl = true; mapdiv = 1.0; FORLIM = bitspsam; for (i = 1; i <= FORLIM; i++) mapdiv *= 2; mapdiv /= 16; } /*:46*/ /*49:*/ Static Void bmpint() { unsigned short i, k, hi, hh, hhl, vi, vh, compr, lcol; uchar j, b, a, col, bps; uchar gpal[256][4]; unsigned short hell[256]; Char bmstr[256]; long bmsize, bmoff; unsigned short FORLIM; printf("Analysing BMP file %s\n", bmname); opentempfile(); fread(bmstr, 2, 1, bitmap); bmstr[2] = '\0'; if (strcmp(bmstr, "BM")) { printf("No windows bitmap %s\n", bmstr); _Escape(0); } gbufp = 640; pxlinlen = 640; bmsize = longpcx(); for (i = 1; i <= 4; i++) b = getpcx(); bmoff = longpcx(); bmsize = longpcx(); bmoff -= bmsize; if (bmsize > 12) { hi = longpcx(); vi = longpcx(); b = getpcx(); b = getpcx(); bps = wordpcx(); if (bps > 8) { printf("only up to 256 colors supported\n"); _Escape(0); } hh = hi; vh = vi; compr = longpcx(); for (i = 1; i <= 4; i++) b = getpcx(); xratio = longpcx(); yratio = longpcx(); lcol = longpcx(); lcol--; if (col == 0) { if (bps == 1) col = 1; else if (bps == 4) col = 15; else col = 255; } col = longpcx(); col--; } else { hi = wordpcx(); vi = wordpcx(); b = getpcx(); b = getpcx(); bps = wordpcx(); if (bps > 8) { printf("only up to 256 colors supported\n"); _Escape(0); } hh = hi; vh = vi; compr = 0; xratio = 1; yratio = 1; col = 0; } if (lcol == 0) { if (bps == 1) col = 1; else if (bps == 4) col = 15; else col = 255; } if (bps == 1) col = 1; else if (bps == 4) col = 15; else col = 255; for (i = 0; i <= col; i++) { if (bmsize > 12) { for (j = 0; j <= 3; j++) gpal[i][j] = getpcx(); } else { for (j = 0; j <= 2; j++) gpal[i][j] = getpcx(); } if (cmyk) { colcyan = 255 - gpal[i][2]; colmagenta = 255 - gpal[i][1]; colyellow = 255 - gpal[i][0]; if (colcyan != colmagenta || colcyan != colyellow || colmagenta != colyellow) { colcyan -= colmagenta / 3; if (colcyan < 0) colcyan = 0; colmagenta -= colyellow / 3; if (colmagenta < 0) colmagenta = 0; } colblack = colcyan; if (colblack > colmagenta) colblack = colmagenta; if (colblack > colyellow) colblack = colyellow; if (cyan) hell[i] = 255 - colcyan; if (magenta) hell[i] = 255 - colmagenta; if (yellow) hell[i] = 255 - colyellow; if (black) hell[i] = 255 - colblack; hell[i] = (long)(hell[i] / (256.0 / (col + 1))); bhell[hell[i]] = (long)((255 - colblack) / (256.0 / (col + 1))); } else hell[i] = (long)((gpal[i][2] * 0.287 + gpal[i][1] * 0.589 + gpal[i] [0] * 0.114) / (256.0 / (col + 1))); } if (bmsize > 12) bmoff -= (col + 1) * 4; else bmoff -= (col + 1) * 3; if (compr != 0) { printf("compression not supported yet\n"); _Escape(0); } hh = (hh * bps + 7) / 8; hhl = (hh + 3) / 4 * 4 - 1; a = 8 - ((hi * bps) & 7); /* p2c: bm2font.pas, line 616: * Note: Suspicious mixture of sizes in FILLCHAR [173] */ memset((Anyptr)b3, 0, hhl + 1L); for (i = 1; i <= vh; i++) { /*$I-*/ _SETIO(fwrite(b3, hh, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } } /* p2c: bm2font.pas, line 617: * Note: Can't interpret size in BLOCKWRITE [174] */ if (tmpfil != NULL) fclose(tmpfil); tmpfil = NULL; if (tmpfil != NULL) tmpfil = freopen(tmpfil_NAME, "w+b", tmpfil); else tmpfil = fopen(tmpfil_NAME, "w+b"); if (tmpfil == NULL) _EscIO(FileNotFound); bmoff = (vh - 1) * (long)hh; for (i = 0; i < vh; i++) { for (k = 0; k <= hhl; k++) b3[k] = getpcx(); if (bps == 4) { gi = 0; for (k = 0; k < hh; k++) { b2[gi] = (hell[b3[k] >> 4] << 4) + hell[b3[k] & 15]; gi++; } } else if (bps == 8) { for (k = 0; k < hh; k++) b2[k] = hell[b3[k]]; } else { for (k = 0; k < hh; k++) b2[k] = b3[k]; } if (a < 8) { for (k = 0; k < a; k++) b2[hh - 1] ^= invbit >> k; } fseek(tmpfil, bmoff, 0); bmoff = bmoff - (long)hh; /* p2c: bm2font.pas, line 629: * Note: Can't interpret size in BLOCKWRITE [174] */ _SETIO(fwrite(b2, hh, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } } if (bitmap != NULL) fclose(bitmap); bitmap = NULL; if (tmpfil != NULL) fclose(tmpfil); tmpfil = NULL; mapinlen = hh; posbit = 0; strcpy(bitmap_NAME, "pcxtemp.tmp"); if (bitmap != NULL) bitmap = freopen(bitmap_NAME, "rb", bitmap); else bitmap = fopen(bitmap_NAME, "rb"); if (bitmap == NULL) _EscIO(FileNotFound); pcxtemp = true; bitspsam = bps; if (bitspsam > 1) greypxl = true; mapdiv = 1.0; FORLIM = bitspsam; for (i = 1; i <= FORLIM; i++) mapdiv *= 2; mapdiv /= 16; } /*50:*/ Static Void imgint() { unsigned short i, ki, hi, hh, bzf, imgpat; short vh; uchar mi, cb, j, b, a, col, bps; unsigned short hell[16]; uchar linerep; unsigned short FORLIM; printf("Analysing IMG file %s\n", bmname); invert = !invert; if (invert) { /*51:*/ invbit = 0; invbyte = 0; } else { invbit = 1; invbyte = 255; } hell[0] = 0; hell[1] = 1; hell[2] = 6; hell[3] = 8; hell[4] = 3; hell[5] = 2; hell[6] = 7; hell[7] = 11; hell[8] = 4; hell[9] = 5; hell[10] = 12; hell[11] = 13; hell[12] = 10; hell[13] = 9; hell[14] = 14; hell[15] = 15; opentempfile(); /*:51*/ gbufp = 640; pxlinlen = 640; a = getpcx(); b = getpcx(); if (a * 256 + b != 1) { /*52:*/ printf("File does not contain GEM Image File Format\n"); _Escape(0); } b = getpcx(); bzf = b * 256; b = getpcx(); bzf += b; b = getpcx(); bps = b * 256; b = getpcx(); bps += b; b = getpcx(); imgpat = b * 256; b = getpcx(); imgpat += b; b = getpcx(); xratio = b * 256; b = getpcx(); xratio += b; b = getpcx(); yratio = b * 256; b = getpcx(); yratio += b; if (xratio != yratio) { mapdiv = (double)yratio / xratio; xratio = 0; yratio = 0; while (xratio == yratio) { xratio++; yratio = (long)floor(xratio * mapdiv + 0.5); } } b = getpcx(); hi = b * 256; b = getpcx(); hi += b; b = getpcx(); vh = b * 256; b = getpcx(); vh += b; /*:52*/ hh = (hi * bps + 7) / 8; if (bzf > 8) { for (i = 1; i <= (bzf - 8) * 2; i++) b = getpcx(); } linerep = 0; gi = 0; while (vh > 0) { for (gi = 0; gi <= hh; gi++) b3[gi] = 0; gi = 0; while (gi < hh) { b = getpcx(); if (b != 0 && b != 128) { a = b & 127; cb = ((unsigned)(b - a)) >> 7; if (cb == 1) cb = 255; for (ki = 1; ki <= a; ki++) { b3[gi] = cb; gi++; } continue; } if (b == 128) { a = getpcx(); for (ki = 1; ki <= a; ki++) { b3[gi] = getpcx(); gi++; } continue; } a = getpcx(); if (a <= 0) { b = getpcx(); linerep = getpcx(); continue; } for (ki = 1; ki <= imgpat; ki++) b2[ki] = getpcx(); for (ki = 1; ki <= a; ki++) { for (mi = 1; mi <= imgpat; mi++) { b = b2[mi]; b3[gi] = b; gi++; } } } if (bps == 4) { /*48:*/ gi = 0; for (gbufpp = 0; gbufpp < hh; gbufpp++) b2[gbufpp] = 0; a = 0; for (gbufpp = 0; gbufpp < hh; gbufpp++) { b = b3[gbufpp]; for (j = 0; j <= 3; j++) { cb = b & 128; cb >>= 3 - a; b2[gi] ^= cb; b <<= 1; cb = b & 128; cb >>= 7 - a; b2[gi] ^= cb; b <<= 1; gi++; } if (gi >= hh) { gi = 0; a++; } } for (gbufpp = 0; gbufpp < hh; gbufpp++) b3[gbufpp] = b2[gbufpp]; gi = 0; for (gbufpp = 0; gbufpp < hh; gbufpp++) { b2[gi] = (hell[b3[gbufpp] >> 4] << 4) + hell[b3[gbufpp] & 15]; gi++; } /*:48*/ } else { for (ki = 0; ki < hh; ki++) b2[ki] = b3[ki]; } /* p2c: bm2font.pas, line 674: * Note: Can't interpret size in BLOCKWRITE [174] */ _SETIO(fwrite(b2, hh, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } vh--; if (linerep <= 0) continue; for (i = 1; i <= linerep; i++) { /*$I-*/ _SETIO(fwrite(b2, hh, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } } /* p2c: bm2font.pas, line 678: * Note: Can't interpret size in BLOCKWRITE [174] */ vh += 1 - linerep; linerep = 0; } if (bitmap != NULL) fclose(bitmap); bitmap = NULL; if (tmpfil != NULL) fclose(tmpfil); tmpfil = NULL; if (col == 4) { bitspsam = 4; greypxl = true; } else if (bps > 1) { bitspsam = bps; greypxl = true; } mapinlen = hh; posbit = 0; strcpy(bitmap_NAME, "pcxtemp.tmp"); if (bitmap != NULL) bitmap = freopen(bitmap_NAME, "rb", bitmap); else bitmap = fopen(bitmap_NAME, "rb"); if (bitmap == NULL) _EscIO(FileNotFound); if (egastretch) { if (xratio + 1 == yratio) picstretch(); } posbit = 0; pcxtemp = true; mapdiv = 1.0; FORLIM = bitspsam; for (i = 1; i <= FORLIM; i++) mapdiv *= 2; mapdiv /= 16; } /*54:*/ Static Void tfmhword(hword) long hword; { union { uchar b[4]; long i; } ax; short i; ax.i = hword; #ifdef INTEL for (i = 1; i >= 0; i--) fwrite(&ax.b[i], sizeof(uchar), 1, tfmfile); #else for (i = 2; i <= 3; i++) fwrite(&ax.b[i], sizeof(uchar), 1, tfmfile); #endif } Static Void tfmword(lword) long lword; { union { uchar b[4]; long i; } ax; short i; ax.i = lword; #ifdef INTEL for (i = 3; i >= 0; i--) fwrite(&ax.b[i], sizeof(uchar), 1, tfmfile); #else for (i = 0; i <= 3; i++) fwrite(&ax.b[i], sizeof(uchar), 1, tfmfile); #endif } /*:54*/ /*57:*/ Static Void pxlmap(lword) long lword; { union { ebts b[4]; long i; } ax; uchar i; ax.i = lword; for (i = 0; i <= 3; i++) { pxlbm[pxlbmi] = ax.b[i]; pxlbmi++; } } /*:57*/ /*61:*/ Static Void pkbyte(b) uchar b; { pkbm[pkloc] = b; pkloc++; } Static Void pkhalfword(a) short a; { union { ebts b[2]; short w; } ax; ax.w = a; #ifdef INTEL pkbyte(ax.b[1]); pkbyte(ax.b[0]); #else pkbyte(ax.b[0]); pkbyte(ax.b[1]); #endif } Static Void pkthreebytes(a) long a; { union { ebts b[4]; long i; } ax; ax.i = a; #ifdef INTEL pkbyte(ax.b[2]); pkbyte(ax.b[1]); pkbyte(ax.b[0]); #else pkbyte(ax.b[1]); pkbyte(ax.b[2]); pkbyte(ax.b[3]); #endif } Static Void pkword(a) long a; { union { ebts b[4]; long i; } ax; ax.i = a; #ifdef INTEL pkbyte(ax.b[3]); pkbyte(ax.b[2]); pkbyte(ax.b[1]); pkbyte(ax.b[0]); #else pkbyte(ax.b[0]); pkbyte(ax.b[1]); pkbyte(ax.b[2]); pkbyte(ax.b[3]); #endif } Static Void pknyb(a) uchar a; { if (bitweight == 16) { outputbyte = a << 4; bitweight = 1; } else { pkbyte(outputbyte + a); bitweight = 16; } } /*:61*/ /*63:*/ Static Void writepreambl() { short i; Char nstr[256]; sprintf(nstr, "%ld", (long)floor(truehres + 0.5)); #ifdef MSDOS sprintf(cmd, "%s%c.pk", font, fontpre[nf]); #else sprintf(cmd, "%s%c.%spk", font, fontpre[nf], nstr); #endif strcpy(pxlfile_NAME, cmd); if (pxlfile != NULL) pxlfile = freopen(pxlfile_NAME, "w+b", pxlfile); else pxlfile = fopen(pxlfile_NAME, "w+b"); _SETIO(pxlfile != NULL, FileNotFound); filestat = P_ioresult; if (filestat == 3 || filestat == 5) { strcpy(cmd, bmname); sprintf(cmd + strlen(cmd), "%c.pk", fontupc[nf]); strcpy(pxlfile_NAME, cmd); if (pxlfile != NULL) pxlfile = freopen(pxlfile_NAME, "w+b", pxlfile); else pxlfile = fopen(pxlfile_NAME, "w+b"); _SETIO(pxlfile != NULL, FileNotFound); filestat = P_ioresult; } if (filestat == 0) fok = false; else fok = true; if (fok) { printf("error occurred when "); printf("allocating pkfile "); puts(cmd); fileproblem(); _Escape(0); } pkloc = 0; pkbyte(247); pkbyte(89); pkbyte(14); strcpy(comment, "BM2FONT output"); for (i = 0; i <= 13; i++) pkbyte(comment[i]); pkword(tabdsize[nf]); pkword(checksum); pkword(floor(truehres * 65536L / 72.27 + 0.5)); pkword(floor(truevres * 65536L / 72.27 + 0.5)); nextmemfree = 0; printf("Packing font %s\n", cmd); } /*:63*/ /*65:*/ Static Void writepostamb() { pkbyte(245); while ((pkloc & 3) != 0) pkbyte(246); /* p2c: bm2font.pas, line 781: * Note: Can't interpret size in BLOCKWRITE [174] */ _SETIO(fwrite(pkbm, pkloc, 1, pxlfile) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing font %s!\n", cmd) >= 0, FileWriteError); fileproblem(); _Escape(0); } if (pxlfile != NULL) fclose(pxlfile); pxlfile = NULL; printf(" \n"); printf("Font %s at %ld dots per inch written\n", cmd, (long)floor(truehres + 0.5)); nf++; if (nf > 25) { printf("More then 26 fonts! Giving up\n"); _Escape(0); } charpf[nf] = ng; ng = 0; pkloc = 0; } /*:65*/ /*67:*/ Static boolean equal(row1, row2) pxlstr row1, row2; { short i; boolean temp; i = pkwidth; temp = true; while (i > 0 && temp) { if (pxlbm[row1] != pxlbm[row2]) temp = false; row1++; row2++; i -= 8; } return temp; } /*:67*/ /*68:*/ Static boolean equalzo(row1, row2) pxlstr row1; short row2; { short i; boolean temp; i = pkwidth; temp = true; while (i > 0 && temp) { if (pxlbm[row1] != (repbm[row2] & 255)) temp = false; row1++; row2++; i -= 8; } return temp; } /*:68*/ /*70:*/ Static Void shipcharacte() { /*:87*/ pxlstr crst; short wwid; long compsize; long horesc; /*72:*/ short l; long i, j, k; short rowzero, onesrow, repptr, bitcounts; ebts fillbytes, longind, mixbyte, restbyte, pkshift, dshift; long longtab[20]; /*:72*/ /*77:*/ long count; short test, curptr, bit, repflag; schar pkkword; short bitptr, bitmod32, currepeat; pxlstr endraster; /*:77*/ /*80:*/ short dynf; long deriv[13]; long bcompsize; boolean firston; short flagbyte; /*:80*/ /*87:*/ unsigned short max2; pxlstr predpkloc; short bytelength; horesc = pwidth[f][car]; pkwidth = pwidth[f][car]; pkheight = pheight[f][car]; pkheight -= yoffset[f][car]; cxoff = 0; cyoff = pkheight; crst = pkpoint[car]; wwid = (pkwidth + 31) / 32 * 4; fillbytes = wwid - (pkwidth + 7) / 8; /*71:*/ rowzero = nextmemfree; onesrow = nextmemfree + wwid; repptr = onesrow + wwid; bitcounts = repptr + pkheight + 1; for (i = rowzero; i < onesrow; i++) repbm[i] = 0; for (i = onesrow; i <= repptr - 2; i++) repbm[i] = -1; j = onesrow + (((unsigned long)(pkwidth + 7)) >> 3); repbm[j - 1] = power[8] - power[7 - ((pkwidth + 7) & 7)]; for (i = j; i < repptr; i++) repbm[i] = 0; i = 0; j = pkheight; while (i < j) { if (equalzo((i * wwid + crst), rowzero)) repbm[repptr + i] = 0; else if (equalzo((i * wwid + crst), onesrow)) repbm[repptr + i] = 0; else if (i + 1 == j) repbm[repptr + i] = 0; else if (equal((i * wwid + crst), (int)((i + 1) * wwid + crst))) repbm[repptr + i] = 1; else repbm[repptr + i] = 0; i++; } i = 0; while (i < j) { k = i; while (repbm[repptr + k] == 1) k++; repbm[repptr + i] = k - i; i = k + 1; } repbm[repptr + i] = 0; /*:71*/ /*75:*/ repflag = 0; bitptr = pkwidth - 1; currepeat = repptr; endraster = crst + pkheight * wwid; curptr = bitcounts; count = 0; longind = 0; test = 0; do { /*76:*/ bitptr++; if (bitptr == pkwidth) { bitmod32 = 0; bitptr = 0; if (currepeat > repptr) crst += fillbytes; if (repbm[currepeat] > 0) { repflag = repbm[currepeat]; currepeat += repflag; crst += wwid * repflag; } currepeat++; } bitmod32--; if (bitmod32 == -1) { bitmod32 = 7; pkkword = pxlbm[crst]; crst++; } if (crst > endraster) bit = 2; else if (pkkword < 0) bit = 1; else bit = 0; pkkword <<= 1; /*:76*/ if (bit == test) count++; else { if (count > 32767) { longind++; longtab[longind - 1] = count; count = -longind - 10000; } repbm[curptr] = count; curptr++; if (curptr + 1 > maxmemsize) test = 3; else { count = 1; test = bit; if (repflag > 0) { repbm[curptr] = -repflag; repflag = 0; curptr++; } } } } while (test < 2); repbm[curptr] = 0; repbm[curptr + 1] = 0; /*:75*/ /*78:*/ if (test < 3) { for (i = 0; i <= 12; i++) deriv[i] = 0; firston = (repbm[bitcounts] == 0); if (firston) bitcounts++; i = bitcounts; compsize = 0; while (repbm[i] != 0) { /*79:*/ j = repbm[i]; if (j < -10000) j = longtab[-j - 10001]; if (j == -1) compsize++; else { if (j < 0) { compsize++; j = -j; } if (j < 209) compsize += 2; else { k = j - 193; while (k >= 16) { k = ((unsigned long)k) >> 4; compsize += 2; } compsize++; } if (j < 14) deriv[j - 1]--; else if (j < 209) deriv[(223 - j) / 15 - 1]++; else { k = 16; while (k <= ((unsigned long)(j + 2)) >> 4) { k <<= 4; if (k == 0) { k = 32767; j += 32767; } } if (j - k <= 192) deriv[(k - j + 207) / 15 - 1] += 2; } } i++; } /*:79*/ bcompsize = compsize; dynf = 0; for (i = 1; i <= 13; i++) { compsize += deriv[i - 1]; if (compsize <= bcompsize) { bcompsize = compsize; dynf = i; } } compsize = (bcompsize + 1) / 2; if (compsize > (pkheight * pkwidth + 7) / 8 || pkheight * pkwidth == 0) { compsize = (pkheight * pkwidth + 7) / 8; dynf = 14; } } else { dynf = 14; firston = (repbm[bitcounts] == 0); compsize = (pkheight * pkwidth + 7) / 8; } if (pkloc + compsize > 65487L || ng > 127) { /*81:*/ writepostamb(); if (nf > 26) { printf("Sorry, more than 26 fonts necessary, reduce bitmap\n"); _Escape(0); } writepreambl(); } flagbyte = dynf * 16; if (firston) flagbyte += 8; if (width[f][car] > 16777215L || width[f][car] < 0 || horesc < 0 || compsize > 196594L || pkwidth > 65535L || pkheight > 65535L || cxoff > 32767 || cyoff > 32767 || cxoff < -32768L || cyoff < -32768L) { /*82:*/ flagbyte += 7; pkbyte(flagbyte); compsize += 28; pkword(compsize); pkword(ng); predpkloc = pkloc + compsize; pkword(width[f][car]); pkword(horesc); pkword(0); pkword(pkwidth); pkword(pkheight); pkword(cxoff); pkword(cyoff); } /*:82*/ else if (horesc > 255 || pkwidth > 255 || pkheight > 255 || cxoff > 127 || cyoff > 127 || cxoff < -128 || cyoff < -128 || compsize > 1015) { compsize += 13; flagbyte += compsize / 65536L + 4; pkbyte(flagbyte); /* p2c: bm2font.pas, line 874: * Note: Using % for possibly-negative arguments [317] */ pkhalfword((compsize % 65536L)); pkbyte(ng); predpkloc = pkloc + compsize; pkthreebytes(width[f][car]); pkhalfword(horesc); pkhalfword(pkwidth); pkhalfword(pkheight); pkhalfword(cxoff); pkhalfword(cyoff); } else { compsize += 8; flagbyte += compsize / 256; pkbyte(flagbyte); pkbyte((compsize & 255)); pkbyte(ng); predpkloc = pkloc + compsize; pkthreebytes(width[f][car]); pkbyte(horesc & 255); pkbyte(pkwidth); pkbyte(pkheight); pkbyte(cxoff); pkbyte(cyoff); } if (dynf != 14) { /*85:*/ bitweight = 16; max2 = 208 - dynf * 15; i = bitcounts; while (repbm[i] != 0) { j = repbm[i]; if (j < -10000) j = longtab[-j - 10001]; if (j == -1) pknyb(15); else { if (j < 0) { pknyb(14); j = -j; } if (j <= dynf) pknyb(j); else if (j <= max2) { j += -dynf - 1; pknyb(((j) >> 4) + dynf + 1); pknyb((j & 15)); } else { j += 15 - max2; k = 1; while (k <= ((unsigned long)j) >> 4) { k <<= 4; pknyb(0); } while (k > 0) { pknyb((j / k)); j %= k; /* p2c: bm2font.pas, line 889: * Note: Using % for possibly-negative arguments [317] */ k = ((unsigned long)k) >> 4; } } } i++; } if (bitweight != 16) pkbyte(outputbyte); } else /*86:*/ { /*:86*/ crst = pkpoint[car]; bytelength = (((unsigned long)(pkwidth + 7)) >> 3) - 1; if ((pkwidth & 7) == 0) { while (crst < endraster) { for (i = 0; i <= bytelength; i++) pkbyte(pxlbm[crst + i]); crst += wwid; } } else { pkshift = 0; dshift = pkwidth & 7; while (crst < endraster) { if (pkshift == 0) { for (i = 0; i < bytelength; i++) pkbyte(pxlbm[crst + i]); mixbyte = pxlbm[crst + bytelength]; } else { i = crst; l = pkwidth + pkshift; while (l >= 8) { l -= 8; restbyte = pxlbm[i]; i++; pkbyte(mixbyte + (restbyte >> pkshift)); mixbyte = restbyte << (8 - pkshift); } if (pkshift < ((pkshift + dshift) & 7)) mixbyte += pxlbm[i] >> pkshift; } crst += wwid; pkshift = (pkshift + dshift) & 7; } if (pkshift > 0) pkbyte(mixbyte); } } /*:85*/ if (predpkloc != pkloc) { printf("Bad predicted character length: character %d\n", car); printf("pred: %uloc: %u\n", predpkloc, pkloc); _Escape(0); } pkpoint[car] = 0; /*:78*/ putchar('.'); if (car == 79) putchar('\n'); pwidth[nf][ng] = pwidth[f][car]; pheight[nf][ng] = pheight[f][car]; width[nf][ng] = width[f][car]; height[nf][ng] = height[f][car]; yoffset[nf][ng] = yoffset[f][car]; ng++; /*84:*/ /*:84*/ /*83:*/ /*:83*/ /*:81*/ } /*:70*/ /*88:*/ Static Void fonteject() { short lx, FORLIM, FORLIM1, FORLIM2; nf = 0; ng = 0; writepreambl(); while (maplines > 0) { FORLIM = maxx; for (k = 1; k <= FORLIM; k++) { i = k - 1; dirpoint[g] = pxlbmi / 4; pkpoint[g] = pxlbmi; linepos_ = posbit + i * hres / 8; pxlinlen = (pwidth[f][g] + 7) / 8; zeroline = true; gi = 0; FORLIM1 = pheight[f][g]; for (v = 1; v <= FORLIM1; v++) { fseek(bitmap, linepos_, 0); /* p2c: bm2font.pas, line 916: * Note: Can't interpret size in BLOCKREAD [174] */ j = fread(b1, 1, pxlinlen, bitmap); FORLIM2 = pxlinlen; for (lx = 0; lx < FORLIM2; lx++) b2[lx] = b1[lx]; if (invert) { FORLIM2 = pxlinlen; for (lx = 0; lx < FORLIM2; lx++) b2[lx] = 255 - b1[lx]; } gi += dv; if (gi >= lv) gi -= cv; if (invbyte == 255) { FORLIM2 = pxlinlen; for (lx = 0; lx < FORLIM2; lx++) b1[lx] = invbyte - b1[lx]; } lx = 0; zerorow = true; FORLIM2 = pxlinlen; for (j = 0; j < FORLIM2; j++) { if (b1[j] != 0) { zerorow = false; zeroline = false; } } if (zeroline) { yoffset[f][g]++; if (yoffset[f][g] == pheight[f][g]) { yoffset[f][g]--; zerorow = false; zeroline = false; } } cx.i = 0; if (!zeroline) { FORLIM2 = pxlinlen; for (j = 0; j < FORLIM2; j++) { if (lx > 3) { lx = 0; pxlmap(cx.i); cx.i = 0; } cx.b[lx] = b1[j]; lx++; } pxlmap(cx.i); } linepos_ += (mapwidth + 7) / 8 + zeropads; } i += maxx; g++; if (g == mincharpf) { /*89:*/ for (car = 0; car <= 127; car++) { if (pkpoint[car] != 0) shipcharacte(); } f++; g = 0; pxlbmi = 4; } /*:89*/ } maplines -= vres; posbit += vres * ((mapwidth + 7) / 8 + zeropads); } if (bitmap != NULL) fclose(bitmap); bitmap = NULL; /*90:*/ for (car = 0; car <= 127; car++) { if (pkpoint[car] != 0) shipcharacte(); } writepostamb(); noffonts = nf; /*:90*/ } /*:88*/ /*103:*/ Static Void userhelp() { short FORLIM, FORLIM1; sprintf(cmd, "%s.tex", font); strcpy(texfile_NAME, cmd); if (texfile != NULL) texfile = freopen(texfile_NAME, "w", texfile); else texfile = fopen(texfile_NAME, "w"); _SETIO(texfile != NULL, FileNotFound); filestat = P_ioresult; if (filestat == 0) fok = false; else fok = true; if (filestat == 5) { *cmd = '\0'; sprintf(cmd + strlen(cmd), "%s.tex", font); strcpy(texfile_NAME, cmd); if (texfile != NULL) texfile = freopen(texfile_NAME, "w", texfile); else texfile = fopen(texfile_NAME, "w"); _SETIO(texfile != NULL, FileNotFound); filestat = P_ioresult; if (filestat == 0) fok = false; else fok = true; } if (fok) { /*104:*/ printf("%s error occured when allocating TeXfile %s\n", cmd, cmd); fileproblem(); _Escape(0); } fprintf(texfile, "\\newbox\\%sbox\n", font); fprintf(texfile, "\\newdimen\\%swd\n", font); FORLIM = noffonts; for (a = 1; a <= FORLIM; a++) { fprintf(texfile, "\\font\\%s%c=%s%c at ", font, fontpre[a - 1], font, fontpre[a - 1]); outfix(tabdsize[a - 1]); fprintf(texfile, "truept\n"); } fprintf(texfile, "\\setbox\\%sbox=\\vbox{\\hbox{%%\n", font); a = 0; k = 1; c = 0; i = (mapwidth + hres - 1) / hres; FORLIM = i; for (b = 1; b <= FORLIM; b++) { if (a != k) { fprintf(texfile, "\\%s%c", font, fontpre[k - 1]); a = k; } fprintf(texfile, "\\char%d", c); if ((b & 7) == 0 && b != i) fprintf(texfile, "%%\n"); c++; if (c == charpf[k]) { k++; c = 0; } } fprintf(texfile, "}}\n"); /*:104*/ /*105:*/ fprintf(texfile, "\\%swd=\\wd\\%sbox\n", font, font); fprintf(texfile, "\\setbox\\%sbox=\\hbox{\\vbox{\\hsize=\\%swd\n", font, font); fprintf(texfile, "\\parskip=0pt\\offinterlineskip\\parindent0pt\n"); v = 1; k = 1; c = 0; FORLIM = nj; for (a = 0; a < FORLIM; a++) { fprintf(texfile, "\\hbox{\\%s%c", font, fontpre[k - 1]); v = k; FORLIM1 = i; for (b = 0; b < FORLIM1; b++) { if (v != k) { fprintf(texfile, "\\%s%c", font, fontpre[k - 1]); v = k; } fprintf(texfile, "\\char%d", c); if (((b + 1) & 7) == 0 && b + 1 != i) fprintf(texfile, "%%\n"); c++; if (c == charpf[k]) { k++; c = 0; } } if (a < nj - 1) fprintf(texfile, "}\n"); } fprintf(texfile, "}}}\n"); fprintf(texfile, "\\ifx\\parbox\\undefined\n"); fprintf(texfile, " \\def\\set%s{\\box\\%sbox}\n", font, font); fprintf(texfile, "\\else\n"); fprintf(texfile, " \\def\\set%s{\\parbox{\\wd\\%sbox}", font, font); fprintf(texfile, "{\\box\\%sbox}}\n", font); fprintf(texfile, "\\fi\n"); if (texfile != NULL) fclose(texfile); texfile = NULL; printf("File %s written\n", cmd); /*:105*/ } /*:103*/ /*106:*/ main(argc, argv) int argc; Char *argv[]; { short FORLIM; Char STR2[256]; uchar FORLIM1; short FORLIM2, FORLIM3; uchar FORLIM4; PASCAL_MAIN(argc, argv); tfmfile = NULL; tmpfil = NULL; pxlfile = NULL; bitmap = NULL; texfile = NULL; power[0] = 1; for (i = 1; i <= 8; i++) power[i] = power[i - 1] * 2; pxlbm = (uchar *)Malloc(sizeof(pxla)); pkbm = (uchar *)Malloc(sizeof(pxla)); repbm = (short *)Malloc(sizeof(pxlba)); gkorh = (short *)Malloc(sizeof(korbyte)); gkordivp = (short *)Malloc(sizeof(korbyte)); spreadvals = (short *)Malloc(sizeof(spreadbyte)); width = (long(*)[129])Malloc(sizeof(dynlong)); height = (long(*)[129])Malloc(sizeof(dynlong)); yoffset = (unsigned short(*)[129])Malloc(sizeof(dynword)); pwidth = (unsigned short(*)[129])Malloc(sizeof(dynword)); pheight = (unsigned short(*)[129])Malloc(sizeof(dynword)); greymem = (uchar *)Malloc(sizeof(pxla)); /*107:*/ strcpy(cref, "!()+,-./0123456789:;<=>?"); strcat(cref, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); /* p2c: bm2font.pas, line 974: * Note: Possible string truncation in assignment [145] */ strcat(cref, "abcdefghijklmnopqrstuvwxyz"); /* p2c: bm2font.pas, line 975: * Note: Possible string truncation in assignment [145] */ strcpy(fontupc, "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); strcpy(fontpre, "abcdefghijklmnopqrstuvwxyz"); truehres = 0.0; truevres = 0.0; halfinch = false; invert = false; greypxl = false; pcxtemp = false; giftemp = false; cutgrey = false; aliasused = false; cmyk = false; cyan = false; magenta = false; yellow = false; black = false; saveblack = false; clipon = true; xratio = 0; yratio = 0; egastretch = true; ledprinter = false; distribute = true; brightness = 0; bitspsam = 8; nowhite = true; usepxl = 0; vusepxl = 0; hrep = 1; vrep = 1; valinc = 70.0; gradint = 70; newwidth = 0; newheight = 0; printf("This is BitMapTOfont, version 3.0 of january 94, via p2c\n"); printf("Converting Bitmap Files to TeX-Fonts\n"); /*assign(logfile,'test.log');rewrite(logfile);close(logfile);*/ /*110:*/ if (P_argc == 1) { printf("usage is BM2FONT filename and parameters\n"); printf("-f (std filename)\n"); printf("-h (pixel/inch, std 300)\n"); printf("-v (pixel/inch, std 300)\n"); printf("-l (in bytes, only pure bitmaps)\n"); printf("-p (y or n, std y)\n"); printf("-e (y or n, std y)\n"); printf("-i (y or n, std n)\n"); printf("-g (y or n, std n)\n"); printf("-w (y or n, std y)\n"); printf("-d (y or n, std y)\n"); printf("-s (y or n, std n)\n"); printf("-r (y or n, std n)\n"); printf("-u (less 8)\n"); printf("-c (less 8)\n"); printf("-x (0 < x < 9)\n"); printf("-b (f.e. by 1, less u*c*4, std 0)\n"); printf("-t (in %%, std 70)\n"); printf("-z (in %%, std 70)\n"); printf("-m (in mm)\n"); printf("-n (in mm)\n"); printf("-j (y or n, std y)\n"); printf("-k (std k)\n"); /*readln(comment); if length(comment)=0 then goto 9999;j:=ord(comment[0])+1; if j<=127 then move(comment[0],mem[prefixseg:$80],j);*/ goto _L9999; } /*:110*/ /*111:*/ for (j = 1; j < P_argc; j++) { strcpy(comment, P_argv[j]); if (comment[0] != '-') { strcpy(font, comment); if (strlen(font) < 1 || !strcmp(font, " ")) { printf("give the name of your bitmap file next time\n"); goto _L9999; } } else { switch (comment[1]) { case 'h': case 'H': strdelete((Anyptr)comment, 1, 2); i = (sscanf(comment, "%lg", &truehres) == 0); break; case 'v': case 'V': strdelete((Anyptr)comment, 1, 2); i = (sscanf(comment, "%lg", &truevres) == 0); break; case 'l': case 'L': strdelete((Anyptr)comment, 1, 2); i = (sscanf(comment, "%ld", &mapinlen) == 0); break; case 'm': case 'M': strdelete((Anyptr)comment, 1, 2); i = (sscanf(comment, "%ld", &newwidth) == 0); break; case 'n': case 'N': strdelete((Anyptr)comment, 1, 2); i = (sscanf(comment, "%ld", &newheight) == 0); break; case 'c': case 'C': strdelete((Anyptr)comment, 1, 2); i = (sscanf(comment, "%ld", &vusepxl) == 0); break; case 'b': case 'B': strdelete((Anyptr)comment, 1, 2); i = (sscanf(comment, "%ld", &brightness) == 0); break; case 'x': case 'X': strdelete((Anyptr)comment, 1, 2); i = (sscanf(comment, "%ld", &bitspsam) == 0); break; case 't': case 'T': strdelete((Anyptr)comment, 1, 2); i = (sscanf(comment, "%lg", &valinc) == 0); break; case 'z': case 'Z': strdelete((Anyptr)comment, 1, 2); i = (sscanf(comment, "%ld", &gradint) == 0); break; case 'g': case 'G': strdelete((Anyptr)comment, 1, 2); greypxl = (!strcmp(comment, "y") || !strcmp(comment, "Y")); break; case 'e': case 'E': strdelete((Anyptr)comment, 1, 2); egastretch = (!strcmp(comment, "n") || !strcmp(comment, "N")); egastretch = !egastretch; break; case 'd': case 'D': strdelete((Anyptr)comment, 1, 2); distribute = (!strcmp(comment, "n") || !strcmp(comment, "N")); distribute = !distribute; break; case 'f': case 'F': strdelete((Anyptr)comment, 1, 2); strcpy(aliasname, comment); aliasused = true; break; case 's': case 'S': strdelete((Anyptr)comment, 1, 2); ledprinter = (!strcmp(comment, "y") || !strcmp(comment, "Y")); break; case 'p': case 'P': strdelete((Anyptr)comment, 1, 2); halfinch = (!strcmp(comment, "n") || !strcmp(comment, "N")); break; case 'r': case 'R': strdelete((Anyptr)comment, 1, 2); if (!strcmp(comment, "y")) { hrep = 2; vrep = 2; } break; case 'w': case 'W': strdelete((Anyptr)comment, 1, 2); nowhite = (!strcmp(comment, "n") || !strcmp(comment, "N")); nowhite = !nowhite; break; case 'k': case 'K': strdelete((Anyptr)comment, 1, 2); if (!strcmp(comment, "c") || !strcmp(comment, "N")) cyan = true; else if (!strcmp(comment, "m") || !strcmp(comment, "M")) magenta = true; else if (!strcmp(comment, "y") || !strcmp(comment, "Y")) yellow = true; else if (!strcmp(comment, "k") || !strcmp(comment, "K")) black = true; break; case 'i': case 'I': strdelete((Anyptr)comment, 1, 2); invert = (!strcmp(comment, "y") || !strcmp(comment, "Y")); break; case 'j': case 'J': strdelete((Anyptr)comment, 1, 2); clipon = (!strcmp(comment, "y") || !strcmp(comment, "Y")); break; case 'u': case 'U': strdelete((Anyptr)comment, 1, 2); i = (sscanf(comment, "%ld", &usepxl) == 0); break; } } } /*:111*/ /*112:*/ if (bitspsam < 1 || bitspsam > 8) bitspsam = 8; if (invert) { invbit = 0; invbyte = 0; } else { invbit = 1; invbyte = 255; } if (usepxl == 0) usepxl = 2; if (vusepxl == 0) vusepxl = usepxl; if (brightness >= usepxl * vusepxl * 4) brightness = 0; if (brightness != 0 && usepxl < 2) brightness = 0; if (valinc > 99) valinc = 99.0; if (valinc > 0) { if (gradint == 0) gradint = 1; } if (gradint > 99) gradint = 99; if (newheight < 0) newheight = 0; if (newwidth < 0) newwidth = 0; if (newwidth > 200) { printf("Sorry, new width set to 200mm\n"); newwidth = 200; } if (newheight > 280) { printf("Sorry, new height set to 280mm\n"); newheight = 280; } if (truehres == 0) truehres = 300.0; if (truevres == 0) truevres = truehres; cmyk = (cyan || magenta || yellow || black); saveblack = (cyan || magenta || yellow); /*:112*/ /*:107*/ /*108:*/ for (j = 0; j <= 51; j++) { for (i = 0; i <= 128; i++) { pwidth[j][i] = 0; width[j][i] = 0; height[j][i] = 0; pheight[j][i] = 0; yoffset[j][i] = 0; } } for (i = 0; i <= 128; i++) dirpoint[i] = 0; for (i = 0; i <= 128; i++) pkpoint[i] = 0; for (i = 0; i <= 52; i++) charpf[i] = 0; maxx = 0; minx = 646; mapheight = 0; /*:108*/ fok = true; strcpy(bmname, font); strcpy(bitmap_NAME, bmname); if (bitmap != NULL) bitmap = freopen(bitmap_NAME, "rb", bitmap); else bitmap = fopen(bitmap_NAME, "rb"); _SETIO(bitmap != NULL, FileNotFound); filestat = P_ioresult; if (filestat == 0) fok = false; else fok = true; if (fok) { /*113:*/ printf("File %s not found, abort\n", font); fileproblem(); goto _L9999; } i = 1; j = 0; strcpy(cmd, " "); while (i <= strlen(bmname)) { if (bmname[i - 1] == '.') j = i; i++; } if (j > 0) strsub(cmd, bmname, j + 1, (int)(strlen(bmname) - j + 1)); if (!strcmp(cmd, "tif") || !strcmp(cmd, "TIF") || !strcmp(cmd, "tiff") || !strcmp(cmd, "TIFF")) tifint(); else { if (!strcmp(cmd, "pcx") || !strcmp(cmd, "PCX")) pcxint(); else if (!strcmp(cmd, "lbm") || !strcmp(cmd, "LBM") || !strcmp(cmd, "iff") || !strcmp(cmd, "IFF")) iffint(); else if (!strcmp(cmd, "gif") || !strcmp(cmd, "GIF")) gifint(); else if (!strcmp(cmd, "bmp") || !strcmp(cmd, "BMP")) bmpint(); else if (!strcmp(cmd, "img") || !strcmp(cmd, "IMG")) imgint(); else if (!strcmp(cmd, "cut") || !strcmp(cmd, "CUT")) cutint(); else posbit = 0; } if (aliasused) { strcpy(font, aliasname); strcpy(bmname, aliasname); } FORLIM = strlen(bmname); for (i = 1; i <= FORLIM; i++) { sprintf(STR2, "%c", bmname[i - 1]); j = strpos2(fontpre, STR2, 1); if (j != 0) bmname[i - 1] = fontupc[j - 1]; } FORLIM = strlen(font); for (i = 1; i <= FORLIM; i++) { sprintf(STR2, "%c", font[i - 1]); j = strpos2(fontupc, STR2, 1); if (j != 0) font[i - 1] = fontpre[j - 1]; } korrfont(); nameok = true; FORLIM = strlen(font); for (i = 1; i <= FORLIM; i++) { if (isdigit(font[i - 1])) nameok = false; } if (!nameok) { printf("no digits allowed in name of font\n"); goto _L9999; } strcpy(bmname, font); FORLIM = strlen(bmname); for (i = 1; i <= FORLIM; i++) { /*:113*/ sprintf(STR2, "%c", bmname[i - 1]); j = strpos2(fontpre, STR2, 1); if (j != 0) bmname[i - 1] = fontupc[j - 1]; } /*114:*/ if (truehres <= 0 || truehres > 2000) truehres = 300.0; if (truevres <= 0 || truevres > 2000) truevres = 300.0; whatistrue(); if (hres != (long)floor(truehres + 0.5)) printf("maximum width of characters is %ld pixel\n", hres); if (vres != (long)floor(truevres + 0.5)) printf("maximum height of characters is %ld pixel\n", vres); if (posbit != 0) pxlinlen = (halfk)((mapwidth + 7) / 8); else { pxlinlen = mapinlen; mapwidth = pxlinlen * 8; if (greypxl) /*116:*/ mapwidth /= bitspsam; if (mapwidth < 1) { printf("Width not correct!\n"); goto _L9999; } mapheight = (P_maxpos(bitmap)) / mapinlen; if ((P_maxpos(bitmap)) % mapinlen > 0) { printf("Remainder > 0 when dividing size of file by width!\n"); goto _L9999; } /* p2c: bm2font.pas, line 1102: * Note: Using % for possibly-negative arguments [317] */ if (greypxl) { mapdiv = 1.0; photoinf = 15; FORLIM1 = bitspsam; for (cb = 1; cb <= FORLIM1; cb++) mapdiv *= 2; mapdiv /= 16; } /*:116*/ } if (pxlinlen > 3000) { printf("File not processable, width > 3000 bytes\n"); goto _L9999; } /*:114*/ if (newwidth != 0 || newheight != 0) scaling(); if (greypxl) { /*94:*/ printf("Halftone picture required\n"); pxlinlen = (halfk)(((unsigned long)(mapwidth * bitspsam + 7)) >> 3); greypix = mapwidth; mapwidth *= bitspsam; /*95:*/ sprintf(tmpname, "%s.tmp", font); strcpy(tmpfil_NAME, tmpname); filestat = P_ioresult; if (filestat == 0) fok = false; else fok = true; if (fok) { printf("tempfile %s not accessable, abort\n", tmpname); fileproblem(); goto _L9999; } if (tmpfil != NULL) tmpfil = freopen(tmpfil_NAME, "w+b", tmpfil); else tmpfil = fopen(tmpfil_NAME, "w+b"); _SETIO(tmpfil != NULL, FileNotFound); filestat = P_ioresult; if (filestat == 0) fok = false; else fok = true; if (fok) { /*:95*/ printf("Tempfile for font %s not found, abort\n", font); fileproblem(); goto _L9999; } /*101:*/ k = 0; if (usepxl != vusepxl) { FORLIM = vusepxl; for (i = 0; i < FORLIM; i++) { FORLIM2 = usepxl; for (j = 0; j < FORLIM2; j++) { k++; tab[k - 1][0] = i + 1; tab[k - 1][1] = j + 1; tab[k - 1][2] = i * i * (usepxl - 1) * (usepxl - 1) + j * j * (vusepxl - 1) * (vusepxl - 1); } } FORLIM = k; for (i = 1; i <= FORLIM; i++) { FORLIM2 = k; for (j = i; j <= FORLIM2; j++) { if (tab[i - 1][2] > tab[j - 1][2]) { lx = tab[i - 1][0]; tab[i - 1][0] = tab[j - 1][0]; tab[j - 1][0] = lx; lx = tab[i - 1][1]; tab[i - 1][1] = tab[j - 1][1]; tab[j - 1][1] = lx; lx = tab[i - 1][2]; tab[i - 1][2] = tab[j - 1][2]; tab[j - 1][2] = lx; } } } FORLIM = k; for (i = 1; i <= FORLIM; i++) { lx = tab[i - 1][0]; ly = tab[i - 1][1]; ditherm[lx - 1][ly - 1] = i; } } if (usepxl > 7) usepxl = 7; if (vusepxl > 7) vusepxl = 7; maxcol = 1; cb = 0; usecol = usepxl * vusepxl * 4; FORLIM = bitspsam; for (k = 1; k <= FORLIM; k++) maxcol *= 2; maxcol--; for (k = 1; k <= 4; k++) { for (i = 0; i <= 196; i++) { for (j = 1; j <= 7; j++) pattern[k - 1][i][j - 1] = 0; } } FORLIM = vusepxl; for (i = 1; i <= FORLIM; i++) { FORLIM2 = usepxl; for (j = 1; j <= FORLIM2; j++) { if (ditherm[i - 1][j - 1] <= usecol / 4 && ditherm[i - 1][j - 1] > 0) { v = (ditherm[i - 1][j - 1] - 1) * 4 + 1; for (ccol = 1; ccol <= 4; ccol++) { if (ccol == 1) c = 1; else if (ccol == 2) c = 3; else if (ccol == 3) c = 4; else c = 2; FORLIM3 = usecol; for (k = v; k <= FORLIM3; k++) { switch (c) { case 4: if (usepxl > 2 || vusepxl > 2) pattern[0][k][j - 1] |= (cb + 2) << (7 - i); else pattern[0][k][i - 1] |= (cb + 2) << (7 - j); break; case 1: pattern[1][k][vusepxl - i] |= (cb + 1) << (j - usepxl + 7); break; case 2: if (usepxl > 2 || vusepxl > 2) pattern[2][k][vusepxl - j] |= (cb + 2) << (7 - i); else pattern[2][k][vusepxl - i] |= (cb + 2) << (7 - j); break; case 3: pattern[3][k][i - 1] |= (cb + 1) << (j - usepxl + 7); break; } } v++; } } } } if (nowhite) pattern[1][0][usepxl - 1] = 128 >> (usepxl - 1); usecol -= brightness; /*:101*/ /*[102:]append(logfile); for k:=0 to usecol do begin for j:=1 to vusepxl do begin for i:=1 to 4 do begin cb:=pattern[i,k,j];write(logfile,cb:4,' '); for pk:=1 to usepxl do begin if cb>127 then write(logfile,'1')else write (logfile,'0');cb:=cb shl 1;end;write(logfile,' ');end; writeln(logfile,'.');end;writeln(logfile,'---- ',k:1,' ----');end; close(logfile);[:102]*/ greypix -= greypix & 3; mapwidth = greypix * bitspsam; if (ledprinter) gbufpp = ((long)floor(greypix * (usepxl + 0.5) + 0.5) * hrep + 7) / 8; else gbufpp = (greypix * usepxl * hrep + 7) / 8; if (gbufpp > 1280) { printf("Only up to 1280 bytes in one row allowed!\n"); printf("Try again by decreasing param or \n"); _Escape(0); } /*96:*/ printf("Analysing and optimizing the picture\n"); pminval = 255; pmaxval = 0; if (cmyk) { pminval = 0; pmaxval = maxcol; } if (cutgrey) { checksum = mapheight; pxlinlen = cutlen; } else checksum = mapheight; pl = 0; fseek(bitmap, posbit, 0); do { pxlinlen = fread(b1, 1, pxlinlen, bitmap); colpos = 0; cutrep = 0; FORLIM = greypix; for (pk = 0; pk < FORLIM; pk++) { tmpcolor = getcolor(); if (tmpcolor > pmaxval) pmaxval = tmpcolor; if (tmpcolor < pminval) pminval = tmpcolor; } checksum--; if (cutgrey) pxlinlen = b1[pxlinlen - 1] * 256 + b1[pxlinlen - 2] + 2; } while (checksum != 0); /* p2c: bm2font.pas, line 1165: * Note: Can't interpret size in BLOCKREAD [174] */ if (pminval == pmaxval && !cmyk) { printf("Only one color (value %d) used by bitmap!\n", pmaxval); printf("It makes no sence to generate a picture!\n"); _Escape(0); } /*:96*/ if (brightness == 0) { brightness = (long)floor( (maxcol - pmaxval + pminval + 1.0) * usecol / (maxcol + 1) + 0.5); if (brightness > 0) printf("Best result may be with parameter -b%ld !?\n", brightness); } printf("Dithering the picture\n"); memset((Anyptr)greymem, 255, sizeof(uchar) * 32761L); pgreymem = 0; if (cutgrey) { checksum = mapheight; pxlinlen = cutlen; } else checksum = mapheight; pl = 0; fseek(bitmap, posbit, 0); patswitch = 4; spreadcol = (maxcol + 1.0) / (pmaxval - pminval + 1); patref = (double)usecol / maxcol; /*97:*/ for (k = 0; k <= 255; k++) pxllook[k] = k; if (invert) { for (k = 0; k <= 255; k++) pxllook[k] = 255 - k; } if (invert) { FORLIM = pmaxval; for (k = pminval; k <= FORLIM; k++) pxllook[pmaxval - k + pminval] = (long)floor((k - pminval) * spreadcol + 0.5); invbit = 1; invbyte = 255; } else { FORLIM = pmaxval; for (k = pminval; k <= FORLIM; k++) pxllook[k] = (long)floor((k - pminval) * spreadcol + 0.5); } FORLIM = maxcol; for (k = 0; k <= FORLIM; k++) lutone[k] = (long)floor((maxcol - k) * patref + 0.5); if (valinc > 0) { /*98:*/ k = pminval; pk = 0; while (pk <= gradint && k <= pmaxval) { pk = (long)floor(pxllook[k] * 100.0 / maxcol + 0.5); k++; } pkn = pxllook[k - 1]; grxzero = pkn; redval = valinc / 100; FORLIM = pmaxval; for (k = pminval; k <= FORLIM; k++) { /*write(logfile,(pxllook[k]/maxcol):1:5 );*/ grx = pxllook[k]; if (grx <= pkn) { if (grx > 0) pxllook[k] = (long) floor(0.5 * grx * (exp(redval * log(grx / grxzero)) + exp(-redval * log(grx / grxzero))) + 0.5); /* p2c: bm2font.pas, line 1353: * Note: Line breaker spent 1.0 seconds, 5000 tries on line 4297 [251] */ } /*writeln(logfile,' ',(pxllook[k]/maxcol):1:5);*/ } /*close(logfile);;*/ /*:98*/ } /*append(logfile);*/ FORLIM = maxcol; for (pk = 0; pk <= FORLIM; pk++) hktab[pk] = (long)floor((maxcol - pk) * patref * 100 + 0.5) - (long)(lutone[pk] * 100.0); cspread = false; if (usecol - 1 > maxcol) { pk = usecol; for (k = maxcol; k >= 0; k--) { if (invert) pk = usecol - lutone[pxllook[maxcol - k]]; else pk = usecol - lutone[pxllook[k]]; while (pk >= k) { lutone[pk] = lutone[pxllook[k]]; hktab[pk] = (long)floor(lutone[pk] * 100.0 + 0.5) - (long)floor((usecol - pk) * 100.0 + 0.5); lutone[pk] -= hktab[pk] / 100; pk--; } } if (invert) { FORLIM = usecol; for (k = 0; k <= FORLIM; k++) pxllook[k] = lutone[k]; } else { FORLIM = usecol; for (k = 0; k <= FORLIM; k++) pxllook[k] = usecol - lutone[k]; } maxcol = usecol; cspread = true; } invert = false; mapdiv = (usecol + 1.0) / 16; FORLIM = usecol; for (k = 0; k <= FORLIM; k++) lutvga[k] = (long)((usecol - k) / mapdiv); for (pk = -255; pk <= 255; pk++) { if (cspread) gkorh[pk + 255] = (long)(pk / 2.0); else gkorh[pk + 255] = (long)floor(pk / 2.0 * spreadcol + 0.5); if (cspread) gkordivp[pk + 255] = (long)(pk / 2.0); else gkordivp[pk + 255] = (long)(pk / 2.0 * patref + hktab[abs(pk)] / 100.0); } for (pk = 0; pk <= 255; pk++) /*:97*/ spreadvals[pk] = (long)floor(pk * patref + 0.5); do { pxlinlen = fread(b1, 1, pxlinlen, bitmap); colpos = 0; cutrep = 0; FORLIM = greypix; for (pk = 0; pk < FORLIM; pk++) b4[pk] = getcolor(); if (cspread) { FORLIM = greypix; for (pk = 0; pk < FORLIM; pk++) b4[pk] = spreadvals[b4[pk]]; } if (distribute) { /*99:*/ pk = 1; pkn = 1; while (pk < greypix) { pkn++; greykor = 0; if (b4[pk] != b4[pkn]) { greykor = gkorh[b4[pk] - b4[pkn] + 255]; greykor = gkordivp[greykor + 255]; } if (greykor != 0) { tmpcolor = lutone[pxllook[b4[pkn]]]; if (abs(tmpcolor + greykor) <= usecol && abs(tmpcolor + greykor) >= 0) b4[pkn] += greykor; } pk++; } pk = greypix - 1; pkn = pk; while (pk > 0) { /*:99*/ pkn--; greykor = 0; if (b4[pk] != b4[pkn]) { greykor = gkorh[b4[pk] - b4[pkn] + 255]; greykor = gkordivp[greykor + 255]; } if (greykor != 0) { tmpcolor = lutone[pxllook[b4[pkn]]]; if (abs(tmpcolor + greykor) <= usecol && abs(tmpcolor + greykor) >= 0) b4[pkn] += greykor; } pk--; } } FORLIM = greypix; for (pk = 0; pk < FORLIM; pk++) b4[pk] = lutone[pxllook[b4[pk]]]; FORLIM1 = vrep; for (yrep = 1; yrep <= FORLIM1; yrep++) { /*100:*/ FORLIM = vusepxl; for (k = 1; k <= FORLIM; k++) { gbufp = 0; cb = 0; pn = 0; switch (patswitch) { case 1: curpat[0] = 2; curpat[1] = 3; break; case 2: curpat[0] = 4; curpat[1] = 1; break; case 3: curpat[0] = 3; curpat[1] = 2; break; case 4: curpat[0] = 1; curpat[1] = 4; break; } /* p2c: bm2font.pas, line 1233: * Note: Can't interpret size in FILLCHAR [174] */ memset((Anyptr)b3, 0, (long)gbufpp); FORLIM2 = greypix; for (pk = 0; pk < FORLIM2; pk++) { FORLIM4 = hrep; for (xrep = 1; xrep <= FORLIM4; xrep++) { cb = pattern[curpat[pn] - 1][b4[pk]][k - 1]; if (saveblack) cb &= ~pattern[curpat[pn] - 1][bhell[b4[pk]]][k - 1]; dbuf = ((unsigned)gbufp) >> 3; bufsh = gbufp & 7; nextbuf = bufsh + usepxl; switch (bufsh) { case 0: b3[dbuf] = cb; break; default: b3[dbuf] |= cb >> bufsh; if (nextbuf > 8) b3[dbuf + 1] = cb << (8 - bufsh); break; } gbufp += usepxl; if (ledprinter) { if (curpat[pn] == 1 || curpat[pn] == 3) gbufp++; } pn = abs(pn - 1); } } FORLIM2 = gbufpp; for (pk = 0; pk <= FORLIM2; pk++) b3[pk] = ~b3[pk]; if (pgreymem + gbufpp > 65522L) { _SETIO(fwrite(greymem, pgreymem, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } pgreymem = 0; } /* p2c: bm2font.pas, line 1242: * Note: Can't interpret size in BLOCKWRITE [174] */ /* p2c: bm2font.pas, line 1245: Note: Can't interpret size in MOVE [174] */ memmove((Anyptr)(&greymem[pgreymem]), (Anyptr)b3, (long)gbufpp); pgreymem += gbufpp; } /* p2c: bm2font.pas, line 1246: * Note: Can't interpret size in FILLCHAR [174] */ memset((Anyptr)b3, 255, (long)gbufpp); if (ledprinter) { if (patswitch == 2 || patswitch == 4) { if (pgreymem + gbufpp > 65522L) { _SETIO(fwrite(greymem, pgreymem, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } pgreymem = 0; } /* p2c: bm2font.pas, line 1249: * Note: Can't interpret size in BLOCKWRITE [174] */ /* p2c: bm2font.pas, line 1252: Note: Can't interpret size in MOVE [174] */ memmove((Anyptr)(&greymem[pgreymem]), (Anyptr)b3, (long)gbufpp); pgreymem += gbufpp; } /*:100*/ } patswitch++; if (patswitch > 4) patswitch = 1; } pm = 128; pb = pl; FORLIM = greypix; for (pk = 0; pk < FORLIM; pk++) { pxlcolor = lutvga[b4[pk]]; pm >>= 1; if (pm == 0) { pm = 128; pb++; } } pl += 80; if (pl >= 38400L) pl = 0; checksum--; if (cutgrey) pxlinlen = (halfk)(b1[pxlinlen - 1] * 256 + b1[pxlinlen - 2] + 2); } while (checksum != 0); /* p2c: bm2font.pas, line 1213: * Note: Can't interpret size in BLOCKREAD [174] */ if (pgreymem != 0) { /*$I-*/ _SETIO(fwrite(greymem, pgreymem, 1, tmpfil) == 1, FileWriteError); filestat = P_ioresult; if (filestat != 0) { _SETIO(printf("Error occured when writing file %s!\n", tmpname) >= 0, FileWriteError); fileproblem(); _Escape(0); } } /* p2c: bm2font.pas, line 1259: * Note: Can't interpret size in BLOCKWRITE [174] */ posbit = 0; if (ledprinter) mapwidth = (long)floor(greypix * (usepxl + 0.5) + 0.5) * hrep; else mapwidth = greypix * usepxl * hrep; pxlinlen = (mapwidth + 7) / 8; mapinlen = pxlinlen; if (ledprinter) mapheight = (long)floor(mapheight * (vusepxl + 0.5) + 0.5) * vrep; else mapheight *= vusepxl * vrep; if (tmpfil != NULL) fclose(tmpfil); tmpfil = NULL; if (bitmap != NULL) fclose(bitmap); bitmap = NULL; strcpy(bitmap_NAME, tmpname); if (bitmap != NULL) bitmap = freopen(bitmap_NAME, "r+b", bitmap); else bitmap = fopen(bitmap_NAME, "r+b"); if (bitmap == NULL) _EscIO(FileNotFound); } mapwidth = pxlinlen * 8; zeropads = 0; maplines = mapheight; if (clipon) /*117:*/ { /*115:*/ checksum = mapheight * ((mapwidth + 7) / 8); mapheight = 0; freelines = 0; fseek(bitmap, posbit, 0); while (checksum >= pxlinlen) { fread(b1, pxlinlen, 1, bitmap); mapwidth = pxlinlen * 8; j = pxlinlen - 1; while (b1[j] == invbyte && j >= 0) j--; if (j >= 0) { i = 0; while (b1[i] == invbyte && i <= j) i++; if (i < minx) minx = i; lx = j * 8 + 8; cb = b1[j]; for (i = 1; i <= 8; i++) { if ((cb & 1) == invbit) { cb >>= 1; lx--; } else i = 8; } if (lx > maxx) maxx = lx; freelines++; mapheight += freelines; freelines = 0; } else if (mapheight == 0) posbit += pxlinlen; else freelines++; checksum -= pxlinlen; } /* p2c: bm2font.pas, line 1271: * Note: Can't interpret size in BLOCKREAD [174] */ mapwidth = maxx - minx * 8; zeropads = pxlinlen - (mapwidth + 7) / 8; maplines = mapheight; posbit += minx; /*:115*/ } i = (mapwidth + hres - 1) / hres; j = (mapheight + vres - 1) / vres; nj = j; nofchars = i * j; mincharpf = 515832L / (vres * ((hres + 31) / 32) * 32); noffonts = (nofchars + mincharpf - 1) / mincharpf; if (noffonts > 52) { printf("Sorry, bitmap is too large! Giving up\n"); goto _L9999; } if (mincharpf > 128) { /*:117*/ mincharpf = 128; noffonts = (nofchars + 127) / 128; } /*118:*/ k = 0; c = 0; while (mapheight > 0) { /*:118*/ maxx = mapwidth; while (maxx > 0) { if (maxx > hres) pwidth[k][c] = hres; else pwidth[k][c] = maxx; if (mapheight > vres) pheight[k][c] = vres; else pheight[k][c] = mapheight; dsize = (long)floor(vres / truehres * 72.27 * 65536L * 16 + 0.5); tabdsize[k] = dsize; c++; if (c == mincharpf || mapheight <= vres && maxx <= hres) { FORLIM1 = mincharpf; for (c = 0; c < FORLIM1; c++) { height[k][c] = (long)floor(pheight[k][c] / truevres * 4736286.7227 / dsize * 16777215L + 0.5); width[k] [c] = (long)floor(pwidth[k][c] / truehres * 4736286.7227 / dsize * 16777215L + 0.5); } k++; c = 0; } maxx -= hres; } mapheight -= vres; } maxx = (mapwidth + hres - 1) / hres; f = 0; g = 0; pxlbmi = 4; if (fok) { printf("error occurred when allocating pxlfile "); puts(cmd); fileproblem(); goto _L9999; } if (bitmap != NULL) fclose(bitmap); bitmap = NULL; if (bitmap != NULL) bitmap = freopen(bitmap_NAME, "rb", bitmap); else bitmap = fopen(bitmap_NAME, "rb"); if (bitmap == NULL) _EscIO(FileNotFound); fonteject(); /*119:*/ FORLIM = noffonts; for (a = 0; a < FORLIM; a++) { /*:119*/ lh = 17; bc = 0; ec = 127; while (pheight[a][ec] == 0) /*120:*/ ec--; sprintf(cmd, "%s%c.tfm", font, fontpre[a]); strcpy(tfmfile_NAME, cmd); if (tfmfile != NULL) tfmfile = freopen(tfmfile_NAME, "w+b", tfmfile); else tfmfile = fopen(tfmfile_NAME, "w+b"); _SETIO(tfmfile != NULL, FileNotFound); filestat = P_ioresult; if (filestat == 3 || filestat == 5) { strcpy(cmd, bmname); sprintf(cmd + strlen(cmd), "%c.tfm", fontupc[a]); strcpy(tfmfile_NAME, cmd); if (tfmfile != NULL) tfmfile = freopen(tfmfile_NAME, "w+b", tfmfile); else tfmfile = fopen(tfmfile_NAME, "w+b"); _SETIO(tfmfile != NULL, FileNotFound); filestat = P_ioresult; } if (filestat == 0) fok = false; else fok = true; if (fok) { printf("error occurred when allocating tfmfile "); puts(cmd); fileproblem(); goto _L9999; } printf("Generating tfmfile %s\n", cmd); /*:120*/ dsize = (long)floor(vres / truehres * 72.27 * 65536L * 16 + 0.5); tabdsize[a] = dsize; FORLIM2 = ec; for (k = bc; k <= FORLIM2; k++) { height[a][k] = (long)floor( pheight[a][k] / truevres * 4736286.7227 / dsize * 16777215L + 0.5); width[a][k] = (long)floor( pwidth[a][k] / truehres * 4736286.7227 / dsize * 16777215L + 0.5); } fh = height[a][bc]; fw = width[a][bc]; sh = fh; sw = fw; nw = 2; nh = 2; FORLIM2 = ec; for (k = bc; k <= FORLIM2; k++) { if (height[a][k] != 0 && height[a][k] != fh && height[a][k] != sh) { sh = height[a][k]; nh++; } if (width[a][k] != 0 && width[a][k] != fw && width[a][k] != sw) { sw = width[a][k]; nw++; } } if (nh > 3) { printf("more than 2 heights, should be impossible\n"); goto _L9999; } if (nw > 3) { printf("more than 2 widths, should be impossible\n"); goto _L9999; } nd = 2; ni = 2; nl = 0; nk = 0; ne = 0; np = 0; lf = lh + ec - bc + nw + nh + nd + ni + nk + nl + ne + np + 7; checksum = 0; tfmhword(lf); tfmhword(lh); tfmhword(bc); tfmhword(ec); tfmhword(nw); tfmhword(nh); tfmhword(nd); tfmhword(ni); tfmhword(nl); tfmhword(nk); tfmhword(ne); tfmhword(np); tfmword(checksum); tfmword(dsize); strcpy(tfmstr, "0Graphic"); tfmstr[0] = '\007'; FORLIM2 = strlen(tfmstr); for (i = 1; i <= FORLIM2; i++) { tfmb = tfmstr[i - 1]; fwrite(&tfmb, sizeof(uchar), 1, tfmfile); } tfmb = 0; for (i = 1; i <= 32; i++) fwrite(&tfmb, sizeof(uchar), 1, tfmfile); strcpy(tfmstr, "0Bitmap"); tfmstr[0] = '\006'; FORLIM2 = strlen(tfmstr); for (i = 1; i <= FORLIM2; i++) { tfmb = tfmstr[i - 1]; fwrite(&tfmb, sizeof(uchar), 1, tfmfile); } tfmb = 0; for (i = 1; i <= 13; i++) fwrite(&tfmb, sizeof(uchar), 1, tfmfile); FORLIM2 = ec; for (i = bc; i <= FORLIM2; i++) { if (width[a][i] == 0) { tfmb = 0; fwrite(&tfmb, sizeof(uchar), 1, tfmfile); } else if (width[a][i] == fw) { tfmb = 1; fwrite(&tfmb, sizeof(uchar), 1, tfmfile); } else { tfmb = 2; fwrite(&tfmb, sizeof(uchar), 1, tfmfile); } if (height[a][i] == 0) { tfmb = 0; fwrite(&tfmb, sizeof(uchar), 1, tfmfile); } else if (height[a][i] == fh) { tfmb = 16; fwrite(&tfmb, sizeof(uchar), 1, tfmfile); } else { tfmb = 32; fwrite(&tfmb, sizeof(uchar), 1, tfmfile); } tfmhword(0L); } tfmword(0L); tfmword(fw); if (nw > 2) tfmword(sw); tfmword(0L); tfmword(fh); if (nh > 2) tfmword(sh); tfmword(0L); tfmword(0L); tfmword(0L); tfmword(0L); if (tfmfile != NULL) fclose(tfmfile); tfmfile = NULL; } userhelp(); /*109:*/ if (pcxtemp) /* p2c: bm2font.pas, line 1353: Note: Called procedure Exec [285] */ #ifdef MSDOS Exec("del", "pcxtemp.tmp"); #else Exec("rm", "pcxtemp.tmp"); #endif if (giftemp) /* p2c: bm2font.pas, line 1353: Note: Called procedure Exec [285] */ #ifdef MSDOS Exec("del", "giftemp.tmp"); #else Exec("rm", "giftemp.tmp"); #endif if (greypxl) /* p2c: bm2font.pas, line 1353: Note: Called procedure Exec [285] */ #ifdef MSDOS Exec("del", tmpname); #else Exec("rm", tmpname); #endif printf("input %s.tex into your document", font); printf(" and set the picture with \\set%s\n", font); /*:109*/ _L9999: if (texfile != NULL) fclose(texfile); if (bitmap != NULL) fclose(bitmap); if (pxlfile != NULL) fclose(pxlfile); if (tmpfil != NULL) fclose(tmpfil); if (tfmfile != NULL) fclose(tfmfile); exit(EXIT_SUCCESS); } /*:106*/ /* End. */