var Color = { white: [255,255,255], black: [0,0,0], blue: [84,110,255], green: [120,255,10], yellow: [251,255,43], red: [255,36,20], teal: [96, 252, 237], gray: [181,181,181], cyan: [0,255,255], purple: [162,93,227], }; Color.editor = {}; Color.editor.ur = Color.green; Color.tohtml = function(v) { var html = v.map(function(n) { return Number.hex(n*255); }); return "#" + html.join(''); } var esc = {}; esc.reset = "\x1b[0"; esc.color = function(v) { var c = v.map(function(n) { return Math.floor(n*255); }); var truecolor = "\x1b[38;2;" + c.join(';') + ';'; return truecolor; } esc.doc = "Functions and constants for ANSI escape sequences."; Color.Arkanoid = { orange: [255,143,0], teal: [0,255,255], green: [0,255,0], red: [255,0,0], blue: [0,112,255], purple: [255,0,255], yellow: [255,255,0], silver: [157,157,157], gold: [188,174,0], }; Color.Arkanoid.Powerups = { red: [174,0,0], /* laser */ blue: [0,0,174], /* enlarge */ green: [0,174,0], /* catch */ orange: [224,143,0], /* slow */ purple: [210,0,210], /* break */ cyan: [0,174,255], /* disruption */ gray: [143,143,143] /* 1up */ }; Color.Gameboy = { darkest: [229,107,26], dark: [229,189,26], light: [189,229,26], lightest: [107,229,26], }; Color.Apple = { green: [94,189,62], yellow: [255,185,0], orange: [247,130,0], red: [226,56,56], purple: [151,57,153], blue: [0,156,223] }; Color.Debug = { boundingbox: Color.white, names: [84,110,255], }; Color.Editor = { grid: [99,255,128], select: [255,255,55], newgroup: [120,255,10], }; /* Detects the format of all colors and munges them into a floating point format */ Color.normalize = function(c) { var add_a = function(a) { var n = this.slice(); n.a = a; return n; }; for (var p of Object.keys(c)) { var fmt = "nrm"; if (typeof c[p] !== 'object') continue; if (!Array.isArray(c[p])) { Color.normalize(c[p]); continue; } c[p][3] = 255; for (var color of c[p]) { if (color > 1) { fmt = "8b"; break; } } switch(fmt) { case "8b": c[p] = c[p].map(function(x) { return x/255; }); } c[p].alpha = add_a; } }; Color.normalize(Color); Object.deepfreeze(Color); var ColorMap = {}; ColorMap.makemap = function(map) { var newmap = Object.create(ColorMap); Object.assign(newmap, map); return newmap; } ColorMap.Jet = ColorMap.makemap({ 0: [0,0,131], 0.125: [0,60,170], 0.375: [5,255,255], 0.625: [255,255,0], 0.875: [250,0,0], 1: [128,0,0] }); ColorMap.BlueRed = ColorMap.makemap({ 0: [0,0,255], 1: [255,0,0] }); ColorMap.Inferno = ColorMap.makemap({ 0:[0,0,4], 0.13: [31,12,72], 0.25: [85,15,109], 0.38: [136,34,106], 0.5: [186,54,85], 0.63: [227,89,51], 0.75: [249,140,10], 0.88: [249,201,50], 1: [252,255,164] }); ColorMap.Bathymetry = ColorMap.makemap({ 0: [40,26,44], 0.13: [59.49,90], 0.25: [64,76,139], 0.38: [63,110,151], 0.5: [72,142,158], 0.63: [85,174,163], 0.75: [120,206,163], 0.88: [187,230,172], 1: [253,254,204] }); ColorMap.Viridis = ColorMap.makemap({ 0: [68,1,84], 0.13: [71,44,122], 0.25: [59,81,139], 0.38: [44,113,142], 0.5: [33,144,141], 0.63: [39,173,129], 0.75: [92,200,99], 0.88: [170,220,50], 1: [253,231,37] }); Color.normalize(ColorMap); ColorMap.sample = function(t, map = this) { if (t < 0) return map[0]; if (t > 1) return map[1]; var lastkey = 0; for (var key of Object.keys(map).sort()) { if (t < key) { var b = map[key]; var a = map[lastkey]; var tt = (key - lastkey) * t; return a.lerp(b, tt); } lastkey = key; } return map[1]; } ColorMap.doc = { sample: "Sample a given colormap at the given percentage (0 to 1).", }; Object.freeze(ColorMap); return { Color, esc, ColorMap }