DIRECTORY Imager USING [Error, Context], ImagerBasic USING [DeviceRectangle, Color, ColorRep], ImagerDisplay USING [DisplayClass, DisplayClassRep, DisplayData, CreateImagerClass], ImagerStdColorDisplay USING [SetUpMapProc, CachedColorProc, Create, ApplyMask, PinPixelMap, ReleasePixelMap, LoadColorMap, DoUnderLock, ColorMapData, LoadColorProc], ImagerManhattan USING [Polygon], ImagerMasks USING [Mask], ImagerPrivate USING [Class, RegisterDevice], ColorModels USING [Calibration], ConstantColors USING [ColorToRGB], Terminal USING [ColorMode, Current, SetRedMap, SetGreenMap, SetBlueMap, Virtual], Atom USING [GetPropFromList], Real USING [FixC], RealFns USING [Power]; ImagerStd24BitDisplayImpl: CEDAR MONITOR IMPORTS Imager, ImagerDisplay, ImagerPrivate, ConstantColors, Terminal, Real, RealFns, Atom, ImagerStdColorDisplay ~ BEGIN DisplayClass: TYPE ~ ImagerDisplay.DisplayClass; DisplayClassRep: TYPE ~ ImagerDisplay.DisplayClassRep; DisplayData: TYPE ~ ImagerDisplay.DisplayData; Color: TYPE ~ ImagerBasic.Color; ColorRep: TYPE ~ ImagerBasic.ColorRep; ConstantColor: TYPE = REF ColorRep.constant; Mask: TYPE ~ ImagerMasks.Mask; on: BOOLEAN ~ TRUE; off: BOOLEAN ~ FALSE; bitsPerPixel: NAT ~ 24; -- truncated value, ImagerStdColorDisplayImpl expects this vt: Terminal.Virtual; mode: Terminal.ColorMode ~ [full: TRUE, bitsPerPixelChannelA: 8, bitsPerPixelChannelB: 8]; std24BitDisplayClass: ImagerDisplay.DisplayClass ~ NEW[ImagerDisplay.DisplayClassRep _ [ displayType: $Std24bpp, viewUnitsPerPixel: 1, Create: Create, ApplyMask: ApplyMask, DoUnderLock: ImagerStdColorDisplay.DoUnderLock ]]; ColorDisplayError: PUBLIC ERROR [reason: ATOM] ~ CODE; Create: PROC [displayClass: DisplayClass, creationData: REF] RETURNS [displayData: DisplayData] ~ { displayData _ ImagerStdColorDisplay.Create[ vt, mode, displayClass, creationData, bitsPerPixel, SetUpColorMap]; }; ApplyMask: PROC [displayData: DisplayData, color: Color, mask: Mask, sTranslate, fTranslate: INTEGER] ~ { ImagerStdColorDisplay.ApplyMask[displayData, color, mask, sTranslate, fTranslate, CacheColor]; }; SpecialOp: PROC[context: Imager.Context, op: ATOM, data: REF] RETURNS[REF] ~ { SELECT op FROM $DisplayContext => { -- Pin a pixel map to the color display, replace what was there before. ImagerStdColorDisplay.PinPixelMap[vt, NARROW[context.data, ImagerDisplay.DisplayData], mode ]; }; $UnDisplayContext => ImagerStdColorDisplay.ReleasePixelMap[vt, NARROW[context.data, ImagerDisplay.DisplayData]]; $LoadColorMap => ImagerStdColorDisplay.LoadColorMap[vt, data, NARROW[context.data, ImagerDisplay.DisplayData], LoadColor ]; ENDCASE => Imager.Error[$UnimplementedSpecialOp]; RETURN[ NIL ]; }; LoadColor: ImagerStdColorDisplay.LoadColorProc ~ { r, g, b: REAL; mr, mg, mb: [0..256); [r, g, b] _ ConstantColors.ColorToRGB[color, colorCalibration]; r _ MIN[1.0, MAX[0.0, r]]; g _ MIN[1.0, MAX[0.0, g]]; b _ MIN[1.0, MAX[0.0, b]]; mr _ Real.FixC[255.0 * RealFns.Power[r, .43]]; mg _ Real.FixC[255.0 * RealFns.Power[g, .43]]; mb _ Real.FixC[255.0 * RealFns.Power[b, .43]]; vt.SetRedMap[mapEntry, mr]; vt.SetGreenMap[mapEntry, mg]; vt.SetBlueMap[mapEntry, mb]; }; SetUpColorMap: ImagerStdColorDisplay.SetUpMapProc ~ { IF Atom.GetPropFromList[displayData.props, $PixelMapStatus] = $Displayed THEN FOR i: NAT IN [0..256) DO j: NAT _ Real.FixC[RealFns.Power[i/256.0, .43] * 256.0]; -- Linearize power law display vt.SetRedMap[i, j]; vt.SetGreenMap[i, j]; vt.SetBlueMap[i, j]; ENDLOOP; }; CacheColor: ImagerStdColorDisplay.CachedColorProc ~ { colorData: REF ImagerStdColorDisplay.ColorMapData _ NARROW[displayData.cachedColorData]; WITH color SELECT FROM constantColor: ConstantColor => { r, g, b: REAL; nr, ng, nb: CARDINAL; [r, g, b] _ ConstantColors.ColorToRGB[constantColor, colorData.colorCalibration]; r _ MIN[1.0, MAX[0.0, r]]; g _ MIN[1.0, MAX[0.0, g]]; b _ MIN[1.0, MAX[0.0, b]]; nr _ Real.FixC[255.0 * r]; ng _ Real.FixC[255.0 * g]; nb _ Real.FixC[255.0 * b]; displayData.cachedColor _ color; colorData.pixelValueList _ LIST[ nr * 256 + ng, nb]; }; ENDCASE => Imager.Error[$UnsupportedColorType]; }; Init: PROC[] ~ { std24BitImagerClass: ImagerPrivate.Class ~ ImagerDisplay.CreateImagerClass[std24BitDisplayClass]; -- pick up Imager class record std24BitImagerClass.SpecialOp _ SpecialOp; -- modify procedure bindings ImagerPrivate.RegisterDevice[std24BitImagerClass]; -- register device class vt _ Terminal.Current[]; }; Init[]; END. ΞImagerStd24BitDisplayImpl.mesa Copyright c 1984 by Xerox Corporation. All rights reserved. Frank Crow, July 30, 1984 5:50:05 pm PDT This implements an 24-bit-per-pixel color display with no antialiasing. PROC [ color: ConstantColor, colorCalibration: ColorModels.Calibration, mapEntry: [0..256) ] PROC[displayData: DisplayData] PROC [displayData: DisplayData, color: Color] Convert color to RGB and cache merged RG value plus blue for subsequent writes ΚΕ˜Ihead1™šœ Οmœ1™