DIRECTORY CD USING [DesignRect, Rect, Design], CDBasics, CDDraw; CDDrawImpl: CEDAR MONITOR IMPORTS CDBasics EXPORTS CDDraw = BEGIN CommandTable: TYPE = REF CTableRep; CommType: TYPE = CDDraw.CommType; Comm: TYPE = CDDraw.Comm; maxC: CARDINAL = 50; CTableRep: PUBLIC TYPE = RECORD [ cnt, in, out: CARDINAL, commandAvail: CONDITION, desgn: CD.Design, deviceClip: CD.DesignRect, comm: ARRAY [0..maxC) OF Comm, stopFlag: REF BOOLEAN, -- must be monitored inlist: BOOLEAN _ FALSE, deleted: BOOLEAN _ FALSE, alldoneToBeReported: BOOLEAN _ FALSE ]; TableList: TYPE = LIST OF CommandTable; tableList: TableList_NIL; InsertList: INTERNAL PROC [ct: CommandTable] = BEGIN IF NOT ct.inlist THEN { tableList _ CONS[ct, tableList]; ct.inlist _ TRUE; }; END; RemoveList: INTERNAL PROC [ct: CommandTable] = BEGIN IF ct.inlist THEN { ct.inlist _ FALSE; IF tableList.first=ct THEN tableList _ tableList.rest ELSE FOR l: TableList _ tableList, l.rest WHILE l.rest#NIL DO IF l.rest.first=ct THEN {l.rest _ l.rest.rest; EXIT} ENDLOOP }; END; CreateCommandTable: PUBLIC ENTRY PROC [design: CD.Design, clip: CD.DesignRect, cleanStopFlag: REF BOOLEAN] RETURNS [CommandTable] = BEGIN ENABLE UNWIND => NULL; --catches eg on cleanStopFlag=NIL ct: CommandTable ~ NEW[CTableRep]; ct.cnt _ ct.in _ ct.out _ 0; ct.deviceClip _ clip; ct.desgn _ design; ct.stopFlag _ cleanStopFlag; -- assigns addresses ct.deleted _ ct.inlist _ ct.alldoneToBeReported _ ct.stopFlag^ _ FALSE; InsertList[ct]; RETURN [ct] END; ModifyCommandTable: PUBLIC ENTRY PROC [design: CD.Design, ct: CommandTable, clip: CD.DesignRect] = BEGIN ENABLE UNWIND => NULL; InternalFlush[ct]; ct.deviceClip _ clip; ct.desgn _ design; IF CDBasics.NonEmpty[clip] THEN InsertList[ct] ELSE RemoveList[ct] END; DestroyCommandTable: PUBLIC ENTRY PROC [ct: CommandTable] = BEGIN ENABLE UNWIND => NULL; IF ct#NIL THEN { ct.deleted _ TRUE; InternalFlush[ct]; RemoveList[ct]; ct.desgn _ NIL; } END; InsertCommand: PUBLIC ENTRY PROC [ct: CommandTable, c: Comm] = BEGIN ENABLE UNWIND => NULL; IF ct.inlist THEN InternalInsertCommand[ct, c] END; InternalInsertCommand: INTERNAL PROC [ct: CommandTable, c: Comm] = BEGIN IF (ct.cnt>=maxC) OR (c.cmd=all) THEN {c _ Comm[cmd: all, erase: TRUE, rect: ct.deviceClip]; InternalFlush[ct]}; IF ct.deleted THEN ERROR; -- at least until it is known IF c.cmd=disapearforever THEN ERROR; -- at least until it is known IF c.cmd=alldone THEN ERROR; -- at least until it is known ct.alldoneToBeReported _ TRUE; IF (ct.cnt=1) AND (ct.comm[ct.out].cmd=all) THEN RETURN; IF c.cmd=rect THEN { IF CDBasics.Intersect[c.rect, ct.deviceClip] THEN { j: CARDINAL _ ct.out; c.rect _ CDBasics.Intersection[c.rect, ct.deviceClip]; THROUGH [0..ct.cnt) DO IF ct.comm[j].cmd=rect THEN { IF CDBasics.Inside[c.rect, ct.comm[j].rect] THEN {ct.comm[j].erase _ ct.comm[j].erase OR c.erase; RETURN}; IF CDBasics.Inside[ct.comm[j].rect, c.rect] THEN {ct.comm[j].erase _ ct.comm[j].erase OR c.erase; ct.comm[j].rect _ c.rect; RETURN}; }; j _ (j+1) MOD maxC; ENDLOOP } ELSE RETURN; }; ct.cnt _ ct.cnt+1; ct.comm[ct.in] _ c; ct.in _ (ct.in+1) MOD maxC; NOTIFY ct.commandAvail; END; InsertCommandAll: PUBLIC ENTRY PROC [design: CD.Design, c: Comm] = BEGIN ENABLE UNWIND => NULL; FOR lst: TableList _ tableList, lst.rest WHILE lst#NIL DO IF lst.first.desgn=design THEN InternalInsertCommand[lst.first, c]; ENDLOOP END; FetchCommand: PUBLIC ENTRY PROC [ct: CommandTable] RETURNS [c: Comm] = BEGIN ENABLE UNWIND => NULL; ct.stopFlag^ _ FALSE; WHILE ct.cnt<=0 DO IF ct.deleted THEN InsertDisappear[ct] ELSE IF ct.alldoneToBeReported THEN InsertAlldone[ct] ELSE WAIT ct.commandAvail; ct.stopFlag^ _ FALSE; ENDLOOP; ct.cnt _ ct.cnt-1; c _ ct.comm[ct.out]; ct.out _ (ct.out+1) MOD maxC; END; FlushCommands: PUBLIC ENTRY PROC [ct: CommandTable]= BEGIN ENABLE UNWIND => NULL; IF ct#NIL THEN InternalFlush[ct] END; InternalFlush: INTERNAL PROC [ct: CommandTable] = BEGIN ct.cnt _ ct.in _ ct.out _ 0; ct.stopFlag^ _ TRUE; ct.alldoneToBeReported _ FALSE; NOTIFY ct.commandAvail; END; InsertDisappear: INTERNAL PROC [ct: CommandTable] = BEGIN ct.out _ 0; ct.cnt _ 1; ct.comm[0] _ Comm[cmd: disapearforever, erase: FALSE, rect: [1,1,0,0]]; ct.in _ (1 MOD maxC); END; InsertAlldone: INTERNAL PROC [ct: CommandTable] = BEGIN ct.alldoneToBeReported _ FALSE; ct.out _ 0; ct.cnt _ 1; ct.comm[0] _ Comm[cmd: alldone, erase: FALSE, rect: [1,1,0,0]]; ct.in _ (1 MOD maxC); END; END. |CDDrawImpl.mesa (part of Chipndale) Copyright c 1983, 1984 by Xerox Corporation. All rights reserved. by Christian Jacobi July 6, 1983 5:09 pm last edited Christian Jacobi November 5, 1984 10:18:44 am PST -- request to stop the execution of (only!) the current command -- tableList#NIL; otherwise nothing too delete! not ct.inlist --cleanStopFlag^ tells any drawing process to stop volunterly and to fetch the next --command. --cleanStopFlag^ must not be modified any more outside this monitor!! --until DeleteCommandTable is called --Users may request a stop by calling FlushCommands. --changes the clipping aera --no more calls of InsertCommand on ct allowed!! --draw process must disapear from itself, --when draw process dispears and contains nomore --reference of ct, it is subject for garbage collection --The cleanStopFlag is immediately set to TRUE and later --reset to FALSE when the draw --process stopped the current command, if it then fetches another --command it gets the disapearforever command. --this procedure introduces redraw all if table is full --and in removes certain rectangles contained by others --this implies that the module knows the commands --this search for similar commands could be made much better --waits till command is available or CommandTable deleted -- the drawing may stop after some time only, -- and NOT immediately with procedure return ÊU˜šœ'™'Jšœ Ïmœ7™BJšœ+™+Jšœ?™?J˜—šÏk ˜ Jšžœžœ˜$J˜ J˜J˜—šÏb œžœžœ˜Jšžœ ˜Jšžœ ˜—Jšž˜J˜Jšœžœžœ ˜#Jšœ žœ˜!Jšœžœ˜J˜Jšœžœ˜šœ žœžœžœ˜!Jšœžœ˜Jšœž œ˜Jšœžœ˜Jšœ žœ ˜Jšœžœ žœ˜šœ žœžœÏc˜+Jšœ?™?—Jšœžœžœ˜Jšœ žœžœ˜Jšœžœž˜$J˜J˜—Jšœ žœžœžœ˜'Jšœžœ˜J˜šÏn œžœžœ˜.Jšž˜šžœžœ ž˜Jšœ žœ˜ Jšœ žœ˜Jšžœ˜—Jšžœ˜J˜—š¡ œžœžœ˜.Jšž˜šžœ ž˜Jšœ žœ˜Jšœ=™=Jšžœžœ˜5šž˜šžœ"žœžœž˜8šžœžœ˜Jšœžœ˜—Jšž˜——Jšžœ˜—Jšžœ˜J˜—š¡œžœžœžœ žœžœžœžœžœ˜ƒJšœS™SJšœ ™ JšœE™EJšœ$™$Jšœ4™4šž˜Jšžœžœžœ !˜8—Jšœžœ ˜"J˜J˜J˜Jšœ ˜2JšœAžœ˜GJ˜Jšžœ˜ Jšžœ˜J˜J˜—š ¡œžœžœžœ žœ!žœ˜bJšœ™šž˜Jšžœžœžœ˜—J˜J˜J˜Jšžœžœ˜.Jšžœ˜Jšžœ˜J˜—š¡œžœžœžœ˜;Jšœ0™0Jšœ)™)Jšœ0™0Jšœ8™8Jšœ8™8Jšœ™JšœB™BJšœ.™.šž˜Jšžœžœžœ˜—šžœžœžœ˜Jšœ žœ˜J˜J˜Jšœ žœ˜J˜—Jšžœ˜J˜J˜—š¡ œžœžœžœ˜>šž˜Jšžœžœžœ˜—Jšžœ žœ˜.Jšžœ˜J˜—š¡œžœžœ˜BJšœ7™7Jšœ7™7Jšœ1™1Jšž˜šžœžœ žœ˜&Jšœžœ+˜J——Jšžœ žœžœ ˜7Jšžœžœžœ ˜Bšžœžœžœ ˜:Jšœžœ˜Jšžœ žœžœžœ˜8šžœ ž˜šžœ+ž˜3Jšœžœ ˜J˜6Jšœ<™<šžœ ž˜šžœž˜šžœ*ž˜0Jšœ%žœ žœ˜9—šžœ*ž˜0Jšœ%žœ ˜1Jšœžœ˜"—Jšžœ˜—Jšœ žœ˜Jšž˜—Jšž˜—Jšžœžœ˜ Jšžœ˜—J˜J˜Jšœžœ˜Jšžœ˜Jšžœ˜J˜—š ¡œžœžœžœ žœ˜Bšž˜Jšžœžœžœ˜—šžœ&žœžœž˜9Jšžœžœ%˜CJšž˜—Jšžœ˜J˜—š ¡ œžœžœžœžœ ˜FJšœ9™9šžœ˜Jšžœžœžœ˜—Jšœžœ˜šžœ žœ˜Jšžœ žœ˜&šžœ˜Jšžœžœ˜0Jšžœžœ˜—Jšœžœ˜Jšžœ˜—J˜J˜Jšœžœ˜Jšžœ˜J˜—š¡ œžœžœžœ˜4Jšœ-™-Jšœ,™,šžœ˜Jšžœžœžœ˜—Jšžœžœžœ˜ Jšžœ˜J˜—š¡ œžœžœ˜1Jšžœ˜J˜Jšœžœ˜Jšœžœ˜Jšžœ˜Jšžœ˜J˜—š¡œžœžœ˜3Jšž˜J˜ J˜ Jšœ/žœ˜GJšœ žœ˜Jšžœ˜J˜—š¡ œžœžœ˜1Jšž˜Jšœžœ˜J˜ J˜ Jšœ'žœ˜?Jšœ žœ˜Jšžœ˜J˜—Jšžœ˜J˜J˜J˜J˜J˜—…—N