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