summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/devtools/front_end/common/Color.js
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/devtools/front_end/common/Color.js')
-rw-r--r--chromium/third_party/WebKit/Source/devtools/front_end/common/Color.js642
1 files changed, 642 insertions, 0 deletions
diff --git a/chromium/third_party/WebKit/Source/devtools/front_end/common/Color.js b/chromium/third_party/WebKit/Source/devtools/front_end/common/Color.js
new file mode 100644
index 00000000000..84d7685385a
--- /dev/null
+++ b/chromium/third_party/WebKit/Source/devtools/front_end/common/Color.js
@@ -0,0 +1,642 @@
+/*
+ * Copyright (C) 2009 Apple Inc. All rights reserved.
+ * Copyright (C) 2009 Joseph Pecoraro
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * its contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/**
+ * @param {!Array.<number>} rgba
+ * @param {string=} format
+ * @param {string=} originalText
+ * @constructor
+ */
+WebInspector.Color = function(rgba, format, originalText)
+{
+ this._rgba = rgba;
+ this._originalText = originalText || null;
+ this._format = format || null;
+ if (typeof this._rgba[3] === "undefined")
+ this._rgba[3] = 1;
+ for (var i = 0; i < 4; ++i) {
+ if (this._rgba[i] < 0)
+ this._rgba[i] = 0;
+ if (this._rgba[i] > 1)
+ this._rgba[i] = 1;
+ }
+}
+
+/**
+ * @param {string} text
+ * @return {?WebInspector.Color}
+ */
+WebInspector.Color.parse = function(text)
+{
+ // Simple - #hex, rgb(), nickname, hsl()
+ var value = text.toLowerCase().replace(/\s+/g, "");
+ var simple = /^(?:#([0-9a-f]{3,6})|rgb\(([^)]+)\)|(\w+)|hsl\(([^)]+)\))$/i;
+ var match = value.match(simple);
+ if (match) {
+ if (match[1]) { // hex
+ var hex = match[1].toUpperCase();
+ var format;
+ if (hex.length === 3) {
+ format = WebInspector.Color.Format.ShortHEX;
+ hex = hex.charAt(0) + hex.charAt(0) + hex.charAt(1) + hex.charAt(1) + hex.charAt(2) + hex.charAt(2);
+ } else
+ format = WebInspector.Color.Format.HEX;
+ var r = parseInt(hex.substring(0,2), 16);
+ var g = parseInt(hex.substring(2,4), 16);
+ var b = parseInt(hex.substring(4,6), 16);
+ return new WebInspector.Color([r / 255, g / 255, b / 255, 1], format, text);
+ }
+
+ if (match[2]) { // rgb
+ var rgbString = match[2].split(/\s*,\s*/);
+ var rgba = [ WebInspector.Color._parseRgbNumeric(rgbString[0]),
+ WebInspector.Color._parseRgbNumeric(rgbString[1]),
+ WebInspector.Color._parseRgbNumeric(rgbString[2]), 1 ];
+ return new WebInspector.Color(rgba, WebInspector.Color.Format.RGB, text);
+ }
+
+ if (match[3]) { // nickname
+ var nickname = match[3].toLowerCase();
+ if (nickname in WebInspector.Color.Nicknames) {
+ var rgba = WebInspector.Color.Nicknames[nickname];
+ var color = WebInspector.Color.fromRGBA(rgba);
+ color._format = WebInspector.Color.Format.Nickname;
+ color._originalText = nickname;
+ return color;
+ }
+ return null;
+ }
+
+ if (match[4]) { // hsl
+ var hslString = match[4].replace(/%/g, "").split(/\s*,\s*/);
+ var hsla = [ WebInspector.Color._parseHueNumeric(hslString[0]),
+ WebInspector.Color._parseSatLightNumeric(hslString[1]),
+ WebInspector.Color._parseSatLightNumeric(hslString[2]), 1 ];
+ var rgba = WebInspector.Color._hsl2rgb(hsla);
+ return new WebInspector.Color(rgba, WebInspector.Color.Format.HSL, text);
+ }
+
+ return null;
+ }
+
+ // Advanced - rgba(), hsla()
+ var advanced = /^(?:rgba\(([^)]+)\)|hsla\(([^)]+)\))$/;
+ match = value.match(advanced);
+ if (match) {
+ if (match[1]) { // rgba
+ var rgbaString = match[1].split(/\s*,\s*/);
+ var rgba = [ WebInspector.Color._parseRgbNumeric(rgbaString[0]),
+ WebInspector.Color._parseRgbNumeric(rgbaString[1]),
+ WebInspector.Color._parseRgbNumeric(rgbaString[2]),
+ WebInspector.Color._parseAlphaNumeric(rgbaString[3]) ];
+ return new WebInspector.Color(rgba, WebInspector.Color.Format.RGBA, text);
+ }
+
+ if (match[2]) { // hsla
+ var hslaString = match[2].replace(/%/g, "").split(/\s*,\s*/);
+ var hsla = [ WebInspector.Color._parseHueNumeric(hslaString[0]),
+ WebInspector.Color._parseSatLightNumeric(hslaString[1]),
+ WebInspector.Color._parseSatLightNumeric(hslaString[2]),
+ WebInspector.Color._parseAlphaNumeric(hslaString[3]) ];
+ var rgba = WebInspector.Color._hsl2rgb(hsla);
+ return new WebInspector.Color(rgba, WebInspector.Color.Format.HSLA, text);
+ }
+ }
+
+ return null;
+}
+
+/**
+ * @param {!Array.<number>} rgba
+ * @return {!WebInspector.Color}
+ */
+WebInspector.Color.fromRGBA = function(rgba)
+{
+ return new WebInspector.Color([rgba[0] / 255, rgba[1] / 255, rgba[2] / 255, rgba[3]]);
+}
+
+/**
+ * @param {!Array.<number>} hsva
+ * @return {!WebInspector.Color}
+ */
+WebInspector.Color.fromHSVA = function(hsva)
+{
+ var h = hsva[0];
+ var s = hsva[1];
+ var v = hsva[2];
+
+ var t = (2 - s) * v;
+ if (v === 0 || s === 0)
+ s = 0;
+ else
+ s *= v / (t < 1 ? t : 2 - t);
+ var hsla = [h, s, t / 2, hsva[3]];
+
+ return new WebInspector.Color(WebInspector.Color._hsl2rgb(hsla), WebInspector.Color.Format.HSLA);
+}
+
+WebInspector.Color.prototype = {
+ /**
+ * @return {?string}
+ */
+ format: function()
+ {
+ return this._format;
+ },
+
+ /**
+ * @return {!Array.<number>} HSLA with components within [0..1]
+ */
+ hsla: function()
+ {
+ if (this._hsla)
+ return this._hsla;
+ var r = this._rgba[0];
+ var g = this._rgba[1];
+ var b = this._rgba[2];
+ var max = Math.max(r, g, b);
+ var min = Math.min(r, g, b);
+ var diff = max - min;
+ var add = max + min;
+
+ if (min === max)
+ var h = 0;
+ else if (r === max)
+ var h = ((1/6 * (g - b) / diff) + 1) % 1;
+ else if (g === max)
+ var h = (1/6 * (b - r) / diff) + 1/3;
+ else
+ var h = (1/6 * (r - g) / diff) + 2/3;
+
+ var l = 0.5 * add;
+
+ if (l === 0)
+ var s = 0;
+ else if (l === 1)
+ var s = 1;
+ else if (l <= 0.5)
+ var s = diff / add;
+ else
+ var s = diff / (2 - add);
+
+ this._hsla = [h, s, l, this._rgba[3]];
+ return this._hsla;
+ },
+
+ /**
+ * @return {!Array.<number>} HSVA with components within [0..1]
+ */
+ hsva: function()
+ {
+ var hsla = this.hsla();
+ var h = hsla[0];
+ var s = hsla[1];
+ var l = hsla[2];
+
+ s *= l < 0.5 ? l : 1 - l;
+ return [h, s !== 0 ? 2 * s / (l + s) : 0, (l + s), hsla[3]];
+ },
+
+ /**
+ * @return {boolean}
+ */
+ hasAlpha: function()
+ {
+ return this._rgba[3] !== 1;
+ },
+
+ /**
+ * @return {boolean}
+ */
+ canBeShortHex: function()
+ {
+ if (this.hasAlpha())
+ return false;
+ for (var i = 0; i < 3; ++i) {
+ var c = Math.round(this._rgba[i] * 255);
+ if (c % 17)
+ return false;
+ }
+ return true;
+ },
+
+ /**
+ * @return {?string}
+ */
+ toString: function(format)
+ {
+ if (!format)
+ format = this._format;
+
+ /**
+ * @param {number} value
+ * @return {number}
+ */
+ function toRgbValue(value)
+ {
+ return Math.round(value * 255);
+ }
+
+ /**
+ * @param {number} value
+ * @return {string}
+ */
+ function toHexValue(value)
+ {
+ var hex = Math.round(value * 255).toString(16);
+ return hex.length === 1 ? "0" + hex : hex;
+ }
+
+ /**
+ * @param {number} value
+ * @return {string}
+ */
+ function toShortHexValue(value)
+ {
+ return (Math.round(value * 255) / 17).toString(16);
+ }
+
+ switch (format) {
+ case WebInspector.Color.Format.Original:
+ return this._originalText;
+ case WebInspector.Color.Format.RGB:
+ if (this.hasAlpha())
+ return null;
+ return String.sprintf("rgb(%d, %d, %d)", toRgbValue(this._rgba[0]), toRgbValue(this._rgba[1]), toRgbValue(this._rgba[2]));
+ case WebInspector.Color.Format.RGBA:
+ return String.sprintf("rgba(%d, %d, %d, %f)", toRgbValue(this._rgba[0]), toRgbValue(this._rgba[1]), toRgbValue(this._rgba[2]), this._rgba[3]);
+ case WebInspector.Color.Format.HSL:
+ if (this.hasAlpha())
+ return null;
+ var hsl = this.hsla();
+ return String.sprintf("hsl(%d, %d%, %d%)", Math.round(hsl[0] * 360), Math.round(hsl[1] * 100), Math.round(hsl[2] * 100));
+ case WebInspector.Color.Format.HSLA:
+ var hsla = this.hsla();
+ return String.sprintf("hsla(%d, %d%, %d%, %f)", Math.round(hsla[0] * 360), Math.round(hsla[1] * 100), Math.round(hsla[2] * 100), hsla[3]);
+ case WebInspector.Color.Format.HEX:
+ if (this.hasAlpha())
+ return null;
+ return String.sprintf("#%s%s%s", toHexValue(this._rgba[0]), toHexValue(this._rgba[1]), toHexValue(this._rgba[2])).toUpperCase();
+ case WebInspector.Color.Format.ShortHEX:
+ if (!this.canBeShortHex())
+ return null;
+ return String.sprintf("#%s%s%s", toShortHexValue(this._rgba[0]), toShortHexValue(this._rgba[1]), toShortHexValue(this._rgba[2])).toUpperCase();
+ case WebInspector.Color.Format.Nickname:
+ return this.nickname();
+ }
+
+ return this._originalText;
+ },
+
+ /**
+ * @return {!Array.<number>}
+ */
+ _canonicalRGBA: function()
+ {
+ var rgba = new Array(3);
+ for (var i = 0; i < 3; ++i)
+ rgba[i] = Math.round(this._rgba[i] * 255);
+ if (this._rgba[3] !== 1)
+ rgba.push(this._rgba[3]);
+ return rgba;
+ },
+
+ /**
+ * @return {?string} nickname
+ */
+ nickname: function()
+ {
+ if (!WebInspector.Color._rgbaToNickname) {
+ WebInspector.Color._rgbaToNickname = {};
+ for (var nickname in WebInspector.Color.Nicknames) {
+ var rgba = WebInspector.Color.Nicknames[nickname];
+ WebInspector.Color._rgbaToNickname[rgba] = nickname;
+ }
+ }
+
+ return WebInspector.Color._rgbaToNickname[this._canonicalRGBA()] || null;
+ },
+
+ /**
+ * @return {!DOMAgent.RGBA}
+ */
+ toProtocolRGBA: function()
+ {
+ var rgba = this._canonicalRGBA();
+ var result = { r: rgba[0], g: rgba[1], b: rgba[2] };
+ if (rgba[3] !== 1)
+ result.a = rgba[3];
+ return result;
+ },
+
+ /**
+ * @return {!WebInspector.Color}
+ */
+ invert: function()
+ {
+ var rgba = [];
+ rgba[0] = 1 - this._rgba[0];
+ rgba[1] = 1 - this._rgba[1];
+ rgba[2] = 1 - this._rgba[2];
+ rgba[3] = this._rgba[3];
+ return new WebInspector.Color(rgba);
+ },
+
+ /**
+ * @param {number} alpha
+ * @return {!WebInspector.Color}
+ */
+ setAlpha: function(alpha)
+ {
+ var rgba = this._rgba.slice();
+ rgba[3] = alpha;
+ return new WebInspector.Color(rgba);
+ }
+}
+
+/**
+ * @param {string} value
+ * return {number}
+ */
+WebInspector.Color._parseRgbNumeric = function(value)
+{
+ var parsed = parseInt(value, 10);
+ if (value.indexOf("%") !== -1)
+ parsed /= 100;
+ else
+ parsed /= 255;
+ return parsed;
+}
+
+/**
+ * @param {string} value
+ * return {number}
+ */
+WebInspector.Color._parseHueNumeric = function(value)
+{
+ return isNaN(value) ? 0 : (parseFloat(value) / 360) % 1;
+}
+
+/**
+ * @param {string} value
+ * return {number}
+ */
+WebInspector.Color._parseSatLightNumeric = function(value)
+{
+ return parseFloat(value) / 100;
+}
+
+/**
+ * @param {string} value
+ * return {number}
+ */
+WebInspector.Color._parseAlphaNumeric = function(value)
+{
+ return isNaN(value) ? 0 : parseFloat(value);
+}
+
+/**
+ * @param {!Array.<number>} hsl
+ * @return {!Array.<number>}
+ */
+WebInspector.Color._hsl2rgb = function(hsl)
+{
+ var h = hsl[0];
+ var s = hsl[1];
+ var l = hsl[2];
+
+ function hue2rgb(p, q, h)
+ {
+ if (h < 0)
+ h += 1;
+ else if (h > 1)
+ h -= 1;
+
+ if ((h * 6) < 1)
+ return p + (q - p) * h * 6;
+ else if ((h * 2) < 1)
+ return q;
+ else if ((h * 3) < 2)
+ return p + (q - p) * ((2 / 3) - h) * 6;
+ else
+ return p;
+ }
+
+ if (s < 0)
+ s = 0;
+
+ if (l <= 0.5)
+ var q = l * (1 + s);
+ else
+ var q = l + s - (l * s);
+
+ var p = 2 * l - q;
+
+ var tr = h + (1 / 3);
+ var tg = h;
+ var tb = h - (1 / 3);
+
+ var r = hue2rgb(p, q, tr);
+ var g = hue2rgb(p, q, tg);
+ var b = hue2rgb(p, q, tb);
+ return [r, g, b, hsl[3]];
+}
+
+WebInspector.Color.Nicknames = {
+ "aliceblue": [240,248,255],
+ "antiquewhite": [250,235,215],
+ "aquamarine": [127,255,212],
+ "azure": [240,255,255],
+ "beige": [245,245,220],
+ "bisque": [255,228,196],
+ "black": [0,0,0],
+ "blanchedalmond": [255,235,205],
+ "blue": [0,0,255],
+ "blueviolet": [138,43,226],
+ "brown": [165,42,42],
+ "burlywood": [222,184,135],
+ "cadetblue": [95,158,160],
+ "chartreuse": [127,255,0],
+ "chocolate": [210,105,30],
+ "coral": [255,127,80],
+ "cornflowerblue": [100,149,237],
+ "cornsilk": [255,248,220],
+ "crimson": [237,20,61],
+ "cyan": [0,255,255],
+ "darkblue": [0,0,139],
+ "darkcyan": [0,139,139],
+ "darkgoldenrod": [184,134,11],
+ "darkgray": [169,169,169],
+ "darkgrey": [169,169,169],
+ "darkgreen": [0,100,0],
+ "darkkhaki": [189,183,107],
+ "darkmagenta": [139,0,139],
+ "darkolivegreen": [85,107,47],
+ "darkorange": [255,140,0],
+ "darkorchid": [153,50,204],
+ "darkred": [139,0,0],
+ "darksalmon": [233,150,122],
+ "darkseagreen": [143,188,143],
+ "darkslateblue": [72,61,139],
+ "darkslategray": [47,79,79],
+ "darkslategrey": [47,79,79],
+ "darkturquoise": [0,206,209],
+ "darkviolet": [148,0,211],
+ "deeppink": [255,20,147],
+ "deepskyblue": [0,191,255],
+ "dimgray": [105,105,105],
+ "dimgrey": [105,105,105],
+ "dodgerblue": [30,144,255],
+ "firebrick": [178,34,34],
+ "floralwhite": [255,250,240],
+ "forestgreen": [34,139,34],
+ "gainsboro": [220,220,220],
+ "ghostwhite": [248,248,255],
+ "gold": [255,215,0],
+ "goldenrod": [218,165,32],
+ "gray": [128,128,128],
+ "grey": [128,128,128],
+ "green": [0,128,0],
+ "greenyellow": [173,255,47],
+ "honeydew": [240,255,240],
+ "hotpink": [255,105,180],
+ "indianred": [205,92,92],
+ "indigo": [75,0,130],
+ "ivory": [255,255,240],
+ "khaki": [240,230,140],
+ "lavender": [230,230,250],
+ "lavenderblush": [255,240,245],
+ "lawngreen": [124,252,0],
+ "lemonchiffon": [255,250,205],
+ "lightblue": [173,216,230],
+ "lightcoral": [240,128,128],
+ "lightcyan": [224,255,255],
+ "lightgoldenrodyellow":[250,250,210],
+ "lightgreen": [144,238,144],
+ "lightgray": [211,211,211],
+ "lightgrey": [211,211,211],
+ "lightpink": [255,182,193],
+ "lightsalmon": [255,160,122],
+ "lightseagreen": [32,178,170],
+ "lightskyblue": [135,206,250],
+ "lightslategray": [119,136,153],
+ "lightslategrey": [119,136,153],
+ "lightsteelblue": [176,196,222],
+ "lightyellow": [255,255,224],
+ "lime": [0,255,0],
+ "limegreen": [50,205,50],
+ "linen": [250,240,230],
+ "magenta": [255,0,255],
+ "maroon": [128,0,0],
+ "mediumaquamarine": [102,205,170],
+ "mediumblue": [0,0,205],
+ "mediumorchid": [186,85,211],
+ "mediumpurple": [147,112,219],
+ "mediumseagreen": [60,179,113],
+ "mediumslateblue": [123,104,238],
+ "mediumspringgreen": [0,250,154],
+ "mediumturquoise": [72,209,204],
+ "mediumvioletred": [199,21,133],
+ "midnightblue": [25,25,112],
+ "mintcream": [245,255,250],
+ "mistyrose": [255,228,225],
+ "moccasin": [255,228,181],
+ "navajowhite": [255,222,173],
+ "navy": [0,0,128],
+ "oldlace": [253,245,230],
+ "olive": [128,128,0],
+ "olivedrab": [107,142,35],
+ "orange": [255,165,0],
+ "orangered": [255,69,0],
+ "orchid": [218,112,214],
+ "palegoldenrod": [238,232,170],
+ "palegreen": [152,251,152],
+ "paleturquoise": [175,238,238],
+ "palevioletred": [219,112,147],
+ "papayawhip": [255,239,213],
+ "peachpuff": [255,218,185],
+ "peru": [205,133,63],
+ "pink": [255,192,203],
+ "plum": [221,160,221],
+ "powderblue": [176,224,230],
+ "purple": [128,0,128],
+ "red": [255,0,0],
+ "rosybrown": [188,143,143],
+ "royalblue": [65,105,225],
+ "saddlebrown": [139,69,19],
+ "salmon": [250,128,114],
+ "sandybrown": [244,164,96],
+ "seagreen": [46,139,87],
+ "seashell": [255,245,238],
+ "sienna": [160,82,45],
+ "silver": [192,192,192],
+ "skyblue": [135,206,235],
+ "slateblue": [106,90,205],
+ "slategray": [112,128,144],
+ "slategrey": [112,128,144],
+ "snow": [255,250,250],
+ "springgreen": [0,255,127],
+ "steelblue": [70,130,180],
+ "tan": [210,180,140],
+ "teal": [0,128,128],
+ "thistle": [216,191,216],
+ "tomato": [255,99,71],
+ "turquoise": [64,224,208],
+ "violet": [238,130,238],
+ "wheat": [245,222,179],
+ "white": [255,255,255],
+ "whitesmoke": [245,245,245],
+ "yellow": [255,255,0],
+ "yellowgreen": [154,205,50],
+ "transparent": [0, 0, 0, 0],
+};
+
+WebInspector.Color.PageHighlight = {
+ Content: WebInspector.Color.fromRGBA([111, 168, 220, .66]),
+ ContentLight: WebInspector.Color.fromRGBA([111, 168, 220, .5]),
+ ContentOutline: WebInspector.Color.fromRGBA([9, 83, 148]),
+ Padding: WebInspector.Color.fromRGBA([147, 196, 125, .55]),
+ PaddingLight: WebInspector.Color.fromRGBA([147, 196, 125, .4]),
+ Border: WebInspector.Color.fromRGBA([255, 229, 153, .66]),
+ BorderLight: WebInspector.Color.fromRGBA([255, 229, 153, .5]),
+ Margin: WebInspector.Color.fromRGBA([246, 178, 107, .66]),
+ MarginLight: WebInspector.Color.fromRGBA([246, 178, 107, .5]),
+ EventTarget: WebInspector.Color.fromRGBA([255, 196, 196, .66])
+}
+
+WebInspector.Color.Format = {
+ Original: "original",
+ Nickname: "nickname",
+ HEX: "hex",
+ ShortHEX: "shorthex",
+ RGB: "rgb",
+ RGBA: "rgba",
+ HSL: "hsl",
+ HSLA: "hsla"
+}