// October 10, 1979 10:07 AM by Taft *** OVERLAY A *** get "zpDefs.bcpl" get "AltoDefs.d" // outgoing procedures: external [ refreshDisplay itIsARectangle menuDisplay wipeDisplay gridDisplay frameDisplay turnDisplayOff ] // incoming procedures: external [ SetBlock // SYSTEM Zero drawSpline // ZPDRAW XORdot showText // ZPTEXT complementBox fontAddress paintDot // ZPCONVERT paintString equal // ZPUTIL flushItem // ZPITEM (same overlay) ] // incoming statics: external [ dsp // SYSTEM @bitmap // ZPINIT1 @switchDCB @bitmapSize @scanlineWidth @height @Xmax @Ymax @splineTable @maxSplineID @maxTextID @textTable @fontDefTable @fontFile @dspFont @dspFontAddress @font @brush @color @gridSpacing @versionX @showGrid // ZPEDIT @colorOn @revSelectTable brushFont // ZPCONVERT ] // static: static [ @savedDCBnext=0 ] //***************************************************************** // display area refresh //***************************************************************** let refreshDisplay(partialRefresh; numargs na) be [refreshDisplay if na eq 0 then partialRefresh=false if partialRefresh then turnDisplayOff() Zero(bitmap, bitmapSize) paintMenu() if splineTable!0 then for id=1 to maxSplineID do [ let splinePointer=splineTable!id unless splinePointer loop if partialRefresh & itIsARectangle(splinePointer) loop drawSpline(id) ] unless partialRefresh then [ if textTable!0 then for f=0 to maxFont-1 do [ for t=1 to maxTextID do [ let textPointer=textTable!t unless textPointer loop unless textPointer>>TEXT.font eq f loop showText(t) ] ] frameDisplay(1) if showGrid then gridDisplay() turnDisplayOn() ] ]refreshDisplay and itIsARectangle(splinePointer) = (splinePointer>>SPLINE.type ne regSpline) & (splinePointer>>SPLINE.shape ne rBrush) and menuDisplay() be [menuDisplay clearMenu() paintMenu() ]menuDisplay and clearMenu() be [clearMenu let w=bitmap for k=1 to height do [ Zero(w, 4) w=w+scanlineWidth ] ]clearMenu and paintMenu() be [paintMenu let menuTable= versionX ? table [ rDotFont+3; sDotFont+3; hBarFont+3; vBarFont+3; -1; -1; brushSymbol; makeSymbol; deleteSymbol; -1; selectSymbol; mTransf2Symbol; mTransf4Symbol; mTransf6Symbol; -1; -1; -1; lineFont; lineFont+1; lineFont+2; lineFont+3; -1; -1; dashSymbol; cyclicSymbol; -1; -1; -1; cTransf2Symbol; cTransf4Symbol; cTransf6Symbol; -1; -1; -1; ], table [ rDotFont+3; sDotFont+3; hBarFont+3; vBarFont+3; -1; blueSymbol; redSymbol; greenSymbol; blackSymbol; brushSymbol; makeSymbol; selectSymbol; mTransf2Symbol; mTransf4Symbol; mTransf6Symbol; -1; -1; lineFont; lineFont+1; lineFont+2; lineFont+3; -1; yellowSymbol; cyanSymbol; magentaSymbol; -1; dashSymbol; cyclicSymbol; deleteSymbol; cTransf2Symbol; cTransf4Symbol; cTransf6Symbol; -1; -1 ] // display menu symbols let w0=bitmap+symbolPos*scanlineWidth let menuSkip=symbolHeight*scanlineWidth let w=w0+symbolWidth for k=0 to 33 do [ if menuTable!k ne -1 then paintDot(w, symbolPos, brushFont+menuTable!k) w= (k eq 16) ? w0, w+menuSkip ] // show current brush manifest [ c1=4*symbolHeight+8; a1=#377; a2=#177400 ] w0=bitmap+c1*scanlineWidth+1 @w0= a1; @(w0+1)=a2 w=w0+scanlineWidth for k=1 to 14 do [ @w=#200; @(w+1)=#400 w=w+scanlineWidth ] @w= a1; @(w+1)=a2 paintDot(w0+scanlineWidth, 12, brushFont+brush) w=bitmap+((brush<>FONTFILE.length^f eq 0 & f ne dspFont loop let stringPointer=lv((fontDefTable!f)>>FONTDEF.dispCode) // don't try to understand this: paintString(stringPointer, scanlineWidth, 7, (equal(stringPointer, "Q") ? wtab!f - 14*scanlineWidth, wtab!f), fontAddress(f)) ] complementBox(wtab!font-4*scanlineWidth, 4, 24, 24) ]paintMenu and frameDisplay(b) be [frameDisplay let ptl=bitmap+margin let ptr=bitmap+scanlineWidth-1 let w= b ? -1, 0 SetBlock(ptl, w, scanlineWidth-margin) SetBlock(ptl+bitmapSize-scanlineWidth, w, scanlineWidth-margin) test b ifso for k=1 to height do [ @ptl=@ptl % #100000 @ptr=@ptr % 1 ptl=ptl+scanlineWidth ptr=ptr+scanlineWidth ] ifnot for k=1 to height do [ @ptl=@ptl & #077777 @ptr=@ptr & #177776 ptl=ptl+scanlineWidth ptr=ptr+scanlineWidth ] ]frameDisplay and wipeDisplay() be [wipeDisplay unless splineTable!0 % textTable!0 return for id=1 to maxSplineID do if splineTable!id then flushItem(id) for id=1 to maxTextID do if textTable!id then flushItem(textFlag+id) refreshDisplay() ]wipeDisplay and gridDisplay() be [gridDisplay let y=0 [ let x=0 [ XORdot(x, y) x=x+gridSpacing if x gr Xmax break ] repeat y=y+gridSpacing if y gr Ymax break ] repeat ]gridDisplay and turnDisplayOff() be [ if savedDCBnext return savedDCBnext=switchDCB>>DCB.next switchDCB>>DCB.next=0 switchDCB>>DCB.background=1 ] and turnDisplayOn() be [ unless savedDCBnext return switchDCB>>DCB.background=0 switchDCB>>DCB.next=savedDCBnext savedDCBnext=0 ]