aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/test/test.c145
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
+