DIRECTORY CDIO, CDMenus, CDSequencer, ColorMap, ColorWorld, Commander USING [CommandProc, Register], Convert, FS, IO, Rope, Terminal, TerminalIO, UserProfile, WindowManager; ChipmonkColorMap: CEDAR PROGRAM IMPORTS CDMenus, CDIO, CDSequencer, ColorMap, ColorWorld, Commander, Convert, FS, IO, Rope, Terminal, TerminalIO, UserProfile, WindowManager = BEGIN colorTabsNum: CARDINAL = 40; ColorTabs: TYPE = ARRAY [0..colorTabsNum) OF ARRAY [0..49) OF CARDINAL; cTabCnt: CARDINAL _ 0; colorTabs: REF ColorTabs = NEW[ColorTabs]; SetTerminalMode: PROC [] = BEGIN virtual: Terminal.Virtual = Terminal.Current[]; m: Terminal.ColorMode = Terminal.GetColorMode[virtual]; IF WindowManager.colorDisplayOn AND m.full OR m.bitsPerPixelChannelA#4 THEN WindowManager.StopColorViewers[]; IF ~WindowManager.colorDisplayOn THEN WindowManager.StartColorViewers[ screenPos: IF UserProfile.Boolean[key: "Chipndale.ColorStartLeft", default: TRUE] THEN left ELSE right, bitsPerPixel: 4 ]; [] _ Terminal.SetColorCursorPresentation[virtual, onesAreWhite]; END; SetCMColorMapEntry: PROC [i: INT] = BEGIN IF i=0 THEN {TerminalIO.WriteRope["Don't use this command to reset default\n"]; RETURN}; SetTerminalMode[]; IF i>0 AND i<=cTabCnt THEN { ColorMap.SetGamma[1.0]; i _ i-1; FOR j: CARDINAL IN [0..16) DO r: REAL = MAX[0, MIN[1, 1.0/255*(255-colorTabs[i][1+j*3])]]; g: REAL = MAX[0, MIN[1, 1.0/255*(255-colorTabs[i][2+j*3])]]; b: REAL = MAX[0, MIN[1, 1.0/255*(255-colorTabs[i][3+j*3])]]; ColorMap.SetRGBColor[index: j, r:r, g:g, b:b]; ENDLOOP; ColorMap.SetGamma[2.2]; } ELSE TerminalIO.WriteRope["**color map number out of range\n"]; END; SetCMColorMap: PROC [val: INT_-1, file: Rope.ROPE_NIL] = BEGIN pos: WindowManager.ScreenPos = IF UserProfile.Boolean[key: "Chipndale.ColorStartLeft", default: TRUE] THEN left ELSE right; IF cTabCnt=0 THEN ReadColorMapFile[file]; IF cTabCnt=0 THEN {TerminalIO.WriteRope["no color map table read\n"]; RETURN}; IF val<0 THEN { TerminalIO.WriteRope["color map ( <="]; TerminalIO.WriteInt[cTabCnt]; TerminalIO.WriteRope["; often used: cmos: 2; nmos: 1)"]; TerminalIO.WriteRope[") > "]; val _ TerminalIO.RequestInt["" ! TerminalIO.UserAbort => GOTO UserAbort]; }; SetCMColorMapEntry[val] EXITS UserAbort => {NULL}; END; ReadColorMapFile: PROC [fileName: Rope.ROPE_NIL] = BEGIN binfile: IO.STREAM; k, i: CARDINAL; GetByte: PROC [] RETURNS[c: [0..255]] = INLINE { c _ LOOPHOLE[IO.GetChar[binfile], [0..255]]; }; Get2Bytes: PROC [] RETURNS [c: CARDINAL] = INLINE { h: [0..255] = GetByte[]; c _ h*256+GetByte[]; }; IF Rope.IsEmpty[fileName] THEN fileName_UserProfile.Token[ key: "Chipndale.ChipmonkColorMaps", default: "default.CDColorMaps" ]; fileName _ CDIO.MakeName[fileName, "CDColorMaps"]; binfile _ FS.StreamOpen[fileName ! FS.Error => IF error.group # bug THEN { TerminalIO.WriteRope[fileName]; TerminalIO.WriteRope[" not opened: "]; TerminalIO.WriteRope[error.explanation]; TerminalIO.WriteLn[]; GOTO FileName }]; cTabCnt _ 0; k _ MIN[Get2Bytes[], colorTabsNum]; FOR k IN [0..k) DO FOR i IN [0..49) DO colorTabs[k][i] _ Get2Bytes[]; ENDLOOP; ENDLOOP; IO.Close[binfile]; cTabCnt _ k EXITS FileName => {NULL}; END; ColorMapCommand: Commander.CommandProc = BEGIN mapNum: INT _ -1; mapFile: Rope.ROPE _ NIL; s: IO.STREAM ~ IO.RIS[cmd.commandLine]; DO token: Rope.ROPE _ IO.GetTokenRope[s ! IO.EndOfStream => EXIT].token; IF Rope.IsEmpty[token] THEN EXIT; IF Rope.Fetch[token, 0] IN ['0..'9] THEN { mapNum _ Convert.IntFromRope[token ! Convert.Error => EXIT]; } ELSE mapFile _ CDIO.MakeName[token, "CDColorMaps"]; ENDLOOP; SetCMColorMap[mapNum, mapFile] END; InitFromProfile: PROC [] = BEGIN colorMapNum: INT _ -1; IF ColorWorld.HasMode[4] THEN colorMapNum _ UserProfile.Number[key: "Chipndale.ChipmonkColorMapNum", default: -1]; IF colorMapNum>0 THEN SetCMColorMap[colorMapNum]; END; ReadColorMapComm: CDSequencer.CommandProc = {SetCMColorMap[]}; ResetColorMapFromProfileComm: CDSequencer.CommandProc = {InitFromProfile[]}; IF ColorWorld.HasMode[4] THEN { InitFromProfile[]; Commander.Register[ key: "CDColorMap", proc: ColorMapCommand, doc: "read colormap from chipmonk file" ]; CDSequencer.ImplementCommand[$SetCMColorMap, ReadColorMapComm,, doQueue]; CDSequencer.ImplementCommand[$InitColorMapFromProfile, ResetColorMapFromProfileComm,, doQueue]; CDMenus.CreateEntry[$DisplayMenu, "type cm map", $SetCMColorMap]; CDMenus.CreateEntry[$DisplayMenu, "profile cm map", $InitColorMapFromProfile]; }; END.  ChipmonkColorMap.mesa Copyright c 1983, 1984 by Xerox Corporation. All rights reserved. by Ch. Jacobi October 28, 1983 4:21 pm last edited by Christian Jacobi October 24, 1984 10:43:38 am PDT -- val<0 : read it -- val>=0 : use it -- Module initialization Κ7˜šœ™Jšœ Οmœ7™BJšœ&™&JšœB™B—J˜šΟk ˜ Jšœ˜Jšœ˜Jšœ ˜ Jšœ ˜ Jšœ ˜ Jšœ žœ˜(Jšœ ˜ Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ Jšœ ˜ Jšœ ˜ Jšœ˜—J˜šΟbœžœž˜Jšžœ‡˜Ž—Jšž˜J˜Jšœžœ˜Jš œ žœžœžœžœ žœžœ˜GJ˜Jšœ žœ˜Jšœ žœ žœ ˜*J˜šΟnœžœ˜Jšž˜Jšœ/˜/Jšœ7˜7šžœžœžœžœ˜LJšœ!˜!—šžœžœ˜&šœ ˜ Jš œ žœ?žœžœžœ˜hJšœ˜Jšœ˜——Jšœ@˜@Jšžœ˜—J˜š œžœžœ˜#Jšž˜IcodešžœžœEžœ˜XKšœ˜šžœžœ žœ˜Kšœ˜Kšœ˜šžœžœžœ ž˜Kšœžœžœžœ(˜JšŸœ0˜LJ™Jšœ™šžœžœ˜Jšœ˜šœ˜J˜Jšœ˜˜'Jšœ˜——JšœI˜IJšœ_˜_JšœA˜AJšœN˜NJ˜—Jšžœ˜—…—V™