DIRECTORY IP; IPBasicOps: CEDAR DEFINITIONS = BEGIN CornerTypes: TYPE = IP.CornerTypes; EdgeTypes: TYPE = IP.EdgeTypes; PolarityTypes: TYPE = IP.PolarityTypes; OrientationTypes: TYPE = IP.OrientationTypes; ETCombineFailed: ERROR; CTOrient: PROC[ct: CornerTypes, operation: IP.Orientation] RETURNS [CornerTypes]; CTMirror: PROC[ct: CornerTypes, mirrorOrient: OrientationTypes] RETURNS [CornerTypes]; CTRotate: PROC[ct: CornerTypes, cnt: INT _ 1] RETURNS[CornerTypes]; CTFindRotDirectn: PROC[ct: CornerTypes, ot: OrientationTypes] RETURNS [PolarityTypes]; CTDiag: PROC[ct: CornerTypes] RETURNS[CornerTypes] = INLINE {RETURN [CTRotate[ct, 2]]}; --CTDiag-- CTResolve: PROC[ct: CornerTypes] RETURNS [hor, ver: EdgeTypes]; CTResolveFor: PROC[ct: CornerTypes, ot: OrientationTypes] RETURNS [EdgeTypes]; CTDirectn: PROC[ct: CornerTypes] RETURNS [hor, ver: PolarityTypes]; CTDirectnFor: PROC[ct: CornerTypes, ot: OrientationTypes] RETURNS [PolarityTypes]; CTInvDirectn: PROC[ct: CornerTypes] RETURNS [hor, ver: PolarityTypes] = INLINE {[hor, ver] _ CTDirectn[ct]; hor _ PTNot[hor]; ver _ PTNot[ver]}; --CTInvDirectn-- CTInvDirectnFor: PROC[ct: CornerTypes, ot: OrientationTypes] RETURNS [PolarityTypes] = INLINE {RETURN [PTNot[CTDirectnFor[ct, ot]]]}; --CTInvDirectn-- CTFromPTs: PROC[hor, ver: PolarityTypes] RETURNS [CornerTypes]; ETRotate: PROC[et: EdgeTypes, cnt: INT _ 1] RETURNS[EdgeTypes]; ETOrient: PROC[et: EdgeTypes] RETURNS [OrientationTypes]; ETCombine: PROC[et1, et2: EdgeTypes] RETURNS [CornerTypes]; --! Raise ETCombineError-- ETDirectn: PROC[et: EdgeTypes] RETURNS [PolarityTypes]; ETInvDirectn: PROC[et: EdgeTypes] RETURNS [PolarityTypes] = INLINE { RETURN [PTNot[ETDirectn[et]]]}; --ETInvDirectn-- PTNot: PROC [pt: PolarityTypes] RETURNS [PolarityTypes] = INLINE {RETURN [(SELECT pt FROM neg => pos, pos => neg, ENDCASE => ERROR)] }; --PTNot-- PTToInt: PROC[pt: PolarityTypes] RETURNS [INT] = INLINE {RETURN [(SELECT pt FROM neg => -1, pos => 1, ENDCASE => ERROR)] }; --PTToInt-- PTFromInt: PROC[i: INT] RETURNS [PolarityTypes] = INLINE {RETURN [(SELECT i FROM < 0 => neg, > 0 => pos, ENDCASE => ERROR)] }; --PTFromInt-- OTFlip: PROC [ot: OrientationTypes] RETURNS [OrientationTypes] = INLINE {RETURN [(SELECT ot FROM hor => ver, ver => hor, ENDCASE => ERROR)] }; --PTNot-- NuIntVector: PROC[x, y: INT] RETURNS [REF IP.IntVector] = INLINE { RETURN [NEW[IP.IntVector _ [x, y]]] }; --NuIntVector NuNatVector: PROC[x, y: NAT] RETURNS [REF IP.NatVector] = INLINE { RETURN [NEW[IP.NatVector _ [x, y]]] }; --NuNatVector Copy1Shape: PROC[oShape: REF IP.ShapeRep] RETURNS [REF IP.ShapeRep]; Copy2Shape: PROC[oShape: REF IP.ShapeRep] RETURNS [REF IP.ShapeRep]; IntVectorNegate: PROC[v: IP.IntVector] RETURNS [res: IP.IntVector] = INLINE { res.x _ - v.x; res.y _ - v.y; };--IntVectorNegate IntVectorScale: PROC[v: IP.IntVector, factor: INT] RETURNS [res: IP.IntVector] = INLINE { res.x _ v.x * factor; res.y _ v.y * factor; }; --IntVectorScale IntVectorDivide: PROC[v: IP.IntVector, quotient: INT] RETURNS [res: IP.IntVector] = INLINE { res.x _ v.x / quotient; res.y _ v.y / quotient; }; --IntVectorDivide IntVectorMDistance: PROC[v1, v2: IP.IntVector] RETURNS [INT] = INLINE{ RETURN [ABS[v1.x - v2.x] + ABS[v1.y - v2.y]] };--IntVectorMLength RectMDistanceToPt: PUBLIC PROC[rect: IP.Rect, pt: IP.IntVector] RETURNS [INT] = INLINE { xDist: INT _ IF rect.x1 <= pt.x AND pt.x <= rect.x2 THEN 0 ELSE MIN[ABS[pt.x - rect.x1], ABS[pt.x - rect.x2]]; yDist: INT _ IF rect.y1 <= pt.y AND pt.y <= rect.y2 THEN 0 ELSE MIN[ABS[pt.y - rect.y1], ABS[pt.y - rect.y2]]; RETURN [xDist + yDist] }; --RectMDistanceToPt RectExtendToPt: PROC[rect: IP.Rect, pt: IP.IntVector] RETURNS [IP.Rect] = INLINE { RETURN [IP.Rect[x1: MIN[rect.x1, pt.x], y1: MIN[rect.y1, pt.y], x2: MAX[rect.x2, pt.x], y2: MAX[rect.y2, pt.y]]]}; --RectExtendToPt END. ζ-- File: IPBasicOps.mesa -- Last Edited by: CSChow, February 1, 1985 8:20:23 am PST --IPBasicOps = BasicOperations -- --Intro:This interface contains a lot of the very basic operations on those very basic types -- Used throughout the rest of the code and helps achieve greater code density --Basic Creation Procs --Basic Copy Procs --Primitive IntVector Operations --Returns the Manhattan Distance between v1 and v2 --MDistance = Manhattan Distance -- Extend rect minimallly Κ [˜Jšœ™Jšœ:™:J˜Jšœ!™!J™J™\J™PJ™J™šΟk ˜ Jšœ˜—J˜šœ œ œ˜%J˜Jšœ œœ ˜#Jšœ œœ ˜Jšœœœ˜'Jšœœœ˜-J˜Icode˜Kšœœ˜K˜KšΟnœœœœ˜QKšžœœ2œ˜VKšžœœœœ˜CKšžœœ(œ˜VKš žœœœœœΟc ˜bKšž œœœ˜?Kšž œœ(œ ˜NKšž œœœ˜CKšž œœ(œ˜RKš ž œœœœCŸ˜‘Kš žœœ(œœœ!Ÿ˜–Kšž œœœ˜?K˜Kšžœœœœ ˜@Kšžœœœ˜9Kšž œœœŸ˜VKšž œœœ˜7šž œœœœ˜DKšœžœ Ÿœ˜0—K˜KšžœœœœœœœœœŸ ˜‘KšžœœœœœœœœœœŸ ˜‡K– "Cedar" stylešž œœœœœœœœœœŸ ˜K– "Cedar" style˜K– "Cedar" style˜K– "Cedar" stylešžœœœœœœœœœŸ ˜˜K– "Cedar" style˜K– "Cedar" style˜K– "Cedar" style˜K– "Cedar" style™K– "Cedar" style˜– "Cedar" stylešž œœœœœœœ˜BK– "Cedar" stylešœœœ˜#K– "Cedar" stylešœŸ ˜—K– "Cedar" style˜– "Cedar" stylešž œœœœœœœ˜BK– "Cedar" stylešœœœ˜#K– "Cedar" stylešœŸ ˜—K– "Cedar" style˜K– "Cedar" style˜K– "Cedar" style™K– "Cedar" style˜K– "Cedar" stylešž œœ œœ œœœ ˜DK– "Cedar" style˜K– "Cedar" stylešž œœ œœ œœœ ˜DK– "Cedar" style˜K– "Cedar" style˜K– "Cedar" style™ K– "Cedar" style˜– "Cedar" styleš žœœœ œœœ˜MK– "Cedar" stylešœ˜K– "Cedar" style˜K– "Cedar" stylešœŸ˜—K– "Cedar" style˜– "Cedar" stylešžœœœœœœœ˜ZK– "Cedar" stylešœ˜K– "Cedar" style˜K– "Cedar" stylešœŸ˜—K– "Cedar" style˜– "Cedar" stylešžœœœœœœœ˜]K– "Cedar" stylešœ˜K– "Cedar" stylešœ˜K– "Cedar" stylešœŸ˜—K– "Cedar" style˜– "Cedar" styleš žœœ œ œœœ˜FK– "Cedar" style™2K– "Cedar" stylešœœœ˜,K– "Cedar" stylešœŸ˜—K– "Cedar" style˜– "Cedar" stylešžœœœœ œ œœœ˜YK– "Cedar" stylešœž œ™ K– "Cedar" stylešœœœœœœœœœ˜nK– "Cedar" stylešœœœœœœœœœ˜nK– "Cedar" stylešœ˜K– "Cedar" stylešœŸ˜—K– "Cedar" style˜– "Cedar" stylešžœœœ œ œœ œ˜RK– "Cedar" style™K– "Cedar" styleš œœ œœœœŸ˜ƒ—K– "Cedar" style˜K– "Cedar" style˜K– "Cedar" stylešœ˜——…—O