diff options
Diffstat (limited to '')
-rw-r--r-- | libgamma_internal_allocated_any_ramp.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/libgamma_internal_allocated_any_ramp.c b/libgamma_internal_allocated_any_ramp.c new file mode 100644 index 0000000..7e6953d --- /dev/null +++ b/libgamma_internal_allocated_any_ramp.c @@ -0,0 +1,60 @@ +/* See LICENSE file for copyright and license details. */ +#include "common.h" + + +/** + * Just an arbitrary version + */ +#define ANY bits64 + +/** + * Concatenation of all ramps + */ +#define ALL red + + +/** + * Allocate and initalise a gamma ramp with any depth + * + * @param ramps_sys Output gamma ramps + * @param ramps The gamma ramps whose sizes should be duplicated + * @param depth The depth of the gamma ramps to allocate, + * `-1` for `float`, `-2` for `double` + * @param elements Output reference for the grand size of the gamma ramps + * @return Zero on success, otherwise (negative) the value of an + * error identifier provided by this library + */ +int +libgamma_internal_allocated_any_ramp(gamma_ramps_any_t *restrict ramps_sys, gamma_ramps_any_t ramps, + signed depth, size_t *restrict elements) +{ + /* Calculate the size of the allocation to do */ + size_t d, n = ramps.ANY.red_size + ramps.ANY.green_size + ramps.ANY.blue_size; + switch (depth) { + case 8: d = sizeof(uint8_t); break; + case 16: d = sizeof(uint16_t); break; + case 32: d = sizeof(uint32_t); break; + case 64: d = sizeof(uint64_t); break; + case -1: d = sizeof(float); break; + case -2: d = sizeof(double); break; + default: + return errno = EINVAL, LIBGAMMA_ERRNO_SET; + } + + /* Copy the gamma ramp sizes */ + ramps_sys->ANY = ramps.ANY; + /* Allocate the new ramps */ +#ifdef HAVE_LIBGAMMA_METHOD_LINUX_DRM + /* Valgrind complains about us reading uninitialize memory if we just use malloc */ + ramps_sys->ANY.red = calloc(n, d); +#else + ramps_sys->ANY.red = malloc(n * d); +#endif + ramps_sys->ANY.green = (void *)&((char *)ramps_sys->ANY. red)[ramps.ANY. red_size * d / sizeof(char)]; + ramps_sys->ANY.blue = (void *)&((char *)ramps_sys->ANY.green)[ramps.ANY.green_size * d / sizeof(char)]; + + /* Report the total gamma ramp size */ + *elements = n; + /* Report successfulness */ + return ramps_sys->ANY.red ? 0 : LIBGAMMA_ERRNO_SET; +} |