aboutsummaryrefslogtreecommitdiffstats
path: root/types-ramps.c
blob: a80f66b071c5857d52a9e313d3e3308282f7992b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/* See LICENSE file for copyright and license details. */
#include "types-ramps.h"

#include <libclut.h>

#include <errno.h>
#include <stdlib.h>
#include <string.h>


/**
 * The name of the process
 */
extern char *restrict argv0;


/**
 * Marshal a ramp trio
 * 
 * @param   this        The ramps
 * @param   buf         Output buffer for the marshalled ramps,
 *                      `NULL` just measure how large the buffers
 *                      needs to be
 * @param   ramps_size  The byte-size of ramps
 * @return              The number of marshalled byte
 */
size_t
gamma_ramps_marshal(const union gamma_ramps *restrict this, void *restrict buf, size_t ramps_size)
{
	if (buf)
		memcpy(buf, this->u8.red, ramps_size);
	return ramps_size;
}


/**
 * Unmarshal a ramp trio
 * 
 * @param   this        Output for the ramps, `.red_size`, `.green_size`,
 *                      and `.blue_size` must already be set
 * @param   buf         Buffer with the marshalled ramps
 * @param   ramps_size  The byte-size of ramps
 * @return              The number of unmarshalled bytes, 0 on error
 */
size_t
gamma_ramps_unmarshal(union gamma_ramps *restrict this, const void *restrict buf, size_t ramps_size)
{
	size_t depth = ramps_size / (this->u8.red_size + this->u8.green_size + this->u8.blue_size);
	int r = 0;

	switch (depth) {
	case 1:
		r = libgamma_gamma_ramps8_initialise(&this->u8);
		break;

	case 2:
		r = libgamma_gamma_ramps16_initialise(&this->u16);
		break;

	case 4:
		r = libgamma_gamma_ramps32_initialise(&this->u32);
		break;

	case 8:
		r = libgamma_gamma_ramps64_initialise(&this->u64);
		break;

	default:
		if (depth == sizeof(float))
			r = libgamma_gamma_rampsf_initialise(&this->f);
		else if (depth == sizeof(double))
			r = libgamma_gamma_rampsd_initialise(&this->d);
		else
			abort();
		break;
	}

	if (r) {
		libgamma_perror(argv0, r);
		errno = 0;
		return 0;
	}

	memcpy(this->u8.red, buf, ramps_size);
	return ramps_size;
}