1 /*
2  * Copyright 2011-2019 Branimir Karadzic. All rights reserved.
3  * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
4  */
5 
6 #ifndef BX_PIXEL_FORMAT_H_HEADER_GUARD
7 #define BX_PIXEL_FORMAT_H_HEADER_GUARD
8 
9 #include "math.h"
10 #include "uint32_t.h"
11 
12 namespace bx
13 {
14 	///
15 	struct EncodingType
16 	{
17 		enum Enum ///
18 		{
19 			Unorm,
20 			Int,
21 			Uint,
22 			Float,
23 			Snorm,
24 
25 			Count
26 		};
27 	};
28 
29 	typedef void (*PackFn)(void*, const float*);
30 	typedef void (*UnpackFn)(float*, const void*);
31 
32 	///
33 	uint32_t toUnorm(float _value, float _scale);
34 
35 	///
36 	float fromUnorm(uint32_t _value, float _scale);
37 
38 	///
39 	int32_t toSnorm(float _value, float _scale);
40 
41 	///
42 	float fromSnorm(int32_t _value, float _scale);
43 
44 	// A8
45 	void packA8(void* _dst, const float* _src);
46 	void unpackA8(float* _dst, const void* _src);
47 
48 	// R8
49 	void packR8(void* _dst, const float* _src);
50 	void unpackR8(float* _dst, const void* _src);
51 
52 	// R8S
53 	void packR8S(void* _dst, const float* _src);
54 	void unpackR8S(float* _dst, const void* _src);
55 
56 	// R8I
57 	void packR8I(void* _dst, const float* _src);
58 	void unpackR8I(float* _dst, const void* _src);
59 
60 	// R8U
61 	void packR8U(void* _dst, const float* _src);
62 	void unpackR8U(float* _dst, const void* _src);
63 
64 	// RG8
65 	void packRg8(void* _dst, const float* _src);
66 	void unpackRg8(float* _dst, const void* _src);
67 
68 	// RG8S
69 	void packRg8S(void* _dst, const float* _src);
70 	void unpackRg8S(float* _dst, const void* _src);
71 
72 	// RG8I
73 	void packRg8I(void* _dst, const float* _src);
74 	void unpackRg8I(float* _dst, const void* _src);
75 
76 	// RG8U
77 	void packRg8U(void* _dst, const float* _src);
78 	void unpackRg8U(float* _dst, const void* _src);
79 
80 	// RGB8
81 	void packRgb8(void* _dst, const float* _src);
82 	void unpackRgb8(float* _dst, const void* _src);
83 
84 	// RGB8S
85 	void packRgb8S(void* _dst, const float* _src);
86 	void unpackRgb8S(float* _dst, const void* _src);
87 
88 	// RGB8I
89 	void packRgb8I(void* _dst, const float* _src);
90 	void unpackRgb8I(float* _dst, const void* _src);
91 
92 	// RGB8U
93 	void packRgb8U(void* _dst, const float* _src);
94 	void unpackRgb8U(float* _dst, const void* _src);
95 
96 	// RGBA8
97 	void packRgba8(void* _dst, const float* _src);
98 	void unpackRgba8(float* _dst, const void* _src);
99 
100 	// BGRA8
101 	void packBgra8(void* _dst, const float* _src);
102 	void unpackBgra8(float* _dst, const void* _src);
103 
104 	// RGBA8S
105 	void packRgba8S(void* _dst, const float* _src);
106 	void unpackRgba8S(float* _dst, const void* _src);
107 
108 	// RGBA8I
109 	void packRgba8I(void* _dst, const float* _src);
110 	void unpackRgba8I(float* _dst, const void* _src);
111 
112 	// RGBA8U
113 	void packRgba8U(void* _dst, const float* _src);
114 	void unpackRgba8U(float* _dst, const void* _src);
115 
116 	// R16
117 	void packR16(void* _dst, const float* _src);
118 	void unpackR16(float* _dst, const void* _src);
119 
120 	// R16S
121 	void packR16S(void* _dst, const float* _src);
122 	void unpackR16S(float* _dst, const void* _src);
123 
124 	// R16I
125 	void packR16I(void* _dst, const float* _src);
126 	void unpackR16I(float* _dst, const void* _src);
127 
128 	// R16U
129 	void packR16U(void* _dst, const float* _src);
130 	void unpackR16U(float* _dst, const void* _src);
131 
132 	// R16F
133 	void packR16F(void* _dst, const float* _src);
134 	void unpackR16F(float* _dst, const void* _src);
135 
136 	// RG16
137 	void packRg16(void* _dst, const float* _src);
138 	void unpackRg16(float* _dst, const void* _src);
139 
140 	// RG16S
141 	void packRg16S(void* _dst, const float* _src);
142 	void unpackRg16S(float* _dst, const void* _src);
143 
144 	// RG16I
145 	void packRg16I(void* _dst, const float* _src);
146 	void unpackRg16I(float* _dst, const void* _src);
147 
148 	// RG16U
149 	void packRg16U(void* _dst, const float* _src);
150 	void unpackRg16U(float* _dst, const void* _src);
151 
152 	// RG16F
153 	void packRg16F(void* _dst, const float* _src);
154 	void unpackRg16F(float* _dst, const void* _src);
155 
156 	// RGBA16
157 	void packRgba16(void* _dst, const float* _src);
158 	void unpackRgba16(float* _dst, const void* _src);
159 
160 	// RGBA16S
161 	void packRgba16S(void* _dst, const float* _src);
162 	void unpackRgba16S(float* _dst, const void* _src);
163 
164 	// RGBA16I
165 	void packRgba16I(void* _dst, const float* _src);
166 	void unpackRgba16I(float* _dst, const void* _src);
167 
168 	// RGBA16U
169 	void packRgba16U(void* _dst, const float* _src);
170 	void unpackRgba16U(float* _dst, const void* _src);
171 
172 	// RGBA16F
173 	void packRgba16F(void* _dst, const float* _src);
174 	void unpackRgba16F(float* _dst, const void* _src);
175 
176 	// R32I
177 	void packR32I(void* _dst, const float* _src);
178 	void unpackR32I(float* _dst, const void* _src);
179 
180 	// R32U
181 	void packR32U(void* _dst, const float* _src);
182 	void unpackR32U(float* _dst, const void* _src);
183 
184 	// R32F
185 	void packR32F(void* _dst, const float* _src);
186 	void unpackR32F(float* _dst, const void* _src);
187 
188 	// RG32I
189 	void packRg32I(void* _dst, const float* _src);
190 	void unpackRg32I(float* _dst, const void* _src);
191 
192 	// RG32U
193 	void packRg32U(void* _dst, const float* _src);
194 	void unpackRg32U(float* _dst, const void* _src);
195 
196 	// RGB9E5F
197 	void packRgb9E5F(void* _dst, const float* _src);
198 	void unpackRgb9E5F(float* _dst, const void* _src);
199 
200 	// RGBA32I
201 	void packRgba32I(void* _dst, const float* _src);
202 	void unpackRgba32I(float* _dst, const void* _src);
203 
204 	// RGBA32U
205 	void packRgba32U(void* _dst, const float* _src);
206 	void unpackRgba32U(float* _dst, const void* _src);
207 
208 	// RGBA32F
209 	void packRgba32F(void* _dst, const float* _src);
210 	void unpackRgba32F(float* _dst, const void* _src);
211 
212 	// R5G6B5
213 	void packR5G6B5(void* _dst, const float* _src);
214 	void unpackR5G6B5(float* _dst, const void* _src);
215 
216 	// RGBA4
217 	void packRgba4(void* _dst, const float* _src);
218 	void unpackRgba4(float* _dst, const void* _src);
219 
220 	// RGBA4
221 	void packBgra4(void* _dst, const float* _src);
222 	void unpackBgra4(float* _dst, const void* _src);
223 
224 	// RGB5A1
225 	void packRgb5a1(void* _dst, const float* _src);
226 	void unpackRgb5a1(float* _dst, const void* _src);
227 
228 	// BGR5A1
229 	void packBgr5a1(void* _dst, const float* _src);
230 	void unpackBgr5a1(float* _dst, const void* _src);
231 
232 	// RGB10A2
233 	void packRgb10A2(void* _dst, const float* _src);
234 	void unpackRgb10A2(float* _dst, const void* _src);
235 
236 	// RG11B10F
237 	void packRG11B10F(void* _dst, const float* _src);
238 	void unpackRG11B10F(float* _dst, const void* _src);
239 
240 	// RG32F
241 	void packRg32F(void* _dst, const float* _src);
242 	void unpackRg32F(float* _dst, const void* _src);
243 
244 } // namespace bx
245 
246 #include "inline/pixelformat.inl"
247 
248 #endif // BX_PIXEL_FORMAT_H_HEADER_GUARD
249