// December 8, 1976 12:47 PM by Taft *** overlay A *** get "ZPDEFS.bcpl" // outgoing procedures: external [ DTTitems unDTTitems addItemTable countItemTable checkItemID showItem eraseItem markItem flushItem ] // incoming procedures: external [ MoveBlock // SYSTEM obtainBlock // ZPBLOCK putBlock pushDTTstack remakeText // ZPTEXT checkTextID showText eraseText markText remakeSpline // ZPMAKE checkSplineID // ZPDRAW drawSpline eraseSpline markSpline refreshDisplay // ZPDISP (same overlay) transformItem // ZPUPDATE (same overlay) ] // incoming statics: external [ @splineTable // ZPINIT @textTable @DTTstack @DTTstackTop @maxSplineID @maxTextID @maxItem @maxDTTstack ] //******************************************************************** // DTT = Delete / Translate / Transform //******************************************************************** let DTTitems(itemTable, q0, npoints; numargs nargs) be [DTTitems // possible parameter list: // code 0 (DELETE): itemTable // code 4 (2-point TRANSFORM=TRANSLATE): itemTable, q0, npoints=2 // code 8 (4-point TRANSFORM): itemTable, q0, npoints=4 // code 12 (6-point TRANSFORM): itemTable, q0, npoints=6 let itemCount=countItemTable(itemTable) unless itemCount gr 0 return let code=(nargs eq 1) ? 0, 2*npoints while (DTTstackTop+itemCount+code+1) gr maxDTTstack do pushDTTstack() let doRefresh=(code ge 8) ? 0, (itemTable>>itemCOUNT.spline) gr (splineTable!0)/2 unless doRefresh for i=1 to itemCount do eraseItem(itemTable!i) let count=0 let oldDTTstackTop=DTTstackTop for i=1 to itemCount do [ let itemID=itemTable!i let itemPointer=checkItemID(itemID) unless itemPointer loop let pointerTable=nil test code eq 0 ifso [ // delete: test itemID<>SPLINE.chain) itemPointer>>SPLINE.chain=0 ] itemPointer>>ITEM.selected=0 pointerTable!(itemID<>ITEM.tFlag then sp=sp+1 let doRefresh=code ge 8 ? 0, (sp gr (splineTable!0)/2) if code ne 0 then for i=top1 to topCount do [ DTTstack!i=findItemID(DTTstack!i) unless doRefresh then eraseItem(DTTstack!i) ] for i=top1 to topCount do test code eq 0 ifso [ // unDELETE: let itemPointer=DTTstack!i unless (itemPointer>>ITEM.tFlag ? remakeText(itemPointer), remakeSpline(itemPointer)) then putBlock(itemPointer) ] // unTRANSLATE & unTRANSFORM: ifnot transformItem(DTTstack!i, DTTstack+topCount+1, code/2) if code eq 4 then test doRefresh ifso refreshDisplay() ifnot for i=top1 to topCount do showItem(DTTstack!i) ]unDTTitems //******************************************************************** // item operations //******************************************************************** // NOTICE: for spline id=itemID and checkItemID(itemID) = itemID<>ITEM.tFlag ? textFlag, 0 let pointerTable= tFlag ? textTable, splineTable for id=1 to (tFlag ? maxTextID, maxSplineID) do if itemPointer eq pointerTable!id resultis (tFlag + id) resultis 0 ]findItemID and eraseItem(itemID) = itemID<>SPLINE.chain) putBlock(itemPointer) pointerTable!(itemID<>itemCOUNT.spline + itemTable>>itemCOUNT.text and addItemTable(itemTable,itemID) = valof [addItemTable let n=countItemTable(itemTable) if n eq maxItem resultis 0 // already there ? for i=1 to n do if itemID eq itemTable!i resultis 0 n=n+1 itemTable!n=itemID itemTable!0=itemTable!0 + (itemID<