utils/colorSpace.tstypescript
import { Vec3 } from "../math/Vec3";
import type { NumberArray3 } from "../math/Vec3";

export const LINEAR = 0;
export const SRGB = 1;

export function getColorSpace(colorSpace?: string | number, defaultColorSpace: number = LINEAR): number {
    if (colorSpace === LINEAR || colorSpace === SRGB) {
        return colorSpace;
    }

    if (typeof colorSpace === "string") {
        const value = colorSpace.trim().toLowerCase();
        if (value === "linear") {
            return LINEAR;
        }
        if (value === "srgb") {
            return SRGB;
        }
    }

    return defaultColorSpace;
}

export function srgbToLinearArr(arr: NumberArray3): NumberArray3 {
    return [Math.pow(arr[0], 2.2), Math.pow(arr[1], 2.2), Math.pow(arr[2], 2.2)];
}

export function srgbToLinear3v(v: Vec3): NumberArray3 {
    return [Math.pow(v.x, 2.2), Math.pow(v.y, 2.2), Math.pow(v.z, 2.2)];
}

export function srgbToLinear(v: number): number {
    return Math.pow(v, 2.2);
}

export function linearToSrgbArr(arr: NumberArray3): NumberArray3 {
    return [Math.pow(arr[0], 1.0 / 2.2), Math.pow(arr[1], 1.0 / 2.2), Math.pow(arr[2], 1.0 / 2.2)];
}