Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1 6/24/83; site ubc-vision.UUCP Path: utzoo!utcsri!ubc-vision!majka From: majka@ubc-vision.UUCP (Marc Majka) Newsgroups: net.sources Subject: Super Plot (2 of 8) Message-ID: <119@ubc-vision.UUCP> Date: Sun, 27-Apr-86 18:47:51 EDT Article-I.D.: ubc-visi.119 Posted: Sun Apr 27 18:47:51 1986 Date-Received: Mon, 28-Apr-86 04:01:12 EDT Organization: UBC Computational Vision Lab, Vancouver, B.C., Canada Lines: 689 - - - 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 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 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 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