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. žImagerDisplayImpl.mesa Created April 8, 1983 Last Edit By: Plass, April 8, 1983 7:38 pm Last Edited by: Crow, August 30, 1983 6:33 pm Public Signals Client Procedures (exported to Imager or ImagerImpl) Returns NIL if unable to create the context. If pin = FALSE, sets up bit map compatible with deviceType, but doesn't try to find device. Clear inside context. Set to current color Remove all traces of the given context, clean up VM. Moves the image from source to context, subject to the context clipper. May be used to move data from a display to a buffer, from a buffer to a display, or between two buffers. Display Procedures (exported to ImagerDisplay) Κ³˜headšœ™J™™ J™—J™-unitšΟk œ˜ Jšœ œœ˜Jšœ œ˜#Jšœ œ4˜DJšœœ:˜NJšœœ˜Jšœœ0˜E——šœ ˜ Jšœ ˜Jšœ˜Jšœ˜—™Jšœœœœ˜1Jšœœœœ˜(—™4Lš Οnœœœ&œΟc˜Wašœ5˜5Mšž œœœœ˜Kšœœ ˜+Jšœœ~™‰Lšœ,œ˜Nšœ8œ˜Gšœœ#˜4Jšœ*˜*Jšœ;˜;Jšœ˜—Jšœœ˜,—Lšœ+˜+JšœI˜IMšœ6˜FJšœ(˜(Lšœ<˜