GGBoundBox.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Last edited by Bier on July 16, 1987 7:36:17 pm PDT
Contents: Procedures for creating and combining bounding boxes for refresh efficiency.
Pier, May 22, 1987 10:32:22 am PDT
Kurlander August 23, 1986 5:08:14 pm PDT
Bier, May 2, 1989 7:22:28 pm PDT
DIRECTORY
GGCoreTypes, Imager, ImagerTransformation;
GGBoundBox: CEDAR DEFINITIONS =
BEGIN
BoundBox: TYPE = GGCoreTypes.BoundBox;
Point: TYPE = Imager.VEC;
Vector: TYPE = Imager.VEC;
emptyBoundBox: BoundBox; -- [loX, loY: LargestNumber, hiX, hiY: SmallestNormalizedNumber]
Routines that create a new BoundBox.
CreateBoundBox: PROC [loX, loY, hiX, hiY: REAL, null: BOOLFALSE, infinite: BOOLFALSE] RETURNS [bBox: BoundBox];
NullBoundBox: PROC [] RETURNS [bBox: BoundBox];
CopyBoundBox: PROC [bBox: BoundBox] RETURNS [copy: BoundBox];
BoundBoxOfBoxes: PROC [list: LIST OF BoundBox] RETURNS [bigBox: BoundBox];
BoundBoxOfBoundBox: PROC [box: BoundBox, transform: ImagerTransformation.Transformation] RETURNS [newBox: BoundBox];
BoundBoxFromRectangle: PROC [rect: Imager.Rectangle] RETURNS [bBox: BoundBox];
RectangleFromBoundBox: PROC [bBox: BoundBox] RETURNS [rect: Imager.Rectangle];
BoundBoxOfPixelArray: PROC [pa: Imager.PixelArray] RETURNS [bBox: BoundBox];
Computes a bounding box in units of screen dots for the given pixel array. The lower left corner will be [0,0].
BoundBoxOfBitMap: PROC [base: LONG POINTER, wordsPerLine: NAT,
sMin, fMin, sSize, fSize: NAT, tx, ty: INTEGER ← 0] RETURNS [bBox: BoundBox];
Computes a bounding box in units of screen dots for the given bit map. The lower left corner will be [0,0].
Routines that modify an existing BoundBox.
EnlargeByBox: PROC [bBox: BoundBox, by: BoundBox];
EnlargeByPoint: PROC [bBox: BoundBox, point: Point];
EnlargeByVector: PROC [bBox: BoundBox, vector: Vector];
Update bBox to be the bounding box of itself and itself offset by vector. Useful to take drop shadows into account, for instance.
EnlargeByOffset: PROC [bBox: BoundBox, offset: REAL];
Enlarges bBox to include a border of width offset around bBox. Useful to allow for stroke width of a segment, for instance.
UpdateBoundBox: PROC [bBox: BoundBox, loX, loY, hiX, hiY: REAL];
UpdateBoundBoxOfBoundBox: PROC [bBox: BoundBox, localBox: BoundBox, transform: ImagerTransformation.Transformation];
UpdateCopyBoundBox: PROC [bBox: BoundBox, from: BoundBox];
Modifies the numerical fields of bBox.
Information Derived from a BoundBox
PointIsInBox: PROC [test: Point, box: GGCoreTypes.BoundBoxObj] RETURNS [BOOL];
Returns TRUE if test is contained within box.
Operates on BoundBoxObj (which is presumably on the execution stack).
PointIsInGrownBox: PROC [test: Point, box: BoundBox, offset: REAL] RETURNS [BOOL];
Returns TRUE if test is contained within
[box.loX-offset, box.loY-offset, box.hiX+offset, box.hiY+offset].
Centroid: PROC [box: BoundBox] RETURNS [centroid: Point, success: BOOL];
Drawing BoundBoxes.
EraseWithinBoundBox: PROC [dc: Imager.Context, bBox: BoundBox];
Clip: PROC [dc: Imager.Context, bBox: BoundBox];
Hit Testing BoundBoxes.
MaskArray: TYPE = ARRAY[0..4) OF BOOL;
NearestPoint: PROC [bBox: BoundBox, testPoint: Point, tolerance: REAL ← 1E6, mask: MaskArray ← ALL[TRUE]] RETURNS [bestDist: REAL, bestJoint: NAT, bestPoint: Point, success: BOOL];
NearestSegment: PROC [bBox: BoundBox, testPoint: Point, tolerance: REAL ← 1E6, mask: MaskArray ← ALL[TRUE]] RETURNS [bestDist: REAL, bestSeg: NAT, bestPoint: Point, success: BOOL];
END.