<> <> 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.