[net.sources] Super Plot

majka@ubc-vision.UUCP (Marc Majka) (04/28/86)

Here is a set of plot routines and associated stuff for a sort-of-extension
to the plot(5) format.  In this and the following postings, you will find a
shell archive containing:

* a library of C subroutines for writing plot files
* plot-file to text and text to plot-file filters
* a simple frame-buffer rendering program
* a plot-file to PostScript filter
* hooks into the recently distributed Hershey fonts for label drawing

You know the litany: cut on the dotted line and feed to "sh" not "csh".
Happy plotting!

---
Marc Majka  -  UBC Laboratory for computational Vision

- - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - -
#!/bin/sh
#
# shell archive - extract with /bin/sh
#
echo Plot archive part 1 of 8
echo  
echo extracting file README
sed 's/^X//' > README <<'!FUNKY!STUFF!'
XHere is a package of plot routines which are based on a plot format similar
Xto the UNIX plot(5) format, but with many extensions.   
X
XAbsolutely none of the code in here is based on or copied from any code in
Xany version of UNIX in the entire world.  There is a program (pl5pl) which
Xconverts files from UNIX plot(5) format to my format.  I have used some of
Xthe same plot primitives, for example "c" for circle.  The vector generator
Xand the bspline generator are both based on algorithms published in Newman,
XW.M. and Sproull, R.F., "Principles of Interactive Computer Graphics",
XMcGraw-Hill, 1979.  They are credited here and in the code.
X
XIncluded in this package are:
X
Xfplot      Subroutine library for writing plot files from C
Xpl5pl      Convert UNIX Plot(5) to my plot format
Xrplot      Render a plot file in a raster
Xpltx       Print a readable (text) version of a plot file
Xtxpl       Inverse of pltx: Convert text form to plot file
Xplps       Convert plot files to PostScript
Xechofont   Convert a font file to text form
Xmkfont     Inverse of echofont: Convert text to font file
Xhform      Utility for Hershey fonts
Xhcat       Plot a Hershey font cataplogue
Xhfont      Create a plot-file compatible font from the Hershey fonts
X
XThe subdirectory vfont contains the file sr.e, which must be filtered
Xthrough mkfont to create the file vfont/sr.  This is a basic roman font for
Xplotting labels.  If you have the public domain Hershey fonts, you can use
Xhfont to create other label fonts.  The files mk.* in vfont are inputs to
Xhfont to create a number of useful fonts.
X
XFinally, there is a subdirectory containing some test data.  These files are
Xall stored in text format, and must be converted to plot format with txpl
Xto be useful to the plot filters.
X
XHave fun, and let me know it you have any problems.  I claim nothing for
Xthis package except that is works and is widely used here at UBC.  There are
Xprobably lots of bugs and misfeatures in some places.  I will try to answer
Xany questions e-mailed  to me (majka@ubc-vision.UUCP), and will endevour to
Xprovide bug fixes for serious flaws.  If you come up with any great ideas or
Xclever hacks, I would enjoy hearing about them.
X
XIt should be easy to write or convert existing plot filters to this format.
XLook at the code in rplfns.c and plpsfns.c for examples, inspiration and
Xcode to copy.  You will find that it is impossible to support every plot
Xprimitive on every device, but most things will go through.  I have my own
Xsource for filters for ImPress, an out-of-date NAPLPS, and a Raster
XTechnologies 1/25.  If you want any of them, let me know.
!FUNKY!STUFF!
echo extracting file Makefile
sed 's/^X//' > Makefile <<'!FUNKY!STUFF!'
X# makefile for plot routines
X
XOBJ = fplot.o driver.o labels.o rplfns.o txfns.o plpsfns.o
X
Xall: ${OBJ} pl5pl pltx rplot txpl plps echofont mkfont hform hfont hcat
X
Xpl5pl: pl5pl.c
X	cc -o pl5pl pl5pl.c
X
Xpltx: pltx.c txfns.o driver.o
X	cc -o pltx pltx.c txfns.o driver.o
X
Xtxpl: txpl.c
X	cc -o txpl txpl.c
X
Xrplot: rplot.c rplfns.o driver.o labels.o
X	cc -o rplot rplot.c rplfns.o driver.o labels.o -lm
X
Xplps: plps.c plpsfns.o driver.o labels.o
X	cc -o plps plps.c plpsfns.o driver.o labels.o -lm
X
Xechofont: echofont.c
X	cc -o echofont echofont.c
X
Xmkfont: mkfont.c
X	cc -o mkfont mkfont.c
X
Xhform: hform.c
X	cc -o hform hform.c
X
Xhfont: hfont.c
X	cc -o hfont hfont.c
X
Xhcat: hcat.c
X	cc -o hcat hcat.c fplot.o
X
Xclean:
X	rm *.o
!FUNKY!STUFF!
echo extracting file cribsheet
sed 's/^X//' > cribsheet <<'!FUNKY!STUFF!'
XPLOT FILE FORMAT 
X----------------
X
Xa arc     xc yc x1 y1 x2 y2
Xb bppout  b
Xc circle  x y r
Xd pensize p
Xe erase
Xf linemod str
Xg gray    g
X
Xh-i-j unused
X
Xk spline  k n x1 y1 x2 y2 ... xn yn
Xl line    x1 y1 x2 y2
Xm move    x y
Xn cont    x y
Xo polygon n x1 y1 x2 y2 ... xn yn
Xp point   x y
X
Xq-r unused
X
Xs space   x1 y1 x2 y2 hv
Xt label   str
X
Xu-v-w-x-y-z unused
X
XA area    x y
XB bppin   b
XC colour  r g b
X
XD-E unused
X
XF frame   r1 c1 r2 c2 hv
X
XG-H-I-J-K unused
X
XL chain   n x1 y1 x2 y2 ... xn yn
XM moverel x y
XN contrel x y
XO unused
XP fillpat pn nrows ncols str      
X
XQ-R unused
X
XS fspec   ws hs theta
XT setpat  pn
XU blabel  w h str
XV llabel  w h str
XW unused
XX font    str
X
XY-Z unused
X
X[ startp
X] endp
X; comment str
X% clabel  str
X
X
XPLOT PROGRAMS
X-------------
X
Xpl5pl      UNIX Plot(5) -> Plot
Xplps       Plot -> PostScript
Xpltx       Plot -> Text
Xrplot      Plot -> Raster
Xtxpl       Text -> Plot
X
X
XRELATED SOFTWARE
X------------- --
X
Xdriver     Plot file interpreter
Xechofont   Convert a font file to text form
Xfplot      Subroutine Library for writing plot files
Xhfont      Create a new label font from the Hershey fonts
Xhcat       Make a plotfile Hershey font catalogue
Xhform      Reformat Hershey fonts
Xlabels     Common subroutines for drawing labels
Xmkfont     Inverse of echofont: convert text file to font file format
Xplpsfns    Subroutine Library for PostScript conversion
Xrplfns     Subroutine Library for raster graphics
Xtxfns      Subroutines for pltx
!FUNKY!STUFF!
echo extracting file driver.c
sed 's/^X//' > driver.c <<'!FUNKY!STUFF!'
X/*************************************************************/
X/*                                                           */
X/*  Copyright (c) 1986                                       */
X/*  Marc S. Majka - UBC Laboratory for Computational Vision  */
X/*                                                           */
X/*  Permission is hereby granted to copy all or any part of  */
X/*  this program for free distribution.   The author's name  */
X/*  and this copyright notice must be included in any copy.  */
X/*                                                           */
X/*************************************************************/
X
X#include <stdio.h>
X
X/* read a plot-format file and call the appropriate plotting routines */
Xplotdriver(plt)
XFILE *plt;
X{
X    char str[1024], comm, c;
X    int i;
X    short ltop, lstack[1024][2];
X    double ws, hs, theta;
X    short x1, y1, x2, y2, x3, y3, r, gr, red, green, blue, hv, pn, b, n, k;
X
X    while (fscanf(plt, "%c", &comm) != EOF) {
X        switch (comm) {
X            case 'a': /* ARC */
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                fread(&x2,2,1,plt);
X                fread(&y2,2,1,plt);
X                fread(&x3,2,1,plt);
X                fread(&y3,2,1,plt);
X                arc(x1,y1,x2,y2,x3,y3);
X                break;
X            case 'b': /* BPPOUT */
X                fread(&b,2,1,plt);
X                bppout(b);
X                break;
X            case 'c': /* CIRCLE */
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                fread(&r,2,1,plt);
X                circle(x1,y1,r);
X                break;
X            case 'd': /* PENSIZE */
X                fread(&pn,2,1,plt);
X                pensize(pn);
X                break;
X            case 'e': /* ERASE */
X                erase();
X                break;
X            case 'f': /* LINEMOD */
X                fscanf(plt,"%s",str);
X                fscanf(plt,"%c",&c);
X                linemod(str);
X                break;
X            case 'g': /* GRAY */
X                fread(&gr,2,1,plt);
X                gray(gr);
X                break;
X            case 'l': /* LINE */
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                fread(&x2,2,1,plt);
X                fread(&y2,2,1,plt);
X                line(x1,y1,x2,y2);
X                break;
X            case 'm': /* MOVE */
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                move(x1,y1);
X                break;
X            case 'n': /* CONT */
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                cont(x1,y1);
X                break;
X            case 'k': /* BSPLINE */
X                fread(&k,2,1,plt);
X                fread(&n,2,1,plt);
X                for (i = 0; i < n; i++) {
X                    fread(&x1,2,1,plt);
X                    fread(&y1,2,1,plt);
X                    lstack[i][0] = x1; 
X                    lstack[i][1] = y1;
X                }
X                bspline(k,n,lstack);
X                break;
X            case 'o': /* POLYGON */
X                fread(&n,2,1,plt);
X                for (i = 0; i < n; i++) {
X                    fread(&x1,2,1,plt);
X                    fread(&y1,2,1,plt);
X                    lstack[i][0] = x1; 
X                    lstack[i][1] = y1;
X                }
X                polygon(n,lstack);
X                break;
X            case 'L': /* CHAIN */
X                fread(&n,2,1,plt);
X                for (i = 0; i < n; i++) {
X                    fread(&x1,2,1,plt);
X                    fread(&y1,2,1,plt);
X                    lstack[i][0] = x1; 
X                    lstack[i][1] = y1;
X                }
X                chain(n,lstack);
X                break;
X            case 'p': /* POINT */
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                point(x1,y1);
X                break;
X            case 's': /* SPACE */
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                fread(&x2,2,1,plt);
X                fread(&y2,2,1,plt);
X                fread(&hv,2,1,plt);
X                space(x1,y1,x2,y2,hv);
X                break;
X            case 't': /* LABEL */
X                fscanf(plt,"%1s",&c);
X                i = 0;
X                while (c != '\n') {
X                    str[i++] = c;
X                    fscanf(plt,"%c",&c);
X                }
X                str[i] = '\0';
X                label(str);
X                break;
X            case '%': /* CLABEL */
X                fscanf(plt,"%1s",&c);
X                i = 0;
X                while (c != '\n') {
X                    str[i++] = c;
X                    fscanf(plt,"%c",&c);
X                }
X                str[i] = '\0';
X                clabel(str);
X                break;
X            case 'U': /* BLABEL */
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                fscanf(plt,"%1s",&c);
X                i = 0;
X                while (c != '\n') {
X                    str[i++] = c;
X                    fscanf(plt,"%c",&c);
X                }
X                str[i] = '\0';
X                blabel(x1,y1,str);
X                break;
X            case 'V': /* LLABEL */
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                fscanf(plt,"%1s",&c);
X                i = 0;
X                while (c != '\n') {
X                    str[i++] = c;
X                    fscanf(plt,"%c",&c);
X                }
X                str[i] = '\0';
X                llabel(x1,y1,str);
X                break;
X            case 'A': /* AREA */
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                area(x1,y1);
X                break;
X            case 'B': /* BPPIN */
X                fread(&b,2,1,plt);
X                bppin(b);
X                break;
X            case 'C': /* COLOUR */
X                fread(&red,2,1,plt);
X                fread(&green,2,1,plt);
X                fread(&blue,2,1,plt);
X                colour(red,green,blue);
X                break;
X            case 'F': /* FRAME */
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                fread(&x2,2,1,plt);
X                fread(&y2,2,1,plt);
X                fread(&hv,2,1,plt);
X                frame(x1,y1,x2,y2,hv);
X                break;
X            case 'M': /* MOVEREL */
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                moverel(x1,y1);
X                break;
X            case 'N': /* CONTREL */
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                contrel(x1,y1);
X                break;
X            case 'P': /* FILLPAT */
X                fread(&pn,2,1,plt);
X                fread(&x1,2,1,plt);
X                fread(&y1,2,1,plt);
X                fscanf(plt,"%1s",&c);
X                i = 0;
X                while (c != '\n') {
X                    str[i++] = c;
X                    fscanf(plt,"%c",&c);
X                }
X                str[i] = '\0';
X                fillpat(pn,x1,y1,str);
X                break;
X            case 'S': /* FSPEC */
X                fread(&ws,4,1,plt);
X                fread(&hs,4,1,plt);
X                fread(&theta,4,1,plt);
X                fspec(ws,hs,theta);
X                break;
X            case 'T': /* SETPAT */
X                fread(&pn,2,1,plt);
X                setpat(pn);
X                break;
X            case 'X': /* FONT */
X                fscanf(plt,"%1s",&c);
X                i = 0;
X                while (c != '\n') {
X                    str[i++] = c;
X                    fscanf(plt,"%c",&c);
X                }
X                str[i] = '\0';
X                font(str);
X                break;
X            case '[': /* STARTP */
X                startp();
X                break;
X            case ']': /* ENDP */
X                endp();
X                break;
X            case ';': /* COMMENT */
X                fscanf(plt,"%1s",&c);
X                i = 0;
X                while (c != '\n') {
X                    str[i++] = c;
X                    fscanf(plt,"%c",&c);
X                }
X                str[i] = '\0';
X                comment(str);
X                break;
X            default:
X                fprintf (stderr, "plot: unknown command %c\n", comm);
X                break;
X        }
X    }
X}
!FUNKY!STUFF!
echo extracting file echofont.c
sed 's/^X//' > echofont.c <<'!FUNKY!STUFF!'
X/*************************************************************/
X/*                                                           */
X/*  Copyright (c) 1986                                       */
X/*  Marc S. Majka - UBC Laboratory for Computational Vision  */
X/*                                                           */
X/*  Permission is hereby granted to copy all or any part of  */
X/*  this program for free distribution.   The author's name  */
X/*  and this copyright notice must be included in any copy.  */
X/*                                                           */
X/*************************************************************/
X
X#include <stdio.h>
X#define MAXF 32768
X
X/* read a font and print it out in plain text */
X/* the format for fonts is described in /usr/public/lib/vfont/FORMAT */
X/* fonts may be converted from text to their normal format by mkfont */
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X    FILE *fin, *fopen();
X    short x, y;
X    int cstart[256], cpt, spt, i;
X    char c, fstr[MAXF], clist[256];
X    
X    cpt = 0; spt = 0;
X    
X    if (argc < 2) fin = stdin;
X    else fin = fopen(argv[1],"r");
X    if (fin == NULL) {
X        fprintf(stderr,"echofont: can't open input font file!\n");
X        exit(1);
X    }
X
X    fread(&c,1,1,fin);
X    
X    while (c != '\0') {
X        fread(&spt,4,1,fin);
X        clist[cpt] = c;
X        cstart[cpt++] = spt;
X        fread(&c,1,1,fin);
X    }
X
X    i = 0;
X    while (fread(&fstr[i++],1,1,fin));
X    
X    for (i = 0; i < cpt; i++) {
X        printf("%c:\n",clist[i]);
X        spt = cstart[i];
X        while (fstr[spt] != '\0')
X            if (fstr[spt] == 'N') {
X                spt++;
X                x = fstr[spt++];
X                y = fstr[spt++];
X                printf("N %hd %hd\n",x,y);
X            }
X            else if (fstr[spt] == 'M') {
X                spt++;
X                x = fstr[spt++];
X                y = fstr[spt++];
X                printf("M %hd %hd\n",x,y);
X            }
X        printf("E\n");
X        }
X}
!FUNKY!STUFF!
echo extracting file fplot.c
sed 's/^X//' > fplot.c <<'!FUNKY!STUFF!'
X/*************************************************************/
X/*                                                           */
X/*  Copyright (c) 1986                                       */
X/*  Marc S. Majka - UBC Laboratory for Computational Vision  */
X/*                                                           */
X/*  Permission is hereby granted to copy all or any part of  */
X/*  this program for free distribution.   The author's name  */
X/*  and this copyright notice must be included in any copy.  */
X/*                                                           */
X/*************************************************************/
X
X#include <stdio.h>
Xstatic FILE *plotfd;
X
Xplotopen(fname)
Xchar *fname;
X{
X    if (fname[0] == '\0') plotfd = stdout;
X    else plotfd = fopen(fname,"w");
X    if (plotfd == NULL) {
X        fprintf(stderr,"plotopen: can't open %s for output\n",fname);
X        return(0);
X    }
X}
X
Xplotappend(fname)
Xchar *fname;
X{
X    if (fname[0] == '\0') plotfd = stdout;
X    else plotfd = fopen(fname,"a");
X    if (plotfd == NULL) {
X        fprintf(stderr,"plotappend: can't open %s for output\n",fname);
X        return(0);
X    }
X}
X
Xarc(xc,yc,x1,y1,x2,y2)
Xshort xc,yc,x1,y1,x2,y2;
X{
X    fwrite("a",1,1,plotfd);
X    fwrite(&xc,2,1,plotfd);
X    fwrite(&yc,2,1,plotfd);
X    fwrite(&x1,2,1,plotfd);
X    fwrite(&y1,2,1,plotfd);
X    fwrite(&x2,2,1,plotfd);
X    fwrite(&y2,2,1,plotfd);
X}
X
Xcircle(x,y,r)
Xshort x,y,r;
X{
X    fwrite("c",1,1,plotfd);
X    fwrite(&x,2,1,plotfd);
X    fwrite(&y,2,1,plotfd);
X    fwrite(&r,2,1,plotfd);
X}
X
Xgray(g)
Xshort g;
X{
X    fwrite("g",1,1,plotfd);
X    fwrite(&g,2,1,plotfd);
X}
X
Xcolour(r,g,b)
Xshort r,g,b;
X{
X    fwrite("C",1,1,plotfd);
X    fwrite(&r,2,1,plotfd);
X    fwrite(&g,2,1,plotfd);
X    fwrite(&b,2,1,plotfd);
X}
X
Xerase()
X{
X    fwrite("e",1,1,plotfd);
X}
X
Xlinemod(mod)
Xchar *mod;
X{
X    fprintf(plotfd,"f%s\n",mod);
X}
X
Xline(x1,y1,x2,y2)
Xshort x1,y1,x2,y2;
X{
X    fwrite("l",1,1,plotfd);
X    fwrite(&x1,2,1,plotfd);
X    fwrite(&y1,2,1,plotfd);
X    fwrite(&x2,2,1,plotfd);
X    fwrite(&y2,2,1,plotfd);
X}
X
Xmove(x,y)
Xshort x,y;
X{
X    fwrite("m",1,1,plotfd);
X    fwrite(&x,2,1,plotfd);
X    fwrite(&y,2,1,plotfd);
X}
X
Xcont(x,y)
Xshort x,y;
X{
X    fwrite("n",1,1,plotfd);
X    fwrite(&x,2,1,plotfd);
X    fwrite(&y,2,1,plotfd);
X}
X
Xbspline(k,n,v)
Xshort k, n, *v;
X{
X    int indx, vert;
X    short x, y;
X
X    indx = 0;
X
X    fwrite("k",1,1,plotfd);
X    fwrite(&k,2,1,plotfd);
X    fwrite(&n,2,1,plotfd);
X    for(vert = 0; vert < n; vert++) {
X        x = v[indx++];
X        y = v[indx++];
X        fwrite(&x,2,1,plotfd);
X        fwrite(&y,2,1,plotfd);
X    }
X}
X
Xbsplinehd(k,n)
Xshort n;
X{
X    fwrite("k",1,1,plotfd);
X    fwrite(&k,2,1,plotfd);
X    fwrite(&n,2,1,plotfd);
X}
X
Xbsplinept(x,y)
Xshort x,y;
X{
X    fwrite(&x,2,1,plotfd);
X    fwrite(&y,2,1,plotfd);
X}
X
Xpolygon(n,v)
Xshort n, *v;
X{
X    int indx, vert;
X    short x, y;
X
X    indx = 0;
X
X    fwrite("o",1,1,plotfd);
X    fwrite(&n,2,1,plotfd);
X    for(vert = 0; vert < n; vert++) {
X        x = v[indx++];
X        y = v[indx++];
X        fwrite(&x,2,1,plotfd);
X        fwrite(&y,2,1,plotfd);
X    }
X}
X
Xpolyhd(n)
Xshort n;
X{
X    fwrite("o",1,1,plotfd);
X    fwrite(&n,2,1,plotfd);
X}
X
Xpolypt(x,y)
Xshort x,y;
X{
X    fwrite(&x,2,1,plotfd);
X    fwrite(&y,2,1,plotfd);
X}
X
Xchain(n,v)
Xshort n, *v;
X{
X    int indx, vert;
X    short x, y;
X
X    indx = 0;
X
X    fwrite("L",1,1,plotfd);
X    fwrite(&n,2,1,plotfd);
X    for(vert = 0; vert < n; vert++) {
X        x = v[indx++];
X        y = v[indx++];
X        fwrite(&x,2,1,plotfd);
X        fwrite(&y,2,1,plotfd);
X    }
X}
X
Xchainhd(n)
Xshort n;
X{
X    fwrite("L",1,1,plotfd);
X    fwrite(&n,2,1,plotfd);
X}
X
Xchainpt(x,y)
Xshort x,y;
X{
X    fwrite(&x,2,1,plotfd);
X    fwrite(&y,2,1,plotfd);
X}
X    
Xpoint(x,y)
Xshort x,y;
X{
X    fwrite("p",1,1,plotfd);
X    fwrite(&x,2,1,plotfd);
X    fwrite(&y,2,1,plotfd);
X}
X
Xspace(x1,y1,x2,y2,hv)
Xshort x1,y1,x2,y2,hv;
X{
X    fwrite("s",1,1,plotfd);
X    fwrite(&x1,2,1,plotfd);
X    fwrite(&y1,2,1,plotfd);
X    fwrite(&x2,2,1,plotfd);
X    fwrite(&y2,2,1,plotfd);
X    fwrite(&hv,2,1,plotfd);
X}
X
Xlabel(str)
Xchar *str;
X{
X    fprintf(plotfd,"t%s\n",str);
X}
X
Xclabel(str)
Xchar *str;
X{
X    fprintf(plotfd,"%%%s\n",str);
X}
X
Xblabel(w,h,str)
Xshort w,h;
Xchar *str;
X{
X    fwrite("U",1,1,plotfd);
X    fwrite(&w,2,1,plotfd);
X    fwrite(&h,2,1,plotfd);
X    fprintf(plotfd,"%s\n",str);
X}
X
Xllabel(w,h,str)
Xshort w,h;
Xchar *str;
X{
X    fwrite("V",1,1,plotfd);
X    fwrite(&w,2,1,plotfd);
X    fwrite(&h,2,1,plotfd);
X    fprintf(plotfd,"%s\n",str);
X}
X
Xcomment(str)
Xchar *str;
X{
X    fprintf(plotfd,";%s\n",str);
X}
X
Xarea(x,y)
Xshort x, y;
X{
X    fwrite("A",1,1,plotfd);
X    fwrite(&x,2,1,plotfd);
X    fwrite(&y,2,1,plotfd);
X}
X
Xbppin(b)
Xshort b;
X{
X    fwrite("B",1,1,plotfd);
X    fwrite(&b,2,1,plotfd);
X}
X
Xbppout(b)
Xshort b;
X{
X    fwrite("b",1,1,plotfd);
X    fwrite(&b,2,1,plotfd);
X}
X
Xframe(r1,c1,r2,c2,hv)
Xshort r1,c1,r2,c2,hv;
X{
X    fwrite("F",1,1,plotfd);
X    fwrite(&r1,2,1,plotfd);
X    fwrite(&c1,2,1,plotfd);
X    fwrite(&r2,2,1,plotfd);
X    fwrite(&c2,2,1,plotfd);
X    fwrite(&hv,2,1,plotfd);
X}
X
Xmoverel(x,y)
Xshort x,y;
X{
X    fwrite("M",1,1,plotfd);
X    fwrite(&x,2,1,plotfd);
X    fwrite(&y,2,1,plotfd);
X}
X
Xcontrel(x,y)
Xshort x,y;
X{
X    fwrite("N",1,1,plotfd);
X    fwrite(&x,2,1,plotfd);
X    fwrite(&y,2,1,plotfd);
X}
X
Xfillpat(n,r,c,str)
Xshort n,r,c;
Xchar *str;
X{
X    fwrite("P",1,1,plotfd);
X    fwrite(&n,2,1,plotfd);
X    fwrite(&r,2,1,plotfd);
X    fwrite(&c,2,1,plotfd);
X    fprintf(plotfd,"%s\n",str);
X}
X
Xsetpat(n)
Xshort n;
X{
X    fwrite("T",1,1,plotfd);
X    fwrite(&n,2,1,plotfd);
X}
X
Xpensize(n)
Xshort n;
X{
X    fwrite("d",1,1,plotfd);
X    fwrite(&n,2,1,plotfd);
X}
X
Xfspec(w,h,t)
Xdouble w,h,t;
X{
X    fwrite("S",1,1,plotfd);
X    fwrite(&w,4,1,plotfd);  
X    fwrite(&h,4,1,plotfd);  
X    fwrite(&t,4,1,plotfd);
X}
X
Xfont(str)
Xchar *str;
X{
X    fprintf(plotfd,"X%s\n",str);
X}
X
Xstartp()
X{
X    fwrite("[",1,1,plotfd);
X}
X
Xendp()
X{
X    fwrite("]",1,1,plotfd);
X}
X
Xplotclose()
X{
X    fflush(plotfd);
X    fclose(plotfd);
X}
X
Xplotflush()
X{
X    fflush(plotfd);
X}
!FUNKY!STUFF!
echo  
echo finished part 1 of 8

majka@ubc-vision.UUCP (Marc Majka) (04/28/86)

- - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - -
#!/bin/sh
#
# shell archive - extract with /bin/sh
#
echo Plot archive part 2 of 8
echo
echo extracting file fplot.man
sed 's/^X//' > fplot.man <<'!FUNKY!STUFF!'
XFPLOT(3)	    UNIX Programmer's Manual	     FPLOT(3)
X
XNAME
X     fplot: graphics interface.
X
XSYNOPSIS
X     plotopen(fname)
X     char *fname;
X
X     plotappend(fname)
X     char *fname;
X
X     plotflush()
X
X     plotclose()
X
X     area(x1,y1)
X     short x1,y1;
X
X     arc(x1,y1,x2,y2,x3,y3)
X     short x1,y1,x2,y2,x3,y3;
X
X     blabel(w,h,str)
X     short w,h;
X     char *str;
X
X     bppin(b)
X     short b;
X
X     bppout(b)
X     short b;
X
X     bspline(k,n,v)
X     short k, n, *v;
X
X     chain(n,v)
X     short n, *v;
X
X     circle(x1,y1,r)
X     short x1,y1,r;
X
X     clabel(str)
X     char *str;
X
X     colour(red,green,blue)
X     short red,green,blue;
X
X     comment(str)
X     char *str;
X
X     cont(x1,y1)
X     short x1,y1;
X
X     contrel(x1,y1)
X     short x1,y1;
X
X     endp()
X
X     erase()
X
X     fillpat(pn,x1,y1,str)
X     short pn,x1,y1;
X     char *str;
X
X     font(str)
X     char *str;
X
X     frame(x1,y1,x2,y2,hv)
X     short x1,y1,x2,y2,hv;
X
X     fspec(ws,hs,theta)
X     double ws,hs,theta;
X
X     gray(g)
X     short g;
X
X     label(str)
X     char *str;
X
X     line(x1,y1,x2,y2)
X     short x1,y1,x2,y2;
X
X     linemod(str)
X     char *str;
X
X     llabel(w,h,str)
X     short w,h;
X     char *str;
X
X     move(x1,y1)
X     short x1,y1;
X
X     moverel(x1,y1)
X     short x1,y1;
X
X     pensize(pn)
X     short pn;
X
X     point(x1,y1)
X     short x1,y1;
X
X     polygon(n,v)
X     short n, *v;
X
X     setpat(pn)
X     short pn;
X
X     space(x1,y1,x2,y2,hv)
X     short x1,y1,x2,y2,hv;
X
X     startp()
X
XDESCRIPTION
X     These routines write plot commands	to an output file named
X     in	the plotopen(fname) call, or to	standard output	if no
X     name is given.  plotappend(fname) opens the plot file in 
X     append mode.  plotflush() flushes the output stream.  Plot
X     commands in the output file are identified by a single
X     character, followed by their arguments. The plot file 
X     should be closed with a call to plotclose().
X
XPLOT FILE FORMAT
X     a	arc  xc	yc x1 y1 x2 y2:	 draw a	circular arc centered at
X	(xc yc), from (x1 y1) to (x2 y2). Arcs are drawn clock-
X	wise. (x2 y2) becomes the current point.
X
X     b	bppout	  b:   scale output gray and colour values to a	b
X	bit per	pixel range.  Specifies the output device's gray-
X	scale range.
X
X     c	circle	  x y r:    draw a circle of radius r with centre
X	(x y). The centre becomes the current point.
X
X     d	pensize	  n:   set the diameter	of the pen.
X
X     e	erase:	  clear	the image to the current gray or current
X	colour value.
X
X     f	linemod	  str: change the line mask used by the	vector
X	generator. Str is be a string of 0s an 1s.  The	line gen-
X	erator	will set pixels	marked by a 1 in the string. For
X	example, to produce a dotted line, a string like 11000
X	might be used. The line	generator cycles through the
X	mask. The mask pointer is not reset on n (cont)	instruc-
X	tions, so the pattern will continue to the next	segment,
X	if desired.  The initial line mask is 1, which generates
X	solid lines.
X
X     g	gray g:	  set the current gray level to	g from the user's
X	gray scale range. This value will be scaled to the output
X	gray scale range.
X
X     k	bspline	  k n x1 y1 x2 y2 ... xn yn:	draw an	order k
X	B-spline. The n	points are control points.  The	spline
X	does not interpolate between the points.  The algorithm
X	is taken from "Principles of Interactive Computer Graph-
X	ics" by	Newmann	and Sproull, page 323.
X
X     l	line x1	y1 x2 y2:   draw a line	from (x1 y1) to	(x2 y2).
X	(x2 y2)	becomes	the current point.
X
X     m	move x y: (x y)	becomes	the current point.
X
X     n	cont x y: draw a line from the current point to	(x y).
X	(x y) becomes the current point.
X
X     o	polygon	  n x1 y1 x2 y2	... xn yn: draw	a filled polygon.
X	The polygon has	n vertices, x1 y1 ... xn yn.  The polygon
X	subroutine expects the value of	n, and a pointer to an
X	array of 2*n values, which are used as x y pairs.
X
X     p	point	  x y: set the point (x	y). It becomes the
X	current	point.
X
X     s	space	  x1 y1	x2 y2 hv:     define the user's	co-
X	ordinates. (x1 y1) and (x2 y2) define the ends of a diag-
X	onal through the space.	If hv is one, then the first
X	coordinate (x) will be regarded	as horizontal, and the
X	second as vertical. Otherwise, the first coordinate will
X	be regarded as vertical	and the	second as horizontal.
X
X     t	label	  str: write the text string, up to a newline,
X	starting at the	current	point.	The text is written using
X	the current font, with the current width scale,	height
X	scale and rotation angle.
X
X     A	area x y: fill an area starting	at the seed point (x y).
X	All 4-connected	points having the same gray level as the
X	seed point will	be set to the current gray level. The
X	boundary thus consists of pixels with a	gray level dif-
X	ferent from the	seed point gray	level, or the edge of the
X	defined	space.
X
X     B	bppin	  b:   input gray and colour values will be drawn
X	from a b bit per pixel range.
X
X     C	colour	  red green blue:     set the current red green
X	and blue values	from the user's	input range.
X
X     F	frame	  r1 c1	r2 r2 hv:     define the device	coordi-
X	nate system. The point (x1 y1) from the	user's coordinate
X	system (from the space command)	will be	mapped to
X	(r1 c1), and (x2 y2) will be mapped to (r2 c2).	If hv is
X	one, the device's first	coordinate is horizontal.
X
X     L	chain	  n x1 y1 x2 y2	... xn yn: draw	a polyline (or
X	chain).	The line has n vertices, x1 y1 ... xn yn.  The
X	chain subroutine expects the value of n, and a pointer to
X	an array of 2*n	values,	which are used as x y pairs.
X
X     M	moverel	  dx dy:    displace the current point by dx and
X	dy.
X
X     N	contrel	  dx dy:    draw a line	from the current point to
X	a new current point displaced by dx and	dy.
X
X     P	fillpat	  n r c	str:	 the string str	is used	as an r
X	row by c column	pattern, which may be used for area,
X	fill, and erase	commands. Pixels under a 1 in the pattern
X	are set	to the current gray level. The pattern is labeled
X	n.  This label is used to refer	to the pattern.
X
X     S	fspec	  ws hs	theta:	 change	the width scale	(ws),
X	height scale(hs), and rotation angle (theta) for labels
X	in the current font. The angle theta is	in radians, meas-
X	ured anticlockwise from	0.0.
X
X     T	setpat	  n:   set the current fill pattern to n.
X     
X     U  blabel w h str: draws the string as a label, but scales
X        the characters to fit in a box w units wide by h units
X	high, with the current point at the upper left corner.  
X     
X     V  llabel w h str: like blabel, except that the height scale
X        is based on the maximum height of caracters in the entire
X        current font.
X
X     X	font str: change the current font to that named	by str.
X	See the	section	on fonts below.
X
X     [	startp:   start a filled polygon. Any closed figure
X	drawn with the current gray level, will	be filled using
X	the current gray level and  fill pattern.  The end of the
X	polygon	must be	marked by a ] (endp) plot command.
X
X     ]	endp:     end a filled polygon.	This command must be pre-
X	ceeded by a [ (startp) plot command. The polygon is
X	filled when this command is encountered.
X
X     ;	comment	  str: all characters up to a newline are taken
X	as a comment. No action	is taken.
X
X     %  clabel    str: draws the string so that it is horizontally
X        and vertically centered at the current point.
X
XFONTS
X     Labels are	plotted	using the current font,	using the current
X     width and height scales, and rotation angle. The initial
X     font is Simplex Roman, the	width and height scales	are 1.0,
X     and the rotation angle is 0.0. Label characters not in the
X     font are ignored.
X
X     Caveat Scriptor
X	Characters are plotted relative	to the current point.
X	This point is usually near the upper left corner of the
X	character. However, characters may extend above	and to
X	the left of the	current	point. Some experimentation may
X	be necessary for correct label placement.
X
X     The following fonts are available:
X
X     sr	     Simplex Roman
X     dr	     Duplex Roman
X     cr	     Complex Roman
X     tr	     Triplex Roman
X     ci	     Complex Italic
X     ti	     Triplex Italic
X     ss	     Simplex Script
X     cs	     Complex Script
X     ge	     Gothic English
X     gg	     Gothic German
X     gi	     Gothic Italian
X
X     If	the font name begins with the character	/, the name is
X     taken to be a file	name containing	an alternate font.
X
XAUTHOR
X     Marc Majka
!FUNKY!STUFF!
echo extracting file hcat.c
sed 's/^X//' > hcat.c <<'!FUNKY!STUFF!'
X#include<stdio.h>
X#define TB "vfont/hf.table"
X#define CL "vfont/hf.clist"
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X    short glyph;
X    int g, x, y, i, xc, yc, rc, index, f;
X    char c, cx, cy, gn[8], fn[32];
X    FILE *tb, *cl, *fopen();
X    
X    tb = fopen(TB,"r");
X    cl = fopen(CL,"r");
X
X    if (tb == NULL) {
X        fprintf(stderr,"Can't open %s!\n",TB);
X        exit(0);
X    }
X    if (cl == NULL) {
X        fprintf(stderr,"Can't open %s!\n",CL);
X        exit(0);
X    }
X    
X    f = 0;
X    sprintf(fn,"hfcat.%d\0",f++);
X
X	fprintf(stderr,"[%d",f-1);
X	fflush(stderr);
X	
X    plotopen(fn);
X    space(0,0,680,680,1);
X    font("sr");
X    fspec(0.5,-0.5,0.0);
X    
X    xc = 40; yc = 40;
X    move(xc,yc);
X    
X    rc = fread(&glyph,2,1,tb);
X
X    while (rc > 0) {
X        rc = fread(&index,4,1,tb);
X        rc = fseek(cl,index,0);
X        if (rc < 0) fprintf(stderr,"cl fseek failed! offset = %d\n",index);
X        c = getc(cl);
X        while (c != '\0') {
X            cx = getc(cl);
X            cy = getc(cl);
X            x = cx; y = -1 * cy;
X            if (c == 'M') moverel(x,y);
X            else if (c == 'N') contrel(x,y);
X            c = getc(cl);
X        }
X        move(xc,yc+30);
X        sprintf(gn,"%d\0",glyph);
X        label(gn);
X        xc += 80;
X        if (xc > 640) {
X            xc = 40;
X            yc += 80;
X            if (yc > 640) {
X                plotclose();
X                yc = 40;
X                sprintf(fn,"hfcat.%d\0",f++);
X				fprintf(stderr,"] [%d",f-1);
X				fflush(stderr);
X                plotopen(fn);
X                space(0,0,680,680,1);
X                font("sr");
X                fspec(0.5,-0.5,0.0);
X            }
X        }
X        move(xc,yc);
X
X        rc = fread(&glyph,2,1,tb);
X    }
X    plotclose();
X	fprintf(stderr,"]\n");
X}
!FUNKY!STUFF!
echo extracting file hcat.man
sed 's/^X//' > hcat.man <<'!FUNKY!STUFF!'
XHCAT(1)        UNIX Programmer's Manual         HCAT(1)
X
XNAME
X     hcat - make Hershey font catalogue
X
XSYNOPSIS
X     hcat
X
XDESCRIPTION
X     hcat creates a set of plot files which form a catalogue for
X     the Hershey fonts.  The program hform must be run before this
X     routine in order to create the necessary files.  hcat creates
X     the files hfcat.0 - hfcat.24.  Each is a single page contain-
X     ing 64 numbered glyphs from the Hershey fonts.
X
XAUTHOR
X     Marc Majka
X
!FUNKY!STUFF!
echo extracting file hfont.c
sed 's/^X//' > hfont.c <<'!FUNKY!STUFF!'
X#include<stdio.h>
X#define TB "vfont/hf.table"
X#define CL "vfont/hf.clist"
X#define MAXF 32768
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X    short glyph;
X    int g, x, y, i, dx, dy;
X    int rc, index, gx[256], cn, cpt, spt, cstart[256];
X    char c, cx, cy, fstr[MAXF];
X    FILE *tb, *cl, *fopen();
X
X    tb = fopen(TB,"r");
X    cl = fopen(CL,"r");
X
X    if (tb == NULL) {
X        fprintf(stderr,"Can't open %s!\n",TB);
X        exit(1);
X    }
X    if (cl == NULL) {
X        fprintf(stderr,"Can't open %s!\n",CL);
X        exit(1);
X    }
X
X    for (i = 0; i < 256; i++) gx[i] = -1;
X
X    scanf("%d %d%*[^\n]%*c",&dx,&dy);
X
X    c = getchar();
X    while (c != EOF) {
X        scanf("%d%*[^\n]%*c",&g);
X        cn = (unsigned)c;
X
X        fseek(tb,0,0);
X        rc = fread(&glyph,2,1,tb);
X
X        while ((rc > 0) && (g != glyph)) {
X            rc = fread(&index,4,1,tb);
X            rc = fread(&glyph,2,1,tb);
X        }
X
X        if (rc == 0) {
X            fprintf(stderr,"Glyph %d not found (char \'%c\')!\n",g,c);
X            fclose(tb);
X            tb = fopen(TB,"r");
X
X            if (tb == NULL) {
X                fprintf(stderr,"Can't open %s!\n",TB);
X                exit(1);
X            }
X        }
X        
X        else {
X            rc = fread(&index,4,1,tb);
X            gx[cn] = index;
X        }
X        c = getchar();
X    }
X
X    spt = 0;
X
X    for (i = 0; i < 256; i++) {
X        if (gx[i] >= 0) {
X            rc = fseek(cl,gx[i],0);
X            if (rc < 0) {
X                fprintf(stderr,"cl fseek failed! offset = %d\n",gx[i]);
X                exit(1);
X            }
X        
X            cstart[i] = spt;
X
X            c = getc(cl);
X            cx = getc(cl);
X            cy = getc(cl);
X            fstr[spt++] = c;
X            fstr[spt++] = cx + dx;
X            fstr[spt++] = cy + dy;
X            c = getc(cl);
X
X            while (c != '\0') {
X                cx = getc(cl);
X                cy = getc(cl);
X                fstr[spt++] = c;
X                fstr[spt++] = cx;
X                fstr[spt++] = cy;
X                c = getc(cl);
X            }
X            
X            fstr[spt-2] -= dx;
X            fstr[spt-1] -= dy;
X            
X            fstr[spt++] = '\0';
X        }
X    }
X    
X    for (i = 0; i < 256; i++) {
X        if (gx[i] >= 0) {
X            c = i;
X            fwrite(&c,1,1,stdout);
X            fwrite(&cstart[i],4,1,stdout);
X        }
X    }
X    
X    c = '\0';
X    fwrite(&c,1,1,stdout);
X    for (i = 0; i < spt; i++) fwrite(&fstr[i],1,1,stdout);
X    
X    exit(0);
X}
!FUNKY!STUFF!
echo extracting file hfont.man
sed 's/^X//' > hfont.man <<'!FUNKY!STUFF!'
XHFONT(1)        UNIX Programmer's Manual         HFONT(1)
X
XNAME
X     hfont - make a plot-file font from the Hershey fonts
X
XSYNOPSIS
X     hfont
X
XDESCRIPTION
X     hfont creates a font file compatibe with the new plot rou-
X     tines. Glyphs are selected from the Hershey font catalogue,
X     and associated with single characters in the new font. hfont
X     reads a list of character - glyph number pairs from standard
X     input, and writes the new vector font file on standard out-
X     put.  The first line of the input file must contain 2
X     integer values.  These are x and y offsets for the character
X     coordinate systems.  A positive value will cause each char-
X     acter to be shifted to the left and up for x and y respec-
X     tively.  Each successive line in the input must contain a
X     single character, a blank, and an integer value, followed by
X     a newline.  The integer must be a Hershey glyph number,
X     which will be associated with the character in the font.
X     For example, if the input file contained the lines:
X
X     S 741
X     H 742
X     D 743
X     C 744
X
X     Then the font would contain the glyphs for the playing-card
X     symbols for Spades, Hearts, Diamonds, and Clubs attached to
X     the characters S, H, D, and C.
X
X     Copies of the Hershey font catalogue may be created with hcat.
X
XAUTHOR
X     Marc Majka
X
!FUNKY!STUFF!
echo extracting file hform.c
sed 's/^X//' > hform.c <<'!FUNKY!STUFF!'
X#include <stdio.h>
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X    short glyph;
X    int np, x[256], y[256], i, mflag, xl, xr;
X    short xc, yc, x0, y0;
X    int index, d;
X    char cg[6],cnp[4], c, dx, dy;
X    FILE *ff, *tb, *cl, *fopen();
X    
X    ff = stdin;
X    tb = fopen("vfont/hf.table","w");
X    cl = fopen("vfont/hf.clist","w");
X
X    index = 0;
X
X    xc = 0; yc = 0;
X
X    cg[0] = getc(ff);
X    if (cg[0] == '\n') cg[0] = getc(ff);
X    while (cg[0] != EOF) {
X        /* first 5 chars: glyph number */
X
X        for (i = 1; i < 5; i++) cg[i] = getc(ff);
X        cg[i] = '\0';
X        glyph = atoi(cg);
X        if (glyph == 0) fprintf(stderr,"%d! \"%s\"\n",glyph,cg);
X
X        /* next 3 chars: number of pairs */
X        for (i = 0; i < 3; i++) cnp[i] = getc(ff);
X        cnp[i] = '\0';
X        np = atoi(cnp);
X        
X        /* left and right (X) boundaries */
X        xl = getc(ff) - 'R';
X        xr = getc(ff) - 'R';
X        np--;
X    
X        /* points + skip commands */
X        for (i = 0; i < np; i++) {
X            if ((i == 31) || (i == 67) || (i == 103) || (i == 139))
X                c = getc(ff); 
X            x[i] = getc(ff) - 'R';
X            y[i] = getc(ff) - 'R';
X        }
X
X        /* extra char(s) at end */
X        while ('\n' != (c = getc(ff)));
X        
X        xc = 0;
X        yc = 0;
X
X        /* write the table entry */
X        if (glyph == d) {
X            fprintf(stderr,"glyph %d   index %d\n",glyph,index);
X            fprintf(stderr,"xl %d   xr %d\n",xl,xr);
X        }
X        
X        fwrite(&glyph,2,1,tb);
X        fwrite(&index,4,1,tb);
X        
X        /* write the plot list */
X        /* first point is a skip */
X        dx = xc - x[0] + xl;
X        dy = yc - y[0];
X        xc = x[0];
X        yc = y[0];
X        dx *= -1;
X
X        fwrite("M",1,1,cl);
X        fwrite(&dx,1,1,cl);
X        fwrite(&dy,1,1,cl);
X
X        index += 3;
X        mflag = 0;
X
X        for (i = 1; i < np; i++) {
X            if (x[i] == -50) mflag = 1;
X            else if (mflag) {
X                dx = xc - x[i];
X                dy = yc - y[i];
X                xc = x[i];
X                yc = y[i];
X                dx *= -1;
X                fwrite("M",1,1,cl);
X                fwrite(&dx,1,1,cl);
X                fwrite(&dy,1,1,cl);
X                index += 3;
X                mflag = 0;
X            }
X            else {
X                dx = xc - x[i];
X                dy = yc - y[i];
X                xc = x[i];
X                yc = y[i];
X                dx *= -1;
X                fwrite("N",1,1,cl);
X                fwrite(&dx,1,1,cl);
X                fwrite(&dy,1,1,cl);
X                index += 3;
X            }
X        }
X        dx = xc - xr;
X        dy = yc - 0;
X        dx *= -1;
X        fwrite("M",1,1,cl);
X        fwrite(&dx,1,1,cl);
X        fwrite(&dy,1,1,cl);
X        index += 3;
X        xc = xr;
X        yc = 0;
X        fwrite(&yc,1,1,cl);
X        index += 1;
X        
X        cg[0] = getc(ff);
X        if (cg[0] == '\n') cg[0] = getc(ff);
X    }
X    fclose(ff);
X    fclose(tb);
X    fclose(cl);
X    exit(0);
X}
!FUNKY!STUFF!
echo
echo finished part 2 of 8

majka@ubc-vision.UUCP (Marc Majka) (04/28/86)

- - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - -
#!/bin/sh
#
# shell archive - extract with /bin/sh
#
echo Plot archive part 3 of 8
echo
echo extracting file hform.man
sed 's/^X//' > hform.man <<'!FUNKY!STUFF!'
XHFORM(1)        UNIX Programmer's Manual         HFORM(1)
X
XNAME
X     hform - reformat the public distribution of the Hershey fonts
X
XSYNOPSIS
X     hform 
X
XDESCRIPTION
X     hform reads in a concatination of the Hershey fonts they
X     come out of the public distribution in mod.sources. The
X     program produces two files, vfont/hf.table and 
X     vfont/hf.clist.  The table file contains a glyph-number
X     offset list.  The offset is a character offset into the 
X     clist file.  This file contains, for each glyph, a list
X     of relative moves and draws for rendering that glyph.  
X     Lists are terminated by a single null (0) character.
X
X     These two files are used by the programs hcat and hfont.
X
XAUTHOR
X     Marc Majka
X
!FUNKY!STUFF!
echo extracting file labels.c
sed 's/^X//' > labels.c <<'!FUNKY!STUFF!'
X/*************************************************************/
X/*                                                           */
X/*  Copyright (c) 1986                                       */
X/*  Marc S. Majka - UBC Laboratory for Computational Vision  */
X/*                                                           */
X/*  Permission is hereby granted to copy all or any part of  */
X/*  this program for free distribution.   The author's name  */
X/*  and this copyright notice must be included in any copy.  */
X/*                                                           */
X/*************************************************************/
X
X/*************************************************************/
X/*                                                           */
X/*  This file contains a common set of label drawing and     */
X/*  font manipulation routines.  They depend on there being  */
X/*  three routines compiled in with them:                    */
X/*                                                           */
X/*  dblmoverel(x,y)     To do a relative move, but           */
X/*  double x,y;         take doubles as input.               */
X/*                                                           */
X/*  dblcontrel(x,y)     To do a relative draw, but           */
X/*  double x,y;         take doubles as input.               */
X/*                                                           */
X/*  donelabel()         Doesn't need to do anything, but a   */
X/*                      device filter may want to know.      */
X/*                                                           */
X/*************************************************************/
X
X#include <math.h>
X#include <stdio.h>
X
X#define MAXF 32000
X
X/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
X/* THIS IS WHERE THE FONTS ARE KEPT:  MODIFY FOR LOCAL CONFIGURATION */
X/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
X#define FONTS "vfont/"
X
Xextern int errno;
X
Xstruct fontstruct {
X    char name[256], clist[256], draw[MAXF];
X    int nchars, cstart[256];
X    double wscale, hscale, theta;
X    double sinth, costh;
X};
X
Xstatic struct fontstruct fontst;
X
Xfont(fname)
Xchar *fname;
X{
X    FILE *fin, *fopen();
X    int spt, i;
X    char c, fontfile[256];
X    
X    fontst.nchars = 0; 
X    spt = 0;
X
X    /* open the font file */
X
X    if (fname[0] == '/') 
X        strcpy(fontfile,fname);
X    else {
X        strcpy(fontfile,FONTS);
X        strcat(fontfile,fname);
X    }
X    
X    errno = 0;
X    
X    fin = fopen(fontfile,"r");
X    if (fin == NULL) {
X        fprintf(stderr,"\ncan't open font file: \"%s\"\n",fontfile);
X        if (errno == 0) fprintf(stderr,"Too many open files\n");
X        else perror(0);
X        exit(1);
X    }
X    strcpy(fontst.name,fname);
X    
X    /* read the character index */  
X    fread(&c,1,1,fin);
X    while (c != '\0') {
X        fread(&spt,4,1,fin);
X        fontst.clist[fontst.nchars] = c;
X        fontst.cstart[fontst.nchars++] = spt;
X        fread(&c,1,1,fin);
X    }
X    fontst.clist[fontst.nchars] = '\0';
X
X    /* read the plot list */
X    i = 0;
X    while (fread(&fontst.draw[i++],1,1,fin));
X    fclose(fin);
X}
X
Xfspec(w,h,t)
Xdouble w, h, t;
X{
X    double sin(), cos();
X    fontst.wscale = w;
X    fontst.hscale = h;
X    fontst.theta = t;
X    fontst.costh = cos(t);
X    fontst.sinth = sin(t);
X}
X
Xlabel(str)
Xchar *str;
X{
X    int i;
X    for (i = 0; str[i] != '\0'; imchar(str[i++]));
X    donelabel();
X}
X
Ximlabelsize(str,x,y)
Xchar *str;
Xdouble *x,*y;
X{
X    /* This code is krufty.  It runs through the input string
X       and collects the "size" of the label.  There are too many
X       coordinate systems in here to imagine.  Bleech!     */
X
X    int cpt, spt, i;
X    double csxc, csyc, x1, y1, x2, y2, csdx, csdy;
X    char c;
X
X    csxc = 0.0; csyc = 0.0;
X    x1 = 0.0; y1 = 0.0; 
X    x2 = 0.0; y2 = 0.0;
X
X    for (i = 0; str[i] != '\0'; i++) {
X        c = str[i]; 
X        cpt = 0;
X        while ((c != fontst.clist[cpt]) && (cpt < fontst.nchars)) cpt++;
X    
X        if (cpt < fontst.nchars) {
X            spt = fontst.cstart[cpt];
X            while (fontst.draw[spt++] != '\0') {
X                csdx = fontst.wscale * (double)(fontst.draw[spt++]); 
X                csdy = fontst.hscale * (double)(fontst.draw[spt++]);
X                csxc += csdx; csyc += csdy;
X                if (csxc < x1) x1 = csxc;
X                if (csyc < y1) y1 = csyc;
X                if (csxc > x2) x2 = csxc;
X                if (csyc > y2) y2 = csyc;
X            }
X        }
X    }
X            
X    *x = x2 - x1;
X    *y = y2 - y1;
X}
X
Xclabel(str)
Xchar *str;
X{
X    double dx,dy,odx,ody;
X
X    imlabelsize(str,&dx,&dy);
X    dx /= -2.0; dy /= 2.0;
X    odx = (dx * fontst.costh) - (dy * fontst.sinth);
X    ody = (dx * fontst.sinth) + (dy * fontst.costh);
X    dblmoverel(odx,ody);
X
X    label(str);
X}
X
Xblabel(lx,ly,str)
Xshort lx,ly;
Xchar *str;
X{
X    double dx,dy,d0;
X    double ow, oh, t;
X
X    ow = fontst.wscale; 
X    oh = fontst.hscale;
X
X    fontst.wscale = 1.0;
X    fontst.hscale = 1.0;
X    if (ow < 0) fontst.wscale *= -1.0;
X    if (oh < 0) fontst.hscale *= -1.0;
X
X    imlabelsize(str,&dx,&dy);
X
X    if (dx == 0.0) dx = 1.0;
X    if (dy == 0.0) dy = 1.0;
X    
X    fontst.wscale = (double)lx / dx;
X    fontst.hscale = (double)ly / dy;
X    
X    label(str);
X
X    fontst.wscale = ow;
X    fontst.hscale = oh;
X}
X
Xllabel(lx,ly,str)
Xshort lx,ly;
Xchar *str;
X{
X    double dx,dy,d0;
X    double ow, oh, t;
X
X    ow = fontst.wscale; 
X    oh = fontst.hscale;
X
X    fontst.wscale = 1.0;
X    fontst.hscale = 1.0;
X    if (ow < 0) fontst.wscale *= -1.0;
X    if (oh < 0) fontst.hscale *= -1.0;
X
X    imlabelsize(str,&dx,&d0);
X    imlabelsize(fontst.clist,&d0,&dy);
X
X    if (dx == 0.0) dx = 1.0;
X    if (dy == 0.0) dy = 1.0;
X    
X    fontst.wscale = (double)lx / dx;
X    fontst.hscale = (double)ly / dy;
X    
X    label(str);
X
X    fontst.wscale = ow;
X    fontst.hscale = oh;
X}
X
Ximchar(c)
Xchar c;
X{
X    int cpt, spt, contf;
X    double csdx, csdy, odx, ody;
X    
X    cpt = 0;
X    while ((c != fontst.clist[cpt]) && (cpt < fontst.nchars)) cpt++;
X    
X    if (cpt < fontst.nchars) {
X        spt = fontst.cstart[cpt];
X        while (fontst.draw[spt] != '\0') {
X            if (fontst.draw[spt++] == 'N') contf = 1;
X            else contf = 0;
X
X            csdx = fontst.wscale * (double)(fontst.draw[spt++]); 
X            csdy = fontst.hscale * (double)(fontst.draw[spt++]);
X            
X            odx = (csdx * fontst.costh) - (csdy * fontst.sinth);
X            ody = (csdx * fontst.sinth) + (csdy * fontst.costh);
X
X            if (contf) dblcontrel(odx,ody);
X            else dblmoverel(odx,ody);
X        }
X    }
X    if (c == ' ') donelabel();
X}
!FUNKY!STUFF!
echo extracting file mkfont.c
sed 's/^X//' > mkfont.c <<'!FUNKY!STUFF!'
X/*************************************************************/
X/*                                                           */
X/*  Copyright (c) 1986                                       */
X/*  Marc S. Majka - UBC Laboratory for Computational Vision  */
X/*                                                           */
X/*  Permission is hereby granted to copy all or any part of  */
X/*  this program for free distribution.   The author's name  */
X/*  and this copyright notice must be included in any copy.  */
X/*                                                           */
X/*************************************************************/
X
X#include <stdio.h>
X#define MAXF 32768
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X    FILE *fin, *fout, *fopen();
X    short x, y;
X    int cstart[256], cpt, spt, i;
X    char comm[32], fstr[MAXF], clist[256], xc, yc;
X    
X    cpt = 0; spt = 0;
X    if (argc < 2) {
X        fin = stdin;
X        fout = stdout;
X    }
X    else if (argc < 3) {
X        fin = fopen(argv[1],"r");
X        fout = stdout;
X    }
X    else {
X        fin = fopen(argv[1],"r");
X        fout = fopen(argv[2],"w");
X    }
X    
X    if (fin == NULL) {
X        fprintf(stderr,"mkfont: can't open input file!\n");
X        exit(1);
X    }
X    
X    if (fout == NULL) {
X        fprintf(stderr,"mkfont: can't open output file!\n");
X        exit(1);
X    }
X    
X    fscanf(fin,"%c%c",&comm[0],&comm[1]);
X    
X    while (comm[1] == ':') {
X        clist[cpt] = comm[0];
X        cstart[cpt++] = spt;
X        fscanf(fin,"%s",comm);
X        while (comm[0] != 'E') {
X            if (comm[0] == 'N') {
X                fscanf(fin,"%hd %hd",&x,&y);
X                xc = x; yc = y;
X                fstr[spt++] = 'N';
X                fstr[spt++] = xc; fstr[spt++] = yc;
X            }
X            else if (comm[0] == 'M') {
X                fscanf(fin,"%hd %hd",&x,&y);
X                xc = x; yc = y;
X                fstr[spt++] = 'M';
X                fstr[spt++] = xc; fstr[spt++] = yc;
X            }
X            fscanf(fin,"%s",comm);
X    }
X        fstr[spt++] = '\0';
X
X        while (getc(fin) != '\n');
X        
X        fscanf(fin,"%c%c",&comm[0],&comm[1]);
X    }
X    for (i = 0; i < cpt; i++) {
X        fwrite(&clist[i],1,1,fout);
X        fwrite(&cstart[i],4,1,fout);
X    }
X    xc = '\0';
X    fwrite(&xc,1,1,fout);
X    for (i = 0; i < spt; i++) fwrite(&fstr[i],1,1,fout);
X    fclose(fin);
X    fclose(fout);
X}
!FUNKY!STUFF!
echo extracting file pl5pl.c
sed 's/^X//' > pl5pl.c <<'!FUNKY!STUFF!'
X/*************************************************************/
X/*                                                           */
X/*  Copyright (c) 1986                                       */
X/*  Marc S. Majka - UBC Laboratory for Computational Vision  */
X/*                                                           */
X/*  Permission is hereby granted to copy all or any part of  */
X/*  this program for free distribution.   The author's name  */
X/*  and this copyright notice must be included in any copy.  */
X/*                                                           */
X/*************************************************************/
X
X#include <stdio.h>
X
Xmain (argc, argv)
Xint argc;
Xchar *argv[];
X{
X    char str[1024], comm, nl, c;
X    int i, patn;
X    short x1, y1, x2, y2, x3, y3, r, gray, red, green, blue, hv, pn, n, k;
X    FILE *tfp, *pfp, *fopen();
X    double ws, hs, theta;
X    
X    hv = 0;
X
X    if (argc > 1) tfp = fopen(argv[1],"r");
X    else tfp = stdin;
X    
X    if (tfp == NULL) {
X        fprintf(stderr,"stpl: can't open input plot file\n");
X        exit(1);
X    }
X
X    if (argc > 2) pfp = fopen(argv[2],"w");
X    else pfp = stdout;
X    
X    if (pfp == NULL) {
X        fprintf(stderr,"stpl: can't open output plot file\n");
X        exit(1);
X    }
X
X    fprintf(pfp,"Xsr\n");
X    ws = 5.0; hs = 5.0; theta = 0.0;
X    fprintf(pfp,"S");
X    fwrite(&ws,4,1,pfp);
X    fwrite(&hs,4,1,pfp);
X    fwrite(&theta,4,1,pfp);
X    fflush(pfp);
X        
X    while (fscanf(tfp, "%c", &comm) != EOF) {
X        switch (comm) {
X            case 'm': /* MOVE */
X                fread(&x1,2,1,tfp);
X                fread(&y1,2,1,tfp);
X                fprintf(pfp,"m");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fflush(pfp);
X                break;
X            case 'n': /* CONT */
X                fread(&x1,2,1,tfp);
X                fread(&y1,2,1,tfp);
X                fprintf(pfp,"n");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fflush(pfp);
X                break;
X            case 'p': /* POINT */
X                fread(&x1,2,1,tfp);
X                fread(&y1,2,1,tfp);
X                fprintf(pfp,"p");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fflush(pfp);
X                break;
X            case 'l': /* LINE */
X                fread(&x1,2,1,tfp);
X                fread(&y1,2,1,tfp);
X                fread(&x2,2,1,tfp);
X                fread(&y2,2,1,tfp);
X                fprintf(pfp,"l");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fwrite(&x2,2,1,pfp);
X                fwrite(&y2,2,1,pfp);
X                fflush(pfp);
X                break;
X            case 't': /* LABEL */
X                fscanf(tfp,"%1s",&c);
X                i = 0;
X                while (c != '\n') {
X                    str[i++] = c;
X                    fscanf(tfp,"%c",&c);
X                }
X                str[i] = '\0';
X                fprintf(pfp,"t%s\n",str);
X                fflush(pfp);
X                break;
X            case 'a': /* ARC */
X                fread(&x1,2,1,tfp);
X                fread(&y1,2,1,tfp);
X                fread(&x2,2,1,tfp);
X                fread(&y2,2,1,tfp);
X                fread(&x3,2,1,tfp);
X                fread(&y3,2,1,tfp);
X                fprintf(pfp,"a");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fwrite(&x2,2,1,pfp);
X                fwrite(&y2,2,1,pfp);
X                fwrite(&x3,2,1,pfp);
X                fwrite(&y3,2,1,pfp);
X                fflush(pfp);
X                break;
X            case 'c': /* CIRCLE */
X                fread(&x1,2,1,tfp);
X                fread(&y1,2,1,tfp);
X                fread(&r,2,1,tfp);
X                fprintf(pfp,"c");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fwrite(&r,2,1,pfp);
X                fflush(pfp);
X                break;
X            case 'e': /* ERASE */
X                gray = 0;
X                fprintf(pfp,"g");
X                fwrite(&gray,2,1,pfp);
X                fprintf(pfp,"e");
X                gray = 255;
X                fprintf(pfp,"g");
X                fwrite(&gray,2,1,pfp);
X                fflush(pfp);
X                break;
X            case 'f': /* LINEMOD */
X                fscanf(tfp,"%s",str);
X                fscanf(tfp,"%c",&c);
X                if (!strcmp(str,"dotted")) 
X                    strcpy(str,"11000000");
X                else if (!strcmp(str,"solid")) 
X                    strcpy(str,"1");
X                else if (!strcmp(str,"longdashed")) 
X                    strcpy(str,"11111100");
X                else if (!strcmp(str,"shortdashed")) 
X                    strcpy(str,"11110000");
X                else if (!strcmp(str,"dotdashed")) 
X                    strcpy(str,"1100001111110000");
X                else strcpy(str,"1");
X                fprintf(pfp,"f%s\n",str);
X                fflush(pfp);
X                break;
X            case 's': /* SPACE */
X                fread(&x1,2,1,tfp);
X                fread(&y1,2,1,tfp);
X                fread(&x2,2,1,tfp);
X                fread(&y2,2,1,tfp);
X                fprintf(pfp,"s");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fwrite(&x2,2,1,pfp);
X                fwrite(&y2,2,1,pfp);
X                fwrite(&hv,2,1,pfp);
X                fflush(pfp);
X                break;
X            default:
X                fprintf(stderr,"stpl: unknown command %s\n", comm);
X                break;
X        }
X    }
X    
X    fclose(pfp);
X    fclose(tfp);
X    exit(0);
X}
X
!FUNKY!STUFF!
echo extracting file pl5pl.man
sed 's/^X//' > pl5pl.man <<'!FUNKY!STUFF!'
XPL5PL(1)         UNIX Programmer's Manual          PL5PL(1)
X
XNAME
X     pl5pl - converts standard UNIX plot(5) files to plot file
X     format.
X
XSYNOPSIS
X     pl5pl [in [out]]
X
XDESCRIPTION
X     pl5pl reads a plot file in the format specified by plot(5),
X     and writes it in the local format.  The space command has a
X     0 hv flag attached.  Linemods are translated into something
X     sensible.  and erase is interpreted as clear to black.
X
X     See the manual page for fplot(3) for a specification of plot
X     files.
X
XAUTHOR
X     Marc Majka
X
XSEE ALSO
X     plot(5)
!FUNKY!STUFF!
echo extracting file plps.c
sed 's/^X//' > plps.c <<'!FUNKY!STUFF!'
X/*************************************************************/
X/*                                                           */
X/*  Copyright (c) 1986                                       */
X/*  Marc S. Majka - UBC Laboratory for Computational Vision  */
X/*                                                           */
X/*  Permission is hereby granted to copy all or any part of  */
X/*  this program for free distribution.   The author's name  */
X/*  and this copyright notice must be included in any copy.  */
X/*                                                           */
X/*************************************************************/
X
X#include <stdio.h>
X
Xmain (argc, argv)
Xint argc;
Xchar *argv[];
X{
X    FILE *pfp, *fopen();
X    int argn, sqr, plt, bin, win, man, leg;
X    int x1, y1, x2, y2, r1, c1, r2, c2;
X    
X    man = 0;
X    leg = 0;
X    sqr = 0;
X    win = 0;
X    bin = 0;
X    plt = 0;
X    
X    for (argn = 1; argn < argc; argn++) {
X        if (argv[argn][0] == '-') {
X            switch (argv[argn][1]) {
X                case 's': sqr = 1; break;
X                case 'm': man = 1; break;
X                case 'l': leg = 1; break;
X                case 'b': bin = 1; break;
X                case 'w':
X                    win = argn;
X                    r1 = atoi(argv[++win]);
X                    c1 = atoi(argv[++win]);
X                    r2 = atoi(argv[++win]);
X                    c2 = atoi(argv[++win]);
X                    x1 = c1;
X                    y1 = 3300 - r1;
X                    x2 = c2;
X                    y2 = 3300 - r2;
X                    win = 1;
X                    argn += 4;
X                    break;
X                default:
X                    printf("plps [file] [-w r1 c1 r2 c2] [-s][-b][-m][-l]\n");
X                    exit(0);
X            }
X        }
X        else {
X            if (plt) {
X                    printf("plps [file] [-w r1 c1 r2 c2] [-s][-b][-m][-l]\n");
X                    exit(0);
X            }
X            plt = 1;
X            pfp = fopen(argv[argn],"r");
X            if (pfp == NULL) {
X                printf("can't open plt file %s\n",argv[argn]);
X                exit(1);
X            }
X        }
X    }
X
X    if (!plt) pfp = stdin;
X            
X    plotopen("");
X    if (man) manfeed();
X    if (leg) legal();
X    if (sqr) frame(100,3200,2400,800,1);
X    if (win) frame(x1,y1,x2,y2,1);
X    if (bin) bppout(0);
X    else bppout(1);
X    plotdriver(pfp);
X    plotclose();
X    exit(0);
X}
!FUNKY!STUFF!
echo
echo finished part 3 of 8

majka@ubc-vision.UUCP (Marc Majka) (04/28/86)

- - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - -
#!/bin/sh
#
# shell archive - extract with /bin/sh
#
echo Plot archive part 4 of 8
echo
echo extracting file plps.man
sed 's/^X//' > plps.man <<'!FUNKY!STUFF!'
XPLPS(1)         UNIX Programmer's Manual          PLPS(1)
X
XNAME
X     plps - convert plot files to PostScript
X
XSYNOPSIS
X     plps [plotfile] [-s] [-b] [-w r1 c1 r2 c2]
X
XDESCRIPTION
X     plps converts a plot file into postcript language, which may
X     then be printed on a LaserWriter. The conversion is fast, 
X     making use of many of PostScript's wonderful features. 
X
X     The following options are recognized:
X
X     -s   The image will be square. This option casues plps to
X          use only the upper 8 1/2 inch square on the page.
X
X     -b   Prints all gray levels as black, supressing
X          PostScript's halftoning.
X
X     -w   plots in a window with upper left corner (r1 c1) and
X          lower right corner (r2 c2).  At 300dpi, a normal page
X	  goes from (0 0) to (3300 2550), although a margin at 
X	  the edges of the pages does not get inked.
X
XAUTHOR
X     Marc Majka
!FUNKY!STUFF!
echo extracting file plpsfns.c
sed 's/^X//' > plpsfns.c <<'!FUNKY!STUFF!'
X/*************************************************************/
X/*                                                           */
X/*  Copyright (c) 1986                                       */
X/*  Marc S. Majka - UBC Laboratory for Computational Vision  */
X/*                                                           */
X/*  Permission is hereby granted to copy all or any part of  */
X/*  this program for free distribution.   The author's name  */
X/*  and this copyright notice must be included in any copy.  */
X/*                                                           */
X/*************************************************************/
X
X#include <stdio.h>
X#define MAXPATS 128
X#define FPMAX 32
X
Xstruct implstruct {
X    double x1, y1, x2, y2;      /* min and max points       */
X    double xr, yr;              /* x and y range            */
X    double xc, yc;              /* current point            */
X    int uhv;                    /* user space is hv         */
X    int ubpp;                   /* user bits per pixel      */
X    double ubppr;               /* user bpp range           */
X    int gray;                   /* current gray level       */
X    int fpn;                    /* current fill pattern     */
X    int dot;                    /* current pen size         */
X    double r1, c1, r2, c2;      /* max and min row and col  */
X    double rr, cr;              /* row and col range        */
X    double rc, cc;              /* current row and col      */
X    int dhv;                    /* frame hv                 */
X    int fbpp;                   /* image bits per pixel     */
X    int fill, fstat;            /* fill mode                */
X};
Xstruct implstruct impl;
X
Xstruct fpstruct {
X    char grid[FPMAX][FPMAX];
X    int nr, nc;
X};
Xstruct fpstruct fpat[MAXPATS];
X
X#define FILLMAX 2048
Xstatic double fstack[FILLMAX][2];
Xstatic short knotn, knotk;
Xstatic int ftop;
X
XFILE *pfp;
X
Xmanfeed()
X{
X    fprintf(pfp,"statusdict /manualfeed true put\n");
X}
X
Xlegal()
X{
X    fprintf(pfp,"legal initmatrix\n");
X    fprintf(pfp,"0.24 0.24 scale\n");
X    fprintf(pfp,"0 900 translate\n");
X}
X
X/************************************************************************/
X/* plotopen: open file for output, initialize plot structure            */
X/************************************************************************/
X
Xplotopen(fname)
Xchar *fname;
X{
X    FILE *fopen();
X
X    if (fname == 0 || fname[0] == '\0') pfp = stdout;
X    else pfp = fopen(fname);
X    if (pfp == NULL) {
X        fprintf(stderr,"plotopen: can't write to ps file: %s\n",fname);
X        exit(1);
X    }
X    
X    prologue();
X    
X    space(100,3200,2500,100,1);
X    frame(100,3200,2500,100,1);
X    bppin(8);
X    bppout(1);
X    gray(255);
X    linemod("1");
X    fillpat(0,1,8,"1");
X    font("sr");
X    fspec(1.0,1.0,0.0);
X    impl.fill = 0;
X    impl.fstat = 0;
X
X}
X
X/************************************************************************/
X/* frame: specify frame buffer coordinate system                        */
X/************************************************************************/
X
Xframe(x1,y1,x2,y2,hv)
Xshort x1,y1,x2,y2,hv;
X{
X    impl.r1 = x1; impl.c1 = y1;
X    impl.r2 = x2; impl.c2 = y2;
X    impl.dhv = hv;
X    impl.rr = x2 - x1; impl.cr = y2 - y1;
X}
X
Xhvmatch()
X{
X    if (impl.uhv = impl.dhv) return(1);
X    return(0);
X}
X
X/************************************************************************/
X/* bppout: set number of bits per pixel for output                      */
X/************************************************************************/
X
Xbppout(b)
Xshort b;
X{
X    if (b) impl.fbpp = 1;
X    else impl.fbpp = 0;
X}
X
X/************************************************************************/
X/* bppin: set number of bits per pixel for input                        */
X/************************************************************************/
X
Xbppin(b)
Xshort b;
X{
X    impl.ubpp = b;
X    impl.ubppr = (1 << b) - 1;
X}
X
X/************************************************************************/
X/* plotclose: end it all                                                */
X/************************************************************************/
X
Xplotclose()
X{   
X    epilogue();
X    fclose(pfp);
X}
X
X/************************************************************************/
X/* space: define user coordinate system                                 */
X/************************************************************************/
X
Xspace(x1,y1,x2,y2,hv)
Xshort x1, y1, x2, y2, hv;
X{
X    impl.x1 = x1; impl.y1 = y1;
X    impl.x2 = x2; impl.y2 = y2;
X    impl.xr = x2 - x1; 
X    impl.yr = y2 - y1; 
X    impl.uhv = hv;
X}
X
X/************************************************************************/
X/* erase: reset frame buffer                                            */
X/************************************************************************/
X
Xerase()
X{
X    fprintf(pfp,"showpage\n");
X}
X
X/************************************************************************/
X/* move: change the current point to (x, y).                            */
X/************************************************************************/
X
Xmove(x,y)
Xshort x, y;
X{
X    impl.xc = x; impl.yc = y;
X    dblmove();
X}
X
Xdblmove()
X{
X    scale(impl.xc,impl.yc);
X    
X    if ((impl.fill) && (impl.fstat)) {
X        fstack[ftop][0] = impl.rc;
X        fstack[ftop][1] = impl.cc;
X        ftop++;
X        impl.fstat = 0;
X    }
X    PSmoveto(impl.rc,impl.cc);
X}
X
X/************************************************************************/
X/* scale: convert user coordinates to frame coordinates                 */
X/************************************************************************/
X
Xscale(x,y)
Xdouble x,y;
X{
X    if (impl.uhv != impl.dhv) {
X        impl.cc = impl.c1 + (x - impl.x1) * (impl.cr / impl.xr);
X        impl.rc = impl.r1 + (y - impl.y1) * (impl.rr / impl.yr);
X    }
X    else {
X        impl.rc = impl.r1 + (x - impl.x1) * (impl.rr / impl.xr);
X        impl.cc = impl.c1 + (y - impl.y1) * (impl.cr / impl.yr);
X    }
X}
X
X/************************************************************************/
X/* point: plot a point                                                  */
X/************************************************************************/
X
Xpoint(x,y)
Xshort x, y;
X{   
X    scale((double)x,(double)y);
X
X    PSpoint(impl.rc,impl.cc);
X    PSstroke();
X}
X
X/************************************************************************/
X/* cont: line generator. Draws a line from current point to (x, y)      */
X/*       uses the line mask to decide when to set pixels.               */
X/************************************************************************/
X
Xcont(x,y)
Xshort x, y;
X{
X    double r1, c1, r2, c2;
X    
X    r1 = impl.rc; c1 = impl.cc; 
X    scale((double)x,(double)y);
X    r2 = impl.rc; c2 = impl.cc; 
X    imdraw(r1,c1,r2,c2);
X    PSstroke();
X}
X
Ximdraw(r1,c1,r2,c2)
Xdouble r1,c1,r2,c2;
X{
X    double rinc, cinc, length, tlen, r, c, fabs();
X    int i, state;
X    
X    /* if the this line is part of a polygon, stack the point for later fill */ 
X    if (impl.fill) {
X        fstack[ftop][0] = r2;
X        fstack[ftop][1] = c2;
X        ftop++;
X        if (ftop >= FILLMAX) {
X            fprintf(stderr,"plvfs: fill stack overflow\n");
X            exit(1);
X        }
X    }
X
X    PSlineto(r2,c2);
X}
X
X/************************************************************************/
X/* line: draw a line                                                    */
X/************************************************************************/
X
Xline(x1,y1,x2,y2)
Xshort x1, y1, x2, y2;
X{
X    move(x1,y1);
X    cont(x2,y2);
X}
X
X/************************************************************************/
X/* polygon: filled polygon                                              */
X/************************************************************************/
X
Xpolygon(n,v)
Xshort n, *v;
X{
X    int i, p;
X    double x, y;
X
X    ftop = n;
X    p = 0;
X
X    for (i = 0; i < n; i++) {
X        x = v[p++]; y = v[p++];
X        scale(x,y);
X        fstack[i][0] = impl.rc;
X        fstack[i][1] = impl.cc;
X    }
X
X    drawpolygon(ftop,fstack);
X}
X
Xdrawpolygon(top,stack)
Xshort top;
Xdouble *stack;
X{
X    short p, i;
X    double x,y;
X    
X    p = impl.fpn;
X
X    fprintf(pfp,"gsave\n"); 
X    fprintf(pfp,"pat%d %d %d 300 32 div setpattern\n",
X        p,fpat[p].nr,fpat[p].nc / 8);
X
X    p = 0;
X    x = stack[p++]; y = stack[p++];
X    PSmoveto(x,y);
X    for (i = 1; i < top; i++) {
X        x = stack[p++];
X        y = stack[p++];
X        PSlineto(x,y);
X    }
X    
X    PSfill();
X    fprintf(pfp,"grestore\n");  
X}
X
X/************************************************************************/
X/* bspline: order k spline from Newmann & Sproull                       */
X/************************************************************************/
X
Xbspline(k,n,v)
Xshort k,n,*v;
X{
X    double u, du, ufin, x, y, x0,y0;
X    short nn;
X    
X    nn = n - 1;
X    ufin = (double)(nn - k + 2);
X    du = ufin / (500.0 + (double)nn);
X    
X    u = 0.0;
X    Bpoint(&x,&y,0.0,nn,k,v);
X    scale(x,y);
X    PSmoveto(impl.rc,impl.cc);
X    x0 = impl.rc, y0 = impl.cc;
X    
X    while (u <= ufin) {
X        u = u + du;
X        Bpoint(&x,&y,u,n,k,v);
X        scale(x,y);
X        imdraw(impl.rc,impl.cc,x0,y0);
X        x0 = impl.rc, y0 = impl.cc;
X    }
X    x = v[nn*2];
X    y = v[nn*2 + 1];
X    scale(x,y);
X    imdraw(impl.rc,impl.cc,x0,y0);
X    PSstroke();
X}
X
XBpoint(x,y,u,n,k,v)
Xdouble *x,*y,u;
Xint n,k;
Xshort *v;
X{
X    int i, m;
X    double b, Bnblend();
X    
X    *x = 0.0; *y = 0.0;
X    m = 0;
X    knotk = k;
X    knotn = n;
X
X    for (i = 0; i <= n; i++) {
X        b = Bnblend(i,k,u);
X        *x = *x + (double)(v[m]) * b;
X        *y = *y + (double)(v[m+1]) * b;
X        m += 2;
X    }
X}
X
XBknot(i)
Xint i;
X{
X    if (i < knotk) return(0);
X    else if (i > knotn) return(knotn - knotk + 2);
X    else return(i - knotk + 1);
X}
X
Xdouble Bnblend(i,k,u)
Xint i,k;
Xdouble u;
X{
X    double v, v1, v2, t1, t2, abs();
X    
X    v1 = 0.0; v2 = 0.0; t1 = 0.0; t2 = 0.0;
X    
X    if (k == 1) {
X        if ((Bknot(i) <= u) && (u < Bknot(i+1))) v = 1.0;
X        else v = 0.0;
X    }
X    else {
X        t1 = Bknot(i+k-1) - Bknot(i);
X        if (t1 != 0) v1 = (u - Bknot(i)) * Bnblend(i,k-1,u) / t1;
X
X        t2 = Bknot(i+k) - Bknot(i+1);
X        if (t2 != 0) v2 = (Bknot(i+k) - u) * Bnblend(i+1,k-1,u) / t2;
X        
X        v = v1 + v2;
X    }
X    return(v);
X}
X
X/************************************************************************/
X/* chain: polyline                                                      */
X/************************************************************************/
X
Xchain(n,v)
Xshort n, *v;
X{
X    int i, p;
X    short x, y;
X    double r1,c1,r2,c2;
X    
X    p = 0;
X    x = v[p++]; y = v[p++];
X    move(x,y);
X    r1 = impl.rc; c1 = impl.cc;
X
X    for (i = 1; i < n; i++) {
X        x = v[p++]; y = v[p++];
X        scale((double)x,(double)y);
X        r2 = impl.rc; c2 = impl.cc; 
X        imdraw(r1,c1,r2,c2);
X        r1 = r2; c1 = c2;
X    }
X    PSstroke();
X}
X
X/************************************************************************/
X/* moverel: relative move                                               */
X/************************************************************************/
X
Xmoverel(x,y)
Xshort x, y;
X{
X    impl.xc += (double)x; impl.yc += (double)y;
X    dblmove(impl.xc,impl.yc);
X}
X
Xdblmoverel(x,y)
Xdouble x, y;
X{
X    impl.xc += x; impl.yc += y;
X    dblmove(impl.xc,impl.yc);
X}
X
X/************************************************************************/
X/* contrel: relative cont                                               */
X/************************************************************************/
X
Xcontrel(x,y)
Xshort x, y;
X{
X    double r1, c1, r2, c2;
X
X    r1 = impl.rc; c1 = impl.cc; 
X    impl.xc += (double)x; impl.yc += (double)y;
X    scale(impl.xc,impl.yc);
X    r2 = impl.rc; c2 = impl.cc; 
X    imdraw(r1,c1,r2,c2);
X    PSstroke();
X}
X
Xdblcontrel(x,y)
Xdouble x, y;
X{
X    double r1, c1, r2, c2;
X    
X    r1 = impl.rc; c1 = impl.cc; 
X    impl.xc += x; impl.yc += y;
X    scale(impl.xc,impl.yc);
X    r2 = impl.rc; c2 = impl.cc; 
X    imdraw(r1,c1,r2,c2);
X}
X
X/************************************************************************/
X/* gray: set the current gray level                                     */
X/************************************************************************/
X
Xgray(g)
Xshort g;
X{   
X    double og;
X    if (impl.fbpp) {
X        og = (255.0 - (double)g) / 255.0;
X        fprintf(pfp,"%.2f setgray\n",og);
X    }
X    else if (g) fprintf(pfp,"0 setgray\n");
X    else fprintf(pfp,"1 setgray\n");
X}
X
X/************************************************************************/
X/* colour: set the current colour                                       */
X/************************************************************************/
X
Xcolour(r,g,b)
Xshort r,g,b;
X{
X    double og;
X
X    if (impl.fbpp) {
X        og = (765.0 - (double)(r+g+b)) / 765.0;
X        fprintf(pfp,"%.2f setgray\n",og);
X    }
X    else if (r+g+b) fprintf(pfp,"0 setgray\n");
X    else fprintf(pfp,"1 setgray\n");
X}
X
X/************************************************************************/
X/* pensize: set the pen size                                            */
X/************************************************************************/
X
Xpensize(p)
Xshort p;
X{
X    impl.dot = p;
X    PSsetlinewidth(p);
X}
X
X/************************************************************************/
X/* linemod: change the line generator mask                              */
X/*          this mask should be a string of 1s and 0s. The line         */
X/*          generator (imcont) will set the pixels under a "1".         */ 
X/************************************************************************/
X
Xlinemod(str)
Xchar *str;
X{
X    int l,p,s,nz;
X    
X    nz = 1;
X    s = 1;
X    l = 0;
X    
X    fprintf(pfp,"[");
X    for (p = 0; str[p] != '\0'; p++) {
X        if (s) {
X            if (str[p] == '1') l++;
X            else {
X                fprintf(pfp,"%d ",l);
X                l = 1;
X                s = 0;
X                nz = 0;
X            }
X        }
X        else {
X            if (str[p] != '1') l++;
X            else {
X                fprintf(pfp,"%d ",l);
X                l = 1;
X                s = 1;
X            }
X        }
X    }
X    if (nz) fprintf(pfp,"]");
X    else if (s) fprintf(pfp,"%d 0]",l);
X    else fprintf(pfp,"%d]",l);
X
X    fprintf(pfp," 0 setdash\n",l);
X}
X
X/************************************************************************/
X/* startp: start filled polygon                                         */
X/************************************************************************/
X
Xstartp()
X{
X    impl.fill = 1;
X    impl.fstat = 1;
X    ftop = 0;
X}
X
X/************************************************************************/
X/* endp: end filled polygon                                             */
X/************************************************************************/
X
Xendp()
X{
X    drawpolygon(ftop,fstack);
X    impl.fill = 0;
X    ftop = 0;
X}
X
X/************************************************************************/
X/* arc: draw an arc from x1 y1 to x2 y2, with center at xc xy       */
X/************************************************************************/
X
Xarc(xc,yc,x1,y1,x2,y2)
Xshort xc,yc,x1,y1,x2,y2;
X{
X    double a1, a2, rad, pi, hypot(), acos();
X    double r1, c1, r2, c2, rr, rc;
X    
X    pi = acos(-1.0);
X
X    rad = hypot((double)(x1-xc),(double)(y1-yc));
X    
X    /* find the angles a1 and a2 */
X    
X    if (y1 >= yc) a1 = acos((x1-xc)/rad);
X    else a1 = pi + acos((xc-x1)/rad);
X
X    if (y2 >= yc) a2 = acos((x2-xc)/rad);
X    else a2 = pi + acos((xc-x2)/rad);
X
X    scale((double)xc,(double)yc);
X    r1 = impl.rc; c1 = impl.cc;
X    scale((double)xc+rad,(double)yc+rad);
X    r2 = impl.rc; c2 = impl.cc;
X
X    rr = r2 - r1; rc = c2 - c1;
X
X    if (rr < 0) rr *= -1.0;
X    if (rc < 0) rc *= -1.0;
X
X    fprintf(pfp,"newpath %.2f %.2f %.2f %.2f %.2f %.2f ellipse\n",
X        c1,r1,rc,rr,a1,a2);
X    PSstroke();
X}
X
X/************************************************************************/
X/* circle: simple incremental circle generator                      */
X/************************************************************************/
X
Xcircle(x1,y1,r)
Xshort x1,y1,r;
X{
X    arc(x1,y1,x1-r,y1,x1+r,y1);
X    arc(x1,y1,x1+r,y1,x1-r,y1);
X}
X
X/************************************************************************/
X/* fillpat: set fill pattern                                            */
X/************************************************************************/
X
Xfillpat(n,r,c,str)
Xshort n, r, c;
Xchar *str;
X{
X    int pr, pc, p, pat[32][32], nbyte, byte;
X    unsigned int bval;
X
X    if (c % 8) {
X        fprintf(stderr,"fillpat %d %d %c: ncols must be a multiple of 8\n",
X            n,r,c);
X        return(0);
X    }
X    
X    fpat[n].nr = r;
X    fpat[n].nc = c;
X    p = 0;
X    
X    for (pr = 0; pr < r; pr++) 
X        for (pc = 0; pc < c; pc++) {
X            if (str[p++] == '1') fpat[n].grid[pr][pc] = 1;
X            else fpat[n].grid[pr][pc] = 0;
X            if (str[p] == '\0') p = 0;
X        }
X    
X    fprintf(pfp,"/pat%d <",n);
X    
X    p = 0;
X    nbyte = r * c / 8;
X
X    for (byte = 0; byte < nbyte; byte++) {
X        bval = 0;
X        for (pc = 7; pc >= 0; pc--) {
X            if (str[p++] == '1') bval |= 1 << pc;
X            if (str[p] == '\0') p = 0;
X        }
X        if (bval < 16) fprintf(pfp,"0");
X        fprintf(pfp,"%x",bval);
X    }
X    fprintf(pfp,"> def\n",n);
X    
X    setpat(n);
X}
X
X/************************************************************************/
X/* setpat: set texture                                                  */
X/************************************************************************/
X
Xsetpat(p)
Xshort p;
X{   
X    impl.fpn = p;
X}
X
X/************************************************************************/
X/* area: fill area from seed point - boundary is non-current value      */
X/************************************************************************/
X
Xarea(x,y)
Xshort x, y;
X{
X/* AREA NOT IMPLEMENTED */
X}
X
Xcomment(str)
Xchar *str;
X{
X    PScomment(str);
X}
X
Xdonelabel()
X{
X    PSstroke();
X}
X
XPSerasepage()
X{
X    fprintf(pfp,"erasepage\n");
X}
X
XPSmoveto(x,y)
Xdouble x,y;
X{
X    fprintf(pfp,"%.2f %.2f moveto\n",x,y);
X}
X
XPSpoint(x,y)
Xdouble x,y;
X{
X    fprintf(pfp,"%.2f %.2f point\n",x,y);
X}
X
XPSlineto(x,y)
Xdouble x,y;
X{
X    fprintf(pfp,"%.2f %.2f lineto\n",x,y);
X}
X
XPSstroke()
X{
X    fprintf(pfp,"stroke\n");
X    fprintf(pfp,"%.2f %.2f moveto\n",impl.rc,impl.cc);
X}
X
XPSfill()
X{
X    fprintf(pfp,"fill\n");
X    fprintf(pfp,"%.2f %.2f moveto\n",impl.rc,impl.cc);
X}
X
XPSsetlinewidth(w)
Xshort w;
X{
X    fprintf(pfp,"%d setlinewidth\n",w);
X}
X
XPScomment(str)
Xchar *str;
X{
X    fprintf(pfp,"%% %s\n",str);
X}
X
Xprologue()
X{
X    fprintf(pfp,"gsave\n");
X    fprintf(pfp,"initgraphics\n");
X    fprintf(pfp,"0.24 0.24 scale\n");
X    fprintf(pfp,"/mtrx matrix def\n");
X    fprintf(pfp,"/bitison {\n");
X    fprintf(pfp,"    /ybit exch def\n");
X    fprintf(pfp,"    /xbit exch def\n");
X    fprintf(pfp,"    bstring ybit bwidth mul xbit 8 idiv add get\n");
X    fprintf(pfp,"    1 7 xbit 8 mod sub bitshift and 0 ne\n");
X    fprintf(pfp,"} def\n");
X    fprintf(pfp,"/setpattern {\n");
X    fprintf(pfp,"    /freq    exch def\n");
X    fprintf(pfp,"    /bwidth  exch def\n");
X    fprintf(pfp,"    /bpside  exch def\n");
X    fprintf(pfp,"    /bstring exch def\n");
X    fprintf(pfp,"    /onbits     0 def\n");
X    fprintf(pfp,"    /offbits    0 def\n");
X    fprintf(pfp,"    freq 0\n");
X    fprintf(pfp,"    {\n");
X    fprintf(pfp,"        /y exch def\n");
X    fprintf(pfp,"        /x exch def\n");
X    fprintf(pfp,"        /xindex x 1 add 2 div bpside mul cvi def\n");
X    fprintf(pfp,"        /yindex y 1 add 2 div bpside mul cvi def\n");
X    fprintf(pfp,"        xindex yindex bitison\n");
X    fprintf(pfp,"            {/onbits  onbits  1 add def 1}\n");
X    fprintf(pfp,"            {/offbits offbits 1 add def 0}\n");
X    fprintf(pfp,"        ifelse\n");
X    fprintf(pfp,"    } setscreen\n");
X    fprintf(pfp,"    {} settransfer\n");
X    fprintf(pfp,"    offbits offbits onbits add div setgray\n");
X    fprintf(pfp,"} def\n");
X    fprintf(pfp,"/point {\n");
X    fprintf(pfp,"    /x exch def\n");
X    fprintf(pfp,"    /y exch def\n");
X    fprintf(pfp,"    y x moveto\n");
X    fprintf(pfp,"    y 0.01 add x lineto\n");
X    fprintf(pfp,"} def\n");
X    fprintf(pfp,"/ellipse {\n");
X    fprintf(pfp,"    /a2 exch def\n");
X    fprintf(pfp,"    /a1 exch def\n");
X    fprintf(pfp,"    /rx exch def\n");
X    fprintf(pfp,"    /ry exch def\n");
X    fprintf(pfp,"    /xc exch def\n");
X    fprintf(pfp,"    /yc exch def\n");
X    fprintf(pfp,"    /savematrix mtrx currentmatrix def\n");
X    fprintf(pfp,"    xc yc translate\n");
X    fprintf(pfp,"    rx ry scale\n");
X    fprintf(pfp,"    0 0 1 a1 a2 arc\n");
X    fprintf(pfp,"    savematrix setmatrix\n");
X    fprintf(pfp,"} def\n");
X    fprintf(pfp,"1 setlinewidth\n");
X    fprintf(pfp,"1 setlinecap\n");
X    fprintf(pfp,"1 setlinejoin\n");
X}
X
Xepilogue()
X{
X    fprintf(pfp,"stroke\n");
X    fprintf(pfp,"showpage\n");
X    fprintf(pfp,"grestore\n");
X    fprintf(pfp,"end\n");
X}
!FUNKY!STUFF!
echo
echo finished part 4 of 8

