<> <> <> <> DIRECTORY CDIO, CDMenus, CDSequencer, Commander USING [CommandProc, Register], Convert, FS, IO, Rope, Terminal, TerminalIO, UserProfile; ChipmonkColorMap: CEDAR PROGRAM IMPORTS CDMenus, CDIO, CDSequencer, Commander, Convert, FS, IO, Rope, Terminal, TerminalIO, UserProfile = BEGIN colorTabsNum: CARDINAL = 40; ColorTabs: TYPE = ARRAY [0..colorTabsNum) OF ARRAY [0..49) OF CARDINAL; cTabCnt: CARDINAL _ 0; colorTabs: REF ColorTabs = NEW[ColorTabs]; ColorMode4: PROC [] RETURNS [BOOL] = INLINE BEGIN virtual: Terminal.Virtual = Terminal.Current[]; RETURN [virtual.hasColorDisplay AND ~virtual.GetColorMode[].full AND virtual.GetColorMode[].bitsPerPixelChannelA=4]; END; SetCMColorMap: PROC [val: INT_-1, file: Rope.ROPE_NIL] = <<-- val<0 : read it>> <<-- val>=0 : use it >> BEGIN SetCMColorMapEntry: PROC [i: INT] = BEGIN Range: PROC [c: CARDINAL] RETURNS [CARDINAL] = BEGIN RETURN [ 255-MIN[c, 255] ] END; virtual: Terminal.Virtual = Terminal.Current[]; IF ~ColorMode4[] THEN RETURN; IF i=0 THEN {TerminalIO.WriteRope["Don't use this command to reset default\n"]; RETURN}; IF i>0 AND i<=cTabCnt THEN { <> i _ i-1; FOR j: CARDINAL IN [0..16) DO <> <> <> <> Terminal.SetColor[vt: virtual, aChannelValue: j, bChannelValue: 0, red: Range[colorTabs[i][1+j*3]], green: Range[colorTabs[i][2+j*3]], blue: Range[colorTabs[i][3+j*3]] ]; ENDLOOP; <> } ELSE TerminalIO.WriteRope["**color map number out of range\n"]; END; <<>> <<--SetCMColorMap>> 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[base: fileName, ext: "CDColorMaps", wDir: CDIO.GetWorkingDirectory[NIL]]; 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 Terminal.LegalColorMode[virtual, [FALSE, 4, 0]] THEN colorMapNum _ UserProfile.Number[key: "ChipNDale.ChipmonkColorMapNum", default: -1]; IF colorMapNum>0 THEN SetCMColorMap[colorMapNum]; END; ReadColorMapComm: CDSequencer.CommandProc = {SetCMColorMap[]}; ResetColorMapFromProfileComm: CDSequencer.CommandProc = {InitFromProfile[]}; <<>> <<-- Module initialization>> virtual: Terminal.Virtual = Terminal.Current[]; IF Terminal.LegalColorMode[virtual, [FALSE, 4, 0]] THEN { InitFromProfile[]; Commander.Register[ key: "///Commands/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.