-- ChipOrient.mesa -- last edited by E. McCreight, December 15, 1982 6:16 PM -- written by E. McCreight, February 22, 1982 10:00 AM DIRECTORY InlineDefs, ppdefs; ChipOrient: DEFINITIONS IMPORTS InlineDefs = BEGIN OPEN ppdefs; MapRect: PROC [itemInCell: Rect, cellSize: Point, cellInstOrient: orientationIndex, cellInstPos: Point ← [0,0]] RETURNS [itemInWorld: Rect]; -- Given an item in a prototype cell, and the -- size of the prototype cell, both in "cell" co-ordinates, and -- the position and orientation index of an instance of that cell in "world" -- co-ordinates, this procedure returns the world -- co-ordinates of the instance of the item. DeMapRect: PROC [itemInWorld: Rect, cellSize: Point, cellInstOrient: orientationIndex, cellInstPos: Point ← [0,0]] RETURNS [itemInCell: Rect]; -- Given an item in world co-ordinates, and the -- size of a prototype cell, both in "cell" co-ordinates, and -- the position and orientation index of an instance of that cell in "world" -- co-ordinates, this procedure returns the cell prototype -- co-ordinates of that item. ComposeOrient: PROC [ itemOrientInCell, cellOrientInWorld: orientationIndex] RETURNS [itemOrientInWorld: orientationIndex]; -- This procedure produces the composite orientation -- obtained by first doing itemInCell and then -- doing cellInWorld. InverseOrient: PROC [orient: orientationIndex] RETURNS [inverse: orientationIndex]; -- For all orientationIndexes o1, ComposeOrient[o1, InverseOrient[o1]] = 0. DecomposeOrient: PROCEDURE[ itemOrientInWorld, cellOrientInWorld: orientationIndex] RETURNS [itemOrientInCell: orientationIndex]; -- For all orientationIndexes o1 and o2, -- DecomposeOrient[cellOrientInWorld: o1, itemOrientInWorld: -- ComposeOrient[cellOrientInWorld: o1, itemOrientInCell: o2]] = o2. RefPt: PROC [r: Rect] RETURNS [Point]; -- This procedure returns a lambda-grid point near the -- center of the rectangle. NormalizeList: PROC [lp: listPtr, origin: Point ← [0,0]] RETURNS [size, offset: Point]; -- This procedure normalizes the list so that some element -- starts at x=origin.x and some element starts at y=origin.y. -- new ← old+offset. BoundingRect: PROC [lp: listPtr] RETURNS [r: Rect]; Rot90: PROC [orient: ppdefs.orientationIndex] RETURNS [[0..1]] = INLINE {RETURN[IF InlineDefs.BITAND[orient, 4]=0 THEN 0 ELSE 1]}; Size: PROC [size: ppdefs.Point, orient: ppdefs.orientationIndex] RETURNS [ppdefs.Point] = INLINE {RETURN[IF InlineDefs.BITAND[orient, 4]=0 THEN size ELSE [x: size.y, y: size.x]]}; DecomposeRect: PROC [r, test: ppdefs.Rect, rInsideTest, rOutsideTest: PROC[ppdefs.Rect]]; -- calls rInsideTest and rOutsideTest on a set of up to 5 rectangles -- that are mutually exclusive and exhaust r. END. -- of ChipOrient