ImagerDisplayTransformImpl.mesa
Created March 11, 1983
Last Edit By:
Plass, March 14, 1983 2:16 pm
Last Edited by: Crow, August 30, 1983 6:34 pm
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;
Client Procedures (exported to Imager)
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];
};
Fast Track
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];
};
Display Procedures (exported to ImagerDisplay)
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] = {
Concatenate a transform to the proper existing transform
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
};
Internal Procedures
ValidateCompositeTransform: PROC [displayContext: ImagerDisplay.ContextData] = {
displayContext.transform ← ImagerTransform.Concat[
displayContext.clientTransform,
ImagerTransform.Concat[displayContext.viewerTransform,
       displayContext.deviceTransform]
];
};
END.