scratch-html5/js/util/Color.js
2013-10-28 20:00:20 +00:00

89 lines
2.9 KiB
JavaScript

// Copyright (C) 2013 Massachusetts Institute of Technology
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 2,
// as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
// Scratch HTML5 Player
// Color.js
// Based on the original by John Maloney
Color = function() {};
Color.fromHSV = function(h, s, v) {
var r, g, b;
h = h % 360;
if (h < 0) h += 360;
s = Math.max(0, Math.min(s, 1));
v = Math.max(0, Math.min(v, 1));
var i = Math.floor(h / 60);
var f = (h / 60) - i;
var p = v * (1 - s);
var q = v * (1 - (s * f));
var t = v * (1 - (s * (1 - f)));
if (i == 0) { r = v; g = t; b = p; }
else if (i == 1) { r = q; g = v; b = p; }
else if (i == 2) { r = p; g = v; b = t; }
else if (i == 3) { r = p; g = q; b = v; }
else if (i == 4) { r = t; g = p; b = v; }
else if (i == 5) { r = v; g = p; b = q; }
r = Math.floor(r * 255);
g = Math.floor(g * 255);
b = Math.floor(b * 255);
return (r << 16) | (g << 8) | b;
}
Color.rgb2hsv = function(rgb) {
var h, s, v, x, f, i;
var r = ((rgb >> 16) & 255) / 255;
var g = ((rgb >> 8) & 255) / 255;
var b = (rgb & 255) / 255;
x = Math.min(Math.min(r, g), b);
v = Math.max(Math.max(r, g), b);
if (x == v) return [0, 0, v]; // gray; hue arbitrarily reported as zero
f = (r == x) ? g - b : ((g == x) ? b - r : r - g);
i = (r == x) ? 3 : ((g == x) ? 5 : 1);
h = ((i - (f / (v - x))) * 60) % 360;
s = (v - x) / v;
return [h, s, v];
}
Color.scaleBrightness = function(rgb, scale) {
var hsv = Color.rgb2hsv(rgb);
scale = Math.max(0, Math.min(scale, 1));
return Color.fromHSV(hsv[0], hsv[1], scale * hsv[2]);
}
Color.mixRGB = function(rgb1, rgb2, fraction) {
// Mix rgb1 with rgb2. 0 gives all rgb1, 1 gives rbg2, .5 mixes them 50/50.
if (fraction <= 0) return rgb1;
if (fraction >= 1) return rgb2;
var r1 = (rgb1 >> 16) & 255;
var g1 = (rgb1 >> 8) & 255;
var b1 = rgb1 & 255
var r2 = (rgb2 >> 16) & 255;
var g2 = (rgb2 >> 8) & 255;
var b2 = rgb2 & 255
var r = ((fraction * r2) + ((1.0 - fraction) * r1)) & 255;
var g = ((fraction * g2) + ((1.0 - fraction) * g1)) & 255;
var b = ((fraction * b2) + ((1.0 - fraction) * b1)) & 255;
return (r << 16) | (g << 8) | b;
}
Color.random = function() {
// return a random color
var h = 360 * Math.random();
var s = 0.7 + (0.3 * Math.random());
var v = 0.6 + (0.4 * Math.random());
return Color.fromHSV(h, s, v);
}