Super Plot (3 of 8)

Marc Majka majka at ubc-vision.UUCP
Mon Apr 28 08:48:42 AEST 1986


- - - 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



More information about the Comp.sources.unix mailing list