#pragma once
#include <complex>

class linear_color {
public:
    linear_color() : r(1), g(1), b(1), a(1) {
    }
    linear_color(float in_r, float in_g, float in_b, float in_a = 1.0f) : r(in_r), g(in_g), b(in_b), a(in_a) {}

    static linear_color from_srgb(float in_r, float in_g, float in_b, float in_a = 1.0f) {
        return linear_color(
            in_r <= 0.04045f ? in_r / 12.92f : std::pow((in_r + 0.055f) / 1.055f, 2.4f),
            in_g <= 0.04045f ? in_g / 12.92f : std::pow((in_g + 0.055f) / 1.055f, 2.4f),
            in_b <= 0.04045f ? in_b / 12.92f : std::pow((in_b + 0.055f) / 1.055f, 2.4f),
            in_a
        );
    }
    static linear_color from_srgb(const linear_color& in_color) {
        return from_srgb(in_color.r, in_color.g, in_color.b, in_color.a);
    }

    linear_color& operator+=(const linear_color& in_color) {
        r += in_color.r;
        g += in_color.g;
        b += in_color.b;
        a += in_color.a;
        return *this;
    }
    linear_color& operator-=(const linear_color& in_color) {
        r -= in_color.r;
        g -= in_color.g;
        b -= in_color.b;
        a -= in_color.a;
        return *this;
    }
    linear_color operator+(const linear_color& in_color) const {
        return { r + in_color.r, g + in_color.g, b + in_color.b, a + in_color.a };
    }
    linear_color operator-(const linear_color& in_color) const {
        return { r - in_color.r, g - in_color.g, b - in_color.b, a - in_color.a };
    }
    float r, g, b, a;







    static const linear_color white;
};
