import { clamp } from '@/functions/clamp'; import { ColourData } from '@3cr/types-ts/types/ColourData'; function toHex(n: number): string { return Math.floor(clamp(n, 0, 255)) .toString(16) .padStart(2, '0'); } export function rgbToHex(r: number, g: number, b: number): string { return `#${toHex(r)}${toHex(g)}${toHex(b)}`; } export function rgbaToHex(r: number, g: number, b: number, a: number): string { return `#${toHex(r)}${toHex(g)}${toHex(b)}${toHex(a)}`; } export function hexToRgb(hex: string): [number, number, number] { const digits = hex.replace('#', ''); const red = parseInt(digits.substring(0, 2), 16); const green = parseInt(digits.substring(2, 4), 16); const blue = parseInt(digits.substring(4, 6), 16); return [red, green, blue]; } export function hexToRgba(hex: string): [number, number, number, number] { const digits = hex.replace('#', ''); const red = parseInt(digits.substring(0, 2), 16); const green = parseInt(digits.substring(2, 4), 16); const blue = parseInt(digits.substring(4, 6), 16); const alpha = parseInt(digits.substring(6, 8), 16); return [red, green, blue, alpha]; } export function fromColourData(value: ColourData): string { const { R, G, B } = value; const toByte = (x: number) => Math.floor(x * 255); return rgbToHex(toByte(R), toByte(G), toByte(B)); } export function toColourData(value: string): ColourData { const [r, g, b] = hexToRgb(value); const toFloat = (x: number) => x / 255; return { Version: '0.0.0', R: toFloat(r), G: toFloat(g), B: toFloat(b), A: 1, }; }