11b2b223b515c2a2e68430420f6adbfda892844d07cc78b19f78ef873983e782c0d0088c0e86bbc96ae60f2b531fa2ff729e6fc7b8e1982cdb882f90d70dc3 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.numberInputToObject = exports.parseIntFromHex = exports.convertHexToDecimal = exports.convertDecimalToHex = exports.rgbaToArgbHex = exports.rgbaToHex = exports.rgbToHex = exports.hsvToRgb = exports.rgbToHsv = exports.hslToRgb = exports.rgbToHsl = exports.rgbToRgb = void 0;
  4. var util_js_1 = require("./util.js");
  5. // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
  6. // <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
  7. /**
  8. * Handle bounds / percentage checking to conform to CSS color spec
  9. * <http://www.w3.org/TR/css3-color/>
  10. * *Assumes:* r, g, b in [0, 255] or [0, 1]
  11. * *Returns:* { r, g, b } in [0, 255]
  12. */
  13. function rgbToRgb(r, g, b) {
  14. return {
  15. r: (0, util_js_1.bound01)(r, 255) * 255,
  16. g: (0, util_js_1.bound01)(g, 255) * 255,
  17. b: (0, util_js_1.bound01)(b, 255) * 255,
  18. };
  19. }
  20. exports.rgbToRgb = rgbToRgb;
  21. /**
  22. * Converts an RGB color value to HSL.
  23. * *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
  24. * *Returns:* { h, s, l } in [0,1]
  25. */
  26. function rgbToHsl(r, g, b) {
  27. r = (0, util_js_1.bound01)(r, 255);
  28. g = (0, util_js_1.bound01)(g, 255);
  29. b = (0, util_js_1.bound01)(b, 255);
  30. var max = Math.max(r, g, b);
  31. var min = Math.min(r, g, b);
  32. var h = 0;
  33. var s = 0;
  34. var l = (max + min) / 2;
  35. if (max === min) {
  36. s = 0;
  37. h = 0; // achromatic
  38. }
  39. else {
  40. var d = max - min;
  41. s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
  42. switch (max) {
  43. case r:
  44. h = (g - b) / d + (g < b ? 6 : 0);
  45. break;
  46. case g:
  47. h = (b - r) / d + 2;
  48. break;
  49. case b:
  50. h = (r - g) / d + 4;
  51. break;
  52. default:
  53. break;
  54. }
  55. h /= 6;
  56. }
  57. return { h: h, s: s, l: l };
  58. }
  59. exports.rgbToHsl = rgbToHsl;
  60. function hue2rgb(p, q, t) {
  61. if (t < 0) {
  62. t += 1;
  63. }
  64. if (t > 1) {
  65. t -= 1;
  66. }
  67. if (t < 1 / 6) {
  68. return p + (q - p) * (6 * t);
  69. }
  70. if (t < 1 / 2) {
  71. return q;
  72. }
  73. if (t < 2 / 3) {
  74. return p + (q - p) * (2 / 3 - t) * 6;
  75. }
  76. return p;
  77. }
  78. /**
  79. * Converts an HSL color value to RGB.
  80. *
  81. * *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
  82. * *Returns:* { r, g, b } in the set [0, 255]
  83. */
  84. function hslToRgb(h, s, l) {
  85. var r;
  86. var g;
  87. var b;
  88. h = (0, util_js_1.bound01)(h, 360);
  89. s = (0, util_js_1.bound01)(s, 100);
  90. l = (0, util_js_1.bound01)(l, 100);
  91. if (s === 0) {
  92. // achromatic
  93. g = l;
  94. b = l;
  95. r = l;
  96. }
  97. else {
  98. var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
  99. var p = 2 * l - q;
  100. r = hue2rgb(p, q, h + 1 / 3);
  101. g = hue2rgb(p, q, h);
  102. b = hue2rgb(p, q, h - 1 / 3);
  103. }
  104. return { r: r * 255, g: g * 255, b: b * 255 };
  105. }
  106. exports.hslToRgb = hslToRgb;
  107. /**
  108. * Converts an RGB color value to HSV
  109. *
  110. * *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
  111. * *Returns:* { h, s, v } in [0,1]
  112. */
  113. function rgbToHsv(r, g, b) {
  114. r = (0, util_js_1.bound01)(r, 255);
  115. g = (0, util_js_1.bound01)(g, 255);
  116. b = (0, util_js_1.bound01)(b, 255);
  117. var max = Math.max(r, g, b);
  118. var min = Math.min(r, g, b);
  119. var h = 0;
  120. var v = max;
  121. var d = max - min;
  122. var s = max === 0 ? 0 : d / max;
  123. if (max === min) {
  124. h = 0; // achromatic
  125. }
  126. else {
  127. switch (max) {
  128. case r:
  129. h = (g - b) / d + (g < b ? 6 : 0);
  130. break;
  131. case g:
  132. h = (b - r) / d + 2;
  133. break;
  134. case b:
  135. h = (r - g) / d + 4;
  136. break;
  137. default:
  138. break;
  139. }
  140. h /= 6;
  141. }
  142. return { h: h, s: s, v: v };
  143. }
  144. exports.rgbToHsv = rgbToHsv;
  145. /**
  146. * Converts an HSV color value to RGB.
  147. *
  148. * *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
  149. * *Returns:* { r, g, b } in the set [0, 255]
  150. */
  151. function hsvToRgb(h, s, v) {
  152. h = (0, util_js_1.bound01)(h, 360) * 6;
  153. s = (0, util_js_1.bound01)(s, 100);
  154. v = (0, util_js_1.bound01)(v, 100);
  155. var i = Math.floor(h);
  156. var f = h - i;
  157. var p = v * (1 - s);
  158. var q = v * (1 - f * s);
  159. var t = v * (1 - (1 - f) * s);
  160. var mod = i % 6;
  161. var r = [v, q, p, p, t, v][mod];
  162. var g = [t, v, v, q, p, p][mod];
  163. var b = [p, p, t, v, v, q][mod];
  164. return { r: r * 255, g: g * 255, b: b * 255 };
  165. }
  166. exports.hsvToRgb = hsvToRgb;
  167. /**
  168. * Converts an RGB color to hex
  169. *
  170. * Assumes r, g, and b are contained in the set [0, 255]
  171. * Returns a 3 or 6 character hex
  172. */
  173. function rgbToHex(r, g, b, allow3Char) {
  174. var hex = [
  175. (0, util_js_1.pad2)(Math.round(r).toString(16)),
  176. (0, util_js_1.pad2)(Math.round(g).toString(16)),
  177. (0, util_js_1.pad2)(Math.round(b).toString(16)),
  178. ];
  179. // Return a 3 character hex if possible
  180. if (allow3Char &&
  181. hex[0].startsWith(hex[0].charAt(1)) &&
  182. hex[1].startsWith(hex[1].charAt(1)) &&
  183. hex[2].startsWith(hex[2].charAt(1))) {
  184. return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
  185. }
  186. return hex.join('');
  187. }
  188. exports.rgbToHex = rgbToHex;
  189. /**
  190. * Converts an RGBA color plus alpha transparency to hex
  191. *
  192. * Assumes r, g, b are contained in the set [0, 255] and
  193. * a in [0, 1]. Returns a 4 or 8 character rgba hex
  194. */
  195. // eslint-disable-next-line max-params
  196. function rgbaToHex(r, g, b, a, allow4Char) {
  197. var hex = [
  198. (0, util_js_1.pad2)(Math.round(r).toString(16)),
  199. (0, util_js_1.pad2)(Math.round(g).toString(16)),
  200. (0, util_js_1.pad2)(Math.round(b).toString(16)),
  201. (0, util_js_1.pad2)(convertDecimalToHex(a)),
  202. ];
  203. // Return a 4 character hex if possible
  204. if (allow4Char &&
  205. hex[0].startsWith(hex[0].charAt(1)) &&
  206. hex[1].startsWith(hex[1].charAt(1)) &&
  207. hex[2].startsWith(hex[2].charAt(1)) &&
  208. hex[3].startsWith(hex[3].charAt(1))) {
  209. return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
  210. }
  211. return hex.join('');
  212. }
  213. exports.rgbaToHex = rgbaToHex;
  214. /**
  215. * Converts an RGBA color to an ARGB Hex8 string
  216. * Rarely used, but required for "toFilter()"
  217. */
  218. function rgbaToArgbHex(r, g, b, a) {
  219. var hex = [
  220. (0, util_js_1.pad2)(convertDecimalToHex(a)),
  221. (0, util_js_1.pad2)(Math.round(r).toString(16)),
  222. (0, util_js_1.pad2)(Math.round(g).toString(16)),
  223. (0, util_js_1.pad2)(Math.round(b).toString(16)),
  224. ];
  225. return hex.join('');
  226. }
  227. exports.rgbaToArgbHex = rgbaToArgbHex;
  228. /** Converts a decimal to a hex value */
  229. function convertDecimalToHex(d) {
  230. return Math.round(parseFloat(d) * 255).toString(16);
  231. }
  232. exports.convertDecimalToHex = convertDecimalToHex;
  233. /** Converts a hex value to a decimal */
  234. function convertHexToDecimal(h) {
  235. return parseIntFromHex(h) / 255;
  236. }
  237. exports.convertHexToDecimal = convertHexToDecimal;
  238. /** Parse a base-16 hex value into a base-10 integer */
  239. function parseIntFromHex(val) {
  240. return parseInt(val, 16);
  241. }
  242. exports.parseIntFromHex = parseIntFromHex;
  243. function numberInputToObject(color) {
  244. return {
  245. r: color >> 16,
  246. g: (color & 0xff00) >> 8,
  247. b: color & 0xff,
  248. };
  249. }
  250. exports.numberInputToObject = numberInputToObject;