Team:Evry/arbor/src/graphics/colors.js

From 2012.igem.org

Revision as of 17:57, 18 September 2012 by TriCer (Talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

var Colors = (function(){

 var iscolor_re = /#[0-9a-f]{6}/i
 var hexrgb_re = /#(..)(..)(..)/
 var d2h = function(d){
   // decimal to hex
   var s=d.toString(16); 
   return (s.length==2) ? s : '0'+s
 }
 
 var h2d = function(h){
   // hex to decimal
   return parseInt(h,16);
 }
 var _isRGB = function(color){
   if (!color || typeof color!='object') return false
   var components = objkeys(color).sort().join("")
   if (components == 'abgr') return true
 }
 // var _isHSB = function(color){
 //   if (!color || typeof cssOrHex!='object') return false
 //   var components = objkeys(color).sort().join("")
 //   if (components == 'hsb') return true
 // }


 var that = {
   CSS:{aliceblue:"#f0f8ff", antiquewhite:"#faebd7", aqua:"#00ffff", aquamarine:"#7fffd4", azure:"#f0ffff", beige:"#f5f5dc", bisque:"#ffe4c4", black:"#000000", blanchedalmond:"#ffebcd", blue:"#0000ff", blueviolet:"#8a2be2", brown:"#a52a2a", burlywood:"#deb887", cadetblue:"#5f9ea0", chartreuse:"#7fff00", chocolate:"#d2691e", coral:"#ff7f50", cornflowerblue:"#6495ed", cornsilk:"#fff8dc", crimson:"#dc143c", cyan:"#00ffff", darkblue:"#00008b", darkcyan:"#008b8b", darkgoldenrod:"#b8860b", darkgray:"#a9a9a9", darkgrey:"#a9a9a9", darkgreen:"#006400", darkkhaki:"#bdb76b", darkmagenta:"#8b008b", darkolivegreen:"#556b2f", darkorange:"#ff8c00", darkorchid:"#9932cc", darkred:"#8b0000", darksalmon:"#e9967a", darkseagreen:"#8fbc8f", darkslateblue:"#483d8b", darkslategray:"#2f4f4f", darkslategrey:"#2f4f4f", darkturquoise:"#00ced1", darkviolet:"#9400d3", deeppink:"#ff1493", deepskyblue:"#00bfff", dimgray:"#696969", dimgrey:"#696969", dodgerblue:"#1e90ff", firebrick:"#b22222", floralwhite:"#fffaf0", forestgreen:"#228b22", fuchsia:"#ff00ff", gainsboro:"#dcdcdc", ghostwhite:"#f8f8ff", gold:"#ffd700", goldenrod:"#daa520", gray:"#808080", grey:"#808080", green:"#008000", greenyellow:"#adff2f", honeydew:"#f0fff0", hotpink:"#ff69b4", indianred:"#cd5c5c", indigo:"#4b0082", ivory:"#fffff0", khaki:"#f0e68c", lavender:"#e6e6fa", lavenderblush:"#fff0f5", lawngreen:"#7cfc00", lemonchiffon:"#fffacd", lightblue:"#add8e6", lightcoral:"#f08080", lightcyan:"#e0ffff", lightgoldenrodyellow:"#fafad2", lightgray:"#d3d3d3", lightgrey:"#d3d3d3", lightgreen:"#90ee90", lightpink:"#ffb6c1", lightsalmon:"#ffa07a", lightseagreen:"#20b2aa", lightskyblue:"#87cefa", lightslategray:"#778899", lightslategrey:"#778899", lightsteelblue:"#b0c4de", lightyellow:"#ffffe0", lime:"#00ff00", limegreen:"#32cd32", linen:"#faf0e6", magenta:"#ff00ff", maroon:"#800000", mediumaquamarine:"#66cdaa", mediumblue:"#0000cd", mediumorchid:"#ba55d3", mediumpurple:"#9370d8", mediumseagreen:"#3cb371", mediumslateblue:"#7b68ee", mediumspringgreen:"#00fa9a", mediumturquoise:"#48d1cc", mediumvioletred:"#c71585", midnightblue:"#191970", mintcream:"#f5fffa", mistyrose:"#ffe4e1", moccasin:"#ffe4b5", navajowhite:"#ffdead", navy:"#000080", oldlace:"#fdf5e6", olive:"#808000", olivedrab:"#6b8e23", orange:"#ffa500", orangered:"#ff4500", orchid:"#da70d6", palegoldenrod:"#eee8aa", palegreen:"#98fb98", paleturquoise:"#afeeee", palevioletred:"#d87093", papayawhip:"#ffefd5", peachpuff:"#ffdab9", peru:"#cd853f", pink:"#ffc0cb", plum:"#dda0dd", powderblue:"#b0e0e6", purple:"#800080", red:"#ff0000", rosybrown:"#bc8f8f", royalblue:"#4169e1", saddlebrown:"#8b4513", salmon:"#fa8072", sandybrown:"#f4a460", seagreen:"#2e8b57", seashell:"#fff5ee", sienna:"#a0522d", silver:"#c0c0c0", skyblue:"#87ceeb", slateblue:"#6a5acd", slategray:"#708090", slategrey:"#708090", snow:"#fffafa", springgreen:"#00ff7f", steelblue:"#4682b4", tan:"#d2b48c", teal:"#008080", thistle:"#d8bfd8", tomato:"#ff6347", turquoise:"#40e0d0", violet:"#ee82ee", wheat:"#f5deb3", white:"#ffffff", whitesmoke:"#f5f5f5", yellow:"#ffff00", yellowgreen:"#9acd32"},
   // possible invocations:
   //    decode(1,2,3,.4)      -> {r:1,   g:2,   b:3,   a:0.4}
   //    decode(128, .7)       -> {r:128, g:128, b:128, a:0.7}    
   //    decode("#ff0000")     -> {r:255, g:0,   b:0,   a:1}
   //    decode("#ff0000",.5)  -> {r:255, g:0,   b:0,   a:0.5}
   //    decode("white")       -> {r:255, g:255, b:255, a:1}
   //    decode({r:0,g:0,b:0}) -> {r:0,   g:0,   b:0,   a:1}
   decode:function(clr){
     var argLen = arguments.length
     for (var i=argLen-1; i>=0; i--) if (arguments[i]===undefined) argLen--
     var args = arguments
     if (!clr) return null
     if (argLen==1 && _isRGB(clr)) return clr
     var rgb = null
     if (typeof clr=='string'){
       var alpha = 1
       if (argLen==2) alpha = args[1]
       
       var nameMatch = that.CSS[clr.toLowerCase()]
       if (nameMatch!==undefined){
          clr = nameMatch
       }
       var hexMatch = clr.match(iscolor_re)
       if (hexMatch){
         vals = clr.match(hexrgb_re)
         // trace(vals)
         if (!vals || !vals.length || vals.length!=4) return null    
         rgb = {r:h2d(vals[1]), g:h2d(vals[2]), b:h2d(vals[3]), a:alpha}
       }
     }else if (typeof clr=='number'){
       if (argLen>=3){
         rgb = {r:args[0], g:args[1], b:args[2], a:1}
         if (argLen>=4) rgb.a *= args[3]
       }else if(argLen>=1){
         rgb = {r:args[0], g:args[0], b:args[0], a:1}
         if (argLen==2) rgb.a *= args[1]
       }
     }


     // if (!rgb) trace("<null color>")
     // else trace(nano("<r:{r} g:{g} b:{b} a:{a}>",rgb))
     // 
     // if (arguments.length==1){        
     //   if (_isRGB(clr)) return clr
     //   if (!clr || typeof clr!='string') return null
     // 
     //   var nameMatch = that.CSS[clr.toLowerCase()]
     //   if (nameMatch!==undefined){
     //      clr = nameMatch
     //   }
     //   var hexMatch = clr.match(iscolor_re)
     //   if (hexMatch){
     //     vals = clr.match(hexrgb_re)
     //     if (!vals || !vals.length || vals.length!=4) return null    
     //     var rgb = {r:h2d(vals[1]), g:h2d(vals[2]), b:h2d(vals[3])}
     //     return rgb
     //   }
     // }
     
     return rgb
   },
   validate:function(str){
     if (!str || typeof str!='string') return false
     
     if (that.CSS[str.toLowerCase()] !== undefined) return true
     if (str.match(iscolor_re)) return true
     return false
   },
   
   // transform
   mix:function(color1, color2, proportion){
     var c1 = that.decode(color1)
     var c2 = that.decode(color2)
     
     // var mixed = ... should this be a triplet or a string?
   },
   blend:function(rgbOrHex, alpha){
     alpha = (alpha!==undefined) ? Math.max(0,Math.min(1,alpha)) : 1
     
     var rgb = that.decode(rgbOrHex)
     if (!rgb) return null
     
     if (alpha==1) return rgbOrHex
     var rgb = rgbOrHex
     if (typeof rgbOrHex=='string') rgb = that.decode(rgbOrHex)
     
     var blended = objcopy(rgb)
     blended.a *= alpha
     
     return nano("rgba({r},{g},{b},{a})", blended)
   },
   
   // output
   encode:function(rgb){
     if (!_isRGB(rgb)){
       rgb = that.decode(rgb)
       if (!_isRGB(rgb)) return null
     }
     if (rgb.a==1){
       return nano("#{r}{g}{b}", {r:d2h(rgb.r), g:d2h(rgb.g), b:d2h(rgb.b)} )        
     }else{
       return nano("rgba({r},{g},{b},{a})", rgb)
     }
     // encoding = encoding || "hex"
     // if (!_isRGB(rgb)) return null
     // switch(encoding){
     // case "hex":
     //   return nano("#{r}{g}{b}", {r:d2h(rgb.r), g:d2h(rgb.g), b:d2h(rgb.b)} )
     //   break
     //   
     // case "rgba":
     //   return nano("rgba({r},{g},{b},{alpha})", rgb)
     //   break
     // }
     // // if (rgb===undefined || !rgb.length || rgb.length!=3) return null
     // // return '#'+$.map(rgb, function(c){return d2h(c)}).join("")
   }
 }
 
 return that

})()