<> <> <> DIRECTORY Atom, CGContext, Imager, ImagerBridge, ImagerBridgeExtras, ImagerDisplay, ImagerPrivate, Graphics, GraphicsOps, Real, Terminal; ImagerBridgeImpl: CEDAR PROGRAM IMPORTS Atom, Imager, Graphics, GraphicsOps, Real, Terminal EXPORTS ImagerBridge, ImagerBridgeExtras ~ BEGIN deviceTable: ARRAY ImagerBridgeExtras.DisplayAtom OF ATOM _ [ lf: $LFDisplay, bits2: $Std2bpp, bits4:$Std4bpp, bits8: $Gray8bpp, bits24:$Std24bpp ]; <> <<$Gray8bpp, $SmoothGray, $Std2bpp, $Std4bpp, $Std8bpp, $Std24bpp.>> colorDisplayHeight: REAL _ 11.0; SetDisplayScale: PUBLIC PROC [height: REAL _ 11] = { --11 inch "page" fits on display colorDisplayHeight _ height}; SetDisplayAtom: PUBLIC PROC [type: ImagerBridgeExtras.DisplayAtom, atom: ATOM] = { deviceTable[type] _ atom; }; lfGraphicsData: CGContext.Ref ~ NARROW[Graphics.NewContext[].data]; OnLFDisplay: PROC [graphics: Graphics.Context] RETURNS [BOOLEAN] ~ { data: CGContext.Ref ~ NARROW[graphics.data]; RETURN [data.device.Show = lfGraphicsData.device.Show] }; ColorDisplayProps: PROC RETURNS [props: Atom.PropList _ NIL] ~ { vt: Terminal.Virtual _ Terminal.Current[]; colorHeight: NAT _ vt.colorHeight; IF colorHeight > 25 THEN { props _ Atom.PutPropOnList[props, $pixelsPerInch, NEW[REAL _ (colorHeight-14)/colorDisplayHeight]]; }; }; SetViewFromGraphicsContext: PUBLIC PROC [imager: Imager.Context, graphics: Graphics.Context] ~ { x, y, w, h: REAL; IF NARROW[imager.class, ImagerPrivate.Class].deviceType = $PD THEN Imager.Error[$CannotUseAHardcopyContextOnADisplay]; [x, y] _ GraphicsOps.UserToDevice[graphics,0,0]; IF GraphicsOps.UserToDevice[graphics,0,1].ty > y THEN Imager.Error[$YFlipNotSupported]; [[xmax: w, ymax: h]] _ Graphics.GetBounds[graphics]; IF OnLFDisplay[graphics] THEN { IF NARROW[imager.class, ImagerPrivate.Class].deviceType # deviceTable[lf] THEN { temp: Imager.Context _ Imager.Create[deviceTable[lf]]; imager.class _ temp.class; imager.data _ temp.data; }; } ELSE { <> displayData: ImagerDisplay.DisplayData; type: ImagerBridgeExtras.DisplayAtom; mode: Terminal.ColorMode _ Terminal.GetColorMode[Terminal.Current[]]; type _ IF mode.full THEN bits24 ELSE SELECT mode.bitsPerPixelChannelA FROM 2 => bits2, 4 => bits4, 8 => bits8, ENDCASE => ERROR; IF NARROW[imager.class, ImagerPrivate.Class].deviceType # deviceTable[type] THEN { temp: Imager.Context _ Imager.Create[deviceTable[type], NIL]; imager.class _ temp.class; imager.data _ temp.data; }; displayData _ NARROW[imager.data]; x _ x*displayData.displayClass.viewUnitsPerPixel; y _ y*displayData.displayClass.viewUnitsPerPixel; w _ w*displayData.displayClass.viewUnitsPerPixel; h _ h*displayData.displayClass.viewUnitsPerPixel; }; imager.SetViewOrigin[[Real.RoundLI[x], imager.GetSurfaceBounds.h-Real.RoundLI[y]]]; imager.SetViewBox[[0, 0, Real.RoundLI[w], Real.RoundLI[h]]]; }; END.