166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Copyright (c) 2012 The Chromium Authors. All rights reserved.
266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Use of this source code is governed by a BSD-style license that can be
366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// found in the LICENSE file.
466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict';
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.exportTo('base', function() {
866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  function Color(opt_r, opt_g, opt_b, opt_a) {
966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.r = Math.floor(opt_r) || 0;
1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.g = Math.floor(opt_g) || 0;
1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.b = Math.floor(opt_b) || 0;
1266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    this.a = opt_a;
1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  }
1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  Color.fromString = function(str) {
1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var tmp;
1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    var values;
1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    if (str.substr(0, 4) == 'rgb(') {
1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      tmp = str.substr(4, str.length - 5);
2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      values = tmp.split(',').map(function(v) {
2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return v.replace(/^\s+/, '', 'g');
2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      });
2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (values.length != 3)
2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        throw new Error('Malformatted rgb-expression');
2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return new Color(
2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          parseInt(values[0]),
2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          parseInt(values[1]),
2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          parseInt(values[2]));
2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    } else if (str.substr(0, 5) == 'rgba(') {
3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      tmp = str.substr(5, str.length - 6);
3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      values = tmp.split(',').map(function(v) {
3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return v.replace(/^\s+/, '', 'g');
3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      });
3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (values.length != 4)
3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        throw new Error('Malformatted rgb-expression');
3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return new Color(
3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          parseInt(values[0]),
3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          parseInt(values[1]),
3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          parseInt(values[2]),
4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          parseFloat(values[3]));
4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    } else if (str[0] == '#' && str.length == 7) {
4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return new Color(
4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          parseInt(str.substr(1, 2), 16),
4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          parseInt(str.substr(3, 2), 16),
4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          parseInt(str.substr(5, 2), 16));
4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    } else {
4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      throw new Error('Unrecognized string format.');
4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  Color.lerp = function(a, b, percent) {
5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    if (a.a !== undefined && b.a !== undefined)
5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return Color.lerpRGBA(a, b, percent);
5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return Color.lerpRGB(a, b, percent);
5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  }
5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  Color.lerpRGB = function(a, b, percent) {
5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return new Color(
5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        ((b.r - a.r) * percent) + a.r,
5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        ((b.g - a.g) * percent) + a.g,
6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        ((b.b - a.b) * percent) + a.b);
6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  }
6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  Color.lerpRGBA = function(a, b, percent) {
6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    return new Color(
6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        ((b.r - a.r) * percent) + a.r,
6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        ((b.g - a.g) * percent) + a.g,
6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        ((b.b - a.b) * percent) + a.b,
6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        ((b.a - a.a) * percent) + a.a);
6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  }
7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  Color.prototype = {
7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    brighten: function(opt_k) {
7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var k;
7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      k = opt_k || 0.45;
7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return new Color(
7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          Math.min(255, this.r + Math.floor(this.r * k)),
7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          Math.min(255, this.g + Math.floor(this.g * k)),
7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          Math.min(255, this.b + Math.floor(this.b * k)));
8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    darken: function(opt_k) {
8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var k;
8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      k = opt_k || 0.45;
8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return new Color(
8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          Math.min(255, this.r - Math.floor(this.r * k)),
8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          Math.min(255, this.g - Math.floor(this.g * k)),
8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          Math.min(255, this.b - Math.floor(this.b * k)));
9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    withAlpha: function(a) {
9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return new Color(this.r, this.g, this.b, a);
9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    toString: function() {
9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (this.a !== undefined) {
9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return 'rgba(' +
9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            this.r + ',' + this.g + ',' +
10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            this.b + ',' + this.a + ')';
10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return 'rgb(' + this.r + ',' + this.g + ',' + this.b + ')';
10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  return {
10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    Color: Color
10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis});
110