# All files / fast-colors/src color-lab.ts

45.45% Statements 5/11
0% Branches 0/9
20% Functions 1/5
45.45% Lines 5/11

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61

    5x
    5x

    11216x
    11216x
    11216x

     import { roundToPrecisionSmall } from "./math-utilities";
    /**
     * {@link https://en.wikipedia.org/wiki/CIELAB_color_space | CIELAB color space}
     * This implementation uses the D65 constants for 2 degrees. That determines the constants used for the pure white point of the XYZ space of 0.95047, 1.0, 1.08883.
     * {@link https://en.wikipedia.org/wiki/Illuminant_D65}
     * These constants determine how the XYZ, LCH and LAB colors convert to/from RGB.
     *
     * @public
     */
    export class ColorLAB {
        public static readonly epsilon: number = 216 / 24389;
        public static readonly kappa: number = 24389 / 27;

        /**
         * Construct a {@link ColorLAB} from a config object.
         */
        public static fromObject(data: { l: number; a: number; b: number }): ColorLAB | null {
            if (data && !isNaN(data.l) && !isNaN(data.a) && !isNaN(data.b)) {
                return new ColorLAB(data.l, data.a, data.b);
            }
            return null;
        }

        constructor(l: number, a: number, b: number) {
            this.l = l;
            this.a = a;
            this.b = b;
        }

        public readonly l: number;
        public readonly a: number;
        public readonly b: number;

        /**
         * Determines if a color is equal to another
         * @param rhs - the value to compare
         */
        public equalValue(rhs: ColorLAB): boolean {
            return this.l === rhs.l && this.a === rhs.a && this.b === rhs.b;
        }

        /**
         * Returns a new {@link ColorLAB} rounded to the provided precision
         * @param precision - the precision to round to
         */
        public roundToPrecision(precision: number): ColorLAB {
            return new ColorLAB(
                roundToPrecisionSmall(this.l, precision),
                roundToPrecisionSmall(this.a, precision),
                roundToPrecisionSmall(this.b, precision)
            );
        }

        /**
         * Returns the {@link ColorLAB} formatted as an object.
         */
        public toObject(): { l: number; a: number; b: number } {
            return { l: this.l, a: this.a, b: this.b };
        }
    }