Browse Source

Fixed off-by one bug on hsl to rgb conversion

master
5 years ago
parent
commit
2180a4126e
  1. 29
      includes/colors.c

29
includes/colors.c

@ -33,11 +33,11 @@ void cvt_rgb(struct Rgb *dest, const struct Hls const *src) { @@ -33,11 +33,11 @@ void cvt_rgb(struct Rgb *dest, const struct Hls const *src) {
(0 > src -> l && src -> l > 1)) {
return;
}
float hue = src -> h;
float r, g, b;
float hue = src -> h;
float chroma = (1 - fabs(2 * (src -> l) - 1)) * (src -> s);
float x = chroma * (1 - fabs((int)(hue/60) % 2 - 1));
float m = (src -> l) - chroma/2;
float m = (src -> l) - (chroma/2);
if (0 <= hue && hue < 60) {
r = chroma;
g = x;
@ -67,9 +67,9 @@ void cvt_rgb(struct Rgb *dest, const struct Hls const *src) { @@ -67,9 +67,9 @@ void cvt_rgb(struct Rgb *dest, const struct Hls const *src) {
g = 0;
b = 0;
}
dest -> r = (r + m) * 255;
dest -> g = (g + m) * 255;
dest -> b = (b + m) * 255;
dest -> r = ceil((r + m) * 255);
dest -> g = ceil((g + m) * 255);
dest -> b = ceil((b + m) * 255);
}
void cvt_hls(struct Hls *dest, const struct Rgb const *src) {
@ -242,4 +242,21 @@ int main() { @@ -242,4 +242,21 @@ int main() {
testconversion(128, 0, 128);
testconversion(0, 128, 128);
testconversion(0, 0, 128);
}
testconvhls(0, 0, 0);
testconvhls(0, 0, 1);
testconvhls(0, 1, 0.5);
testconvhls(120, 1, 0.5);
testconvhls(240, 1, 0.5);
testconvhls(60, 1, 0.5);
testconvhls(180, 1, 0.5);
testconvhls(300, 1, 0.5);
testconvhls(0, 0, 0.75);
testconvhls(0, 0, 0.5);
testconvhls(0, 1, 0.25);
testconvhls(60, 1, 0.25);
testconvhls(120, 1, 0.25);
testconvhls(300, 1, 0.25);
testconvhls(180, 1, 0.25);
testconvhls(240, 1, 0.25);
}

Loading…
Cancel
Save