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.