aboutsummaryrefslogtreecommitdiffstats
path: root/src/test.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/test.c')
-rw-r--r--src/test.c96
1 files changed, 84 insertions, 12 deletions
diff --git a/src/test.c b/src/test.c
index 393e11e..2d9b1a5 100644
--- a/src/test.c
+++ b/src/test.c
@@ -22,6 +22,8 @@
#include <stdlib.h>
#include <string.h>
+#include <math.h>
+
struct clut
@@ -36,9 +38,23 @@ struct clut
-static inline int clutcmp(const struct clut *a, const struct clut *b)
+static inline int clutcmp(const struct clut *a, const struct clut *b, uint16_t tol)
{
- return memcmp(a->red, b->red, 3 * 256 * sizeof(uint16_t));
+ size_t i;
+ if (tol == 0)
+ return memcmp(a->red, b->red, 3 * 256 * sizeof(uint16_t));
+ for (i = 0; i < 3 * 256; i++)
+ if (a->red[i] > b->red[i])
+ {
+ if (a->red[i] - b->red[i] > tol)
+ return +1;
+ }
+ else if (a->red[i] < b->red[i])
+ {
+ if (b->red[i] - a->red[i] > tol)
+ return -1;
+ }
+ return 0;
}
@@ -50,6 +66,7 @@ static int dumpcluts(const struct clut *a, const struct clut *b)
i, i, a->red[i], b->red[i], a->green[i], b->green[i], a->blue[i], b->blue[i]);
}
+
static double make_double(double x)
{
return x * 2;
@@ -68,6 +85,7 @@ int main(int argc, char *argv[])
struct clut t1, t2, t3;
size_t i, j;
int rc = 0;
+ double param;
t1. red_size = t2. red_size = t3. red_size = 256;
t1.green_size = t2.green_size = t3.green_size = 256;
@@ -83,7 +101,7 @@ int main(int argc, char *argv[])
libclut_start_over(&t1, UINT16_MAX, uint16_t, 1, 1, 1);
for (i = 0; i < 256; i++)
t2.blue[i] = t2.green[i] = t2.red[i] = (uint16_t)((i << 8) | i);
- if (clutcmp(&t1, &t2))
+ if (clutcmp(&t1, &t2, 0))
printf("libclut_start_over failed\n"), rc = 1;
@@ -93,7 +111,7 @@ int main(int argc, char *argv[])
t2.blue[j] = t2.green[j] = t2.red[j] = (uint16_t)i;
}
libclut_negative(&t1, UINT16_MAX, uint16_t, 1, 1, 1);
- if (clutcmp(&t1, &t2))
+ if (clutcmp(&t1, &t2, 0))
printf("libclut_negative failed\n"), rc = 1;
@@ -103,7 +121,7 @@ int main(int argc, char *argv[])
t2.blue[i] = t2.green[i] = t2.red[i] = UINT16_MAX - (uint16_t)i;
}
libclut_rgb_invert(&t1, UINT16_MAX, uint16_t, 1, 1, 1);
- if (clutcmp(&t1, &t2))
+ if (clutcmp(&t1, &t2, 0))
printf("libclut_rgb_invert failed\n"), rc = 1;
@@ -113,7 +131,7 @@ int main(int argc, char *argv[])
t2.blue[i] = 1 + (t2.green[i] = 1 + (t2.red[i] = 1000 + (uint16_t)i));
}
libclut_rgb_limits(&t1, UINT16_MAX, uint16_t, 1000, 1255, 1001, 1256, 1002, 1257);
- if (clutcmp(&t1, &t2))
+ if (clutcmp(&t1, &t2, 0))
printf("libclut_rgb_limits failed\n"), rc = 1;
@@ -125,7 +143,7 @@ int main(int argc, char *argv[])
t2.blue[i] = t1.blue[i] * 4;
}
libclut_rgb_brightness(&t1, UINT16_MAX, uint16_t, 2, 3, 4);
- if (clutcmp(&t1, &t2))
+ if (clutcmp(&t1, &t2, 0))
printf("libclut_rgb_brightness failed\n"), rc = 1;
@@ -135,9 +153,67 @@ int main(int argc, char *argv[])
t2.blue[i] = t2.green[i] = 2 * (t2.red[i] = (uint16_t)i);
}
libclut_manipulate(&t1, UINT16_MAX, uint16_t, (double (*)(double))(NULL), make_double, make_double);
- if (clutcmp(&t1, &t2))
+ if (clutcmp(&t1, &t2, 0))
printf("libclut_manipulate failed\n"), rc = 1;
+
+ for (i = 0; i < 256; i++)
+ {
+ t1.blue[i] = t1.green[i] = t1.red[i] = (uint16_t)i;
+ t2.blue[i] = t2.green[i] = t2.red[i] = (uint16_t)(pow((double)i / UINT16_MAX, 1.0 / 1.1) * UINT16_MAX);
+ }
+ libclut_gamma(&t1, UINT16_MAX, uint16_t, 1.1, 1.1, 1.1);
+ if (clutcmp(&t1, &t2, 0))
+ printf("libclut_gamma failed\n"), rc = 1;
+
+
+ for (i = 0; i < 256; i++)
+ {
+ t1.blue[i] = t1.green[i] = t1.red[i] = (uint16_t)((i << 8) | i);
+ t2.blue[i] = t2.green[i] = t2.red[i] = (t1.red[i] - UINT16_MAX / 2) / 2 + UINT16_MAX / 2;
+ }
+ libclut_rgb_contrast(&t1, UINT16_MAX, uint16_t, 0.5, 0.5, 0.5);
+ if (clutcmp(&t1, &t2, 1))
+ printf("libclut_rgb_contrast failed\n"), rc = 1;
+
+
+ param = 2.0;
+ for (i = 0; i < 256; i++)
+ {
+ double x = i / 255.0;
+ if (i % 255)
+ {
+ x = 1.0 / x - 1.0;
+ x = log(x);
+ x = 0.5 - x / param;
+ }
+ t1.blue[i] = t1.green[i] = t1.red[i] = (uint16_t)((i << 8) | i);
+ t2.blue[i] = t2.green[i] = t2.red[i] = (uint16_t)(x * UINT16_MAX);
+ }
+ libclut_sigmoid(&t1, UINT16_MAX, uint16_t, &param, &param, &param);
+ if (clutcmp(&t1, &t2, 0))
+ printf("libclut_sigmoid failed\n"), rc = 1;
+
+
+ for (i = 0; i < 256; i++)
+ {
+ t1.blue[i] = t1.green[i] = t1.red[i] = (uint16_t)((i << 8) | i);
+ t2.blue[i] = t2.green[i] = t2.red[i] = t1.red[i & ~15] | (t1.red[i & ~15] >> 4);
+ }
+ libclut_lower_resolution(&t1, UINT16_MAX, uint16_t, 16, 0, 16, 0, 16, 0);
+ if (clutcmp(&t1, &t2, 0))
+ printf("libclut_lower_resolution (x) failed\n"), rc = 1;
+
+
+ for (i = 0; i < 256; i++)
+ {
+ t1.blue[i] = t1.green[i] = t1.red[i] = (uint16_t)((i << 8) | i);
+ t2.blue[i] = t2.green[i] = t2.red[i] = (uint16_t)(i / 255.0 * 15.0 + 0.5) * UINT16_MAX / 15;
+ }
+ libclut_lower_resolution(&t1, UINT16_MAX, uint16_t, 0, 16, 0, 16, 0, 16);
+ if (clutcmp(&t1, &t2, 0))
+ printf("libclut_lower_resolution (y) failed\n"), rc = 1;
+
if (!rc)
printf("everything is fine\n");
@@ -150,18 +226,14 @@ int main(int argc, char *argv[])
/*
- libclut_rgb_contrast
libclut_cie_contrast
libclut_cie_brightness
libclut_linearise
libclut_standardise
- libclut_gamma
libclut_cie_invert
- libclut_sigmoid
libclut_cie_limits
libclut_cie_manipulate
libclut_clip
- libclut_lower_resolution
libclut_apply
libclut_cie_apply
*/