hsv.js
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:4k
- /*
- Copyright (c) 2004-2006, The Dojo Foundation
- All Rights Reserved.
- Licensed under the Academic Free License version 2.1 or above OR the
- modified BSD license. For more information on Dojo licensing, see:
- http://dojotoolkit.org/community/licensing.shtml
- */
- dojo.provide("dojo.gfx.color.hsv");
- dojo.require("dojo.lang.array");
- dojo.require("dojo.math");
- dojo.lang.extend(dojo.gfx.color.Color, {toHsv:function () {
- return dojo.gfx.color.rgb2hsv(this.toRgb());
- }});
- dojo.gfx.color.rgb2hsv = function (r, g, b, options) {
- if (dojo.lang.isArray(r)) {
- if (g) {
- options = g;
- }
- b = r[2] || 0;
- g = r[1] || 0;
- r = r[0] || 0;
- }
- var opt = {inputRange:(options && options.inputRange) ? options.inputRange : 255, outputRange:(options && options.outputRange) ? options.outputRange : [255, 255, 255]};
- var h = null;
- var s = null;
- var v = null;
- switch (opt.inputRange) {
- case 1:
- r = (r * 255);
- g = (g * 255);
- b = (b * 255);
- break;
- case 100:
- r = (r / 100) * 255;
- g = (g / 100) * 255;
- b = (b / 100) * 255;
- break;
- default:
- break;
- }
- var min = Math.min(r, g, b);
- v = Math.max(r, g, b);
- var delta = v - min;
- s = (v == 0) ? 0 : delta / v;
- if (s == 0) {
- h = 0;
- } else {
- if (r == v) {
- h = 60 * (g - b) / delta;
- } else {
- if (g == v) {
- h = 120 + 60 * (b - r) / delta;
- } else {
- if (b == v) {
- h = 240 + 60 * (r - g) / delta;
- }
- }
- }
- if (h <= 0) {
- h += 360;
- }
- }
- switch (opt.outputRange[0]) {
- case 360:
- break;
- case 100:
- h = (h / 360) * 100;
- break;
- case 1:
- h = (h / 360);
- break;
- default:
- h = (h / 360) * 255;
- break;
- }
- switch (opt.outputRange[1]) {
- case 100:
- s = s * 100;
- case 1:
- break;
- default:
- s = s * 255;
- break;
- }
- switch (opt.outputRange[2]) {
- case 100:
- v = (v / 255) * 100;
- break;
- case 1:
- v = (v / 255);
- break;
- default:
- break;
- }
- h = dojo.math.round(h);
- s = dojo.math.round(s);
- v = dojo.math.round(v);
- return [h, s, v];
- };
- dojo.gfx.color.hsv2rgb = function (h, s, v, options) {
- if (dojo.lang.isArray(h)) {
- if (s) {
- options = s;
- }
- v = h[2] || 0;
- s = h[1] || 0;
- h = h[0] || 0;
- }
- var opt = {inputRange:(options && options.inputRange) ? options.inputRange : [255, 255, 255], outputRange:(options && options.outputRange) ? options.outputRange : 255};
- switch (opt.inputRange[0]) {
- case 1:
- h = h * 360;
- break;
- case 100:
- h = (h / 100) * 360;
- break;
- case 360:
- h = h;
- break;
- default:
- h = (h / 255) * 360;
- }
- if (h == 360) {
- h = 0;
- }
- switch (opt.inputRange[1]) {
- case 100:
- s /= 100;
- break;
- case 255:
- s /= 255;
- }
- switch (opt.inputRange[2]) {
- case 100:
- v /= 100;
- break;
- case 255:
- v /= 255;
- }
- var r = null;
- var g = null;
- var b = null;
- if (s == 0) {
- r = v;
- g = v;
- b = v;
- } else {
- var hTemp = h / 60;
- var i = Math.floor(hTemp);
- var f = hTemp - i;
- var p = v * (1 - s);
- var q = v * (1 - (s * f));
- var t = v * (1 - (s * (1 - f)));
- switch (i) {
- case 0:
- r = v;
- g = t;
- b = p;
- break;
- case 1:
- r = q;
- g = v;
- b = p;
- break;
- case 2:
- r = p;
- g = v;
- b = t;
- break;
- case 3:
- r = p;
- g = q;
- b = v;
- break;
- case 4:
- r = t;
- g = p;
- b = v;
- break;
- case 5:
- r = v;
- g = p;
- b = q;
- break;
- }
- }
- switch (opt.outputRange) {
- case 1:
- r = dojo.math.round(r, 2);
- g = dojo.math.round(g, 2);
- b = dojo.math.round(b, 2);
- break;
- case 100:
- r = Math.round(r * 100);
- g = Math.round(g * 100);
- b = Math.round(b * 100);
- break;
- default:
- r = Math.round(r * 255);
- g = Math.round(g * 255);
- b = Math.round(b * 255);
- }
- return [r, g, b];
- };