v03i036: tools for processing bdf files, Part01/01

Mike Wexler mikew at wyse.wyse.com
Wed Mar 8 04:20:41 AEST 1989


Submitted-by: ken at cs.rochester.edu (Ken Yap)
Posting-number: Volume 3, Issue 36
Archive-name: bdftools/part01

[These compile and run.  I haven't tested to see if the output is
reasonable. -mcw]
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 1)."
# Contents:  README AUTHOR Imakefile Makefile bdf.h bdf2gf.1 bdf2gf.c
#   bdf2vf.1 dumpgf.c dumpvfont.c gf.h patchlevel.h
# Wrapped by mikew at wyse on Tue Mar  7 10:18:44 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(122 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
XThese are updated version of the bdf to gf and bdf to vfont converters
Xin the R3 tape.
X
X	ken at cs.rochester.edu
X	march 1989
END_OF_FILE
if test 122 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'AUTHOR' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'AUTHOR'\"
else
echo shar: Extracting \"'AUTHOR'\" \(1464 characters\)
sed "s/^X//" >'AUTHOR' <<'END_OF_FILE'
X(Message inbox:1032)
XReturn-Path: ken at cs.rochester.edu
XReceived:  by wyse.wyse.com (5.58/Wyse master/5-13-88)
X	id AA18789; Thu, 2 Mar 89 03:52:03 PST
XReceived: from cayuga.cs.rochester.edu by uunet.UU.NET (5.61/1.14) with SMTP 
X	id AA16598; Thu, 2 Mar 89 00:45:10 -0500
XReceived: from cursa.cs.rochester.edu by cayuga.cs.rochester.edu (5.59/l) id AA10061; Thu, 2 Mar 89 00:43:27 EST
XReceived: from loopback by cursa.cs.rochester.edu (3.2/l) id AA04602; Thu, 2 Mar 89 00:43:07 EST
XMessage-Id: <8903020543.AA04602 at cursa.cs.rochester.edu>
XTo: mikew at wyse.com (Mike Wexler)
XSubject: Re: bdftools 
XIn-Reply-To: Your message of Wed, 01 Mar 89 12:25:25 -0800.
X             <8903012025.AA19680 at wyse.wyse.com> 
XX-Uucp: ..!rochester!ken Internet: ken at cs.rochester.edu
XX-Snail: CS Dept., U of Roch., NY 14627. Voice: Ken!
XX-Phone: (716) 275-1448 (office)
XDate: Thu, 02 Mar 89 00:43:05 -0500
XFrom: Ken Yap <ken at cs.rochester.edu>
X
XHi, I think this is a complete distribution.  I hope this is
Xsufficient.  Sorry I wasn't very helpful in providing a complete set
Xbefore. I was not the one who tossed the sources on the tape. Somebody
Xtook the sources from expo:/pub/contrib and added them to the tape.  I
Xthought I'd just send you an update of the only file affected and leave
Xit at that, but since you have taken the trouble to make an Imakefile,
XI've added a man page for bdf2vf, the only thing really missing. Casey
XLeedom posted one to the net but I forgot to save that one.
X
END_OF_FILE
if test 1464 -ne `wc -c <'AUTHOR'`; then
    echo shar: \"'AUTHOR'\" unpacked with wrong size!
fi
# end of 'AUTHOR'
fi
if test -f 'Imakefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Imakefile'\"
else
echo shar: Extracting \"'Imakefile'\" \(215 characters\)
sed "s/^X//" >'Imakefile' <<'END_OF_FILE'
X          SYS_LIBRARIES = -ll -lm $(XMULIB) $(XLIB)
X
XSRCS=	bdf2gf.c dumpgf.c
XOBJS=	bdf2gf.o dumpgf.o
XPROGRAMS= bdftogf bdftovf
X
XComplexProgramTarget(bdftogf)
XComplexProgramTarget(bdftovf)
XNormalLintTarget($(SRCS))
X
END_OF_FILE
if test 215 -ne `wc -c <'Imakefile'`; then
    echo shar: \"'Imakefile'\" unpacked with wrong size!