majka@ubc-vision.UUCP (Marc Majka) (04/28/86)

- - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - -
#!/bin/sh
#
# shell archive - extract with /bin/sh
#
echo Plot archive part 5 of 8
echo
echo extracting file pltx.c
sed 's/^X//' > pltx.c <<'!FUNKY!STUFF!'
X/*************************************************************/
X/*                                                           */
X/*  Copyright (c) 1986                                       */
X/*  Marc S. Majka - UBC Laboratory for Computational Vision  */
X/*                                                           */
X/*  Permission is hereby granted to copy all or any part of  */
X/*  this program for free distribution.   The author's name  */
X/*  and this copyright notice must be included in any copy.  */
X/*                                                           */
X/*************************************************************/
X
X#include <stdio.h>
X
Xmain (argc, argv)
Xint argc;
Xchar *argv[];
X{
X    FILE *pfp, *fopen();
X    
X    if (argc > 1) pfp = fopen(argv[1],"r");
X    else pfp = stdin;
X    
X    if (pfp == NULL) {
X        fprintf(stderr,"pltx: can't open input plot file\n");
X        exit(1);
X    }
X    if (argc > 2) plotopen(argv[2]);
X    else plotopen("");
X    
X    plotdriver();
X    plotclose();
X    fclose(pfp);
X    exit(0);
X}
!FUNKY!STUFF!
echo extracting file pltx.man
sed 's/^X//' > pltx.man <<'!FUNKY!STUFF!'
XPLTX(1)         UNIX Programmer's Manual          PLTX(1)
X
X
XNAME
X     pltx - converts plot files to text files
X
XSYNOPSIS
X     pltx [plot-file [text-file]]
X
XDESCRIPTION
X     pltx reads a plot file and writes a text file. It is the
X     inverse of txpl(1-UBC). See the manual for fplot for a 
X     description of plot files.
X
XAUTHOR
X     Marc Majka
!FUNKY!STUFF!
echo extracting file rplot.c
sed 's/^X//' > rplot.c <<'!FUNKY!STUFF!'
X/*************************************************************/
X/*                                                           */
X/*  Copyright (c) 1986                                       */
X/*  Marc S. Majka - UBC Laboratory for Computational Vision  */
X/*                                                           */
X/*  Permission is hereby granted to copy all or any part of  */
X/*  this program for free distribution.   The author's name  */
X/*  and this copyright notice must be included in any copy.  */
X/*                                                           */
X/*************************************************************/
X
X#include <stdio.h>
X
Xgetarg(desig,argc,argv)
Xint argc;
Xchar *desig, *argv[];
X{
X    int argn;
X    char minus[2], lookfor[12];
X   
X    strcpy(minus,"-");
X    strcpy(lookfor,minus);
X    strcat(lookfor,desig);
X
X    for (argn = 1; argn < argc; argn++) 
X        if (!strcmp(argv[argn],lookfor)) return(argn);
X
X    return (0);
X}
X
X#define GETARG(X) getarg(X,argc,argv)
X
Xmain (argc, argv)
Xint argc;
Xchar *argv[];
X{
X    FILE *plt, *fopen();
X    int argn, nargs, nrows, ncols, sized;
X    char nullname[2];
X    
X    if (GETARG("help")) {
X        printf("useage: rpl [[plotfile] rasterfile] [-r n] [-c n]\n");
X        printf("  plotfile   is the input plot file\n");
X        printf("  rasterfile is the output raster file\n");
X        printf("  -r         nrows [default = 256]\n");
X        printf("  -c         ncols [default = 256]\n");
X        exit(0);
X    }
X
X    nargs = argc - 1;
X    sized = 0;
X
X    nrows = GETARG("r");
X    if (nrows) {
X        nrows = atoi(argv[++nrows]);
X        sized = 1;
X        nargs -= 2;
X    }
X    ncols = GETARG("c");
X    if (ncols) {
X        ncols = atoi(argv[++ncols]);
X        sized = 1;
X        nargs -= 2;
X    }
X    else ncols = nrows;
X
X    if (nargs == 0) {
X        plt = stdin;
X        plotopen("");
X    }
X    else if (nargs == 1) {
X        plt = stdin;
X        plotopen(argv[1]);
X    }
X    else {
X        plt = fopen(argv[1],"r");
X        plotopen(argv[2]);
X    }
X
X    if (plt == NULL) {
X        printf("rpl: can't open plot file\n");
X        exit(1);
X    }
X
X    if (sized) frame(0,0,nrows-1,ncols-1,0);
X    plotdriver(plt);
X    plotclose();
X    exit(0);
X}
!FUNKY!STUFF!
echo extracting file rplot.man
sed 's/^X//' > rplot.man <<'!FUNKY!STUFF!'
XRPLOT(1)    UNIX Programmer's Manual     RPLOT(1)
X
XNAME
X     rplot - renders a plot file in a memory raster.
X
XSYNOPSIS
X     rplot [[plotfile] rasterfile] [-r n] [-c n]
X
XDESCRIPTION
X     rplot reads a plot file, and executes the plot commands,
X     using a file for output, rather than a device. If two
X     arguments are given, the first should be a plot file, and
X     the second will be used as the output file.  If only one
X     argument is given, it is used as the output file, and
X     plot commands are read from standard input. If none are
X     given, output will be to standard output. See the manual
X     page for fplot(3) for a description of the plot file
X     format used by rplot.
X
X     Any options to must be given after the input and output file
X     names. The options recognized are:
X
X     -r the next parameter given is to be used as the number of
X        rows in the output raster.  A frame command will override
X        this setting.
X
X     -c sets the number of output columns, as above. If the -r
X        option is given without a -c option, the number of
X        columns will be the same as the number of rows.
X
XLIMITATIONS
X     Maximum image size is 512 x 512 x 32 bpp. Can be recompiled
X     if you need more.
X
XAUTHOR
X     Marc Majka
!FUNKY!STUFF!
echo extracting file txfns.c
sed 's/^X//' > txfns.c <<'!FUNKY!STUFF!'
X/*************************************************************/
X/*                                                           */
X/*  Copyright (c) 1986                                       */
X/*  Marc S. Majka - UBC Laboratory for Computational Vision  */
X/*                                                           */
X/*  Permission is hereby granted to copy all or any part of  */
X/*  this program for free distribution.   The author's name  */
X/*  and this copyright notice must be included in any copy.  */
X/*                                                           */
X/*************************************************************/
X
X#include <stdio.h>
X
Xstatic FILE *tfp;
X
Xplotopen(fname)
Xchar *fname;
X{
X    FILE *fopen();
X    
X    if (fname[0] == '\0') tfp = stdout;
X    else tfp = fopen(fname,"w");
X
X    if (tfp == NULL) {
X        fprintf(stderr,"plotopen: can't open output text file %s\n",fname);
X        exit(1);
X    }
X}
X
Xplotclose()
X{
X    fclose(tfp);
X}
X
Xmove(x1,y1)
Xshort x1,y1;
X{
X    fprintf(tfp,"move    %hd %hd\n",x1,y1);
X}
X
Xcont(x1,y1)
Xshort x1,y1;
X{
X    fprintf(tfp,"cont    %hd %hd\n",x1,y1);
X}
X
Xbspline(k,n,v)
Xshort k, n, *v;
X{
X    short vn, indx, x, y;
X
X    fprintf(tfp,"bspline %hd %hd\n",k,n);
X    indx = 0;
X    for (vn = 0; vn < n; vn++) {
X        x = v[indx++]; y = v[indx++];
X        fprintf(tfp,"        %hd %hd\n",x,y);
X    }
X}
X
Xpolygon(n,v)
Xshort n, *v;
X{
X    short vn, indx, x, y;
X
X    fprintf(tfp,"polygon %hd\n",n);
X    indx = 0;
X    for (vn = 0; vn < n; vn++) {
X        x = v[indx++]; y = v[indx++];
X        fprintf(tfp,"        %hd %hd\n",x,y);
X    }
X}
X
Xchain(n,v)
Xshort n, *v;
X{
X    short vn, indx, x, y;
X
X    fprintf(tfp,"chain   %hd\n",n);
X    indx = 0;
X    for (vn = 0; vn < n; vn++) {
X        x = v[indx++]; y = v[indx++];
X        fprintf(tfp,"        %hd %hd\n",x,y);
X    }
X}
X
Xmoverel(x1,y1)
Xshort x1,y1;
X{
X    fprintf(tfp,"moverel %hd %hd\n",x1,y1);
X}
X
Xcontrel(x1,y1)
Xshort x1,y1;
X{
X    fprintf(tfp,"contrel %hd %hd\n",x1,y1);
X}
X
Xarea(x1,y1)
Xshort x1,y1;
X{
X    fprintf(tfp,"area    %hd %hd\n",x1,y1);
X}
X
Xpoint(x1,y1)
Xshort x1,y1;
X{
X    fprintf(tfp,"point   %hd %hd\n",x1,y1);
X}
X
Xline(x1,y1,x2,y2)
Xshort x1,y1,x2,y2;
X{
X    fprintf(tfp,"line    %hd %hd %hd %hd\n",x1,y1,x2,y2);
X}
X
Xlabel(str)
Xchar *str;
X{
X    fprintf(tfp,"label   %s\n",str);
X}
X
Xclabel(str)
Xchar *str;
X{
X    fprintf(tfp,"clabel  %s\n",str);
X}
X
Xblabel(w,h,str)
Xshort w,h;
Xchar *str;
X{
X    fprintf(tfp,"blabel  %hd %hd %s\n",w,h,str);
X}
X
Xllabel(w,h,str)
Xshort w,h;
Xchar *str;
X{
X    fprintf(tfp,"llabel  %hd %hd %s\n",w,h,str);
X}
X
Xcomment(str)
Xchar *str;
X{
X    fprintf(tfp,"comment %s\n",str);
X}
X
Xfont(str)
Xchar *str;
X{
X    fprintf(tfp,"font    %s\n",str);
X}
X
Xfspec(ws,hs,theta)
Xdouble ws,hs,theta;
X{
X    fprintf(tfp,"fspec   %lf %lf %lf\n",ws,hs,theta);
X}
X
Xfillpat(pn,x1,y1,str)
Xshort pn,x1,y1;
Xchar *str;
X{
X    int i,j;
X    
X    fprintf(tfp,"fillpat %hd %hd %hd\n",pn,x1,y1);
X    pn = 0;
X    for (i = 0; i < x1; i++) {
X        fprintf(tfp,"\t");
X        for (j = 0; j < y1; j++) fprintf(tfp,"%c",str[pn++]);
X        fprintf(tfp,"\n");
X    }
X}
X
Xsetpat(pn)
Xshort pn;
X{
X    fprintf(tfp,"setpat  %hd\n",pn);
X}
X
Xpensize(pn)
Xshort pn;
X{
X    fprintf(tfp,"pensize %hd\n",pn);
X}
X
Xarc(x1,y1,x2,y2,x3,y3)
Xshort x1,y1,x2,y2,x3,y3;
X{
X    fprintf(tfp,"arc     %hd %hd %hd %hd %hd %hd\n",x1,y1,x2,y2,x3,y3);
X}
X
Xcircle(x1,y1,r)
Xshort x1,y1,r;
X{
X    fprintf(tfp,"circle  %hd %hd %hd\n",x1,y1,r);
X}
X
Xerase()
X{
X    fprintf(tfp,"erase\n");
X}
X
Xstartp()
X{
X    fprintf(tfp,"startp\n");
X}
X
Xendp()
X{
X    fprintf(tfp,"endp\n");
X}
X
Xlinemod(str)
Xchar *str;
X{
X    fprintf(tfp,"linemod %s\n",str);
X}
X
Xframe(x1,y1,x2,y2,hv)
Xshort x1,y1,x2,y2,hv;
X{
X    fprintf(tfp,"frame   %hd %hd %hd %hd %hd\n",x1,y1,x2,y2,hv);
X}
X
Xbppin(b)
Xshort b;
X{
X    fprintf(tfp,"bppin   %hd\n",b);
X}
X
Xbppout(b)
Xshort b;
X{
X    fprintf(tfp,"bppout  %hd\n",b);
X}
X
Xspace(x1,y1,x2,y2,hv)
Xshort x1,y1,x2,y2,hv;
X{
X    fprintf(tfp,"space   %hd %hd %hd %hd %hd\n",x1,y1,x2,y2,hv);
X}
X
Xgray(g)
Xshort g;
X{
X    fprintf(tfp,"gray    %hd\n",g);
X}
X
Xcolour(red,green,blue)
Xshort red,green,blue;
X{
X    fprintf(tfp,"colour  %hd %hd %hd\n",red,green,blue);
X}
!FUNKY!STUFF!
echo extracting file txpl.c
sed 's/^X//' > txpl.c <<'!FUNKY!STUFF!'
X/*************************************************************/
X/*                                                           */
X/*  Copyright (c) 1986                                       */
X/*  Marc S. Majka - UBC Laboratory for Computational Vision  */
X/*                                                           */
X/*  Permission is hereby granted to copy all or any part of  */
X/*  this program for free distribution.   The author's name  */
X/*  and this copyright notice must be included in any copy.  */
X/*                                                           */
X/*************************************************************/
X
X#include <stdio.h>
X
Xmain (argc, argv)
Xint argc;
Xchar *argv[];
X{
X    char str[1024], comm[16], nl, c;
X    int i, patn;
X    short x1, y1, x2, y2, x3, y3, r, gray, red, green, blue, hv, pn, n, k;
X    FILE *tfp, *pfp, *fopen();
X    double ws, hs, theta;
X    
X    if (argc > 1) tfp = fopen(argv[1],"r");
X    else tfp = stdin;
X    
X    if (tfp == NULL) {
X        fprintf(stderr,"txpl: can't open input text file\n");
X        exit(1);
X    }
X
X    if (argc > 2) pfp = fopen(argv[2],"w");
X    else pfp = stdout;
X    
X    if (pfp == NULL) {
X        fprintf(stderr,"txpl: can't open output plot file\n");
X        exit(1);
X    }
X    
X    while (fscanf(tfp,"%s", comm) != EOF) {
X            if (0 == strcmp(comm,"move")) {
X                fscanf(tfp,"%hd%hd",
X                    &x1,&y1);
X                fprintf(pfp,"m");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"cont")) {
X                fscanf(tfp,"%hd%hd",
X                    &x1,&y1);
X                fprintf(pfp,"n");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"bspline")) {
X                fscanf(tfp,"%hd",&k);
X                fscanf(tfp,"%hd",&n);
X                fprintf(pfp,"k");
X                fwrite(&k,2,1,pfp);
X                fwrite(&n,2,1,pfp);
X                for (i = 0; i < n; i++) {
X                    fscanf(tfp,"%hd%hd",&x1,&y1);
X                    fwrite(&x1,2,1,pfp);
X                    fwrite(&y1,2,1,pfp);
X                }
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"bsphd")) {
X                fscanf(tfp,"%hd",&k);
X                fscanf(tfp,"%hd",&n);
X                fprintf(pfp,"k");
X                fwrite(&k,2,1,pfp);
X                fwrite(&n,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"bsppt")) {
X                fscanf(tfp,"%hd%hd",&x1,&y1);
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"polygon")) {
X                fscanf(tfp,"%hd",&n);
X                fprintf(pfp,"o");
X                fwrite(&n,2,1,pfp);
X                for (i = 0; i < n; i++) {
X                    fscanf(tfp,"%hd%hd",&x1,&y1);
X                    fwrite(&x1,2,1,pfp);
X                    fwrite(&y1,2,1,pfp);
X                }
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"polyhd")) {
X                fscanf(tfp,"%hd",&n);
X                fprintf(pfp,"o");
X                fwrite(&n,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"polypt")) {
X                fscanf(tfp,"%hd%hd",&x1,&y1);
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"chain")) {
X                fscanf(tfp,"%hd",&n);
X                fprintf(pfp,"L");
X                fwrite(&n,2,1,pfp);
X                for (i = 0; i < n; i++) {
X                    fscanf(tfp,"%hd%hd",&x1,&y1);
X                    fwrite(&x1,2,1,pfp);
X                    fwrite(&y1,2,1,pfp);
X                }
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"chainhd")) {
X                fscanf(tfp,"%hd",&n);
X                fprintf(pfp,"L");
X                fwrite(&n,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"chainpt")) {
X                fscanf(tfp,"%hd%hd",&x1,&y1);
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"moverel")) {
X                fscanf(tfp,"%hd%hd",&x1,&y1);
X                fprintf(pfp,"M");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"contrel")) {
X                fscanf(tfp,"%hd%hd",
X                    &x1,&y1);
X                fprintf(pfp,"N");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"point")) {
X                fscanf(tfp,"%hd%hd",
X                    &x1,&y1);
X                fprintf(pfp,"p");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"area")) {
X                fscanf(tfp,"%hd%hd",&x1,&y1);
X                fprintf(pfp,"A");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"line")) {
X                fscanf(tfp,"%hd%hd%hd%hd",
X                    &x1,&y1,&x2,&y2);
X                fprintf(pfp,"l");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fwrite(&x2,2,1,pfp);
X                fwrite(&y2,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"label")) {
X                fscanf(tfp,"%1s",&c);
X                i = 0;
X                
X                while (c != '\n') {
X                    str[i++] = c;
X                    fscanf(tfp,"%c",&c);
X                }
X                str[i] = '\0';
X                fprintf(pfp,"t%s\n",str);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"clabel")) {
X                fscanf(tfp,"%1s",&c);
X                i = 0;
X                
X                while (c != '\n') {
X                    str[i++] = c;
X                    fscanf(tfp,"%c",&c);
X                }
X                str[i] = '\0';
X                fprintf(pfp,"%%%s\n",str);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"blabel")) {
X                fscanf(tfp,"%hd%hd",&x1,&y1);
X                fscanf(tfp,"%1s",&c);
X                i = 0;
X                
X                while (c != '\n') {
X                    str[i++] = c;
X                    fscanf(tfp,"%c",&c);
X                }
X                str[i] = '\0';
X                fprintf(pfp,"U");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fprintf(pfp,"%s\n",str);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"llabel")) {
X                fscanf(tfp,"%hd%hd",&x1,&y1);
X                fscanf(tfp,"%1s",&c);
X                i = 0;
X                
X                while (c != '\n') {
X                    str[i++] = c;
X                    fscanf(tfp,"%c",&c);
X                }
X                str[i] = '\0';
X                fprintf(pfp,"V");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fprintf(pfp,"%s\n",str);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"comment")) {
X                fscanf(tfp,"%1s",&c);
X                i = 0;
X                
X                while (c != '\n') {
X                    str[i++] = c;
X                    fscanf(tfp,"%c",&c);
X                }
X                str[i] = '\0';
X                fprintf(pfp,";%s\n",str);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"font")) {
X                fscanf(tfp,"%s",str);
X                fprintf(pfp,"X%s\n",str);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"fspec")) {
X                fscanf(tfp,"%lf%lf%lf",&ws,&hs,&theta);
X                fprintf(pfp,"S");
X                fwrite(&ws,4,1,pfp);
X                fwrite(&hs,4,1,pfp);
X                fwrite(&theta,4,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"fillpat")) {
X                fscanf(tfp,"%hd%hd%hd",&pn,&x1,&y1);
X                fscanf(tfp,"%1s",&c);
X                patn = x1 * y1;
X                i = 0;
X                
X                while (i < patn) {
X                    if ((c != '\n') && (c != ' ') && (c != '\t'))
X                        str[i++] = c;
X                    fscanf(tfp,"%c",&c);
X                }
X                str[i] = '\0';
X                fprintf(pfp,"P");
X                fwrite(&pn,2,1,pfp);
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fprintf(pfp,"%s\n",str);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"setpat")) {
X                fscanf(tfp,"%hd",&pn);
X                fprintf(pfp,"T");
X                fwrite(&pn,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"pensize")) {
X                fscanf(tfp,"%hd",&pn);
X                fprintf(pfp,"d");
X                fwrite(&pn,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"arc")) {
X                fscanf(tfp,
X                    "%hd%hd%hd%hd%hd%hd",
X                    &x1,&y1,&x2,&y2,&x3,&y3);
X                fprintf(pfp,"a");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fwrite(&x2,2,1,pfp);
X                fwrite(&y2,2,1,pfp);
X                fwrite(&x3,2,1,pfp);
X                fwrite(&y3,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"circle")) {
X                fscanf(tfp,"%hd%hd%hd",
X                    &x1,&y1,&r);
X                fprintf(pfp,"c");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fwrite(&r,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"erase")) {
X                fprintf(pfp,"e");
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"startp")) {
X                fprintf(pfp,"[");
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"endp")) {
X                fprintf(pfp,"]");
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"linemod")) {
X                fscanf(tfp,"%s",
X                    str);
X                fprintf(pfp,"f%s\n",str);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"frame")) {
X                fscanf(tfp,"%hd%hd%hd%hd%hd",
X                    &x1,&y1,&x2,&y2,&hv);
X                fprintf(pfp,"F");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fwrite(&x2,2,1,pfp);
X                fwrite(&y2,2,1,pfp);
X                fwrite(&hv,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"bpp")) {
X                fscanf(tfp,"%hd",&x1);
X                fprintf(stderr,"warning: bpp command is out of date.\n");
X                fprintf(stderr,"  please change to bppin(b) or bppout(b)\n");
X                fprintf(stderr,"  see the manual entry for fplot(3-UBC)\n");
X                fprintf(stderr,"  assuming bppin    %hd for bpp     %hd\n",x1,x1);
X                fprintf(pfp,"B");
X                fwrite(&x1,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"bppin")) {
X                fscanf(tfp,"%hd",&x1);
X                fprintf(pfp,"B");
X                fwrite(&x1,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"bppout")) {
X                fscanf(tfp,"%hd",&x1);
X                fprintf(pfp,"b");
X                fwrite(&x1,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"space")) {
X                fscanf(tfp,"%hd%hd%hd%hd%hd",
X                    &x1,&y1,&x2,&y2,&hv);
X                fprintf(pfp,"s");
X                fwrite(&x1,2,1,pfp);
X                fwrite(&y1,2,1,pfp);
X                fwrite(&x2,2,1,pfp);
X                fwrite(&y2,2,1,pfp);
X                fwrite(&hv,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"gray")) {
X                fscanf(tfp,"%hd",&gray);
X                fprintf(pfp,"g");
X                fwrite(&gray,2,1,pfp);
X                fflush(pfp);
X            }
X            else if (0 == strcmp(comm,"colour")) {
X                fscanf(tfp,"%hd",&red);
X                fscanf(tfp,"%hd",&green);
X                fscanf(tfp,"%hd",&blue);
X                fprintf(pfp,"C");
X                fwrite(&red,2,1,pfp);
X                fwrite(&green,2,1,pfp);
X                fwrite(&blue,2,1,pfp);
X                fflush(pfp);
X            }
X            else {
X                fprintf(stderr,"txpl: unknown command %s\n", comm);
X                while ('\n' != (c = getc(tfp)));
X            }
X    }
X    fclose(pfp);
X    exit(0);
X}
X
!FUNKY!STUFF!
echo extracting file txpl.man
sed 's/^X//' > txpl.man <<'!FUNKY!STUFF!'
XTXPL(1)         UNIX Programmer's Manual          TXPL(1)
X
XNAME
X     txpl - converts text files to plot files
X
XSYNOPSIS
X     txpl [text-file [plot-file]]
X
XDESCRIPTION
X     txpl reads a text file and writes a plot file. It is the
X     inverse of pltx(1). The input text file should have 1
X     command per line, with commands and operands separated by at
X     least one space. See the manual page for fplot(3) for a
X     specification of plot files.
X
XAUTHOR
X     Marc Majka
!FUNKY!STUFF!
echo
echo finished part 5 of 8

