|
|
- import {fontColorContrast} from "./lib/FontColorContrast.js"
-
- const API = {
- /**
- * Turn hex rgba into rgba object
- * @param {String} hex 8 long hex value in string form, eg: "#123456ff"
- * @returns object of {r, g, b, a}
- */
- hexToRGBA(hex) {
- const hexArr = hex.slice(1).match(new RegExp(".{2}", "g"));
- const [r, g, b, a] = hexArr.map((hexStr) => {
- return parseInt(hexStr.repeat(2 / hexStr.length), 16);
- });
- const realAlpha = this._isRealNumber(a) ? a : 1;
- const rgba = [r, g, b, Math.round((realAlpha / 256 + Number.EPSILON) * 100) / 100];
- return {
- r: rgba[0] ?? 255,
- g: rgba[1] ?? 255,
- b: rgba[2] ?? 255,
- a: rgba[3] ?? 255,
- };
- },
-
- /**
- * Makes text white or black according to background color
- * @href https://wunnle.com/dynamic-text-color-based-on-background
- * @href https://stackoverflow.com/questions/54230440/how-to-change-text-color-based-on-rgb-and-rgba-background-color
- * @param {String} rgbaHex 8 long hex value in string form, eg: "#123456ff"
- * @param {number} threshold Contrast threshold to control the resulting font color, float values from 0 to 1. Default is 0.5.
- * @returns {( '#ffffff'|'#000000')} hex color
- */
- getTextColor(rgbaHex, threshold = 0.5) {
- // return game.modules.get("colorsettings").api.getTextColor(rgbaHex);
-
- const rgba = this.hexToRGBA(rgbaHex);
- // OLD METHOD
- /*
- //const realAlpha = this._isRealNumber(rgba.a) ? rgba.a : 1;
- const brightness = Math.round((rgba.r * 299 + rgba.g * 587 + rgba.b * 114) / 1000);
- // const realAlpha = this._isRealNumber(rgba.a) ? rgba.a : 1;
- if (this._isRealNumber(rgba.a) && rgba.a > 0.5) {
- return brightness > 125 ? "black" : "white";
- } else {
- //return 'black';
- return brightness > 125 ? "black" : "white";
- }
- */
- const hexTextColor = fontColorContrast(rgba.r, rgba.g, rgba.b, threshold);
- return hexTextColor;
- },
-
- /**
- * Convert a Array of rgba[r, g, b, a] in string format to a hex string
- * @param {String} rgba as string e.g. rgba('xxx','xxx','xxx','xxx')
- * @param {boolean} forceRemoveAlpha
- * @returns turns the hex string
- */
- RGBAToHexFromString(rgba, forceRemoveAlpha = false) {
- return (
- "#" +
- rgba
- .replace(/^rgba?\(|\s+|\)$/g, "") // Get's rgba / rgb string values
- .split(",") // splits them at ","
- .filter((string, index) => !forceRemoveAlpha || index !== 3)
- .map((string) => parseFloat(string)) // Converts them to numbers
- .map((number, index) => (index === 3 ? Math.round(number * 255) : number)) // Converts alpha to 255 number
- .map((number) => number.toString(16)) // Converts numbers to hex
- .map((string) => (string.length === 1 ? "0" + string : string)) // Adds 0 when length of one number is 1
- .join("")
- ); // Puts the array to together to a string
- },
-
- /**
- * Convert a Array of rgba[r, g, b, a] in to a hex string
- * @param {*} r
- * @param {*} g
- * @param {*} b
- * @param {*} a
- * @returns the hex string
- */
- RGBAToHex(r, g, b, a) {
- let r2 = r.toString(16);
- let g2 = g.toString(16);
- let b2 = b.toString(16);
- let a2 = Math.round(a * 255).toString(16);
-
- if (r2.length == 1) {
- r2 = "0" + r2;
- }
- if (g2.length == 1) {
- g2 = "0" + g2;
- }
- if (b2.length == 1) {
- b2 = "0" + b2;
- }
- if (a2.length == 1) {
- a2 = "0" + a2;
- }
- return "#" + r2 + g2 + b2 + a2;
- },
-
- /**
- * Turn hex rgba into rgba string
- * @href https://stackoverflow.com/questions/19799777/how-to-add-transparency-information-to-a-hex-color-code
- * @href https://stackoverflow.com/questions/21646738/convert-hex-to-rgba
- * @param colorHex
- * @param alpha
- * @return rgba as string e.g. rgba('xxx','xxx','xxx','xxx')
- */
- hexToRGBAString(colorHex, alpha = 1) {
- let rgba = Color.from(colorHex);
- // return "rgba(" + rgb.r + ", " + rgb.g + ", " + rgb.b + ", " + alpha + ")";
- if (colorHex.length > 7) {
- rgba = this.hexToRGBA(colorHex);
- } else {
- const colorHex2 = `${colorHex}${Math.floor(alpha * 255)
- .toString(16)
- .padStart(2, "0")}`;
- rgba = this.hexToRGBA(colorHex2);
- // const c = Color.from(colorHex);
- // rgba = c.toRGBA();
- }
- const realAlpha = this._isRealNumber(rgba.a) ? rgba.a : alpha;
- return "rgba(" + rgba.r + ", " + rgba.g + ", " + rgba.b + ", " + realAlpha + ")";
- },
-
- /**
- * Calculate brightness value by RGB or HEX color.
- * @param color (String) The color value in RGB or HEX (for example: #000000 || #000 || rgb(0,0,0) || rgba(0,0,0,0))
- * @returns (Number) The brightness value (dark) 0 ... 255 (light)
- * @return {number} brigthness
- */
- brightnessByColor(colorHexOrRgb) {
- let color = "" + colorHexOrRgb;
- let isHEX = color.indexOf("#") == 0;
- let isRGB = color.indexOf("rgb") == 0;
- let r = 0;
- let g = 0;
- let b = 0;
- if (isHEX) {
- const rgba = this.hexToRGBA(color);
- r = rgba.r;
- g = rgba.g;
- b = rgba.b;
- }
- if (isRGB) {
- var m = color.match(/(\d+){3}/g);
- if (m) {
- r = m[0];
- g = m[1];
- b = m[2];
- }
- }
- if (typeof r != "undefined") {
- return (r * 299 + g * 587 + b * 114) / 1000;
- } else {
- return undefined;
- }
- },
-
- _isRealNumber(inNumber) {
- return !isNaN(inNumber) && typeof inNumber === "number" && isFinite(inNumber);
- }
- }
- export default API;
|