UNPKG

isomer

Version:

A simple isometric graphics library for HTML5 canvas

125 lines (101 loc) 2.68 kB
/** * A color instantiated with RGB between 0-255 * * Also holds HSL values */ function Color(r, g, b, a) { this.r = parseInt(r || 0); this.g = parseInt(g || 0); this.b = parseInt(b || 0); this.a = parseFloat((Math.round(a * 100) / 100 || 1)); this.loadHSL(); }; Color.prototype.toHex = function() { // Pad with 0s var hex = (this.r * 256 * 256 + this.g * 256 + this.b).toString(16); if (hex.length < 6) { hex = new Array(6 - hex.length + 1).join('0') + hex; } return '#' + hex; }; /** * Returns a lightened color based on a given percentage and an optional * light color */ Color.prototype.lighten = function(percentage, lightColor) { lightColor = lightColor || new Color(255, 255, 255); var newColor = new Color( (lightColor.r / 255) * this.r, (lightColor.g / 255) * this.g, (lightColor.b / 255) * this.b, this.a ); newColor.l = Math.min(newColor.l + percentage, 1); newColor.loadRGB(); return newColor; }; /** * Loads HSL values using the current RGB values * Converted from: * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c */ Color.prototype.loadHSL = function() { var r = this.r / 255; var g = this.g / 255; var b = this.b / 255; var max = Math.max(r, g, b); var min = Math.min(r, g, b); var h, s, l = (max + min) / 2; if (max === min) { h = s = 0; // achromatic } else { var d = max - min; s = l > 0.5 ? d / (2 - max - min) : d / (max + min); switch (max) { case r: h = (g - b) / d + (g < b ? 6 : 0); break; case g: h = (b - r) / d + 2; break; case b: h = (r - g) / d + 4; break; } h /= 6; } this.h = h; this.s = s; this.l = l; }; /** * Reloads RGB using HSL values * Converted from: * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c */ Color.prototype.loadRGB = function() { var r, g, b; var h = this.h; var s = this.s; var l = this.l; if (s === 0) { r = g = b = l; // achromatic } else { var q = l < 0.5 ? l * (1 + s) : l + s - l * s; var p = 2 * l - q; r = this._hue2rgb(p, q, h + 1 / 3); g = this._hue2rgb(p, q, h); b = this._hue2rgb(p, q, h - 1 / 3); } this.r = parseInt(r * 255); this.g = parseInt(g * 255); this.b = parseInt(b * 255); }; /** * Helper function to convert hue to rgb * Taken from: * http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c */ Color.prototype._hue2rgb = function(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1 / 6) return p + (q - p) * 6 * t; if (t < 1 / 2) return q; if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; return p; }; module.exports = Color;