majka@ubc-vision.UUCP (Marc Majka) (04/28/86)

- - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - -
#!/bin/sh
#
# shell archive - extract with /bin/sh
#
echo Plot archive part 6 of 8
echo
echo extracting file rplfns.c
sed 's/^X//' > rplfns.c <<'!FUNKY!STUFF!'
X/*************************************************************/
X/*                                                           */
X/*  Copyright (c) 1986                                       */
X/*  Marc S. Majka - UBC Laboratory for Computational Vision  */
X/*                                                           */
X/*  Permission is hereby granted to copy all or any part of  */
X/*  this program for free distribution.   The author's name  */
X/*  and this copyright notice must be included in any copy.  */
X/*                                                           */
X/*************************************************************/
X
X/*************************************************************/
X/*                                                           */
X/*   NOTE: The code for the vector generator (DDA) and the   */
X/*   bspline generator is based on those published in:       */
X/*                                                           */
X/*   [1] Newman, W.M. and Sproull, R.F., "Principles of      */
X/*       Interactive Computer Graphics", McGraw-Hill,        */ 
X/*       New York, 1979.                                     */
X/*                                                           */
X/*************************************************************/
X
X#include <stdio.h>
X#define GMAX 512  /* Max grid size */
X#define FPMAX 32
X#define MAXPATS 128
X#define BPPMAX 16
X#define STACKSIZE 65536
X
X/* Plot structure: contains the raster (grid), min and max defined co-ords,
X   x and y ranges, current point and current gray level, a line-generator
X   mask and a pointer for that mask, image file pointer and annotation
X   record, and max row and col. */
X
Xstruct implstruct {
X    int grid[GMAX][GMAX];       /* image raster         */
X    double x1, y1, x2, y2;      /* min and max points   */
X    double xr, yr;              /* x and y range        */
X    double xc, yc;              /* current point        */
X    int uhv;                    /* user space hv        */
X    int ubpp;                   /* user bits per pixel  */
X    double ubppr;               /* user bpp range       */
X    int bx1, by1, bx2, by2;     /* polygon bounding box */
X    int patc;                   /* current fill pattern */
X    long gray;                  /* current gray level   */
X    long lgray, ogray;          /* temp grays for fill  */
X    char linemask[100];         /* line generator mask  */
X    int lmp;                    /* mask pointer         */
X    FILE *ifp;                  /* image file pointer   */
X    int r1, c1, r2, c2;         /* image max & min      */
X    int rc, cc;                 /* current row and col  */
X    int rr, cr;                 /* row and col range    */
X    int dhv;                    /* image is hv          */
X    int dbpp;                   /* image bits per pixel */
X    double dbppr;               /* image bpp range      */
X    int nrows, ncols, bpp       /* image size & bpp     */
X};
X
Xstruct implstruct impl;
X
Xstruct fpstruct {
X    char grid[FPMAX][FPMAX];
X    int nr, nc;
X};
X
Xstruct fpstruct fpat[MAXPATS];
X
Xstatic int stack[STACKSIZE][2], top, knotk, knotn;
X
X/************************************************************************/
X/* plotopen: open an image file for output, initialize plot structure   */
X/************************************************************************/
X
Xplotopen(fname)
Xchar *fname;
X{
X    FILE *fopen();
X    int r,c;
X    
X    if (fname[0] == '\0') impl.ifp = stdout;
X    else impl.ifp = fopen(fname,"w");
X
X    if (impl.ifp == NULL) {
X        fprintf(stderr,"plotopen: can't open output file %s\n",fname);
X        exit(1);
X    }
X    
X    /* defaults */
X    frame(0,0,255,255,0);
X    space(0,0,255,255,0);
X    bppout(8);
X    bppin(8);
X    move(0,0);
X    gray(255);
X    linemod("1");
X    fillpat(0,1,1,"1");
X    font("sr");
X    fspec(1.0,1.0,0.0);
X    
X    for (r = 0; r < GMAX; r++) 
X        for (c = 0; c < GMAX; c++) impl.grid[r][c] = 0;
X}
X
X/************************************************************************/
X/* frame: initialize number of x and y divisions in the output image    */
X/************************************************************************/
X
Xframe(x1,y1,x2,y2,hv)
Xint x1,y1,x2,y2,hv;
X{
X    impl.r1 = x1; impl.c1 = y1;
X    impl.r2 = x2; impl.c2 = y2;
X    impl.rr = x2 - x1; impl.cr = y2 - y1;
X    impl.nrows = 1 + abs((int)(x2-x1));
X    impl.ncols = 1 + abs((int)(y2-y1));
X
X    if (impl.nrows > GMAX) {
X        fprintf(stderr,"frame: nrows (%d) > max (%d)\n",
X            impl.nrows,GMAX);
X        exit(1);
X    }
X    if (impl.ncols > GMAX) {
X        fprintf(stderr,"frame: ncols (%d) > max (%d)\n",
X            impl.ncols,GMAX);
X        exit(1);
X    }
X}
X
X/************************************************************************/
X/* bppout: set number of bits per pixel for output                      */
X/************************************************************************/
X
Xbppout(b)
Xint b;
X{
X    if ((b < 1) || (b > BPPMAX)) {
X        fprintf(stderr,"bpp: %d BPP exceeds %d maximum\n",b,BPPMAX);
X        exit(1);
X    }
X        
X    impl.bpp = b;
X    impl.dbpp = b;
X    impl.lgray = 1 + (1 << b);
X    impl.dbppr = (1 << b) - 1;
X}
X
X/************************************************************************/
X/* bppin: set number of bits per pixel for input                        */
X/************************************************************************/
X
Xbppin(b)
Xint b;
X{
X    impl.ubpp = b;
X    impl.ubppr = (1 << b) - 1;
X}
X
X/************************************************************************/
X/* plotclose: write the image                                           */
X/************************************************************************/
X
Xplotclose()
X{
X    int i, j, p, bytes;
X    
X    bytes = impl.dbpp / 8;
X    if (bytes == 0) bytes = 1;
X    
X    impl.nrows = impl.nrows;
X    impl.ncols = impl.ncols;
X
X    for (i = 0; i < impl.nrows; i++)
X        for (j = 0; j < impl.ncols; j++) {
X            p = impl.grid[i][j];
X            fwrite(&p,bytes,1,impl.ifp);
X        }
X    
X    fclose(impl.ifp);
X}
X
X/************************************************************************/
X/* space: define x and y max and min. set x and y range                 */
X/************************************************************************/
X
Xspace(x1,y1,x2,y2,hv)
Xint x1, y1, x2, y2, hv;
X{
X    impl.x1 = x1; impl.y1 = y1;
X    impl.x2 = x2; impl.y2 = y2;
X    impl.xr = x2 - x1; 
X    impl.yr = y2 - y1; 
X    impl.uhv = hv;
X    move(x1,y1);
X    impl.bx1 = impl.x1; impl.by1 = impl.y1;
X    impl.bx2 = impl.x2; impl.by2 = impl.y2;
X    if (impl.xr == 0) impl.xr = 1;
X    if (impl.yr == 0) impl.yr = 1;
X}
X
Xhvmatch()
X{
X    if (impl.uhv == impl.dhv) return(1);
X    return(0);
X}
X
X/************************************************************************/
X/* erase: fill the grid with current gray level                         */
X/************************************************************************/
X
Xerase()
X{
X    int x, y, pc;
X    
X    pc = impl.patc;
X    
X    for (x = 0; x < impl.nrows; x++)
X        for (y = 0; y < impl.ncols; y++)
X            if (fpat[pc].grid[x % fpat[pc].nr][y % fpat[pc].nc])
X                impl.grid[x][y] = impl.gray;
X}
X
X/************************************************************************/
X/* move: change the current point to (x, y).                            */
X/************************************************************************/
X
Xmove(x,y)
Xint x, y;
X{
X    dblmove((double)x,(double)y);
X}
X
Xdblmove(x,y)
Xdouble x,y;
X{
X    impl.xc = x; impl.yc = y;
X    
X    if (impl.uhv != impl.dhv) {
X        impl.cc = impl.c1 + (impl.xc - impl.x1) * (impl.cr / impl.xr);
X        impl.rc = impl.r1 + (impl.yc - impl.y1) * (impl.rr / impl.yr);
X    }
X    else {
X        impl.rc = impl.r1 + (impl.xc - impl.x1) * (impl.rr / impl.xr);
X        impl.cc = impl.c1 + (impl.yc - impl.y1) * (impl.cr / impl.yr);
X    }
X
X    if (impl.xc < impl.bx1) impl.bx1 = impl.xc;
X    if (impl.yc < impl.by1) impl.by1 = impl.yc;
X    if (impl.xc > impl.bx2) impl.bx2 = impl.xc;
X    if (impl.yc > impl.by2) impl.by2 = impl.yc;
X}
X
X/************************************************************************/
X/* point: plot a point                                              */
X/************************************************************************/
X
Xpoint(x,y)
Xint x, y;
X{
X    move(x,y);
X    if ((impl.rc>=0)&&(impl.rc<=GMAX)&&(impl.cc>=0)&&(impl.cc<=GMAX))
X        impl.grid[impl.rc][impl.cc] = impl.gray;
X}
X
X/************************************************************************/
X/* cont: line generator. Draws a line from current point to (x, y)  */
X/*         uses the line mask to decide when to set pixels.             */
X/************************************************************************/
X
Xcont(x,y)
Xint x, y;
X{
X    dblcont((double)x,(double)y);
X}
X
Xdblcont(x,y)
Xdouble x,y;
X{
X    double r1, c1, r2, c2, rinc, cinc, length, tlen, r, c, fabs();
X    int i;
X    
X    /* Based on the simple DDA from Newmann and Sproull[1] */
X
X    r1 = impl.rc; c1 = impl.cc; 
X    dblmove(x,y);
X    r2 = impl.rc; c2 = impl.cc; 
X
X    length = fabs(r2-r1);
X    tlen = fabs(c2-c1);
X    if (tlen > length) length = tlen;
X    if (length != 0.0) {
X        rinc = (r2 - r1)/length;
X        cinc = (c2 - c1)/length;
X        r = r1;
X        c = c1;
X        
X        for (i = 0; i < length; i++) {
X            if (impl.linemask[impl.lmp] == '\0') impl.lmp = 0;
X            if (impl.linemask[impl.lmp++] == '1')
X                if ((r>=0)&&(r<=GMAX)&&(c>=0)&&(c<=GMAX))
X                    impl.grid[(int)r][(int)c] = impl.gray;
X            r += rinc;
X            c += cinc;
X        }
X        if ((r != r2) || (c != c2)) {
X            if (impl.linemask[impl.lmp] == '\0') impl.lmp = 0;
X            if (impl.linemask[impl.lmp++] == '1')
X                if ((r2>=0)&&(r2<=GMAX)&&(c2>=0)&&(c2<=GMAX))
X                    impl.grid[(int)r2][(int)c2] = impl.gray; 
X        }
X    }
X}
X
X/************************************************************************/
X/* line: draw a line                                                    */
X/************************************************************************/
X
Xline(x1,y1,x2,y2)
Xint x1, y1, x2, y2;
X{
X    move(x1,y1);
X    cont(x2,y2);
X}
X
X/************************************************************************/
X/* chain: polyline                                                      */
X/************************************************************************/
X
Xchain(n,v)
Xshort n, *v;
X{
X    int i, p;
X    short x, y;
X
X    p = 0;
X    x = v[p++]; y = v[p++];
X    move(x,y);
X    
X    for (i = 1; i < n; i++) {
X        x = v[p++]; y = v[p++];
X        cont(x,y);
X    }
X}
X
X/************************************************************************/
X/* bspline: order k spline from Newmann & Sproull[1]                    */
X/************************************************************************/
X
Xbspline(k,n,v)
Xshort k,n,*v;
X{
X    double u, du, ufin, x, y;
X    short nn;
X    
X    nn = n - 1;
X    ufin = (double)(nn - k + 2);
X    du = ufin / (500.0 + (double)nn);
X    
X    u = 0.0;
X    Bpoint(&x,&y,0.0,nn,k,v);
X    move((int)x,(int)y);
X    
X    while (u <= ufin) {
X        u = u + du;
X        Bpoint(&x,&y,u,n,k,v);
X        cont((int)x,(int)y);
X    }
X    x = v[nn*2];
X    y = v[nn*2 + 1];
X    cont((int)x,(int)y);
X}
X
XBpoint(x,y,u,n,k,v)
Xdouble *x,*y,u;
Xint n,k;
Xshort *v;
X{
X    int i, m;
X    double b, Bnblend();
X    
X    *x = 0.0; *y = 0.0;
X    m = 0;
X    knotk = k;
X    knotn = n;
X
X    for (i = 0; i <= n; i++) {
X        b = Bnblend(i,k,u);
X        *x = *x + (double)(v[m]) * b;
X        *y = *y + (double)(v[m+1]) * b;
X        m += 2;
X    }
X}
X
XBknot(i)
Xint i;
X{
X    if (i < knotk) return(0);
X    else if (i > knotn) return(knotn - knotk + 2);
X    else return(i - knotk + 1);
X}
X
Xdouble Bnblend(i,k,u)
Xint i,k;
Xdouble u;
X{
X    double v, v1, v2, t1, t2;
X    
X    v1 = 0.0; v2 = 0.0; t1 = 0.0; t2 = 0.0;
X    
X    if (k == 1) {
X        if ((Bknot(i) <= u) && (u < Bknot(i+1))) v = 1.0;
X        else v = 0.0;
X    }
X    else {
X        t1 = Bknot(i+k-1) - Bknot(i);
X        if (t1 != 0) v1 = (u - Bknot(i)) * Bnblend(i,k-1,u) / t1;
X
X        t2 = Bknot(i+k) - Bknot(i+1);
X        if (t2 != 0) v2 = (Bknot(i+k) - u) * Bnblend(i+1,k-1,u) / t2;
X        
X        v = v1 + v2;
X    }
X    return(v);
X}
X
Xpolygon(n,v)
Xshort n, *v;
X{
X    int i, p;
X    short x, y;
X
X    startp();
X    p = 0;
X    x = v[p++]; y = v[p++];
X    move(x,y);
X    
X    for (i = 1; i < n; i++) {
X        x = v[p++]; y = v[p++];
X        cont(x,y);
X    }
X    endp();
X}
X
X/************************************************************************/
X/* moverel: relative move                                               */
X/************************************************************************/
X
Xmoverel(x,y)
Xint x, y;
X{
X    int newx, newy;
X    
X    newx = impl.xc + x;
X    newy = impl.yc + y;
X    move(newx,newy);
X
X}
X
Xdblmoverel(x,y)
Xdouble x, y;
X{
X    double newx, newy;
X    
X    newx = impl.xc + x;
X    newy = impl.yc + y;
X    dblmove(newx,newy);
X
X}
X
X/************************************************************************/
X/* contrel: relative cont                                               */
X/************************************************************************/
X
Xcontrel(x,y)
Xint x, y;
X{
X    int newx, newy;
X    
X    newx = impl.xc + x;
X    newy = impl.yc + y;
X    cont(newx,newy);
X}
X
Xdblcontrel(x,y)
Xdouble x, y;
X{
X    double newx, newy;
X    
X    newx = impl.xc + x;
X    newy = impl.yc + y;
X    dblcont(newx,newy);
X
X}
X
X/************************************************************************/
X/* gray: set the current gray level                                     */
X/************************************************************************/
X
Xgray(g)
Xint g;
X{
X    impl.gray = (double)g * impl.dbppr/impl.ubppr;
X}
X
X/************************************************************************/
X/* colour: set the current colour                                       */
X/************************************************************************/
X
Xcolour(r,g,b)
Xint r,g,b;
X{
X    gray((int)((double)(r + g + b) / 3.0));
X}
X
X/************************************************************************/
X/* linemod: change the line generator mask                          */
X/*            this mask should be a string of 1s and 0s. The line       */
X/*            generator (cont) will set the pixels under a "1".     */ 
X/************************************************************************/
X
Xlinemod(str)
Xchar *str;
X{
X    strcpy(impl.linemask,str);
X    impl.lmp = 0;
X}
X
X/************************************************************************/
X/* startp: start filled polygon                                         */
X/************************************************************************/
X
Xstartp()
X{
X    impl.ogray = impl.gray;
X    impl.gray = impl.lgray;
X    impl.bx1 = impl.xc; impl.by1 = impl.yc;
X    impl.bx2 = impl.xc; impl.by2 = impl.yc;
X}
X
X/************************************************************************/
X/* endp: end filled polygon                                         */
X/************************************************************************/
X
Xendp()
X{
X    impl.gray = impl.ogray;
X    pfill(impl.bx1,impl.by1,impl.bx2,impl.by2,impl.lgray);
X}
X
X/************************************************************************/
X/* arc: draw an arc from x1 y1 to x2 y2, with center at xc xy       */
X/************************************************************************/
X
Xarc(xc,yc,x1,y1,x2,y2)
Xint xc,yc,x1,y1,x2,y2;
X{
X    double fabs(), hypot(),acos(), cos(), sin();
X    double dt, a1, a2, theta, rad, pi, pi2, up, dn, bup, bdn;
X    double cx, cy;
X    int catch;
X    
X    pi = acos(-1.0);
X    pi2 = 2.0 * pi;
X
X    /* Algorithm: move to x1 y1. The angle between x1 y1 and the x axis is a1.
X        The angle to x2 y2 is a2. Set theta = a1, and move to x1 y1.
X        Sweep anti-clockwise to a2, incrementing theta by dt. At each step,
X        find the point on the arc at angle theta. Use cont to draw a line
X        to that point.
X    */
X
X    rad = hypot((double)(x1-xc),(double)(y1-yc));
X    
X    /* find the angles a1 and a2 */
X    
X    if (y1 >= yc) a1 = acos((x1-xc)/rad);
X    else a1 = pi + acos((xc-x1)/rad);
X
X    if (y2 >= yc) a2 = acos((x2-xc)/rad);
X    else a2 = pi + acos((xc-x2)/rad);
X
X    dt = 0.1 / rad;
X    theta = a1;
X    up = a2+dt;
X    dn = a2-dt;
X    bup = up + pi2;
X    bdn = dn + pi2;
X    catch = 0; /* safety chain */
X
X    /* step around the arc until within range of a2 */
X    while (!((catch > 1) && (((theta < up) && (theta > dn)) ||
X        ((theta < bup) && (theta > bdn))))) {
X
X        impl.xc = xc + rad * cos(theta);
X        impl.yc = yc + rad * sin(theta);
X
X        if (impl.uhv != impl.dhv) {
X            impl.cc = impl.c1 + (impl.xc - impl.x1) * (impl.cr / impl.xr);
X            impl.rc = impl.r1 + (impl.yc - impl.y1) * (impl.rr / impl.yr);
X        }
X        else {
X            impl.rc = impl.r1 + (impl.xc - impl.x1) * (impl.rr / impl.xr);
X            impl.cc = impl.c1 + (impl.yc - impl.y1) * (impl.cr / impl.yr);
X        }
X
X        if (impl.xc < impl.bx1) impl.bx1 = impl.xc;
X        if (impl.yc < impl.by1) impl.by1 = impl.yc;
X        if (impl.xc > impl.bx2) impl.bx2 = impl.xc;
X        if (impl.yc > impl.by2) impl.by2 = impl.yc;
X        
X        if (impl.linemask[impl.lmp] == '\0') impl.lmp = 0;
X        if (impl.linemask[impl.lmp++] == '1')
X            if ((impl.rc>=0)&&(impl.rc<=GMAX)&&(impl.cc>=0)&&(impl.cc<=GMAX))
X                    impl.grid[impl.rc][impl.cc] = impl.gray;
X        theta+=dt;
X        
X        /* safety check to catch runaway loops */
X        if (catch++ > 1000000) {
X            fprintf(stderr,"arc: runaway loop caught: inform a wizard!\n");
X            fprintf(stderr,"  xc=%lf yc=%lf x1=%lf y1=%lf x1=%lf y1=%lf\n",
X                xc,yc,x1,y1,x2,y2);
X            fprintf(stderr,"  angle1=%lf angle2=%lf dtheta=%lf\n",a1,a2,dt);
X            exit(1);
X        }
X    }
X
X    /* finish up */
X    cont(x2,y2);
X    point(x2,y2);
X}
X
X/************************************************************************/
X/* circle: simple incremental circle generator                      */
X/************************************************************************/
X
Xcircle(x1,y1,r)
Xint x1,y1,r;
X{
X    arc (x1, y1, x1-r, y1, x1-r, y1);
X}
X
X/************************************************************************/
X/* fillpat: set fill pattern                                            */
X/************************************************************************/
X
Xfillpat(n,r,c,str)
Xint n, r, c;
Xchar *str;
X{
X    int i, j, p;
X
X    if (n >= MAXPATS) {
X        fprintf(stderr,"fillpat: pattern number %d > max %d\n",n,MAXPATS-1);
X        exit(1);
X    }
X    
X    impl.patc = n;
X    fpat[n].nr = r;
X    fpat[n].nc = c;
X    p = 0;
X    
X    for (i = 0; i < r; i++)
X        for (j = 0; j < c; j++) {
X            if (str[p++] == '1') fpat[n].grid[i][j] = 1;
X            else fpat[n].grid[i][j] = 0;
X            if (str[p] == '\0') p = 0;
X        }
X}
X
X/************************************************************************/
X/* setpat: set current fill pattern                                     */
X/************************************************************************/
X
Xsetpat(n)
Xint n;
X{
X    impl.patc = n;
X}
X
X/************************************************************************/
X/* pensize: set pensize                                                 */
X/************************************************************************/
X
Xpensize(p)
Xint p;
X{
X/* PENSIZE NOT IMPLEMENTED */
X}
X
X/************************************************************************/
X/* area: fill area from seed point - boundary is non-current value  */
X/************************************************************************/
X
Xarea(x,y)
Xint x, y;
X{
X    int nx, ny, nxm, nym, nxp, nyp, aminx, aminy, amaxx, amaxy, pc;
X    long seedv, mark;
X    
X    pc = impl.patc;
X    
X    /* stack the seed point */
X    move(x,y);
X    seedv = impl.grid[impl.rc][impl.cc];
X    mark = impl.lgray;
X    aminx = impl.rc; aminy = impl.cc;
X    amaxx = aminx; amaxy = aminy;
X    
X    top = 0;
X    if (fpat[pc].grid[impl.rc%fpat[pc].nr][impl.cc%fpat[pc].nc]) 
X        impl.grid[impl.rc][impl.cc] = impl.gray;
X    else impl.grid[impl.rc][impl.cc] = mark;
X    stack[top][0] = impl.rc; stack[top++][1] = impl.cc;
X
X
X    /* stack any 4-connected neighbours of the top of the stack, which
X        have the seed value at that pixel. */
X
X    while (top > 0) {
X        top--;
X        nx = stack[top][0]; ny = stack[top][1];
X        nxm = nx - 1; nym = ny - 1;
X        nxp = nx + 1; nyp = ny + 1;
X
X        if (nx > 0)
X            if (impl.grid[nxm][ny] == seedv) {
X                if (nxm < aminx) aminx = nxm;
X                if (fpat[pc].grid[nxm%fpat[pc].nr][ny%fpat[pc].nc]) 
X                    impl.grid[nxm][ny] = impl.gray;
X                else impl.grid[nxm][ny] = mark;
X                stack[top][0] = nxm; stack[top++][1] = ny;
X            }
X        
X        if (nx < impl.r2)
X            if (impl.grid[nxp][ny] == seedv) {
X                if (nxp > amaxx) amaxx = nxp;
X                if (fpat[pc].grid[nxp%fpat[pc].nr][ny%fpat[pc].nc]) 
X                    impl.grid[nxp][ny] = impl.gray;
X                else impl.grid[nxp][ny] = mark;
X                stack[top][0] = nxp; stack[top++][1] = ny;
X            }
X
X        if (ny > 0)
X            if (impl.grid[nx][nym] == seedv) {
X                if (nym < aminy) aminy = nym;
X                if (fpat[pc].grid[nx%fpat[pc].nr][nym%fpat[pc].nc]) 
X                    impl.grid[nx][nym] = impl.gray;
X                else impl.grid[nx][nym] = mark;
X                stack[top][0] = nx; stack[top++][1] = nym;
X            }
X        
X        if (ny < impl.c2)
X            if (impl.grid[nx][nyp] == seedv) {
X                if (nyp > amaxy) amaxy = nyp;
X                if (fpat[pc].grid[nx%fpat[pc].nr][nyp%fpat[pc].nc]) 
X                    impl.grid[nx][nyp] = impl.gray;
X                else impl.grid[nx][nyp] = mark;
X                stack[top][0] = nx; stack[top++][1] = nyp;
X            }
X    }
X    for (nx = aminx; nx <= amaxx; nx++)
X        for (ny = aminy; ny <= amaxy; ny++)
X            if (impl.grid[nx][ny] == mark) impl.grid[nx][ny] = seedv;
X}
X
X
X/************************************************************************/  
X/* pfill: fill a polygon in the bounding box x1, y1, x2, y2,            */
X/*          the polygon boundary must have been drawn with gray = fill  */
X/*          NOTE: fill cannot be 0.                                     */
X/************************************************************************/  
X
Xpfill(x1,y1,x2,y2,fill)
Xint x1, y1, x2, y2, fill;
X{
X
X    int i, j, r, c, nr, nc, pc;
X    int r1, c1, r2, c2, rt, ct;
X    int negfill;
X
X    pc = impl.patc;
X    
X    /* 
X       Algorithm: 
X       Visit the border of the box. 
X         Set 0 pixels to -fill and stack them. 
X         Set non-fill pixels negative and stack them.
X
X       Run a filling algorithm inside the box and outside the polygon
X         Set 0 pixels to -fill.
X         Set non-fill pixels  negative.
X
X       Scan the box. 
X         Set 0 or positive to fill.
X         Set -fill to 0.
X         Set negatives to positive
X    */
X    
X    if (fill == 0) {
X        fprintf(stderr,"pfill: can't fill a polygon with 0 boundary.\n");
X        return(0);
X    }
X    
X    move(x1,y1); r1 = impl.rc; c1 = impl.cc;
X    move(x2,y2); r2 = impl.rc; c2 = impl.cc;
X    if (r1 > r2) { rt = r1; r1 = r2; r2 = rt; }
X    if (c1 > c2) { ct = c1; c1 = c2; c2 = ct; }
X
X    negfill = -1 * fill;
X    top = 0;
X    
X    /* Visit the border */
X    
X    for (i = r1; i <= r2; i++) {
X        if (impl.grid[i][c1] == 0) {
X            impl.grid[i][c1] = negfill;
X            stack[top][0] = i; stack[top++][1] = c1;
X        };
X        if ((impl.grid[i][c1] != fill) && (impl.grid[i][c1] > 0)) {
X            impl.grid[i][c1] *= -1;
X            stack[top][0] = i; stack[top++][1] = c1;
X        };
X        
X        if (impl.grid[i][c2] == 0) {
X            impl.grid[i][c2] = negfill;
X            stack[top][0] = i; stack[top++][1] = c2;
X        };
X        if ((impl.grid[i][c2] != fill) && (impl.grid[i][c2] > 0)) {
X            impl.grid[i][c2] *= -1;
X            stack[top][0] = i; stack[top++][1] = c2;
X        };
X
X        if (top > STACKSIZE) {
X            fprintf(stderr,"pfill: fill stack overflow\n");
X            exit(1);
X        };
X    };
X
X    for (i = c1; i <= c2; i++) {
X        if (impl.grid[r1][i] == 0) {
X            impl.grid[r1][i] = negfill;
X            stack[top][0] = r1; stack[top++][1] = i;
X        };
X        if ((impl.grid[r1][i] != fill) && (impl.grid[r1][i] > 0)) {
X            impl.grid[r1][i] *= -1;
X            stack[top][0] = r1; stack[top++][1] = i;
X        };
X
X        if (impl.grid[r2][i] == 0) {
X            impl.grid[r2][i] = negfill;
X            stack[top][0] = r2; stack[top++][1] = i;
X        };
X        if ((impl.grid[r2][i] != fill) && (impl.grid[r2][i] > 0)) {
X            impl.grid[r2][i] *= -1;
X            stack[top][0] = r2; stack[top++][1] = i;
X        };
X        if (top > STACKSIZE) {
X            fprintf(stderr,"pfill: fill stack overflow\n");
X            exit(1);
X        };
X    }
X    
X    /* fill the rest of the outside zeros with negfill */
X    
X    while (top > 0) {
X        top--;
X        r = stack[top][0]; c = stack[top][1];
X        
X        nr = r-1;
X        if ((nr >= r1) && (nr <= r2)) {
X            if (impl.grid[nr][c] == 0) {
X                impl.grid[nr][c] = negfill;
X                stack[top][0] = nr; stack[top++][1] = c;
X            };
X            if ((impl.grid[nr][c] > 0) && 
X                (impl.grid[nr][c] != fill)) {
X                impl.grid[nr][c] *= -1;
X                stack[top][0] = nr; stack[top++][1] = c;
X            }
X        }
X        
X        nr = r+1;
X        if ((nr >= r1) && (nr <= r2)) {
X            if (impl.grid[nr][c] == 0) {
X                impl.grid[nr][c] = negfill;
X                stack[top][0] = nr; stack[top++][1] = c;
X            };
X            if ((impl.grid[nr][c] > 0) && 
X                (impl.grid[nr][c] != fill)) {
X                impl.grid[nr][c] *= -1;
X                stack[top][0] = nr; stack[top++][1] = c;
X            }
X        }
X
X        nc = c-1;
X        if ((nc >= c1) && (nc <= c2)) {
X            if (impl.grid[r][nc] == 0) {
X                impl.grid[r][nc] = negfill;
X                stack[top][0] = r; stack[top++][1] = nc;
X            };
X            if ((impl.grid[r][nc] > 0) && 
X                (impl.grid[r][nc] != fill)) {
X                impl.grid[r][nc] *= -1;
X                stack[top][0] = r; stack[top++][1] = nc;
X            }
X        }
X                
X        nc = c+1;
X        if ((nc >= c1) && (nc <= c2)) {
X            if (impl.grid[r][nc] == 0) {
X                impl.grid[r][nc] = negfill;
X                stack[top][0] = r; stack[top++][1] = nc;
X            };
X            if ((impl.grid[r][nc] > 0) && 
X                (impl.grid[r][nc] != fill)) {
X                impl.grid[r][nc] *= -1;
X                stack[top][0] = r; stack[top++][1] = nc;
X            }
X        }
X        if (top > STACKSIZE) {
X            fprintf(stderr,"pfill: fill stack overflow\n");
X            exit(1);
X        }
X    }
X    
X                
X    /* scan the box */
X    for (i = r1; i <= r2; i++)
X        for (j = c1; j <= c2; j++) 
X            if (impl.grid[i][j] >= 0) {
X                if (fpat[pc].grid[i%fpat[pc].nr][j%fpat[pc].nc])
X                    impl.grid[i][j] = impl.gray;
X                else if (impl.grid[i][j] == fill)
X                    impl.grid[i][j] = impl.gray;
X            }
X            else if (impl.grid[i][j] == negfill) impl.grid[i][j] = 0;
X            else if (impl.grid[i][j] < 0) impl.grid[i][j] *= -1;
X}
X
Xcomment(str)
Xchar *str;
X{
X}
X
Xdonelabel()
X{
X}
!FUNKY!STUFF!
echo
echo finished part 6 of 8

