DIRECTORY ImagerBasic USING [IntRectangle, IntPair, PixelArray], Imager USING [Context], ImagerTransform USING [TransformIntRectangle], ImagerDisplayPrivate USING [ContextData], ImagerDisplay USING [Mask]; ImagerInteractiveImpl: CEDAR PROGRAM IMPORTS ImagerTransform EXPORTS ImagerDisplay = BEGIN OPEN ImagerBasic; NonRectangularClipper: PUBLIC SIGNAL = CODE; HighlightIntRectangle: PUBLIC PROC [context: Imager.Context, area: IntRectangle] = { data: REF _ context.data; WITH data SELECT FROM displayContext: ImagerDisplayPrivate.ContextData => { }; ENDCASE; -- No-op if not display device }; MoveIntRectangle: PUBLIC PROC [context: Imager.Context, source: IntRectangle, destination: IntPair] = { -- Client's way to use BitBlt data: REF _ context.data; destRect: IntRectangle _ [ destination.x, destination.y, source.w, source.h]; WITH data SELECT FROM displayContext: ImagerDisplayPrivate.ContextData => { source _RectClip[ ImagerTransform.TransformIntRectangle[source, displayContext.transform], displayContext.clipper]; destRect _ RectClip[ ImagerTransform.TransformIntRectangle[destRect, displayContext.transform], displayContext.clipper]; displayContext.deviceProcs.movePxls[ [ source.x, source.y, MIN[source.w, destRect.w], MIN[source.h, destRect.h] ], [ destRect.x, destRect.y ] ]; }; ENDCASE; -- No-op if not display device }; GetPixelArray: PUBLIC PROC [context: Imager.Context, source: IntRectangle] RETURNS [PixelArray] = { dummyPixelArray: PixelArray _ NIL; data: REF _ context.data; WITH data SELECT FROM displayContext: ImagerDisplayPrivate.ContextData => RETURN [ displayContext.deviceProcs.storePxls[source] ]; ENDCASE => RETURN [ dummyPixelArray ]; -- No-op if not display device }; PutPixelArray: PUBLIC PROC [context: Imager.Context, destination: IntRectangle, image: PixelArray] = { data: REF _ context.data; WITH data SELECT FROM displayContext: ImagerDisplayPrivate.ContextData => { displayContext.deviceProcs.loadPxls[image, destination]; }; ENDCASE; -- No-op if not display device }; StartDoubleBuffering: PUBLIC PROC [context: Imager.Context] = { data: REF _ context.data; pxls: PixelArray; WITH data SELECT FROM displayContext: ImagerDisplayPrivate.ContextData => pxls _ displayContext.deviceProcs.openPixelBuffer[displayContext.clipper]; ENDCASE; -- No-op if not display device }; StopDoubleBuffering: PUBLIC PROC [context: Imager.Context] = { data: REF _ context.data; WITH data SELECT FROM displayContext: ImagerDisplayPrivate.ContextData => displayContext.deviceProcs.closePixelBuffer[]; ENDCASE; -- No-op if not display device }; RectClip: PROC[rect: IntRectangle, clipper: ImagerDisplay.Mask] RETURNS[IntRectangle] = { IF clipper.refRep = NIL THEN { OPEN clipper; sMax, fMax: INTEGER; fMin _ MAX[fMin, rect.x]; sMin _ MAX[sMin, rect.y]; fMax _ MIN[fMin + fSize, rect.x + rect.w]; sMax _ MIN[sMin + sSize, rect.y + rect.h]; fSize _ IF fMax > fMin THEN fMax - fMin + 1 ELSE 0; sSize _ IF sMax > sMin THEN sMax - sMin + 1 ELSE 0; RETURN [ [fMin, sMin, fSize, sSize] ]; } ELSE ERROR NonRectangularClipper[]; }; END. ˜ImagerInteractiveImpl.mesa Last Edited by: Crow, July 14, 1983 3:25 pm Display Procedures (exported to ImagerDisplay) These operations may not work on all devices, will no-op on noninteractive devices. Fast Track Uses uninterpreted Pixel Arrays, clip to rectangle. Handy for rubber-stamping, etc. Maintain shadow pixel array on the side for building images, use with "NewFrame". Internal Procedures Κ«˜Ihead™˜J™,šΟk ˜ Jšœœ%˜9Jšœ œ ˜Jšœœ˜/Jšœœ˜)Jšœœ ˜——šœ ˜$Jšœ˜Jšœ˜J˜Jšœœœ ˜J˜Jšœœœœ˜,—šœ.™.™SIunitšΟi ™ —šΟnœ œ1˜TJšœœ˜Jšœœ˜šœ5˜5Jšœ˜—JšœΟc)˜3Jšœ˜—šŸœœœN ˜ˆJšœœ˜JšœM˜MLšœœ˜šœ5˜5ašœ˜IcšœH˜HNšœ˜—šœ˜JšœJ˜JJšœ˜—šœ%˜%JšœM˜MJšœ˜—J˜—Jšœ )˜3Jšœ˜J™—šŸ œ œ1œ˜cJšœT™TJšœœ˜"Jšœœ˜Jšœœ˜šœ4˜4Jšœ2˜8—Jšœœ  ˜HJ˜Jšœ˜—šŸ œ œL˜fJšœœ˜Jšœœ˜šœ5˜5Jšœ8˜8J˜—Jšœ )˜3Jšœ˜—šŸœ œ˜?J™QJšœœ˜Jšœ˜Lšœœ˜šœ3˜3JšœJ˜J—Jšœ )˜3Jšœ˜—šŸœ œ˜>Jšœœ˜Jšœœ˜šœ3˜3Jšœ.˜.—Jšœ )˜3Jšœ˜——™šŸœœ3œ˜ZJšœœ˜šœœ ˜Nšœ œ˜Jšœœ˜Jšœœ˜Jšœœ ˜*Jšœœ ˜*Jšœœ œœ˜3Jšœœ œœ˜3Jšœ ˜&J˜—Jš œ˜#J˜—Lšœ˜——…— @ƒ