DIRECTORY ImagerBridgeExtras, ImagerBasic USING [ConstantColor], RealFns USING [AlmostZero, Log, Power], JaMIPrivate, JaM USING [PopInt, PopReal, Register, PopBool, PushReal, State, RopeToAtom, PopRope, Push, Pop], ConstantColors, ColorMap, Terminal USING [Current, GetColorMode, SetColorCursorPresentation, ColorMode], WindowManager USING[StartColorViewers, StopColorViewers, ScreenPos]; JaMIColorImpl: CEDAR MONITOR IMPORTS JaM, ConstantColors, ColorMap, WindowManager, Terminal, ImagerBridgeExtras, 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; }; Rainbow: PROCEDURE [state: JaM.State] = { 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]; }; Red: PROC [state: JaM.State] = {JaM.Push[state, ConstantColors.red]}; Green: PROC [state: JaM.State] = {JaM.Push[state, ConstantColors.green]}; Blue: PROC [state: JaM.State] = {JaM.Push[state, ConstantColors.blue]}; Magenta: PROC [state: JaM.State] = {JaM.Push[state, ConstantColors.magenta]}; Cyan: PROC [state: JaM.State] = {JaM.Push[state, ConstantColors.cyan]}; Yellow: PROC [state: JaM.State] = {JaM.Push[state, ConstantColors.yellow]}; Black: PROC [state: JaM.State] = {JaM.Push[state, ConstantColors.black]}; White: PROC [state: JaM.State] = {JaM.Push[state, ConstantColors.white]}; Gray: PROC [state: JaM.State] = {JaM.Push[state, ConstantColors.IntensityToColor[.5]]}; IColor: PROC [state: JaM.State] = { gray: REAL _ J.PopReal[state]; gray _ MIN[MAX[0,gray],1]; JaM.Push[state, ConstantColors.IntensityToColor[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, ConstantColors.RGBToColor[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]; JaM.Push[state, ConstantColors.HSVToColor[h,s,v]]; }; 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]; JaM.Push[state, ConstantColors.HSLToColor[h,s,l]]; }; HSLFromColor: PROC [state: JaM.State] = { color: ImagerBasic.ConstantColor _ NARROW[JaM.Pop[state]]; h,s,l: REAL; [h,s,l] _ ConstantColors.ColorToHSL[color]; JaM.PushReal[state,h]; JaM.PushReal[state,s]; JaM.PushReal[state,l]; }; HSVFromColor: PROC [state: JaM.State] = { color: ImagerBasic.ConstantColor _ NARROW[JaM.Pop[state]]; h,s,v: REAL; [h,s,v] _ ConstantColors.ColorToHSV[color]; JaM.PushReal[state,h]; JaM.PushReal[state,s]; JaM.PushReal[state,v]; }; RGBFromColor: PROC [state: JaM.State] = { color: ImagerBasic.ConstantColor _ NARROW[JaM.Pop[state]]; r,g,b: REAL; [r,g,b] _ ConstantColors.ColorToRGB[color]; 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]}; 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]; }; 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, ".displayatom", SetDisplayAtom]; J.Register[state,".turnoncolor",TurnOnColor]; J.Register[state,".turnoffcolor",TurnOffColor]; J.Register[state,".onleft",OnLeft]; 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,".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 by Xerox Corporation. All rights reserved. last edited by Maureen Stone August 14, 1984 6:25:02 pm PDT fully saturated rainbow in the even values. grays in the odd values GetColor: PROC [state: JaM.State] = { h,s,v: REAL; color: Imager.Color; paint: TDC.GProc = { color _ Imager.GetColor[dc]}; JaMImager.Painter[paint,state]; [h,s,v] _ ConstantColors.ColorToHSV[color]; J.PushReal[state,h]; J.PushReal[state,s]; J.PushReal[state,v]; }; a value of 0 is an infinite density. need infinity and zero values to keep values in bounds Initialization starts here J.Register[state,".getcolor", GetColor]; Κ ~˜J˜Jšœ™Jšœ Οmœ1™JšŸ œž œ/˜FJšŸœžœ)žœ˜JJšŸœžœžœ'˜MJ˜šŸœžœ˜+Jš œžœžœžœžœ˜)Jš œžœžœžœžœ˜)Jš œžœžœžœžœ˜)Jšœžœžœ˜!Jšœžœžœ˜#J˜'J˜J˜—šŸœžœ˜+Jš œžœžœžœžœ˜)Jš œžœžœžœžœ˜)Jš œžœžœžœžœ˜)Jšœžœžœ˜!Jšœžœžœ˜#J˜'J˜J˜—šŸ œžœ˜(Jšœžœžœ˜!Jšœžœ˜ Jšœžœžœ˜8Jšžœ˜Jšžœ˜Jšžœ˜J˜J˜—šŸœžœ™%Jšœžœ™ J™Jšœžœ(™2J™J™+Jšžœ™Jšžœ™Jšžœ™J™J™—JšŸœžœ<˜EJšŸœžœ>˜IJšŸœžœ=˜GJšŸœžœ@˜MJšŸœžœ=˜GJšŸœžœ?˜KJšŸœžœ>˜IJšŸœžœ>˜IJšŸœžœM˜WšŸœžœ˜#Jšœžœžœ˜Jšœžœžœ ˜Jšœ7˜7J˜J˜—šŸœžœ˜%Jš œžœžœžœžœ˜)Jš œžœžœžœžœ˜)Jš œžœžœžœžœ˜)Jšœ2˜2J˜J˜—šŸœžœ˜%Jš œžœžœžœžœ˜)Jš œžœžœžœžœ˜)Jš œžœžœžœžœ˜)Jšœ2˜2J˜J˜—šŸœžœ˜%Jš œžœžœžœžœ˜)Jš œžœžœžœžœ˜)Jš œžœžœžœžœ˜)Jšœ2˜2J˜J˜—šŸ œžœ˜)Jšœ#žœ˜:Jšœžœ˜ J˜+J˜J˜J˜J˜—šŸ œžœ˜)Jšœ#žœ˜:Jšœžœ˜ J˜+J˜J˜J˜J˜—šŸ œžœ˜)Jšœ#žœ˜:Jšœžœ˜ J˜+J˜J˜J˜J˜—J˜šŸ œžœ˜(JšœL˜L—šŸ œžœ˜(JšœL˜L—J˜šŸœžœ˜+Jšœžœ˜Jšœžœ&˜0šœ'žœžœ˜8Jšœ;žœžœ˜L—Jšœ.˜.J˜J˜J˜—Jšœžœ ˜Jšœžœ ˜Jšœžœ˜Jšœžœ ˜Jšœžœ˜Jšœžœ ˜J˜J˜šŸ œžœ˜'Jšœžœ˜Jšœžœ˜Jšœžœ˜J™\Jš œžœžœ žœžœ"˜HJš œžœžœ žœžœ"˜HJš œžœžœ žœžœ"˜HJšœžœ˜J˜&J˜(J˜&JšœL˜LJšœL˜LJšœL˜LJ˜—J˜procš Ÿ œžœžœžœžœ˜+Jšžœžœžœ ˜K˜K˜—š Ÿœžœžœžœžœ˜(Kšžœžœ˜(Kšžœžœ˜,Kšžœ˜ K˜K˜—J˜Jšœ™J˜šœž œ˜0Jšžœ1˜2Jšžœ,˜-Jšžœ.˜/Jšžœ"˜#Jšžœ$˜%Jšžœ$˜%Jšžœ,˜-Jšžœ&˜'Jšžœ&˜'Jšžœ-˜.Jšžœ.˜/Jšžœ-˜.Jšžœ˜Jšžœ!˜"Jšžœ˜ Jšžœ%˜&Jšžœ˜ Jšžœ#˜$Jšžœ!˜"Jšžœ!˜"Jšžœ˜ Jšžœ#˜$Jšžœ'˜(Jšžœ'˜(Jšžœ'˜(Jšžœ/˜0Jšžœ/˜0Jšžœ/˜0Jšžœ+˜,Jšžœ-˜.Jšžœ-˜.Jšžœ'™(J˜J˜J˜—J˜J˜J˜J˜—…—+