diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/test/test.c | 145 |
1 files changed, 134 insertions, 11 deletions
diff --git a/src/test/test.c b/src/test/test.c index 8f42712..44c55c2 100644 --- a/src/test/test.c +++ b/src/test/test.c @@ -27,6 +27,107 @@ #include <stdio.h> #include <stdlib.h> #include <unistd.h> +#include <stdint.h> + + +#ifndef __GCC__ +# define __attribute__(x) +#endif + +/** + * Test mapping function from [0, 1] float encoding value to [0, 2⁸ − 1] integer output value. + * + * @param encoding [0, 1] float encoding value. + * @return [0, 2⁸ − 1] integer output value. + */ +static uint8_t __attribute__((const)) invert_ramps8(float encoding) +{ + double i_encoding = (double)(1.f - encoding); + double f_output = ((double)UINT8_MAX) * i_encoding; + uint8_t output = (uint8_t)f_output; + if ((i_encoding < (double)(0.25f)) && (output > UINT8_MAX / 2)) + output = 0; + if ((i_encoding > (double)(0.75f)) && (output < UINT8_MAX / 2)) + output = UINT8_MAX; + return output; +} + +/** + * Test mapping function from [0, 1] float encoding value to [0, 2¹⁶ − 1] integer output value. + * + * @param encoding [0, 1] float encoding value. + * @return [0, 2¹⁶ − 1] integer output value. + */ +static uint16_t __attribute__((const)) invert_ramps16(float encoding) +{ + double i_encoding = (double)(1.f - encoding); + double f_output = ((double)UINT16_MAX) * i_encoding; + uint16_t output = (uint16_t)f_output; + if ((i_encoding < (double)(0.25f)) && (output > UINT16_MAX / 2)) + output = 0; + if ((i_encoding > (double)(0.75f)) && (output < UINT16_MAX / 2)) + output = UINT16_MAX; + return output; +} + +/** + * Test mapping function from [0, 1] float encoding value to [0, 2³² − 1] integer output value. + * + * @param encoding [0, 1] float encoding value. + * @return [0, 2³² − 1] integer output value. + */ +static uint32_t __attribute__((const)) invert_ramps32(float encoding) +{ + double i_encoding = (double)(1.f - encoding); + double f_output = ((double)UINT32_MAX) * i_encoding; + uint32_t output = (uint32_t)f_output; + if ((i_encoding < (double)(0.25f)) && (output > UINT32_MAX / 2)) + output = 0; + if ((i_encoding > (double)(0.75f)) && (output < UINT32_MAX / 2)) + output = UINT32_MAX; + return output; +} + +/** + * Test mapping function from [0, 1] float encoding value to [0, 2⁶⁴ − 1] integer output value. + * + * @param encoding [0, 1] float encoding value. + * @return [0, 2⁶⁴ − 1] integer output value. + */ +static uint64_t __attribute__((const)) invert_ramps64(float encoding) +{ + double i_encoding = (double)(1.f - encoding); + double f_output = ((double)UINT64_MAX) * i_encoding; + uint64_t output = (uint64_t)f_output; + if ((i_encoding < (double)(0.25f)) && (output > UINT64_MAX / 2)) + output = 0; + if ((i_encoding > (double)(0.75f)) && (output < UINT64_MAX / 2)) + output = UINT64_MAX; + return output; +} + +/** + * Test mapping function from [0, 1] float encoding value to [0, 1] float output value. + * + * @param encoding [0, 1] float encoding value. + * @return [0, 1] float output value. + */ +static float __attribute__((const)) invert_rampsf(float encoding) +{ + return 1.f - encoding; +} + +/** + * Test mapping function from [0, 1] double precision float encoding + * value to [0, 1] double precision float output value. + * + * @param encoding [0, 1] float encoding value. + * @return [0, 1] float output value. + */ +static double __attribute__((const)) invert_rampsd(double encoding) +{ + return ((double)1.f) - encoding; +} @@ -42,8 +143,9 @@ int main(void) libgamma_partition_state_t* restrict part_state = malloc(sizeof(libgamma_partition_state_t)); libgamma_crtc_state_t* restrict crtc_state = malloc(sizeof(libgamma_crtc_state_t)); libgamma_crtc_information_t info; -#define X(R) \ - libgamma_gamma_##R##_t old_##R, R; +#define X(R) \ + libgamma_gamma_##R##_t old_##R, R; \ + libgamma_gamma_##R##_fun* f_##R = invert_##R; LIST_RAMPS #undef X size_t i, n; @@ -66,7 +168,7 @@ int main(void) /* Get the sizes of the gamma ramps for the selected CRTC. */ libgamma_get_crtc_information(&info, crtc_state, LIBGAMMA_CRTC_INFO_GAMMA_SIZE); - /* Create gamma ramps for each bit-depth. */ + /* Create gamma ramps for each depth. */ #define X(R) \ old_##R.red_size = info.red_gamma_size; \ old_##R.green_size = info.green_gamma_size; \ @@ -77,7 +179,7 @@ int main(void) LIST_RAMPS #undef X - /* Fill gamma ramps, for each bit-depth, with the CRTC:s current ramps. */ + /* Fill gamma ramps, for each depth, with the CRTC:s current ramps. */ #define X(R) \ libgamma_crtc_get_gamma_##R(crtc_state, &old_##R); \ if ((rr |= r = libgamma_crtc_get_gamma_##R(crtc_state, &R))) \ @@ -88,6 +190,23 @@ int main(void) LIST_RAMPS #undef X + /* Test function assisted gamma ramps setting. */ +#define X(R) \ + /* Dim the monitor for one second and the restore it. */ \ + printf("Inverting monitor output for 1 second... (" #R ")\n"); \ + if ((rr |= r = libgamma_crtc_set_gamma_##R##_f(crtc_state, \ + f_##R, f_##R, f_##R))) \ + libgamma_perror("libgamma_crtc_set_gamma_" #R "_f", r); \ + sleep(1); \ + if ((rr |= r = libgamma_crtc_set_gamma_##R(crtc_state, old_##R))) \ + libgamma_perror("libgamma_crtc_set_gamma_" #R, r); \ + printf("Done!\n"); \ + /* Sleep for one second, we have more depths to test. */ \ + printf("Sleeping for 1 second...\n"); \ + sleep(1); + LIST_RAMPS +#undef X + /* Test getting and setting gamma ramps. */ #define X(R) \ /* Get the grand size of the gamma ramps. */ \ @@ -98,9 +217,9 @@ int main(void) printf("Current gamma ramps (" #R "):\n"); \ for (i = 0; i < n; i++) \ { \ - if (i < R.red_size) Y(R, red); else printf(" "); \ - if (i < R.green_size) Y(R, green); else printf(" "); \ - if (i < R.blue_size) Y(R, blue); else printf(" "); \ + if (i < R.red_size) Y(R.red, "1"); else printf(" "); \ + if (i < R.green_size) Y(R.green, "2"); else printf(" "); \ + if (i < R.blue_size) Y(R.blue, "4"); else printf(" "); \ printf("\n"); \ } \ printf("\n"); \ @@ -115,19 +234,18 @@ int main(void) if ((rr |= r = libgamma_crtc_set_gamma_##R(crtc_state, old_##R))) \ libgamma_perror("libgamma_crtc_set_gamma_" #R, r); \ printf("Done!\n"); \ - /* Sleep for one second, we have more bit-depths to test. */ \ + /* Sleep for one second, we have more depths to test. */ \ printf("Sleeping for 1 second...\n"); \ sleep(1); -#define Y(R, C) printf(" \033[32m%1.8lf\033[00m", (double)(R.C[i])) +#define Y(R, C) printf(" \033[3" C "m%1.8lf\033[00m", (double)(R[i])) LIST_FLOAT_RAMPS #undef Y -#define Y(R, C) printf(" \033[31m%16llX\033[00m", (uint64_t)(R.C[i])) +#define Y(R, C) printf(" \033[3" C "m%16llX\033[00m", (uint64_t)(R[i])) LIST_INTEGER_RAMPS #undef Y #undef X /* TODO Test gamma ramp restore functions. */ - /* TODO Test _f gamma ramp setters. */ done: /* Release resouces. */ @@ -142,3 +260,8 @@ int main(void) return rr; } + +#ifndef __GCC__ +# undef __attribute__ +#endif + |