fi
# end of 'Imakefile'
fi
if test -f 'Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'Makefile'\"
else
echo shar: Extracting \"'Makefile'\" \(7124 characters\)
sed "s/^X//" >'Makefile' <<'END_OF_FILE'
X# Makefile generated by imake - do not edit!
X# $XConsortium: imake.c,v 1.37 88/10/08 20:08:30 jim Exp $
X#
X# The cpp used on this machine replaces all newlines and multiple tabs and
X# spaces in a macro expansion with a single space.  Imake tries to compensate
X# for this, but is not always successful.
X#
X
X###########################################################################
X# X Window System Makefile generated from template file Imake.tmpl
X# $XConsortium: Imake.tmpl,v 1.91 88/10/23 22:37:10 jim Exp $
X#
X# Do not change the body of the imake template file.  Server-specific
X# parameters may be set in the appropriate .macros file; site-specific
X# parameters (but shared by all servers) may be set in site.def.  If you
X# make any changes, you'll need to rebuild the makefiles using
X# "make World" (at best) or "make Makefile; make Makefiles" (at least) in
X# the top level directory.
X#
X# If your C preprocessor doesn't define any unique symbols, you'll need
X# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
X# "make Makefile", "make Makefiles", or "make World").
X#
X# If you absolutely can't get imake to work, you'll need to set the
X# variables at the top of each Makefile as well as the dependencies at the
X# bottom (makedepend will do this automatically).
X#
X
X###########################################################################
X# platform-specific configuration parameters - edit Sun.macros to change
X
X# platform:  $XConsortium: Sun.macros,v 1.52 88/10/23 11:00:55 jim Exp $
X# operating system:   SunOS 3.4
X
XBOOTSTRAPCFLAGS =
X             AS = as
X             CC = cc
X            CPP = /lib/cpp
X             LD = ld
X           LINT = lint
X        INSTALL = install
X           TAGS = ctags
X             RM = rm -f
X             MV = mv
X             LN = ln -s
X         RANLIB = ranlib
XRANLIBINSTFLAGS = -t
X             AR = ar clq
X             LS = ls
X       LINTOPTS = -xz
X    LINTLIBFLAG = -C
X           MAKE = make
XSTD_CPP_DEFINES =
X    STD_DEFINES =
X
X###########################################################################
X# site-specific configuration parameters - edit site.def to change
X
X# site:  $XConsortium: site.def,v 1.16 88/10/12 10:30:24 jim Exp $
X
X###########################################################################
X# definitions common to all Makefiles - do not edit
X
X          SHELL =  /bin/sh
X
X        DESTDIR = /global
X      USRLIBDIR = $(DESTDIR)/lib
X         BINDIR = $(DESTDIR)/bin/X11
X         INCDIR = $(DESTDIR)/include
X         ADMDIR = $(DESTDIR)/usr/adm
X         LIBDIR = $(USRLIBDIR)/X11
X     LINTLIBDIR = $(USRLIBDIR)/lint
X        FONTDIR = $(LIBDIR)/fonts
X       XINITDIR = $(LIBDIR)/xinit
X         XDMDIR = $(LIBDIR)/xdm
X         UWMDIR = $(LIBDIR)/uwm
X         AWMDIR = $(LIBDIR)/awm
X         TWMDIR = $(LIBDIR)/twm
X          DTDIR = $(LIBDIR)/dt
X        MANPATH = /usr/man
X  MANSOURCEPATH = $(MANPATH)/man
X         MANDIR = $(MANSOURCEPATH)n
X      LIBMANDIR = $(MANSOURCEPATH)n3
X    XAPPLOADDIR = $(LIBDIR)/app-defaults
X
X   INSTBINFLAGS = -m 0755
X   INSTUIDFLAGS = -m 4755
X   INSTLIBFLAGS = -m 0664
X   INSTINCFLAGS = -m 0444
X   INSTMANFLAGS = -m 0444
X   INSTAPPFLAGS = -m 0444
X  INSTKMEMFLAGS = -m 4755
X        FCFLAGS = -t
X    CDEBUGFLAGS = -O
X
X        PATHSEP = /
X         DEPEND = $(BINDIR)/makedepend
X          IMAKE = $(BINDIR)/imake
X            RGB = $(LIBDIR)/rgb
X             FC = $(BINDIR)/bdftosnf
X      MKFONTDIR = $(BINDIR)/mkfontdir
X      MKDIRHIER = $(BINDIR)/mkdirhier.sh
X
X         CFLAGS = $(CDEBUGFLAGS) $(INCLUDES) $(STD_DEFINES) $(DEFINES)
X      LINTFLAGS = $(LINTOPTS) $(INCLUDES) $(STD_DEFINES) $(DEFINES) -DLINT
X        LDFLAGS = $(CDEBUGFLAGS) -L$(USRLIBDIR) $(SYS_LIBRARIES) $(SYSAUX_LIBRARIES)
X
X       IRULESRC = $(LIBDIR)/imake.includes
X
X   EXTENSIONLIB = $(USRLIBDIR)/libext.a
X           XLIB = $(USRLIBDIR)/libX11.a
X         XMULIB = $(USRLIBDIR)/libXmu.a
X        OLDXLIB = $(USRLIBDIR)/liboldX.a
X       XTOOLLIB = $(USRLIBDIR)/libXt.a
X         XAWLIB = $(USRLIBDIR)/libXaw.a
X       LINTXLIB = $(USRLIBDIR)/lint/llib-lX11.ln
X        LINTXMU = $(USRLIBDIR)/lint/llib-lXmu.ln
X      LINTXTOOL = $(USRLIBDIR)/lint/llib-lXt.ln
X        LINTXAW = $(USRLIBDIR)/lint/llib-lXaw.ln
X       INCLUDES = -I$(INCDIR)
X      MACROFILE = Sun.macros
X   ICONFIGFILES = $(IRULESRC)/Imake.tmpl \
X			$(IRULESRC)/$(MACROFILE) $(IRULESRC)/site.def
X  IMAKE_DEFINES =
X      IMAKE_CMD = $(NEWTOP)$(IMAKE) -TImake.tmpl -I$(NEWTOP)$(IRULESRC) \
X			-s Makefile $(IMAKE_DEFINES)
X         RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a \
X			.emacs_* tags TAGS make.log MakeOut
X
X###########################################################################
X# rules:  $XConsortium: Imake.rules,v 1.71 88/10/23 22:46:34 jim Exp $
X
X###########################################################################
X# start of Imakefile
X
X          SYS_LIBRARIES = -ll -lm $(XMULIB) $(XLIB)
X
XSRCS=	bdf2gf.c dumpgf.c
XOBJS=	bdf2gf.o dumpgf.o
XPROGRAMS= bdftogf bdftovf
X
X PROGRAM = bdftogf
X
Xall:: bdftogf
X
Xbdftogf: $(OBJS) $(LOCAL_LIBRARIES)
X	$(RM) $@
X	$(CC) -o $@ $(OBJS) $(LOCAL_LIBRARIES) $(LDFLAGS) $(SYSLAST_LIBRARIES)
X
Xrelink::
X	$(RM) $(PROGRAM)
X	$(MAKE) $(MFLAGS) $(PROGRAM)
X
Xinstall:: bdftogf
X	$(INSTALL) -c $(INSTALLFLAGS) bdftogf $(BINDIR)
X
Xinstall.man:: bdftogf.man
X	$(INSTALL) -c $(INSTMANFLAGS) bdftogf.man $(MANDIR)/bdftogf.n
X
Xdepend:: $(DEPEND)
X
Xdepend::
X	$(DEPEND) -s "# DO NOT DELETE" -- $(CFLAGS) -- $(SRCS)
X
X$(DEPEND):
X	@echo "making $@"; \
X	cd $(DEPENDSRC); $(MAKE)
X
Xclean::
X	$(RM) $(PROGRAM)
X
X PROGRAM = bdftovf
X
Xall:: bdftovf
X
Xbdftovf: $(OBJS) $(LOCAL_LIBRARIES)
X	$(RM) $@
X	$(CC) -o $@ $(OBJS) $(LOCAL_LIBRARIES) $(LDFLAGS) $(SYSLAST_LIBRARIES)
X
Xrelink::
X	$(RM) $(PROGRAM)
X	$(MAKE) $(MFLAGS) $(PROGRAM)
X
Xinstall:: bdftovf
X	$(INSTALL) -c $(INSTALLFLAGS) bdftovf $(BINDIR)
X
Xinstall.man:: bdftovf.man
X	$(INSTALL) -c $(INSTMANFLAGS) bdftovf.man $(MANDIR)/bdftovf.n
X
Xdepend:: $(DEPEND)
X
Xdepend::
X	$(DEPEND) -s "# DO NOT DELETE" -- $(CFLAGS) -- $(SRCS)
X
X$(DEPEND):
X	@echo "making $@"; \
X	cd $(DEPENDSRC); $(MAKE)
X
Xclean::
X	$(RM) $(PROGRAM)
X
Xlint:
X	$(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS)
Xlint1:
X	$(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS)
X
X###########################################################################
X# Imake.tmpl common rules for all Makefiles - do not edit
X
Xemptyrule::
X
Xclean::
X	$(RM_CMD) \#*
X
XMakefile:: $(IMAKE)
X
XMakefile:: Imakefile \
X	$(IRULESRC)/Imake.tmpl \
X	$(IRULESRC)/Imake.rules \
X	$(IRULESRC)/site.def \
X	$(IRULESRC)/$(MACROFILE)
X	- at if [ -f Makefile ]; then \
X	echo "$(RM) Makefile.bak; $(MV) Makefile Makefile.bak"; \
X	$(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
X	else exit 0; fi
X	$(IMAKE_CMD) -DTOPDIR=$(TOP)
X
X$(IMAKE):
X	@echo "making $@"; \
X	cd $(IMAKESRC); $(MAKE) BOOTSTRAPCFLAGS=$(BOOTSTRAPCFLAGS)
X
Xtags::
X	$(TAGS) -w *.[ch]
X	$(TAGS) -xw *.[ch] > TAGS
X
X###########################################################################
X# empty rules for directories that do not have SUBDIRS - do not edit
X
Xinstall::
X	@echo "install done"
X
Xinstall.man::
X	@echo "install.man done"
X
XMakefiles::
X
X###########################################################################
X# dependencies generated by makedepend
X
END_OF_FILE
if test 7124 -ne `wc -c <'Makefile'`; then
    echo shar: \"'Makefile'\" unpacked with wrong size!
fi
# end of 'Makefile'
fi
if test -f 'bdf.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'bdf.h'\"
else
echo shar: Extracting \"'bdf.h'\" \(203 characters\)
sed "s/^X//" >'bdf.h' <<'END_OF_FILE'
X/*
X**	Everything that is saved up from the bdf file
X*/
X
Xextern char		fontname[100];
Xextern int		pointsize, xres, yres;
Xextern int		bbx, bby, offx, offy;
Xextern int		nchars;
Xextern u_char		*bitmaps[256];
END_OF_FILE
if test 203 -ne `wc -c <'bdf.h'`; then
    echo shar: \"'bdf.h'\" unpacked with wrong size!
fi
# end of 'bdf.h'
fi
if test -f 'bdf2gf.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'bdf2gf.1'\"
else
echo shar: Extracting \"'bdf2gf.1'\" \(362 characters\)
sed "s/^X//" >'bdf2gf.1' <<'END_OF_FILE'
X.TH BDF2GF 1 "1st March 1988"
X.AT 3
X.SH NAME
Xbdf2gf \- convert BDF format to GF (TeX generic font) format
X.SH SYNOPSIS
X.B bdf2gf
Xgffile [plfile] < bdffile
X.SH DESCRIPTION
X.I Bdf2gf
Xconverts the BDF file on stdin to a TeX GF (generic font)
Xfile and optionally a PL (property list) file.
X.SH DIAGNOSTICS
XNo error recovery in parser, just quits.
X.SH AUTHOR
XKen Yap
END_OF_FILE
if test 362 -ne `wc -c <'bdf2gf.1'`; then
    echo shar: \"'bdf2gf.1'\" unpacked with wrong size!
fi
# end of 'bdf2gf.1'
fi
if test -f 'bdf2gf.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'bdf2gf.c'\"
else
echo shar: Extracting \"'bdf2gf.c'\" \(3710 characters\)
sed "s/^X//" >'bdf2gf.c' <<'END_OF_FILE'
X#include	<stdio.h>
X#include	<sys/types.h>
X
Xchar		fontname[100];
Xint		pointsize, xres, yres;
Xint		bbx, bby, offx, offy;
Xint		nchars;
Xu_char		*bitmaps[256] = { 0 };
X
Xfatal(m)
X	char		*m;
X{
X	(void)fprintf(stderr, "%s\n", m);
X	exit(1);
X}
X
Xchar *xfgets(s, max, f)
X	char		*s;
X	int		max;
X	FILE		*f;
X{
X	register char	*r;
X
X	do
X	{
X		if ((r = fgets(s, max, f)) == NULL)
X			break;
X	} while (strncmp("COMMENT ", s, 8) == 0);
X	return (r);
X}
X
X/*
X**	Read line in and match against s.
X**	If mustmatch and none found, exit.
X**	If !mustmatch and none found, return 0.
X**	Else return 1.
X*/
Xint match(s, line, max, mustmatch)
X	char		*s, *line;
X	int		max, mustmatch;
X{
X	int		len = strlen(s);
X
X	if (xfgets(line, max, stdin) == NULL)
X		fatal("Unexpected EOF on input");
X	if (strncmp(line, s, len) != 0)
X	{
X		if (mustmatch)
X		{
X			(void)fprintf(stderr, "Expected %s, got %s", s, line);
X			exit(1);
X		}
X		else
X			return (0);
X	}
X	return (1);
X}
X
Xreadproperties(line, max)
X	char		*line;
X	int		max;
X{
X	int		nprops;
X
X	if (sscanf(line, "STARTPROPERTIES %d", &nprops) != 1)
X		fatal("No property count");
X	while (nprops-- > 0)
X		if (xfgets(line, max, stdin) == NULL)
X			fatal("Unexpected EOF on input reading properties");
X	(void)match("ENDPROPERTIES", line, max, 1);
X}
X
Xu_char *readbitmap(line, max, width, height)
X	char		*line;
X	int		max;
X	int		width, height;
X{
X	register int	i, j, bytewidth;
X	register u_char	*p, *q;
X	unsigned	byte;
X	char		*malloc();
X
X	(void)match("BITMAP", line, max, 1);
X	bytewidth = (width + 7) / 8;
X	if ((q = p = (u_char *)malloc(bytewidth * height)) == NULL)
X		fatal("Cannot allocate bitmap storage");
X	for (i = 0; i < height; ++i)
X	{
X		if (xfgets(line, max, stdin) == NULL)
X			fatal("Unexpected EOF on input reading bitmap");
X		for (j = 0; j < bytewidth; ++j)
X		{
X			if (sscanf(&line[j*2], "%02x", &byte) != 1)
X				fatal("Cannot read hex pair");
X			*q++ = byte & 0xff;
X		}
X	}
X	(void)match("ENDCHAR", line, max, 1);
X	return (p);
X}
X
Xread1char(line, max)
X	char		*line;
X	int		max;
X{
X	int		charnum;
X	int		width, bbx, bby, offx, offy;
X	float		dx, dy;
X
X	(void)match("STARTCHAR", line, max, 1);
X	(void)match("ENCODING", line, max, 1);
X	if (sscanf(line, "ENCODING %d", &charnum) != 1)
X		fatal("No position number for character");
X	(void)match("SWIDTH", line, max, 1);
X	if (sscanf(line, "SWIDTH %g %g", &dx, &dy) != 2)
X		fatal("No scalable width info for character");
X	(void)match("DWIDTH", line, max, 1);
X	if (sscanf(line, "DWIDTH %d", &width) != 1)
X		fatal("No width info for character");
X	(void)match("BBX", line, max, 1);
X	if (sscanf(line, "BBX %d %d %d %d", &bbx, &bby, &offx, &offy) != 4)
X		fatal("Insufficient bounding box info for character");
X	bitmaps[charnum % 0x100] = readbitmap(line, max, bbx, bby);
X	storeglyph(charnum, bbx, bby, offx, offy, dx, dy);
X}
X
Xreadchars(line, max)
X	char		*line;
X	int		max;
X{
X	(void)match("CHARS", line, max, 1);
X	if (sscanf(line, "CHARS %d", &nchars) != 1)
X		fatal("No count of chars");
X	while (nchars-- > 0)
X		read1char(line, max);
X}
X
Xmain(argc, argv)
X	int		argc;
X	char		*argv[];
X{
X	char		line[512];
X
X	initialize(argc, argv);
X
X	(void)match("STARTFONT 2.1", line, sizeof(line), 1);
X	while (!match("FONT", line, sizeof(line), 0))
X		;
X	if (sscanf(line, "FONT %s", fontname) != 1)
X		fatal("No font name");
X	(void)match("SIZE", line, sizeof(line), 1);
X	if (sscanf(line, "SIZE %d %d %d", &pointsize, &xres, &yres) != 3)
X		fatal("Insufficient size info");
X	(void)match("FONTBOUNDINGBOX", line, sizeof(line), 1);
X	if (sscanf(line, "FONTBOUNDINGBOX %d %d %d %d", &bbx, &bby,
X		&offx, &offy) != 4)
X		fatal("Insufficient bounding box info");
X	if (match("STARTPROPERTIES", line, sizeof(line), 0))
X		readproperties(line, sizeof(line));
X	readchars(line, sizeof(line));
X	dumpfont(bitmaps);
X	exit(0);
X}
END_OF_FILE
if test 3710 -ne `wc -c <'bdf2gf.c'`; then
    echo shar: \"'bdf2gf.c'\" unpacked with wrong size!
fi
# end of 'bdf2gf.c'
fi
if test -f 'bdf2vf.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'bdf2vf.1'\"
else
echo shar: Extracting \"'bdf2vf.1'\" \(440 characters\)
sed "s/^X//" >'bdf2vf.1' <<'END_OF_FILE'
X.TH BDF2VF 1 "1st March 1988"
X.AT 3
X.SH NAME
Xbdf2vf \- convert BDF format to vfont format
X.SH SYNOPSIS
X.B bdf2vf
Xvffile < bdffile
X.SH DESCRIPTION
X.I Bdf2vf
Xconverts the BDF file on stdin to vfont format.
X.SH DIAGNOSTICS
XNo error recovery in parser, just quits.
X.SH BUGS
XVfont format can only handle glyphs smaller than 127 per side.
XSun vfont glyphs is 16-bit word aligned. I haven't provided
Xfor this. Hack it yourself.
X.SH AUTHOR
XKen Yap
END_OF_FILE
if test 440 -ne `wc -c <'bdf2vf.1'`; then
    echo shar: \"'bdf2vf.1'\" unpacked with wrong size!
fi
# end of 'bdf2vf.1'
fi
if test -f 'dumpgf.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dumpgf.c'\"
else
echo shar: Extracting \"'dumpgf.c'\" \(8985 characters\)
sed "s/^X//" >'dumpgf.c' <<'END_OF_FILE'
X#include	<stdio.h>
X#include	<sys/types.h>
X#include	"bdf.h"
X#include	"gf.h"
X
X#define		NCHARS		256
X
Xstatic charinfo	ci[NCHARS];
X
Xstatic int	filepos = 0;		/* position in gf output */
X
Xstatic FILE	*plfile	= NULL;		/* property list output */
X
X/*
X**	The parameters to these routines follow the order
X**	they are described in gftopk.web.
X*/
X
Xstatic out(c)
X	int		c;
X{
X	putchar(c);
X	filepos++;
X}
X
Xstatic out2(c)
X	int		c;
X{
X	out((c >> 8) & 0xff);
X	out(c & 0xff);
X}
X
Xstatic out3(c)
X	int		c;
X{
X	out((c >> 16) & 0xff);
X	out((c >> 8) & 0xff);
X	out(c & 0xff);
X}
X
Xstatic out4(c)
X	int		c;
X{
X	out((c >> 24) & 0xff);
X	out((c >> 16) & 0xff);
X	out((c >> 8) & 0xff);
X	out(c & 0xff);
X}
X
Xstatic paint(n)
X	register int	n;
X{
X	if (0 <= n && n < 64)
X		out(PAINT0 + n);
X	else if (64 <= n && n < 256)
X	{
X		out(PAINT1);
X		out(n);
X	}
X	else if (256 <= n && n < 65536)
X	{
X		out(PAINT2);
X		out2(n);
X	}
X	else if (65536 <= n && n < (1 << 24))
X	{
X		out(PAINT3);
X		out3(n);
X	}
X	else
X		fatal("Impossibly large value for paint(n)");
X}
X
Xstatic boc(c, p, minm, maxm, minn, maxn)
X	int		c, p, minm, maxm, minn, maxn;
X{
X	if (p == -1 &&
X		0 <= maxm && maxm < 256 &&
X		(maxm - minm) < 256 &&
X		0 <= maxn && maxn < 256 &&
X		(maxn - minn) < 256)
X	{
X		out(BOC1);
X		out(c);
X		out(maxm-minm);
X		out(maxm);
X		out(maxn-minn);
X		out(maxn);
X	}
X	else
X	{
X		out(BOC);
X		out4(c);
X		out4(p);
X		out4(minm);
X		out4(maxm);
X		out4(minn);
X		out4(maxn);
X	}
X}
X
Xstatic eoc()
X{
X	out(EOC);
X}
X
Xstatic skip(n)
X	int		n;
X{
X	if (n <= 0)
X		out(SKIP0);
X	else if (1 <= n && n <= 256)
X	{
X		out(SKIP1);
X		out(n-1);
X	}
X	else if (256 < n && n < 65536)
X	{
X		out(SKIP2);
X		out2(n);
X	}
X	else if (65536 <= n && n < (1 << 24))
X	{
X		out(SKIP3);
X		out3(n);
X	}
X	else
X		fatal("Impossibly large value for skip(n)");
X}
X
Xstatic newrow(m)
X	int		m;
X{
X	if (m <= 0)
X		out(NEWROW0);
X	else if (1 <= m && m <= 164)
X		out(NEWROW1+m-1);
X	else
X		fatal("Too large a value for newrow(m)");
X}
X
Xstatic xxx(k, x)
X	int		k;
X	char		*x;
X{
X	if (0 <= k && k < 256)
X	{
X		out(XXX1);
X		out(k);
X	}
X	else if (256 <= k && k < 65536)
X	{
X		out(XXX2);
X		out2(k);
X	}
X	else if (65536 <= k && k < (1 << 24))
X	{
X		out(XXX3);
X		out3(k);
X	}
X	else
X	{
X		out(XXX4);
X		out4(k);
X	}
X	while (k-- > 0)
X		out(*x++);
X}
X
Xstatic yyy(n)
X	int		n;
X{
X	out(YYY);
X	out4(n);
X}
X
Xstatic noop()
X{
X	out(NOOP);
X}
X
Xstatic charloc(c, dx, dy, w, p)
X	int		c, dx, dy, w, p;
X{
X	if (dy == 0 && (dx & 0xffff) == 0 && (dx >> 16) < 256)
X	{
X		out(CHARLOC0);
X		out(c);
X		out(dx >> 16);
X		out4(w);
X		out4(p);
X	}
X	else
X	{
X		out(CHARLOC);
X		out(c);
X		out4(dx);
X		out4(dy);
X		out4(w);
X		out4(p);
X	}
X}
X
Xstatic pre(i, k, x)
X	int		i, k;
X	char		*x;
X{
X	out(PRE);
X	out(i);
X	out(k);
X	while (k-- > 0)
X		out(*x++);
X}
X
Xstatic post(p)
X	int		p;
X{
X	out(POST);
X	out4(p);
X	out4(pointsize * FIX);
X	out4(0);			/* checksum */
X	out4((xres * (1 << 16))/72);	/* hppp */
X	out4((yres * (1 << 16))/72);	/* vppp */
X	out4(offx);			/* global */
X	out4(bbx + offx);
X	out4(offy);
X	out4(bby + offy - 1);
X}
X
Xstatic postpost(q, i)
X	int		q, i;
X{
X	register int	n;
X
X	out(POSTPOST);
X	out4(q);
X	out(i);
X	for (n = 0; n < 4; ++n)
X		out(223);
X	while (filepos & 0x3)		/* round off to 4 bytes */
X		out(223);
X}
X
Xinitialize(argc, argv)
X	int		argc;
X	char		*argv[];
X{
X	register int	i;
X
X	if (argc < 2)
X		fatal("Usage: bdf2gf gf [pl]");
X
X	if (freopen(argv[1], "w", stdout) == NULL)
X		fatal("Cannot open gf file");
X
X	if (argc >= 3)
X	{
X		if ((plfile = fopen(argv[2], "w")) == NULL)
X			fatal("Cannot open pl file");
X	}
X
X	for (i = 0; i < NCHARS; ++i)
X		ci[i].p = -1;
X}
X
Xstoreglyph(n, bbx, bby, offx, offy, dx, dy)
X	int		n, bbx, bby, offx, offy;
X	float		dx, dy;
X{
X	register charinfo	*cp;
X
X	n %= NCHARS;
X	cp = &ci[n];
X	if (cp->p != -1)
X		(void)fprintf(stderr, "Warning, redefinition of char %d\n", n);
X	cp->bbx = bbx;
X	cp->bby = bby;
X	cp->offx = offx;
X	cp->offy = offy;
X	cp->w = dx * (float)FIX / 1000.0;
X/*
X**	Conversion from BDF swidths to pixels:
X**	pixels = swidth * (pointsize / 72) * resolution / 1000;
X**	i.e. swidths are dimensionless and 1000x the true width.
X**	Swidths normally range in the high hundreds, as you would expect.
X**
X**	To convert to GF escapements we round and multiply by 2^16.
X*/
X	dx *= (float)(pointsize * xres) / 72000.0;
X	cp->dx = (int)(dx + 0.5) * (1 << 16);
X	dy *= (float)(pointsize * yres) / 72000.0;
X	cp->dy = (int)(dy + 0.5) * (1 << 16);
X}
X
X/*
X**	We can save white_pixels until a black_pixel forces us
X**	to output them.
X**	If end_of_row == 0, then white_pixels are row trailing counts,
X**	otherwise they are row leading counts.
X*/
Xstatic int	white_pixels	= 0;
Xstatic int	end_of_row 	= 0;
X
Xstatic run(color, length)
X	int		color, length;
X{
X	register int	leading_white;
X
X	if (length <= 0)
X		return;
X	if (color == WHITE_PIXEL)
X		white_pixels += length;
X	else			/* BLACK_PIXEL */
X	{
X		if (end_of_row <= 0)
X			paint(white_pixels);
X		else
X		{
X/*
X**	This is how we dispose of most of the blank rows.
X*/
X			if (end_of_row > 1)
X				skip(end_of_row - 1);
X			if ((leading_white = white_pixels) > 164)
X				leading_white = 164;
X			newrow(leading_white);
X/*
X**	It is very unlikely that we will have more than 164
X**	leading columns of white but in case, we output a paint(0)
X**	followed by as many more white pixels as we need.
X*/
X			if ((white_pixels - leading_white) > 0)
X			{
X				paint(0);
X				paint(white_pixels);
X			}
X		}
X		white_pixels = end_of_row = 0;	/* reset counts */
X		paint(length);		/* and automatically reverse color */
X	}
X}
X
Xstatic endrow()
X{
X/*
X**	If we have white pixels here they are trailing pixels and
X**	we can just throw them away because we will output
X**	a newrow command next.
X*/
X	white_pixels = 0;
X	++end_of_row;
X}
X
Xstatic dump1map(n, bitmap)
X	int		n;
X	u_char		*bitmap;
X{
X	register int	i, j, save, paintswitch, bitpos;
X	register u_char	*p;
X	register int	bytewidth;
X	register charinfo	*cp;
X
X	if (bitmap == 0)	/* no bitmap? */
X		return;
X	cp = &ci[n];
X	i = filepos;		/* save position */
X	/* any xxx's come here */
X	boc(n, cp->p, cp->offx, cp->bbx + cp->offx,
X		cp->offy, cp->bby + cp->offy - 1);
X	cp->p = i;		/* set backpointer */
X	/* dump bitmap here */
X	bytewidth = (cp->bbx + 7) / 8;
X	white_pixels = end_of_row = 0;
X	for (i = 0; i < cp->bby; ++i)
X	{
X		p = &bitmap[i * bytewidth];
X		bitpos = 7;
X		paintswitch = WHITE_PIXEL;
X		for (save = j = 0; j < cp->bbx; ++j)
X		{
X			if (((*p >> bitpos) & 0x1) != paintswitch)
X			{
X				run(paintswitch, j - save);
X				save = j;
X				paintswitch ^= 0x1;
X			}
X			if (--bitpos < 0)
X			{
X				++p;
X				bitpos = 7;
X			}
X		}
X		run(paintswitch, j - save);
X		endrow();
X	}
X	eoc();
X}
X
Xstatic dump1loc(n, bitmap)
X	int		n;
X	u_char		*bitmap;
X{
X	register charinfo	*cp;
X
X	if (bitmap == 0)
X		return;
X	cp = &ci[n];
X	charloc(n, cp->dx, cp->dy, cp->w, cp->p);
X}
X
Xstatic fontdimens(scale, bitmaps)
X	float		scale;
X	u_char		*bitmaps[NCHARS];
X{
X	register int	ch;
X	register charinfo	*cp;
X
X	(void)fprintf(plfile, "(FONTDIMEN\n");
X	ch = bitmaps[' '] != 0 ? ' ' : 'x';
X	if (bitmaps[ch] != 0)
X	{
X		cp = &ci[ch];
X		(void)fprintf(plfile, " (SPACE D %d)\n", cp->bbx);
X		(void)fprintf(plfile, " (STRETCH R %.9f)\n", (float)cp->bbx * 0.5);
X		(void)fprintf(plfile, " (SHRINK R %.9f)\n", (float)cp->bbx * 0.3);
X		(void)fprintf(plfile, " (EXTRASPACE R %.9f)\n", (float)cp->bbx * 0.3);
X		(void)fprintf(plfile, " (QUAD D %d)\n", cp->bbx * 2);
X		(void)fprintf(plfile, " (XHEIGHT D %d)\n", cp->bby);
X	}
X	else
X	{
X		(void)fprintf(plfile, " (SPACE R %.9f)\n", scale * 0.75);
X		(void)fprintf(plfile, " (STRETCH R %.9f)\n", scale * 0.375);
X		(void)fprintf(plfile, " (SHRINK R %.9f)\n", scale * 0.225);
X		(void)fprintf(plfile, " (EXTRASPACE R %.9f)\n", scale * 0.225);
X		(void)fprintf(plfile, " (QUAD R %.9f)\n", scale * 1.5);
X		(void)fprintf(plfile, " (XHEIGHT R %.9f)\n", scale * 0.75);
X	}
X	(void)fprintf(plfile, " )\n");
X}
X
Xstatic dump1pl(n, bitmap)
X	int		n;
X	u_char		*bitmap;
X{
X	register charinfo	*cp;
X
X	if (bitmap == 0)
X		return;
X	cp = &ci[n];
X	if (' ' < n && n <= '~' && n != '(' && n != ')')
X		(void)fprintf(plfile, "(CHARACTER C %c\n", n);
X	else
X		(void)fprintf(plfile, "(CHARACTER D %d\n", n);
X	(void)fprintf(plfile, " (CHARWD D %d)\n", cp->bbx);
X	(void)fprintf(plfile, " (CHARHT D %d)\n", cp->bby + cp->offy);
X	(void)fprintf(plfile, " (CHARDP D %d)\n", -cp->offy);
X	(void)fprintf(plfile, " )\n");
X}
X
Xstatic dumppl(bitmaps)
X	u_char	*bitmaps[NCHARS];
X{
X	register int	i;
X	register float	du;
X
X	(void)fprintf(plfile, "(DESIGNSIZE D %d)\n", pointsize);
X	du = (float)xres * (float)pointsize / 72.0;
X	(void)fprintf(plfile, "(DESIGNUNITS R %.9f)\n", du);
X	(void)fprintf(plfile, "(COMMENT Units are in pixels)\n");
X	fontdimens(du, bitmaps);
X	for (i = 0; i < NCHARS; ++i)
X		dump1pl(i, bitmaps[i]);
X	(void)fclose(plfile);
X}
X
Xdumpfont(bitmaps)
X	u_char	*bitmaps[NCHARS];
X{
X	register int	i, lastboc, pos;
X
X	pre(131, 0, "");
X	for (i = 0; i < NCHARS; ++i)
X		dump1map(i, bitmaps[i]);
X	lastboc = filepos;	/* save position of lastboc */
X	/* xxx's for the postamble go here */
X	pos = filepos;		/* save position of post */
X	/* beginning of postamble */
X	post(lastboc);
X	for (i = 0; i < NCHARS; ++i)
X		dump1loc(i, bitmaps[i]);
X	postpost(pos, 131);
X	if (plfile != NULL)
X		dumppl(bitmaps);
X}
END_OF_FILE
if test 8985 -ne `wc -c <'dumpgf.c'`; then
    echo shar: \"'dumpgf.c'\" unpacked with wrong size!
fi
# end of 'dumpgf.c'
fi
if test -f 'dumpvfont.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'dumpvfont.c'\"
else
echo shar: Extracting \"'dumpvfont.c'\" \(1402 characters\)
sed "s/^X//" >'dumpvfont.c' <<'END_OF_FILE'
X#include	<stdio.h>
X#include	<vfont.h>
X#include	<sys/types.h>
X
X#define		NCHARS	256
X
Xstruct header	vhdr;
Xstruct dispatch	vd[NCHARS];
X
Xinitialize(argc, argv)
X	int		argc;
X	char		*argv[];
X{
X	if (argc < 2)
X		fatal("Usage: bdf2vf vf");
X
X	if (freopen(argv[1], "w", stdout) == NULL)
X		fatal("Cannot open output file");
X}
X
Xstoreglyph(n, bbx, bby, offx, offy)
X	int		n, bbx, bby, offx, offy;
X{
X	register struct dispatch	*d;
X
X	d = &vd[n];
X	d->nbytes = (bbx + 7) / 8 * bby;
X	d->right = bbx + offx;
X	d->left = -offx;
X	d->up = bby + offy;
X	d->down = -offy;
X	d->width = bbx;
X	if (bbx > vhdr.maxx)
X		vhdr.maxx = bbx;
X	if (bby > vhdr.maxy)
X		vhdr.maxy = bby;
X}
X
Xdumpfont(bitmaps)
X	u_char	*bitmaps[NCHARS];
X{
X	register int	c, bitbytes = 0;
X	register struct dispatch	*d;
X
X	if (fseek(stdout, (long)(sizeof(vhdr) + sizeof(vd)), 0) < 0)
X		fatal("Cannot seek on output");
X	for (c = 0; c < NCHARS; ++c)
X	{
X		if (bitmaps[c] != NULL && (d = &vd[c])->nbytes > 0)
X		{
X			d->addr = bitbytes;
X			if (fwrite((char *)bitmaps[c], d->nbytes, 1, stdout) != 1)
X				fatal("Cannot write glyph");
X			bitbytes += d->nbytes;
X		}
X	}
X	vhdr.magic = VFONT_MAGIC;
X	vhdr.size = bitbytes;
X	if (fseek(stdout, 0L, 0) < 0)
X		fatal("Cannot seek to beginning on output");
X	if (fwrite((char *)&vhdr, sizeof(vhdr), 1, stdout) != 1)
X		fatal("Cannot write header");
X	if (fwrite((char *)vd, sizeof(vd), 1, stdout) != 1)
X		fatal("Cannot write dispatch table");
X}
END_OF_FILE
if test 1402 -ne `wc -c <'dumpvfont.c'`; then
    echo shar: \"'dumpvfont.c'\" unpacked with wrong size!
fi
# end of 'dumpvfont.c'
fi
if test -f 'gf.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'gf.h'\"
else
echo shar: Extracting \"'gf.h'\" \(769 characters\)
sed "s/^X//" >'gf.h' <<'END_OF_FILE'
X#define	WHITE_PIXEL	0
X#define	BLACK_PIXEL	1
X
X#define	PAINT0		0
X#define	PAINT1		64
X#define	PAINT2		65
X#define	PAINT3		66
X#define	BOC		67
X#define	BOC1		68
X#define	EOC		69
X#define	SKIP0		70
X#define	SKIP1		71
X#define	SKIP2		72
X#define	SKIP3		73
X#define	NEWROW0		74
X#define	NEWROW1		75
X#define	XXX1		239
X#define	XXX2		240
X#define	XXX3		241
X#define	XXX4		242
X#define	YYY		243
X#define	NOOP		244
X#define	CHARLOC		245
X#define	CHARLOC0	246
X#define	PRE		247
X#define	POST		248
X#define	POSTPOST	249
X
X#define		FIX		(1 << 20)
X
X/*
X**	Information about a character
X*/
X
Xtypedef struct {
X	int	bbx, bby;	/* bounding box */	
X	int	offx, offy;	/* coords of left bottom corner from origin */
X	int	dx, dy;		/* escapements */
X	int	w;		/* width in FIXes */
X	int	p;		/* backpointer */
X} charinfo;
END_OF_FILE
if test 769 -ne `wc -c <'gf.h'`; then
    echo shar: \"'gf.h'\" unpacked with wrong size!
fi
# end of 'gf.h'
fi
if test -f 'patchlevel.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'patchlevel.h'\"
else
echo shar: Extracting \"'patchlevel.h'\" \(21 characters\)
sed "s/^X//" >'patchlevel.h' <<'END_OF_FILE'
X#define PATCHLEVEL 0
END_OF_FILE
if test 21 -ne `wc -c <'patchlevel.h'`; then
    echo shar: \"'patchlevel.h'\" unpacked with wrong size!
fi
# end of 'patchlevel.h'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have the archive.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mike Wexler(wyse!mikew)    Phone: (408)433-1000 x1330
Moderator of comp.sources.x



More information about the Comp.sources.x mailing list