summaryrefslogtreecommitdiff
path: root/support/dktools/dk4pxbit.ctr
blob: 09bd6db4a101dd595f1ac93f5f4a4628aa0b5bd5 (plain)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
%%	options

copyright owner	=	Dirk Krause
copyright year	=	2017-xxxx
SPDX-License-Identifier:	BSD-3-Clause

%%	header

/**	@file	dk4pxbit.h	Bit constants for pixels.
*/

#ifndef	DK4CONF_H_INCLUDED
#if DK4_BUILDING_DKTOOLS4
#include "dk4conf.h"
#else
#include <dktools-4/dk4conf.h>
#endif
#endif

#ifndef	DK4TYPES_H_INCLUDED
#if DK4_BUILDING_DKTOOLS4
#include "dk4types.h"
#else
#include <dktools-4/dk4types.h>
#endif
#endif

#ifndef	DK4PX_H_INCLUDED
#if DK4_BUILDING_DKTOOLS4
#include "dk4px.h"
#else
#include <dktools-4/dk4px.h>
#endif
#endif

#ifdef	__cplusplus
extern "C" {
#endif

/**	Retrieve bit for a given bit number.
	Least significant bit is 0, most significant is 15.
	@param	bitno	Bit number to retrieve bit value for.
	@return	Positive bit value on success, 0 on error (out of range).
*/

dk4_px_t
dk4pxbit_get_bit(size_t bitno);


/**	Retrieve maximum value for a given bit number.
	Least significant bit is 0, most significant is 15.
	@param	bitno	Bit number to retrieve bit value for.
	@return	Positive maximum value on success, 0 on error (out of range).
*/

dk4_px_t
dk4pxbit_get_max(size_t bitno);


/**	Find bit number to represent a maximum value.
	@param	maxval	Maximum value for a pixel component.
	@return	Required bit number.
*/

size_t
dk4pxbit_get_bitno(dk4_px_t maxval);

#ifdef	__cplusplus
}
#endif


/* vim: set ai sw=4 ts=4 : */


%%	module

#include "dk4conf.h"
#ifndef	DK4PXBIT_H_INCLUDED
#include "dk4pxbit.h"
#endif



$!trace-include



/**	Bit number values.
*/
static dk4_px_t	dk4pxbit_values[] = {
	0x0001U, 0x0002U, 0x0004U, 0x0008U, 0x0010U, 0x0020U, 0x0040U, 0x0080U,
	0x0100U, 0x0200U, 0x0400U, 0x0800U, 0x1000U, 0x2000U, 0x4000U, 0x8000U
};


/**	Maxima values.
*/
static dk4_px_t dk4pxbit_maxima[] = {
	0x0001U, 0x0003U, 0x0007U, 0x000FU, 0x001FU, 0x003FU, 0x007FU, 0x00FFU,
	0x01FFU, 0x03FFU, 0x07FFU, 0x0FFFU, 0x1FFFU, 0x3FFFU, 0x7FFFU, 0xFFFFU
};



dk4_px_t
dk4pxbit_get_bit(size_t bitno)
{
	if ((sizeof(dk4pxbit_values)/sizeof(dk4_px_t)) > bitno) {
		return (dk4pxbit_values[bitno]);
	}
	return ((dk4_px_t)0U);
}



dk4_px_t
dk4pxbit_get_max(size_t bitno)
{
	dk4_px_t	back	= 0;
	$? "+ dk4pxbit_get_max %u", (unsigned)bitno
	if (((sizeof(dk4pxbit_maxima)/sizeof(dk4_px_t)) > bitno) && (0 < bitno)) {
		back = dk4pxbit_maxima[bitno - 1];
	}
	$? "- dk4pxbit_get_max %lu", (unsigned long)back
	return back;
}



size_t
dk4pxbit_get_bitno(dk4_px_t maxval)
{
	size_t		 back	=	16;
	size_t		 i		=	15;
	int			 cc		=	 1;
	for (i = 15; ((i > 0) && (1 == cc)); i--) {
		if (dk4pxbit_maxima[i - 1] >= maxval) {
			back = i;
		}
		else {
			cc = 0;
		}
	}
	return back;
}




/* vim: set ai sw=4 ts=4 : */