diff --git a/apps/tests/color-tests.ts b/apps/tests/color-tests.ts index 22fb8310f..0f921bf15 100644 --- a/apps/tests/color-tests.ts +++ b/apps/tests/color-tests.ts @@ -16,12 +16,12 @@ export var test_Hex_Color = function () { var color = new Color("#FF0000"); // ``` // - TKUnit.assert(color.a === 255, "Color.a not properly parsed"); - TKUnit.assert(color.r === 255, "Color.r not properly parsed"); - TKUnit.assert(color.g === 0, "Color.g not properly parsed"); - TKUnit.assert(color.b === 0, "Color.b not properly parsed"); - TKUnit.assert(color.hex === "#FF0000", "Color.hex not properly parsed"); - TKUnit.assert(color.argb === _parseArgb(255, 255, 0, 0), "Color.argb not properly parsed"); + TKUnit.assertEqual(color.a, 255, "Color.a not properly parsed"); + TKUnit.assertEqual(color.r, 255, "Color.r not properly parsed"); + TKUnit.assertEqual(color.g, 0, "Color.g not properly parsed"); + TKUnit.assertEqual(color.b, 0, "Color.b not properly parsed"); + TKUnit.assertEqual(color.hex, "#FF0000", "Color.hex not properly parsed"); + TKUnit.assertEqual(color.argb, _parseArgb(255, 255, 0, 0), "Color.argb not properly parsed"); } export var test_ShortHex_Color = function () { @@ -32,12 +32,12 @@ export var test_ShortHex_Color = function () { var color = new Color("#F80"); // ``` // - TKUnit.assert(color.a === 255, "Color.a not properly parsed"); - TKUnit.assert(color.r === 255, "Color.r not properly parsed"); - TKUnit.assert(color.g === 136, "Color.g not properly parsed"); // 0x88 == 136 - TKUnit.assert(color.b === 0, "Color.b not properly parsed"); - TKUnit.assert(color.hex === "#FF8800", "Color.hex not properly parsed"); - TKUnit.assert(color.argb === _parseArgb(255, 255, 136, 0), "Color.argb not properly parsed"); + TKUnit.assertEqual(color.a, 255, "Color.a not properly parsed"); + TKUnit.assertEqual(color.r, 255, "Color.r not properly parsed"); + TKUnit.assertEqual(color.g, 136, "Color.g not properly parsed"); // 0x88 == 136 + TKUnit.assertEqual(color.b, 0, "Color.b not properly parsed"); + TKUnit.assertEqual(color.hex, "#FF8800", "Color.hex not properly parsed"); + TKUnit.assertEqual(color.argb, _parseArgb(255, 255, 136, 0), "Color.argb not properly parsed"); } export var test_Argb_Color = function () { @@ -48,12 +48,12 @@ export var test_Argb_Color = function () { var color = new Color(100, 255, 100, 100); // ``` // - TKUnit.assert(color.a === 100, "Color.a not properly parsed"); - TKUnit.assert(color.r === 255, "Color.r not properly parsed"); - TKUnit.assert(color.g === 100, "Color.g not properly parsed"); - TKUnit.assert(color.b === 100, "Color.b not properly parsed"); - TKUnit.assert(color.hex === _buildHex(100, 255, 100, 100), "Color.hex not properly parsed"); - TKUnit.assert(color.argb === _parseArgb(100, 255, 100, 100), "Color.argb not properly parsed"); + TKUnit.assertEqual(color.a, 100, "Color.a not properly parsed"); + TKUnit.assertEqual(color.r, 255, "Color.r not properly parsed"); + TKUnit.assertEqual(color.g, 100, "Color.g not properly parsed"); + TKUnit.assertEqual(color.b, 100, "Color.b not properly parsed"); + TKUnit.assertEqual(color.hex, _buildHex(100, 255, 100, 100), "Color.hex not properly parsed"); + TKUnit.assertEqual(color.argb, _parseArgb(100, 255, 100, 100), "Color.argb not properly parsed"); } export var test_ArgbInt_Color = function () { @@ -65,12 +65,46 @@ export var test_ArgbInt_Color = function () { var color = new Color(argb); // ``` // - TKUnit.assert(color.a === 100, "Color.a not properly parsed"); - TKUnit.assert(color.r === 100, "Color.r not properly parsed"); - TKUnit.assert(color.g === 100, "Color.g not properly parsed"); - TKUnit.assert(color.b === 100, "Color.b not properly parsed"); - TKUnit.assert(color.hex === _buildHex(100, 100, 100, 100), "Color.hex not properly parsed"); - TKUnit.assert(color.argb === _parseArgb(100, 100, 100, 100), "Color.argb not properly parsed"); + TKUnit.assertEqual(color.a, 100, "Color.a not properly parsed"); + TKUnit.assertEqual(color.r, 100, "Color.r not properly parsed"); + TKUnit.assertEqual(color.g, 100, "Color.g not properly parsed"); + TKUnit.assertEqual(color.b, 100, "Color.b not properly parsed"); + TKUnit.assertEqual(color.hex, _buildHex(100, 100, 100, 100), "Color.hex not properly parsed"); + TKUnit.assertEqual(color.argb, _parseArgb(100, 100, 100, 100), "Color.argb not properly parsed"); +} + +export var test_rgb_Color_CSS = function () { + // + // ### Creating a Color from four RGB values + // ``` JavaScript + //// Creates the color with 255 red, 100 green, 100 blue + var color = new Color("rgb(255, 100, 100)"); + // ``` + // + TKUnit.assertEqual(color.a, 255, "Color.a not properly parsed"); + TKUnit.assertEqual(color.r, 255, "Color.r not properly parsed"); + TKUnit.assertEqual(color.g, 100, "Color.g not properly parsed"); + TKUnit.assertEqual(color.b, 100, "Color.b not properly parsed"); + TKUnit.assertEqual(color.hex, _buildHex(255, 255, 100, 100), "Color.hex not properly parsed"); + TKUnit.assertEqual(color.argb, _parseArgb(255, 255, 100, 100), "Color.argb not properly parsed"); +} + +export var test_rgba_Color_CSS = function () { + var alpha = 0.5; + var expected = Math.round(alpha * 255); + // + // ### Creating a Color from four RGB values + // ``` JavaScript + //// Creates the color with 255 red, 100 green, 100 blue and 0 alpha + var color = new Color(`rgba(255, 100, 100, ${alpha})`); + // ``` + // + TKUnit.assertEqual(color.a, expected, "Color.a not properly parsed"); + TKUnit.assertEqual(color.r, 255, "Color.r not properly parsed"); + TKUnit.assertEqual(color.g, 100, "Color.g not properly parsed"); + TKUnit.assertEqual(color.b, 100, "Color.b not properly parsed"); + TKUnit.assertEqual(color.hex, _buildHex(expected, 255, 100, 100), "Color.hex not properly parsed"); + TKUnit.assertEqual(color.argb, _parseArgb(expected, 255, 100, 100), "Color.argb not properly parsed"); } var _buildHex = function (a: number, r: number, g: number, b: number): string { diff --git a/color/color-common.ts b/color/color-common.ts index a7270eac5..9ad179625 100644 --- a/color/color-common.ts +++ b/color/color-common.ts @@ -18,15 +18,18 @@ export class Color implements definition.Color { if (arguments.length === 1) { var arg = arguments[0]; if (types.isString(arg)) { - if (knownColors.isKnownName(arg)) { + if (isRgbOrRgba(arg)) { + this._argb = argbFromRgbOrRgba(arg); + } else if (knownColors.isKnownName(arg)) { // The parameter is a known color name this._hex = knownColors.getKnownColor(arg); this._name = arg; + this._argb = this._argbFromString(this._hex); } else { // The parameter is a "#AARRGGBB" formatted string this._hex = this._normalizeHex(arg); + this._argb = this._argbFromString(this._hex); } - this._argb = this._argbFromString(this._hex); } else if (types.isNumber(arg)) { // The parameter is a 32-bit unsigned integer where each 8 bits specify a color component this._argb = arg; @@ -121,7 +124,7 @@ export class Color implements definition.Color { return true; } - return HEX_REGEX.test(value); + return HEX_REGEX.test(value) || isRgbOrRgba(value); } private _buildHex(): string { @@ -158,10 +161,44 @@ export class Color implements definition.Color { if (hexStr.charAt(0) === AMP && hexStr.length === 4) { // Duplicate each char after the #, so "#123" becomes "#112233" hexStr = hexStr.charAt(0) - + hexStr.charAt(1) + hexStr.charAt(1) - + hexStr.charAt(2) + hexStr.charAt(2) - + hexStr.charAt(3) + hexStr.charAt(3); + + hexStr.charAt(1) + hexStr.charAt(1) + + hexStr.charAt(2) + hexStr.charAt(2) + + hexStr.charAt(3) + hexStr.charAt(3); } return hexStr; } } + +function isRgbOrRgba(value: string): boolean { + var toLower = value.toLowerCase(); + return (toLower.indexOf("rgb(") === 0 || toLower.indexOf("rgba(") === 0) && toLower.indexOf(")") === (toLower.length - 1); +} + +function argbFromRgbOrRgba(value: string): number { + var toLower = value.toLowerCase(); + var parts = toLower.replace("rgba(", "").replace("rgb(", "").replace(")", "").trim().split(","); + + var r = 255, + g = 255, + b = 255, + a = 255; + + if (parts[0]) { + r = parseInt(parts[0].trim()); + } + + if (parts[1]) { + g = parseInt(parts[1].trim()); + } + + if (parts[2]) { + b = parseInt(parts[2].trim()); + } + + if (parts[3]) { + a = Math.round(parseFloat(parts[3].trim()) * 255); + } + + // Format is ARGB, so alpha takes the first 8 bits, red the next, green the next and the last 8 bits are for the blue component + return (a << 24) | (r << 16) | (g << 8) | b; +} \ No newline at end of file