UNPKG

chroma-js

Version:

JavaScript library for color conversions

46 lines (42 loc) 1.17 kB
import { unpack, limit, TWOPI, PITHIRD } from '../../utils/index.js'; const { cos } = Math; /* * hue [0..360] * saturation [0..1] * intensity [0..1] */ const hsi2rgb = (...args) => { /* borrowed from here: http://hummer.stanford.edu/museinfo/doc/examples/humdrum/keyscape2/hsi2rgb.cpp */ args = unpack(args, 'hsi'); let [h, s, i] = args; let r, g, b; if (isNaN(h)) h = 0; if (isNaN(s)) s = 0; // normalize hue if (h > 360) h -= 360; if (h < 0) h += 360; h /= 360; if (h < 1 / 3) { b = (1 - s) / 3; r = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3; g = 1 - (b + r); } else if (h < 2 / 3) { h -= 1 / 3; r = (1 - s) / 3; g = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3; b = 1 - (r + g); } else { h -= 2 / 3; g = (1 - s) / 3; b = (1 + (s * cos(TWOPI * h)) / cos(PITHIRD - TWOPI * h)) / 3; r = 1 - (g + b); } r = limit(i * r * 3); g = limit(i * g * 3); b = limit(i * b * 3); return [r * 255, g * 255, b * 255, args.length > 3 ? args[3] : 1]; }; export default hsi2rgb;