1 | /* |
2 | Simple DirectMedia Layer |
3 | Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org> |
4 | |
5 | This software is provided 'as-is', without any express or implied |
6 | warranty. In no event will the authors be held liable for any damages |
7 | arising from the use of this software. |
8 | |
9 | Permission is granted to anyone to use this software for any purpose, |
10 | including commercial applications, and to alter it and redistribute it |
11 | freely, subject to the following restrictions: |
12 | |
13 | 1. The origin of this software must not be misrepresented; you must not |
14 | claim that you wrote the original software. If you use this software |
15 | in a product, an acknowledgment in the product documentation would be |
16 | appreciated but is not required. |
17 | 2. Altered source versions must be plainly marked as such, and must not be |
18 | misrepresented as being the original software. |
19 | 3. This notice may not be removed or altered from any source distribution. |
20 | */ |
21 | |
22 | /** |
23 | * # CategoryPixels |
24 | * |
25 | * SDL offers facilities for pixel management. |
26 | * |
27 | * Largely these facilities deal with pixel _format_: what does this set of |
28 | * bits represent? |
29 | * |
30 | * If you mostly want to think of a pixel as some combination of red, green, |
31 | * blue, and maybe alpha intensities, this is all pretty straightforward, and |
32 | * in many cases, is enough information to build a perfectly fine game. |
33 | * |
34 | * However, the actual definition of a pixel is more complex than that: |
35 | * |
36 | * Pixels are a representation of a color in a particular color space. |
37 | * |
38 | * The first characteristic of a color space is the color type. SDL |
39 | * understands two different color types, RGB and YCbCr, or in SDL also |
40 | * referred to as YUV. |
41 | * |
42 | * RGB colors consist of red, green, and blue channels of color that are added |
43 | * together to represent the colors we see on the screen. |
44 | * |
45 | * https://en.wikipedia.org/wiki/RGB_color_model |
46 | * |
47 | * YCbCr colors represent colors as a Y luma brightness component and red and |
48 | * blue chroma color offsets. This color representation takes advantage of the |
49 | * fact that the human eye is more sensitive to brightness than the color in |
50 | * an image. The Cb and Cr components are often compressed and have lower |
51 | * resolution than the luma component. |
52 | * |
53 | * https://en.wikipedia.org/wiki/YCbCr |
54 | * |
55 | * When the color information in YCbCr is compressed, the Y pixels are left at |
56 | * full resolution and each Cr and Cb pixel represents an average of the color |
57 | * information in a block of Y pixels. The chroma location determines where in |
58 | * that block of pixels the color information is coming from. |
59 | * |
60 | * The color range defines how much of the pixel to use when converting a |
61 | * pixel into a color on the display. When the full color range is used, the |
62 | * entire numeric range of the pixel bits is significant. When narrow color |
63 | * range is used, for historical reasons, the pixel uses only a portion of the |
64 | * numeric range to represent colors. |
65 | * |
66 | * The color primaries and white point are a definition of the colors in the |
67 | * color space relative to the standard XYZ color space. |
68 | * |
69 | * https://en.wikipedia.org/wiki/CIE_1931_color_space |
70 | * |
71 | * The transfer characteristic, or opto-electrical transfer function (OETF), |
72 | * is the way a color is converted from mathematically linear space into a |
73 | * non-linear output signals. |
74 | * |
75 | * https://en.wikipedia.org/wiki/Rec._709#Transfer_characteristics |
76 | * |
77 | * The matrix coefficients are used to convert between YCbCr and RGB colors. |
78 | */ |
79 | |
80 | #ifndef SDL_pixels_h_ |
81 | #define SDL_pixels_h_ |
82 | |
83 | #include <SDL3/SDL_stdinc.h> |
84 | #include <SDL3/SDL_error.h> |
85 | #include <SDL3/SDL_endian.h> |
86 | |
87 | #include <SDL3/SDL_begin_code.h> |
88 | /* Set up for C function definitions, even when using C++ */ |
89 | #ifdef __cplusplus |
90 | extern "C" { |
91 | #endif |
92 | |
93 | /** |
94 | * A fully opaque 8-bit alpha value. |
95 | * |
96 | * \since This macro is available since SDL 3.2.0. |
97 | * |
98 | * \sa SDL_ALPHA_TRANSPARENT |
99 | */ |
100 | #define SDL_ALPHA_OPAQUE 255 |
101 | |
102 | /** |
103 | * A fully opaque floating point alpha value. |
104 | * |
105 | * \since This macro is available since SDL 3.2.0. |
106 | * |
107 | * \sa SDL_ALPHA_TRANSPARENT_FLOAT |
108 | */ |
109 | #define SDL_ALPHA_OPAQUE_FLOAT 1.0f |
110 | |
111 | /** |
112 | * A fully transparent 8-bit alpha value. |
113 | * |
114 | * \since This macro is available since SDL 3.2.0. |
115 | * |
116 | * \sa SDL_ALPHA_OPAQUE |
117 | */ |
118 | #define SDL_ALPHA_TRANSPARENT 0 |
119 | |
120 | /** |
121 | * A fully transparent floating point alpha value. |
122 | * |
123 | * \since This macro is available since SDL 3.2.0. |
124 | * |
125 | * \sa SDL_ALPHA_OPAQUE_FLOAT |
126 | */ |
127 | #define SDL_ALPHA_TRANSPARENT_FLOAT 0.0f |
128 | |
129 | /** |
130 | * Pixel type. |
131 | * |
132 | * \since This enum is available since SDL 3.2.0. |
133 | */ |
134 | typedef enum SDL_PixelType |
135 | { |
136 | SDL_PIXELTYPE_UNKNOWN, |
137 | SDL_PIXELTYPE_INDEX1, |
138 | SDL_PIXELTYPE_INDEX4, |
139 | SDL_PIXELTYPE_INDEX8, |
140 | SDL_PIXELTYPE_PACKED8, |
141 | SDL_PIXELTYPE_PACKED16, |
142 | SDL_PIXELTYPE_PACKED32, |
143 | SDL_PIXELTYPE_ARRAYU8, |
144 | SDL_PIXELTYPE_ARRAYU16, |
145 | SDL_PIXELTYPE_ARRAYU32, |
146 | SDL_PIXELTYPE_ARRAYF16, |
147 | SDL_PIXELTYPE_ARRAYF32, |
148 | /* appended at the end for compatibility with sdl2-compat: */ |
149 | SDL_PIXELTYPE_INDEX2 |
150 | } SDL_PixelType; |
151 | |
152 | /** |
153 | * Bitmap pixel order, high bit -> low bit. |
154 | * |
155 | * \since This enum is available since SDL 3.2.0. |
156 | */ |
157 | typedef enum SDL_BitmapOrder |
158 | { |
159 | SDL_BITMAPORDER_NONE, |
160 | SDL_BITMAPORDER_4321, |
161 | SDL_BITMAPORDER_1234 |
162 | } SDL_BitmapOrder; |
163 | |
164 | /** |
165 | * Packed component order, high bit -> low bit. |
166 | * |
167 | * \since This enum is available since SDL 3.2.0. |
168 | */ |
169 | typedef enum SDL_PackedOrder |
170 | { |
171 | SDL_PACKEDORDER_NONE, |
172 | SDL_PACKEDORDER_XRGB, |
173 | SDL_PACKEDORDER_RGBX, |
174 | SDL_PACKEDORDER_ARGB, |
175 | SDL_PACKEDORDER_RGBA, |
176 | SDL_PACKEDORDER_XBGR, |
177 | SDL_PACKEDORDER_BGRX, |
178 | SDL_PACKEDORDER_ABGR, |
179 | SDL_PACKEDORDER_BGRA |
180 | } SDL_PackedOrder; |
181 | |
182 | /** |
183 | * Array component order, low byte -> high byte. |
184 | * |
185 | * \since This enum is available since SDL 3.2.0. |
186 | */ |
187 | typedef enum SDL_ArrayOrder |
188 | { |
189 | SDL_ARRAYORDER_NONE, |
190 | SDL_ARRAYORDER_RGB, |
191 | SDL_ARRAYORDER_RGBA, |
192 | SDL_ARRAYORDER_ARGB, |
193 | SDL_ARRAYORDER_BGR, |
194 | SDL_ARRAYORDER_BGRA, |
195 | SDL_ARRAYORDER_ABGR |
196 | } SDL_ArrayOrder; |
197 | |
198 | /** |
199 | * Packed component layout. |
200 | * |
201 | * \since This enum is available since SDL 3.2.0. |
202 | */ |
203 | typedef enum SDL_PackedLayout |
204 | { |
205 | SDL_PACKEDLAYOUT_NONE, |
206 | SDL_PACKEDLAYOUT_332, |
207 | SDL_PACKEDLAYOUT_4444, |
208 | SDL_PACKEDLAYOUT_1555, |
209 | SDL_PACKEDLAYOUT_5551, |
210 | SDL_PACKEDLAYOUT_565, |
211 | SDL_PACKEDLAYOUT_8888, |
212 | SDL_PACKEDLAYOUT_2101010, |
213 | SDL_PACKEDLAYOUT_1010102 |
214 | } SDL_PackedLayout; |
215 | |
216 | /** |
217 | * A macro for defining custom FourCC pixel formats. |
218 | * |
219 | * For example, defining SDL_PIXELFORMAT_YV12 looks like this: |
220 | * |
221 | * ```c |
222 | * SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2') |
223 | * ``` |
224 | * |
225 | * \param A the first character of the FourCC code. |
226 | * \param B the second character of the FourCC code. |
227 | * \param C the third character of the FourCC code. |
228 | * \param D the fourth character of the FourCC code. |
229 | * \returns a format value in the style of SDL_PixelFormat. |
230 | * |
231 | * \threadsafety It is safe to call this macro from any thread. |
232 | * |
233 | * \since This macro is available since SDL 3.2.0. |
234 | */ |
235 | #define SDL_DEFINE_PIXELFOURCC(A, B, C, D) SDL_FOURCC(A, B, C, D) |
236 | |
237 | /** |
238 | * A macro for defining custom non-FourCC pixel formats. |
239 | * |
240 | * For example, defining SDL_PIXELFORMAT_RGBA8888 looks like this: |
241 | * |
242 | * ```c |
243 | * SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBA, SDL_PACKEDLAYOUT_8888, 32, 4) |
244 | * ``` |
245 | * |
246 | * \param type the type of the new format, probably a SDL_PixelType value. |
247 | * \param order the order of the new format, probably a SDL_BitmapOrder, |
248 | * SDL_PackedOrder, or SDL_ArrayOrder value. |
249 | * \param layout the layout of the new format, probably an SDL_PackedLayout |
250 | * value or zero. |
251 | * \param bits the number of bits per pixel of the new format. |
252 | * \param bytes the number of bytes per pixel of the new format. |
253 | * \returns a format value in the style of SDL_PixelFormat. |
254 | * |
255 | * \threadsafety It is safe to call this macro from any thread. |
256 | * |
257 | * \since This macro is available since SDL 3.2.0. |
258 | */ |
259 | #define SDL_DEFINE_PIXELFORMAT(type, order, layout, bits, bytes) \ |
260 | ((1 << 28) | ((type) << 24) | ((order) << 20) | ((layout) << 16) | \ |
261 | ((bits) << 8) | ((bytes) << 0)) |
262 | |
263 | /** |
264 | * A macro to retrieve the flags of an SDL_PixelFormat. |
265 | * |
266 | * This macro is generally not needed directly by an app, which should use |
267 | * specific tests, like SDL_ISPIXELFORMAT_FOURCC, instead. |
268 | * |
269 | * \param format an SDL_PixelFormat to check. |
270 | * \returns the flags of `format`. |
271 | * |
272 | * \threadsafety It is safe to call this macro from any thread. |
273 | * |
274 | * \since This macro is available since SDL 3.2.0. |
275 | */ |
276 | #define SDL_PIXELFLAG(format) (((format) >> 28) & 0x0F) |
277 | |
278 | /** |
279 | * A macro to retrieve the type of an SDL_PixelFormat. |
280 | * |
281 | * This is usually a value from the SDL_PixelType enumeration. |
282 | * |
283 | * \param format an SDL_PixelFormat to check. |
284 | * \returns the type of `format`. |
285 | * |
286 | * \threadsafety It is safe to call this macro from any thread. |
287 | * |
288 | * \since This macro is available since SDL 3.2.0. |
289 | */ |
290 | #define SDL_PIXELTYPE(format) (((format) >> 24) & 0x0F) |
291 | |
292 | /** |
293 | * A macro to retrieve the order of an SDL_PixelFormat. |
294 | * |
295 | * This is usually a value from the SDL_BitmapOrder, SDL_PackedOrder, or |
296 | * SDL_ArrayOrder enumerations, depending on the format type. |
297 | * |
298 | * \param format an SDL_PixelFormat to check. |
299 | * \returns the order of `format`. |
300 | * |
301 | * \threadsafety It is safe to call this macro from any thread. |
302 | * |
303 | * \since This macro is available since SDL 3.2.0. |
304 | */ |
305 | #define SDL_PIXELORDER(format) (((format) >> 20) & 0x0F) |
306 | |
307 | /** |
308 | * A macro to retrieve the layout of an SDL_PixelFormat. |
309 | * |
310 | * This is usually a value from the SDL_PackedLayout enumeration, or zero if a |
311 | * layout doesn't make sense for the format type. |
312 | * |
313 | * \param format an SDL_PixelFormat to check. |
314 | * \returns the layout of `format`. |
315 | * |
316 | * \threadsafety It is safe to call this macro from any thread. |
317 | * |
318 | * \since This macro is available since SDL 3.2.0. |
319 | */ |
320 | #define SDL_PIXELLAYOUT(format) (((format) >> 16) & 0x0F) |
321 | |
322 | /** |
323 | * A macro to determine an SDL_PixelFormat's bits per pixel. |
324 | * |
325 | * Note that this macro double-evaluates its parameter, so do not use |
326 | * expressions with side-effects here. |
327 | * |
328 | * FourCC formats will report zero here, as it rarely makes sense to measure |
329 | * them per-pixel. |
330 | * |
331 | * \param format an SDL_PixelFormat to check. |
332 | * \returns the bits-per-pixel of `format`. |
333 | * |
334 | * \threadsafety It is safe to call this macro from any thread. |
335 | * |
336 | * \since This macro is available since SDL 3.2.0. |
337 | * |
338 | * \sa SDL_BYTESPERPIXEL |
339 | */ |
340 | #define SDL_BITSPERPIXEL(format) \ |
341 | (SDL_ISPIXELFORMAT_FOURCC(format) ? 0 : (((format) >> 8) & 0xFF)) |
342 | |
343 | /** |
344 | * A macro to determine an SDL_PixelFormat's bytes per pixel. |
345 | * |
346 | * Note that this macro double-evaluates its parameter, so do not use |
347 | * expressions with side-effects here. |
348 | * |
349 | * FourCC formats do their best here, but many of them don't have a meaningful |
350 | * measurement of bytes per pixel. |
351 | * |
352 | * \param format an SDL_PixelFormat to check. |
353 | * \returns the bytes-per-pixel of `format`. |
354 | * |
355 | * \threadsafety It is safe to call this macro from any thread. |
356 | * |
357 | * \since This macro is available since SDL 3.2.0. |
358 | * |
359 | * \sa SDL_BITSPERPIXEL |
360 | */ |
361 | #define SDL_BYTESPERPIXEL(format) \ |
362 | (SDL_ISPIXELFORMAT_FOURCC(format) ? \ |
363 | ((((format) == SDL_PIXELFORMAT_YUY2) || \ |
364 | ((format) == SDL_PIXELFORMAT_UYVY) || \ |
365 | ((format) == SDL_PIXELFORMAT_YVYU) || \ |
366 | ((format) == SDL_PIXELFORMAT_P010)) ? 2 : 1) : (((format) >> 0) & 0xFF)) |
367 | |
368 | |
369 | /** |
370 | * A macro to determine if an SDL_PixelFormat is an indexed format. |
371 | * |
372 | * Note that this macro double-evaluates its parameter, so do not use |
373 | * expressions with side-effects here. |
374 | * |
375 | * \param format an SDL_PixelFormat to check. |
376 | * \returns true if the format is indexed, false otherwise. |
377 | * |
378 | * \threadsafety It is safe to call this macro from any thread. |
379 | * |
380 | * \since This macro is available since SDL 3.2.0. |
381 | */ |
382 | #define SDL_ISPIXELFORMAT_INDEXED(format) \ |
383 | (!SDL_ISPIXELFORMAT_FOURCC(format) && \ |
384 | ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1) || \ |
385 | (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX2) || \ |
386 | (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4) || \ |
387 | (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8))) |
388 | |
389 | /** |
390 | * A macro to determine if an SDL_PixelFormat is a packed format. |
391 | * |
392 | * Note that this macro double-evaluates its parameter, so do not use |
393 | * expressions with side-effects here. |
394 | * |
395 | * \param format an SDL_PixelFormat to check. |
396 | * \returns true if the format is packed, false otherwise. |
397 | * |
398 | * \threadsafety It is safe to call this macro from any thread. |
399 | * |
400 | * \since This macro is available since SDL 3.2.0. |
401 | */ |
402 | #define SDL_ISPIXELFORMAT_PACKED(format) \ |
403 | (!SDL_ISPIXELFORMAT_FOURCC(format) && \ |
404 | ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED8) || \ |
405 | (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED16) || \ |
406 | (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED32))) |
407 | |
408 | /** |
409 | * A macro to determine if an SDL_PixelFormat is an array format. |
410 | * |
411 | * Note that this macro double-evaluates its parameter, so do not use |
412 | * expressions with side-effects here. |
413 | * |
414 | * \param format an SDL_PixelFormat to check. |
415 | * \returns true if the format is an array, false otherwise. |
416 | * |
417 | * \threadsafety It is safe to call this macro from any thread. |
418 | * |
419 | * \since This macro is available since SDL 3.2.0. |
420 | */ |
421 | #define SDL_ISPIXELFORMAT_ARRAY(format) \ |
422 | (!SDL_ISPIXELFORMAT_FOURCC(format) && \ |
423 | ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU8) || \ |
424 | (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU16) || \ |
425 | (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU32) || \ |
426 | (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF16) || \ |
427 | (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF32))) |
428 | |
429 | /** |
430 | * A macro to determine if an SDL_PixelFormat is a 10-bit format. |
431 | * |
432 | * Note that this macro double-evaluates its parameter, so do not use |
433 | * expressions with side-effects here. |
434 | * |
435 | * \param format an SDL_PixelFormat to check. |
436 | * \returns true if the format is 10-bit, false otherwise. |
437 | * |
438 | * \threadsafety It is safe to call this macro from any thread. |
439 | * |
440 | * \since This macro is available since SDL 3.2.0. |
441 | */ |
442 | #define SDL_ISPIXELFORMAT_10BIT(format) \ |
443 | (!SDL_ISPIXELFORMAT_FOURCC(format) && \ |
444 | ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED32) && \ |
445 | (SDL_PIXELLAYOUT(format) == SDL_PACKEDLAYOUT_2101010))) |
446 | |
447 | /** |
448 | * A macro to determine if an SDL_PixelFormat is a floating point format. |
449 | * |
450 | * Note that this macro double-evaluates its parameter, so do not use |
451 | * expressions with side-effects here. |
452 | * |
453 | * \param format an SDL_PixelFormat to check. |
454 | * \returns true if the format is 10-bit, false otherwise. |
455 | * |
456 | * \threadsafety It is safe to call this macro from any thread. |
457 | * |
458 | * \since This macro is available since SDL 3.2.0. |
459 | */ |
460 | #define SDL_ISPIXELFORMAT_FLOAT(format) \ |
461 | (!SDL_ISPIXELFORMAT_FOURCC(format) && \ |
462 | ((SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF16) || \ |
463 | (SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF32))) |
464 | |
465 | /** |
466 | * A macro to determine if an SDL_PixelFormat has an alpha channel. |
467 | * |
468 | * Note that this macro double-evaluates its parameter, so do not use |
469 | * expressions with side-effects here. |
470 | * |
471 | * \param format an SDL_PixelFormat to check. |
472 | * \returns true if the format has alpha, false otherwise. |
473 | * |
474 | * \threadsafety It is safe to call this macro from any thread. |
475 | * |
476 | * \since This macro is available since SDL 3.2.0. |
477 | */ |
478 | #define SDL_ISPIXELFORMAT_ALPHA(format) \ |
479 | ((SDL_ISPIXELFORMAT_PACKED(format) && \ |
480 | ((SDL_PIXELORDER(format) == SDL_PACKEDORDER_ARGB) || \ |
481 | (SDL_PIXELORDER(format) == SDL_PACKEDORDER_RGBA) || \ |
482 | (SDL_PIXELORDER(format) == SDL_PACKEDORDER_ABGR) || \ |
483 | (SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA))) || \ |
484 | (SDL_ISPIXELFORMAT_ARRAY(format) && \ |
485 | ((SDL_PIXELORDER(format) == SDL_ARRAYORDER_ARGB) || \ |
486 | (SDL_PIXELORDER(format) == SDL_ARRAYORDER_RGBA) || \ |
487 | (SDL_PIXELORDER(format) == SDL_ARRAYORDER_ABGR) || \ |
488 | (SDL_PIXELORDER(format) == SDL_ARRAYORDER_BGRA)))) |
489 | |
490 | |
491 | /** |
492 | * A macro to determine if an SDL_PixelFormat is a "FourCC" format. |
493 | * |
494 | * This covers custom and other unusual formats. |
495 | * |
496 | * Note that this macro double-evaluates its parameter, so do not use |
497 | * expressions with side-effects here. |
498 | * |
499 | * \param format an SDL_PixelFormat to check. |
500 | * \returns true if the format has alpha, false otherwise. |
501 | * |
502 | * \threadsafety It is safe to call this macro from any thread. |
503 | * |
504 | * \since This macro is available since SDL 3.2.0. |
505 | */ |
506 | #define SDL_ISPIXELFORMAT_FOURCC(format) /* The flag is set to 1 because 0x1? is not in the printable ASCII range */ \ |
507 | ((format) && (SDL_PIXELFLAG(format) != 1)) |
508 | |
509 | /* Note: If you modify this enum, update SDL_GetPixelFormatName() */ |
510 | |
511 | /** |
512 | * Pixel format. |
513 | * |
514 | * SDL's pixel formats have the following naming convention: |
515 | * |
516 | * - Names with a list of components and a single bit count, such as RGB24 and |
517 | * ABGR32, define a platform-independent encoding into bytes in the order |
518 | * specified. For example, in RGB24 data, each pixel is encoded in 3 bytes |
519 | * (red, green, blue) in that order, and in ABGR32 data, each pixel is |
520 | * encoded in 4 bytes alpha, blue, green, red) in that order. Use these |
521 | * names if the property of a format that is important to you is the order |
522 | * of the bytes in memory or on disk. |
523 | * - Names with a bit count per component, such as ARGB8888 and XRGB1555, are |
524 | * "packed" into an appropriately-sized integer in the platform's native |
525 | * endianness. For example, ARGB8888 is a sequence of 32-bit integers; in |
526 | * each integer, the most significant bits are alpha, and the least |
527 | * significant bits are blue. On a little-endian CPU such as x86, the least |
528 | * significant bits of each integer are arranged first in memory, but on a |
529 | * big-endian CPU such as s390x, the most significant bits are arranged |
530 | * first. Use these names if the property of a format that is important to |
531 | * you is the meaning of each bit position within a native-endianness |
532 | * integer. |
533 | * - In indexed formats such as INDEX4LSB, each pixel is represented by |
534 | * encoding an index into the palette into the indicated number of bits, |
535 | * with multiple pixels packed into each byte if appropriate. In LSB |
536 | * formats, the first (leftmost) pixel is stored in the least-significant |
537 | * bits of the byte; in MSB formats, it's stored in the most-significant |
538 | * bits. INDEX8 does not need LSB/MSB variants, because each pixel exactly |
539 | * fills one byte. |
540 | * |
541 | * The 32-bit byte-array encodings such as RGBA32 are aliases for the |
542 | * appropriate 8888 encoding for the current platform. For example, RGBA32 is |
543 | * an alias for ABGR8888 on little-endian CPUs like x86, or an alias for |
544 | * RGBA8888 on big-endian CPUs. |
545 | * |
546 | * \since This enum is available since SDL 3.2.0. |
547 | */ |
548 | typedef enum SDL_PixelFormat |
549 | { |
550 | SDL_PIXELFORMAT_UNKNOWN = 0, |
551 | SDL_PIXELFORMAT_INDEX1LSB = 0x11100100u, |
552 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_4321, 0, 1, 0), */ |
553 | SDL_PIXELFORMAT_INDEX1MSB = 0x11200100u, |
554 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1, SDL_BITMAPORDER_1234, 0, 1, 0), */ |
555 | SDL_PIXELFORMAT_INDEX2LSB = 0x1c100200u, |
556 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX2, SDL_BITMAPORDER_4321, 0, 2, 0), */ |
557 | SDL_PIXELFORMAT_INDEX2MSB = 0x1c200200u, |
558 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX2, SDL_BITMAPORDER_1234, 0, 2, 0), */ |
559 | SDL_PIXELFORMAT_INDEX4LSB = 0x12100400u, |
560 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_4321, 0, 4, 0), */ |
561 | SDL_PIXELFORMAT_INDEX4MSB = 0x12200400u, |
562 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4, SDL_BITMAPORDER_1234, 0, 4, 0), */ |
563 | SDL_PIXELFORMAT_INDEX8 = 0x13000801u, |
564 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX8, 0, 0, 8, 1), */ |
565 | SDL_PIXELFORMAT_RGB332 = 0x14110801u, |
566 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED8, SDL_PACKEDORDER_XRGB, SDL_PACKEDLAYOUT_332, 8, 1), */ |
567 | SDL_PIXELFORMAT_XRGB4444 = 0x15120c02u, |
568 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, SDL_PACKEDLAYOUT_4444, 12, 2), */ |
569 | SDL_PIXELFORMAT_XBGR4444 = 0x15520c02u, |
570 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, SDL_PACKEDLAYOUT_4444, 12, 2), */ |
571 | SDL_PIXELFORMAT_XRGB1555 = 0x15130f02u, |
572 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, SDL_PACKEDLAYOUT_1555, 15, 2), */ |
573 | SDL_PIXELFORMAT_XBGR1555 = 0x15530f02u, |
574 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, SDL_PACKEDLAYOUT_1555, 15, 2), */ |
575 | SDL_PIXELFORMAT_ARGB4444 = 0x15321002u, |
576 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB, SDL_PACKEDLAYOUT_4444, 16, 2), */ |
577 | SDL_PIXELFORMAT_RGBA4444 = 0x15421002u, |
578 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA, SDL_PACKEDLAYOUT_4444, 16, 2), */ |
579 | SDL_PIXELFORMAT_ABGR4444 = 0x15721002u, |
580 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR, SDL_PACKEDLAYOUT_4444, 16, 2), */ |
581 | SDL_PIXELFORMAT_BGRA4444 = 0x15821002u, |
582 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA, SDL_PACKEDLAYOUT_4444, 16, 2), */ |
583 | SDL_PIXELFORMAT_ARGB1555 = 0x15331002u, |
584 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ARGB, SDL_PACKEDLAYOUT_1555, 16, 2), */ |
585 | SDL_PIXELFORMAT_RGBA5551 = 0x15441002u, |
586 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_RGBA, SDL_PACKEDLAYOUT_5551, 16, 2), */ |
587 | SDL_PIXELFORMAT_ABGR1555 = 0x15731002u, |
588 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_ABGR, SDL_PACKEDLAYOUT_1555, 16, 2), */ |
589 | SDL_PIXELFORMAT_BGRA5551 = 0x15841002u, |
590 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_BGRA, SDL_PACKEDLAYOUT_5551, 16, 2), */ |
591 | SDL_PIXELFORMAT_RGB565 = 0x15151002u, |
592 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XRGB, SDL_PACKEDLAYOUT_565, 16, 2), */ |
593 | SDL_PIXELFORMAT_BGR565 = 0x15551002u, |
594 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16, SDL_PACKEDORDER_XBGR, SDL_PACKEDLAYOUT_565, 16, 2), */ |
595 | SDL_PIXELFORMAT_RGB24 = 0x17101803u, |
596 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_RGB, 0, 24, 3), */ |
597 | SDL_PIXELFORMAT_BGR24 = 0x17401803u, |
598 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8, SDL_ARRAYORDER_BGR, 0, 24, 3), */ |
599 | SDL_PIXELFORMAT_XRGB8888 = 0x16161804u, |
600 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XRGB, SDL_PACKEDLAYOUT_8888, 24, 4), */ |
601 | SDL_PIXELFORMAT_RGBX8888 = 0x16261804u, |
602 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBX, SDL_PACKEDLAYOUT_8888, 24, 4), */ |
603 | SDL_PIXELFORMAT_XBGR8888 = 0x16561804u, |
604 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XBGR, SDL_PACKEDLAYOUT_8888, 24, 4), */ |
605 | SDL_PIXELFORMAT_BGRX8888 = 0x16661804u, |
606 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRX, SDL_PACKEDLAYOUT_8888, 24, 4), */ |
607 | SDL_PIXELFORMAT_ARGB8888 = 0x16362004u, |
608 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB, SDL_PACKEDLAYOUT_8888, 32, 4), */ |
609 | SDL_PIXELFORMAT_RGBA8888 = 0x16462004u, |
610 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBA, SDL_PACKEDLAYOUT_8888, 32, 4), */ |
611 | SDL_PIXELFORMAT_ABGR8888 = 0x16762004u, |
612 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ABGR, SDL_PACKEDLAYOUT_8888, 32, 4), */ |
613 | SDL_PIXELFORMAT_BGRA8888 = 0x16862004u, |
614 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_BGRA, SDL_PACKEDLAYOUT_8888, 32, 4), */ |
615 | SDL_PIXELFORMAT_XRGB2101010 = 0x16172004u, |
616 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XRGB, SDL_PACKEDLAYOUT_2101010, 32, 4), */ |
617 | SDL_PIXELFORMAT_XBGR2101010 = 0x16572004u, |
618 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_XBGR, SDL_PACKEDLAYOUT_2101010, 32, 4), */ |
619 | SDL_PIXELFORMAT_ARGB2101010 = 0x16372004u, |
620 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ARGB, SDL_PACKEDLAYOUT_2101010, 32, 4), */ |
621 | SDL_PIXELFORMAT_ABGR2101010 = 0x16772004u, |
622 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ABGR, SDL_PACKEDLAYOUT_2101010, 32, 4), */ |
623 | SDL_PIXELFORMAT_RGB48 = 0x18103006u, |
624 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU16, SDL_ARRAYORDER_RGB, 0, 48, 6), */ |
625 | SDL_PIXELFORMAT_BGR48 = 0x18403006u, |
626 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU16, SDL_ARRAYORDER_BGR, 0, 48, 6), */ |
627 | SDL_PIXELFORMAT_RGBA64 = 0x18204008u, |
628 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU16, SDL_ARRAYORDER_RGBA, 0, 64, 8), */ |
629 | SDL_PIXELFORMAT_ARGB64 = 0x18304008u, |
630 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU16, SDL_ARRAYORDER_ARGB, 0, 64, 8), */ |
631 | SDL_PIXELFORMAT_BGRA64 = 0x18504008u, |
632 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU16, SDL_ARRAYORDER_BGRA, 0, 64, 8), */ |
633 | SDL_PIXELFORMAT_ABGR64 = 0x18604008u, |
634 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU16, SDL_ARRAYORDER_ABGR, 0, 64, 8), */ |
635 | SDL_PIXELFORMAT_RGB48_FLOAT = 0x1a103006u, |
636 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYF16, SDL_ARRAYORDER_RGB, 0, 48, 6), */ |
637 | SDL_PIXELFORMAT_BGR48_FLOAT = 0x1a403006u, |
638 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYF16, SDL_ARRAYORDER_BGR, 0, 48, 6), */ |
639 | SDL_PIXELFORMAT_RGBA64_FLOAT = 0x1a204008u, |
640 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYF16, SDL_ARRAYORDER_RGBA, 0, 64, 8), */ |
641 | SDL_PIXELFORMAT_ARGB64_FLOAT = 0x1a304008u, |
642 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYF16, SDL_ARRAYORDER_ARGB, 0, 64, 8), */ |
643 | SDL_PIXELFORMAT_BGRA64_FLOAT = 0x1a504008u, |
644 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYF16, SDL_ARRAYORDER_BGRA, 0, 64, 8), */ |
645 | SDL_PIXELFORMAT_ABGR64_FLOAT = 0x1a604008u, |
646 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYF16, SDL_ARRAYORDER_ABGR, 0, 64, 8), */ |
647 | SDL_PIXELFORMAT_RGB96_FLOAT = 0x1b10600cu, |
648 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYF32, SDL_ARRAYORDER_RGB, 0, 96, 12), */ |
649 | SDL_PIXELFORMAT_BGR96_FLOAT = 0x1b40600cu, |
650 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYF32, SDL_ARRAYORDER_BGR, 0, 96, 12), */ |
651 | SDL_PIXELFORMAT_RGBA128_FLOAT = 0x1b208010u, |
652 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYF32, SDL_ARRAYORDER_RGBA, 0, 128, 16), */ |
653 | SDL_PIXELFORMAT_ARGB128_FLOAT = 0x1b308010u, |
654 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYF32, SDL_ARRAYORDER_ARGB, 0, 128, 16), */ |
655 | SDL_PIXELFORMAT_BGRA128_FLOAT = 0x1b508010u, |
656 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYF32, SDL_ARRAYORDER_BGRA, 0, 128, 16), */ |
657 | SDL_PIXELFORMAT_ABGR128_FLOAT = 0x1b608010u, |
658 | /* SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYF32, SDL_ARRAYORDER_ABGR, 0, 128, 16), */ |
659 | |
660 | SDL_PIXELFORMAT_YV12 = 0x32315659u, /**< Planar mode: Y + V + U (3 planes) */ |
661 | /* SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2'), */ |
662 | SDL_PIXELFORMAT_IYUV = 0x56555949u, /**< Planar mode: Y + U + V (3 planes) */ |
663 | /* SDL_DEFINE_PIXELFOURCC('I', 'Y', 'U', 'V'), */ |
664 | SDL_PIXELFORMAT_YUY2 = 0x32595559u, /**< Packed mode: Y0+U0+Y1+V0 (1 plane) */ |
665 | /* SDL_DEFINE_PIXELFOURCC('Y', 'U', 'Y', '2'), */ |
666 | SDL_PIXELFORMAT_UYVY = 0x59565955u, /**< Packed mode: U0+Y0+V0+Y1 (1 plane) */ |
667 | /* SDL_DEFINE_PIXELFOURCC('U', 'Y', 'V', 'Y'), */ |
668 | SDL_PIXELFORMAT_YVYU = 0x55595659u, /**< Packed mode: Y0+V0+Y1+U0 (1 plane) */ |
669 | /* SDL_DEFINE_PIXELFOURCC('Y', 'V', 'Y', 'U'), */ |
670 | SDL_PIXELFORMAT_NV12 = 0x3231564eu, /**< Planar mode: Y + U/V interleaved (2 planes) */ |
671 | /* SDL_DEFINE_PIXELFOURCC('N', 'V', '1', '2'), */ |
672 | SDL_PIXELFORMAT_NV21 = 0x3132564eu, /**< Planar mode: Y + V/U interleaved (2 planes) */ |
673 | /* SDL_DEFINE_PIXELFOURCC('N', 'V', '2', '1'), */ |
674 | SDL_PIXELFORMAT_P010 = 0x30313050u, /**< Planar mode: Y + U/V interleaved (2 planes) */ |
675 | /* SDL_DEFINE_PIXELFOURCC('P', '0', '1', '0'), */ |
676 | SDL_PIXELFORMAT_EXTERNAL_OES = 0x2053454fu, /**< Android video texture format */ |
677 | /* SDL_DEFINE_PIXELFOURCC('O', 'E', 'S', ' ') */ |
678 | |
679 | SDL_PIXELFORMAT_MJPG = 0x47504a4du, /**< Motion JPEG */ |
680 | /* SDL_DEFINE_PIXELFOURCC('M', 'J', 'P', 'G') */ |
681 | |
682 | /* Aliases for RGBA byte arrays of color data, for the current platform */ |
683 | #if SDL_BYTEORDER == SDL_BIG_ENDIAN |
684 | SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_RGBA8888, |
685 | SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_ARGB8888, |
686 | SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_BGRA8888, |
687 | SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_ABGR8888, |
688 | SDL_PIXELFORMAT_RGBX32 = SDL_PIXELFORMAT_RGBX8888, |
689 | SDL_PIXELFORMAT_XRGB32 = SDL_PIXELFORMAT_XRGB8888, |
690 | SDL_PIXELFORMAT_BGRX32 = SDL_PIXELFORMAT_BGRX8888, |
691 | SDL_PIXELFORMAT_XBGR32 = SDL_PIXELFORMAT_XBGR8888 |
692 | #else |
693 | SDL_PIXELFORMAT_RGBA32 = SDL_PIXELFORMAT_ABGR8888, |
694 | SDL_PIXELFORMAT_ARGB32 = SDL_PIXELFORMAT_BGRA8888, |
695 | SDL_PIXELFORMAT_BGRA32 = SDL_PIXELFORMAT_ARGB8888, |
696 | SDL_PIXELFORMAT_ABGR32 = SDL_PIXELFORMAT_RGBA8888, |
697 | SDL_PIXELFORMAT_RGBX32 = SDL_PIXELFORMAT_XBGR8888, |
698 | SDL_PIXELFORMAT_XRGB32 = SDL_PIXELFORMAT_BGRX8888, |
699 | SDL_PIXELFORMAT_BGRX32 = SDL_PIXELFORMAT_XRGB8888, |
700 | SDL_PIXELFORMAT_XBGR32 = SDL_PIXELFORMAT_RGBX8888 |
701 | #endif |
702 | } SDL_PixelFormat; |
703 | |
704 | /** |
705 | * Colorspace color type. |
706 | * |
707 | * \since This enum is available since SDL 3.2.0. |
708 | */ |
709 | typedef enum SDL_ColorType |
710 | { |
711 | SDL_COLOR_TYPE_UNKNOWN = 0, |
712 | SDL_COLOR_TYPE_RGB = 1, |
713 | SDL_COLOR_TYPE_YCBCR = 2 |
714 | } SDL_ColorType; |
715 | |
716 | /** |
717 | * Colorspace color range, as described by |
718 | * https://www.itu.int/rec/R-REC-BT.2100-2-201807-I/en |
719 | * |
720 | * \since This enum is available since SDL 3.2.0. |
721 | */ |
722 | typedef enum SDL_ColorRange |
723 | { |
724 | SDL_COLOR_RANGE_UNKNOWN = 0, |
725 | SDL_COLOR_RANGE_LIMITED = 1, /**< Narrow range, e.g. 16-235 for 8-bit RGB and luma, and 16-240 for 8-bit chroma */ |
726 | SDL_COLOR_RANGE_FULL = 2 /**< Full range, e.g. 0-255 for 8-bit RGB and luma, and 1-255 for 8-bit chroma */ |
727 | } SDL_ColorRange; |
728 | |
729 | /** |
730 | * Colorspace color primaries, as described by |
731 | * https://www.itu.int/rec/T-REC-H.273-201612-S/en |
732 | * |
733 | * \since This enum is available since SDL 3.2.0. |
734 | */ |
735 | typedef enum SDL_ColorPrimaries |
736 | { |
737 | SDL_COLOR_PRIMARIES_UNKNOWN = 0, |
738 | SDL_COLOR_PRIMARIES_BT709 = 1, /**< ITU-R BT.709-6 */ |
739 | SDL_COLOR_PRIMARIES_UNSPECIFIED = 2, |
740 | SDL_COLOR_PRIMARIES_BT470M = 4, /**< ITU-R BT.470-6 System M */ |
741 | SDL_COLOR_PRIMARIES_BT470BG = 5, /**< ITU-R BT.470-6 System B, G / ITU-R BT.601-7 625 */ |
742 | SDL_COLOR_PRIMARIES_BT601 = 6, /**< ITU-R BT.601-7 525, SMPTE 170M */ |
743 | SDL_COLOR_PRIMARIES_SMPTE240 = 7, /**< SMPTE 240M, functionally the same as SDL_COLOR_PRIMARIES_BT601 */ |
744 | SDL_COLOR_PRIMARIES_GENERIC_FILM = 8, /**< Generic film (color filters using Illuminant C) */ |
745 | SDL_COLOR_PRIMARIES_BT2020 = 9, /**< ITU-R BT.2020-2 / ITU-R BT.2100-0 */ |
746 | SDL_COLOR_PRIMARIES_XYZ = 10, /**< SMPTE ST 428-1 */ |
747 | SDL_COLOR_PRIMARIES_SMPTE431 = 11, /**< SMPTE RP 431-2 */ |
748 | SDL_COLOR_PRIMARIES_SMPTE432 = 12, /**< SMPTE EG 432-1 / DCI P3 */ |
749 | SDL_COLOR_PRIMARIES_EBU3213 = 22, /**< EBU Tech. 3213-E */ |
750 | SDL_COLOR_PRIMARIES_CUSTOM = 31 |
751 | } SDL_ColorPrimaries; |
752 | |
753 | /** |
754 | * Colorspace transfer characteristics. |
755 | * |
756 | * These are as described by https://www.itu.int/rec/T-REC-H.273-201612-S/en |
757 | * |
758 | * \since This enum is available since SDL 3.2.0. |
759 | */ |
760 | typedef enum SDL_TransferCharacteristics |
761 | { |
762 | SDL_TRANSFER_CHARACTERISTICS_UNKNOWN = 0, |
763 | SDL_TRANSFER_CHARACTERISTICS_BT709 = 1, /**< Rec. ITU-R BT.709-6 / ITU-R BT1361 */ |
764 | SDL_TRANSFER_CHARACTERISTICS_UNSPECIFIED = 2, |
765 | SDL_TRANSFER_CHARACTERISTICS_GAMMA22 = 4, /**< ITU-R BT.470-6 System M / ITU-R BT1700 625 PAL & SECAM */ |
766 | SDL_TRANSFER_CHARACTERISTICS_GAMMA28 = 5, /**< ITU-R BT.470-6 System B, G */ |
767 | SDL_TRANSFER_CHARACTERISTICS_BT601 = 6, /**< SMPTE ST 170M / ITU-R BT.601-7 525 or 625 */ |
768 | SDL_TRANSFER_CHARACTERISTICS_SMPTE240 = 7, /**< SMPTE ST 240M */ |
769 | SDL_TRANSFER_CHARACTERISTICS_LINEAR = 8, |
770 | SDL_TRANSFER_CHARACTERISTICS_LOG100 = 9, |
771 | SDL_TRANSFER_CHARACTERISTICS_LOG100_SQRT10 = 10, |
772 | SDL_TRANSFER_CHARACTERISTICS_IEC61966 = 11, /**< IEC 61966-2-4 */ |
773 | SDL_TRANSFER_CHARACTERISTICS_BT1361 = 12, /**< ITU-R BT1361 Extended Colour Gamut */ |
774 | SDL_TRANSFER_CHARACTERISTICS_SRGB = 13, /**< IEC 61966-2-1 (sRGB or sYCC) */ |
775 | SDL_TRANSFER_CHARACTERISTICS_BT2020_10BIT = 14, /**< ITU-R BT2020 for 10-bit system */ |
776 | SDL_TRANSFER_CHARACTERISTICS_BT2020_12BIT = 15, /**< ITU-R BT2020 for 12-bit system */ |
777 | SDL_TRANSFER_CHARACTERISTICS_PQ = 16, /**< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems */ |
778 | SDL_TRANSFER_CHARACTERISTICS_SMPTE428 = 17, /**< SMPTE ST 428-1 */ |
779 | SDL_TRANSFER_CHARACTERISTICS_HLG = 18, /**< ARIB STD-B67, known as "hybrid log-gamma" (HLG) */ |
780 | SDL_TRANSFER_CHARACTERISTICS_CUSTOM = 31 |
781 | } SDL_TransferCharacteristics; |
782 | |
783 | /** |
784 | * Colorspace matrix coefficients. |
785 | * |
786 | * These are as described by https://www.itu.int/rec/T-REC-H.273-201612-S/en |
787 | * |
788 | * \since This enum is available since SDL 3.2.0. |
789 | */ |
790 | typedef enum SDL_MatrixCoefficients |
791 | { |
792 | SDL_MATRIX_COEFFICIENTS_IDENTITY = 0, |
793 | SDL_MATRIX_COEFFICIENTS_BT709 = 1, /**< ITU-R BT.709-6 */ |
794 | SDL_MATRIX_COEFFICIENTS_UNSPECIFIED = 2, |
795 | SDL_MATRIX_COEFFICIENTS_FCC = 4, /**< US FCC Title 47 */ |
796 | SDL_MATRIX_COEFFICIENTS_BT470BG = 5, /**< ITU-R BT.470-6 System B, G / ITU-R BT.601-7 625, functionally the same as SDL_MATRIX_COEFFICIENTS_BT601 */ |
797 | SDL_MATRIX_COEFFICIENTS_BT601 = 6, /**< ITU-R BT.601-7 525 */ |
798 | SDL_MATRIX_COEFFICIENTS_SMPTE240 = 7, /**< SMPTE 240M */ |
799 | SDL_MATRIX_COEFFICIENTS_YCGCO = 8, |
800 | SDL_MATRIX_COEFFICIENTS_BT2020_NCL = 9, /**< ITU-R BT.2020-2 non-constant luminance */ |
801 | SDL_MATRIX_COEFFICIENTS_BT2020_CL = 10, /**< ITU-R BT.2020-2 constant luminance */ |
802 | SDL_MATRIX_COEFFICIENTS_SMPTE2085 = 11, /**< SMPTE ST 2085 */ |
803 | SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_NCL = 12, |
804 | SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_CL = 13, |
805 | SDL_MATRIX_COEFFICIENTS_ICTCP = 14, /**< ITU-R BT.2100-0 ICTCP */ |
806 | SDL_MATRIX_COEFFICIENTS_CUSTOM = 31 |
807 | } SDL_MatrixCoefficients; |
808 | |
809 | /** |
810 | * Colorspace chroma sample location. |
811 | * |
812 | * \since This enum is available since SDL 3.2.0. |
813 | */ |
814 | typedef enum SDL_ChromaLocation |
815 | { |
816 | SDL_CHROMA_LOCATION_NONE = 0, /**< RGB, no chroma sampling */ |
817 | SDL_CHROMA_LOCATION_LEFT = 1, /**< In MPEG-2, MPEG-4, and AVC, Cb and Cr are taken on midpoint of the left-edge of the 2x2 square. In other words, they have the same horizontal location as the top-left pixel, but is shifted one-half pixel down vertically. */ |
818 | SDL_CHROMA_LOCATION_CENTER = 2, /**< In JPEG/JFIF, H.261, and MPEG-1, Cb and Cr are taken at the center of the 2x2 square. In other words, they are offset one-half pixel to the right and one-half pixel down compared to the top-left pixel. */ |
819 | SDL_CHROMA_LOCATION_TOPLEFT = 3 /**< In HEVC for BT.2020 and BT.2100 content (in particular on Blu-rays), Cb and Cr are sampled at the same location as the group's top-left Y pixel ("co-sited", "co-located"). */ |
820 | } SDL_ChromaLocation; |
821 | |
822 | |
823 | /* Colorspace definition */ |
824 | |
825 | /** |
826 | * A macro for defining custom SDL_Colorspace formats. |
827 | * |
828 | * For example, defining SDL_COLORSPACE_SRGB looks like this: |
829 | * |
830 | * ```c |
831 | * SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_RGB, |
832 | * SDL_COLOR_RANGE_FULL, |
833 | * SDL_COLOR_PRIMARIES_BT709, |
834 | * SDL_TRANSFER_CHARACTERISTICS_SRGB, |
835 | * SDL_MATRIX_COEFFICIENTS_IDENTITY, |
836 | * SDL_CHROMA_LOCATION_NONE) |
837 | * ``` |
838 | * |
839 | * \param type the type of the new format, probably an SDL_ColorType value. |
840 | * \param range the range of the new format, probably a SDL_ColorRange value. |
841 | * \param primaries the primaries of the new format, probably an |
842 | * SDL_ColorPrimaries value. |
843 | * \param transfer the transfer characteristics of the new format, probably an |
844 | * SDL_TransferCharacteristics value. |
845 | * \param matrix the matrix coefficients of the new format, probably an |
846 | * SDL_MatrixCoefficients value. |
847 | * \param chroma the chroma sample location of the new format, probably an |
848 | * SDL_ChromaLocation value. |
849 | * \returns a format value in the style of SDL_Colorspace. |
850 | * |
851 | * \threadsafety It is safe to call this macro from any thread. |
852 | * |
853 | * \since This macro is available since SDL 3.2.0. |
854 | */ |
855 | #define SDL_DEFINE_COLORSPACE(type, range, primaries, transfer, matrix, chroma) \ |
856 | (((Uint32)(type) << 28) | ((Uint32)(range) << 24) | ((Uint32)(chroma) << 20) | \ |
857 | ((Uint32)(primaries) << 10) | ((Uint32)(transfer) << 5) | ((Uint32)(matrix) << 0)) |
858 | |
859 | /** |
860 | * A macro to retrieve the type of an SDL_Colorspace. |
861 | * |
862 | * \param cspace an SDL_Colorspace to check. |
863 | * \returns the SDL_ColorType for `cspace`. |
864 | * |
865 | * \threadsafety It is safe to call this macro from any thread. |
866 | * |
867 | * \since This macro is available since SDL 3.2.0. |
868 | */ |
869 | #define SDL_COLORSPACETYPE(cspace) (SDL_ColorType)(((cspace) >> 28) & 0x0F) |
870 | |
871 | /** |
872 | * A macro to retrieve the range of an SDL_Colorspace. |
873 | * |
874 | * \param cspace an SDL_Colorspace to check. |
875 | * \returns the SDL_ColorRange of `cspace`. |
876 | * |
877 | * \threadsafety It is safe to call this macro from any thread. |
878 | * |
879 | * \since This macro is available since SDL 3.2.0. |
880 | */ |
881 | #define SDL_COLORSPACERANGE(cspace) (SDL_ColorRange)(((cspace) >> 24) & 0x0F) |
882 | |
883 | /** |
884 | * A macro to retrieve the chroma sample location of an SDL_Colorspace. |
885 | * |
886 | * \param cspace an SDL_Colorspace to check. |
887 | * \returns the SDL_ChromaLocation of `cspace`. |
888 | * |
889 | * \threadsafety It is safe to call this macro from any thread. |
890 | * |
891 | * \since This macro is available since SDL 3.2.0. |
892 | */ |
893 | #define SDL_COLORSPACECHROMA(cspace) (SDL_ChromaLocation)(((cspace) >> 20) & 0x0F) |
894 | |
895 | /** |
896 | * A macro to retrieve the primaries of an SDL_Colorspace. |
897 | * |
898 | * \param cspace an SDL_Colorspace to check. |
899 | * \returns the SDL_ColorPrimaries of `cspace`. |
900 | * |
901 | * \threadsafety It is safe to call this macro from any thread. |
902 | * |
903 | * \since This macro is available since SDL 3.2.0. |
904 | */ |
905 | #define SDL_COLORSPACEPRIMARIES(cspace) (SDL_ColorPrimaries)(((cspace) >> 10) & 0x1F) |
906 | |
907 | /** |
908 | * A macro to retrieve the transfer characteristics of an SDL_Colorspace. |
909 | * |
910 | * \param cspace an SDL_Colorspace to check. |
911 | * \returns the SDL_TransferCharacteristics of `cspace`. |
912 | * |
913 | * \threadsafety It is safe to call this macro from any thread. |
914 | * |
915 | * \since This macro is available since SDL 3.2.0. |
916 | */ |
917 | #define SDL_COLORSPACETRANSFER(cspace) (SDL_TransferCharacteristics)(((cspace) >> 5) & 0x1F) |
918 | |
919 | /** |
920 | * A macro to retrieve the matrix coefficients of an SDL_Colorspace. |
921 | * |
922 | * \param cspace an SDL_Colorspace to check. |
923 | * \returns the SDL_MatrixCoefficients of `cspace`. |
924 | * |
925 | * \threadsafety It is safe to call this macro from any thread. |
926 | * |
927 | * \since This macro is available since SDL 3.2.0. |
928 | */ |
929 | #define SDL_COLORSPACEMATRIX(cspace) (SDL_MatrixCoefficients)((cspace) & 0x1F) |
930 | |
931 | /** |
932 | * A macro to determine if an SDL_Colorspace uses BT601 (or BT470BG) matrix |
933 | * coefficients. |
934 | * |
935 | * Note that this macro double-evaluates its parameter, so do not use |
936 | * expressions with side-effects here. |
937 | * |
938 | * \param cspace an SDL_Colorspace to check. |
939 | * \returns true if BT601 or BT470BG, false otherwise. |
940 | * |
941 | * \threadsafety It is safe to call this macro from any thread. |
942 | * |
943 | * \since This macro is available since SDL 3.2.0. |
944 | */ |
945 | #define SDL_ISCOLORSPACE_MATRIX_BT601(cspace) (SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT601 || SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT470BG) |
946 | |
947 | /** |
948 | * A macro to determine if an SDL_Colorspace uses BT709 matrix coefficients. |
949 | * |
950 | * \param cspace an SDL_Colorspace to check. |
951 | * \returns true if BT709, false otherwise. |
952 | * |
953 | * \threadsafety It is safe to call this macro from any thread. |
954 | * |
955 | * \since This macro is available since SDL 3.2.0. |
956 | */ |
957 | #define SDL_ISCOLORSPACE_MATRIX_BT709(cspace) (SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT709) |
958 | |
959 | /** |
960 | * A macro to determine if an SDL_Colorspace uses BT2020_NCL matrix |
961 | * coefficients. |
962 | * |
963 | * \param cspace an SDL_Colorspace to check. |
964 | * \returns true if BT2020_NCL, false otherwise. |
965 | * |
966 | * \threadsafety It is safe to call this macro from any thread. |
967 | * |
968 | * \since This macro is available since SDL 3.2.0. |
969 | */ |
970 | #define SDL_ISCOLORSPACE_MATRIX_BT2020_NCL(cspace) (SDL_COLORSPACEMATRIX(cspace) == SDL_MATRIX_COEFFICIENTS_BT2020_NCL) |
971 | |
972 | /** |
973 | * A macro to determine if an SDL_Colorspace has a limited range. |
974 | * |
975 | * \param cspace an SDL_Colorspace to check. |
976 | * \returns true if limited range, false otherwise. |
977 | * |
978 | * \threadsafety It is safe to call this macro from any thread. |
979 | * |
980 | * \since This macro is available since SDL 3.2.0. |
981 | */ |
982 | #define SDL_ISCOLORSPACE_LIMITED_RANGE(cspace) (SDL_COLORSPACERANGE(cspace) != SDL_COLOR_RANGE_FULL) |
983 | |
984 | /** |
985 | * A macro to determine if an SDL_Colorspace has a full range. |
986 | * |
987 | * \param cspace an SDL_Colorspace to check. |
988 | * \returns true if full range, false otherwise. |
989 | * |
990 | * \threadsafety It is safe to call this macro from any thread. |
991 | * |
992 | * \since This macro is available since SDL 3.2.0. |
993 | */ |
994 | #define SDL_ISCOLORSPACE_FULL_RANGE(cspace) (SDL_COLORSPACERANGE(cspace) == SDL_COLOR_RANGE_FULL) |
995 | |
996 | /** |
997 | * Colorspace definitions. |
998 | * |
999 | * Since similar colorspaces may vary in their details (matrix, transfer |
1000 | * function, etc.), this is not an exhaustive list, but rather a |
1001 | * representative sample of the kinds of colorspaces supported in SDL. |
1002 | * |
1003 | * \since This enum is available since SDL 3.2.0. |
1004 | * |
1005 | * \sa SDL_ColorPrimaries |
1006 | * \sa SDL_ColorRange |
1007 | * \sa SDL_ColorType |
1008 | * \sa SDL_MatrixCoefficients |
1009 | * \sa SDL_TransferCharacteristics |
1010 | */ |
1011 | typedef enum SDL_Colorspace |
1012 | { |
1013 | SDL_COLORSPACE_UNKNOWN = 0, |
1014 | |
1015 | /* sRGB is a gamma corrected colorspace, and the default colorspace for SDL rendering and 8-bit RGB surfaces */ |
1016 | SDL_COLORSPACE_SRGB = 0x120005a0u, /**< Equivalent to DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709 */ |
1017 | /* SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_RGB, |
1018 | SDL_COLOR_RANGE_FULL, |
1019 | SDL_COLOR_PRIMARIES_BT709, |
1020 | SDL_TRANSFER_CHARACTERISTICS_SRGB, |
1021 | SDL_MATRIX_COEFFICIENTS_IDENTITY, |
1022 | SDL_CHROMA_LOCATION_NONE), */ |
1023 | |
1024 | /* This is a linear colorspace and the default colorspace for floating point surfaces. On Windows this is the scRGB colorspace, and on Apple platforms this is kCGColorSpaceExtendedLinearSRGB for EDR content */ |
1025 | SDL_COLORSPACE_SRGB_LINEAR = 0x12000500u, /**< Equivalent to DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709 */ |
1026 | /* SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_RGB, |
1027 | SDL_COLOR_RANGE_FULL, |
1028 | SDL_COLOR_PRIMARIES_BT709, |
1029 | SDL_TRANSFER_CHARACTERISTICS_LINEAR, |
1030 | SDL_MATRIX_COEFFICIENTS_IDENTITY, |
1031 | SDL_CHROMA_LOCATION_NONE), */ |
1032 | |
1033 | /* HDR10 is a non-linear HDR colorspace and the default colorspace for 10-bit surfaces */ |
1034 | SDL_COLORSPACE_HDR10 = 0x12002600u, /**< Equivalent to DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020 */ |
1035 | /* SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_RGB, |
1036 | SDL_COLOR_RANGE_FULL, |
1037 | SDL_COLOR_PRIMARIES_BT2020, |
1038 | SDL_TRANSFER_CHARACTERISTICS_PQ, |
1039 | SDL_MATRIX_COEFFICIENTS_IDENTITY, |
1040 | SDL_CHROMA_LOCATION_NONE), */ |
1041 | |
1042 | SDL_COLORSPACE_JPEG = 0x220004c6u, /**< Equivalent to DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601 */ |
1043 | /* SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_YCBCR, |
1044 | SDL_COLOR_RANGE_FULL, |
1045 | SDL_COLOR_PRIMARIES_BT709, |
1046 | SDL_TRANSFER_CHARACTERISTICS_BT601, |
1047 | SDL_MATRIX_COEFFICIENTS_BT601, |
1048 | SDL_CHROMA_LOCATION_NONE), */ |
1049 | |
1050 | SDL_COLORSPACE_BT601_LIMITED = 0x211018c6u, /**< Equivalent to DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601 */ |
1051 | /* SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_YCBCR, |
1052 | SDL_COLOR_RANGE_LIMITED, |
1053 | SDL_COLOR_PRIMARIES_BT601, |
1054 | SDL_TRANSFER_CHARACTERISTICS_BT601, |
1055 | SDL_MATRIX_COEFFICIENTS_BT601, |
1056 | SDL_CHROMA_LOCATION_LEFT), */ |
1057 | |
1058 | SDL_COLORSPACE_BT601_FULL = 0x221018c6u, /**< Equivalent to DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601 */ |
1059 | /* SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_YCBCR, |
1060 | SDL_COLOR_RANGE_FULL, |
1061 | SDL_COLOR_PRIMARIES_BT601, |
1062 | SDL_TRANSFER_CHARACTERISTICS_BT601, |
1063 | SDL_MATRIX_COEFFICIENTS_BT601, |
1064 | SDL_CHROMA_LOCATION_LEFT), */ |
1065 | |
1066 | SDL_COLORSPACE_BT709_LIMITED = 0x21100421u, /**< Equivalent to DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 */ |
1067 | /* SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_YCBCR, |
1068 | SDL_COLOR_RANGE_LIMITED, |
1069 | SDL_COLOR_PRIMARIES_BT709, |
1070 | SDL_TRANSFER_CHARACTERISTICS_BT709, |
1071 | SDL_MATRIX_COEFFICIENTS_BT709, |
1072 | SDL_CHROMA_LOCATION_LEFT), */ |
1073 | |
1074 | SDL_COLORSPACE_BT709_FULL = 0x22100421u, /**< Equivalent to DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709 */ |
1075 | /* SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_YCBCR, |
1076 | SDL_COLOR_RANGE_FULL, |
1077 | SDL_COLOR_PRIMARIES_BT709, |
1078 | SDL_TRANSFER_CHARACTERISTICS_BT709, |
1079 | SDL_MATRIX_COEFFICIENTS_BT709, |
1080 | SDL_CHROMA_LOCATION_LEFT), */ |
1081 | |
1082 | SDL_COLORSPACE_BT2020_LIMITED = 0x21102609u, /**< Equivalent to DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020 */ |
1083 | /* SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_YCBCR, |
1084 | SDL_COLOR_RANGE_LIMITED, |
1085 | SDL_COLOR_PRIMARIES_BT2020, |
1086 | SDL_TRANSFER_CHARACTERISTICS_PQ, |
1087 | SDL_MATRIX_COEFFICIENTS_BT2020_NCL, |
1088 | SDL_CHROMA_LOCATION_LEFT), */ |
1089 | |
1090 | SDL_COLORSPACE_BT2020_FULL = 0x22102609u, /**< Equivalent to DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020 */ |
1091 | /* SDL_DEFINE_COLORSPACE(SDL_COLOR_TYPE_YCBCR, |
1092 | SDL_COLOR_RANGE_FULL, |
1093 | SDL_COLOR_PRIMARIES_BT2020, |
1094 | SDL_TRANSFER_CHARACTERISTICS_PQ, |
1095 | SDL_MATRIX_COEFFICIENTS_BT2020_NCL, |
1096 | SDL_CHROMA_LOCATION_LEFT), */ |
1097 | |
1098 | SDL_COLORSPACE_RGB_DEFAULT = SDL_COLORSPACE_SRGB, /**< The default colorspace for RGB surfaces if no colorspace is specified */ |
1099 | SDL_COLORSPACE_YUV_DEFAULT = SDL_COLORSPACE_JPEG /**< The default colorspace for YUV surfaces if no colorspace is specified */ |
1100 | } SDL_Colorspace; |
1101 | |
1102 | /** |
1103 | * A structure that represents a color as RGBA components. |
1104 | * |
1105 | * The bits of this structure can be directly reinterpreted as an |
1106 | * integer-packed color which uses the SDL_PIXELFORMAT_RGBA32 format |
1107 | * (SDL_PIXELFORMAT_ABGR8888 on little-endian systems and |
1108 | * SDL_PIXELFORMAT_RGBA8888 on big-endian systems). |
1109 | * |
1110 | * \since This struct is available since SDL 3.2.0. |
1111 | */ |
1112 | typedef struct SDL_Color |
1113 | { |
1114 | Uint8 r; |
1115 | Uint8 g; |
1116 | Uint8 b; |
1117 | Uint8 a; |
1118 | } SDL_Color; |
1119 | |
1120 | /** |
1121 | * The bits of this structure can be directly reinterpreted as a float-packed |
1122 | * color which uses the SDL_PIXELFORMAT_RGBA128_FLOAT format |
1123 | * |
1124 | * \since This struct is available since SDL 3.2.0. |
1125 | */ |
1126 | typedef struct SDL_FColor |
1127 | { |
1128 | float r; |
1129 | float g; |
1130 | float b; |
1131 | float a; |
1132 | } SDL_FColor; |
1133 | |
1134 | /** |
1135 | * A set of indexed colors representing a palette. |
1136 | * |
1137 | * \since This struct is available since SDL 3.2.0. |
1138 | * |
1139 | * \sa SDL_SetPaletteColors |
1140 | */ |
1141 | typedef struct SDL_Palette |
1142 | { |
1143 | int ncolors; /**< number of elements in `colors`. */ |
1144 | SDL_Color *colors; /**< an array of colors, `ncolors` long. */ |
1145 | Uint32 version; /**< internal use only, do not touch. */ |
1146 | int refcount; /**< internal use only, do not touch. */ |
1147 | } SDL_Palette; |
1148 | |
1149 | /** |
1150 | * Details about the format of a pixel. |
1151 | * |
1152 | * \since This struct is available since SDL 3.2.0. |
1153 | */ |
1154 | typedef struct SDL_PixelFormatDetails |
1155 | { |
1156 | SDL_PixelFormat format; |
1157 | Uint8 bits_per_pixel; |
1158 | Uint8 bytes_per_pixel; |
1159 | Uint8 padding[2]; |
1160 | Uint32 Rmask; |
1161 | Uint32 Gmask; |
1162 | Uint32 Bmask; |
1163 | Uint32 Amask; |
1164 | Uint8 Rbits; |
1165 | Uint8 Gbits; |
1166 | Uint8 Bbits; |
1167 | Uint8 Abits; |
1168 | Uint8 Rshift; |
1169 | Uint8 Gshift; |
1170 | Uint8 Bshift; |
1171 | Uint8 Ashift; |
1172 | } SDL_PixelFormatDetails; |
1173 | |
1174 | /** |
1175 | * Get the human readable name of a pixel format. |
1176 | * |
1177 | * \param format the pixel format to query. |
1178 | * \returns the human readable name of the specified pixel format or |
1179 | * "SDL_PIXELFORMAT_UNKNOWN" if the format isn't recognized. |
1180 | * |
1181 | * \threadsafety It is safe to call this function from any thread. |
1182 | * |
1183 | * \since This function is available since SDL 3.2.0. |
1184 | */ |
1185 | extern SDL_DECLSPEC const char * SDLCALL SDL_GetPixelFormatName(SDL_PixelFormat format); |
1186 | |
1187 | /** |
1188 | * Convert one of the enumerated pixel formats to a bpp value and RGBA masks. |
1189 | * |
1190 | * \param format one of the SDL_PixelFormat values. |
1191 | * \param bpp a bits per pixel value; usually 15, 16, or 32. |
1192 | * \param Rmask a pointer filled in with the red mask for the format. |
1193 | * \param Gmask a pointer filled in with the green mask for the format. |
1194 | * \param Bmask a pointer filled in with the blue mask for the format. |
1195 | * \param Amask a pointer filled in with the alpha mask for the format. |
1196 | * \returns true on success or false on failure; call SDL_GetError() for more |
1197 | * information. |
1198 | * |
1199 | * \threadsafety It is safe to call this function from any thread. |
1200 | * |
1201 | * \since This function is available since SDL 3.2.0. |
1202 | * |
1203 | * \sa SDL_GetPixelFormatForMasks |
1204 | */ |
1205 | extern SDL_DECLSPEC bool SDLCALL SDL_GetMasksForPixelFormat(SDL_PixelFormat format, int *bpp, Uint32 *Rmask, Uint32 *Gmask, Uint32 *Bmask, Uint32 *Amask); |
1206 | |
1207 | /** |
1208 | * Convert a bpp value and RGBA masks to an enumerated pixel format. |
1209 | * |
1210 | * This will return `SDL_PIXELFORMAT_UNKNOWN` if the conversion wasn't |
1211 | * possible. |
1212 | * |
1213 | * \param bpp a bits per pixel value; usually 15, 16, or 32. |
1214 | * \param Rmask the red mask for the format. |
1215 | * \param Gmask the green mask for the format. |
1216 | * \param Bmask the blue mask for the format. |
1217 | * \param Amask the alpha mask for the format. |
1218 | * \returns the SDL_PixelFormat value corresponding to the format masks, or |
1219 | * SDL_PIXELFORMAT_UNKNOWN if there isn't a match. |
1220 | * |
1221 | * \threadsafety It is safe to call this function from any thread. |
1222 | * |
1223 | * \since This function is available since SDL 3.2.0. |
1224 | * |
1225 | * \sa SDL_GetMasksForPixelFormat |
1226 | */ |
1227 | extern SDL_DECLSPEC SDL_PixelFormat SDLCALL SDL_GetPixelFormatForMasks(int bpp, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask); |
1228 | |
1229 | /** |
1230 | * Create an SDL_PixelFormatDetails structure corresponding to a pixel format. |
1231 | * |
1232 | * Returned structure may come from a shared global cache (i.e. not newly |
1233 | * allocated), and hence should not be modified, especially the palette. Weird |
1234 | * errors such as `Blit combination not supported` may occur. |
1235 | * |
1236 | * \param format one of the SDL_PixelFormat values. |
1237 | * \returns a pointer to a SDL_PixelFormatDetails structure or NULL on |
1238 | * failure; call SDL_GetError() for more information. |
1239 | * |
1240 | * \threadsafety It is safe to call this function from any thread. |
1241 | * |
1242 | * \since This function is available since SDL 3.2.0. |
1243 | */ |
1244 | extern SDL_DECLSPEC const SDL_PixelFormatDetails * SDLCALL SDL_GetPixelFormatDetails(SDL_PixelFormat format); |
1245 | |
1246 | /** |
1247 | * Create a palette structure with the specified number of color entries. |
1248 | * |
1249 | * The palette entries are initialized to white. |
1250 | * |
1251 | * \param ncolors represents the number of color entries in the color palette. |
1252 | * \returns a new SDL_Palette structure on success or NULL on failure (e.g. if |
1253 | * there wasn't enough memory); call SDL_GetError() for more |
1254 | * information. |
1255 | * |
1256 | * \threadsafety It is safe to call this function from any thread. |
1257 | * |
1258 | * \since This function is available since SDL 3.2.0. |
1259 | * |
1260 | * \sa SDL_DestroyPalette |
1261 | * \sa SDL_SetPaletteColors |
1262 | * \sa SDL_SetSurfacePalette |
1263 | */ |
1264 | extern SDL_DECLSPEC SDL_Palette * SDLCALL SDL_CreatePalette(int ncolors); |
1265 | |
1266 | /** |
1267 | * Set a range of colors in a palette. |
1268 | * |
1269 | * \param palette the SDL_Palette structure to modify. |
1270 | * \param colors an array of SDL_Color structures to copy into the palette. |
1271 | * \param firstcolor the index of the first palette entry to modify. |
1272 | * \param ncolors the number of entries to modify. |
1273 | * \returns true on success or false on failure; call SDL_GetError() for more |
1274 | * information. |
1275 | * |
1276 | * \threadsafety It is safe to call this function from any thread, as long as |
1277 | * the palette is not modified or destroyed in another thread. |
1278 | * |
1279 | * \since This function is available since SDL 3.2.0. |
1280 | */ |
1281 | extern SDL_DECLSPEC bool SDLCALL SDL_SetPaletteColors(SDL_Palette *palette, const SDL_Color *colors, int firstcolor, int ncolors); |
1282 | |
1283 | /** |
1284 | * Free a palette created with SDL_CreatePalette(). |
1285 | * |
1286 | * \param palette the SDL_Palette structure to be freed. |
1287 | * |
1288 | * \threadsafety It is safe to call this function from any thread, as long as |
1289 | * the palette is not modified or destroyed in another thread. |
1290 | * |
1291 | * \since This function is available since SDL 3.2.0. |
1292 | * |
1293 | * \sa SDL_CreatePalette |
1294 | */ |
1295 | extern SDL_DECLSPEC void SDLCALL SDL_DestroyPalette(SDL_Palette *palette); |
1296 | |
1297 | /** |
1298 | * Map an RGB triple to an opaque pixel value for a given pixel format. |
1299 | * |
1300 | * This function maps the RGB color value to the specified pixel format and |
1301 | * returns the pixel value best approximating the given RGB color value for |
1302 | * the given pixel format. |
1303 | * |
1304 | * If the format has a palette (8-bit) the index of the closest matching color |
1305 | * in the palette will be returned. |
1306 | * |
1307 | * If the specified pixel format has an alpha component it will be returned as |
1308 | * all 1 bits (fully opaque). |
1309 | * |
1310 | * If the pixel format bpp (color depth) is less than 32-bpp then the unused |
1311 | * upper bits of the return value can safely be ignored (e.g., with a 16-bpp |
1312 | * format the return value can be assigned to a Uint16, and similarly a Uint8 |
1313 | * for an 8-bpp format). |
1314 | * |
1315 | * \param format a pointer to SDL_PixelFormatDetails describing the pixel |
1316 | * format. |
1317 | * \param palette an optional palette for indexed formats, may be NULL. |
1318 | * \param r the red component of the pixel in the range 0-255. |
1319 | * \param g the green component of the pixel in the range 0-255. |
1320 | * \param b the blue component of the pixel in the range 0-255. |
1321 | * \returns a pixel value. |
1322 | * |
1323 | * \threadsafety It is safe to call this function from any thread, as long as |
1324 | * the palette is not modified. |
1325 | * |
1326 | * \since This function is available since SDL 3.2.0. |
1327 | * |
1328 | * \sa SDL_GetPixelFormatDetails |
1329 | * \sa SDL_GetRGB |
1330 | * \sa SDL_MapRGBA |
1331 | * \sa SDL_MapSurfaceRGB |
1332 | */ |
1333 | extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapRGB(const SDL_PixelFormatDetails *format, const SDL_Palette *palette, Uint8 r, Uint8 g, Uint8 b); |
1334 | |
1335 | /** |
1336 | * Map an RGBA quadruple to a pixel value for a given pixel format. |
1337 | * |
1338 | * This function maps the RGBA color value to the specified pixel format and |
1339 | * returns the pixel value best approximating the given RGBA color value for |
1340 | * the given pixel format. |
1341 | * |
1342 | * If the specified pixel format has no alpha component the alpha value will |
1343 | * be ignored (as it will be in formats with a palette). |
1344 | * |
1345 | * If the format has a palette (8-bit) the index of the closest matching color |
1346 | * in the palette will be returned. |
1347 | * |
1348 | * If the pixel format bpp (color depth) is less than 32-bpp then the unused |
1349 | * upper bits of the return value can safely be ignored (e.g., with a 16-bpp |
1350 | * format the return value can be assigned to a Uint16, and similarly a Uint8 |
1351 | * for an 8-bpp format). |
1352 | * |
1353 | * \param format a pointer to SDL_PixelFormatDetails describing the pixel |
1354 | * format. |
1355 | * \param palette an optional palette for indexed formats, may be NULL. |
1356 | * \param r the red component of the pixel in the range 0-255. |
1357 | * \param g the green component of the pixel in the range 0-255. |
1358 | * \param b the blue component of the pixel in the range 0-255. |
1359 | * \param a the alpha component of the pixel in the range 0-255. |
1360 | * \returns a pixel value. |
1361 | * |
1362 | * \threadsafety It is safe to call this function from any thread, as long as |
1363 | * the palette is not modified. |
1364 | * |
1365 | * \since This function is available since SDL 3.2.0. |
1366 | * |
1367 | * \sa SDL_GetPixelFormatDetails |
1368 | * \sa SDL_GetRGBA |
1369 | * \sa SDL_MapRGB |
1370 | * \sa SDL_MapSurfaceRGBA |
1371 | */ |
1372 | extern SDL_DECLSPEC Uint32 SDLCALL SDL_MapRGBA(const SDL_PixelFormatDetails *format, const SDL_Palette *palette, Uint8 r, Uint8 g, Uint8 b, Uint8 a); |
1373 | |
1374 | /** |
1375 | * Get RGB values from a pixel in the specified format. |
1376 | * |
1377 | * This function uses the entire 8-bit [0..255] range when converting color |
1378 | * components from pixel formats with less than 8-bits per RGB component |
1379 | * (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, |
1380 | * 0xff, 0xff] not [0xf8, 0xfc, 0xf8]). |
1381 | * |
1382 | * \param pixel a pixel value. |
1383 | * \param format a pointer to SDL_PixelFormatDetails describing the pixel |
1384 | * format. |
1385 | * \param palette an optional palette for indexed formats, may be NULL. |
1386 | * \param r a pointer filled in with the red component, may be NULL. |
1387 | * \param g a pointer filled in with the green component, may be NULL. |
1388 | * \param b a pointer filled in with the blue component, may be NULL. |
1389 | * |
1390 | * \threadsafety It is safe to call this function from any thread, as long as |
1391 | * the palette is not modified. |
1392 | * |
1393 | * \since This function is available since SDL 3.2.0. |
1394 | * |
1395 | * \sa SDL_GetPixelFormatDetails |
1396 | * \sa SDL_GetRGBA |
1397 | * \sa SDL_MapRGB |
1398 | * \sa SDL_MapRGBA |
1399 | */ |
1400 | extern SDL_DECLSPEC void SDLCALL SDL_GetRGB(Uint32 pixel, const SDL_PixelFormatDetails *format, const SDL_Palette *palette, Uint8 *r, Uint8 *g, Uint8 *b); |
1401 | |
1402 | /** |
1403 | * Get RGBA values from a pixel in the specified format. |
1404 | * |
1405 | * This function uses the entire 8-bit [0..255] range when converting color |
1406 | * components from pixel formats with less than 8-bits per RGB component |
1407 | * (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, |
1408 | * 0xff, 0xff] not [0xf8, 0xfc, 0xf8]). |
1409 | * |
1410 | * If the surface has no alpha component, the alpha will be returned as 0xff |
1411 | * (100% opaque). |
1412 | * |
1413 | * \param pixel a pixel value. |
1414 | * \param format a pointer to SDL_PixelFormatDetails describing the pixel |
1415 | * format. |
1416 | * \param palette an optional palette for indexed formats, may be NULL. |
1417 | * \param r a pointer filled in with the red component, may be NULL. |
1418 | * \param g a pointer filled in with the green component, may be NULL. |
1419 | * \param b a pointer filled in with the blue component, may be NULL. |
1420 | * \param a a pointer filled in with the alpha component, may be NULL. |
1421 | * |
1422 | * \threadsafety It is safe to call this function from any thread, as long as |
1423 | * the palette is not modified. |
1424 | * |
1425 | * \since This function is available since SDL 3.2.0. |
1426 | * |
1427 | * \sa SDL_GetPixelFormatDetails |
1428 | * \sa SDL_GetRGB |
1429 | * \sa SDL_MapRGB |
1430 | * \sa SDL_MapRGBA |
1431 | */ |
1432 | extern SDL_DECLSPEC void SDLCALL SDL_GetRGBA(Uint32 pixel, const SDL_PixelFormatDetails *format, const SDL_Palette *palette, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); |
1433 | |
1434 | |
1435 | /* Ends C function definitions when using C++ */ |
1436 | #ifdef __cplusplus |
1437 | } |
1438 | #endif |
1439 | #include <SDL3/SDL_close_code.h> |
1440 | |
1441 | #endif /* SDL_pixels_h_ */ |
1442 | |