UNPKG

color-model

Version:

Operate colors in popular color models and convert between them

155 lines (134 loc) 3.6 kB
module.exports = (function() { return Rgb; })(); var _r = require('./component'); eval('var Component = _r'); var _r = require('./xyz'); eval('var Xyz = _r'); var _r = require('./hsl'); eval('var Hsl = _r'); /** * Rgb color model * @extends AbstractModel * @param {Number} r * @param {Number} g * @param {Number} b */ function Rgb(r, g, b) { this._name = 'rgb'; this._components = ['red', 'green', 'blue']; this._red = new Component('red', 0, 255); this._red.set(r); this._green = new Component('green', 0, 255); this._green.set(g); this._blue = new Component('blue', 0, 255); this._blue.set(b); }; require('util').inherits(Rgb, require('./abstract-model')); 'code' ? 'completion' : Rgb.prototype = new AbstractModel; /** * @param {Number} value * @returns {Rgb} */ Rgb.prototype.red = function (value) { return this._component('red', arguments); }; /** * @param {Number} value * @returns {Rgb} */ Rgb.prototype.green = function (value) { return this._component('green', arguments); }; /** * @param {Number} value * @returns {Rgb} */ Rgb.prototype.blue = function (value) { return this._component('blue', arguments); }; /** * @returns {HexRgb} */ Rgb.prototype.toHex = function () { var HexRgb = require('./hex-rgb'); return new HexRgb() .red (this._red .get()) .green(this._green.get()) .blue (this._blue .get()); }; /** * @returns {String} */ Rgb.prototype.toHexString = function () { return this.toHex().toString(); }; /** * @param {Number} value * @returns {Number} */ Rgb.prototype._preparePreXyzValue = function(value) { value = value / 255; if (value > 0.04045) { value = (value + 0.055) / 1.055; value = Math.pow(value, 2.4); } else { value = value / 12.92; } return value * 100; }; /** * @returns {Xyz} */ Rgb.prototype.toXyz = function () { var r = this._preparePreXyzValue(this._red .get()), g = this._preparePreXyzValue(this._green.get()), b = this._preparePreXyzValue(this._blue .get()); return new Xyz( this._finalizeXyzValue(r * 0.4124 + g * 0.3576 + b * 0.1805), this._finalizeXyzValue(r * 0.2126 + g * 0.7152 + b * 0.0722), this._finalizeXyzValue(r * 0.0193 + g * 0.1192 + b * 0.9505) ); }; /** * @param {Number} preXyzValue * @returns {Number} */ Rgb.prototype._finalizeXyzValue = function (preXyzValue) { return Math.round(preXyzValue * 10000) / 10000; }; /** * @returns {Hsl} */ Rgb.prototype.toHsl = function () { var r = this._red .get() / 255, g = this._green.get() / 255, b = this._blue .get() / 255, min = Math.min(r, g, b), max = Math.max(r, g, b), delta = max - min, lightness = (min + max) / 2; lightness = Math.round(lightness * 100) / 100; if (delta == 0) { return new Hsl(0, 0, lightness); } var saturation = 0; if (lightness < 0.5) { saturation = delta / (max + min); } else { saturation = delta / (2 - max - min); } saturation = Math.round(saturation * 100) / 100; var hue = 0, deltaR = (((max - r) / 6 ) + (delta / 2)) / delta, deltaG = (((max - g) / 6 ) + (delta / 2)) / delta, deltaB = (((max - b) / 6 ) + (delta / 2)) / delta; if (r == max) { hue = deltaB - deltaG; } else if (g == max) { hue = ( 1 / 3 ) + deltaR - deltaB; } else { hue = ( 2 / 3 ) + deltaG - deltaR; } if (hue < 0) { ++hue; } else if (hue > 1) { --hue; } hue = (hue * 360.99999999999997) >> 0; if (360 == hue) { hue = 0; } return new Hsl(hue, saturation, lightness); };