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;
|