majka@ubc-vision.UUCP (Marc Majka) (04/28/86)

- - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - -
#!/bin/sh
#
# shell archive - extract with /bin/sh
#
echo Plot archive part 7 of 8
echo  
echo installing directory test
echo  
mkdir test
cd test
#
echo extracting file README
sed 's/^X//' > README <<'!FUNKY!STUFF!'
XThis directory contains a few sample plot files.  They are all in text
Xformat.  To convert them to real plot file format, run them through txpl.
XSince txpl is fast, I usually leave plot files in text format and pipe
Xthe text forms through when I want to plot them.  For example:
X
X% txpl fubar | rplot -r 256 -c 256 > fu.r
X
XNot all the fonts called for by these plot files exist!  You will have to
Xfool around with the Hershey fonts and drag them out.  See the README file 
Xin ../vfont.
X
XThe files are:
X
Xafrica      Outline of african continent
Xfc.roman    Roman fonts
Xfubar       Wall plate
Xgraph1      A scatterplot
Xgraph2      An X-Y line plot
Xhappy       Example fill pattern
Xspline      b-spline Africa outline
Xtestp       Test pattern: A bit of everything
Xyinyang     Yin-Yang symbol in red and white
!FUNKY!STUFF!
echo extracting file africa
sed 's/^X//' > africa <<'!FUNKY!STUFF!'
Xspace   0 0 115 116 0
Xbppin   8
Xgray    255
Xchain	238
X	51 19
X	52 16
X	52 14
X	51 13
X	50 12
X	49 11
X	49 9
X	48 8
X	46 6
X	44 5
X	43 4
X	41 2
X	39 0
X	37 1
X	36 0
X	35 1
X	34 2
X	32 2
X	31 3
X	29 3
X	28 2
X	26 3
X	24 2
X	23 3
X	21 5
X	20 7
X	18 8
X	16 9
X	15 10
X	14 12
X	14 14
X	13 15
X	13 16
X	12 17
X	11 17
X	9 17
X	8 18
X	6 19
X	5 20
X	5 22
X	4 23
X	3 24
X	2 25
X	3 26
X	3 28
X	3 29
X	3 30
X	3 32
X	2 33
X	2 34
X	1 35
X	1 37
X	1 39
X	0 41
X	1 42
X	0 43
X	0 45
X	1 46
X	0 48
X	1 49
X	3 50
X	4 49
X	5 48
X	7 49
X	7 51
X	7 53
X	7 55
X	8 56
X	9 57
X	10 58
X	10 60
X	11 61
X	10 63
X	8 62
X	7 63
X	7 66
X	8 67
X	8 69
X	8 70
X	9 71
X	9 73
X	10 74
X	10 76
X	10 78
X	9 80
X	10 82
X	12 82
X	14 83
X	15 84
X	16 85
X	18 85
X	18 86
X	20 87
X	22 88
X	23 90
X	24 91
X	26 91
X	28 92
X	30 92
X	31 94
X	32 95
X	34 95
X	35 97
X	36 98
X	37 99
X	38 100
X	39 101
X	40 103
X	41 102
X	42 103
X	43 104
X	42 106
X	42 108
X	41 110
X	41 112
X	40 114
X	41 116
X	43 116
X	44 115
X	46 115
X	47 114
X	48 113
X	50 113
X	51 112
X	52 111
X	53 110
X	54 109
X	56 107
X	57 105
X	58 104
X	59 102
X	61 102
X	61 100
X	62 100
X	63 99
X	64 98
X	65 98
X	66 96
X	68 95
X	70 95
X	71 96
X	73 96
X	75 96
X	77 98
X	78 97
X	80 98
X	81 97
X	83 97
X	84 98
X	85 97
X	86 95
X	87 94
X	88 93
X	88 91
X	90 91
X	90 89
X	91 88
X	93 87
X	94 88
X	96 88
X	98 87
X	100 87
X	100 85
X	100 83
X	102 83
X	103 82
X	105 82
X	107 80
X	108 79
X	109 78
X	111 77
X	111 75
X	112 74
X	113 73
X	114 72
X	114 70
X	114 68
X	114 66
X	114 64
X	115 63
X	114 62
X	114 60
X	112 60
X	110 60
X	109 59
X	108 58
X	106 58
X	105 57
X	104 56
X	102 54
X	101 54
X	99 54
X	97 54
X	95 54
X	94 53
X	93 52
X	91 51
X	90 50
X	89 49
X	87 49
X	85 49
X	83 50
X	81 50
X	80 51
X	79 52
X	77 52
X	75 52
X	74 51
X	73 51
X	71 51
X	69 50
X	67 50
X	66 48
X	65 47
X	64 46
X	62 45
X	61 43
X	60 44
X	59 45
X	57 45
X	55 45
X	54 46
X	53 45
X	52 43
X	52 41
X	53 40
X	52 38
X	50 37
X	49 36
X	49 34
X	49 32
X	49 30
X	50 28
X	51 27
X	51 25
X	51 23
X	51 21
X	51 19
!FUNKY!STUFF!
echo extracting file fc.roman
sed 's/^X//' > fc.roman <<'!FUNKY!STUFF!'
Xspace  0 0 1859 1859 0
Xfspec  1.0 1.0 1.5707963267
Xmove   0 0 
Xcont   1859 0
Xcont   1859 1859
Xcont   0 1859
Xcont   0 0
Xline   0 929 1859 929
Xline   929 0 929 1859
X
Xspace  -9 -9 609 609 0
Xfont   sr
Xmove   0 0
Xlabel  Simplex Roman
Xmove   55 0
Xlabel  !"#$%&^|()[]`'@
Xmove   90 0
Xlabel  <>{}*+-=.,:;?/
Xmove   125 0
Xlabel  0123456789\~
Xmove   160 0
Xlabel  ABCDEFGHIJKLM
Xmove   195 0
Xlabel  NOPQRSTUVWXYZ
Xmove   230 0
Xlabel  abcdefghijklm
Xmove   265 0
Xlabel  nopqrstuvwxyz
X
Xspace  -9 -319 609 299 0
Xfont   dr
Xmove   0 0
Xlabel  Duplex Roman
Xmove   55 0
Xlabel  !"#$%&^|()[]`'@
Xmove   90 0
Xlabel  <>{}*+-=.,:;?/
Xmove   125 0
Xlabel  0123456789\~
Xmove   160 0
Xlabel  ABCDEFGHIJKLM
Xmove   195 0
Xlabel  NOPQRSTUVWXYZ
Xmove   230 0
Xlabel  abcdefghijklm
Xmove   265 0
Xlabel  nopqrstuvwxyz
X
Xspace  -319 -9 299 609 0
Xfont   cr
Xmove   0 0
Xlabel  Complex Roman
Xmove   55 0
Xlabel  !"#$%&^|()[]`'@
Xmove   90 0
Xlabel  <>{}*+-=.,:;?/
Xmove   125 0
Xlabel  0123456789\~
Xmove   160 0
Xlabel  ABCDEFGHIJKLM
Xmove   195 0
Xlabel  NOPQRSTUVWXYZ
Xmove   230 0
Xlabel  abcdefghijklm
Xmove   265 0
Xlabel  nopqrstuvwxyz
X
Xspace  -319 -319 299 299 0
Xfont   tr
Xmove   0 0
Xlabel  Triplex Roman
Xmove   55 0
Xlabel  !"#$%&^|()[]`'@
Xmove   90 0
Xlabel  <>{}*+-=.,:;?/
Xmove   125 0
Xlabel  0123456789\~
Xmove   160 0
Xlabel  ABCDEFGHIJKLM
Xmove   195 0
Xlabel  NOPQRSTUVWXYZ
Xmove   230 0
Xlabel  abcdefghijklm
Xmove   265 0
Xlabel  nopqrstuvwxyz
!FUNKY!STUFF!
echo extracting file fubar
sed 's/^X//' > fubar <<'!FUNKY!STUFF!'
Xspace 0 0 199 199 0
Xcolour 0 255 0
Xmove 0 0
Xcont 0 199
Xcont 199 199
Xcont 199 0
Xcont 0 0
Xmove 2 2
Xcont 2 197
Xcont 197 197
Xcont 197 2
Xcont 2 2
Xmove 4 4
Xcont 4 195
Xcont 195 195
Xcont 195 4
Xcont 4 4
Xcolour 255 0 255 
Xspace 0 0 105 215 0
Xmove 10 10
Xfont ge
Xfspec 2.2 1.5 1.5707963
Xlabel Es
Xmoverel 0 25
Xlabel ist
Xmove 50 10
Xfspec 2.1 2.0 1.5707963
Xlabel Fubar
!FUNKY!STUFF!
echo extracting file graph1
sed 's/^X//' > graph1 <<'!FUNKY!STUFF!'
Xspace   -200 1100 1100 -200 1
Xbppin   8
Xgray    255
Xfont    sr
Xline    0 0 1000 0
Xline    0 0 0 1000
Xfspec   3.000000 3.000000 0.000000
Xmove    250 -135
Xlabel   Chroma X
Xfspec   3.000000 3.000000 1.570796
Xmove    -195 250
Xlabel   Chroma Y
Xfspec   1.000000 1.000000 1.570796
Xline    -30 0 0 0
Xmove    -80 -28
Xlabel   0.15
Xline    -30 399 0 399
Xmove    -80 371
Xlabel   0.25
Xline    -30 799 0 799
Xmove    -80 771
Xlabel   0.35
Xline    -10 0 0 0
Xline    -10 39 0 39
Xline    -10 79 0 79
Xline    -10 119 0 119
Xline    -10 159 0 159
Xline    -10 199 0 199
Xline    -10 239 0 239
Xline    -10 279 0 279
Xline    -10 319 0 319
Xline    -10 359 0 359
Xline    -10 399 0 399
Xline    -10 439 0 439
Xline    -10 479 0 479
Xline    -10 519 0 519
Xline    -10 559 0 559
Xline    -10 599 0 599
Xline    -10 639 0 639
Xline    -10 680 0 680
Xline    -10 720 0 720
Xline    -10 760 0 760
Xline    -10 800 0 800
Xline    -10 840 0 840
Xline    -10 880 0 880
Xline    -10 920 0 920
Xline    -10 960 0 960
Xfspec   1.000000 1.000000 0.000000
Xline    0 -30 0 0
Xmove    -28 -50
Xlabel   0.50
Xline    400 -30 400 0
Xmove    372 -50
Xlabel   0.60
Xline    800 -30 800 0
Xmove    772 -50
Xlabel   0.70
Xline    0 -10 0 0
Xline    39 -10 39 0
Xline    79 -10 79 0
Xline    119 -10 119 0
Xline    159 -10 159 0
Xline    199 -10 199 0
Xline    239 -10 239 0
Xline    279 -10 279 0
Xline    319 -10 319 0
Xline    359 -10 359 0
Xline    399 -10 399 0
Xline    439 -10 439 0
Xline    479 -10 479 0
Xline    519 -10 519 0
Xline    559 -10 559 0
Xline    599 -10 599 0
Xline    639 -10 639 0
Xline    679 -10 679 0
Xline    719 -10 719 0
Xline    759 -10 759 0
Xline    799 -10 799 0
Xline    839 -10 839 0
Xline    879 -10 879 0
Xline    919 -10 919 0
Xline    959 -10 959 0
Xline    999 -10 999 0
Xpoint   698 279
Xpoint   807 218
Xpoint   666 294
Xpoint   683 274
Xpoint   686 288
Xpoint   758 251
Xpoint   731 246
Xpoint   824 231
Xpoint   676 270
Xpoint   795 226
Xpoint   222 531
Xpoint   218 576
Xpoint   812 239
Xpoint   729 255
Xpoint   797 267
Xpoint   811 231
Xpoint   757 277
Xpoint   694 270
Xpoint   787 248
Xpoint   741 246
Xpoint   792 253
Xpoint   796 258
Xpoint   804 245
Xpoint   710 259
Xpoint   799 239
Xpoint   699 309
Xpoint   659 348
Xpoint   757 269
Xpoint   780 261
Xpoint   691 275
Xpoint   715 277
Xpoint   772 282
Xpoint   774 257
Xpoint   766 284
Xpoint   753 256
Xpoint   745 266
Xpoint   730 322
Xpoint   755 306
Xpoint   765 248
Xpoint   763 265
Xpoint   725 331
Xpoint   744 326
Xpoint   693 353
Xpoint   720 341
Xpoint   715 339
Xpoint   735 324
Xpoint   762 274
Xpoint   505 361
Xpoint   725 319
Xpoint   768 269
Xpoint   762 281
Xpoint   756 292
Xpoint   739 310
Xpoint   739 324
Xpoint   690 363
Xpoint   695 365
Xpoint   733 334
Xpoint   701 366
Xpoint   710 348
Xpoint   769 261
Xpoint   716 350
Xpoint   762 255
Xpoint   475 350
Xpoint   659 293
Xpoint   772 226
Xpoint   776 248
Xpoint   804 214
Xpoint   719 272
Xpoint   740 248
Xpoint   785 257
Xpoint   767 278
Xpoint   778 244
Xpoint   794 233
Xpoint   819 204
Xpoint   673 298
Xpoint   442 361
Xpoint   778 270
Xpoint   757 269
Xpoint   748 254
Xpoint   772 273
Xpoint   380 421
Xpoint   779 233
Xpoint   438 413
Xpoint   777 277
Xpoint   440 392
Xpoint   750 244
Xpoint   410 401
Xpoint   440 392
Xpoint   673 268
Xpoint   470 403
Xpoint   735 254
Xpoint   407 433
Xpoint   737 244
Xpoint   707 264
Xpoint   723 254
Xpoint   771 240
Xpoint   757 250
Xpoint   742 260
Xpoint   630 331
Xpoint   770 250
Xpoint   637 334
Xpoint   785 240
Xpoint   678 337
Xpoint   681 358
Xpoint   639 394
Xpoint   794 223
Xpoint   799 230
Xpoint   814 229
Xpoint   808 213
Xpoint   843 209
Xpoint   829 219
Xpoint   833 226
Xpoint   840 201
Xpoint   827 211
Xpoint   804 236
Xpoint   772 231
Xpoint   677 267
Xpoint   751 255
Xpoint   809 242
Xpoint   298 549
Xpoint   229 559
Xpoint   250 570
Xpoint   671 280
Xpoint   813 220
Xpoint   719 278
Xpoint   683 339
Xpoint   706 332
Xpoint   653 384
Xpoint   669 390
Xpoint   680 367
Xpoint   225 545
Xpoint   674 379
Xpoint   752 246
Xpoint   244 542
Xpoint   694 357
Xpoint   847 216
Xpoint   618 303
Xpoint   774 276
Xpoint   218 516
Xpoint   726 264
Xpoint   248 497
Xpoint   824 242
Xpoint   664 279
Xpoint   763 256
Xpoint   739 255
Xpoint   795 243
Xpoint   702 273
Xpoint   816 219
Xpoint   777 237
Xpoint   764 246
Xpoint   770 252
Xpoint   666 292
Xpoint   757 261
Xpoint   651 287
Xpoint   746 241
Xpoint   633 308
Xpoint   599 309
Xpoint   631 294
Xpoint   653 301
Xpoint   601 323
Xpoint   658 288
Xpoint   627 306
Xpoint   644 286
Xpoint   725 259
Xpoint   639 298
Xpoint   729 273
Xpoint   671 283
Xpoint   783 234
Xpoint   716 275
Xpoint   704 267
Xpoint   699 295
Xpoint   697 263
Xpoint   741 264
Xpoint   747 251
Xpoint   728 251
Xpoint   173 752
Xpoint   170 746
Xpoint   161 757
Xpoint   168 743
!FUNKY!STUFF!
echo extracting file graph2
sed 's/^X//' > graph2 <<'!FUNKY!STUFF!'
Xspace   0 32 256 0 1
Xfspec   1.000000 1.000000 0.000000
Xline    0 0 0 28
Xline    0 0 256 0
Xchain	128
X	0 7
X	2 0
X	4 0
X	6 0
X	8 0
X	10 0
X	12 0
X	14 0
X	16 0
X	18 0
X	20 0
X	22 0
X	24 0
X	26 1
X	28 2
X	30 3
X	32 4
X	34 4
X	36 4
X	38 4
X	40 4
X	42 4
X	44 3
X	46 4
X	48 4
X	50 4
X	52 4
X	54 4
X	56 4
X	58 4
X	60 4
X	62 4
X	64 5
X	66 4
X	68 5
X	70 6
X	72 6
X	74 6
X	76 7
X	78 9
X	80 13
X	82 13
X	84 15
X	86 19
X	88 24
X	90 26
X	92 28
X	94 25
X	96 20
X	98 16
X	100 13
X	102 13
X	104 16
X	106 18
X	108 16
X	110 13
X	112 13
X	114 11
X	116 9
X	118 9
X	120 9
X	122 12
X	124 13
X	126 16
X	128 12
X	130 12
X	132 11
X	134 11
X	136 12
X	138 15
X	140 20
X	142 21
X	144 18
X	146 17
X	148 18
X	150 17
X	152 15
X	154 13
X	156 14
X	158 15
X	160 15
X	162 15
X	164 14
X	166 14
X	168 12
X	170 11
X	172 9
X	174 8
X	176 7
X	178 5
X	180 5
X	182 5
X	184 5
X	186 4
X	188 4
X	190 4
X	192 4
X	194 4
X	196 4
X	198 4
X	200 3
X	202 3
X	204 3
X	206 3
X	208 3
X	210 3
X	212 3
X	214 2
X	216 3
X	218 2
X	220 2
X	222 2
X	224 2
X	226 1
X	228 2
X	230 1
X	232 1
X	234 1
X	236 1
X	238 1
X	240 1
X	242 1
X	244 1
X	246 1
X	248 0
X	250 0
X	252 0
X	254 0
!FUNKY!STUFF!
echo extracting file happy
sed 's/^X//' > happy <<'!FUNKY!STUFF!'
Xspace   0 0 115 116 0
Xgray    255
Xfillpat 1 32 32 
X............1111111.............
X.........1111111111111..........
X.......11111.......11111........
X......111.............111.......
X.....111...............111......
X....11...................11.....
X...11.....................11....
X..111.....................111...
X..11.......................11...
X.11.........................11..
X.11......111.......111......11..
X.11......111.......111......11..
X11.......111.......111.......11.
X11...........................11.
X11...........................11.
X11...........................11.
X11...........................11.
X11...........................11.
X11...........................11.
X.11......11.........11......11..
X.11......11.........11......11..
X.11......111.......111......11..
X..11......111.....111......11...
X..111......111111111......111...
X...11.......1111111.......11....
X....11...................11.....
X.....111...............111......
X......111.............111.......
X.......11111.......11111........
X.........1111111111111..........
X............1111111.............
X................................
Xsetpat 1
Xpolygon 60
X        51 19
X        50 12
X        46 6
X        39 0
X        34 2
X        28 2
X        21 5
X        15 10
X        13 16
X        8 18
X        4 23
X        3 28
X        2 33
X        1 39
X        0 45
X        3 50
X        7 51
X        9 57
X        10 63
X        8 67
X        9 73
X        9 80
X        15 84
X        20 87
X        26 91
X        32 95
X        37 99
X        41 102
X        42 108
X        41 116
X        47 114
X        52 111
X        57 105
X        61 100
X        65 98
X        71 96
X        78 97
X        84 98
X        88 93
X        91 88
X        98 87
X        102 83
X        108 79
X        112 74
X        114 68
X        114 62
X        109 59
X        104 56
X        97 54
X        91 51
X        85 49
X        79 52
X        73 51
X        66 48
X        61 43
X        52 41
X        49 36
X        50 28
X        51 21
X    	51 19
Xchain   60
X        51 19
X        50 12
X        46 6
X        39 0
X        34 2
X        28 2
X        21 5
X        15 10
X        13 16
X        8 18
X        4 23
X        3 28
X        2 33
X        1 39
X        0 45
X        3 50
X        7 51
X        9 57
X        10 63
X        8 67
X        9 73
X        9 80
X        15 84
X        20 87
X        26 91
X        32 95
X        37 99
X        41 102
X        42 108
X        41 116
X        47 114
X        52 111
X        57 105
X        61 100
X        65 98
X        71 96
X        78 97
X        84 98
X        88 93
X        91 88
X        98 87
X        102 83
X        108 79
X        112 74
X        114 68
X        114 62
X        109 59
X        104 56
X        97 54
X        91 51
X        85 49
X        79 52
X        73 51
X        66 48
X        61 43
X        52 41
X        49 36
X        50 28
X        51 21
X    	51 19
!FUNKY!STUFF!
echo extracting file spline
sed 's/^X//' > spline <<'!FUNKY!STUFF!'
Xspace   0 0 115 116 0
Xbppin   8
Xgray	128
Xchain   34
X        94 52
X        85 49
X        79 52
X        66 48
X        61 43
X        52 41
X        49 36
X        51 19
X        46 6
X        39 0
X        28 2
X        15 10
X        13 16
X        4 23
X        0 45
X        3 50
X        7 51
X        10 63
X        8 67
X        9 80
X        37 99
X        41 116
X        52 111
X        61 100
X        71 96
X        84 98
X        91 88
X        98 87
X        108 79
X        112 74
X        114 68
X        114 62
X        103 55
X        94 52
Xgray    255
Xbspline 4 34
X        94 52
X        85 49
X        79 52
X        66 48
X        61 43
X        52 41
X        49 36
X        51 19
X        46 6
X        39 0
X        28 2
X        15 10
X        13 16
X        4 23
X        0 45
X        3 50
X        7 51
X        10 63
X        8 67
X        9 80
X        37 99
X        41 116
X        52 111
X        61 100
X        71 96
X        84 98
X        91 88
X        98 87
X        108 79
X        112 74
X        114 68
X        114 62
X        103 55
X        94 52
!FUNKY!STUFF!
echo extracting file testp
sed 's/^X//' > testp <<'!FUNKY!STUFF!'
Xcomment test pattern
X
Xspace   0 0 100 200 0
Xbppin   3
Xfont    sr
Xfspec   1.000000 1.000000 1.570796
Xcolour  7 7 7
Xpensize 8
Xmove    10 10
Xlabel   Hello World
Xgray 	0
Xcomment	erase
Xpensize 1
Xgray    7
X
Xspace   0 0 99 99 0
Xarc     49 49 9 49 49 89
Xcolour  7 0 0
Xcircle  49 49 9
Xcolour  0 7 0
Xcircle  49 49 19
Xcolour  0 0 7
Xcircle  49 49 29
Xgray    1
Xline    0 9 99 9
Xgray    2
Xline    0 19 99 19
Xgray    3
Xline    0 29 99 29
Xgray    4
Xline    0 39 99 39
Xgray    5
Xline    0 49 99 49
Xgray    6
Xline    0 59 99 59
Xgray    7
Xline    0 69 99 69
Xcolour  7 0 0
Xline    9 0 9 99
Xcolour  0 7 0
Xline    19 0 19 99
Xcolour  0 0 7
Xline    29 0 29 99
Xcolour  7 7 0
Xline    39 0 39 99
Xcolour  7 0 7
Xline    49 0 49 99
Xcolour  0 7 7
Xline    59 0 59 99
Xcolour  7 7 7
Xline    69 0 69 99
Xmove    0 0
Xcont    99 0
Xcont    99 99
Xcont    0 99
Xcont    0 0
Xline    0 0 99 99
Xmove    0 0
Xmoverel 85 4
Xcontrel 10 0
Xcontrel 0 10
Xcontrel -10 0
Xcontrel 0 -10
Xmove    85 14
Xcontrel 10 -10
Xpoint   79 5
Xpoint   79 10
Xpoint   79 15
Xpoint   79 20
Xpoint   79 25
Xpoint   79 30
Xpoint   79 35
Xpoint   79 40
Xpoint   79 45
Xpoint   79 50
Xpoint   79 55
Xpoint   79 60
Xpoint   79 65
Xpoint   79 70
Xpoint   79 75
Xpoint   79 80
Xpoint   79 85
Xpoint   79 90
Xpoint   79 95
!FUNKY!STUFF!
echo extracting file yinyang
sed 's/^X//' > yinyang <<'!FUNKY!STUFF!'
Xcomment the classic yin/yang symbol
Xspace   -256 255 255 -256 1
Xcolour  255 255 255
Xarc     0 0 0 -256 0 255
Xarc     0 -127 0 -256 0 0
Xcircle  0 -127 10
Xarea    0 -127
Xcolour  255 0 0 
Xarc     0 0 0 255 0 -256
Xarc     0 127 0 255 0 0
Xcircle  0 127 10
Xarea    0 127
Xarea    0 -240
Xcolour  255 255 255
Xarea    0 240
!FUNKY!STUFF!
cd ..
echo  
echo finished installing directory test
echo
echo finished part 7 of 8

