#pragma once
#include <cmath>
#include "common.hpp"


typedef struct rgb_s {
    unsigned char r, g, b;
    unsigned char dist(const rgb_s&) const;
    double fdist(const rgb_s&) const;
    unsigned rgb() const { return ((unsigned)r << 16) + ((unsigned)g << 8) + (unsigned)b; }
    void tint(const rgb_s&, unsigned char alpha); // alpha in %
    bool operator==(const rgb_s& o) const { return memcmp(this, &o, sizeof(rgb_s)) == 0; }
    bool operator<(const rgb_s& o) const { return memcmp(this, &o, sizeof(rgb_s)) < 0; }
} rgb_t;


// https://en.wikipedia.org/wiki/Color_difference
// https://de.wikipedia.org/wiki/Lab-Farbraum
// https://de.wikipedia.org/wiki/Delta_E
typedef struct lab_s {
    double l, a, b;
    lab_s(const rgb_t& rgb);
    double dist(const lab_s& o) const;
} lab_t;