<> <> <> <> <> <<>> DIRECTORY GriffinPoint USING [ObjPt, ScrPt, ScrRealPt, X, Y], GriffinTransform USING [InitXForms, Scale, XFMDescriptor, XFormMatrix, XFormPt], Real USING [RoundI, RoundLI]; GriffinPointImpl: CEDAR PROGRAM IMPORTS GriffinTransform, Real EXPORTS GriffinPoint = BEGIN OutOfRange: PUBLIC SIGNAL [value: REAL] = CODE; X: NAT = GriffinPoint.X; Y: NAT = GriffinPoint.Y; ValScale: REAL; ScrToObjMatrix: GriffinTransform.XFMDescriptor _ NEW[GriffinTransform.XFormMatrix]; ObjToScrMatrix: GriffinTransform.XFMDescriptor _ NEW[GriffinTransform.XFormMatrix]; <> <> ObjValToScrVal: PUBLIC PROC [val: REAL] RETURNS [INTEGER] = { int: INTEGER; val _ val*ValScale; int _ Real.RoundI[val]; RETURN[int]; }; ObjToScr: PUBLIC PROC [pt: GriffinPoint.ObjPt] RETURNS [GriffinPoint.ScrPt] = { scr: GriffinPoint.ScrPt; pt _ GriffinTransform.XFormPt[pt, ObjToScrMatrix]; scr[X] _ Real.RoundLI[pt[X]]; scr[Y] _ Real.RoundLI[pt[Y]]; RETURN[scr]; }; ScrValToObjVal: PUBLIC PROC [val: INTEGER] RETURNS [REAL] = { real: REAL _ val/ValScale; RETURN[real]; }; ScrToObj: PUBLIC PROC [pt: GriffinPoint.ScrPt] RETURNS [GriffinPoint.ObjPt] = { obj: GriffinPoint.ObjPt; i: INTEGER; FOR i IN [X..Y] DO obj[i] _ pt[i]; --convert to REAL ENDLOOP; obj _ GriffinTransform.XFormPt[obj, ScrToObjMatrix]; RETURN[obj]; }; ObjToScrReal: PUBLIC PROC [pt: GriffinPoint.ObjPt] RETURNS [GriffinPoint.ScrRealPt] = { srp: GriffinPoint.ScrRealPt _ GriffinTransform.XFormPt[pt, ObjToScrMatrix]; RETURN[srp]; }; ScrRealToObj: PUBLIC PROC [pt: GriffinPoint.ScrRealPt] RETURNS [GriffinPoint.ObjPt] = { obj: GriffinPoint.ObjPt _ GriffinTransform.XFormPt[pt, ScrToObjMatrix]; RETURN[obj]; }; ScrToScrReal: PUBLIC PROC [pt: GriffinPoint.ScrPt] RETURNS [GriffinPoint.ScrRealPt] = { RETURN[[pt[X], pt[Y]]]; }; ScrRealToScr: PUBLIC PROC [pt: GriffinPoint.ScrRealPt] RETURNS [GriffinPoint.ScrPt] = { RETURN[[Real.RoundLI[pt[X]], Real.RoundLI[pt[Y]]]]; }; InitPointFns: PUBLIC PROC = { <> <> <> <> <> <> PixelsToMicas: REAL = 32.0; MicasToPixels: REAL = 1.0/PixelsToMicas; dxCenterGuess: REAL = 586/2; --586 ~= width of default viewer, LF display, left column dyCenterGuess: REAL = (694/2)+68; --694 ~= height of default viewer, LF display, left column GriffinTransform.InitXForms[ObjToScrMatrix]; GriffinTransform.Scale[[MicasToPixels, MicasToPixels], ObjToScrMatrix]; ValScale _ MicasToPixels; --arbitrary choice GriffinTransform.InitXForms[ScrToObjMatrix]; GriffinTransform.Scale[[PixelsToMicas, PixelsToMicas], ScrToObjMatrix]; <> <> <> <> <> }; END.