134 lines
3.2 KiB
TypeScript
134 lines
3.2 KiB
TypeScript
const MSZ_COLOUR_INHERIT = 0x40000000,
|
|
MSZ_COLOUR_READABILITY_THRESHOLD = 186,
|
|
MSZ_COLOUR_LUMINANCE_WEIGHT_RED = 0.299,
|
|
MSZ_COLOUR_LUMINANCE_WEIGHT_GREEN = 0.587,
|
|
MSZ_COLOUR_LUMINANCE_WEIGHT_BLUE = 0.114;
|
|
|
|
function colourCreate(): number {
|
|
return 0;
|
|
}
|
|
|
|
function colourNone(): number {
|
|
return MSZ_COLOUR_INHERIT;
|
|
}
|
|
|
|
function colourSetInherit(colour: number, enabled: boolean): number {
|
|
if (enabled) {
|
|
colour |= MSZ_COLOUR_INHERIT;
|
|
} else {
|
|
colour &= ~MSZ_COLOUR_INHERIT;
|
|
}
|
|
|
|
return colour;
|
|
}
|
|
|
|
function colourGetInherit(colour: number): boolean {
|
|
return (colour & MSZ_COLOUR_INHERIT) > 0;
|
|
}
|
|
|
|
function colourGetRed(colour: number): number {
|
|
return (colour >> 16) & 0xFF;
|
|
}
|
|
|
|
function colourSetRed(colour: number, red: number): number {
|
|
red = red & 0xFF;
|
|
colour &= ~0xFF0000;
|
|
colour |= red << 16;
|
|
return colour;
|
|
}
|
|
|
|
function colourGetGreen(colour: number): number {
|
|
return (colour >> 8) & 0xFF;
|
|
}
|
|
|
|
function colourSetGreen(colour: number, green: number): number {
|
|
green = green & 0xFF;
|
|
colour &= ~0xFF00;
|
|
colour |= green << 8;
|
|
return colour;
|
|
}
|
|
|
|
function colourGetBlue(colour: number): number {
|
|
return colour & 0xFF;
|
|
}
|
|
|
|
function colourSetBlue(colour: number, blue: number): number {
|
|
blue = blue & 0xFF;
|
|
colour &= ~0xFF;
|
|
colour |= blue;
|
|
return colour;
|
|
}
|
|
|
|
function colourGetLuminance(colour: number): number {
|
|
return MSZ_COLOUR_LUMINANCE_WEIGHT_RED * colourGetRed(colour)
|
|
+ MSZ_COLOUR_LUMINANCE_WEIGHT_GREEN * colourGetGreen(colour)
|
|
+ MSZ_COLOUR_LUMINANCE_WEIGHT_BLUE * colourGetBlue(colour);
|
|
}
|
|
|
|
function colourGetHex(colour: number): string {
|
|
return '#' + (colour & 0xFFFFFF).toString(16);
|
|
}
|
|
|
|
function colourGetCSS(colour: number): string {
|
|
if (colourGetInherit(colour)) {
|
|
return 'inherit';
|
|
}
|
|
|
|
return colourGetHex(colour);
|
|
}
|
|
|
|
function colourGetCSSContrast(
|
|
colour: number,
|
|
dark: string = 'dark',
|
|
light: string = 'light',
|
|
inheritIsDark: boolean = true
|
|
): string {
|
|
if (colourGetInherit(colour)) {
|
|
return inheritIsDark ? dark : light;
|
|
}
|
|
|
|
return colourGetLuminance(colour) > MSZ_COLOUR_READABILITY_THRESHOLD
|
|
? dark
|
|
: light;
|
|
}
|
|
|
|
function colourFromRGB(red: number, green: number, blue: number): number {
|
|
let colour: number = colourCreate();
|
|
colour = colourSetRed(colour, red);
|
|
colour = colourSetGreen(colour, green);
|
|
colour = colourSetBlue(colour, blue);
|
|
return colour;
|
|
}
|
|
|
|
function colourFromHex(hex: string): number {
|
|
if (hex.startsWith('#'))
|
|
hex = hex.substr(1);
|
|
|
|
const length: number = hex.length;
|
|
|
|
if (length === 3) {
|
|
hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];
|
|
} else if (length !== 6) {
|
|
return 0;
|
|
}
|
|
|
|
return parseInt(hex, 16);
|
|
}
|
|
|
|
class ColourProperties {
|
|
red: number;
|
|
green: number;
|
|
blue: number;
|
|
inherit: boolean;
|
|
luminance: number;
|
|
}
|
|
|
|
function colourGetProperties(colour: number): ColourProperties {
|
|
const props: ColourProperties = new ColourProperties;
|
|
props.red = colourGetRed(colour);
|
|
props.green = colourGetGreen(colour);
|
|
props.blue = colourGetBlue(colour);
|
|
props.inherit = colourGetInherit(colour);
|
|
props.luminance = colourGetLuminance(colour);
|
|
return props;
|
|
}
|