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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
|
/*
* Copyright 2011-2016 Branimir Karadzic. All rights reserved.
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
*/
#ifndef BGFX_IMAGE_H_HEADER_GUARD
#define BGFX_IMAGE_H_HEADER_GUARD
#include <stdint.h>
namespace bgfx
{
struct ImageContainer
{
void* m_data;
TextureFormat::Enum m_format;
uint32_t m_size;
uint32_t m_offset;
uint32_t m_width;
uint32_t m_height;
uint32_t m_depth;
uint8_t m_numMips;
bool m_hasAlpha;
bool m_cubeMap;
bool m_ktx;
bool m_ktxLE;
bool m_srgb;
};
struct ImageMip
{
TextureFormat::Enum m_format;
uint32_t m_width;
uint32_t m_height;
uint32_t m_blockSize;
uint32_t m_size;
uint8_t m_bpp;
bool m_hasAlpha;
const uint8_t* m_data;
};
struct EncodingType
{
enum Enum
{
Unorm,
Int,
Uint,
Float,
Snorm,
Count
};
};
struct ImageBlockInfo
{
uint8_t bitsPerPixel;
uint8_t blockWidth;
uint8_t blockHeight;
uint8_t blockSize;
uint8_t minBlockX;
uint8_t minBlockY;
uint8_t depthBits;
uint8_t stencilBits;
uint8_t rBits;
uint8_t gBits;
uint8_t bBits;
uint8_t aBits;
uint8_t encoding;
};
typedef void (*PackFn)(void*, const float*);
typedef void (*UnpackFn)(float*, const void*);
// R8
void packR8(void* _dst, const float* _src);
void unpackR8(float* _dst, const void* _src);
// R8S
void packR8S(void* _dst, const float* _src);
void unpackR8S(float* _dst, const void* _src);
// R8I
void packR8I(void* _dst, const float* _src);
void unpackR8I(float* _dst, const void* _src);
// R8U
void packR8U(void* _dst, const float* _src);
void unpackR8U(float* _dst, const void* _src);
// RG8
void packRg8(void* _dst, const float* _src);
void unpackRg8(float* _dst, const void* _src);
// RG8S
void packRg8S(void* _dst, const float* _src);
void unpackRg8S(float* _dst, const void* _src);
// RG8I
void packRg8I(void* _dst, const float* _src);
void unpackRg8I(float* _dst, const void* _src);
// RG8U
void packRg8U(void* _dst, const float* _src);
void unpackRg8U(float* _dst, const void* _src);
// RGB8
void packRgb8(void* _dst, const float* _src);
void unpackRgb8(float* _dst, const void* _src);
// RGB8S
void packRgb8S(void* _dst, const float* _src);
void unpackRgb8S(float* _dst, const void* _src);
// RGB8I
void packRgb8I(void* _dst, const float* _src);
void unpackRgb8I(float* _dst, const void* _src);
// RGB8U
void packRgb8U(void* _dst, const float* _src);
void unpackRgb8U(float* _dst, const void* _src);
// RGBA8
void packRgba8(void* _dst, const float* _src);
void unpackRgba8(float* _dst, const void* _src);
// BGRA8
void packBgra8(void* _dst, const float* _src);
void unpackBgra8(float* _dst, const void* _src);
// RGBA8S
void packRgba8S(void* _dst, const float* _src);
void unpackRgba8S(float* _dst, const void* _src);
// RGBA8I
void packRgba8I(void* _dst, const float* _src);
void unpackRgba8I(float* _dst, const void* _src);
// RGBA8U
void packRgba8U(void* _dst, const float* _src);
void unpackRgba8U(float* _dst, const void* _src);
// R16
void packR16(void* _dst, const float* _src);
void unpackR16(float* _dst, const void* _src);
// R16S
void packR16S(void* _dst, const float* _src);
void unpackR16S(float* _dst, const void* _src);
// R16I
void packR16I(void* _dst, const float* _src);
void unpackR16I(float* _dst, const void* _src);
// R16U
void packR16U(void* _dst, const float* _src);
void unpackR16U(float* _dst, const void* _src);
// R16F
void packR16F(void* _dst, const float* _src);
void unpackR16F(float* _dst, const void* _src);
// RG16
void packRg16(void* _dst, const float* _src);
void unpackRg16(float* _dst, const void* _src);
// RG16S
void packRg16S(void* _dst, const float* _src);
void unpackRg16S(float* _dst, const void* _src);
// RG16I
void packRg16I(void* _dst, const float* _src);
void unpackRg16I(float* _dst, const void* _src);
// RG16U
void packRg16U(void* _dst, const float* _src);
void unpackRg16U(float* _dst, const void* _src);
// RG16F
void packRg16F(void* _dst, const float* _src);
void unpackRg16F(float* _dst, const void* _src);
// RGBA16
void packRgba16(void* _dst, const float* _src);
void unpackRgba16(float* _dst, const void* _src);
// RGBA16S
void packRgba16S(void* _dst, const float* _src);
void unpackRgba16S(float* _dst, const void* _src);
// RGBA16I
void packRgba16I(void* _dst, const float* _src);
void unpackRgba16I(float* _dst, const void* _src);
// RGBA16U
void packRgba16U(void* _dst, const float* _src);
void unpackRgba16U(float* _dst, const void* _src);
// RGBA16F
void packRgba16F(void* _dst, const float* _src);
void unpackRgba16F(float* _dst, const void* _src);
// R32I
void packR32I(void* _dst, const float* _src);
void unpackR32I(float* _dst, const void* _src);
// R32U
void packR32U(void* _dst, const float* _src);
void unpackR32U(float* _dst, const void* _src);
// R32F
void packR32F(void* _dst, const float* _src);
void unpackR32F(float* _dst, const void* _src);
// RG32I
void packRg32I(void* _dst, const float* _src);
void unpackRg32I(float* _dst, const void* _src);
// RG32U
void packRg32U(void* _dst, const float* _src);
void unpackRg32U(float* _dst, const void* _src);
// RGB9E5F
void packRgb9E5F(void* _dst, const float* _src);
void unpackRgb9E5F(float* _dst, const void* _src);
// RGBA32I
void packRgba32I(void* _dst, const float* _src);
void unpackRgba32I(float* _dst, const void* _src);
// RGBA32U
void packRgba32U(void* _dst, const float* _src);
void unpackRgba32U(float* _dst, const void* _src);
// RGBA32F
void packRgba32F(void* _dst, const float* _src);
void unpackRgba32F(float* _dst, const void* _src);
// R5G6B5
void packR5G6B5(void* _dst, const float* _src);
void unpackR5G6B5(float* _dst, const void* _src);
// RGBA4
void packRgba4(void* _dst, const float* _src);
void unpackRgba4(float* _dst, const void* _src);
// RGBA4
void packBgra4(void* _dst, const float* _src);
void unpackBgra4(float* _dst, const void* _src);
// RGB5A1
void packRgb5a1(void* _dst, const float* _src);
void unpackRgb5a1(float* _dst, const void* _src);
// BGR5A1
void packBgr5a1(void* _dst, const float* _src);
void unpackBgr5a1(float* _dst, const void* _src);
// RGB10A2
void packRgb10A2(void* _dst, const float* _src);
void unpackRgb10A2(float* _dst, const void* _src);
// R11G11B10F
void packR11G11B10F(void* _dst, const float* _src);
void unpackR11G11B10F(float* _dst, const void* _src);
// RG32F
void packRg32F(void* _dst, const float* _src);
void unpackRg32F(float* _dst, const void* _src);
/// Returns true if texture format is compressed.
bool isCompressed(TextureFormat::Enum _format);
/// Returns true if texture format is uncompressed.
bool isColor(TextureFormat::Enum _format);
/// Returns true if texture format is depth.
bool isDepth(TextureFormat::Enum _format);
/// Returns true if texture format is valid.
bool isValid(TextureFormat::Enum _format);
/// Returns bits per pixel.
uint8_t getBitsPerPixel(TextureFormat::Enum _format);
/// Returns texture block info.
const ImageBlockInfo& getBlockInfo(TextureFormat::Enum _format);
/// Converts format to string.
const char* getName(TextureFormat::Enum _format);
/// Converts string to format.
TextureFormat::Enum getFormat(const char* _name);
/// Returns number of mip-maps required for complete mip-map chain.
uint8_t imageGetNumMips(TextureFormat::Enum _format, uint16_t _width, uint16_t _height, uint16_t _depth = 0);
/// Returns image size.
uint32_t imageGetSize(TextureFormat::Enum _format, uint16_t _width, uint16_t _height, uint16_t _depth = 0, bool _cubeMap = false, uint8_t _numMips = 0);
///
void imageSolid(uint32_t _width, uint32_t _height, uint32_t _solid, void* _dst);
///
void imageCheckerboard(uint32_t _width, uint32_t _height, uint32_t _step, uint32_t _0, uint32_t _1, void* _dst);
///
void imageRgba8Downsample2x2(uint32_t _width, uint32_t _height, uint32_t _pitch, const void* _src, void* _dst);
///
void imageRgba32fToLinear(void* _dst, uint32_t _width, uint32_t _height, uint32_t _pitch, const void* _src);
///
void imageRgba32fToGamma(void* _dst, uint32_t _width, uint32_t _height, uint32_t _pitch, const void* _src);
///
void imageRgba32fLinearDownsample2x2(uint32_t _width, uint32_t _height, uint32_t _pitch, const void* _src, void* _dst);
///
void imageRgba32fDownsample2x2NormalMap(uint32_t _width, uint32_t _height, uint32_t _pitch, const void* _src, void* _dst);
///
void imageSwizzleBgra8(uint32_t _width, uint32_t _height, uint32_t _pitch, const void* _src, void* _dst);
///
void imageCopy(uint32_t _height, uint32_t _srcPitch, const void* _src, uint32_t _dstPitch, void* _dst);
///
void imageCopy(uint32_t _width, uint32_t _height, uint32_t _bpp, uint32_t _pitch, const void* _src, void* _dst);
///
bool imageConvert(TextureFormat::Enum _dstFormat, TextureFormat::Enum _srcFormat);
///
void imageConvert(void* _dst, uint32_t _bpp, PackFn _pack, const void* _src, UnpackFn _unpack, uint32_t _size);
///
void imageConvert(void* _dst, uint32_t _dstBpp, PackFn _pack, const void* _src, uint32_t _srcBpp, UnpackFn _unpack, uint32_t _width, uint32_t _height, uint32_t _srcPitch);
///
bool imageConvert(void* _dst, TextureFormat::Enum _dstFormat, const void* _src, TextureFormat::Enum _srcFormat, uint32_t _width, uint32_t _height);
///
const Memory* imageAlloc(ImageContainer& _imageContainer, TextureFormat::Enum _format, uint16_t _width, uint16_t _height, uint16_t _depth = 0, bool _cubeMap = false, bool _generateMips = false);
///
void imageFree(const Memory* _memory);
///
void imageWriteTga(bx::WriterI* _writer, uint32_t _width, uint32_t _height, uint32_t _pitch, const void* _src, bool _grayscale, bool _yflip, bx::Error* _err = NULL);
///
void imageWriteKtx(bx::WriterI* _writer, TextureFormat::Enum _format, bool _cubeMap, uint32_t _width, uint32_t _height, uint32_t _depth, uint8_t _numMips, const void* _src, bx::Error* _err = NULL);
///
void imageWriteKtx(bx::WriterI* _writer, ImageContainer& _imageContainer, const void* _data, uint32_t _size, bx::Error* _err = NULL);
///
bool imageParse(ImageContainer& _imageContainer, bx::ReaderSeekerI* _reader);
///
bool imageParse(ImageContainer& _imageContainer, const void* _data, uint32_t _size);
///
void imageDecodeToBgra8(void* _dst, const void* _src, uint32_t _width, uint32_t _height, uint32_t _pitch, TextureFormat::Enum _format);
///
void imageDecodeToRgba8(void* _dst, const void* _src, uint32_t _width, uint32_t _height, uint32_t _pitch, TextureFormat::Enum _format);
///
void imageDecodeToRgba32f(bx::AllocatorI* _allocator, void* _dst, const void* _src, uint32_t _width, uint32_t _height, uint32_t _pitch, TextureFormat::Enum _format);
///
bool imageGetRawData(const ImageContainer& _imageContainer, uint8_t _side, uint8_t _index, const void* _data, uint32_t _size, ImageMip& _mip);
} // namespace bgfx
#endif // BGFX_IMAGE_H_HEADER_GUARD
|