/**************************************************************** * LineDrawer by John M. Olsen. V1.0 July 5, 1987 * * John M. Olsen * 1547 Jamestown Drive * Salt Lake City, UT 84121-2051 * * Network addresses: * u-jmolse@ug.utah.edu or ...!{seismo,ihnp4}!utah-cs!utah-ug!u-jmolse * * This is public domain software. Do whatever you want with it. * Just don't complain to me when it breaks after a few hundred people * have hacked on it. :^) * * This program takes a data file as a parameter and makes a line drawing * based on the commands in the file. The instruction format is listed * below. There should be two data files included. One is a Mercator * projection of the USA, and the other is a really short demo of how to use * the color changing and line patterning commands. * * Manx Instructions: * cc LineDrawer.c * ln LineDrawer.o -lc * * It should (no guarantees) work fine with Lettuce C since I used only * longs, and have (hopefully) everything type cast correctly. ****************************************************************/ #include #include #include #include #include void *OpenLibrary(); struct Window *OpenWindow(), *w; struct IntuiMessage *GetMsg(), *WaitPort(), *mesg; struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct NewWindow nw = { 0, 10, 320, 100, /* window corner and size */ -1, -1, CLOSEWINDOW | NEWSIZE, /* messages I want */ ACTIVATE | NOCAREREFRESH | WINDOWCLOSE | WINDOWDRAG | WINDOWDEPTH | WINDOWSIZING | GIMMEZEROZERO, NULL, NULL, (UBYTE *) "LineDrawer by John M. Olsen V1.0", NULL, NULL, 50,20,-1,-1, WBENCHSCREEN }; main(argc,argv) int argc; char *argv[]; { char stuff[80]; FILE *temp; if(!argc) { exit(1); /* not run from the cli */ } if(!(temp = fopen(argv[1],"r"))) { printf("Usage: %s \n\n",argv[0]); puts("Valid instructions:"); puts("1 minx miny maxx maxy"); puts("2 x y (draw to a point)"); puts("3 x y (move to a point)"); puts("4 color (change foreground color)"); puts("5 color (change background color)"); puts("6 mode (change drawmode)"); puts("Lines beginning with a letter are comments."); puts("Comments may also follow instructions."); exit(1); /* file does not exist. */ } fclose(temp); if(GfxBase = OpenLibrary("graphics.library",32L)) /* 1.1 is okay */ { if(IntuitionBase = OpenLibrary("intuition.library",32L)) { if(w = OpenWindow(&nw)) { while(1) { body(argc,argv); if(!mesg) { /* message not found in body */ mesg = WaitPort(w->UserPort); mesg = GetMsg(w->UserPort); } if (mesg->Class == CLOSEWINDOW) break; /* die gracefully */ ReplyMsg(mesg); mesg = NULL; } ReplyMsg(mesg); /* reply after break */ CloseWindow(w); } CloseLibrary(IntuitionBase); } CloseLibrary(GfxBase); } exit(0); } X/**************************************************************** * All of the setup work is done, so do the picture now. Argv and argc have * just been passed on to this routine for simplicity. * * Data file format: * lines may have white space just about anywhere. Each command line begins * with a number followed by a number of parameters. Any line not starting * with an appropriate number (after white space, if any) is considered to * be a comment. Lines may also have a comment after the data. * * 1: minx miny maxx maxy. These tell what range the coordinates fall into. * 2: x y. Draw a line from current position to x,y. * 3: x y. Move pen to position x,y. * 4: color. Foreground pen color. * 5: color. Background pen color. * 6: pattern. Line pattern. This is an unsigned word 0 to 65536 (0 to $ffff) * 7: mode. This can change the way 4 to 6 appear by using only foreground, * or complimenting colors, etc. It can do some strange stuff. * The current (unguaranteed values) usable here are: * JAM1: 0 * JAM2: 1 * COMPLIMENT: 2 * INVERSVID: 4 * You can add these, so 3 = JAM2 and COMPLIMENT. ****************************************************************/ body(argc,argv) int argc; char *argv[]; { FILE *input; long minx, miny, maxx, maxy, cmd, x, y; struct RastPort *r; char str[100]; r = w->RPort; SetRast(r,0L); SetAPen(r,1L); SetBPen(r,0L); if (input = fopen(argv[1],"r")) { while((cmd = fgetc(input)) != EOF) { mesg = GetMsg(w->UserPort); if(mesg) /* break out if a message recvd */ break; switch(cmd) { case '1': /* min and max x,y */ { fscanf(input,"%ld%ld%ld%ld", &minx,&miny,&maxx,&maxy); break; } case '2': /* draw to */ { fscanf(input,"%ld%ld",&x,&y); Draw(r,(((x-minx) *(w->GZZWidth))/(maxx - minx)), (((y-miny) *(w->GZZHeight))/(maxy-miny))); break; } case '3': /* move to */ { fscanf(input,"%ld%ld",&x,&y); Move(r,(((x-minx) *(w->GZZWidth))/(maxx - minx)), (((y-miny) *(w->GZZHeight))/(maxy-miny))); break; } case '4': /* foreground color */ { fscanf(input,"%ld",&x); SetAPen(r, x); break; } case '5': /* background color */ { fscanf(input,"%ld",&x); SetBPen(r,x); break; } case '6': /* draw pattern */ { fscanf(input,"%ld",&x); SetDrPt(r,x); break; } case '7': /* draw mode */ { fscanf(input,"%ld",&x); SetDrMd(r,x); break; } case ' ': /* leading white space */ case '\n': case '\t': case '\r': { break; } default: /* must be a comment */ { fgets(str,100,input); break; } } } fclose(input); } }