annotate src/app/spectrogram/ColourMap.ts @ 343:8bfd9586c78a

Move some functions out of waveform and into appropriately named modules.
author Lucas Thompson <dev@lucas.im>
date Tue, 23 May 2017 10:41:36 +0100
parents
children
rev   line source
dev@343 1 /**
dev@343 2 * Created by lucast on 23/05/2017.
dev@343 3 */
dev@343 4
dev@343 5 export function interpolatingMapper(hexColours) {
dev@343 6 const colours = hexColours.map(n => {
dev@343 7 const i = parseInt(n, 16);
dev@343 8 return [ ((i >> 16) & 255) / 255.0,
dev@343 9 ((i >> 8) & 255) / 255.0,
dev@343 10 ((i) & 255) / 255.0 ];
dev@343 11 });
dev@343 12 const last = colours.length - 1;
dev@343 13 return (value => {
dev@343 14 const m = value * last;
dev@343 15 if (m >= last) {
dev@343 16 return colours[last];
dev@343 17 }
dev@343 18 if (m <= 0) {
dev@343 19 return colours[0];
dev@343 20 }
dev@343 21 const base = Math.floor(m);
dev@343 22 const prop0 = base + 1.0 - m;
dev@343 23 const prop1 = m - base;
dev@343 24 const c0 = colours[base];
dev@343 25 const c1 = colours[base + 1];
dev@343 26 return [ c0[0] * prop0 + c1[0] * prop1,
dev@343 27 c0[1] * prop0 + c1[1] * prop1,
dev@343 28 c0[2] * prop0 + c1[2] * prop1 ];
dev@343 29 });
dev@343 30 }
dev@343 31
dev@343 32 export function iceMapper() {
dev@343 33 const hexColours = [
dev@343 34 // Based on ColorBrewer ylGnBu
dev@343 35 'ffffff', 'ffff00', 'f7fcf0', 'e0f3db', 'ccebc5', 'a8ddb5',
dev@343 36 '7bccc4', '4eb3d3', '2b8cbe', '0868ac', '084081', '042040'
dev@343 37 ];
dev@343 38 hexColours.reverse();
dev@343 39 return interpolatingMapper(hexColours);
dev@343 40 }
dev@343 41
dev@343 42 export function greenMapper() {
dev@343 43 const blue = 0.6666;
dev@343 44 const pieslice = 0.3333;
dev@343 45 return (value => {
dev@343 46 const h = blue - value * 2.0 * pieslice;
dev@343 47 const s = 0.5 + value / 2.0;
dev@343 48 const v = value;
dev@343 49 return this.hsv2rgb(h, s, v);
dev@343 50 });
dev@343 51 }
dev@343 52
dev@343 53 export function sunsetMapper() {
dev@343 54 return (value => {
dev@343 55 const r = (value - 0.24) * 2.38;
dev@343 56 const g = (value - 0.64) * 2.777;
dev@343 57 let b = (3.6 * value);
dev@343 58 if (value > 0.277) {
dev@343 59 b = 2.0 - b;
dev@343 60 }
dev@343 61 return [ r, g, b ];
dev@343 62 });
dev@343 63 }
dev@343 64
dev@343 65 export function hsv2rgb(h, s, v) { // all values in range [0, 1]
dev@343 66 const i = Math.floor(h * 6);
dev@343 67 const f = h * 6 - i;
dev@343 68 const p = v * (1 - s);
dev@343 69 const q = v * (1 - f * s);
dev@343 70 const t = v * (1 - (1 - f) * s);
dev@343 71 let r = 0, g = 0, b = 0;
dev@343 72 switch (i % 6) {
dev@343 73 case 0: r = v; g = t; b = p; break;
dev@343 74 case 1: r = q; g = v; b = p; break;
dev@343 75 case 2: r = p; g = v; b = t; break;
dev@343 76 case 3: r = p; g = q; b = v; break;
dev@343 77 case 4: r = t; g = p; b = v; break;
dev@343 78 case 5: r = v; g = p; b = q; break;
dev@343 79 }
dev@343 80 return [ r, g, b ];
dev@343 81 }