DIRECTORY ImagerColor, ImagerColorDefs USING [ConstantColor], ImagerColorPrivate, RealFns USING [AlmostZero, Log, Power], JaMIPrivate, JaM USING [Any, Error, Pop, PopInt, PopReal, Register, PopBool, PushReal, State, Push], Terminal USING [Current, GetColorMode, SetColorCursorPresentation, ColorMode], WindowManager USING[StartColorViewers, StopColorViewers, ScreenPos]; JaMIColorImpl: CEDAR MONITOR IMPORTS JaM, ImagerColor, ImagerColorPrivate, WindowManager, Terminal, RealFns EXPORTS JaMIPrivate = { OPEN J: JaM, P: JaMIPrivate; maxIndex: INTEGER _ MaxIndex[]; TurnOnColor: PROC[state: JaM.State] = { nbits: INTEGER _ J.PopInt[state]; SELECT nbits FROM 0 => WindowManager.StopColorViewers[]; 1 => WindowManager.StartColorViewers[screenpos,1]; 2 => WindowManager.StartColorViewers[screenpos,2]; 4 => WindowManager.StartColorViewers[screenpos,4]; 8 => WindowManager.StartColorViewers[screenpos,8]; 24 => WindowManager.StartColorViewers[screenpos,24]; ENDCASE; maxIndex _ MaxIndex[]; }; MaxIndex: PROC RETURNS[max: CARDINAL] = { mode: Terminal.ColorMode _ Terminal.GetColorMode[Terminal.Current[]]; max _ IF NOT mode.full THEN SELECT mode.bitsPerPixelChannelA FROM 1 => 1, 2 => 3, 4 => 15, 8 => 255, ENDCASE => 0 ELSE 0; }; TurnOffColor: PROC [state: JaM.State] = {WindowManager.StopColorViewers[]}; screenpos: WindowManager.ScreenPos _ left; OnLeft: PROC [state: JaM.State] = { onLeft: BOOLEAN _ J.PopBool[state]; IF onLeft THEN screenpos _ left ELSE screenpos _ right; }; PopColor: PROC [self: JaM.State] RETURNS [ImagerColor.ConstantColor] ~ TRUSTED { x: JaM.Any ~ JaM.Pop[self]; WITH x SELECT FROM x: ImagerColor.Color => RETURN[LOOPHOLE[x]]; x: ImagerColor.ConstantColor => RETURN[x]; ENDCASE => ERROR JaM.Error[WrongType]; }; Red: PROC [state: JaM.State] = {PushColor[state, ImagerColor.ColorFromAtom[$Red]]}; Green: PROC [state: JaM.State] = {PushColor[state, ImagerColor.ColorFromAtom[$Green]]}; Blue: PROC [state: JaM.State] = {PushColor[state, ImagerColor.ColorFromAtom[$Blue]]}; Magenta: PROC [state: JaM.State] = {PushColor[state, ImagerColor.ColorFromAtom[$Magenta]]}; Cyan: PROC [state: JaM.State] = {PushColor[state, ImagerColor.ColorFromAtom[$Cyan]]}; Yellow: PROC [state: JaM.State] = {PushColor[state, ImagerColor.ColorFromAtom[$Yellow]]}; Black: PROC [state: JaM.State] = {PushColor[state, ImagerColor.ColorFromAtom[$Black]]}; White: PROC [state: JaM.State] = {PushColor[state, ImagerColor.ColorFromAtom[$White]]}; Gray: PROC [state: JaM.State] = {PushColor[state, ImagerColor.ColorFromGray[.5]]}; PushColor: PROC [self: J.State, x: ImagerColorDefs.ConstantColor] ~ { IF x#NIL THEN J.Push[self, x] ELSE ERROR J.Error[WrongType]; }; IColor: PROC [state: JaM.State] = { gray: REAL _ J.PopReal[state]; gray _ MIN[MAX[0,gray],1]; JaM.Push[state, ImagerColor.ColorFromGray[gray]]; }; RGBColor: PROC [state: JaM.State] = { b: REAL _ MAX[MIN[1,J.PopReal[state]],0]; g: REAL _ MAX[MIN[1,J.PopReal[state]],0]; r: REAL _ MAX[MIN[1,J.PopReal[state]],0]; JaM.Push[state, ImagerColor.ColorFromRGB[rgb: [r,g,b]]]; }; HSVColor: PROC [state: JaM.State] = { v: REAL = MAX[MIN[1,J.PopReal[state]],0]; s: REAL = MAX[MIN[1,J.PopReal[state]],0]; h: REAL = MAX[MIN[1,J.PopReal[state]],0]; rgb: ImagerColor.RGB = ImagerColor.RGBFromHSV[[h, s, v]]; JaM.Push[state, ImagerColor.ColorFromRGB[rgb: rgb]]; }; HSLColor: PROC [state: JaM.State] = { l: REAL = MAX[MIN[1,J.PopReal[state]],0]; s: REAL = MAX[MIN[1,J.PopReal[state]],0]; h: REAL = MAX[MIN[1,J.PopReal[state]],0]; rgb: ImagerColor.RGB = ImagerColor.RGBFromHSL[[h, s, l]]; JaM.Push[state, ImagerColor.ColorFromRGB[rgb: rgb]]; }; HSLFromColor: PROC [state: JaM.State] = { color: ImagerColor.ConstantColor = PopColor[state]; h,s,l: REAL; r, g, b: REAL; r_ ImagerColorPrivate.ComponentFromColor[color, $Red]; g_ ImagerColorPrivate.ComponentFromColor[color, $Green]; b_ ImagerColorPrivate.ComponentFromColor[color, $Blue]; [[h, s, l]] _ ImagerColor.HSLFromRGB[[r, g, b]]; JaM.PushReal[state,h]; JaM.PushReal[state,s]; JaM.PushReal[state,l]; }; HSVFromColor: PROC [state: JaM.State] = { h,s,v: REAL; color: ImagerColor.ConstantColor = PopColor[state]; r, g, b: REAL; r_ ImagerColorPrivate.ComponentFromColor[color, $Red]; g_ ImagerColorPrivate.ComponentFromColor[color, $Green]; b_ ImagerColorPrivate.ComponentFromColor[color, $Blue]; [[h, s, v]] _ ImagerColor.HSVFromRGB[[r, g, b]]; J.PushReal[state,h]; J.PushReal[state,s]; J.PushReal[state,v]; }; RGBFromColor: PROC [state: JaM.State] = { color: ImagerColor.ConstantColor = PopColor[state]; r,g,b: REAL; r_ ImagerColorPrivate.ComponentFromColor[color, $Red]; g_ ImagerColorPrivate.ComponentFromColor[color, $Green]; b_ ImagerColorPrivate.ComponentFromColor[color, $Blue]; JaM.PushReal[state,r]; JaM.PushReal[state,g]; JaM.PushReal[state,b]; }; BlackCursor: PROC [state: JaM.State] = { [] _ Terminal.SetColorCursorPresentation[Terminal.Current[], onesAreBlack]}; WhiteCursor: PROC [state: JaM.State] = { [] _ Terminal.SetColorCursorPresentation[Terminal.Current[], onesAreWhite]}; drMax: REAL _ 1.385; dgMax: REAL _ 1.032; dbMax: REAL _ 1.13; rMin: REAL _ 0.041; gMin: REAL _ 0.09; bMin: REAL _ 0.074; RGBForVtec: PROC [state: JaM.State] = { b: REAL _ JaM.PopReal[state]; g: REAL _ JaM.PopReal[state]; r: REAL _ JaM.PopReal[state]; dr: REAL _ IF r < rMin THEN drMax ELSE RealFns.Log[arg: 1.0/r,base: 10]; dg: REAL _ IF g < gMin THEN dgMax ELSE RealFns.Log[arg: 1.0/g,base: 10]; db: REAL _ IF b < bMin THEN dbMax ELSE RealFns.Log[arg: 1.0/b,base: 10]; newDr, newDg, newDb: REAL; newDr _ dr*0.8038-dg*0.1154-db*0.0999; newDg _ dr*(-0.5522)+dg*1.1776-db*0.119; newDb _ dr*0.1035-dg*0.7085+db*0.9906; JaM.PushReal[state, ClipRange[RealFns.Power[base: 10, exponent: -1*newDr]]]; JaM.PushReal[state, ClipRange[RealFns.Power[base: 10, exponent: -1*newDg]]]; JaM.PushReal[state, ClipRange[RealFns.Power[base: 10, exponent: -1*newDb]]]; }; ClipRange: PROC [v: REAL] RETURNS[REAL] = { RETURN[MIN[MAX[0,v],1]]; }; Defuzz: PROC [v: REAL] RETURNS[REAL] = { IF RealFns.AlmostZero[v,-10] THEN v _ 0; IF RealFns.AlmostZero[v-1.0,-10] THEN v _ 1; RETURN[v]; }; RegisterColor: PUBLIC PROC[state: JaM.State] = { J.Register[state,".turnoncolor",TurnOnColor]; J.Register[state,".turnoffcolor",TurnOffColor]; J.Register[state,".onleft",OnLeft]; J.Register[state,".red", Red]; J.Register[state,".green", Green]; J.Register[state,".blue", Blue]; J.Register[state,".magenta", Magenta]; J.Register[state,".cyan", Cyan]; J.Register[state,".yellow", Yellow]; J.Register[state,".black", Black]; J.Register[state,".white", White]; J.Register[state,".gray", Gray]; J.Register[state,".icolor", IColor]; J.Register[state,".rgbcolor", RGBColor]; J.Register[state,".hsvcolor", HSVColor]; J.Register[state,".hslcolor", HSLColor]; J.Register[state,".hsvfromcolor", HSVFromColor]; J.Register[state,".rgbfromcolor", RGBFromColor]; J.Register[state,".hslfromcolor", HSLFromColor]; J.Register[state,".rgbforvtec", RGBForVtec]; J.Register[state,".blackcursor", BlackCursor]; J.Register[state,".whitecursor", WhiteCursor]; }; }. |JaMIColorImpl.mesa Copyright c 1984, 1985 by Xerox Corporation. All rights reserved. last edited by Maureen Stone August 14, 1984 6:25:02 pm PDT Tim Diebert: August 1, 1985 1:55:30 pm PDT Rainbow: PROCEDURE [state: JaM.State] = { fully saturated rainbow in the even values. grays in the odd values i: NAT _ 2; scaler: REAL _ 1.0/maxIndex; ColorMap.StandardMap[]; --odd values are gray UNTIL i>maxIndex DO ColorMap.SetHSVColor[i,i*scaler,1,1]; i _ i+2; ENDLOOP; }; GrayMap: PROCEDURE [state: JaM.State] = {ColorMap.GrayMap[]}; StandardMap: PROCEDURE [state: JaM.State] = {ColorMap.StandardMap[]}; SetGamma: PROC [state: JaM.State] = {ColorMap.SetGamma[J.PopReal[state]]}; GetGamma: PROC [state: JaM.State] = {J.PushReal[state, ColorMap.GetGamma[]]}; SetRGBColorMap: PROC [state: JaM.State] = { b: REAL _ MAX[MIN[1,J.PopReal[state]],0]; g: REAL _ MAX[MIN[1,J.PopReal[state]],0]; r: REAL _ MAX[MIN[1,J.PopReal[state]],0]; index: INTEGER _ J.PopInt[state]; index _ MAX[MIN[maxIndex,index],0]; [] _ ColorMap.SetRGBColor[index,r,g,b]; }; SetHSVColorMap: PROC [state: JaM.State] = { v: REAL _ MAX[MIN[1,J.PopReal[state]],0]; s: REAL _ MAX[MIN[1,J.PopReal[state]],0]; h: REAL _ MAX[MIN[1,J.PopReal[state]],0]; index: INTEGER _ J.PopInt[state]; index _ MAX[MIN[maxIndex,index],0]; [] _ ColorMap.SetHSVColor[index,h,s,v]; }; GetMapValue: PROC [state: JaM.State] = { index: INTEGER _ J.PopInt[state]; r,g,b: REAL; [r,g,b] _ ColorMap.GetColor[MAX[MIN[maxIndex,index],0]]; J.PushReal[state,r/255.0]; J.PushReal[state,g/255.0]; J.PushReal[state,b/255.0]; }; SetDisplayAtom: PROC [state: JaM.State] = { bits: INT _ JaM.PopInt[state]; atom: ATOM _ JaM.RopeToAtom[JaM.PopRope[state]]; type: ImagerBridgeExtras.DisplayAtom _ SELECT bits FROM 1 => lf, 2 => bits2, 4 => bits4, 8 => bits8, 24 => bits24, ENDCASE => ERROR; ImagerBridgeExtras.SetDisplayAtom[type, atom]; }; a value of 0 is an infinite density. need infinity and zero values to keep values in bounds Initialization starts here J.Register[state, ".displayatom", SetDisplayAtom]; J.Register[state,".rainbow",Rainbow]; J.Register[state,".graymap",GrayMap]; J.Register[state,".standardmap",StandardMap]; J.Register[state,".setgamma",SetGamma]; J.Register[state,".getgamma",GetGamma]; J.Register[state,".setrgbmap",SetRGBColorMap]; J.Register[state,".sethsvmap", SetHSVColorMap]; J.Register[state,".getmapvalue", GetMapValue]; J.Register[state,".getcolor", GetColor]; Κ J˜codešœ™Kšœ Οmœ7™BKšœ;™;K™*—K˜šΟk ˜ Kšœ ˜ Kšœžœ˜&K˜Kšœžœ˜'K˜ KšœžœN˜WKšœ žœ@˜NKšœžœ1˜DK˜—šΠln œž ˜KšžœG˜NKšžœ˜Kšžœžœžœ˜K˜Kšœ žœ˜šΟn œžœ˜(Kšœžœžœ˜!šžœž˜K˜&K˜2K˜2K˜2K˜2K˜4Kšžœ˜—˜K˜K˜——š œžœžœžœ˜)KšœE˜Ešœ˜š žœžœ žœžœžœ˜Kš  œž œ/™FKš œžœ)žœ™JKš œžœžœ'™MK™š œžœ™+Kš œžœžœžœžœ™)Kš œžœžœžœžœ™)Kš œžœžœžœžœ™)Kšœžœžœ™!Kšœžœžœ™#K™'K™K™—š œžœ™+Kš œžœžœžœžœ™)Kš œžœžœžœžœ™)Kš œžœžœžœžœ™)Kšœžœžœ™!Kšœžœžœ™#K™'K™K™—š  œžœ™(Kšœžœžœ™!Kšœžœ™ Kšœžœžœ™8Kšžœ™Kšžœ™Kšžœ™K™K˜—š œžœžœžœ˜PK˜šžœžœž˜Kšœžœžœ˜,Kšœ žœ˜*Kšžœžœ˜&—K˜K˜—Kš œžœJ˜SKš œžœL˜WKš œžœK˜UKš œžœN˜[Kš œžœK˜UKš œžœM˜YKš œžœL˜WKš œžœL˜WKš œžœH˜RK˜š  œžœžœ-˜EKšžœžœžœžœ˜Kšžœžœžœ˜K˜—K˜š œžœ˜#Kšœžœžœ˜Kšœžœžœ ˜Kšœ1˜1K˜K˜—š œžœ˜%Kš œžœžœžœžœ˜)Kš œžœžœžœžœ˜)Kš œžœžœžœžœ˜)Kšœ8˜8K˜K˜—š œžœ˜%Kš œžœžœžœžœ˜)Kš œžœžœžœžœ˜)Kš œžœžœžœžœ˜)Kšœžœ%˜9Kšœ4˜4K˜K˜—š œžœ˜%Kš œžœžœžœžœ˜)Kš œžœžœžœžœ˜)Kš œžœžœžœžœ˜)Kšœžœ%˜9Kšœ4˜4K˜K˜—š  œžœ˜)Kšœ3˜3Kšœžœ˜ Kšœ žœ˜Kšœ6˜6Kšœ8˜8Kšœ7˜7Kšœ0˜0K˜K˜K˜K˜—š  œžœ˜)Kšœžœ˜ Kšœ3˜3Kšœ žœ˜Kšœ6˜6Kšœ8˜8Kšœ7˜7Kšœ0˜0Kšžœ˜Kšžœ˜Kšžœ˜K˜K˜—š  œžœ˜)Kšœ3˜3Kšœžœ˜ Kšœ6˜6Kšœ8˜8Kšœ7˜7K˜K˜K˜K˜—K˜š  œžœ˜(KšœL˜L—š  œžœ˜(KšœL˜L—K˜š œžœ™+Kšœžœ™Kšœžœ&™0šœ'žœžœ™8Kšœ;žœžœ™L—Kšœ.™.K™K™K™—Kšœžœ ˜Kšœžœ ˜Kšœžœ˜Kšœžœ ˜Kšœžœ˜Kšœžœ ˜K˜K˜š  œžœ˜'Kšœžœ˜Kšœžœ˜Kšœžœ˜K™\Kš œžœžœ žœžœ"˜HKš œžœžœ žœžœ"˜HKš œžœžœ žœžœ"˜HKšœžœ˜K˜&K˜(K˜&KšœL˜LKšœL˜LKšœL˜LK˜—K˜š   œžœžœžœžœ˜+Kšžœžœžœ ˜K˜K˜—š  œžœžœžœžœ˜(Kšžœžœ˜(Kšžœžœ˜,Kšžœ˜ K˜K˜—K˜Kšœ™K˜šœž œ˜0Kšžœ1™2Kšžœ,˜-Kšžœ.˜/Kšžœ"˜#Kšžœ$™%Kšžœ$™%Kšžœ,™-Kšžœ&™'Kšžœ&™'Kšžœ-™.Kšžœ.™/Kšžœ-™.Kšžœ˜Kšžœ!˜"Kšžœ˜ Kšžœ%˜&Kšžœ˜ Kšžœ#˜$Kšžœ!˜"Kšžœ!˜"Kšžœ˜ Kšžœ#˜$Kšžœ'˜(Kšžœ'˜(Kšžœ'˜(Kšžœ/˜0Kšžœ/˜0Kšžœ/˜0Kšžœ+˜,Kšžœ-˜.Kšžœ-˜.Kšžœ'™(K˜K˜K˜—K˜K˜K˜K˜——…—j/0