|
|
|
@ -35,7 +35,6 @@
|
|
|
|
|
#include "config.h"
|
|
|
|
|
|
|
|
|
|
#include <zlib.h>
|
|
|
|
|
#include <math.h>
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
#include <limits.h>
|
|
|
|
|
#include <signal.h>
|
|
|
|
@ -309,46 +308,9 @@ struct lab_color {
|
|
|
|
|
lab_color() : lc_l(0), lc_a(0), lc_b(0) {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
lab_color(const rgb_color &rgb) {
|
|
|
|
|
double r = rgb.rc_r / 255.0,
|
|
|
|
|
g = rgb.rc_g / 255.0,
|
|
|
|
|
b = rgb.rc_b / 255.0,
|
|
|
|
|
x, y, z;
|
|
|
|
|
lab_color(const rgb_color &rgb);
|
|
|
|
|
|
|
|
|
|
r = (r > 0.04045) ? pow((r + 0.055) / 1.055, 2.4) : r / 12.92;
|
|
|
|
|
g = (g > 0.04045) ? pow((g + 0.055) / 1.055, 2.4) : g / 12.92;
|
|
|
|
|
b = (b > 0.04045) ? pow((b + 0.055) / 1.055, 2.4) : b / 12.92;
|
|
|
|
|
|
|
|
|
|
x = (r * 0.4124 + g * 0.3576 + b * 0.1805) / 0.95047;
|
|
|
|
|
y = (r * 0.2126 + g * 0.7152 + b * 0.0722) / 1.00000;
|
|
|
|
|
z = (r * 0.0193 + g * 0.1192 + b * 0.9505) / 1.08883;
|
|
|
|
|
|
|
|
|
|
x = (x > 0.008856) ? pow(x, 1.0/3.0) : (7.787 * x) + 16.0/116.0;
|
|
|
|
|
y = (y > 0.008856) ? pow(y, 1.0/3.0) : (7.787 * y) + 16.0/116.0;
|
|
|
|
|
z = (z > 0.008856) ? pow(z, 1.0/3.0) : (7.787 * z) + 16.0/116.0;
|
|
|
|
|
|
|
|
|
|
this->lc_l = (116.0 * y) - 16;
|
|
|
|
|
this->lc_a = 500.0 * (x - y);
|
|
|
|
|
this->lc_b = 200.0 * (y - z);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double deltaE(const lab_color &other) const {
|
|
|
|
|
double deltaL = this->lc_l - other.lc_l;
|
|
|
|
|
double deltaA = this->lc_a - other.lc_a;
|
|
|
|
|
double deltaB = this->lc_b - other.lc_b;
|
|
|
|
|
double c1 = sqrt(this->lc_a * this->lc_a + this->lc_b * this->lc_b);
|
|
|
|
|
double c2 = sqrt(other.lc_a * other.lc_a + other.lc_b * other.lc_b);
|
|
|
|
|
double deltaC = c1 - c2;
|
|
|
|
|
double deltaH = deltaA * deltaA + deltaB * deltaB - deltaC * deltaC;
|
|
|
|
|
deltaH = deltaH < 0.0 ? 0.0 : sqrt(deltaH);
|
|
|
|
|
double sc = 1.0 + 0.045 * c1;
|
|
|
|
|
double sh = 1.0 + 0.015 * c1;
|
|
|
|
|
double deltaLKlsl = deltaL / (1.0);
|
|
|
|
|
double deltaCkcsc = deltaC / (sc);
|
|
|
|
|
double deltaHkhsh = deltaH / (sh);
|
|
|
|
|
double i = deltaLKlsl * deltaLKlsl + deltaCkcsc * deltaCkcsc + deltaHkhsh * deltaHkhsh;
|
|
|
|
|
return i < 0.0 ? 0.0 : sqrt(i);
|
|
|
|
|
}
|
|
|
|
|
double deltaE(const lab_color &other) const;
|
|
|
|
|
|
|
|
|
|
lab_color& operator=(const lab_color &other) {
|
|
|
|
|
this->lc_l = other.lc_l;
|
|
|
|
|