annot-server/static/js/randomColor.js
author ymh <ymh.work@gmail.com>
Mon, 12 Jan 2015 14:08:09 +0100
changeset 82 ae37d35a419c
parent 79 bd2f2c3f205c
permissions -rw-r--r--
Added tag V01.00 for changeset a6bbf198bd24
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
79
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
;(function(root, factory) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
  // Support AMD
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
  if (typeof define === 'function' && define.amd) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
    define([], factory);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
  // Support CommonJS
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
  } else if (typeof exports === 'object') {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
    var randomColor = factory();
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
    
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
    // Support NodeJS & Component, which allow module.exports to be a function
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
    if (typeof module === 'object' && module && module.exports) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
      exports = module.exports = randomColor;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
    }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
    
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
    // Support CommonJS 1.1.1 spec
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
    exports.randomColor = randomColor;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
  
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
  // Support vanilla script loading
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
  } else {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    root.randomColor = factory();
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
  };
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
}(this, function() {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
  // Shared color dictionary
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
  var colorDictionary = {};
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
  // Populate the color dictionary
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
  loadColorBounds();
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
  var randomColor = function(options) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    options = options || {};
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
    var H,S,B;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
    // Check if we need to generate multiple colors
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    if (options.count) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
      var totalColors = options.count,
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
          colors = [];
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
      options.count = false;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
      while (totalColors > colors.length) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        colors.push(randomColor(options));
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
      }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
      return colors;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
    // First we pick a hue (H)
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    H = pickHue(options);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
    // Then use H to determine saturation (S)
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
    S = pickSaturation(H, options);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
    // Then use S and H to determine brightness (B).
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
    B = pickBrightness(H, S, options);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
    // Then we return the HSB color in the desired format
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    return setFormat([H,S,B], options);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
  };
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
  function pickHue (options) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    var hueRange = getHueRange(options.hue),
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
        hue = randomWithin(hueRange);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
    // Instead of storing red as two seperate ranges,
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
    // we group them, using negative numbers
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
    if (hue < 0) {hue = 360 + hue}
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
    return hue;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
  function pickSaturation (hue, options) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    if (options.luminosity === 'random') {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
      return randomWithin([0,100]);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
    }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
    if (options.hue === 'monochrome') {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
      return 0;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
    }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    var saturationRange = getSaturationRange(hue);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
    var sMin = saturationRange[0],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
        sMax = saturationRange[1];
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
    switch (options.luminosity) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
      case 'bright':
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
        sMin = 55;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
        break;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
      case 'dark':
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
        sMin = sMax - 10;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
        break;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
      case 'light':
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
        sMax = 55;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
        break;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
   }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
    return randomWithin([sMin, sMax]);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
  function pickBrightness (H, S, options) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
    var brightness,
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
        bMin = getMinimumBrightness(H, S),
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
        bMax = 100;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
    switch (options.luminosity) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
      case 'dark':
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        bMax = bMin + 20;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
        break;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
      case 'light':
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
        bMin = (bMax + bMin)/2;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
        break;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
      case 'random':
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
        bMin = 0;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
        bMax = 100;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
        break;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
    }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
    return randomWithin([bMin, bMax]);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
  function setFormat (hsv, options) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
    switch (options.format) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
      case 'hsvArray':
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
        return hsv;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
      case 'hsv':
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
        return colorString('hsv', hsv);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
      case 'rgbArray':
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
        return HSVtoRGB(hsv);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
      case 'rgb':
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
        return colorString('rgb', HSVtoRGB(hsv));
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
      default:
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
        return HSVtoHex(hsv);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
    }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
  function getMinimumBrightness(H, S) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
    var lowerBounds = getColorInfo(H).lowerBounds;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
    for (var i = 0; i < lowerBounds.length - 1; i++) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
      var s1 = lowerBounds[i][0],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
          v1 = lowerBounds[i][1];
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
      var s2 = lowerBounds[i+1][0],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
          v2 = lowerBounds[i+1][1];
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
      if (S >= s1 && S <= s2) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   173
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   174
         var m = (v2 - v1)/(s2 - s1),
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   175
             b = v1 - m*s1;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   176
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   177
         return m*S + b;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   178
      }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   179
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   180
    }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   181
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   182
    return 0;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   183
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   184
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   185
  function getHueRange (colorInput) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   186
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   187
    if (typeof parseInt(colorInput) === 'number') {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   188
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   189
      var number = parseInt(colorInput);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   190
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   191
      if (number < 360 && number > 0) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   192
        return [number, number];
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   193
      }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   194
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   195
    }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   196
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   197
    if (typeof colorInput === 'string') {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   198
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   199
      if (colorDictionary[colorInput]) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   200
        var color = colorDictionary[colorInput];
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   201
        if (color.hueRange) {return color.hueRange}
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   202
      }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   203
    }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   204
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   205
    return [0,360];
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   206
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   207
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   208
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   209
  function getSaturationRange (hue) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   210
    return getColorInfo(hue).saturationRange;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   211
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   212
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   213
  function getColorInfo (hue) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   214
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   215
    // Maps red colors to make picking hue easier
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   216
    if (hue >= 334 && hue <= 360) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   217
      hue-= 360;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   218
    }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   219
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   220
    for (var colorName in colorDictionary) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   221
       var color = colorDictionary[colorName];
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   222
       if (color.hueRange &&
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   223
           hue >= color.hueRange[0] &&
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   224
           hue <= color.hueRange[1]) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   225
          return colorDictionary[colorName];
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   226
       }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   227
    } return 'Color not found';
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   228
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   229
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   230
  function randomWithin (range) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   231
    return Math.floor(range[0] + Math.random()*(range[1] + 1 - range[0]));
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   232
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   233
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   234
  function shiftHue (h, degrees) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   235
    return (h + degrees)%360;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   236
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   237
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   238
  function HSVtoHex (hsv){
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   239
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   240
    var rgb = HSVtoRGB(hsv);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   241
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   242
    function componentToHex(c) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   243
        var hex = c.toString(16);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   244
        return hex.length == 1 ? "0" + hex : hex;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   245
    }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   246
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   247
    var hex = "#" + componentToHex(rgb[0]) + componentToHex(rgb[1]) + componentToHex(rgb[2]);
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   248
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   249
    return hex;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   250
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   251
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   252
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   253
  function defineColor (name, hueRange, lowerBounds) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   254
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   255
    var sMin = lowerBounds[0][0],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   256
        sMax = lowerBounds[lowerBounds.length - 1][0],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   257
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   258
        bMin = lowerBounds[lowerBounds.length - 1][1],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   259
        bMax = lowerBounds[0][1];
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   260
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   261
    colorDictionary[name] = {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   262
      hueRange: hueRange,
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   263
      lowerBounds: lowerBounds,
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   264
      saturationRange: [sMin, sMax],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   265
      brightnessRange: [bMin, bMax]
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   266
    };
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   267
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   268
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   269
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   270
  function loadColorBounds () {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   271
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   272
    defineColor(
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   273
      'monochrome',
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   274
      null,
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   275
      [[0,0],[100,0]]
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   276
    );
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   277
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   278
    defineColor(
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   279
      'red',
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   280
      [-26,18],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   281
      [[20,100],[30,92],[40,89],[50,85],[60,78],[70,70],[80,60],[90,55],[100,50]]
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   282
    );
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   283
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   284
    defineColor(
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   285
      'orange',
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   286
      [19,46],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   287
      [[20,100],[30,93],[40,88],[50,86],[60,85],[70,70],[100,70]]
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   288
    );
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   289
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   290
    defineColor(
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   291
      'yellow',
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   292
      [47,62],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   293
      [[25,100],[40,94],[50,89],[60,86],[70,84],[80,82],[90,80],[100,75]]
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   294
    );
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   295
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   296
    defineColor(
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   297
      'green',
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   298
      [63,158],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   299
      [[30,100],[40,90],[50,85],[60,81],[70,74],[80,64],[90,50],[100,40]]
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   300
    );
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   301
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   302
    defineColor(
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   303
      'blue',
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   304
      [159, 257],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   305
      [[20,100],[30,86],[40,80],[50,74],[60,60],[70,52],[80,44],[90,39],[100,35]]
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   306
    );
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   307
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   308
    defineColor(
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   309
      'purple',
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   310
      [258, 282],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   311
      [[20,100],[30,87],[40,79],[50,70],[60,65],[70,59],[80,52],[90,45],[100,42]]
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   312
    );
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   313
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   314
    defineColor(
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   315
      'pink',
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   316
      [283, 334],
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   317
      [[20,100],[30,90],[40,86],[60,84],[80,80],[90,75],[100,73]]
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   318
    );
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   319
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   320
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   321
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   322
  function HSVtoRGB (hsv) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   323
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   324
    // this doesn't work for the values of 0 and 360
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   325
    // here's the hacky fix
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   326
    var h = hsv[0];
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   327
    if (h === 0) {h = 1}
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   328
    if (h === 360) {h = 359}
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   329
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   330
    // Rebase the h,s,v values
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   331
    h = h/360;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   332
    var s = hsv[1]/100,
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   333
        v = hsv[2]/100;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   334
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   335
    var h_i = Math.floor(h*6),
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   336
      f = h * 6 - h_i,
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   337
      p = v * (1 - s),
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   338
      q = v * (1 - f*s),
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   339
      t = v * (1 - (1 - f)*s),
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   340
      r = 256,
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   341
      g = 256,
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   342
      b = 256;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   343
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   344
    switch(h_i) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   345
      case 0: r = v, g = t, b = p;  break;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   346
      case 1: r = q, g = v, b = p;  break;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   347
      case 2: r = p, g = v, b = t;  break;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   348
      case 3: r = p, g = q, b = v;  break;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   349
      case 4: r = t, g = p, b = v;  break;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   350
      case 5: r = v, g = p, b = q;  break;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   351
    }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   352
    var result = [Math.floor(r*255), Math.floor(g*255), Math.floor(b*255)];
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   353
    return result;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   354
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   355
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   356
  function colorString (prefix, values) {
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   357
    return prefix + '(' + values.join(', ') + ')';
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   358
  }
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   359
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   360
  return randomColor;
bd2f2c3f205c Improve color management
ymh <ymh.work@gmail.com>
parents:
diff changeset
   361
}));