<> <> <> <> <> DIRECTORY Imager, Pipal, PipalInt, Real; PipalReal: CEDAR DEFINITIONS = BEGIN <> <> <> Number: TYPE = REAL; infinity: Number = Real.LargestNumber/16; Vector: TYPE = Imager.VEC; Position: TYPE = Vector; -- alias when a Vector expresses a position Size: TYPE = Vector; -- alias when a Vector expresses a size zeroVector: Vector = Imager.zeroVEC; emptySize: Size = [-infinity, -infinity]; Interval: TYPE = RECORD [ base: Number, size: Number]; < empty interval. All empty intervals are legal. Intervals are closed at the base and open at the extremity. If anyone can tell us why this should be so please do.>> <<>> Rectangle: TYPE = RECORD [ base: Vector, size: Size]; < empty rectangle. All empty rectangles are legal>> emptyRectangle: Rectangle = [[infinity/2, infinity/2], emptySize]; fullRectangle: Rectangle = [[-infinity/2, -infinity/2], [infinity, infinity]]; RectangleProc: TYPE = PROC [rect: Rectangle] RETURNS [quit: BOOL _ FALSE]; <> <<>> Transformation: TYPE = Imager.Transformation; <> VectorToRope: PROC [v: Vector] RETURNS [Pipal.ROPE]; RectangleToRope: PROC [r: Rectangle] RETURNS [Pipal.ROPE]; TransformationToRope: PROC [t: Transformation] RETURNS [Pipal.ROPE]; <> <> Add: PROC [v1, v2: Vector] RETURNS [Vector]; <> Sub: PROC [v1, v2: Vector] RETURNS [Vector]; <> Min: PROC [v1, v2: Vector] RETURNS [Vector]; Max: PROC [v1, v2: Vector] RETURNS [Vector]; Neg: PROC [v: Vector] RETURNS [Vector]; <> <> IsDegeneratedSize: PROC [s: Size] RETURNS [BOOL]; <> IsEmptySize: PROC [s: Size] RETURNS [BOOL]; <> <> IntersectionIntervals: PROC [i1, i2: Interval] RETURNS [Interval]; UnionIntervals: PROC [i1, i2: Interval] RETURNS [Interval]; DoIntervalsIntersect: PROC [i1, i2: Interval] RETURNS [BOOL]; IsInsideInterval: PROC [container, candidate: Interval] RETURNS [BOOL]; <> IsInsideIntervalNumber: PROC [container: Interval, candidate: Number] RETURNS [BOOL]; <> <> <> <> Translate: PROC [r: Rectangle, v: Vector] RETURNS [Rectangle]; Extend: PROC [r: Rectangle, n: Number] RETURNS [Rectangle]; IntersectBox: PROC [r1, r2: Rectangle] RETURNS [Rectangle]; <> BoundingBox: PROC [r1, r2: Rectangle] RETURNS [Rectangle]; <> BoundingRectangle: PROC [p1, p2: Position] RETURNS [Rectangle]; <> <> IsDegeneratedRectangle: PROC [r: Rectangle] RETURNS [BOOL]; IsEmptyRectangle: PROC [r: Rectangle] RETURNS [BOOL]; DoRectanglesIntersect: PROC [r1, r2: Rectangle] RETURNS [BOOL]; <> IsInsideRectangle: PROC [container, candidate: Rectangle] RETURNS [BOOL]; IsInsidePoint: PROC [container: Rectangle, candidate: Position] RETURNS [BOOL]; <> AlwaysQuit: RectangleProc; Extremity: PROC [r: Rectangle] RETURNS [Position]; DecomposeRect: PROC [r, clip: Rectangle, inside, outside: RectangleProc _ NIL] RETURNS [quit: BOOL _ FALSE]; <> <> <> Center: PROC [r: Rectangle] RETURNS [Position]; <> <> <> TransformVector: PROC [t: Transformation, v: Vector] RETURNS [Vector]; TransformBBox: PROC [t: Transformation, s: Size] RETURNS [Rectangle]; <> TransformRectangle: PROC [t: Transformation, r: Rectangle] RETURNS [Rectangle]; <> Compose: PROC [t1, t2: Transformation] RETURNS [Transformation]; <> <> <> <<>> Apply: PROC [t1, t2: Transformation]; <> <> <> CreateTransformation: PROC RETURNS [Transformation]; <> CopyTransformation: PROC [t: Transformation] RETURNS [Transformation]; <> <<>> DestroyTransformation: PROC [t: Transformation]; <> <<>> EqualTransformation: PROC [t1, t2: Transformation] RETURNS [BOOL]; <> <> enumerateMethod: Pipal.Method; EachChildProc: TYPE = PROC [transformation: Transformation, child: Pipal.Object] RETURNS [quit: BOOL _ FALSE]; <> EnumerateProc: TYPE = PROC [object: Pipal.Object, each: EachChildProc, transformation: Transformation] RETURNS [quit: BOOL _ FALSE]; <> <> <> HasEnumerate: PROC [object: Pipal.Object] RETURNS [BOOL]; Enumerate: EnumerateProc; <> < all children are enumerated using PipalInt.Enumerate.>> <> NthChild: PROC [object: Pipal.Object, transformation: Transformation, rank: NAT _ 0] RETURNS [nthTrans: Transformation, nthChild: Pipal.Object _ NIL]; <> <> CountChildren: PROC [object: Pipal.Object] RETURNS [count: NAT]; <> <> sizeMethod: Pipal.Method; bboxMethod: Pipal.Method; SizeProc: TYPE = PROC [object: Pipal.Object] RETURNS [size: Size]; BBoxProc: TYPE = PROC [object: Pipal.Object, transformation: Transformation] RETURNS [bbox: Rectangle]; ObjectSize: SizeProc; <> <> <> < crash and burn.>> < emptySize>> BBox: BBoxProc; <> CachedSizeFromEnumerate: SizeProc; <> CachedBBoxFromEnumerate: BBoxProc; <> UseIntSize: SizeProc; <> <> <> transformClass: Pipal.Class; Transform: TYPE = REF TransformRec; TransformRec: TYPE = RECORD [ transformation: Transformation, child: Pipal.Object]; CreateTransform: PROC [transformation: Transformation, child: Pipal.Object] RETURNS [transform: Transform]; TransformObject: PROC [transformation: Transformation, child: Pipal.Object] RETURNS [Pipal.Object]; <> <> <> IntToRealVector: PROC [v: PipalInt.Vector] RETURNS [Vector]; IntToRealRectangle: PROC [r: PipalInt.Rectangle] RETURNS [Rectangle]; IntToRealTransformation: PROC [t: PipalInt.Transformation] RETURNS [Transformation]; ApplyRealInt: PROC [t1: Transformation, t2: PipalInt.Transformation]; <> <> <<>> END.