<> <> <> <<>> DIRECTORY PointDefs USING [ScrPt, X, Y, ScrToObj, ScrValToObjVal], ObjectDefs USING [StartObject, Object], RefreshDefs USING [EraseAndSave, MarkObject, RestoreScreen], GriffinGrid; GriffinGridImpl: CEDAR PROGRAM IMPORTS ObjectDefs, PointDefs, RefreshDefs EXPORTS GriffinGrid ~ BEGIN X: NAT = PointDefs.X; Y: NAT = PointDefs.Y; Object: TYPE = ObjectDefs.Object; gridX: INTEGER _ 8; gridY: INTEGER _ 8; hgrid, vgrid: REF token Object; --global handles to the grid (lazy, lazy) Grid: PUBLIC PROCEDURE[pt: PointDefs.ScrPt] RETURNS[PointDefs.ScrPt] = BEGIN IF NOT hgrid.visible THEN RETURN[pt] ELSE RETURN[GridInternal[pt]]; END; GridInternal: PROC[pt: PointDefs.ScrPt] RETURNS[PointDefs.ScrPt] = { <> dx,dy: INTEGER; dx _ pt[X] MOD gridX; pt[X] _ pt[X]-dx; IF dx > gridX/2 THEN pt[X] _ pt[X] +gridX; dy _ pt[Y] MOD gridY; pt[Y] _ pt[Y]-dy; IF dy > gridY/2 THEN pt[Y] _ pt[Y] +gridY; RETURN[pt]; }; <> GridOn: PUBLIC PROC = { hgrid.visible _ vgrid.visible _ TRUE; RefreshDefs.MarkObject[hgrid]; RefreshDefs.MarkObject[vgrid]; RefreshDefs.RestoreScreen[]; }; GridOff: PUBLIC PROC = { hgrid.visible _ vgrid.visible _ FALSE; RefreshDefs.EraseAndSave[hgrid]; RefreshDefs.EraseAndSave[vgrid]; RefreshDefs.RestoreScreen[]; }; Initialize: PUBLIC PROC = { <> <<598, 711 over 2. Values from before, or should we use 608 by 808?>> center: PointDefs.ScrPt _ GridInternal[[299, 356]]; hgrid _ NARROW[ObjectDefs.StartObject[token]]; hgrid.tokenType _ hgrid; vgrid _ NARROW[ObjectDefs.StartObject[token]]; vgrid.tokenType _ vgrid; hgrid.p0 _ vgrid.p0 _ PointDefs.ScrToObj[center]; hgrid.tl _ [0,center[Y]+2]; hgrid.br _ [1024, center[Y]-2]; vgrid.tl _ [center[X]-2,1024]; vgrid.br _ [center[X]+2, 0]; hgrid.visible _ vgrid.visible _ FALSE; hgrid.validEncoding _ vgrid.validEncoding _ TRUE; }; MoveGrid: PUBLIC PROCEDURE[grid: REF token Object, dx,dy: INT] = { IF grid.tokenType=vgrid THEN { grid.tl[X] _ grid.tl[X]+dx; grid.br[X] _ grid.br[X]+dx; grid.p0[X] _ grid.p0[X]+PointDefs.ScrValToObjVal[dx] } ELSE { grid.tl[Y] _ grid.tl[Y]+dy; grid.br[Y] _ grid.br[Y]+dy; grid.p0[Y] _ grid.p0[Y]+PointDefs.ScrValToObjVal[dy] } }; END.