<> <> <> <> <> <> 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; }; <> <> <> <> <> <maxIndex DO >> <> <> <> <<}; >> <<>> <> <> <> <> <<>> <> <> <> <> <> <> <<[] _ ColorMap.SetRGBColor[index,r,g,b];>> <<};>> <<>> <> <> <> <> <> <> <<[] _ ColorMap.SetHSVColor[index,h,s,v];>> <<};>> <<>> <> <> <> <<[r,g,b] _ ColorMap.GetColor[MAX[MIN[maxIndex,index],0]];>> <> <> <> <<};>> 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]]}; InvertedColor: PROC [state: JaM.State] = { PushColor[state, ImagerColor.ColorFromAtom[$Invert]] }; 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]}; <> <> <> <> <<1 => lf, 2 => bits2, 4 => bits4, 8 => bits8, 24 => bits24, ENDCASE => ERROR;>> <> <<};>> <<>> <<>> 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,".invertedcolor", InvertedColor]; 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]; <> }; }.