// // REDDRAW program // // consists of redraw.bcpl, init.bcpl, drawfile.bcpl, redraw.d, zpArrows; // uses vec.d vec.bcpl dspline1.bcpl // // // load using // BLDR/l/v redraw init drawfile vec GP DSPLINE1 UtilStr ReadUserCmItem // Template Float // TimeConvA TimeConvB TimeIO zpArrows // // Copyright 1980,1982 Bruce D. Lucas // //Sproull 1/83 changed UNITTabSize = -200 to fix stack overflow get "Redraw.d" get "Streams.d" get "vec.d" static [ OptFlag = true // whether to optimize orthogonal lines VerboseFlag = false // verbose QuietFlag = false // quiet ColorFlag = false // whether to make colored (non-black) lines 3/4 size ScribeFlag = false // whether to put <==<< marker in picture MergeFlag = false // whether to merge draw files MAXKNOTS = 100 // maximum knots per spline UNITTabSize = -200 // allow 200 * sizeof UNIT words for the stack FONTTabSize = 50 // vec package font table size - don't confuse w/ draw fonts MinDelta = 1 // minimum delta MaxDelta = 16 // maximum delta DashOn = 80 // Dover scan lines in on (black) part of dashed spline DashOff = 48 // Dover scan lines in off (white) part UserX = 0 // x offset specified by user switch UserY = 0 // y offset specified by user switch p0x; p0y // global buffers for x, y points and derivatives p1x; p1y p2x; p2y p3x; p3y NoTablesYet = true // whether we've allocated the knot tables yet BrushTable // table structured as FONTS for draw brushes TextTable // table structures as FONTS for draw text ] let Main() be [ PutTemplate(dsp,"ReDDraw Version 2.3*c") UserCmGet() InitFloat() let ResultVec = vec 50 let SwitchVec = vec 20 let PressFileName = vec 50 let DrawFileName = vec 50 let FontFileName = vec 50 let arg = vec 50 SetupReadParam(0,SwitchVec,0,0) // get the flag switches for i=1 to SwitchVec!0 do [ switchon SwitchVec!i into [ case $o: case $O: OptFlag = not OptFlag; endcase case $v: case $V: VerboseFlag = not VerboseFlag; endcase case $c: case $C: ColorFlag = not ColorFlag; endcase case $s: case $S: ScribeFlag = not ScribeFlag; endcase case $q: case $Q: QuietFlag = not QuietFlag; endcase case $m: case $M: MergeFlag = not MergeFlag; endcase default: Abort("unrecognized flag") ] ] let PressFileOpen = false // whether we have a press file open // one command line parameter per iteration of following loop while ReadParam(0,"bad arg. reenter: ",ResultVec,SwitchVec,true)!0 ne 0 do [ test SwitchVec!0 eq 0 ifso [ // it's a file name AllocKnotTables() EvalParam(ResultVec,"P","You shouldn't get this message: ",arg) test SearchString(arg,".press",0,false) eq 0 ifnot [ // arg is a press file name; forces a new press file if PressFileOpen do FinishPress(PressFileName) CopyString(arg,PressFileName) VecInit(PressFileName,UNITTabSize,FONTTabSize) PressFileOpen = true ] ifso [ // arg is a draw file name if not PressFileOpen do [ // construct press file name let DotPosn = SearchChar(arg,$.) if DotPosn eq 0 do DotPosn = (arg>>STRING↑0) + 1 ExtractString(arg,PressFileName,0,DotPosn) AppendString(".PRESS",PressFileName) VecInit(PressFileName,UNITTabSize,FONTTabSize) PressFileOpen = true ] CopyString(arg,DrawFileName) PutTemplate(dsp,"$S ← $S: ",PressFileName,DrawFileName) DoDrawFile(DrawFileName) PutTemplate(dsp,"*c") if not MergeFlag do [ FinishPress(PressFileName) PressFileOpen = false ] ] ] ifnot [ // it's a parameter switch switchon SwitchVec!1 into [ case $m: MinDelta = EvalParam(ResultVec,"D","MinDelta: ") endcase case $M: MaxDelta = EvalParam(ResultVec,"D","MaxDelta: ") endcase case $d: case $D: DashOn = EvalParam(ResultVec,"D","Dashed length: ") endcase case $o: case $O: DashOff = EvalParam(ResultVec,"D","Omitted length: ") endcase case $u: case $U: UNITTabSize = EvalParam(ResultVec,"D","Unit table size: ") endcase case $k: case $K: if NoTablesYet do MAXKNOTS = EvalParam(ResultVec,"D","Maximum knots per spline: ") endcase case $p: case $P: AllocKnotTables() if PressFileOpen do FinishPress(PressFileName) EvalParam(ResultVec,"P","Press File: ",PressFileName) VecInit(PressFileName,UNITTabSize,FONTTabSize) PressFileOpen = true endcase case $l: case $L: if (SwitchVec!2 ls $0) % (SwitchVec!2 gr $3) do Abort("bad line width") BrushTable>>FONTS↑((SwitchVec!2)-$0).Size = EvalParam(ResultVec,"D","Line width: ")/4 endcase case $f: case $F: if (SwitchVec!2 ls $0) % (SwitchVec!2 gr $3) do Abort("bad font number") EvalParam(ResultVec,"P","Font name: ",FontFileName) ParseFontFileName(FontFileName,TextTable,(SwitchVec!2)-$0) endcase case $x: case $X: UserX = EvalParam(ResultVec,"D","X offset: ") endcase case $y: case $Y: UserY = EvalParam(ResultVec,"D","Y offset: ") endcase default: Abort("unrecognized switch") endcase ] ] ] if PressFileOpen do FinishPress(PressFileName) ] and let AllocKnotTables() be [ if NoTablesYet do [ let knottabsize = MAXKNOTS*((size FLOAT)/16) p0x = GetFixed(knottabsize); p0y = GetFixed(knottabsize) p1x = GetFixed(knottabsize); p1y = GetFixed(knottabsize) p2x = GetFixed(knottabsize); p2y = GetFixed(knottabsize) p3x = GetFixed(knottabsize); p3y = GetFixed(knottabsize) if p3y eq 0 do Abort("out of space when allocating knot tables") NoTablesYet = false ] ] and let FinishPress(PressFileName) be [ if ScribeFlag do [ VecEndEntity() VecFont("HELVETICA",10,0) VecPosn(GlobalMaxX/2+GlobalMinX/2,GlobalMinY) VecText("<==<<") // print out height in inches to 2 digits; assume height > 0 FLDI(TEMP,GlobalMaxY-GlobalMinY) FLDI(TEMPOTHER,SCANSperIN) FDV(TEMP,TEMPOTHER) FLDI(TEMPOTHER,100) FMP(TEMP,TEMPOTHER) PutTemplate(dsp,"Height of $S is $D.$2F0D in.*c", PressFileName,FTR(TEMP)/100,FTR(TEMP) rem 100) ] VecFinish(PressFileName, UserX+PageCenterX-GlobalMaxX/2-GlobalMinX/2, UserY+PageCenterY-GlobalMaxY/2-GlobalMinY/2) ]