DIRECTORY ImagerBasic USING [IntRectangle, IntPair], Imager USING [Context], ImagerTransform USING [TransformIntRectangle], ImagerDisplay USING [Mask, ContextData]; ImagerDisplayInteractiveImpl: CEDAR PROGRAM IMPORTS ImagerTransform EXPORTS Imager, ImagerDisplay = BEGIN OPEN ImagerBasic; NonRectangularClipper: PUBLIC SIGNAL = CODE; MoveSurfaceRectangle: PUBLIC PROC [context: Imager.Context, source: IntRectangle, dest: IntPair] RETURNS [BOOLEAN] = { -- Client's way to use BitBlt data: REF _ context.data; destRect: IntRectangle _ [ dest.x, dest.y, source.w, source.h]; WITH data SELECT FROM displayContext: ImagerDisplay.ContextData => { source _RectClip[ ImagerTransform.TransformIntRectangle[source, displayContext.transform], displayContext.clipper]; destRect _ RectClip[ ImagerTransform.TransformIntRectangle[destRect, displayContext.transform], displayContext.clipper]; displayContext.deviceProcs.MovePxls[ displayContext, [ source.x, source.y, MIN[source.w, destRect.w], MIN[source.h, destRect.h] ], [ destRect.x, destRect.y ] ]; RETURN [TRUE]; }; ENDCASE => RETURN [FALSE]; -- No-op if not display device }; SetColorInvert: PUBLIC PROC [context: Imager.Context] = {}; DrawBitmap: PUBLIC PROC [context: Imager.Context, base: LONG POINTER, raster: CARDINAL, area: IntRectangle] = {}; SpecialOp: PUBLIC PROC [context: Imager.Context, op: ATOM, data: REF] RETURNS [BOOLEAN] = { RETURN [ FALSE ]; }; HighlightIntRectangle: PUBLIC PROC [context: Imager.Context, area: IntRectangle] = { data: REF _ context.data; WITH data SELECT FROM displayContext: ImagerDisplay.ContextData => { }; ENDCASE; -- No-op if not display device }; RectClip: PROC[rect: IntRectangle, clipper: ImagerDisplay.Mask] RETURNS[IntRectangle] = { IF clipper.refRep = NIL THEN { sMax, fMax, fMin, sMin, fSize, sSize: INTEGER; fMin _ MAX[clipper.fMin, rect.x]; sMin _ MAX[clipper.sMin, rect.y]; fMax _ MIN[clipper.fMin + clipper.fSize, rect.x + rect.w]; sMax _ MIN[clipper.sMin + clipper.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. "ImagerDisplayInteractiveImpl.mesa Last Edited by: Crow, August 29, 1983 12:22 pm Client Procedures (exported to Imager) These operations may not work on all devices, will no-op on noninteractive devices. Display Procedures (exported to ImagerDisplay) Fast Track Internal Procedures Κθ˜Ihead™!˜J™/šΟk ˜ Jšœœ˜-Jšœ œ ˜Jšœœ˜/Jšœœ˜*——šœ ˜+Jšœ˜Jšœ˜J˜Jšœœœ ˜J˜Jšœœœœ˜,—šœ&™&J™SIunitšΟnœœœ1˜RašœœœΟc˜HJšœœ˜Jšœ?˜?Lšœœ˜šœ.˜.šœ˜IcšœH˜HNšœ˜—šœ˜JšœJ˜JJšœ˜—šœ4˜4Jšœœœ˜MJšœ˜—Jšœœ˜Jšœ˜—JšœœœŸ$˜@Jšœ˜J™—Lšžœœœ ˜;Lš ž œœœ!œœ œ˜ršž œœœœœœœ˜[Mšœœ˜Mšœ˜——šœ.™.MšΟi ™ šžœ œ1˜TJšœœ˜Jšœœ˜šœ.˜.Jšœ˜—JšœŸ)˜3Jšœ˜——™šžœœ3œ˜ZJšœœ˜šœ˜Nšœ&œ˜.Jšœœ˜!Jšœœ˜%Jšœœ0˜:Jšœœ0˜:Jšœœ œœ˜3Jšœœ œœ˜3Jšœ ˜&J˜—Jš œ˜#J˜—Lšœ˜——…—° Ί