DIRECTORY Basics USING [bitsPerWord], Convert USING [Error, RealFromRope], ImagerFrameBuffer USING [], ImagerPixelMap USING [PixelMap, PixelMapRep], PrincOps USING [BBTable], Real USING [RoundLI], RealFns USING [Power], Terminal USING [ColorMode, GetBitBltTable, GetColorBitmapState, GetColorMode, LegalColorMode, SetBWBitmapState, SetColor, SetColorBitmapState, Virtual], UserProfile USING [Token]; ImagerFrameBufferImpl: CEDAR PROGRAM IMPORTS Convert, Real, RealFns, Terminal, UserProfile EXPORTS ImagerFrameBuffer ~ BEGIN lfDisplay: ImagerPixelMap.PixelMap; LFDisplay: PUBLIC UNSAFE PROC [vt: Terminal.Virtual] RETURNS [ImagerPixelMap.PixelMap] ~ UNCHECKED { IF lfDisplay.refRep = NIL THEN { bb: PrincOps.BBTable; [] _ vt.SetBWBitmapState[$displayed]; bb _ vt.GetBitBltTable; lfDisplay _ [sOrigin: 0, fOrigin: 0, sMin: 0, fMin: 0, sSize: bb.height, fSize: bb.width, refRep: NEW [ImagerPixelMap.PixelMapRep _ [ pointer: bb.dst.word, words: LONG[bb.width/Basics.bitsPerWord]*bb.height, lgBitsPerPixel: 0, rast: bb.width/Basics.bitsPerWord, lines: bb.height ]] ]; }; RETURN [lfDisplay]; }; ColorDisplayError: PUBLIC ERROR [reason: ATOM] ~ CODE; ColorDisplay8: PUBLIC UNSAFE PROC [vt: Terminal.Virtual] RETURNS [colorDisplay: ImagerPixelMap.PixelMap] ~ UNCHECKED { mode: Terminal.ColorMode = [full: FALSE, bitsPerPixelChannelA: 8, bitsPerPixelChannelB: 0]; IF NOT vt.hasColorDisplay THEN ERROR ColorDisplayError[$NoColorDisplay]; IF vt.GetColorBitmapState#none AND vt.GetColorMode#mode THEN ERROR ColorDisplayError[$IncompatibleDisplayMode]; IF NOT vt.LegalColorMode[mode] THEN ERROR ColorDisplayError[$DisplayModeNotSupported]; [] _ vt.SetColorBitmapState[$displayed, mode, $all]; colorDisplay _ [sOrigin: 0, fOrigin: 0, sMin: 0, fMin: 0, sSize: vt.colorHeight, fSize: vt.colorWidth, refRep: NEW [ImagerPixelMap.PixelMapRep _ [ pointer: vt.colorBitmapA, words: LONG[vt.colorWordsPerLineA]*vt.colorHeight, lgBitsPerPixel: 3, rast: vt.colorWordsPerLineA, lines: vt.colorHeight ]] ]; FOR i: NAT IN [0..40) DO vt.SetColor[ i + 216, 0, i*6, i*6, i*6] ENDLOOP; -- greyscale FOR i: NAT IN [0..216) DO -- 6 x 6 x 6 color cube vt.SetColor[ i, 0, 36 * (i MOD 6 + 1), 36 * ((i/6) MOD 6 + 1), 36 * (i/36 + 1)]; ENDLOOP; }; GrayScaleDisplay8: PUBLIC UNSAFE PROC [vt: Terminal.Virtual] RETURNS[colorDisplay: ImagerPixelMap.PixelMap] ~ UNCHECKED { mode: Terminal.ColorMode = [full: FALSE, bitsPerPixelChannelA: 8, bitsPerPixelChannelB: 0]; gamma: REAL _ 2.2; IF NOT vt.hasColorDisplay THEN ERROR ColorDisplayError[$NoColorDisplay]; IF vt.GetColorBitmapState#none AND vt.GetColorMode#mode THEN ERROR ColorDisplayError[$IncompatibleDisplayMode]; IF NOT vt.LegalColorMode[mode] THEN ERROR ColorDisplayError[$DisplayModeNotSupported]; [] _ vt.SetColorBitmapState[$displayed, mode, $all]; colorDisplay _ [sOrigin: 0, fOrigin: 0, sMin: 0, fMin: 0, sSize: vt.colorHeight, fSize: vt.colorWidth, refRep: NEW [ImagerPixelMap.PixelMapRep _ [ pointer: vt.colorBitmapA, words: LONG[vt.colorWordsPerLineA]*vt.colorHeight, lgBitsPerPixel: 3, rast: vt.colorWordsPerLineA, lines: vt.colorHeight ]] ]; gamma _ Convert.RealFromRope[UserProfile.Token["ColorDisplay.Gamma", "2.2"] ! Convert.Error => CONTINUE]; GrayScaleGamma[vt, gamma]; }; GrayScaleGamma: PROC [vt: Terminal.Virtual, gamma: REAL] ~ { mode: Terminal.ColorMode = [full: FALSE, bitsPerPixelChannelA: 8, bitsPerPixelChannelB: 0]; inverseGamma: REAL _ 1.0/gamma; IF NOT vt.hasColorDisplay THEN ERROR ColorDisplayError[$NoColorDisplay]; IF vt.GetColorBitmapState#none AND vt.GetColorMode#mode THEN ERROR ColorDisplayError[$IncompatibleDisplayMode]; IF NOT vt.LegalColorMode[mode] THEN ERROR ColorDisplayError[$DisplayModeNotSupported]; FOR i: NAT IN [0..256) DO uncorrected: REAL ~ i/255.0; corrected: REAL ~ RealFns.Power[uncorrected, inverseGamma]; scaled: INT ~ Real.RoundLI[corrected*255.0]; g: NAT ~ MAX[MIN[scaled, 255], 0]; vt.SetColor[i, 0, g, g, g]; ENDLOOP; }; END. μImagerFrameBufferImpl.mesa Copyright c 1984, 1985 by Xerox Corporation. All rights reserved. Michael Plass, March 26, 1984 11:58:53 am PST Doug Wyatt, April 2, 1985 7:16:08 pm PST Provides descriptions of displays as PixelMaps Κ¬˜code™Kšœ Οmœ7™BK™-K™(—K™K™.K˜šΟk ˜ Kšœžœ˜Kšœžœ˜$Kšœžœ˜Kšœžœ˜-Kšœ žœ ˜Kšœžœ ˜Kšœžœ ˜Kšœ žœŠ˜˜Kšœ žœ ˜K˜—KšΠblœžœž˜$Kšžœ.˜5Kšžœ˜Kšœž˜K˜Kšœ#˜#K˜šΟn œžœžœžœ˜4Kšžœž œ˜/šžœžœžœ˜ K˜Kšœ&˜&Kšœ˜šœ6˜6Kšœ˜Kšœ˜šœžœ ˜+K˜Kšœžœ(˜3Kšœ˜Kšœ"˜"Kšœ˜Kšœ˜—K˜—Kšœ˜—Kšžœ ˜Kšœ˜—Kš œžœžœ žœžœ˜6š  œžœžœžœ˜8Kšžœ+ž œ˜=Kšœ"žœ4˜[šžœžœž˜Kšžœ$˜)—šžœžœž˜