<> <> <> <> <> DIRECTORY Rope USING [ROPE], Imager USING [Context, ContextRep, SetT, black], ImagerBasic USING [IntRectangle, Transformation, Color, CIEColor], -- Imager1bitDisplay USING [SetUp], Imager8bitDisplay USING [SetUp], ImagerDisplay USING [Mask, MaskRep, ContextData, ContextDataRep]; ImagerDisplayContextImpl: CEDAR PROGRAM IMPORTS Imager, Imager8bitDisplay -- , Imager1bitDisplay EXPORTS Imager, ImagerDisplay = BEGIN <> UnImplementedDisplayDevice: PUBLIC SIGNAL = CODE; NotImplementedYet: PUBLIC SIGNAL = CODE; IncompatibleContexts: PUBLIC SIGNAL = CODE; <> Create: PUBLIC PROC [deviceType: ATOM, name: Rope.ROPE _ NIL] RETURNS [Imager.Context] = { <> RETURN [ OpenContext[deviceType, TRUE, NIL] ]; }; Flush: PUBLIC PROC [context: Imager.Context] = { <> displayContext: ImagerDisplay.ContextData = NARROW[context.data]; displayContext.deviceProcs.loadTrapezoid[ displayContext, displayContext.clipper.sMin + displayContext.clipper.sSize - 1, displayContext.clipper.sMin, displayContext.clipper.fMin, displayContext.clipper.fMin, displayContext.clipper.fMin + displayContext.clipper.fSize - 1, displayContext.clipper.fMin + displayContext.clipper.fSize - 1, displayContext.currentPxlValue ]; }; Close: PUBLIC PROC [context: Imager.Context] = { <> displayContext: ImagerDisplay.ContextData; IF context = NIL THEN RETURN[]; displayContext _ NARROW[context.data]; displayContext.deviceProcs.shutDown[displayContext]; }; DoSaveAll: PUBLIC PROC [context: Imager.Context, action: PROC] = { ERROR NotImplementedYet[]; }; DoSave: PUBLIC PROC [context: Imager.Context, action: PROC] = { ERROR NotImplementedYet[]; }; CreateBuffer: PUBLIC PROC [deviceType: ATOM, box: ImagerBasic.IntRectangle] RETURNS [Imager.Context] = { boxMask: ImagerDisplay.Mask _ IF box.h <= 0 OR box.w <= 0 THEN NIL ELSE NEW[ ImagerDisplay.MaskRep _ [box.y, box.x, box.h, box.w, NIL] ]; RETURN [ OpenContext[deviceType, FALSE, boxMask] ]; }; TransferBuffer: PUBLIC PROC [context, source: Imager.Context] = { <> displaySource: ImagerDisplay.ContextData = NARROW[source.data]; displayContext: ImagerDisplay.ContextData = NARROW[context.data]; displayContext.deviceProcs.transferPxls[displaySource, displayContext]; }; <> NewDisplay: PUBLIC PROC [context: Imager.Context, device: ATOM] = { displayContext: ImagerDisplay.ContextData = NARROW[context.data]; SELECT device FROM $CRT8 => Imager8bitDisplay.SetUp[displayContext, TRUE]; -- $LF => Imager1bitDisplay.SetUp[displayContext, TRUE]; ENDCASE => ERROR IncompatibleContexts[]; IF ISTYPE[displayContext.currentColor, ImagerBasic.CIEColor] THEN displayContext.currentPxlValue _ displayContext.deviceProcs.colortoPixel[ NARROW[displayContext.currentColor, ImagerBasic.CIEColor] ]; }; Reset: PUBLIC PROC [context: Imager.Context] = {}; <> OpenContext: PROC [deviceType: ATOM, pin: BOOLEAN, box: ImagerDisplay.Mask] RETURNS [Imager.Context] = { <> context: Imager.Context; displayContext: ImagerDisplay.ContextData _ NEW[ImagerDisplay.ContextDataRep]; SELECT deviceType FROM $CRT8 => Imager8bitDisplay.SetUp[displayContext, pin, box]; -- $LF => Imager1bitDisplay.SetUp[displayContext, pin, box]; ENDCASE => RETURN [NIL]; -- what about new devices?? displayContext.currentColor _ Imager.black; displayContext.currentPxlValue _ displayContext.deviceProcs.colortoPixel[ NARROW[displayContext.currentColor, ImagerBasic.CIEColor] ]; displayContext.currentPosition _ [0, 0]; context _ NEW[ Imager.ContextRep _ [NIL, displayContext] ]; Imager.SetT[context, [1., 0., 0., 0., 1., 0., identity]]; Imager.SetClipper[ context, NEW[ ImagerDisplay.MaskRep _ [ FIRST[INTEGER]/2, FIRST[INTEGER]/2, LAST[INTEGER], LAST[INTEGER] ] ] ]; <> RETURN [ context ]; }; END.