| /* |
| 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]; |
| }; |
| |