diff options
Diffstat (limited to '')
-rw-r--r-- | src/test.c | 96 |
1 files changed, 84 insertions, 12 deletions
@@ -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, ¶m, ¶m, ¶m); + 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 */ |