aboutsummaryrefslogtreecommitdiffstats
path: root/src/color.js
diff options
context:
space:
mode:
authorwout <wout@impinc.co.uk>2013-03-06 19:43:17 +0000
committerwout <wout@impinc.co.uk>2013-03-06 19:43:17 +0000
commit5e3ff072994d3d9b224c62d71ca1331951249bac (patch)
tree9bb8b5af1ca4372fcf0c03b0444530fefee20735 /src/color.js
parent6a8a3fee7dbfc9a9f4a36dc5877f955f5743a4ac (diff)
downloadsvg.js-5e3ff072994d3d9b224c62d71ca1331951249bac.tar.gz
svg.js-5e3ff072994d3d9b224c62d71ca1331951249bac.zip
Reworked color management
Diffstat (limited to 'src/color.js')
-rw-r--r--src/color.js165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/color.js b/src/color.js
new file mode 100644
index 0000000..dde2c65
--- /dev/null
+++ b/src/color.js
@@ -0,0 +1,165 @@
+// Module for color convertions
+SVG.Color = function(color) {
+ var match
+
+ /* initialize defaults */
+ this.r = 0
+ this.g = 0
+ this.b = 0
+
+ /* parse color */
+ if (typeof color == 'string') {
+ if (SVG.regex.isRgb.test(color)) {
+ /* get rgb values */
+ match = SVG.regex.rgb.exec(color.replace(/\s/g,''))
+
+ /* parse numeric values */
+ this.r = parseInt(m[1])
+ this.g = parseInt(m[2])
+ this.b = parseInt(m[3])
+
+ } else if (SVG.regex.isHex.test(color)) {
+ /* get hex values */
+ match = SVG.regex.hex.exec(this._fullHex(color))
+
+ /* parse numeric values */
+ this.r = parseInt(match[1], 16)
+ this.g = parseInt(match[2], 16)
+ this.b = parseInt(match[3], 16)
+
+ } else if (SVG.regex.isHsb.test(color)) {
+ /* get hsb values */
+ match = SVG.regex.hsb.exec(color.replace(/\s/g,''))
+
+ /* convert hsb to rgb */
+ color = this._hsbToRgb(match[1], match[2], match[3])
+ }
+
+ } else if (typeof color == 'object') {
+ if (SVG.Color.isHsb(color))
+ color = this._hsbToRgb(color.h, color.s, color.b)
+
+ this.r = color.r
+ this.g = color.g
+ this.b = color.b
+
+ }
+
+}
+
+SVG.extend(SVG.Color, {
+ // Default to hex conversion
+ toString: function() {
+ return this.toHex()
+ }
+ // Build hex value
+, toHex: function() {
+ return '#'
+ + this._compToHex(this.r)
+ + this._compToHex(this.g)
+ + this._compToHex(this.b)
+ }
+ // Build rgb value
+, toRgb: function() {
+ return 'rgb(' + [this.r, this.g, this.b].join() + ')'
+ }
+ // Calculate true brightness
+, brightness: function() {
+ return (this.r / 255 * 0.30)
+ + (this.g / 255 * 0.59)
+ + (this.b / 255 * 0.11)
+ }
+ // Private: convert hsb to rgb
+, _hsbToRgb: function(h, s, v) {
+ var vs, vsf
+
+ /* process hue */
+ h = parseInt(h) % 360
+ if (h < 0) h += 360
+
+ /* process saturation */
+ s = parseInt(s)
+ s = s > 100 ? 100 : s
+
+ /* process brightness */
+ v = parseInt(v)
+ v = (v < 0 ? 0 : v > 100 ? 100 : v) * 255 / 100
+
+ /* compile rgb */
+ vs = v * s / 100
+ vsf = (vs * ((h * 256 / 60) % 256)) / 256
+
+ switch (Math.floor(h / 60)) {
+ case 0:
+ r = v
+ g = v - vs + vsf
+ b = v - vs
+ break
+ case 1:
+ r = v - vsf
+ g = v
+ b = v - vs
+ break
+ case 2:
+ r = v - vs
+ g = v
+ b = v - vs + vsf
+ break
+ case 3:
+ r = v - vs
+ g = v - vsf
+ b = v
+ break
+ case 4:
+ r = v - vs + vsf
+ g = v - vs
+ b = v
+ break
+ case 5:
+ r = v
+ g = v - vs
+ b = v - vsf
+ break
+ }
+
+ /* parse values */
+ return {
+ r: Math.floor(r + 0.5)
+ , g: Math.floor(g + 0.5)
+ , b: Math.floor(b + 0.5)
+ }
+ }
+ // Private: ensure to six-based hex
+, _fullHex: function(hex) {
+ return hex.length == 4 ?
+ [ '#',
+ hex.substring(1, 2), hex.substring(1, 2)
+ , hex.substring(2, 3), hex.substring(2, 3)
+ , hex.substring(3, 4), hex.substring(3, 4)
+ ].join('') : hex
+ }
+ // Private: component to hex value
+, _compToHex: function(comp) {
+ var hex = comp.toString(16)
+ return hex.length == 1 ? '0' + hex : hex
+ }
+
+})
+
+// Test if given value is a color string
+SVG.Color.test = function(color) {
+ color += ''
+ return SVG.regex.isHex.test(color)
+ || SVG.regex.isRgb.test(color)
+ || SVG.regex.isHsb.test(color)
+}
+
+// Test if given value is a rgb object
+SVG.Color.isRgb = function(color) {
+ return typeof color.r == 'number'
+}
+
+// Test if given value is a hsb object
+SVG.Color.isHsb = function(color) {
+ return typeof color.h == 'number'
+} \ No newline at end of file