{"version":3,"file":"converter.cjs","sources":["../../src/converter.ts"],"sourcesContent":["import type { Vec3 } from \"./\";\n\nexport const DELTAE94_DIFF_STATUS = {\n\tNA: 0,\n\tPERFECT: 1,\n\tCLOSE: 2,\n\tGOOD: 10,\n\tSIMILAR: 50,\n};\n\n/**\n * Converts hex string to RGB\n * @param hex - The hex value you with to get the RGB value of\n * @returns an array in the order of `red, green, blue` numerical values\n */\nexport function hexToRgb(hex: string): Vec3 {\n\tconst m = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n\n\tif (!m) throw new RangeError(`'${hex}' is not a valid hex color`);\n\n\tif (!m[1] || !m[2] || !m[3])\n\t\tthrow new RangeError(`'${hex}' is not a valid hex color`);\n\n\treturn [m[1], m[2], m[3]].map((s) => parseInt(s, 16)) as Vec3;\n}\n\n/**\n * Given values for an RGB color convert to and return a valid HEX string\n * @param r - Red value in RGB\n * @param g - Green value in RGB\n * @param b - Blue value in RGB\n * @returns a valid hex string with pre-pending pound sign\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n\treturn \"#\" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1, 7);\n}\n\n/**\n * Given values for an RGB color convert to and return a valid HSL value\n * @param r - Red value in RGB\n * @param g - Green value in RGB\n * @param b - Blue value in RGB\n * @returns an array in the order of `hue, saturation, light` numerical values\n */\nexport function rgbToHsl(r: number, g: number, b: number): Vec3 {\n\tr /= 255;\n\tg /= 255;\n\tb /= 255;\n\tconst max = Math.max(r, g, b);\n\tconst min = Math.min(r, g, b);\n\tlet h = 0;\n\tlet s = 0;\n\tconst l = (max + min) / 2;\n\tif (max !== min) {\n\t\tconst d = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\tswitch (max) {\n\t\t\tcase r:\n\t\t\t\th = (g - b) / d + (g < b ? 6 : 0);\n\t\t\t\tbreak;\n\t\t\tcase g:\n\t\t\t\th = (b - r) / d + 2;\n\t\t\t\tbreak;\n\t\t\tcase b:\n\t\t\t\th = (r - g) / d + 4;\n\t\t\t\tbreak;\n\t\t}\n\n\t\th /= 6;\n\t}\n\treturn [h, s, l];\n}\n\nexport function hslToRgb(h: number, s: number, l: number): Vec3 {\n\tlet r: number;\n\tlet g: number;\n\tlet b: number;\n\n\tfunction hue2rgb(p: number, q: number, t: number): number {\n\t\tif (t < 0) t += 1;\n\t\tif (t > 1) t -= 1;\n\t\tif (t < 1 / 6) return p + (q - p) * 6 * t;\n\t\tif (t < 1 / 2) return q;\n\t\tif (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n\t\treturn p;\n\t}\n\n\tif (s === 0) {\n\t\tr = g = b = l;\n\t} else {\n\t\tconst q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n\t\tconst p = 2 * l - q;\n\t\tr = hue2rgb(p, q, h + 1 / 3);\n\t\tg = hue2rgb(p, q, h);\n\t\tb = hue2rgb(p, q, h - 1 / 3);\n\t}\n\treturn [r * 255, g * 255, b * 255];\n}\n\nexport function rgbToXyz(r: number, g: number, b: number): Vec3 {\n\tr /= 255;\n\tg /= 255;\n\tb /= 255;\n\tr = r > 0.04045 ? Math.pow((r + 0.005) / 1.055, 2.4) : r / 12.92;\n\tg = g > 0.04045 ? Math.pow((g + 0.005) / 1.055, 2.4) : g / 12.92;\n\tb = b > 0.04045 ? Math.pow((b + 0.005) / 1.055, 2.4) : b / 12.92;\n\n\tr *= 100;\n\tg *= 100;\n\tb *= 100;\n\n\tconst x = r * 0.4124 + g * 0.3576 + b * 0.1805;\n\tconst y = r * 0.2126 + g * 0.7152 + b * 0.0722;\n\tconst z = r * 0.0193 + g * 0.1192 + b * 0.9505;\n\n\treturn [x, y, z];\n}\n\nexport function xyzToCIELab(x: number, y: number, z: number): Vec3 {\n\tconst REF_X = 95.047;\n\tconst REF_Y = 100;\n\tconst REF_Z = 108.883;\n\n\tx /= REF_X;\n\ty /= REF_Y;\n\tz /= REF_Z;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;\n\n\tconst L = 116 * y - 16;\n\tconst a = 500 * (x - y);\n\tconst b = 200 * (y - z);\n\n\treturn [L, a, b];\n}\n\nexport function rgbToCIELab(r: number, g: number, b: number): Vec3 {\n\tconst [x, y, z] = rgbToXyz(r, g, b);\n\treturn xyzToCIELab(x, y, z);\n}\n\n/**\n * Computes CIE delta E 1994 diff between `lab1` and `lab2`. The 2 colors are in CIE-Lab color space. Used in tests to compare 2 colors' perceptual similarity.\n */\nexport function deltaE94(lab1: Vec3, lab2: Vec3): number {\n\tconst WEIGHT_L = 1;\n\tconst WEIGHT_C = 1;\n\tconst WEIGHT_H = 1;\n\n\tconst [L1, a1, b1] = lab1;\n\tconst [L2, a2, b2] = lab2;\n\tconst dL = L1 - L2;\n\tconst da = a1 - a2;\n\tconst db = b1 - b2;\n\n\tconst xC1 = Math.sqrt(a1 * a1 + b1 * b1);\n\tconst xC2 = Math.sqrt(a2 * a2 + b2 * b2);\n\n\tlet xDL = L2 - L1;\n\tlet xDC = xC2 - xC1;\n\tconst xDE = Math.sqrt(dL * dL + da * da + db * db);\n\n\tlet xDH =\n\t\tMath.sqrt(xDE) > Math.sqrt(Math.abs(xDL)) + Math.sqrt(Math.abs(xDC))\n\t\t\t? Math.sqrt(xDE * xDE - xDL * xDL - xDC * xDC)\n\t\t\t: 0;\n\n\tconst xSC = 1 + 0.045 * xC1;\n\tconst xSH = 1 + 0.015 * xC1;\n\n\txDL /= WEIGHT_L;\n\txDC /= WEIGHT_C * xSC;\n\txDH /= WEIGHT_H * xSH;\n\n\treturn Math.sqrt(xDL * xDL + xDC * xDC + xDH * xDH);\n}\n\n/**\n * Compute CIE delta E 1994 diff between `rgb1` and `rgb2`.\n */\nexport function rgbDiff(rgb1: Vec3, rgb2: Vec3): number {\n\tconst lab1 = rgbToCIELab.apply(undefined, rgb1);\n\tconst lab2 = rgbToCIELab.apply(undefined, rgb2);\n\treturn deltaE94(lab1, lab2);\n}\n\n/**\n * Compute CIE delta E 1994 diff between `hex1` and `hex2`.\n */\nexport function hexDiff(hex1: string, hex2: string): number {\n\tconst rgb1 = hexToRgb(hex1);\n\tconst rgb2 = hexToRgb(hex2);\n\n\treturn rgbDiff(rgb1, rgb2);\n}\n\n/**\n * Gets a string to describe the meaning of the color diff. Used in tests.\n *\n * Delta E  | Perception                             | Returns\n * -------- | -------------------------------------- | -----------\n * <= 1.0   | Not perceptible by human eyes.         | `\"Perfect\"`\n * 1 - 2    | Perceptible through close observation. | `\"Close\"`\n * 2 - 10   | Perceptible at a glance.               | `\"Good\"`\n * 11 - 49  | Colors are more similar than opposite  | `\"Similar\"`\n * 50 - 100 | Colors are exact opposite              | `Wrong`\n */\nexport function getColorDiffStatus(d: number): string {\n\tif (d < DELTAE94_DIFF_STATUS.NA) {\n\t\treturn \"N/A\";\n\t}\n\t// Not perceptible by human eyes\n\tif (d <= DELTAE94_DIFF_STATUS.PERFECT) {\n\t\treturn \"Perfect\";\n\t}\n\t// Perceptible through close observation\n\tif (d <= DELTAE94_DIFF_STATUS.CLOSE) {\n\t\treturn \"Close\";\n\t}\n\t// Perceptible at a glance\n\tif (d <= DELTAE94_DIFF_STATUS.GOOD) {\n\t\treturn \"Good\";\n\t}\n\t// Colors are more similar than opposite\n\tif (d < DELTAE94_DIFF_STATUS.SIMILAR) {\n\t\treturn \"Similar\";\n\t}\n\treturn \"Wrong\";\n}\n"],"names":[],"mappings":"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"}