<> <> <> <> <> DIRECTORY Rope USING [ROPE], Atom USING [GetProp, PutProp], Imager USING [Context, black, IncompatibleContexts, nullBounds], ImagerBasic USING [IntRectangle, IntPair, Transformation, Color, CIEColor], ImagerMasks USING [Mask], ImagerDisplay USING [ContextData, ContextDataRep, DisplayClassRep]; ImagerDisplayImpl: CEDAR PROGRAM IMPORTS Imager, Atom EXPORTS Imager, ImagerDisplay ~ BEGIN <> UnImplementedDisplayDevice: PUBLIC SIGNAL ~ CODE; NotImplementedYet: PUBLIC SIGNAL ~ CODE; <> Init: PUBLIC PROC [context: Imager.Context, name: Rope.ROPE, -- exported to ImagerImpl bounds: ImagerBasic.IntRectangle] = { OpenContext: PROC [deviceType: ATOM, pin: BOOLEAN, box: ImagerMasks.Mask] RETURNS [ImagerDisplay.ContextData] ~ { <> displayContext: ImagerDisplay.ContextData _ NEW[ImagerDisplay.ContextDataRep]; WITH Atom.GetProp[deviceType, imagerDisplayRegistrationKey] SELECT FROM displayClass: REF ImagerDisplay.DisplayClassRep => { displayContext.deviceProcs _ displayClass; displayContext.deviceProcs.SetUp[displayContext, pin, box]; }; ENDCASE => ERROR UnImplementedDisplayDevice; displayContext.currentColor _ Imager.black; displayContext.currentPxlValue _ displayContext.deviceProcs.ColortoPixel[ NARROW[displayContext.currentColor, ImagerBasic.CIEColor] ]; displayContext.currentPosition _ [0, 0]; displayContext.viewerClipper _ displayContext.deviceClipper; displayContext.clientClipper _ displayContext.deviceClipper; displayContext.clipper _ displayContext.deviceClipper; displayContext.transform _ displayContext.deviceTransform; displayContext.clientTransform _ displayContext.viewerTransform _ [1., 0., 0., 0., 1., 0., identity]; RETURN [ displayContext ]; }; IF bounds = Imager.nullBounds THEN context.data _ OpenContext[context.class.deviceType, TRUE, [0, 0, 0, 0, NIL] ] ELSE { boxMask: ImagerMasks.Mask _ IF bounds.h <= 0 OR bounds.w <= 0 THEN [bounds.y, bounds.x, 0, 0, NIL] ELSE [bounds.y, bounds.x, bounds.h, bounds.w, NIL]; context.data _ OpenContext[context.class.deviceType, FALSE, boxMask]; }; }; 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]; context.data _ NIL; context.class _ NIL; }; DoSaveAll: PUBLIC PROC [context: Imager.Context, action: PROC] ~ { dataRep: ImagerDisplay.ContextDataRep; data: ImagerDisplay.ContextData = NARROW[context.data]; dataRep _ data^; action[]; data^ _ dataRep; }; DoSave: PUBLIC PROC [context: Imager.Context, action: PROC] ~ { cp: ImagerBasic.IntPair; dataRep: ImagerDisplay.ContextDataRep; data: ImagerDisplay.ContextData = NARROW[context.data]; dataRep _ data^; action[]; cp _ data.currentPosition; data^ _ dataRep; data.currentPosition _ cp; }; TransferBuffer: PUBLIC PROC [context, source: Imager.Context] ~ { <> displaySource: ImagerDisplay.ContextData = NARROW[source.data]; displayContext: ImagerDisplay.ContextData = NARROW[context.data]; IF context.class.deviceType # source.class.deviceType THEN ERROR Imager.IncompatibleContexts[]; displayContext.deviceProcs.TransferPxls[displaySource, displayContext]; }; <> NewDisplay: PUBLIC PROC [context: Imager.Context, deviceType: ATOM] ~ { displayContext: ImagerDisplay.ContextData = NARROW[context.data]; WITH Atom.GetProp[deviceType, imagerDisplayRegistrationKey] SELECT FROM displayClass: REF ImagerDisplay.DisplayClassRep => { displayContext.deviceProcs _ displayClass; displayContext.deviceProcs.SetUp[displayContext, TRUE, [0, 0, 0, 0, NIL] ]; }; ENDCASE => ERROR UnImplementedDisplayDevice; IF ISTYPE[displayContext.currentColor, ImagerBasic.CIEColor] THEN displayContext.currentPxlValue _ displayContext.deviceProcs.ColortoPixel[ NARROW[displayContext.currentColor, ImagerBasic.CIEColor] ]; }; Reset: PUBLIC PROC [context: Imager.Context] ~ {}; RegisterDisplayDevice: PUBLIC PROC [class: REF ImagerDisplay.DisplayClassRep] ~ { Atom.PutProp[class.deviceType, imagerDisplayRegistrationKey, class]; }; imagerDisplayRegistrationKey: REF TEXT _ "ImagerDisplay Display Class "; END.