color.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. /**
  2. * DevExtreme (color.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var standardColorNames = {
  11. aliceblue: "f0f8ff",
  12. antiquewhite: "faebd7",
  13. aqua: "00ffff",
  14. aquamarine: "7fffd4",
  15. azure: "f0ffff",
  16. beige: "f5f5dc",
  17. bisque: "ffe4c4",
  18. black: "000000",
  19. blanchedalmond: "ffebcd",
  20. blue: "0000ff",
  21. blueviolet: "8a2be2",
  22. brown: "a52a2a",
  23. burlywood: "deb887",
  24. cadetblue: "5f9ea0",
  25. chartreuse: "7fff00",
  26. chocolate: "d2691e",
  27. coral: "ff7f50",
  28. cornflowerblue: "6495ed",
  29. cornsilk: "fff8dc",
  30. crimson: "dc143c",
  31. cyan: "00ffff",
  32. darkblue: "00008b",
  33. darkcyan: "008b8b",
  34. darkgoldenrod: "b8860b",
  35. darkgray: "a9a9a9",
  36. darkgreen: "006400",
  37. darkkhaki: "bdb76b",
  38. darkmagenta: "8b008b",
  39. darkolivegreen: "556b2f",
  40. darkorange: "ff8c00",
  41. darkorchid: "9932cc",
  42. darkred: "8b0000",
  43. darksalmon: "e9967a",
  44. darkseagreen: "8fbc8f",
  45. darkslateblue: "483d8b",
  46. darkslategray: "2f4f4f",
  47. darkturquoise: "00ced1",
  48. darkviolet: "9400d3",
  49. deeppink: "ff1493",
  50. deepskyblue: "00bfff",
  51. dimgray: "696969",
  52. dodgerblue: "1e90ff",
  53. feldspar: "d19275",
  54. firebrick: "b22222",
  55. floralwhite: "fffaf0",
  56. forestgreen: "228b22",
  57. fuchsia: "ff00ff",
  58. gainsboro: "dcdcdc",
  59. ghostwhite: "f8f8ff",
  60. gold: "ffd700",
  61. goldenrod: "daa520",
  62. gray: "808080",
  63. green: "008000",
  64. greenyellow: "adff2f",
  65. honeydew: "f0fff0",
  66. hotpink: "ff69b4",
  67. indianred: "cd5c5c",
  68. indigo: "4b0082",
  69. ivory: "fffff0",
  70. khaki: "f0e68c",
  71. lavender: "e6e6fa",
  72. lavenderblush: "fff0f5",
  73. lawngreen: "7cfc00",
  74. lemonchiffon: "fffacd",
  75. lightblue: "add8e6",
  76. lightcoral: "f08080",
  77. lightcyan: "e0ffff",
  78. lightgoldenrodyellow: "fafad2",
  79. lightgrey: "d3d3d3",
  80. lightgreen: "90ee90",
  81. lightpink: "ffb6c1",
  82. lightsalmon: "ffa07a",
  83. lightseagreen: "20b2aa",
  84. lightskyblue: "87cefa",
  85. lightslateblue: "8470ff",
  86. lightslategray: "778899",
  87. lightsteelblue: "b0c4de",
  88. lightyellow: "ffffe0",
  89. lime: "00ff00",
  90. limegreen: "32cd32",
  91. linen: "faf0e6",
  92. magenta: "ff00ff",
  93. maroon: "800000",
  94. mediumaquamarine: "66cdaa",
  95. mediumblue: "0000cd",
  96. mediumorchid: "ba55d3",
  97. mediumpurple: "9370d8",
  98. mediumseagreen: "3cb371",
  99. mediumslateblue: "7b68ee",
  100. mediumspringgreen: "00fa9a",
  101. mediumturquoise: "48d1cc",
  102. mediumvioletred: "c71585",
  103. midnightblue: "191970",
  104. mintcream: "f5fffa",
  105. mistyrose: "ffe4e1",
  106. moccasin: "ffe4b5",
  107. navajowhite: "ffdead",
  108. navy: "000080",
  109. oldlace: "fdf5e6",
  110. olive: "808000",
  111. olivedrab: "6b8e23",
  112. orange: "ffa500",
  113. orangered: "ff4500",
  114. orchid: "da70d6",
  115. palegoldenrod: "eee8aa",
  116. palegreen: "98fb98",
  117. paleturquoise: "afeeee",
  118. palevioletred: "d87093",
  119. papayawhip: "ffefd5",
  120. peachpuff: "ffdab9",
  121. peru: "cd853f",
  122. pink: "ffc0cb",
  123. plum: "dda0dd",
  124. powderblue: "b0e0e6",
  125. purple: "800080",
  126. rebeccapurple: "663399",
  127. red: "ff0000",
  128. rosybrown: "bc8f8f",
  129. royalblue: "4169e1",
  130. saddlebrown: "8b4513",
  131. salmon: "fa8072",
  132. sandybrown: "f4a460",
  133. seagreen: "2e8b57",
  134. seashell: "fff5ee",
  135. sienna: "a0522d",
  136. silver: "c0c0c0",
  137. skyblue: "87ceeb",
  138. slateblue: "6a5acd",
  139. slategray: "708090",
  140. snow: "fffafa",
  141. springgreen: "00ff7f",
  142. steelblue: "4682b4",
  143. tan: "d2b48c",
  144. teal: "008080",
  145. thistle: "d8bfd8",
  146. tomato: "ff6347",
  147. turquoise: "40e0d0",
  148. violet: "ee82ee",
  149. violetred: "d02090",
  150. wheat: "f5deb3",
  151. white: "ffffff",
  152. whitesmoke: "f5f5f5",
  153. yellow: "ffff00",
  154. yellowgreen: "9acd32"
  155. };
  156. var standardColorTypes = [{
  157. re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
  158. process: function(colorString) {
  159. return [parseInt(colorString[1], 10), parseInt(colorString[2], 10), parseInt(colorString[3], 10)]
  160. }
  161. }, {
  162. re: /^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*\.*\d+)\)$/,
  163. process: function(colorString) {
  164. return [parseInt(colorString[1], 10), parseInt(colorString[2], 10), parseInt(colorString[3], 10), parseFloat(colorString[4])]
  165. }
  166. }, {
  167. re: /^#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})$/,
  168. process: function(colorString) {
  169. return [parseInt(colorString[1], 16), parseInt(colorString[2], 16), parseInt(colorString[3], 16)]
  170. }
  171. }, {
  172. re: /^#([a-f0-9]{1})([a-f0-9]{1})([a-f0-9]{1})$/,
  173. process: function(colorString) {
  174. return [parseInt(colorString[1] + colorString[1], 16), parseInt(colorString[2] + colorString[2], 16), parseInt(colorString[3] + colorString[3], 16)]
  175. }
  176. }, {
  177. re: /^hsv\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
  178. process: function(colorString) {
  179. var h = parseInt(colorString[1], 10);
  180. var s = parseInt(colorString[2], 10);
  181. var v = parseInt(colorString[3], 10);
  182. var rgb = hsvToRgb(h, s, v);
  183. return [rgb[0], rgb[1], rgb[2], 1, [h, s, v]]
  184. }
  185. }, {
  186. re: /^hsl\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/,
  187. process: function(colorString) {
  188. var h = parseInt(colorString[1], 10);
  189. var s = parseInt(colorString[2], 10);
  190. var l = parseInt(colorString[3], 10);
  191. var rgb = hslToRgb(h, s, l);
  192. return [rgb[0], rgb[1], rgb[2], 1, null, [h, s, l]]
  193. }
  194. }];
  195. function Color(value) {
  196. this.baseColor = value;
  197. var color;
  198. if (value) {
  199. color = String(value).toLowerCase().replace(/ /g, "");
  200. color = standardColorNames[color] ? "#" + standardColorNames[color] : color;
  201. color = parseColor(color)
  202. }
  203. if (!color) {
  204. this.colorIsInvalid = true
  205. }
  206. color = color || {};
  207. this.r = normalize(color[0]);
  208. this.g = normalize(color[1]);
  209. this.b = normalize(color[2]);
  210. this.a = normalize(color[3], 1, 1);
  211. if (color[4]) {
  212. this.hsv = {
  213. h: color[4][0],
  214. s: color[4][1],
  215. v: color[4][2]
  216. }
  217. } else {
  218. this.hsv = toHsvFromRgb(this.r, this.g, this.b)
  219. }
  220. if (color[5]) {
  221. this.hsl = {
  222. h: color[5][0],
  223. s: color[5][1],
  224. l: color[5][2]
  225. }
  226. } else {
  227. this.hsl = toHslFromRgb(this.r, this.g, this.b)
  228. }
  229. }
  230. function parseColor(color) {
  231. if ("transparent" === color) {
  232. return [0, 0, 0, 0]
  233. }
  234. var i = 0;
  235. var ii = standardColorTypes.length;
  236. var str;
  237. for (; i < ii; ++i) {
  238. str = standardColorTypes[i].re.exec(color);
  239. if (str) {
  240. return standardColorTypes[i].process(str)
  241. }
  242. }
  243. return null
  244. }
  245. function normalize(colorComponent, def, max) {
  246. def = def || 0;
  247. max = max || 255;
  248. return colorComponent < 0 || isNaN(colorComponent) ? def : colorComponent > max ? max : colorComponent
  249. }
  250. function toHexFromRgb(r, g, b) {
  251. return "#" + (16777216 | r << 16 | g << 8 | b).toString(16).slice(1)
  252. }
  253. function toHsvFromRgb(r, g, b) {
  254. var max = Math.max(r, g, b);
  255. var min = Math.min(r, g, b);
  256. var delta = max - min;
  257. var H;
  258. var S;
  259. var V;
  260. V = max;
  261. S = 0 === max ? 0 : 1 - min / max;
  262. if (max === min) {
  263. H = 0
  264. } else {
  265. switch (max) {
  266. case r:
  267. H = 60 * ((g - b) / delta);
  268. if (g < b) {
  269. H += 360
  270. }
  271. break;
  272. case g:
  273. H = 60 * ((b - r) / delta) + 120;
  274. break;
  275. case b:
  276. H = 60 * ((r - g) / delta) + 240
  277. }
  278. }
  279. S *= 100;
  280. V *= 100 / 255;
  281. return {
  282. h: Math.round(H),
  283. s: Math.round(S),
  284. v: Math.round(V)
  285. }
  286. }
  287. function hsvToRgb(h, s, v) {
  288. var r;
  289. var g;
  290. var b;
  291. var index = Math.floor(h % 360 / 60);
  292. var vMin = (100 - s) * v / 100;
  293. var a = (v - vMin) * (h % 60 / 60);
  294. var vInc = vMin + a;
  295. var vDec = v - a;
  296. switch (index) {
  297. case 0:
  298. r = v;
  299. g = vInc;
  300. b = vMin;
  301. break;
  302. case 1:
  303. r = vDec;
  304. g = v;
  305. b = vMin;
  306. break;
  307. case 2:
  308. r = vMin;
  309. g = v;
  310. b = vInc;
  311. break;
  312. case 3:
  313. r = vMin;
  314. g = vDec;
  315. b = v;
  316. break;
  317. case 4:
  318. r = vInc;
  319. g = vMin;
  320. b = v;
  321. break;
  322. case 5:
  323. r = v;
  324. g = vMin;
  325. b = vDec
  326. }
  327. return [Math.round(2.55 * r), Math.round(2.55 * g), Math.round(2.55 * b)]
  328. }
  329. function calculateHue(r, g, b, delta) {
  330. var max = Math.max(r, g, b);
  331. switch (max) {
  332. case r:
  333. return (g - b) / delta + (g < b ? 6 : 0);
  334. case g:
  335. return (b - r) / delta + 2;
  336. case b:
  337. return (r - g) / delta + 4
  338. }
  339. }
  340. function toHslFromRgb(r, g, b) {
  341. r = convertTo01Bounds(r, 255);
  342. g = convertTo01Bounds(g, 255);
  343. b = convertTo01Bounds(b, 255);
  344. var max = Math.max(r, g, b);
  345. var min = Math.min(r, g, b);
  346. var maxMinSum = max + min;
  347. var h;
  348. var s;
  349. var l = maxMinSum / 2;
  350. if (max === min) {
  351. h = s = 0
  352. } else {
  353. var delta = max - min;
  354. if (l > .5) {
  355. s = delta / (2 - maxMinSum)
  356. } else {
  357. s = delta / maxMinSum
  358. }
  359. h = calculateHue(r, g, b, delta);
  360. h /= 6
  361. }
  362. return {
  363. h: _round(360 * h),
  364. s: _round(100 * s),
  365. l: _round(100 * l)
  366. }
  367. }
  368. function makeColorTint(colorPart, h) {
  369. var colorTint = h;
  370. if ("r" === colorPart) {
  371. colorTint = h + 1 / 3
  372. }
  373. if ("b" === colorPart) {
  374. colorTint = h - 1 / 3
  375. }
  376. return colorTint
  377. }
  378. function modifyColorTint(colorTint) {
  379. if (colorTint < 0) {
  380. colorTint += 1
  381. }
  382. if (colorTint > 1) {
  383. colorTint -= 1
  384. }
  385. return colorTint
  386. }
  387. function hueToRgb(p, q, colorTint) {
  388. colorTint = modifyColorTint(colorTint);
  389. if (colorTint < 1 / 6) {
  390. return p + 6 * (q - p) * colorTint
  391. }
  392. if (colorTint < .5) {
  393. return q
  394. }
  395. if (colorTint < 2 / 3) {
  396. return p + (q - p) * (2 / 3 - colorTint) * 6
  397. }
  398. return p
  399. }
  400. function hslToRgb(h, s, l) {
  401. var r;
  402. var g;
  403. var b;
  404. h = convertTo01Bounds(h, 360);
  405. s = convertTo01Bounds(s, 100);
  406. l = convertTo01Bounds(l, 100);
  407. if (0 === s) {
  408. r = g = b = l
  409. } else {
  410. var q = l < .5 ? l * (1 + s) : l + s - l * s;
  411. var p = 2 * l - q;
  412. r = hueToRgb(p, q, makeColorTint("r", h));
  413. g = hueToRgb(p, q, makeColorTint("g", h));
  414. b = hueToRgb(p, q, makeColorTint("b", h))
  415. }
  416. return [_round(255 * r), _round(255 * g), _round(255 * b)]
  417. }
  418. function convertTo01Bounds(n, max) {
  419. n = Math.min(max, Math.max(0, parseFloat(n)));
  420. if (Math.abs(n - max) < 1e-6) {
  421. return 1
  422. }
  423. return n % max / parseFloat(max)
  424. }
  425. function isIntegerBetweenMinAndMax(number, min, max) {
  426. min = min || 0;
  427. max = max || 255;
  428. if (number % 1 !== 0 || number < min || number > max || "number" !== typeof number || isNaN(number)) {
  429. return false
  430. }
  431. return true
  432. }
  433. var _round = Math.round;
  434. Color.prototype = {
  435. constructor: Color,
  436. highlight: function(step) {
  437. step = step || 10;
  438. return this.alter(step).toHex()
  439. },
  440. darken: function(step) {
  441. step = step || 10;
  442. return this.alter(-step).toHex()
  443. },
  444. alter: function(step) {
  445. var result = new Color;
  446. result.r = normalize(this.r + step);
  447. result.g = normalize(this.g + step);
  448. result.b = normalize(this.b + step);
  449. return result
  450. },
  451. blend: function(blendColor, opacity) {
  452. var other = blendColor instanceof Color ? blendColor : new Color(blendColor);
  453. var result = new Color;
  454. result.r = normalize(_round(this.r * (1 - opacity) + other.r * opacity));
  455. result.g = normalize(_round(this.g * (1 - opacity) + other.g * opacity));
  456. result.b = normalize(_round(this.b * (1 - opacity) + other.b * opacity));
  457. return result
  458. },
  459. toHex: function() {
  460. return toHexFromRgb(this.r, this.g, this.b)
  461. },
  462. getPureColor: function() {
  463. var rgb = hsvToRgb(this.hsv.h, 100, 100);
  464. return new Color("rgb(" + rgb.join(",") + ")")
  465. },
  466. isValidHex: function(hex) {
  467. return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(hex)
  468. },
  469. isValidRGB: function(r, g, b) {
  470. if (!isIntegerBetweenMinAndMax(r) || !isIntegerBetweenMinAndMax(g) || !isIntegerBetweenMinAndMax(b)) {
  471. return false
  472. }
  473. return true
  474. },
  475. isValidAlpha: function(a) {
  476. if (isNaN(a) || a < 0 || a > 1 || "number" !== typeof a) {
  477. return false
  478. }
  479. return true
  480. },
  481. colorIsInvalid: false,
  482. fromHSL: function(hsl) {
  483. var color = new Color;
  484. var rgb = hslToRgb(hsl.h, hsl.s, hsl.l);
  485. color.r = rgb[0];
  486. color.g = rgb[1];
  487. color.b = rgb[2];
  488. return color
  489. }
  490. };
  491. module.exports = Color;