Index: charted/lib/core/utils/color.dart |
diff --git a/charted/lib/core/utils/color.dart b/charted/lib/core/utils/color.dart |
deleted file mode 100644 |
index bac12ec22f63e80abb1d0897000e70f3f756921e..0000000000000000000000000000000000000000 |
--- a/charted/lib/core/utils/color.dart |
+++ /dev/null |
@@ -1,307 +0,0 @@ |
-// |
-// Copyright 2014 Google Inc. All rights reserved. |
-// |
-// Use of this source code is governed by a BSD-style |
-// license that can be found in the LICENSE file or at |
-// https://developers.google.com/open-source/licenses/bsd |
-// |
- |
-part of charted.core.utils; |
- |
-/// Represents a single color for use in visualizations. Currently, supports |
-/// representing and conversion between RGB, RGBA, HSL, HSLA and hex formats. |
-class Color { |
- // Internal representation of RGB |
- int _r = 0; |
- int _g = 0; |
- int _b = 0; |
- |
- // Internal representation of HSL |
- int _h = 0; // 0 <= _h <= 360 |
- int _s = 0; // 0 <= _s <= 100 |
- int _l = 0; // 0 <= _l <= 100 |
- |
- // Alpha value for this color |
- double _a = 0.0; |
- |
- // Flags to indicate the color-space for which values are readily available. |
- bool _hasRgbColors = false; |
- bool _hasHslColors = false; |
- |
- /// Create an instance from RGB colors. |
- Color.fromRgba(this._r, this._g, this._b, this._a) : _hasRgbColors = true; |
- |
- /// Create an instance using a string representing color in RGB color space. |
- /// The input string, [value], can be one of the following formats: |
- /// |
- /// #RGB |
- /// #RRGGBB |
- /// |
- /// rgb(R, G, B) |
- /// rgba(R, G, B, A) |
- /// |
- /// R, G and B represent intensities of Red, Green and Blue channels and A |
- /// represents the alpha channel (transparency) |
- /// |
- /// When using these formats: |
- /// 0 <= R,G,B <= 255 |
- /// 0 <= A <= 1.0 |
- factory Color.fromRgbString(String value) => |
- isHexColorString(value) ? _fromHexString(value) : _fromRgbString(value); |
- |
- /// Create an instance from HSL colors. |
- Color.fromHsla(this._h, this._s, this._l, this._a) : _hasHslColors = true; |
- |
- /// Create an instance using a string representing color in HSL color space. |
- /// The input string, [value], can be in one of the following formats: |
- /// |
- /// hsl(H, S%, L%) |
- /// hsla(H, S%, L%, A) |
- /// |
- /// H, S and L represent Hue, Saturation and Luminosity respectively. |
- /// |
- /// When using these formats: |
- /// 0 <= H <= 360 |
- /// 0 <= S,L <= 100 |
- /// 0 <= A <= 1.0 |
- factory Color.fromHslString(String value) => _fromHslString(value); |
- |
- /// Ensures that the RGB values are available. If they aren't already |
- /// available, they are computed from the HSA values. |
- /// |
- /// Based on color.js from Google Closure library |
- void toRgb() { |
- if (_hasRgbColors) return; |
- |
- num _hueToRgb(num v1, num v2, num vH) { |
- vH %= 1.0; |
- |
- if ((6 * vH) < 1) { |
- return (v1 + (v2 - v1) * 6 * vH); |
- } else if (2 * vH < 1) { |
- return v2; |
- } else if (3 * vH < 2) { |
- return (v1 + (v2 - v1) * ((2 / 3) - vH) * 6); |
- } |
- return v1; |
- } |
- |
- final h = _h / 360; |
- |
- if (_s == 0) { |
- _r = _g = _b = (_l * 255).round(); |
- } else { |
- var temp1 = 0; |
- var temp2 = 0; |
- if (_l < 0.5) { |
- temp2 = _l * (1 + _s); |
- } else { |
- temp2 = _l + _s - (_s * _l); |
- } |
- temp1 = 2 * _l - temp2; |
- _r = (255 * _hueToRgb(temp1, temp2, h + (1 / 3))).round(); |
- _g = (255 * _hueToRgb(temp1, temp2, h)).round(); |
- _b = (255 * _hueToRgb(temp1, temp2, h - (1 / 3))).round(); |
- } |
- } |
- |
- /// Ensures that the HSA values are available. If they aren't already |
- /// available, they are computed from the RGB values. |
- /// |
- /// Based on color.js in Google Closure library. |
- void toHsl() { |
- if (_hasHslColors) return; |
- |
- final r = _r / 255; |
- final g = _g / 255; |
- final b = _b / 255; |
- final max = math.max(r, math.max(g, b)); |
- final min = math.min(r, math.min(g, b)); |
- |
- double l = (max + min) / 2; |
- double h = 0.0; |
- double s = 0.0; |
- |
- // If max and min are equal, the color is gray (h = s = 0) |
- if (max != min) { |
- if (max == r) { |
- h = 60 * (g - b) / (max - min); |
- } else if (max == g) { |
- h = 60 * (b - r) / (max - min) + 120; |
- } else if (max == b) { |
- h = 60 * (r - g) / (max - min) + 240; |
- } |
- |
- if (0 < l && l <= 0.5) { |
- s = (max - min) / (2 * l); |
- } else { |
- s = (max - min) / (2 - 2 * l); |
- } |
- } |
- |
- _h = (h % 360).floor(); |
- _s = (s * 100).floor(); |
- _l = (l * 100).floor(); |
- } |
- |
- /// Returns a hex string of the format '#RRGGBB' representing this color. |
- /// A new string will be returned each time this function is called. |
- String toHexString() { |
- toRgb(); |
- return rgbToHexString(_r, _g, _b); |
- } |
- |
- /// Returns a string similar to 'rgba(r, g, b, a)' representing this color. |
- /// A new string will be returned each time this function is called. |
- String toRgbaString() { |
- toRgb(); |
- return 'rgba($_r,$_g,$_b,$_a)'; |
- } |
- |
- /// Returns a string similar to 'hsla(h, s, l, a)' representing this color. |
- /// A new string will be returned each time this function is called. |
- String toHslaString() { |
- toHsl(); |
- return 'hsla($_h,$_s%,$_l%,$_a)'; |
- } |
- |
- /// Intensity of red from RGB. |
- /// Computes RGB values if they are not already available. |
- int get r { |
- toRgb(); |
- return _r; |
- } |
- |
- /// Intensity of green from RGB |
- /// Computes RGB values if they are not already available. |
- int get g { |
- toRgb(); |
- return _g; |
- } |
- |
- /// Intensity of blue from RGB. |
- /// Computes RGB values if they are not already available. |
- int get b { |
- toRgb(); |
- return _b; |
- } |
- |
- /// Hue value from HSL representation. |
- /// Computes HSL values if they are not already available. |
- int get h { |
- toHsl(); |
- return _h; |
- } |
- |
- /// Saturation value from HSL representation. |
- /// Computes HSL values if they are not already available. |
- int get s { |
- toHsl(); |
- return _s; |
- } |
- |
- /// Luminosity value from HSL representation. |
- /// Computes HSL values if they are not already available. |
- int get l { |
- toHsl(); |
- return _l; |
- } |
- |
- /// Alpha value used by both RGB and HSL representations. |
- double get a => _a; |
- |
- @override |
- String toString() => _hasRgbColors ? toRgbaString() : toHslaString(); |
- |
- @override |
- int get hashCode => toString().hashCode; |
- |
- /// Given RGB values create hex string from it. |
- static String rgbToHexString(int r, int g, int b) { |
- String _hexify(int v) { |
- return v < 0x10 |
- ? "0" + math.max(0, v).toInt().toRadixString(16) |
- : math.min(255, v).toInt().toRadixString(16); |
- } |
- return '#${_hexify(r)}${_hexify(g)}${_hexify(b)}'; |
- } |
- |
- /// RegExp to test if a given string is a hex color string |
- static final RegExp hexColorRegExp = |
- new RegExp(r'^#([0-9a-f]{3}){1,2}$', caseSensitive: false); |
- |
- /// Tests if [str] is a hex color |
- static bool isHexColorString(String str) => hexColorRegExp.hasMatch(str); |
- |
- /// RegExp to test if a given string is rgb() or rgba() color. |
- static final RegExp rgbaColorRegExp = new RegExp( |
- r'^(rgb|rgba)?\(\d+,\s?\d+,\s?\d+(,\s?(0|1)?(\.\d)?\d*)?\)$', |
- caseSensitive: false); |
- |
- /// Tests if [str] is a color represented by rgb() or rgba() or hex string |
- static bool isRgbColorString(String str) => |
- isHexColorString(str) || rgbaColorRegExp.hasMatch(str); |
- |
- /// RegExp to test if a given string is hsl() or hsla() color. |
- static final RegExp hslaColorRegExp = new RegExp( |
- r'^(hsl|hsla)?\(\d+,\s?\d+%,\s?\d+%(,\s?(0|1)?(\.\d)?\d*)?\)$', |
- caseSensitive: false); |
- |
- /// Tests if [str] is a color represented by hsl() or hsla() |
- static bool isHslColorString(String str) => hslaColorRegExp.hasMatch(str); |
- |
- /// Create an instance using the passed RGB string. |
- static Color _fromRgbString(String value) { |
- int pos = |
- (value.startsWith('rgb(') || value.startsWith('RGB(')) ? 4 : |
- (value.startsWith('rgba(') || value.startsWith('RGBA(')) ? 5 : 0; |
- if (pos != 0) { |
- final params = value.substring(pos, value.length - 1).split(','); |
- int r = int.parse(params[0]), |
- g = int.parse(params[1]), |
- b = int.parse(params[2]); |
- double a = params.length == 3 ? 1.0 : double.parse(params[3]); |
- return new Color.fromRgba(r, g, b, a); |
- } |
- return new Color.fromRgba(0, 0, 0, 0.0); |
- } |
- |
- /// Create an instance using the passed HEX string. |
- /// Assumes that the string starts with a '#' before HEX chars. |
- static Color _fromHexString(String hex) { |
- if (isNullOrEmpty(hex) || (hex.length != 4 && hex.length != 7)) { |
- return new Color.fromRgba(0, 0, 0, 0.0); |
- } |
- int rgb = 0; |
- |
- hex = hex.substring(1); |
- if (hex.length == 3) { |
- for (final char in hex) { |
- final val = int.parse(char, radix: 16); |
- rgb = (rgb * 16 + val ) * 16 + val; |
- } |
- } |
- else if (hex.length == 6){ |
- rgb = int.parse(hex, radix: 16); |
- } |
- |
- return new Color.fromRgba( |
- (rgb & 0xff0000) >> 0x10, (rgb & 0xff00) >> 8, (rgb & 0xff), 1.0); |
- } |
- |
- /// Create an instance using the passed HSL color string. |
- static Color _fromHslString(String value) { |
- int pos = |
- (value.startsWith('hsl(') || value.startsWith('HSL(')) ? 4 : |
- (value.startsWith('hsla(') || value.startsWith('HSLA(')) ? 5 : 0; |
- if (pos != 0) { |
- final params = value.substring(pos, value.length - 1).split(','); |
- int h = int.parse(params[0]), |
- s = int.parse(params[1]), |
- l = int.parse(params[2]); |
- double a = params.length == 3 ? 1.0 : double.parse(params[3]); |
- return new Color.fromHsla(h, s, l, a); |
- } |
- return new Color.fromHsla(0, 0, 0, 0.0); |
- } |
-} |