MIDI.js/js/Color.js

154 lines
3.1 KiB
JavaScript

/*
Color.Space : 0.3 : mudcu.be
-----------------------------
STRING <-> HEX <-> RGB <-> HSL
-----------------------------
var HEX = 0xFF0000;
var HSL = Color.Space(HEX, "HEX>RGB>HSL");
*/
if (!window.Color) Color = {};
if (!window.Color.Space) Color.Space = {};
(function () {
var DEG_RAD = Math.PI / 180;
var RAD_DEG = 1 / DEG_RAD;
var shortcuts = { };
var root = Color.Space = function(color, route) {
if (shortcuts[route]) {
route = shortcuts[route];
}
var arr = route.split(">");
var key = "";
for (var n = 0; n < arr.length; n ++) {
if (n > 1) {
key = key.split("_");
key.shift();
key = key.join("_");
}
key += (n == 0 ? "" : "_") + arr[n];
if (n > 0) color = root[key](color);
}
return color;
};
// STRING = 'FFFFFF' | 'FFFFFFFF'
root.STRING_HEX = function (o) {
return parseInt('0x' + o);
};
// HEX = 0x000000 -> 0xFFFFFF
root.HEX_STRING = function (o, maxLength) {
if (!maxLength) maxLength = 6;
if (!o) o = 0;
var z = o.toString(16);
// when string is lesser than maxLength
var n = z.length;
while (n < maxLength) {
z = '0' + z;
n++;
}
// when string is greater than maxLength
var n = z.length;
while (n > maxLength) {
z = z.substr(1);
n--;
}
return z;
};
root.HEX_RGB = function (o) {
return {
R: (o >> 16),
G: (o >> 8) & 0xFF,
B: o & 0xFF
};
};
// RGB = R: Red / G: Green / B: Blue
root.RGB_HEX = function (o) {
if (o.R < 0) o.R = 0;
if (o.G < 0) o.G = 0;
if (o.B < 0) o.B = 0;
if (o.R > 255) o.R = 255;
if (o.G > 255) o.G = 255;
if (o.B > 255) o.B = 255;
return o.R << 16 | o.G << 8 | o.B;
};
root.RGB_HSL = function (o) { // RGB from 0 to 1
// http://www.easyrgb.com/index.php?X=MATH&H=18#text18
var _R = o.R / 255,
_G = o.G / 255,
_B = o.B / 255,
min = Math.min(_R, _G, _B),
max = Math.max(_R, _G, _B),
D = max - min,
H,
S,
L = (max + min) / 2;
if (D == 0) { // No chroma
H = 0;
S = 0;
} else { // Chromatic data
if (L < 0.5) S = D / (max + min);
else S = D / (2 - max - min);
var DR = (((max - _R) / 6) + (D / 2)) / D;
var DG = (((max - _G) / 6) + (D / 2)) / D;
var DB = (((max - _B) / 6) + (D / 2)) / D;
if (_R == max) H = DB - DG;
else if (_G == max) H = (1 / 3) + DR - DB;
else if (_B == max) H = (2 / 3) + DG - DR;
if (H < 0) H += 1;
if (H > 1) H -= 1;
}
return {
H: H * 360,
S: S * 100,
L: L * 100
};
};
// HSL (1978) = H: Hue / S: Saturation / L: Lightess
root.HSL_RGB = function (o) {
// http://www.easyrgb.com/index.php?X=MATH&H=19
var H = o.H / 360,
S = o.S / 100,
L = o.L / 100,
R, G, B, _1, _2;
function Hue_2_RGB(v1, v2, vH) {
if (vH < 0) vH += 1;
if (vH > 1) vH -= 1;
if ((6 * vH) < 1) return v1 + (v2 - v1) * 6 * vH;
if ((2 * vH) < 1) return v2;
if ((3 * vH) < 2) return v1 + (v2 - v1) * ((2 / 3) - vH) * 6;
return v1;
}
if (S == 0) { // HSL from 0 to 1
R = L * 255;
G = L * 255;
B = L * 255;
} else {
if (L < 0.5) _2 = L * (1 + S);
else _2 = (L + S) - (S * L);
_1 = 2 * L - _2;
R = 255 * Hue_2_RGB(_1, _2, H + (1 / 3));
G = 255 * Hue_2_RGB(_1, _2, H);
B = 255 * Hue_2_RGB(_1, _2, H - (1 / 3));
}
return {
R: R,
G: G,
B: B
};
};
})();