ImagerTestViewerImpl.mesa
Michael Plass, December 28, 1983 1:48 pm
DIRECTORY Imager, ImagerTestViewer, ImagerPixelMaps, ImagerFrameBuffer, GraphicsOps, Real, ViewerClasses, ViewerOps;
ImagerTestViewerImpl:
CEDAR
PROGRAM
IMPORTS Imager, ImagerPixelMaps, ImagerFrameBuffer, GraphicsOps, Real, ViewerOps
EXPORTS ImagerTestViewer
~ BEGIN
NewViewer:
PUBLIC
PROC
RETURNS [ViewerClasses.Viewer] ~ {
RETURN [ViewerOps.CreateViewer[flavor: $ImagerTestViewer, info: [name: "Imager Test"]]]
};
Canvas:
PUBLIC
PROC [viewer: ViewerClasses.Viewer]
RETURNS [ImagerPixelMaps.PixelMap] ~ {
IF viewer.iconic OR viewer.destroyed THEN RETURN [ImagerPixelMaps.Create[0, [0,0,0,0]]];
ViewerOps.PaintViewer[viewer, client, FALSE, $Canvas];
RETURN [NARROW[viewer.data, REF ImagerPixelMaps.PixelMap]^];
};
Context:
PUBLIC
PROC [viewer: ViewerClasses.Viewer]
RETURNS [imager: Imager.Context] ~ {
p: REF ImagerPixelMaps.PixelMap;
IF viewer.iconic OR viewer.destroyed THEN RETURN [NIL];
ViewerOps.PaintViewer[viewer, client, FALSE, $Canvas];
imager ← Imager.Create[$LFDisplay];
p ← NARROW[viewer.data];
imager.SetView[[p.fMin, 808-(p.sMin+p.sSize), p.fSize, p.sSize]];
};
PaintRep:
TYPE ~
RECORD [
paint: PROC [Imager.Context, REF ANY],
data: REF ANY
];
Painter:
PUBLIC
PROC [viewer: ViewerClasses.Viewer, paint:
PROC [Imager.Context,
REF
ANY], data:
REF
ANY] ~ {
IF viewer.iconic OR viewer.destroyed THEN NULL
ELSE {
paintRef: REF PaintRep ← NEW[PaintRep ← [paint, data]];
ViewerOps.PaintViewer[viewer, client, FALSE, paintRef]
};
};
PaintProc: ViewerClasses.PaintProc
-- PROC [self: Viewer, context: Graphics.Context, whatChanged: REF ANY, clear: BOOL]
~ {
IF whatChanged = $Canvas
THEN {
canvas: REF ImagerPixelMaps.PixelMap ← NARROW[self.data];
cy: REAL ← GraphicsOps.UserToDevice[context,0,0].ty;
cx: REAL ← GraphicsOps.UserToDevice[context,0,0].tx;
IF canvas =
NIL
THEN
TRUSTED {
self.data ← canvas ← NEW[ImagerPixelMaps.PixelMap ← ImagerFrameBuffer.LFDisplay[]];
};
canvas.sOrigin ← -(canvas.sMin ← Real.RoundLI[cy]-self.ch);
canvas.fOrigin ← -(canvas.fMin ← Real.RoundLI[cx]);
canvas.sSize ← self.ch;
canvas.fSize ← self.cw;
}
ELSE
WITH whatChanged
SELECT
FROM
paintRef:
REF PaintRep => {
cy: REAL ← GraphicsOps.UserToDevice[context,0,0].ty;
cx: REAL ← GraphicsOps.UserToDevice[context,0,0].tx;
imager: Imager.Context ← NARROW[ViewerOps.FetchProp[self, $ImagerContext]];
LocalPaint: PROC ~ {paintRef.paint[imager, paintRef.data]};
IF imager =
NIL
THEN {
imager ← Imager.Create[$LFDisplay];
ViewerOps.AddProp[self, $ImagerContext, imager];
};
imager.SetView[[Real.RoundLI[cx], 808-Real.RoundLI[cy], self.cw, self.ch]];
imager.DoSaveAll[LocalPaint];
};
ENDCASE => NULL;
};
viewerClass: ViewerClasses.ViewerClass ←
NEW[ViewerClasses.ViewerClassRec ← [
paint: PaintProc
]];
ViewerOps.RegisterViewerClass[$ImagerTestViewer, viewerClass];
END.