[mod.sources] Troff->HP Laserjet filter - newfonts.c

sources-request@panda.UUCP (02/01/86)

Mod.sources:  Volume 3, Issue 100
Submitted by: linus!mnetor!clewis (Chris Lewis)


OOPS!  I somehow forgot to ship one of the source files for my
Troff->HP Laserjet filter.  Here it is:
[sorry about that]

#!/bin/sh
echo 'Start of pack.out, part 01 of 01:'
echo 'x - newfonts.c'
sed 's/^X//' > newfonts.c << '/'
X/*****************************************************************
X
X    Copyright 1985. All Rights Reserved Chris Lewis
X
X    Module          : newfonts.c 1.3
X    Date submitted  : 86/01/30 09:19:57
X    Author          : Chris Lewis
X    Origin          : Permission to copy and further distribute is 
X		      freely given provided this copyright notice remains 
X		      intact and that this software is not sold for profit.
X    Description     : Description of the file
X
X******************************************************************/
X
X#ifndef lint
Xstatic char SrcId[] = "@(#) newfonts.c:1.3";
X#endif
X#include <stdio.h>
X#include "../fonts/mkfonts/vfont.h"
X
Xextern FILE	*diagFile;
X#define	DEBUGPRINTF	if (diagFile) debugprintf
Xextern	char	*fontLib;
X
Xstatic int	dpi = 75;
X
Xstatic struct header header;
Xstatic struct dispatch D[256];
Xstatic unsigned char imageTable[BUFSIZ*10];
X
X/*	"s" is font name, point is desired point size, if (flag), use
X	bigger fonts if possible	*/
Xloadfont(s, point, quality)
Xchar	*s;
Xint	point; 
Xint	quality; {
X	static char oldfont[BUFSIZ], buf[BUFSIZ], fontBuf[BUFSIZ];
X	FILE   *f;
X	register int i;
X	sprintf(buf, "%s.%d", s, point);
X	if (strcmp(oldfont, buf) == 0)
X		return(dpi);
X	strcpy(oldfont, buf);
X	if (s[0] != '/') {
X		strcpy(buf, fontLib);
X		strcat(buf, s);
X	}
X	if (quality > 1) {
X		i = point * 4;
X		dpi = 300;
X		do {
X			sprintf(fontBuf, "%s.%d", buf, i);
X			DEBUGPRINTF("Trying for font %s\n", fontBuf);
X			if (access(fontBuf, 04) == 0)
X				goto useit;
X			i >>= 1;
X			dpi /= 2;
X		} while (dpi >= 75);
X		dpi = 0;
X		return(0);
X	} else {
X		sprintf(fontBuf, "%s.%d", buf, point);
X		dpi = 75;
X	}
X
Xuseit:
X
X	if (!(f = fopen(fontBuf, "r"))) {
X		fprintf(stderr, "lcat: Could not load font %s, using native\n",
X			fontBuf);
X		dpi = 0;
X		return(0);
X	}
X	DEBUGPRINTF("Loaded font %s (dpi: %d)\n", fontBuf, dpi);
X	if (fread(&header, sizeof(header), 1, f) != 1) {
X		fprintf(stderr, "lcat: Bad font file header\n");
X		exit(1);
X	}
X	if (header.magic != 0436) {
X		fprintf(stderr, "lcat: Bad font magic number\n");
X		exit(1);
X	}
X	if (fread(D, sizeof(struct dispatch), 256, f) != 256) {
X		fprintf(stderr, "lcat: Could not load font dispatch table\n");
X		exit(1);
X	}
X	if (fread(imageTable, 1, header.size, f) != header.size) {
X		fprintf(stderr, "lcat: Error reading image table\n");
X		exit(1);
X	}
X	return(dpi);
X}
X
X#define	UNASS	0
X
Xstatic unsigned char flashtovfnt[108] = {
X	/*   1  */	'h',	/*h*/
X	/*   2  */	't',	/*t*/
X	/*   3  */	'n',	/*n*/
X	/*   4  */	'm',	/*m*/
X	/*   5  */	'l',	/*l*/
X	/*   6  */	'i',	/*i*/
X	/*   7  */	'z',	/*z*/
X	/*   8  */	's',	/*s*/
X	/*   9  */	'd',	/*d*/
X	/*  10  */	'b',	/*b*/
X	/*  11  */	'x',	/*x*/
X	/*  12  */	'f',	/*f*/
X	/*  13  */	'j',	/*j*/
X	/*  14  */	'u',	/*u*/
X	/*  15  */	'k',	/*k*/
X	/*  16  */	UNASS,	/*unassigned*/
X	/*  17  */	'p',	/*p*/
X	/*  18  */	UNASS,	/*3/4 em*/
X	/*  19  */	';',	/*;*/
X	/*  20  */	UNASS,	/*unassigned*/
X	/*  21  */	'a',	/*a*/
X	/*  22  */	'_',	/*horizontal rule*/
X	/*  23  */	'c',	/*c*/
X	/*  24  */	'`',	/*` open*/
X	/*  25  */	'e',	/*e*/
X	/*  26  */	'\'',	/*' close*/
X	/*  27  */	'o',	/*o*/
X	/*  28  */	UNASS,	/*1/4*/
X	/*  29  */	'r',	/*r*/
X	/*  30  */	UNASS,	/*1/2*/
X	/*  31  */	'v',	/*v*/
X	/*  32  */	'-',	/*- hyphen*/
X	/*  33  */	'w',	/*w*/
X	/*  34  */	'q',	/*q*/
X	/*  35  */	'/',	/*/*/
X	/*  36  */	'.',	/*.*/
X	/*  37  */	'g',	/*g*/
X	/*  38  */	UNASS,	/*3/4*/
X	/*  39  */	',',	/*,*/
X	/*  40  */	'&',	/*&*/
X	/*  41  */	'y',	/*y*/
X	/*  42  */	UNASS,	/*unassigned*/
X	/*  43  */	'%',	/*%*/
X	/*  44  */	UNASS,	/*unassigned*/
X	/*  45  */	'Q',	/*Q*/
X	/*  46  */	'T',	/*T*/
X	/*  47  */	'O',	/*O*/
X	/*  48  */	'H',	/*H*/
X	/*  49  */	'N',	/*N*/
X	/*  50  */	'M',	/*M*/
X	/*  51  */	'L',	/*L*/
X	/*  52  */	'R',	/*R*/
X	/*  53  */	'G',	/*G*/
X	/*  54  */	'I',	/*I*/
X	/*  55  */	'P',	/*P*/
X	/*  56  */	'C',	/*C*/
X	/*  57  */	'V',	/*V*/
X	/*  58  */	'E',	/*E*/
X	/*  59  */	'Z',	/*Z*/
X	/*  60  */	'D',	/*D*/
X	/*  61  */	'B',	/*B*/
X	/*  62  */	'S',	/*S*/
X	/*  63  */	'Y',	/*Y*/
X	/* from here on are actually code 1-45, upper half of font */
X	/*  64  */	'F',	/*F*/
X	/*  65  */	'X',	/*X*/
X	/*  66  */	'A',	/*A*/
X	/*  67  */	'W',	/*W*/
X	/*  68  */	'J',	/*J*/
X	/*  69  */	'U',	/*U*/
X	/*  70  */	'K',	/*K*/
X	/*  71  */	'0',	/*0*/
X	/*  72  */	'1',	/*1*/
X	/*  73  */	'2',	/*2*/
X	/*  74  */	'3',	/*3*/
X	/*  75  */	'4',	/*4*/
X	/*  76  */	'5',	/*5*/
X	/*  77  */	'6',	/*6*/
X	/*  78  */	'7',	/*7*/
X	/*  79  */	'8',	/*8*/
X	/*  80  */	'9',	/*9*/
X	/*  81  */	'*',	/***/
X	/*  82  */	'-',	/*minus*/
X	/*  83  */	UNASS,	/*fi*/
X	/*  84  */	UNASS,	/*fl*/
X	/*  85  */	UNASS,	/*ff*/
X	/*  86  */	0xa2,	/*cent sign*/
X	/*  87  */	UNASS,	/*ffl*/
X	/*  88  */	UNASS,	/*ffi*/
X	/*  89  */	'(',	/*(*/
X	/*  90  */	')',	/*)*/
X	/*  91  */	'[',	/*[*/
X	/*  92  */	']',	/*]*/
X	/*  93  */	UNASS,	/*degree*/
X	/*  94  */	UNASS,	/*dagger*/
X	/*  95  */	'=',	/*=*/
X	/*  96  */	0xa8,	/*registered*/
X	/*  97  */	':',	/*:*/
X	/*  98  */	'+',	/*+*/
X	/*  99  */	UNASS,	/*unassigned*/
X	/* 100  */	'!',	/*!*/
X	/* 101  */	0xd7,	/*bullet*/
X	/* 102  */	'?',	/*?*/
X	/* 103  */	UNASS,	/*foot mark*/
X	/* 104  */	'|',	/*|*/
X	/* 105  */	UNASS,	/*unassigned*/
X	/* 106  */	0xa9,	/*copyright*/
X	/* 107  */	UNASS,	/*square*/
X	/* 108  */	'$'	/*$*/
X};
X
Xflashrast(ch, points, ftype)
Xint	ch, points, ftype; {
X	register int idx = flashtovfnt[ch];
X	register int i,j,H,V;
X	register unsigned char *bp;
X	V = D[idx].up + D[idx].down;
X	H = (D[idx].left + D[idx].right + 7) / 8;
X	bp = &imageTable[D[idx].addr];
X	DEBUGPRINTF("ch=%d,idx=%d,V=%d,H=%d\n", ch, idx, V, H);
X	printf("\033&a-%dV", (D[idx].up * 720) / dpi);
X	printf("\033*t%dR", dpi);
X	for (i = 0; i < V; i++) {
X		printf("\033*r1A");
X		printf("\033*b%dW", H);
X		for (j = 0; j < H; j++)
X			putchar(*bp++);
X	}
X	printf("\033*rB");
X}
/
echo 'Part 01 of pack.out complete.'
exit