home *** CD-ROM | disk | FTP | other *** search
- /*
- hpfntwrite.c
-
- converts hpcl output into a [series of] pbm file[s].
- based on faxpak's fntwrite for texttopbm, which was ripped off
- from chart.c
-
- version 1.0, Copyright (C) 1991, klaus schallhorn, <klaus@cnix.uucp>
-
- Permission to use, copy, modify, and distribute this software and its
- documentation for any purpose and without fee is hereby granted, provided
- that the above copyright notice appear in all copies and that both that
- copyright notice and this permission notice appear in supporting
- documentation. This software is provided "as is" without express or
- implied warranty.
- */
-
- #include "hptopbm.h"
-
- #ifndef lint
- char SCCSid[] = "@(#)hpfntwrite.c: 1.1 91/12/03 00:34:42";
- #endif
-
- #ifdef FAXPAK
- extern struct FAXCONFIG fc;
- #endif
-
- #ifndef MAX_HITE
- #define MAX_HITE 4200 /* 14 in @ 300 dpi */
- #endif
- #ifndef MAX_WIDTH
- #define MAX_WIDTH 2800
- #endif
-
- #define MAX_FONT MAX_BUILTIN+MAX_DOWNLOAD
- #define MAX_MACRO 32
- #define MAX_PAT 14
-
- #define ESC '\033'
- #define setpix(y,x) (block[y][x>>3] |= bit[x&7])
-
- #ifndef min
- #define min(a,b) ((a<b)?a:b)
- #define max(a,b) ((a>b)?a:b)
- #endif
-
-
- #define relative() movetype
-
- extern int builtin, dotted, movetype, lastfontid;
-
- static uchar *block[MAX_HITE];
-
- static struct MCENV
- {
- int page_len,
- top_margin,
- left_margin,
- rite_margin,
- cur_fnt,
- cur_fID,
- cur_mac,
- pfont,
- cur_chr,
- underline,
- dpi,
- pID,
- top_dots,
- left_dots,
- text_len;
- double hmi,
- lhite,
- Hlen, Vlen;
- } McEnv, orgenv, *curenv;
-
- static struct OVLY
- {
- struct MCENV ovly_env;
- int sfont;
- double BMX, BMY, /* current abs xy */
- GRAPHX;
- double lpi;
- } ovly, restore;
-
- struct FONT_ATTS
- {
- int orient,
- symset,
- prop_spaced,
- style,
- stroke,
- typeface;
- double pitch,
- points;
- } lastspec;
-
- static int sfont,
- max_ln, max_col, /* max dimen abs pels */
- xmax_used, ymax_used, /* max abs used */
- bmx, bmy, /* current abs xy */
- see_thru, /* dont paint anything */
- new_topmargin, /* takes effect on next page unless <ESC>&a0R */
- env_saved,
- stackpos,
- auto_macro,
- try_select,
- virgin = TRUE,
- no_bitmap = TRUE;
-
- static int xscale[MAX_WIDTH], yscale[MAX_HITE], fax_head_size;
-
- static double xdpi, ydpi, lpi, BMX, BMY, GRAPHX;
-
- static uchar bit[] =
- {
- 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01
- };
-
- struct CHAR_BITMAP
- {
- short len, hite, clen, toffs, loffs;
- uchar **CH;
- };
-
- struct HPFONT
- {
- int fID,
- active,
- prop_spaced,
- real_spaced,
- permtype,
- primtype,
- builtin;
- double space_len,
- real_space_len; /* to restore reality */
- struct FONT_ATTS font_atts;
- struct CHAR_BITMAP chars[256];
- } hpfonts[MAX_FONT], *cfn, *getcfn(), *findlstid();
-
- struct MACRO
- {
- int active,
- permtype,
- magic,
- len;
- uchar *macro;
- } macros[MAX_MACRO], *cmc, *getcmc();
-
- struct STACK
- {
- double BMX, BMY;
- } stack[MAX_PUSHNPOP];
-
- struct PAT
- {
- uchar p;
- struct PAT *xnext, *ynext;
- } pat[MAX_PAT][32][4];
-
- char *BuiltinFonts[]=
- {
- /* 0*/ "lp.sfp",
- /* 1*/ "",
- /* 2*/ "",
- /* 3*/ "cour.sfp",
- /* 4*/ "",
- /* 5*/ "",
- /* 6*/ "",
- /* 7*/ "",
- NULL
- };
-
- #define GRAY 2
- #define GRAY_BASE 0
- #define RULE 3
- #define RULE_BASE 7
- #define SOLID 7
-
- char *BuiltinPats[]=
- {
- "hprast1",
- "hprast2",
- "hprast3",
- "hprast4",
- "hprast5",
- "hprast6",
- "hprast7",
- "hprast8",
- "hppat1",
- "hppat2",
- "hppat3",
- "hppat4",
- "hppat5",
- "hppat6",
- NULL
- };
-
-
- /* STARTUP, automagically called from main ********************************* */
- rs_rastsize(x,y)
- double x,y;
- {
- #ifdef FAXPAK
- extern char *PGM;
-
- if (!strcmp(PGM,"hp2lofax"))
- fax_head_size = 40;
- else fax_head_size = 80;
- #endif
-
- xdpi = x;
- ydpi = y;
- see_thru = 0;
- lpi = 6.0;
- orgenv.page_len = PAGE_LEN;
- orgenv.top_margin = new_topmargin = TOP_MARGIN;
- orgenv.left_margin = LEFT_MARGIN;
- orgenv.rite_margin = RITE_MARGIN;
- orgenv.text_len = PAGE_LEN - TOP_MARGIN;
- orgenv.text_len -= 3;
- orgenv.lhite = 50;
- orgenv.top_dots = fax_head_size + orgenv.top_margin*orgenv.lhite;
- orgenv.left_dots = 47; /* dots = .157 in */
- orgenv.dpi = 75; /* hp 2686a */
- stackpos = 0;
- try_select = 0;
- builtin = -1;
- orgenv.cur_fID = orgenv.cur_chr = -1;
- orgenv.cur_mac = -1;
- curenv = &orgenv;
- auto_macro = -1;
- cfn = NULL;
- cmc = NULL;
- fontinit();
- xyinit();
- macinit();
- ovlyinit();
- builtin_fontinit();
- builtin_patinit();
- }
- fontinit()
- {
- int i, j, *Yptr;
- struct HPFONT *hf;
- struct CHAR_BITMAP *cf;
- double x;
-
- for (j=0; j<MAX_FONT; j++)
- {
- hf = &hpfonts[j];
- hf->fID = hf->prop_spaced = hf->real_spaced = -1;
- hf->permtype = hf->primtype = -1;
- hf->space_len = -1.0;
- hf->real_space_len = -1.0;
- hf->active = hf->builtin = FALSE;
- for (i=0; i<256; i++) /* just to be safe */
- {
- cf = &hf->chars[i];
- cf->CH = (uchar **)NULL;
- cf->len = cf->hite = cf->clen = cf->toffs = cf->loffs = 0;
- }
- }
- hf = &hpfonts[LINEPRINTER];
- hf->prop_spaced = hf->real_spaced = 0;
- hf->space_len = 18;
- hf->real_space_len = 18;
- hf->active = hf->builtin = TRUE;
-
- hf = &hpfonts[COURIER];
- hf->prop_spaced = hf->real_spaced = 0;
- hf->space_len = 30;
- hf->real_space_len = 30;
- hf->active = hf->builtin = TRUE;
-
- if (((int)xdpi == 300) && ((int)ydpi == 300))
- {
- Yptr = xscale;
- for (i=0; i<MAX_WIDTH; i++)
- *Yptr++ = i;
- Yptr = yscale;
- for (i=0; i<MAX_HITE; i++)
- *Yptr++ = i;
- }
- else
- {
- Yptr = &xscale[1];
- for (i=1; i<MAX_WIDTH; i++)
- {
- x = .5 + ((double)i * xdpi);
- x /= 300.0;
- *Yptr++ = (int)x;
- }
- Yptr = &yscale[1];
- for (i=1; i<MAX_HITE; i++)
- {
- x = .5 + ((double)i * ydpi);
- x /= 300.0;
- *Yptr++ = (int)x;
- }
- }
- }
- xyinit()
- {
- BMY = orgenv.top_dots;
- BMX = 0.0;
- GRAPHX = 0.0;
- }
- ovlyinit()
- {
- ovly.ovly_env = orgenv;
- ovly.sfont = sfont;
- ovly.BMX = BMX;
- ovly.BMY = BMY;
- ovly.GRAPHX = GRAPHX;
- ovly.lpi = lpi;
- }
- builtin_fontinit()
- {
- int i;
-
- for (i=0; i<MAX_BUILTIN; i++)
- if (BuiltinFonts[i] && *BuiltinFonts[i])
- {
- builtin = i;
- loadbuiltin(BuiltinFonts[i]);
- }
- builtin = -1;
- curenv->cur_fnt = COURIER;
- }
- builtin_patinit()
- {
- int i,j,k,x,y;
- FILE *fp;
- char buf[256], fname[256];
- struct PAT *ptr;
-
- for (k=0; k<MAX_PAT; k++)
- {
- #ifdef FAXPAK
- sprintf(fname, "%s/hplib/%s", fc.faxlib, BuiltinPats[k]);
- #else
- sprintf(fname, BUILTINDIR, LIBDIR, BuiltinPats[k]);
- #endif
- if ((fp = fopen(fname, "r")) == NULL)
- die("can't open %s\n",fname);
- if (fgets(buf, 80, fp) == NULL || strncmp(buf, "P4", 2))
- die("%s doesn't look like a pbm file\n",fname);
- for (;;)
- {
- if (fgets(buf, 256, fp) == NULL)
- die("A: %s doesn't look like a pbm file\n",fname);
- if (buf[0] != '#')
- {
- if (sscanf(buf, "%d %d",&x,&y) != 2)
- die("B: %s doesn't look like a pbm file\n",fname);
- break;
- }
- }
- if (!(x % 8))
- x /= 8;
- else x = 1+(x/8);
- if (x < 4 || y < 32)
- die("%s is not a known pattern\n",fname);
-
- for (j=0; j<31; j++)
- {
- for (i=0; i<3; i++)
- {
- ptr = &pat[k][j][i];
- ptr->p = getc(fp);
- ptr->xnext = &pat[k][j][i+1];
- ptr->ynext = &pat[k][j+1][i];
- }
- ptr = &pat[k][j][3];
- ptr->p = getc(fp);
- ptr->xnext = &pat[k][j][0];
- ptr->ynext = &pat[k][j+1][3];
- }
- for (i=0; i<3; i++)
- {
- ptr = &pat[k][j][i];
- ptr->p = getc(fp);
- ptr->xnext = &pat[k][j][i+1];
- ptr->ynext = &pat[k][0][i];
- }
- ptr = &pat[k][j][3];
- ptr->p = getc(fp);
- ptr->xnext = &pat[k][j][0];
- ptr->ynext = &pat[k][0][3];
- fclose(fp);
- }
- }
- make_bitmap(x,y)
- int x,y;
- {
- int i, orgx, xa, ya;
-
- if (x > MAX_WIDTH || y > MAX_HITE)
- die("requested bitmap too large\n");
-
- orgx = x;
- if (x%32) /* set to 32bit/4byte boundary */
- x = x+32-(x%32);
- x /= 8;
-
- xa = xscale[x];
- ya = yscale[y];
-
- for (i=0; i<ya; i++)
- if ((block[i] = (uchar *)calloc(xa,sizeof(uchar))) == NULL)
- die("not enough memory\n");
- for (; i<MAX_HITE; i++)
- block[i] = NULL;
-
- max_ln = y-1;
- max_col = (orgx)-1;
- no_bitmap = FALSE;
- }
-
- end_bitmap(tname)
- char *tname;
- {
- int i, j, xmax;
- FILE *fp;
-
- if ((fp = fopen(tname, "w")) == NULL)
- die("cannot create pbm file %s\n",tname);
-
- ymax_used = yscale[max_ln-1];
- #ifdef FAXPAK
- xmax = min(216, xscale[(max_col+7)/8]); /* max 1728 pels */
- #else
- xmax = xscale[(max_col+7)/8];
- #endif
- if (fprintf(fp,"P4\n%d %d\n",xmax*8,ymax_used) == EOF)
- die("can't init pbmfile %s\n",tname);
-
- for (i=0; i<ymax_used; i++)
- {
- if ((j = fwrite((char*)block[i], 1, xmax, fp)) != xmax)
- die("premature EOF after %d bytes of %d, line %d of %d\n",
- j,xmax,i,ymax_used);
- (void)memset((char*)block[i], '\0', xmax);
- }
- fclose(fp);
-
- ymax_used = xmax_used = 0;
- orgenv.top_margin = new_topmargin;
- orgenv.top_dots = fax_head_size + orgenv.top_margin*orgenv.lhite;
- curenv = &orgenv;
- dotted = FALSE;
- virgin = TRUE;
- stackpos = 0;
- }
-
- /* FONT stuff ************************************************************** */
- struct HPFONT *getcfn()
- {
- struct HPFONT *hpf;
-
- if (curenv->cur_fnt < 0 || curenv->cur_fnt >= MAX_FONT)
- die("don't know font %d\n",curenv->cur_fnt);
- hpf = &hpfonts[curenv->cur_fnt];
- if (!hpf->active)
- die("font %d not active\n",curenv->cur_fnt);
- curenv->cur_fID = hpf->fID;
- return(hpf);
- }
- struct HPFONT *findlstid()
- {
- struct HPFONT *hpf;
- int i;
-
- for (i=0; i<MAX_FONT; i++)
- {
- hpf = &hpfonts[i];
- if (hpf->active && hpf->fID == lastfontid)
- return(hpf);
- }
- return(NULL);
- }
- /* defaults are set from various places after various events, almost circular */
- tlen_default()
- {
- curenv->text_len = curenv->page_len - curenv->top_margin;
- curenv->text_len -= (300/curenv->lhite)/2;
- }
- mtop_default()
- {
- curenv->top_margin = TOP_MARGIN;
- curenv->top_dots = fax_head_size + curenv->top_margin*curenv->lhite;
- }
- lr_default()
- {
- curenv->left_margin = LEFT_MARGIN;
- curenv->left_dots = 47;
- curenv->rite_margin = RITE_MARGIN;
- }
- hmi_default()
- {
- cfn = getcfn();
- curenv->hmi = cfn->real_space_len;
- cfn->space_len = cfn->real_space_len;
- }
- setshift(n)
- int n;
- {
- if (try_select)
- best_match();
-
- cfn = getcfn();
- cfn->primtype = n;
- curenv->cur_fID = cfn->fID;
- hmi_default();
- }
-
- /* clearing fonts or chars ************************************************* */
- clearchar(cptr)
- struct CHAR_BITMAP *cptr;
- {
- int i;
-
- for (i=0 ;i<cptr->hite; i++)
- if (cptr->CH[i])
- free((char*)cptr->CH[i]);
- if (cptr->CH)
- free((char*)cptr->CH);
- cptr->CH = (uchar **)NULL;
- cptr->len = cptr->hite = cptr->clen = cptr->toffs = cptr->loffs = 0;
- }
- clear1font(fptr)
- struct HPFONT *fptr;
- {
- int i;
-
- for (i=32; i<256; i++)
- clearchar(&fptr->chars[i]);
- fptr->fID = fptr->prop_spaced = fptr->real_spaced =
- fptr->permtype = fptr->primtype = -1;
- fptr->space_len = -1;
- fptr->real_space_len = -1;
- fptr->active = FALSE;
- }
- clearallfonts()
- {
- clearfonts(TEMPORARY);
- clearfonts(PERMANENT);
- orgenv.cur_fnt = COURIER;
- orgenv.cur_fID = -1;
- env_saved = FALSE;
- curenv = &orgenv;
- }
- clearfonts(type)
- int type;
- {
- int i;
- struct HPFONT *cf;
-
- for (i=0; i<MAX_FONT; i++)
- {
- cf = &hpfonts[i];
- if ((!cf->builtin) && cf->active && cf->permtype == type)
- {
- if (curenv->cur_fnt == i && dotted)
- {
- pbmeject(TRUE);
- curenv = &orgenv;
- curenv->cur_fID = -1;
- curenv->cur_fnt = COURIER;
- env_saved = FALSE;
- }
- clear1font(&hpfonts[i]);
- }
- }
- }
- clearcurfont()
- {
- struct HPFONT *hp;
-
- if ((hp = findlstid()) != (struct HPFONT*)NULL)
- if (!cfn->builtin)
- {
- if (hp == cfn)
- orgenv.cur_fnt = COURIER;
- clear1font(hp);
- curenv = &orgenv;
- curenv->cur_fID = -1;
- env_saved = FALSE;
- if (dotted)
- pbmeject(TRUE);
- }
- }
- clearlastchar()
- {
- cfn = getcfn();
- if ((!cfn->builtin) && cfn->chars[curenv->cur_chr].len)
- clearchar(&cfn->chars[curenv->cur_chr]);
- }
- makeftype(what)
- int what;
- {
- int i;
- struct HPFONT *hpf;
-
- if (lastfontid == -1)
- return;
- if ((hpf = findlstid()) != (struct HPFONT *)NULL)
- hpf->permtype = what;
- else
- {
- for (i=0; i<MAX_FONT; i++)
- {
- hpf = &hpfonts[i];
- if (!hpf->active)
- {
- hpf->active = TRUE;
- hpf->fID = lastfontid;
- hpf->permtype = what;
- break;
- }
- }
- if (i == MAX_FONT)
- die("too many fonts\n");
- }
- }
- best_match()
- {
- int i, *ip, best, bestfnt, canuse[MAX_FONT];
- struct HPFONT *hf;
-
- try_select = FALSE;
-
- ip = canuse;
- for (i=0; i<MAX_FONT; i++)
- *ip++ = 0;
-
- ip = canuse;
- for (i=0; i<MAX_FONT; i++, ip++)
- {
- hf = &hpfonts[i];
- if (hf->active)
- {
- if (hf->font_atts.orient == lastspec.orient)
- *ip = 8;
- if (hf->font_atts.symset == lastspec.symset)
- *ip += 7;
- if (hf->font_atts.prop_spaced == lastspec.prop_spaced)
- *ip += 6;
- if (hf->font_atts.pitch == lastspec.pitch)
- *ip += 5;
- if (hf->font_atts.points == lastspec.points)
- *ip += 4;
- if (hf->font_atts.style == lastspec.style)
- *ip += 3;
- if (hf->font_atts.stroke == lastspec.stroke)
- *ip += 2;
- if (hf->font_atts.typeface == lastspec.typeface)
- *ip += 1;
- }
- }
- ip = canuse;
- for (bestfnt = best = -1, i=0; i<MAX_FONT; i++, ip++)
- if (*ip > best)
- {
- best = *ip;
- bestfnt = i;
- }
- if (bestfnt > -1 && bestfnt < MAX_FONT)
- {
- curenv->cur_fnt = bestfnt;
- hf = getcfn();
- }
- }
-
- /* mostly char/line based dimension defaults ******************************* */
- rs_plen(n)
- double n;
- {
- if (n && curenv->lhite && curenv->lhite*n < 14*300)
- {
- curenv->page_len = (int)n;
- mtop_default();
- tlen_default();
- lr_default();
- }
- (void)rs_auto_enable(FALSE);
- }
- rs_mtop(n)
- double n;
- {
- if (curenv->lhite && curenv->lhite*n < curenv->lhite*curenv->page_len)
- {
- new_topmargin = (int)n;
- if (virgin)
- {
- curenv->top_margin = new_topmargin;
- curenv->top_dots = fax_head_size + curenv->top_margin*curenv->lhite;
- }
- tlen_default();
- }
- }
- rs_tlen(n)
- double n;
- {
- if (n && (n <= (curenv->page_len - curenv->top_margin)))
- curenv->text_len = (int)n;
- else if (!n)
- tlen_default();
- }
- rs_mleft(n)
- double n;
- {
- cfn = getcfn();
- if (n < curenv->rite_margin)
- {
- curenv->left_margin = (int)n;
- curenv->left_dots = curenv->left_margin * cfn->space_len;
- }
- }
- rs_mright(n)
- double n;
- {
- if (n > curenv->left_margin)
- curenv->rite_margin = (int)n;
- }
- rs_col(n)
- double n;
- {
- cfn = getcfn();
- if (relative())
- BMX += n*cfn->space_len;
- else if (!(int)n)
- BMX = curenv->left_dots;
- else BMX = n*cfn->space_len;
- BMX = max(0.0, BMX);
- BMX = min(BMX, (double)((RITE_MARGIN-1)*30)); /* using 10cpi for max */
- }
- rs_row(n)
- double n;
- {
- double largest;
-
- if (!(int)n)
- {
- curenv->top_margin = new_topmargin;
- curenv->top_dots = fax_head_size + curenv->top_margin*curenv->lhite;
- BMY = (double)curenv->top_dots * curenv->lhite;
- return;
- }
- if (relative())
- {
- BMY += n*curenv->lhite;
- if (n > 0 && BMY > (curenv->top_margin+curenv->text_len)*curenv->lhite)
- {
- pbmeject(TRUE);
- rs_row(0.0);
- return;
- }
- else if (BMY < 0)
- BMY = curenv->top_dots * curenv->lhite;
- }
- else
- BMY = curenv->top_dots + n * curenv->lhite;
- BMY = max(0.0, BMY);
- largest = (double)(fax_head_size+curenv->top_margin+curenv->text_len)*curenv->lhite;
- BMY = min(BMY, largest);
- }
- half_linefeed()
- {
- BMY += curenv->lhite/2.0;
- }
- /* dotty stuff ************************************************************* */
- rs_lpi(n)
- double n;
- {
- int pels;
-
- pels = (int)n;
- switch(pels)
- {
- case 1: curenv->lhite = 300.0; break;
- case 2: curenv->lhite = 150.0; break;
- case 3: curenv->lhite = 100.0; break;
- case 4: curenv->lhite = 75.0; break;
- case 6: curenv->lhite = 50.0; break;
- case 8: curenv->lhite = 37.5; break;
- case 12: curenv->lhite = 25.0; break;
- case 16: curenv->lhite = 18.75; break;
- case 24: curenv->lhite = 12.5; break;
- case 48: curenv->lhite = 6.25; break;
- default: return;
- }
- lpi = n;
- }
- rs_vmi(n)
- double n;
- {
- if (n >= 0 && n < 126)
- curenv->lhite = n*300/48;
- }
- rs_hmi(n)
- double n;
- {
- cfn = getcfn();
- if (n >= 0 && n < 126 && cfn->active) {
- cfn->space_len = n*300/120;
- curenv->hmi = cfn->space_len;
- }
- }
- rs_X(x)
- double x;
- {
- if (relative())
- BMX += x;
- else BMX = x;
- BMX = max(0.0, BMX);
- /* max == rightmost legal pixel */
- /* would be pixel 29 if RIGHT_MARGIN == 0 */
- BMX = min(BMX, (double)((1+RITE_MARGIN)*30)-1);
- }
- rs_Y(y,decipt)
- double y;
- int decipt;
- {
- if (relative())
- BMY += y;
- else BMY = curenv->top_dots+y;
- BMY = max(0.0, BMY);
- if (decipt)
- y = PAGE_LEN * 50;
- else y = (fax_head_size+curenv->top_margin+curenv->text_len)*curenv->lhite;
- BMY = min(BMY, y);
- }
- /* font settings *********************************************************** */
- rs_symset(set)
- int set;
- {
- lastspec.symset = set;
- }
- rs_spacing(n)
- int n;
- {
- cfn = getcfn();
- cfn->prop_spaced = n;
- if (cfn->real_spaced)
- {
- cfn->space_len = cfn->real_space_len;
- curenv->hmi = cfn->real_space_len;
- }
- lastspec.prop_spaced = n;
- }
- rs_pitch(n)
- double n;
- {
- lastspec.pitch = n;
- try_select = 1;
- }
- rs_points(n)
- double n;
- {
- lastspec.points = n;
- try_select = 1;
- }
- rs_style(n)
- int n;
- {
- lastspec.style = n;
- try_select = 1;
- }
- rs_stroke(n)
- int n;
- {
- lastspec.stroke = n;
- try_select = 1;
- }
- rs_typeface(n)
- int n;
- {
- lastspec.typeface = n;
- try_select = 1;
- }
- rs_setpitch(n)
- double n;
- {
- cfn = getcfn();
- if (!cfn->prop_spaced)
- {
- cfn->space_len = 300/n;
- curenv->hmi = cfn->space_len;
- }
- }
- /* unclassified ************************************************************ */
- rs_ul(n)
- double n;
- {
- curenv->underline = (int)n;
- }
- rs_thru(n)
- double n;
- {
- see_thru = (int)n;
- }
- rs_stack(n)
- double n;
- {
- struct STACK *st;
-
- if (n && stackpos > 0)
- {
- st = &stack[--stackpos];
- BMX = st->BMX;
- BMY = st->BMY;
- }
- else if ((!n) && stackpos < MAX_PUSHNPOP-1)
- {
- st = &stack[stackpos++];
- st->BMX = BMX;
- st->BMY = BMY;
- }
- }
- #ifdef TRIMPAGE
- rs_ymax(n) /* used to force full height 1st page, faxpak related */
- int n;
- {
- ymax_used = yscale[n];
- }
- #endif
- /* font work *************************************************************** */
- rs_font(n, ptype)
- int n, ptype; /* secondary or primary, not yet used */
- {
- int i;
- struct HPFONT *cf;
-
- for (i=0; i<MAX_FONT; i++)
- {
- cf = &hpfonts[i];
- if (cf->active && cf->fID == n)
- {
- orgenv.cur_fnt = i;
- orgenv.cur_fID = n;
- break;
- }
- }
- if (i == MAX_FONT)
- die("font %d not found\n",n);
-
- cfn = &hpfonts[orgenv.cur_fnt];
- cfn->space_len = cfn->real_space_len;
- curenv->hmi = cfn->space_len;
- curenv->cur_fID = n;
- }
- rs_fc_ctl(n)
- double n;
- {
- switch((int)n)
- {
- case 0: clearallfonts(); break;
- case 1: clearfonts(TEMPORARY); break;
- case 2: clearcurfont(); break;
- case 3: clearlastchar(); break;
- case 4: makeftype(TEMPORARY); break;
- case 5: makeftype(PERMANENT); break;
- case 6: cfn = getcfn();
- cfn->fID = curenv->cur_fID = lastfontid;
- if (!cfn->builtin)
- cfn->permtype = TEMPORARY;
- break;
- }
- }
- create_fnthdr(orient,symset,prop,pitch,style,stroke,face,pt)
- int orient,symset,prop,pitch,style,stroke,face;
- double pt;
- {
- static struct HPFONT *hpf;
- int i;
-
- if (curenv->cur_fnt < 0 || curenv->cur_fnt >= MAX_FONT)
- die("don't know font %d\n",curenv->cur_fnt);
- if (builtin > -1 && builtin < MAX_FONT)
- hpf = &hpfonts[builtin];
- else
- {
- if ((hpf = findlstid()) == (struct HPFONT*)NULL)
- {
- for (i=0; i<MAX_FONT; i++)
- {
- hpf = &hpfonts[i];
- if (!hpf->active)
- {
- hpf->active = TRUE;
- hpf->fID = curenv->cur_fID = lastfontid;
- orgenv.cur_fnt = curenv->cur_fnt = i;
- break;
- }
- }
- if (i == MAX_FONT)
- die("too many fonts\n");
- }
- }
-
- hpf->real_space_len = pitch/4;
- hpf->space_len = hpf->real_space_len;
- hpf->chars[' '].clen = hpf->space_len;
- curenv->hmi = hpf->space_len;
-
- hpf->prop_spaced = hpf->real_spaced = prop;
- hpf->primtype = TEMPORARY; /* hp users manual hp2686a, 4-49 */
- hpf->font_atts.orient = orient;
- hpf->font_atts.symset = symset;
- hpf->font_atts.prop_spaced = prop;
- hpf->font_atts.pitch = 4.0*300.0/(double)pitch;
- hpf->font_atts.points = pt;
- hpf->font_atts.style = style;
- hpf->font_atts.stroke = stroke;
- hpf->font_atts.typeface = face;
- }
- char_download(c,id,left,top,width,hite,delta,buf)
- int c,id,left,top,width,hite,delta;
- uchar *buf;
- {
- struct CHAR_BITMAP *cbm;
- struct HPFONT *cf;
- int i;
-
- if (builtin > -1 && builtin < MAX_FONT)
- {
- cf = &hpfonts[builtin];
- i = builtin;
- }
- else
- {
- for (i=0; i<MAX_FONT; i++)
- {
- cf = &hpfonts[i];
- if (cf->active && cf->fID == id)
- break;
- }
- }
- if (i == MAX_FONT)
- die("can't download a char without font header\n");
-
- cbm = &cf->chars[c];
- curenv->cur_chr = c;
-
- if (cbm->hite && cbm->CH)
- clearchar(cbm);
-
- cbm->loffs = left;
- cbm->toffs = top;
- if (width%8)
- cbm->len = width/8 + 1;
- else cbm->len = width/8;
- cbm->hite = hite;
- if ((cbm->clen = delta/4) == 0)
- cbm->clen = 8*cbm->len; /* yes, I do have some strange fonts */
-
- if (!cf->prop_spaced && c == 'x' && (!cf->chars[' '].clen))
- cf->space_len = cbm->clen;
-
- buf += sizeof(struct download);
- if ((cbm->CH = (uchar**)malloc(hite * sizeof(uchar *))) == (uchar **)NULL)
- die("not enough memory for bitmap array char %d\n",c);
-
- for (i=0; i<cbm->hite; i++)
- {
- if ((cbm->CH[i] = (uchar *)malloc(cbm->len)) == (uchar *)NULL)
- die("not enough memory for bitmap at char %d\n",c);
- (void)memcpy((char*)cbm->CH[i], (char*)buf, cbm->len);
- buf += cbm->len;
- }
- }
- /* paintwork *************************************************************** */
- rs_dpi(n)
- double n;
- {
- curenv->dpi = (int)n;
- }
- rs_graphxy(n)
- double n;
- {
- if ((int)n)
- GRAPHX = BMX;
- else GRAPHX = 0.0;
- }
- rs_pix(pels, len)
- uchar *pels;
- int len;
- {
- int i, k, localy, inc, graphx, graphy;
-
- if (see_thru)
- return;
- if (no_bitmap)
- die("no can do without a bitmap\n");
-
- inc = 300/curenv->dpi;
-
- graphy = (int)(BMY + .5);
- graphx = (int)(GRAPHX + .5);
- if (graphy < 0 || inc+graphy >= max_ln)
- return;
- localy = yscale[graphy];
-
- if (graphx + (inc*len*8) > max_col)
- len = ((max_col-graphx)/8)/inc;
-
- switch(curenv->dpi) /* hey, who says we're trying to be efficient? */
- {
- case 300: for (i=0; i<len; i++, pels++)
- for (k=0; k<8; k++, graphx++)
- if (*pels & bit[k])
- setpix(localy, xscale[graphx]);
- break;
- case 150: for (i=0; i<len; i++, pels++)
- for (k=0; k<8; k++, graphx += inc)
- if (*pels & bit[k])
- {
- setpix(localy, xscale[graphx]);
- setpix(localy, xscale[graphx+1]);
-
- setpix(localy+1, xscale[graphx]);
- setpix(localy+1, xscale[graphx+1]);
- }
- break;
- case 100: for (i=0; i<len; i++, pels++)
- for (k=0; k<8; k++, graphx += inc)
- if (*pels & bit[k])
- {
- setpix(localy, xscale[graphx]);
- setpix(localy, xscale[graphx+1]);
- setpix(localy, xscale[graphx+2]);
-
- setpix(localy+1, xscale[graphx]);
- setpix(localy+1, xscale[graphx+1]);
- setpix(localy+1, xscale[graphx+2]);
-
- setpix(localy+2, xscale[graphx]);
- setpix(localy+2, xscale[graphx+1]);
- setpix(localy+2, xscale[graphx+2]);
- }
- break;
- case 75: for (i=0; i<len; i++, pels++)
- for (k=0; k<8; k++, graphx += inc)
- if (*pels & bit[k])
- {
- setpix(localy, xscale[graphx]);
- setpix(localy, xscale[graphx+1]);
- setpix(localy, xscale[graphx+2]);
- setpix(localy, xscale[graphx+3]);
-
- setpix(localy+1, xscale[graphx]);
- setpix(localy+1, xscale[graphx+1]);
- setpix(localy+1, xscale[graphx+2]);
- setpix(localy+1, xscale[graphx+3]);
-
- setpix(localy+2, xscale[graphx]);
- setpix(localy+2, xscale[graphx+1]);
- setpix(localy+2, xscale[graphx+2]);
- setpix(localy+2, xscale[graphx+3]);
-
- setpix(localy+3, xscale[graphx]);
- setpix(localy+3, xscale[graphx+1]);
- setpix(localy+3, xscale[graphx+2]);
- setpix(localy+3, xscale[graphx+3]);
- }
- break;
- }
- BMY += inc;
- BMX = (double)(graphx + inc);
- ymax_used = max(ymax_used,(localy-1)+inc);
- xmax_used = max(xmax_used,xscale[(graphx-1)+inc]);
- dotted = TRUE;
- virgin = FALSE;
- }
- /* build in rules, patterns, shades **************************************** */
- rs_hsize(n)
- double n;
- {
- curenv->Hlen = n;
- }
- rs_hdsize(n)
- double n;
- {
- curenv->Hlen = n*300.0/720.0;
- }
- rs_vsize(n)
- double n;
- {
- curenv->Vlen = n;
- }
- rs_vdsize(n)
- double n;
- {
- curenv->Vlen = n*300.0/720.0;
- }
- rs_pid(n)
- double n;
- {
- curenv->pID = n;
- }
- rs_prnpat(n)
- double n;
- {
- struct PAT *ptr;
- int i,j,k,l,x,y,localy,localx, maxx, maxy, maxb, hlen, vlen;
-
- switch((int)n)
- {
- case 0: k = SOLID; break;
- case RULE: k = RULE_BASE + curenv->pID; break;
- case GRAY: k = GRAY_BASE;
- if (curenv->pID >= 3 && curenv->pID <= 10)
- k += 1;
- else if (curenv->pID >= 11 && curenv->pID <= 20)
- k += 2;
- else if (curenv->pID >= 21 && curenv->pID <= 35)
- k += 3;
- else if (curenv->pID >= 36 && curenv->pID <= 55)
- k += 4;
- else if (curenv->pID >= 66 && curenv->pID <= 80)
- k += 5;
- else if (curenv->pID >= 81 && curenv->pID <= 99)
- k += 6;
- else k += 7;
- break;
- }
- if (k < 0 || k >= MAX_PAT)
- k = SOLID;
-
- bmx = (int)(BMX + .5);
- bmy = (int)(BMY + .5);
- hlen = (int)(curenv->Hlen + .5);
- vlen = (int)(curenv->Vlen + .5);
-
- x = bmx % 32;
- y = bmy % 32;
- maxx = min(max_col-bmx, hlen); /* max dist in pels */
- maxb = ((maxx%8)>0) + (maxx/8); /* max bytes */
- maxx += bmx; /* reset to last col */
- maxy = min(max_ln-bmy, vlen); /* max rules */
-
- ptr = &pat[k][y][x/8];
- for (j=0; j<maxy; j++, bmy++, ptr = ptr->ynext)
- {
- localy = yscale[bmy];
- localx = bmx;
- l = localx%8;
- for (i=0; localx<maxx; i++, ptr = ptr->xnext)
- {
- for (; l<8 && localx<maxx; l++, localx++)
- {
- if (ptr->p & bit[l])
- setpix(localy, xscale[localx]);
- }
- l = 0;
- }
- for ( ; i%4; i++, ptr = ptr->xnext)
- ; /* reset xnext to starting pt */
- }
- virgin = FALSE;
- }
- /* prose ******************************************************************* */
- prt_hpchr(c)
- int c;
- {
- struct CHAR_BITMAP *cbm, *ubm;
- int i, j, k, curx, cury, localy, clen, before;
-
- if (see_thru)
- return;
-
- if (try_select)
- best_match(); /* speculate */
-
- switch(c)
- {
- case 0x0a: rs_row(1.0); return;
- case 0x0d: rs_col((double)curenv->left_margin); return;
- case 0x0e: setshift(SECONDARY); return;
- case 0x0f: setshift(PRIMARY); return;
- }
- /*
- now, we're thinking in terms of 300 dpi, but we're actually
- drawing at a possibly scaled resolution selected at startup,
- */
- cfn = getcfn();
- cbm = &cfn->chars[c];
-
- if (cfn->prop_spaced && c > ' ')
- clen = cbm->clen;
- else clen = cfn->space_len;
- if ((!cbm->len) && c != ' ' && c != '\b')
- return;
-
- bmx = (int)(BMX + .5);
- bmy = (int)(BMY + .5);
- if (bmx + clen + cbm->loffs >= max_col)
- return;
- cury = bmy - cbm->toffs;
- if (cury < 0)
- return;
-
- if ((cury+cbm->hite) > max_ln)
- return;
-
- before = curx = bmx + cbm->loffs;
- if (c != ' ' && c != '\b')
- for (i=0; i<cbm->hite; i++)
- {
- curx = before;
- localy = yscale[cury+i];
-
- for (j=0; j<cbm->len; j++)
- for (k=0; k<8; k++,curx++)
- if (cbm->CH[i][j] & bit[k])
- setpix(localy, xscale[curx]);
- }
-
- if (c > ' ')
- {
- BMX += (double)clen;
- ymax_used = max(ymax_used,yscale[cury + cbm->hite]);
- xmax_used = max(xmax_used,xscale[curx]);
- }
- else
- {
- if (c != '\b')
- BMX += (double)clen;
- else BMX -= (double)clen;
- xmax_used = max(xmax_used,xscale[bmx]);
- }
-
- if (curenv->underline)
- {
- int after = curx;
-
- ubm = &cfn->chars['_'];
- for (i=0; i<cbm->hite; i++)
- {
- curx = before;
- localy = yscale[cury+i];
-
- for (j=0; curx<after; )
- for (k=0; k<8 && curx<after; k++,curx++)
- if (ubm->CH[i][j] & bit[k])
- setpix(localy,xscale[curx]);
- }
- }
- dotted = TRUE;
- virgin = FALSE;
- }
-
- /* MACROS ****************************************************************** */
- struct MACRO *getcmc()
- {
- static struct MACRO *mac;
-
- if (curenv->cur_mac < 0 || curenv->cur_mac >= MAX_MACRO)
- die("don't know macro %d\n",curenv->cur_mac);
- mac = ¯os[curenv->cur_mac];
- if (!mac->active)
- die("macro %d not active\n",curenv->cur_mac);
- return(mac);
- }
- uchar *rs_get_macro(into)
- int *into;
- {
- cmc = getcmc();
- *into = cmc->len;
- return(cmc->macro);
- }
- macinit()
- {
- struct MACRO *mptr;
- int i;
-
- for (i=0; i<MAX_MACRO; i++)
- {
- mptr = ¯os[i];
- mptr->active = mptr->len = mptr->permtype = mptr->magic = 0;
- mptr->macro = (uchar*)NULL;
- }
- }
- mac_download(len,buf)
- int len;
- uchar *buf;
- {
- uchar *ptr;
-
- cmc = getcmc();
- if (!cmc->len)
- {
- if ((cmc->macro = (uchar*)malloc(len)) == NULL)
- die("not enough memory for macro %d\n",curenv->cur_mac);
- ptr = cmc->macro;
- cmc->len = len;
- }
- else
- {
- if ((cmc->macro = (uchar*)realloc(cmc->macro,
- cmc->len + len)) == NULL)
- die("not enough memory for macro %d\n",curenv->cur_mac);
- ptr = cmc->macro + cmc->len;
- cmc->len += len;
- }
- (void)memcpy((char*)ptr, (char*)buf, len);
- }
- rs_macro_id(n)
- double n;
- {
- curenv->cur_mac = (int)n;
- }
- rs_mac_startdef()
- {
- cmc = getcmc();
- cmc->active = TRUE;
- cmc->permtype = TEMPORARY;
- cmc->magic = FALSE;
- }
- rs_mac_enddef()
- {
- cmc = getcmc();
- cmc->active = TRUE;
- }
- rs_call_macro(type)
- int type;
- {
- cmc = getcmc();
- if (type == SAVE)
- {
- McEnv = orgenv;
- curenv = &McEnv;
- env_saved = TRUE;
- }
- else if (type == RESTORE && env_saved)
- {
- orgenv = McEnv;
- curenv = &orgenv;
- }
- }
- rs_auto_enable(on)
- int on;
- {
- int i;
-
- if (on)
- {
- cmc = getcmc();
- cmc->magic = TRUE;
- auto_macro = curenv->cur_mac;
- }
- else
- {
- for (i=0; i<MAX_MACRO; i++)
- macros[i].magic = 0;
- auto_macro = -1;
- }
- return(auto_macro);
- }
- rs_del_macros(t,p)
- int t,p;
- {
- if (t)
- del_macros(t);
- if (p)
- del_macros(p);
- }
- rs_del_macro()
- {
- cmc = getcmc();
- curenv->cur_mac = -1;
- del_macro(cmc);
- }
- rs_makemtype(what)
- int what;
- {
- cmc = getcmc();
- cmc->permtype = what;
- }
- del_macros(type)
- int type;
- {
- int i;
-
- for (i=0; i<MAX_MACRO; i++)
- if (macros[i].active && macros[i].permtype == type)
- {
- if (curenv->cur_mac == i)
- curenv->cur_mac = -1;
- del_macro(¯os[i]);
- }
- }
- del_macro(mptr)
- struct MACRO *mptr;
- {
- mptr->active = mptr->len = mptr->permtype = mptr->magic = 0;
- if (mptr->macro)
- {
- free((char*)mptr->macro);
- mptr->macro = (uchar*)NULL;
- }
- }
- rs_auto()
- {
- restore.ovly_env = orgenv; /* save current env && bits */
- restore.sfont = sfont;
- restore.BMX = BMX;
- restore.BMY = BMY;
- restore.GRAPHX = GRAPHX;
- restore.lpi = lpi;
-
- orgenv = ovly.ovly_env; /* install virgin defaults */
- sfont = ovly.sfont;
- BMX = ovly.BMX;
- BMY = ovly.BMY;
- GRAPHX = ovly.GRAPHX;
- lpi = ovly.lpi;
-
- curenv->cur_mac = auto_macro; /* fetch auto_macro */
- cmc = getcmc();
-
- hptoany(); /* action */
-
- orgenv = restore.ovly_env; /* restore real environment */
- sfont = restore.sfont;
- BMX = restore.BMX;
- BMY = restore.BMY;
- GRAPHX = restore.GRAPHX;
- lpi = restore.lpi;
- /* mark page unused, as we only want to */
- /* flush it if anything else goes onto it */
- dotted = 0;
- cmc = getcmc();
- }
- /******** loose ends */
- rs_lterm(){}
-
-