<> <> <> <> <> DIRECTORY ImagerBasic USING [Transformation], Imager USING [Context], ImagerDisplay USING [ImagingSpace, ContextData], ImagerTransform USING [Concat, PreTranslate, PreRotate, PreScale]; ImagerDisplayTransformImpl: CEDAR PROGRAM IMPORTS ImagerTransform EXPORTS Imager, ImagerDisplay = BEGIN Transformation: TYPE = ImagerBasic.Transformation; ImagingSpace: TYPE = ImagerDisplay.ImagingSpace; TransformTypeNone: PUBLIC SIGNAL = CODE; NotImplementedYet: PUBLIC SIGNAL = CODE; <> TranslateT: PUBLIC PROC [context: Imager.Context, dx, dy: REAL] = { displayContext: ImagerDisplay.ContextData = NARROW[context.data]; displayContext.clientTransform _ ImagerTransform.PreTranslate[dx, dy, displayContext.clientTransform]; ValidateCompositeTransform[displayContext]; -- update composite transform }; RotateT: PUBLIC PROC [context: Imager.Context, degrees: REAL] = { displayContext: ImagerDisplay.ContextData = NARROW[context.data]; displayContext.clientTransform _ ImagerTransform.PreRotate[degrees, displayContext.clientTransform]; ValidateCompositeTransform[displayContext]; }; ScaleT: PUBLIC PROC [context: Imager.Context, sx, sy: REAL] = { displayContext: ImagerDisplay.ContextData = NARROW[context.data]; displayContext.clientTransform _ ImagerTransform.PreScale[sx, sy, displayContext.clientTransform]; ValidateCompositeTransform[displayContext]; }; ConcatT: PUBLIC PROC [context: Imager.Context, transformation: Transformation] = { displayContext: ImagerDisplay.ContextData = NARROW[context.data]; displayContext.clientTransform _ ImagerTransform.Concat[ transformation, displayContext.clientTransform]; ValidateCompositeTransform[displayContext]; }; GetT: PUBLIC PROC [context: Imager.Context] RETURNS [Transformation] = { displayContext: ImagerDisplay.ContextData = NARROW[context.data]; RETURN [displayContext.clientTransform]; }; SetT: PUBLIC PROC [context: Imager.Context, transformation: Transformation] = { displayContext: ImagerDisplay.ContextData = NARROW[context.data]; displayContext.clientTransform _ transformation; ValidateCompositeTransform[displayContext]; }; <> IntTranslateT: PUBLIC PROC [context: Imager.Context, dx, dy: INTEGER] = { displayContext: ImagerDisplay.ContextData = NARROW[context.data]; { OPEN displayContext.clientTransform; c _ dx*a + dy*b + c; f _ dx*d + dy*e + f; }; ValidateCompositeTransform[displayContext]; -- update composite transform }; IntScaleT: PUBLIC PROC [context: Imager.Context, sx, sy: INTEGER] = { displayContext: ImagerDisplay.ContextData = NARROW[context.data]; { OPEN displayContext.clientTransform; a _ a * sx; e _ e * sy; IF type = identity THEN type _ SELECT TRUE FROM ABS[sx] # 1 OR ABS[sy] # 1 => hard, (sx = 1) AND (sy = 1) => identity, (sx =-1) AND (sy = 1) => mirrorX, (sx = 1) AND (sy =-1) => mirrorY, (sx =-1) AND (sy =-1) => rot180, ENDCASE => hard ELSE type _ hard; }; ValidateCompositeTransform[displayContext]; }; <> SetViewerTransform: PUBLIC PROC [ context: Imager.Context, transform: Transformation] = { displayContext: ImagerDisplay.ContextData = NARROW[context.data]; displayContext.viewerTransform _ transform; ValidateCompositeTransform[displayContext]; -- update composite transform }; ConcatToViewerTransform: PUBLIC PROC [context: Imager.Context, transform: Transformation] = { <> displayContext: ImagerDisplay.ContextData = NARROW[context.data]; displayContext.viewerTransform _ ImagerTransform.Concat[displayContext.viewerTransform, transform]; ValidateCompositeTransform[displayContext]; -- update composite transform }; SetDeviceTransform: PUBLIC PROC [ context: Imager.Context, transform: Transformation] = { displayContext: ImagerDisplay.ContextData = NARROW[context.data]; displayContext.deviceTransform _ transform; ValidateCompositeTransform[displayContext]; -- update composite transform }; <> ValidateCompositeTransform: PROC [displayContext: ImagerDisplay.ContextData] = { displayContext.transform _ ImagerTransform.Concat[ displayContext.clientTransform, ImagerTransform.Concat[displayContext.viewerTransform, displayContext.deviceTransform] ]; }; END.