majka@ubc-vision.UUCP (Marc Majka) (04/28/86)

- - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - - CUT - - -
#!/bin/sh
#
# shell archive - extract with /bin/sh
#
echo Plot archive part 8 of 8
echo
echo installing directory vfont
echo  
mkdir vfont
cd vfont
echo extracting file README
sed 's/^X//' > README <<'!FUNKY!STUFF!'
XThis directory contains, in text form, a single vector font for drawing
Xlabels.  This font must be run through mkfont to be of any use. i.e, from 
Xthe parent directory:
X
X% mkfont vfont/sr.e vfont/sr
X
XThis font is derived from the Hershey fonts recently distributed in
Xmod.sources.  Other "fonts" may be created with the programs hform and
Xhfont.  hform reads, on standard input, the entire set of hersh.oc[1234]
Xfiles from that distribution, and creates two files in this directory. The
Xfile hf.table will contain a list of the Hershey "glyph numbers", and a
Xcharacter offset into the second file.  The second file contains, for each
Xglyph, a list of relative moves and draws for rendering that glyph. 
X
X% cat /wherever/you/put/the/hershey/fonts/hersh.oc[1234] | hform
X
XThe program hfont reads a list of char - glyph number pairs, and constructs
Xa font file in the format expected by the plot routines.  Included in this
Xdirectory are a number of input files to hfont to create some useful fonts.
XFor example,  To create a "Simplex Greek" font, run the command (from the 
Xparent of this directory):
X
X% hfont < vfont/mk.sg > vfont/sg
X
XThe mk.* files in tis directory are:
X
Xmk.cg   Complex Greek
Xmk.ci   Complex Italic
Xmk.cr   Complex Roman
Xmk.cs   Complex Script
Xmk.dr   Duplex Roman
Xmk.ge   Gothic English
Xmk.gg   Gothic German
Xmk.gi   Gothic Italian
Xmk.sg   Simplex Greek
Xmk.ss   Simplex Script
Xmk.ti   Triplex Italic
Xmk.tr   Triplex Roman
X
XYou can make your own fonts, including any of the Hershey glyphs, by running
Xhfont with an input file with the format:
X%d %d
Xchar glyphno
Xchar glyphno
Xchar glyphno
Xchar glyphno
Xchar glyphno
X.
X.
X.
X
XThe first line must contain two integer values (may be 0) which are
Xcoordinate system offsets for the characters.  Each successive line must be
Xa single character, followed by 1 space, followed by an integer.  The
Xcharacter may be any ascii character.  The integer is the glyph number. The
Xnew font created by hfont will cause the indicated glyph to be drawn in
Xplace of the given character in plotted labels.  hfont is reasonably fast,
Xso don't hesitate to experiment.
X
XThe program hcat will produce a set of 25 plot files.  Each file is a page
Xof a Hersey font catalogue.
!FUNKY!STUFF!
echo extracting file FORMAT
sed 's/^X//' > FORMAT <<'!FUNKY!STUFF!'
XFonts in this directory are stored in a two-part format.  The first part of
Xthe file is a list of (character index) pairs.  The second is a list of plot
Xcommands for each character in the font, separated by null (0) characters.
XThe x and y coordinates are signed 8 bit values.
X
XThe character is in one byte, in ASCII. The index is a 4 byte integer.  The
Xindex is a pointer into the plot list.  The two parts of the file are
Xseparated by a null (0) character.
X
XThe font can be read in C with:
X
Xreadfont(fontfp,clist,cindex,plist)
X
XFILE *fontfp;
Xchar *clist;
Xint  *cindex;
Xchar *plist;
X
X{
X    char c;        /* input character  */
X    int  cnum;     /* character number */
X    int  i;        /* counter          */
X
X    cnum = 0;
X    i = 0;
X
X    /* read the character index */	
X
X    fread (&c, 1, 1, fontfp);
X    while (c != '\0') {
X        clist[cnum] = c;
X        fread (&cindex[cnum++], 4, 1, fontfp);
X        fread (&c, 1, 1, fontfp);
X    }
X    
X    /* read the list of plot commands */
X    while (fread(&plist[i++], 1, 1, fontfp));
X
X}
X
XOnly moverel (M) and contrel(N) plot commands are used for the characters.
XFor example, the character F in the simplex roman font would comprise the
Xplot commands:
X
Xmoverel   4   0
Xcontrel   0 -21
Xmoverel   0  21
Xcontrel  13   0
Xmoverel -13 -10
Xcontrel   8   0
Xmoverel   6  10
X
XTo plot a character use the following algorithm:
X
X1: scan down clist for the desired character
X2: get the plotlist pointer from the corresponding cindex location
X3: scan plist from the pointer location until a null character, executing
X   the plot commands.
X
XA C routine to accomplish this is given below.
X
Xplotchar(c,clist,cindex,plist)
Xchar c, *clist;
Xint  *cindex;
Xchar *plist;
X{
X	int i;
X	short x, y;
X	
X	/* find the character */
X	for (i = 0; ((clist[i] != '\0') && (clist[i] != c)) i++);
X
X	if (clist[i] == '\0') return(0); /* character not in font */
X	
X	/* scan down the list to a null character */
X	while (plist[i] != '\0') {
X
X		/* get the x and y values from the 2nd and 3rd bytes */
X		x = (short)plist[i+1];
X		y = (short)plist[i+2];
X		
X		/* determine the type of plot command by the first byte */
X		if (plist[i] == 'M') moverel(x,y);
X		else contrel(x,y);
X		
X		/* increment i for the next 3 byte instruction */
X		i += 3;
X	}
X}
!FUNKY!STUFF!
echo extracting file mk.cg
sed 's/^X//' > mk.cg <<'!FUNKY!STUFF!'
X0 -12
X  699
X! 2714
X" 2728
X# 2275
X$ 2274
X% 2271
X& 2272
X^ 2247
X| 2229
X( 1403
X) 1404
X[ 1405
X] 1406
X` 2253
X' 2251
X@ 2273
X< 2241
X> 2242
X{ 2225
X} 2226
X* 2219
X+ 2232
X- 2231
X= 2238
X. 2210
X, 2211
X: 2212
X; 2213
X? 2215
X/ 2220
X0 2200
X1 2201
X2 2202
X3 2203
X4 2204
X5 2205
X6 2206
X7 2207
X8 2208
X9 2209
X\ 804
X~ 2246
XA 2027
XB 2028
XC 2029
XD 2030
XE 2031
XF 2032
XG 2033
XH 2034
XI 2035
XK 2036
XL 2037
XM 2038
XN 2039
XQ 2040
XO 2041
XP 2042
XR 2043
XS 2044
XT 2045
XV 2046
XW 2047
XX 2048
XY 2049
XZ 2050
Xa 2127
Xb 2128
Xc 2129
Xd 2130
Xe 2131
Xf 2132
Xg 2133
Xh 2134
Xi 2135
Xk 2136
Xl 2137
Xm 2138
Xn 2139
Xq 2140
Xo 2141
Xp 2142
Xr 2143
Xs 2144
Xt 2145
Xv 2146
Xw 2147
Xx 2148
Xy 2149
Xz 2150
!FUNKY!STUFF!
echo extracting file mk.ci
sed 's/^X//' > mk.ci <<'!FUNKY!STUFF!'
X0 -12
X  699
X! 2764
X" 2778
X# 2275
X$ 2769
X% 2271
X& 2768
X^ 2247
X| 2229
X( 2771
X) 2772
X[ 1405
X] 1406
X` 2766
X' 2767
X@ 2273
X< 2241
X> 2242
X{ 2225
X} 2226
X* 2773
X+ 2775
X- 2774
X= 2776
X. 2760
X, 2761
X: 2762
X; 2763
X? 2765
X/ 2770
X0 2750
X1 2751
X2 2752
X3 2753
X4 2754
X5 2755
X6 2756
X7 2757
X8 2758
X9 2759
X\ 804
X~ 2246
XA 2051
XB 2052
XC 2053
XD 2054
XE 2055
XF 2056
XG 2057
XH 2058
XI 2059
XJ 2060
XK 2061
XL 2062
XM 2063
XN 2064
XO 2065
XP 2066
XQ 2067
XR 2068
XS 2069
XT 2070
XU 2071
XV 2072
XW 2073
XX 2074
XY 2075
XZ 2076
Xa 2151
Xb 2152
Xc 2153
Xd 2154
Xe 2155
Xf 2156
Xg 2157
Xh 2158
Xi 2159
Xj 2160
Xk 2161
Xl 2162
Xm 2163
Xn 2164
Xo 2165
Xp 2166
Xq 2167
Xr 2168
Xs 2169
Xt 2170
Xu 2171
Xv 2172
Xw 2173
Xx 2174
Xy 2175
Xz 2176
!FUNKY!STUFF!
echo extracting file mk.cr
sed 's/^X//' > mk.cr <<'!FUNKY!STUFF!'
X0 -12
X  699
X! 2714
X" 2728
X# 2275
X$ 2274
X% 2271
X& 2272
X^ 2247
X| 2229
X( 1403
X) 1404
X[ 1405
X] 1406
X` 2253
X' 2251
X@ 2273
X< 2241
X> 2242
X{ 2225
X} 2226
X* 2219
X+ 2725
X- 2724
X= 2726
X. 2210
X, 2211
X: 2212
X; 2213
X? 2215
X/ 2720
X0 2200
X1 2201
X2 2202
X3 2203
X4 2204
X5 2205
X6 2206
X7 2207
X8 2208
X9 2209
X\ 804
X~ 2246
XA 2001
XB 2002
XC 2003
XD 2004
XE 2005
XF 2006
XG 2007
XH 2008
XI 2009
XJ 2010
XK 2011
XL 2012
XM 2013
XN 2014
XO 2015
XP 2016
XQ 2017
XR 2018
XS 2019
XT 2020
XU 2021
XV 2022
XW 2023
XX 2024
XY 2025
XZ 2026
Xa 2101
Xb 2102
Xc 2103
Xd 2104
Xe 2105
Xf 2106
Xg 2107
Xh 2108
Xi 2109
Xj 2110
Xk 2111
Xl 2112
Xm 2113
Xn 2114
Xo 2115
Xp 2116
Xq 2117
Xr 2118
Xs 2119
Xt 2120
Xu 2121
Xv 2122
Xw 2123
Xx 2124
Xy 2125
Xz 2126
!FUNKY!STUFF!
echo extracting file mk.cs
sed 's/^X//' > mk.cs <<'!FUNKY!STUFF!'
X0 -12
X  699
X! 2764
X" 2778
X# 2275
X$ 2769
X% 2271
X& 2768
X^ 2247
X| 2229
X( 2771
X) 2772
X[ 1405
X] 1406
X` 2766
X' 2767
X@ 2273
X< 2241
X> 2242
X{ 2225
X} 2226
X* 2773
X+ 2775
X- 2774
X= 2776
X. 2760
X, 2761
X: 2762
X; 2763
X? 2765
X/ 2770
X0 2750
X1 2751
X2 2752
X3 2753
X4 2754
X5 2755
X6 2756
X7 2757
X8 2758
X9 2759
X\ 804
X~ 2246
XA 2551
XB 2552
XC 2553
XD 2554
XE 2555
XF 2556
XG 2557
XH 2558
XI 2559
XJ 2560
XK 2561
XL 2562
XM 2563
XN 2564
XO 2565
XP 2566
XQ 2567
XR 2568
XS 2569
XT 2570
XU 2571
XV 2572
XW 2573
XX 2574
XY 2575
XZ 2576
Xa 2651
Xb 2652
Xc 2653
Xd 2654
Xe 2655
Xf 2656
Xg 2657
Xh 2658
Xi 2659
Xj 2660
Xk 2661
Xl 2662
Xm 2663
Xn 2664
Xo 2665
Xp 2666
Xq 2667
Xr 2668
Xs 2669
Xt 2670
Xu 2671
Xv 2672
Xw 2673
Xx 2674
Xy 2675
Xz 2676
!FUNKY!STUFF!
echo extracting file mk.dr
sed 's/^X//' > mk.dr <<'!FUNKY!STUFF!'
X0 -12
X  699
X! 2714
X" 2728
X# 2275
X$ 2719
X% 2271
X& 2718
X^ 2247
X| 2229
X( 2721
X) 2722
X[ 1405
X] 1406
X` 2716
X' 2717
X@ 2273
X< 2241
X> 2242
X{ 2225
X} 2226
X* 2723
X+ 2725
X- 2724
X= 2726
X. 2710
X, 2711
X: 2712
X; 2713
X? 2715
X/ 2720
X0 2700
X1 2701
X2 2702
X3 2703
X4 2704
X5 2705
X6 2706
X7 2707
X8 2708
X9 2709
X\ 804
X~ 2246
XA 2501
XB 2502
XC 2503
XD 2504
XE 2505
XF 2506
XG 2507
XH 2508
XI 2509
XJ 2510
XK 2511
XL 2512
XM 2513
XN 2514
XO 2515
XP 2516
XQ 2517
XR 2518
XS 2519
XT 2520
XU 2521
XV 2522
XW 2523
XX 2524
XY 2525
XZ 2526
Xa 2601
Xb 2602
Xc 2603
Xd 2604
Xe 2605
Xf 2606
Xg 2607
Xh 2608
Xi 2609
Xj 2610
Xk 2611
Xl 2612
Xm 2613
Xn 2614
Xo 2615
Xp 2616
Xq 2617
Xr 2618
Xs 2619
Xt 2620
Xu 2621
Xv 2622
Xw 2623
Xx 2624
Xy 2625
Xz 2626
!FUNKY!STUFF!
echo extracting file mk.ge
sed 's/^X//' > mk.ge <<'!FUNKY!STUFF!'
X0 -12
X  699
X! 3714
X" 3728
X# 2275
X$ 3719
X% 2271
X& 3718
X^ 2247
X| 2229
X( 3721
X) 3722
X[ 1405
X] 1406
X` 3716
X' 3717
X@ 2273
X< 2241
X> 2242
X{ 2225
X} 2226
X* 3723
X+ 3725
X- 3724
X= 3726
X. 3710
X, 3711
X: 3712
X; 3713
X? 3715
X/ 3720
X0 3700
X1 3701
X2 3702
X3 3703
X4 3704
X5 3705
X6 3706
X7 3707
X8 3708
X9 3709
X\ 804
X~ 2246
XA 3501
XB 3502
XC 3503
XD 3504
XE 3505
XF 3506
XG 3507
XH 3508
XI 3509
XJ 3510
XK 3511
XL 3512
XM 3513
XN 3514
XO 3515
XP 3516
XQ 3517
XR 3518
XS 3519
XT 3520
XU 3521
XV 3522
XW 3523
XX 3524
XY 3525
XZ 3526
Xa 3601
Xb 3602
Xc 3603
Xd 3604
Xe 3605
Xf 3606
Xg 3607
Xh 3608
Xi 3609
Xj 3610
Xk 3611
Xl 3612
Xm 3613
Xn 3614
Xo 3615
Xp 3616
Xq 3617
Xr 3618
Xs 3619
Xt 3620
Xu 3621
Xv 3622
Xw 3623
Xx 3624
Xy 3625
Xz 3626
!FUNKY!STUFF!
echo extracting file mk.gg
sed 's/^X//' > mk.gg <<'!FUNKY!STUFF!'
X0 -12
X  699
X! 3714
X" 3428
X# 3429
X$ 3427
X% 2271
X& 3718
X^ 2247
X| 2229
X( 3721
X) 3722
X[ 1405
X] 1406
X` 3716
X' 3717
X@ 2273
X< 2241
X> 2242
X{ 2225
X} 2226
X* 3723
X+ 3725
X- 3724
X= 3726
X. 3710
X, 3711
X: 3712
X; 3713
X? 3715
X/ 3720
X0 3700
X1 3701
X2 3702
X3 3703
X4 3704
X5 3705
X6 3706
X7 3707
X8 3708
X9 3709
X\ 804
X~ 2246
XA 3301
XB 3302
XC 3303
XD 3304
XE 3305
XF 3306
XG 3307
XH 3308
XI 3309
XJ 3310
XK 3311
XL 3312
XM 3313
XN 3314
XO 3315
XP 3316
XQ 3317
XR 3318
XS 3319
XT 3320
XU 3321
XV 3322
XW 3323
XX 3324
XY 3325
XZ 3326
Xa 3401
Xb 3402
Xc 3403
Xd 3404
Xe 3405
Xf 3406
Xg 3407
Xh 3408
Xi 3409
Xj 3410
Xk 3411
Xl 3412
Xm 3413
Xn 3414
Xo 3415
Xp 3416
Xq 3417
Xr 3418
Xs 3419
Xt 3420
Xu 3421
Xv 3422
Xw 3423
Xx 3424
Xy 3425
Xz 3426
!FUNKY!STUFF!
echo extracting file mk.gi
sed 's/^X//' > mk.gi <<'!FUNKY!STUFF!'
X0 -12
X  699
X! 3714
X" 3728
X# 2275
X$ 3719
X% 2271
X& 3718
X^ 2247
X| 2229
X( 3721
X) 3722
X[ 1405
X] 1406
X` 3716
X' 3717
X@ 2273
X< 2241
X> 2242
X{ 2225
X} 2226
X* 3723
X+ 3725
X- 3724
X= 3726
X. 3710
X, 3711
X: 3712
X; 3713
X? 3715
X/ 3720
X0 3700
X1 3701
X2 3702
X3 3703
X4 3704
X5 3705
X6 3706
X7 3707
X8 3708
X9 3709
X\ 804
X~ 2246
XA 3801
XB 3802
XC 3803
XD 3804
XE 3805
XF 3806
XG 3807
XH 3808
XI 3809
XJ 3810
XK 3811
XL 3812
XM 3813
XN 3814
XO 3815
XP 3816
XQ 3817
XR 3818
XS 3819
XT 3820
XU 3821
XV 3822
XW 3823
XX 3824
XY 3825
XZ 3826
Xa 3901
Xb 3902
Xc 3903
Xd 3904
Xe 3905
Xf 3906
Xg 3907
Xh 3908
Xi 3909
Xj 3910
Xk 3911
Xl 3912
Xm 3913
Xn 3914
Xo 3915
Xp 3916
Xq 3917
Xr 3918
Xs 3919
Xt 3920
Xu 3921
Xv 3922
Xw 3923
Xx 3924
Xy 3925
Xz 3926
!FUNKY!STUFF!
echo extracting file mk.sg
sed 's/^X//' > mk.sg <<'!FUNKY!STUFF!'
X0 -12
X  699
X! 714
X" 717
X# 733
X$ 719
X% 2271
X& 734
X^ 2247
X| 723
X( 721
X) 722
X[ 1405
X] 1406
X` 730
X' 731
X@ 2273
X< 2241
X> 2242
X{ 2225
X} 2226
X* 728
X+ 725
X- 725
X= 726
X. 710
X, 711
X: 712
X; 713
X? 715
X/ 802
X0 700
X1 701
X2 702
X3 703
X4 704
X5 705
X6 706
X7 707
X8 708
X9 709
X\ 804
X~ 2246
XA 527
XB 528
XC 529
XD 530
XE 531
XF 532
XG 533
XH 534
XI 535
XK 536
XL 537
XM 538
XN 539
XQ 540
XO 541
XP 542
XR 543
XS 544
XT 545
XV 546
XW 547
XX 548
XY 549
XZ 550
Xa 627
Xb 628
Xc 629
Xd 630
Xe 631
Xf 632
Xg 633
Xh 634
Xi 635
Xk 636
Xl 637
Xm 638
Xn 639
Xq 640
Xo 641
Xp 642
Xr 643
Xs 644
Xt 645
Xv 646
Xw 647
Xx 648
Xy 649
Xz 650
!FUNKY!STUFF!
echo extracting file mk.ss
sed 's/^X//' > mk.ss <<'!FUNKY!STUFF!'
X0 -12
X  699
X! 714
X" 717
X# 733
X$ 719
X% 2271
X& 734
X^ 756
X| 723
X( 721
X) 722
X[ 1405
X] 1406
X` 730
X' 731
X@ 2273
X< 2241
X> 2242
X{ 2225
X} 2226
X* 728
X+ 725
X- 725
X= 726
X. 710
X, 711
X: 712
X; 713
X? 715
X/ 802
X0 700
X1 701
X2 702
X3 703
X4 704
X5 705
X6 706
X7 707
X8 708
X9 709
X\ 804
X~ 2246
XA 551
XB 552
XC 553
XD 554
XE 555
XF 556
XG 557
XH 558
XI 559
XJ 560
XK 561
XL 562
XM 563
XN 564
XO 565
XP 566
XQ 567
XR 568
XS 569
XT 570
XU 571
XV 572
XW 573
XX 574
XY 575
XZ 576
Xa 651
Xb 652
Xc 653
Xd 654
Xe 655
Xf 656
Xg 657
Xh 658
Xi 659
Xj 660
Xk 661
Xl 662
Xm 663
Xn 664
Xo 665
Xp 666
Xq 667
Xr 668
Xs 669
Xt 670
Xu 671
Xv 672
Xw 673
Xx 674
Xy 675
Xz 676
!FUNKY!STUFF!
echo extracting file mk.ti
sed 's/^X//' > mk.ti <<'!FUNKY!STUFF!'
X0 -12
X  699
X! 3264
X" 3278
X# 2275
X$ 3269
X% 2271
X& 3268
X^ 2247
X| 2229
X( 3271
X) 3272
X[ 1405
X] 1406
X` 3266
X' 3267
X@ 2273
X< 2241
X> 2242
X{ 2225
X} 2226
X* 3273
X+ 3275
X- 3274
X= 3276
X. 3260
X, 3261
X: 3262
X; 3263
X? 3265
X/ 3270
X0 3250
X1 3251
X2 3252
X3 3253
X4 3254
X5 3255
X6 3256
X7 3257
X8 3258
X9 3259
X\ 804
X~ 2246
XA 3051
XB 3052
XC 3053
XD 3054
XE 3055
XF 3056
XG 3057
XH 3058
XI 3059
XJ 3060
XK 3061
XL 3062
XM 3063
XN 3064
XO 3065
XP 3066
XQ 3067
XR 3068
XS 3069
XT 3070
XU 3071
XV 3072
XW 3073
XX 3074
XY 3075
XZ 3076
Xa 3151
Xb 3152
Xc 3153
Xd 3154
Xe 3155
Xf 3156
Xg 3157
Xh 3158
Xi 3159
Xj 3160
Xk 3161
Xl 3162
Xm 3163
Xn 3164
Xo 3165
Xp 3166
Xq 3167
Xr 3168
Xs 3169
Xt 3170
Xu 3171
Xv 3172
Xw 3173
Xx 3174
Xy 3175
Xz 3176
!FUNKY!STUFF!
echo extracting file mk.tr
sed 's/^X//' > mk.tr <<'!FUNKY!STUFF!'
X0 -12
X  699
X! 3214
X" 3228
X# 2275
X$ 3219
X% 2271
X& 3218
X^ 2247
X| 2229
X( 3221
X) 3222
X[ 1405
X] 1406
X` 3216
X' 3217
X@ 2273
X< 2241
X> 2242
X{ 2225
X} 2226
X* 3223
X+ 3225
X- 3224
X= 3226
X. 3210
X, 3211
X: 3212
X; 3213
X? 3215
X/ 3220
X0 3200
X1 3201
X2 3202
X3 3203
X4 3204
X5 3205
X6 3206
X7 3207
X8 3208
X9 3209
X\ 804
X~ 2246
XA 3001
XB 3002
XC 3003
XD 3004
XE 3005
XF 3006
XG 3007
XH 3008
XI 3009
XJ 3010
XK 3011
XL 3012
XM 3013
XN 3014
XO 3015
XP 3016
XQ 3017
XR 3018
XS 3019
XT 3020
XU 3021
XV 3022
XW 3023
XX 3024
XY 3025
XZ 3026
Xa 3101
Xb 3102
Xc 3103
Xd 3104
Xe 3105
Xf 3106
Xg 3107
Xh 3108
Xi 3109
Xj 3110
Xk 3111
Xl 3112
Xm 3113
Xn 3114
Xo 3115
Xp 3116
Xq 3117
Xr 3118
Xs 3119
Xt 3120
Xu 3121
Xv 3122
Xw 3123
Xx 3124
Xy 3125
Xz 3126
!FUNKY!STUFF!
echo extracting file sr.e
sed 's/^X//' > sr.e <<'!FUNKY!STUFF!'
X!:
XM 5 0
XN 0 -14
XM 0 -5
XN -1 -1
XN 1 -1
XN 1 1
XN -1 1
XM 5 19
XE
X":
XM 4 0
XN 0 -7
XM 8 7
XN 0 -7
XM 4 7
XE
X#:
XM 11 4
XN -7 -32
XM 13 32
XN -7 -32
XM -6 19
XN 14 0
XM -15 -6
XN 14 0
XM 4 15
XE
X$:
XM 8 4
XN 0 -29
XM 4 29
XN 0 -29
XM 5 22
XN -2 2
XN -3 1
XN -4 0
XN -3 -1
XN -2 -2
XN 0 -2
XN 1 -2
XN 1 -1
XN 2 -1
XN 6 -2
XN 2 -1
XN 1 -1
XN 1 -2
XN 0 -3
XN -2 -2
XN -3 -1
XN -4 0
XN -3 1
XN -2 2
XM 17 18
XE
X%:
XM 21 0
XN -18 -21
XM 5 21
XN 2 -2
XN 0 -2
XN -1 -2
XN -2 -1
XN -2 0
XN -2 2
XN 0 2
XN 1 2
XN 2 1
XN 2 0
XN 2 -1
XN 3 -1
XN 3 0
XN 3 1
XN 2 1
XM -4 -14
XN -2 -1
XN -1 -2
XN 0 -2
XN 2 -2
XN 2 0
XN 2 1
XN 1 2
XN 0 2
XN -2 2
XN -2 0
XM 7 14
XE
X&:
XM 23 -9
XN 0 1
XN -1 1
XN -1 0
XN -1 -1
XN -1 -2
XN -2 -5
XN -2 -3
XN -2 -2
XN -2 -1
XN -4 0
XN -2 1
XN -1 1
XN -1 2
XN 0 2
XN 1 2
XN 1 1
XN 7 4
XN 1 1
XN 1 2
XN 0 2
XN -1 2
XN -2 1
XN -2 -1
XN -1 -2
XN 0 -2
XN 1 -3
XN 2 -3
XN 5 -7
XN 2 -2
XN 2 -1
XN 2 0
XN 1 1
XN 0 1
XM 3 19
XE
X':
XM 5 -2
XN -1 1
XN 1 1
XN 1 -1
XN 0 -2
XN -1 -2
XN -1 -1
XM 6 6
XE
X(:
XM 11 4
XN -2 -2
XN -2 -3
XN -2 -4
XN -1 -5
XN 0 -4
XN 1 -5
XN 2 -4
XN 2 -3
XN 2 -2
XM 3 28
XE
X):
XM 3 4
XN 2 -2
XN 2 -3
XN 2 -4
XN 1 -5
XN 0 -4
XN -1 -5
XN -2 -4
XN -2 -3
XN -2 -2
XM 11 28
XE
X*:
XM 8 -6
XN 0 -12
XM -5 9
XN 10 -6
XM 0 6
XN -10 -6
XM 13 15
XE
X+:
XM 13 -3
XN 0 -18
XM -9 9
XN 18 0
XM 4 12
XE
X,:
XM 6 -20
XN -1 -1
XN -1 1
XN 1 1
XN 1 -1
XN 0 -2
XN -1 -2
XN -1 -1
XM 6 25
XE
X-:
XM 4 -12
XN 18 0
XM 4 12
XE
X_:
XM 3 -21
XN 18 0
XM 3 21
XE
X.:
XM 5 -19
XN -1 -1
XN 1 -1
XN 1 1
XN -1 1
XM 5 19
XE
X/:
XM 20 4
XN -18 -32
XM 20 28
XE
X0:
XM 9 0
XN -3 -1
XN -2 -3
XN -1 -5
XN 0 -3
XN 1 -5
XN 2 -3
XN 3 -1
XN 2 0
XN 3 1
XN 2 3
XN 1 5
XN 0 3
XN -1 5
XN -2 3
XN -3 1
XN -2 0
XM 11 0
XE
X1:
XM 6 -4
XN 2 1
XN 3 3
XN 0 -21
XM 9 21
XE
X2:
XM 4 -5
XN 0 1
XN 1 2
XN 1 1
XN 2 1
XN 4 0
XN 2 -1
XN 1 -1
XN 1 -2
XN 0 -2
XN -1 -2
XN -2 -3
XN -10 -10
XN 14 0
XM 3 21
XE
X3:
XM 5 0
XN 11 0
XN -6 -8
XN 3 0
XN 2 -1
XN 1 -1
XN 1 -3
XN 0 -2
XN -1 -3
XN -2 -2
XN -3 -1
XN -3 0
XN -3 1
XN -1 1
XN -1 2
XM 17 17
XE
X4:
XM 13 0
XN -10 -14
XN 15 0
XM -5 14
XN 0 -21
XM 7 21
XE
X5:
XM 15 0
XN -10 0
XN -1 -9
XN 1 1
XN 3 1
XN 3 0
XN 3 -1
XN 2 -2
XN 1 -3
XN 0 -2
XN -1 -3
XN -2 -2
XN -3 -1
XN -3 0
XN -3 1
XN -1 1
XN -1 2
XM 17 17
XE
X6:
XM 16 -3
XN -1 2
XN -3 1
XN -2 0
XN -3 -1
XN -2 -3
XN -1 -5
XN 0 -5
XN 1 -4
XN 2 -2
XN 3 -1
XN 1 0
XN 3 1
XN 2 2
XN 1 3
XN 0 1
XN -1 3
XN -2 2
XN -3 1
XN -1 0
XN -3 -1
XN -2 -2
XN -1 -3
XM 16 14
XE
X7:
XM 17 0
XN -10 -21
XM -4 21
XN 14 0
XM 3 0
XE
X8:
XM 8 0
XN -3 -1
XN -1 -2
XN 0 -2
XN 1 -2
XN 2 -1
XN 4 -1
XN 3 -1
XN 2 -2
XN 1 -2
XN 0 -3
XN -1 -2
XN -1 -1
XN -3 -1
XN -4 0
XN -3 1
XN -1 1
XN -1 2
XN 0 3
XN 1 2
XN 2 2
XN 3 1
XN 4 1
XN 2 1
XN 1 2
XN 0 2
XN -1 2
XN -3 1
XN -4 0
XM 12 0
XE
X9:
XM 16 -7
XN -1 -3
XN -2 -2
XN -3 -1
XN -1 0
XN -3 1
XN -2 2
XN -1 3
XN 0 1
XN 1 3
XN 2 2
XN 3 1
XN 1 0
XN 3 -1
XN 2 -2
XN 1 -4
XN 0 -5
XN -1 -5
XN -2 -3
XN -3 -1
XN -2 0
XN -3 1
XN -1 2
XM 16 18
XE
X::
XM 5 -7
XN -1 -1
XN 1 -1
XN 1 1
XN -1 1
XM 0 -12
XN -1 -1
XN 1 -1
XN 1 1
XN -1 1
XM 5 19
XE
X;:
XM 5 -7
XN -1 -1
XN 1 -1
XN 1 1
XN -1 1
XM 1 -13
XN -1 -1
XN -1 1
XN 1 1
XN 1 -1
XN 0 -2
XN -1 -2
XN -1 -1
XM 6 25
XE
X<:
XM 20 -3
XN -16 -9
XN 16 -9
XM 4 21
XE
X=:
XM 4 -9
XN 18 0
XM -18 -6
XN 18 0
XM 4 15
XE
X>:
XM 4 -3
XN 16 -9
XN -16 -9
XM 20 21
XE
X?:
XM 3 -5
XN 0 1
XN 1 2
XN 1 1
XN 2 1
XN 4 0
XN 2 -1
XN 1 -1
XN 1 -2
XN 0 -2
XN -1 -2
XN -1 -1
XN -4 -2
XN 0 -3
XM 0 -5
XN -1 -1
XN 1 -1
XN 1 1
XN -1 1
XM 9 19
XE
X@:
XM 18 -8
XN -1 2
XN -2 1
XN -3 0
XN -2 -1
XN -1 -1
XN -1 -3
XN 0 -3
XN 1 -2
XN 2 -1
XN 3 0
XN 2 1
XN 1 2
XM -5 8
XN -2 -2
XN -1 -3
XN 0 -3
XN 1 -2
XN 1 -1
XM 7 11
XN -1 -8
XN 0 -2
XN 2 -1
XN 2 0
XN 2 2
XN 1 3
XN 0 2
XN -1 3
XN -1 2
XN -2 2
XN -2 1
XN -3 1
XN -3 0
XN -3 -1
XN -2 -1
XN -2 -2
XN -1 -2
XN -1 -3
XN 0 -3
XN 1 -3
XN 1 -2
XN 2 -2
XN 2 -1
XN 3 -1
XN 3 0
XN 3 1
XN 2 1
XN 1 1
XM -2 13
XN -1 -8
XN 0 -2
XN 1 -1
XM 8 16
XE
XA:
XM 9 0
XN -8 -21
XM 8 21
XN 8 -21
XM -13 7
XN 10 0
XM 4 14
XE
XB:
XM 4 0
XN 0 -21
XM 0 21
XN 9 0
XN 3 -1
XN 1 -1
XN 1 -2
XN 0 -2
XN -1 -2
XN -1 -1
XN -3 -1
XM -9 0
XN 9 0
XN 3 -1
XN 1 -1
XN 1 -2
XN 0 -3
XN -1 -2
XN -1 -1
XN -3 -1
XN -9 0
XM 17 21
XE
XC:
XM 18 -5
XN -1 2
XN -2 2
XN -2 1
XN -4 0
XN -2 -1
XN -2 -2
XN -1 -2
XN -1 -3
XN 0 -5
XN 1 -3
XN 1 -2
XN 2 -2
XN 2 -1
XN 4 0
XN 2 1
XN 2 2
XN 1 2
XM 3 16
XE
XD:
XM 4 0
XN 0 -21
XM 0 21
XN 7 0
XN 3 -1
XN 2 -2
XN 1 -2
XN 1 -3
XN 0 -5
XN -1 -3
XN -1 -2
XN -2 -2
XN -3 -1
XN -7 0
XM 17 21
XE
XE:
XM 4 0
XN 0 -21
XM 0 21
XN 13 0
XM -13 -10
XN 8 0
XM -8 -11
XN 13 0
XM 2 21
XE
XF:
XM 4 0
XN 0 -21
XM 0 21
XN 13 0
XM -13 -10
XN 8 0
XM 6 10
XE
XG:
XM 18 -5
XN -1 2
XN -2 2
XN -2 1
XN -4 0
XN -2 -1
XN -2 -2
XN -1 -2
XN -1 -3
XN 0 -5
XN 1 -3
XN 1 -2
XN 2 -2
XN 2 -1
XN 4 0
XN 2 1
XN 2 2
XN 1 2
XN 0 3
XM -5 0
XN 5 0
XM 3 13
XE
XH:
XM 4 0
XN 0 -21
XM 14 21
XN 0 -21
XM -14 11
XN 14 0
XM 4 10
XE
XI:
XM 4 0
XN 0 -21
XM 4 21
XE
XJ:
XM 12 0
XN 0 -16
XN -1 -3
XN -1 -1
XN -2 -1
XN -2 0
XN -2 1
XN -1 1
XN -1 3
XN 0 2
XM 14 14
XE
XK:
XM 4 0
XN 0 -21
XM 14 21
XN -14 -14
XM 5 5
XN 9 -12
XM 3 21
XE
XL:
XM 4 0
XN 0 -21
XM 0 0
XN 12 0
XM 1 21
XE
XM:
XM 4 0
XN 0 -21
XM 0 21
XN 8 -21
XM 8 21
XN -8 -21
XM 8 21
XN 0 -21
XM 4 21
XE
XN:
XM 4 0
XN 0 -21
XM 0 21
XN 14 -21
XM 0 21
XN 0 -21
XM 4 21
XE
XO:
XM 9 0
XN -2 -1
XN -2 -2
XN -1 -2
XN -1 -3
XN 0 -5
XN 1 -3
XN 1 -2
XN 2 -2
XN 2 -1
XN 4 0
XN 2 1
XN 2 2
XN 1 2
XN 1 3
XN 0 5
XN -1 3
XN -1 2
XN -2 2
XN -2 1
XN -4 0
XM 13 0
XE
XP:
XM 4 0
XN 0 -21
XM 0 21
XN 9 0
XN 3 -1
XN 1 -1
XN 1 -2
XN 0 -3
XN -1 -2
XN -1 -1
XN -3 -1
XN -9 0
XM 17 11
XE
XQ:
XM 9 0
XN -2 -1
XN -2 -2
XN -1 -2
XN -1 -3
XN 0 -5
XN 1 -3
XN 1 -2
XN 2 -2
XN 2 -1
XN 4 0
XN 2 1
XN 2 2
XN 1 2
XN 1 3
XN 0 5
XN -1 3
XN -1 2
XN -2 2
XN -2 1
XN -4 0
XM 3 -17
XN 6 -6
XM 4 23
XE
XR:
XM 4 0
XN 0 -21
XM 0 21
XN 9 0
XN 3 -1
XN 1 -1
XN 1 -2
XN 0 -2
XN -1 -2
XN -1 -1
XN -3 -1
XN -9 0
XM 7 0
XN 7 -11
XM 3 21
XE
XS:
XM 17 -3
XN -2 2
XN -3 1
XN -4 0
XN -3 -1
XN -2 -2
XN 0 -2
XN 1 -2
XN 1 -1
XN 2 -1
XN 6 -2
XN 2 -1
XN 1 -1
XN 1 -2
XN 0 -3
XN -2 -2
XN -3 -1
XN -4 0
XN -3 1
XN -2 2
XM 17 18
XE
XT:
XM 8 0
XN 0 -21
XM -7 21
XN 14 0
XM 1 0
XE
XU:
XM 4 0
XN 0 -15
XN 1 -3
XN 2 -2
XN 3 -1
XN 2 0
XN 3 1
XN 2 2
XN 1 3
XN 0 15
XM 4 0
XE
XV:
XM 1 0
XN 8 -21
XM 8 21
XN -8 -21
XM 9 21
XE
XW:
XM 2 0
XN 5 -21
XM 5 21
XN -5 -21
XM 5 21
XN 5 -21
XM 5 21
XN -5 -21
XM 7 21
XE
XX:
XM 3 0
XN 14 -21
XM 0 21
XN -14 -21
XM 17 21
XE
XY:
XM 1 0
XN 8 -10
XN 0 -11
XM 8 21
XN -8 -10
XM 9 10
XE
XZ:
XM 17 0
XN -14 -21
XM 0 21
XN 14 0
XM -14 -21
XN 14 0
XM 3 21
XE
X[:
XM 4 4
XN 0 -32
XM 1 32
XN 0 -32
XM -1 32
XN 7 0
XM -7 -32
XN 7 0
XM 3 28
XE
X\:
XM 0 0
XN 14 -24
XM 0 24
XE
X]:
XM 9 4
XN 0 -32
XM 1 32
XN 0 -32
XM -7 32
XN 7 0
XM -7 -32
XN 7 0
XM 4 28
XE
X^:
XM 5 -5
XN -1 -2
XN -2 -3
XN -2 -2
XM 5 7
XN 1 -2
XN 2 -3
XN 2 -2
XM 0 12
XE
X`:
XM 6 0
XN -1 -1
XN -1 -2
XN 0 -2
XN 1 -1
XN 1 1
XN -1 1
XM 5 4
XE
Xa:
XM 15 -7
XN 0 -14
XM 0 11
XN -2 2
XN -2 1
XN -3 0
XN -2 -1
XN -2 -2
XN -1 -3
XN 0 -2
XN 1 -3
XN 2 -2
XN 2 -1
XN 3 0
XN 2 1
XN 2 2
XM 4 18
XE
Xb:
XM 4 0
XN 0 -21
XM 0 11
XN 2 2
XN 2 1
XN 3 0
XN 2 -1
XN 2 -2
XN 1 -3
XN 0 -2
XN -1 -3
XN -2 -2
XN -2 -1
XN -3 0
XN -2 1
XN -2 2
XM 15 18
XE
Xc:
XM 15 -10
XN -2 2
XN -2 1
XN -3 0
XN -2 -1
XN -2 -2
XN -1 -3
XN 0 -2
XN 1 -3
XN 2 -2
XN 2 -1
XN 3 0
XN 2 1
XN 2 2
XM 3 18
XE
Xd:
XM 15 0
XN 0 -21
XM 0 11
XN -2 2
XN -2 1
XN -3 0
XN -2 -1
XN -2 -2
XN -1 -3
XN 0 -2
XN 1 -3
XN 2 -2
XN 2 -1
XN 3 0
XN 2 1
XN 2 2
XM 4 18
XE
Xe:
XM 3 -13
XN 12 0
XN 0 2
XN -1 2
XN -1 1
XN -2 1
XN -3 0
XN -2 -1
XN -2 -2
XN -1 -3
XN 0 -2
XN 1 -3
XN 2 -2
XN 2 -1
XN 3 0
XN 2 1
XN 2 2
XM 3 18
XE
Xf:
XM 10 0
XN -2 0
XN -2 -1
XN -1 -3
XN 0 -17
XM -3 14
XN 7 0
XM 3 7
XE
Xg:
XM 15 -7
XN 0 -16
XN -1 -3
XN -1 -1
XN -2 -1
XN -3 0
XN -2 1
XM 9 17
XN -2 2
XN -2 1
XN -3 0
XN -2 -1
XN -2 -2
XN -1 -3
XN 0 -2
XN 1 -3
XN 2 -2
XN 2 -1
XN 3 0
XN 2 1
XN 2 2
XM 4 18
XE
Xh:
XM 4 0
XN 0 -21
XM 0 10
XN 3 3
XN 2 1
XN 3 0
XN 2 -1
XN 1 -3
XN 0 -10
XM 4 21
XE
Xi:
XM 3 0
XN 1 -1
XN 1 1
XN -1 1
XN -1 -1
XM 1 -7
XN 0 -14
XM 4 21
XE
Xj:
XM 5 0
XN 1 -1
XN 1 1
XN -1 1
XN -1 -1
XM 1 -7
XN 0 -17
XN -1 -3
XN -2 -1
XN -2 0
XM 9 28
XE
Xk:
XM 4 0
XN 0 -21
XM 10 14
XN -10 -10
XM 4 4
XN 7 -8
XM 2 21
XE
Xl:
XM 4 0
XN 0 -21
XM 4 21
XE
Xm:
XM 4 -7
XN 0 -14
XM 0 10
XN 3 3
XN 2 1
XN 3 0
XN 2 -1
XN 1 -3
XN 0 -10
XM 0 10
XN 3 3
XN 2 1
XN 3 0
XN 2 -1
XN 1 -3
XN 0 -10
XM 4 21
XE
Xn:
XM 4 -7
XN 0 -14
XM 0 10
XN 3 3
XN 2 1
XN 3 0
XN 2 -1
XN 1 -3
XN 0 -10
XM 4 21
XE
Xo:
XM 8 -7
XN -2 -1
XN -2 -2
XN -1 -3
XN 0 -2
XN 1 -3
XN 2 -2
XN 2 -1
XN 3 0
XN 2 1
XN 2 2
XN 1 3
XN 0 2
XN -1 3
XN -2 2
XN -2 1
XN -3 0
XM 11 7
XE
Xp:
XM 4 -7
XN 0 -21
XM 0 18
XN 2 2
XN 2 1
XN 3 0
XN 2 -1
XN 2 -2
XN 1 -3
XN 0 -2
XN -1 -3
XN -2 -2
XN -2 -1
XN -3 0
XN -2 1
XN -2 2
XM 15 18
XE
Xq:
XM 15 -7
XN 0 -21
XM 0 18
XN -2 2
XN -2 1
XN -3 0
XN -2 -1
XN -2 -2
XN -1 -3
XN 0 -2
XN 1 -3
XN 2 -2
XN 2 -1
XN 3 0
XN 2 1
XN 2 2
XM 4 18
XE
Xr:
XM 4 -7
XN 0 -14
XM 0 8
XN 1 3
XN 2 2
XN 2 1
XN 3 0
XM 1 7
XE
Xs:
XM 14 -10
XN -1 2
XN -3 1
XN -3 0
XN -3 -1
XN -1 -2
XN 1 -2
XN 2 -1
XN 5 -1
XN 2 -1
XN 1 -2
XN 0 -1
XN -1 -2
XN -3 -1
XN -3 0
XN -3 1
XN -1 2
XM 14 18
XE
Xt:
XM 5 0
XN 0 -17
XN 1 -3
XN 2 -1
XN 2 0
XM -8 14
XN 7 0
XM 3 7
XE
Xu:
XM 4 -7
XN 0 -10
XN 1 -3
XN 2 -1
XN 3 0
XN 2 1
XN 3 3
XM 0 10
XN 0 -14
XM 4 21
XE
Xv:
XM 2 -7
XN 6 -14
XM 6 14
XN -6 -14
XM 8 21
XE
Xw:
XM 3 -7
XN 4 -14
XM 4 14
XN -4 -14
XM 4 14
XN 4 -14
XM 4 14
XN -4 -14
XM 7 21
XE
Xx:
XM 3 -7
XN 11 -14
XM 0 14
XN -11 -14
XM 14 21
XE
Xy:
XM 2 -7
XN 6 -14
XM 6 14
XN -6 -14
XN -2 -4
XN -2 -2
XN -2 -1
XN -1 0
XM 15 28
XE
Xz:
XM 14 -7
XN -11 -14
XM 0 14
XN 11 0
XM -11 -14
XN 11 0
XM 3 21
XE
X{:
XM 9 4
XN -3 -3
XN -1 -3
XN 0 -2
XN 1 -3
XN 3 -3
XM -2 12
XN -1 -3
XN 0 -4
XN 1 -3
XM 2 -2
XN -3 -2
XN 3 -2
XM 0 0
XN -3 -3
XN -1 -3
XN 0 -2
XN 1 -3
XN 3 -3
XM -2 12
XN -1 -3
XN 0 -4
XN 1 -3
XM 7 26
XE
X|:
XM 4 4
XN 0 -32
XM 4 28
XE
X}:
XM 5 4
XN 3 -3
XN 1 -3
XN 0 -2
XN -1 -3
XN -3 -3
XM 2 12
XN 1 -3
XN 0 -4
XN -1 -3
XM -2 -2
XN 3 -2
XN -3 -2
XM 0 0
XN 3 -3
XN 1 -3
XN 0 -2
XN -1 -3
XN -3 -3
XM 2 12
XN 1 -3
XN 0 -4
XN -1 -3
XM 7 26
XE
X~:
XM 3 -15
XN 0 2
XN 1 3
XN 2 1
XN 2 0
XN 2 -1
XN 4 -3
XN 2 -1
XN 2 0
XN 2 1
XN 1 2
XM -18 -2
XN 1 2
XN 2 1
XN 2 0
XN 2 -1
XN 4 -3
XN 2 -1
XN 2 0
XN 2 1
XN 1 3
XN 0 2
XM 3 9
XE
X :
XM 20 0
XE
!FUNKY!STUFF!
cd ..
echo  
echo finished installing directory vfont
echo
echo finished part 8 of 8