This commit is contained in:
Lani Aung
2025-06-07 16:45:53 -07:00
parent aa58a30b6d
commit 660dd859d1
4 changed files with 63 additions and 25 deletions
+13 -11
View File
@@ -11,27 +11,29 @@ export default class HSL {
this.lightness = lightness
}
// https://en.wikipedia.org/wiki/RGB_color_model
// https://en.wikipedia.org/wiki/HSL_and_HSV
public static fromRgb(rgb: RGB) {
const redValue = rgb.red / 255,
greenValue = rgb.green / 255,
blueValue = rgb.blue / 255,
lightness = (redValue + greenValue + blueValue) / 3,
max = Math.max(redValue, greenValue, blueValue),
min = Math.min(redValue, greenValue, blueValue),
chroma = max - min,
lightness = .5 * (max + min),
saturation = 1 - (3 / (redValue + greenValue + blueValue)) * Math.min(redValue, greenValue, blueValue)
const dividend = (redValue - greenValue) + (redValue - blueValue)
const divisor = 2 * Math.sqrt((redValue - greenValue) ^ 2 + (redValue - blueValue) * (greenValue - blueValue))
let hue = (1 / Math.cos(dividend / divisor))
if (greenValue > blueValue) hue = 360 - hue
let huePrime = 0
if (chroma != 0) {
if (redValue == max) huePrime = ((greenValue - blueValue) / chroma) % 6
else if (greenValue == max) huePrime = ((blueValue - redValue) / chroma) + 2
else huePrime = ((redValue - greenValue) / chroma) + 4
}
return new HSL(hue, saturation, lightness)
return new HSL(huePrime * 60, saturation, lightness)
}
public static fromHex(color: number): HSL {
const red = color >> 16
const green = (color - (red << 16)) >> 8
const blue = color - (red << 16) - (green << 8)
return HSL.fromRgb(new RGB(red, green, blue))
return HSL.fromRgb(RGB.fromHex(color))
}
public toHex(): number {
+7
View File
@@ -49,4 +49,11 @@ export default class RGB {
return new RGB((red + match) * 255, (green + match) * 255, (blue + match) * 255)
}
public static fromHex(color: number): RGB {
const red = color >> 16
const green = (color - (red << 16)) >> 8
const blue = color - (red << 16) - (green << 8)
return new RGB(red, green, blue)
}
}