From d2f79ceff904114d774d71ee72fe5f3b745a31ad Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Wed, 13 Jul 2016 20:12:43 +0200 Subject: Test and fix libclut_linearise and libclut_standardise MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/libclut.h | 2 +- src/test.c | 31 ++++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/libclut.h b/src/libclut.h index d355d13..e469260 100644 --- a/src/libclut.h +++ b/src/libclut.h @@ -941,7 +941,7 @@ LIBCLUT_GCC_ONLY__(__attribute__((__const__, __leaf__))) double (libclut_model_linear_to_standard1)(double); #define libclut_model_linear_to_standard1(c) \ - (((double)(c) <= 0.0031308) ? (12.92 * (double)(c)) : ((1.0 + 0.055) * pow((double)(c), 1.0 / 2.4))) + (((double)(c) <= 0.0031308) ? (12.92 * (double)(c)) : ((1.0 + 0.055) * pow((double)(c), 1.0 / 2.4) - 0.055)) /** diff --git a/src/test.c b/src/test.c index 2d9b1a5..a7a3909 100644 --- a/src/test.c +++ b/src/test.c @@ -58,12 +58,20 @@ static inline int clutcmp(const struct clut *a, const struct clut *b, uint16_t t } -static int dumpcluts(const struct clut *a, const struct clut *b) +static int dumpcluts(const struct clut *a, const struct clut *b, int tol) { size_t i; + uint16_t *r1 = a->red, *r2 = b->red, *g1 = a->green, *g2 = b->green, *b1 = a->blue, *b2 = b->blue; for (i = 0; i < 256; i++) - printf("%3zu (%02x) :: %04x - %04x ---- %04x - %04x ---- %04x - %04x\n", - i, i, a->red[i], b->red[i], a->green[i], b->green[i], a->blue[i], b->blue[i]); + { + if ((tol >= 0) && + (((r1[i] > r2[i]) ? (r1[i] - r2[i]) : (r2[i] - r1[i])) <= tol) && + (((g1[i] > g2[i]) ? (g1[i] - g2[i]) : (g2[i] - g1[i])) <= tol) && + (((b1[i] > b2[i]) ? (b1[i] - b2[i]) : (b2[i] - b1[i])) <= tol)) + continue; + printf("%3zu (%02x) :: %04x - %04x ---- %04x - %04x ---- %04x - %04x\n", + i, i, a->red[i], b->red[i], a->green[i], b->green[i], a->blue[i], b->blue[i]); + } } @@ -215,6 +223,21 @@ int main(int argc, char *argv[]) printf("libclut_lower_resolution (y) 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 << 8) | i); + } + libclut_linearise(&t1, UINT16_MAX, uint16_t, 1, 1, 1); + if (!clutcmp(&t1, &t2, 1)) + printf("libclut_linearise failed\n"), rc = 1; + libclut_standardise(&t1, UINT16_MAX, uint16_t, 1, 1, 1); + if (clutcmp(&t1, &t2, 12)) + printf("libclut_linearise/libclut_standardise failed\n"), rc = 1; + /* High error rate, especially at low values, are expected due + * to low precision and truncated values rather rounded values. */ + + if (!rc) printf("everything is fine\n"); return rc; @@ -228,8 +251,6 @@ int main(int argc, char *argv[]) /* libclut_cie_contrast libclut_cie_brightness - libclut_linearise - libclut_standardise libclut_cie_invert libclut_cie_limits libclut_cie_manipulate -- cgit v1.2.3-70-g09d2