DIRECTORY GGBoundBox, GGModelTypes, GGInterfaceTypes, GGObjects, GGSelect, GGShapes, Imager; GGBoundBoxImpl: CEDAR PROGRAM IMPORTS GGBoundBox, GGObjects, GGSelect, GGShapes, Imager EXPORTS GGBoundBox = BEGIN BoundBox: TYPE = REF BoundBoxObj; BoundBoxObj: TYPE = GGModelTypes.BoundBoxObj; EntityGenerator: TYPE = GGModelTypes.EntityGenerator; GargoyleData: TYPE = GGInterfaceTypes.GargoyleData; Cluster: TYPE = GGModelTypes.Cluster; Outline: TYPE = GGModelTypes.Outline; Segment: TYPE = GGModelTypes.Segment; SegmentGenerator: TYPE = GGObjects.SegmentGenerator; Sequence: TYPE = GGModelTypes.Sequence; Traj: TYPE = GGModelTypes.Traj; CreateBoundBox: PUBLIC PROC [loX, loY, hiX, hiY: REAL] RETURNS [bBox: BoundBox] = CHECKED { bBox _ NEW[BoundBoxObj _ [loX, loY, hiX, hiY]]; }; CopyBoundBox: PUBLIC PROC [bBox: BoundBox] RETURNS [copy: BoundBox] = CHECKED { copy _ NEW[BoundBoxObj _ [bBox.loX, bBox.loY, bBox.hiX, bBox.hiY]]; }; BoundBoxOfTraj: PUBLIC PROC [traj: Traj] RETURNS [bBox: BoundBox] = CHECKED { segGen: SegmentGenerator; segmentBoxes: LIST OF BoundBox _ NIL; segGen _ GGObjects.SegmentsInTraj[traj]; FOR seg: Segment _ GGObjects.NextSegment[segGen], GGObjects.NextSegment[segGen] UNTIL seg = NIL DO segmentBoxes _ CONS[seg.boundBox, segmentBoxes]; ENDLOOP; bBox _ BoundBoxOfBoxes[segmentBoxes]; }; EnlargeBoundBox: PUBLIC PROC [bBox: BoundBox, by: BoundBox] = CHECKED { IF by.loX < bBox.loX THEN bBox.loX _ by.loX; IF by.hiX > bBox.hiX THEN bBox.hiX _ by.hiX; IF by.loY < bBox.loY THEN bBox.loY _ by.loY; IF by.hiY > bBox.hiY THEN bBox.hiY _ by.hiY; }; AdjustForJoints: PUBLIC PROC [bBox: BoundBox] = { side: REAL _ GGModelTypes.jointSize/2.0; bBox.loX _ bBox.loX-side; bBox.loY _ bBox.loY-side; bBox.hiX _ bBox.hiX+side; bBox.hiY _ bBox.hiY+side; }; BoundBoxOfBoxes: PUBLIC PROC [list: LIST OF BoundBox] RETURNS [bigBox: BoundBox] = CHECKED { IF list = NIL THEN RETURN[NIL]; bigBox _ NEW[BoundBoxObj]; bigBox.loX _ list.first.loX; bigBox.hiX _ list.first.hiX; bigBox.loY _ list.first.loY; bigBox.hiY _ list.first.hiY; FOR bBoxList: LIST OF BoundBox _ list.rest, bBoxList.rest UNTIL bBoxList = NIL DO IF bBoxList.first.loX < bigBox.loX THEN bigBox.loX _ bBoxList.first.loX; IF bBoxList.first.hiX > bigBox.hiX THEN bigBox.hiX _ bBoxList.first.hiX; IF bBoxList.first.loY < bigBox.loY THEN bigBox.loY _ bBoxList.first.loY; IF bBoxList.first.hiY > bigBox.hiY THEN bigBox.hiY _ bBoxList.first.hiY; ENDLOOP; }; BoundBoxOfSelected: PUBLIC PROC [gargoyleData: GargoyleData] RETURNS [bigBox: BoundBox] = { entityGen: EntityGenerator; entity: REF ANY; nextBox: BoundBox; entityGen _ GGSelect.SelectedEntities[gargoyleData, normal]; entity _ GGObjects.NextEntity[entityGen]; WITH entity SELECT FROM cluster: Cluster => bigBox _ GGBoundBox.CopyBoundBox[cluster.boundBox]; outline: Outline => bigBox _ GGBoundBox.CopyBoundBox[outline.boundBox]; traj: Traj => bigBox _ GGBoundBox.CopyBoundBox[traj.boundBox]; seq: Sequence => bigBox _ GGBoundBox.CopyBoundBox[seq.traj.boundBox]; -- finer grain comes later ENDCASE => ERROR; FOR entity _ GGObjects.NextEntity[entityGen], GGObjects.NextEntity[entityGen] UNTIL entity = NIL DO WITH entity SELECT FROM cluster: Cluster => nextBox _ cluster.boundBox; outline: Outline => nextBox _ outline.boundBox; traj: Traj => nextBox _ traj.boundBox; seq: Sequence => nextBox _ seq.traj.boundBox; -- finer grain comes later ENDCASE => ERROR; IF nextBox.loX < bigBox.loX THEN bigBox.loX _ nextBox.loX; IF nextBox.hiX > bigBox.hiX THEN bigBox.hiX _ nextBox.hiX; IF nextBox.loY < bigBox.loY THEN bigBox.loY _ nextBox.loY; IF nextBox.hiY > bigBox.hiY THEN bigBox.hiY _ nextBox.hiY; ENDLOOP; }; DrawBoundBox: PUBLIC PROC [dc: Imager.Context, bBox: BoundBox] = CHECKED { GGShapes.DrawRectangle[dc, bBox.loX, bBox.loY, bBox.hiX, bBox.hiY]; }; Clip: PUBLIC PROC [dc: Imager.Context, bBox: BoundBox] = CHECKED { Imager.ClipRectangle[dc, [bBox.loX, bBox.loY, (bBox.hiX-bBox.loX), (bBox.hiY-bBox.loY)]]; }; END. GGBoundBoxImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Last edited by Bier on August 14, 1985 10:38:53 pm PDT Contents: Procedures for creating and combining bounding boxes for refresh efficiency. Computes it from segment boxes. Κc˜head1™Icodešœ Οmœ1™˜>JšœFΟc˜`Jšžœžœ˜šžœKžœ žœž˜cJšžœžœž˜J˜/J˜/J˜&Jšœ. ˜HJšžœžœ˜Jšžœžœ˜:Jšžœžœ˜:Jšžœžœ˜:Jšžœžœ˜:—Jšžœ˜J˜—˜J˜—šŸ œžœžœ(žœ˜JJšœC˜CJ˜J˜—šŸœžœžœ(žœ˜BJšœY˜YJ˜—J˜Jšžœ˜J˜J˜—…—lΧ