1 /+
2 +            Copyright 2022 – 2024 Aya Partridge
3 +          Copyright 2018 - 2022 Michael D. Parker
4 + Distributed under the Boost Software License, Version 1.0.
5 +     (See accompanying file LICENSE_1_0.txt or copy at
6 +           http://www.boost.org/LICENSE_1_0.txt)
7 +/
8 module sdl.pixels;
9 
10 import bindbc.sdl.config;
11 import bindbc.sdl.codegen;
12 
13 import sdl.stdinc: SDL_FOURCC, SDL_bool;
14 
15 enum SDL_ALPHA_OPAQUE = 255;
16 enum SDL_ALPHA_TRANSPARENT = 0;
17 
18 alias SDL_PixelType = int;
19 enum: SDL_PixelType{
20 	SDL_PIXELTYPE_UNKNOWN,
21 	SDL_PIXELTYPE_INDEX1,
22 	SDL_PIXELTYPE_INDEX4,
23 	SDL_PIXELTYPE_INDEX8,
24 	SDL_PIXELTYPE_PACKED8,
25 	SDL_PIXELTYPE_PACKED16,
26 	SDL_PIXELTYPE_PACKED32,
27 	SDL_PIXELTYPE_ARRAYU8,
28 	SDL_PIXELTYPE_ARRAYU16,
29 	SDL_PIXELTYPE_ARRAYU32,
30 	SDL_PIXELTYPE_ARRAYF16,
31 	SDL_PIXELTYPE_ARRAYF32,
32 }
33 static if(sdlSupport >= SDLSupport.v2_30)
34 enum: SDL_PixelType{
35 	SDL_PIXELTYPE_INDEX2,
36 }
37 
38 alias SDL_BitmapOrder = int;
39 enum: SDL_BitmapOrder{
40 	SDL_BITMAPORDER_NONE,
41 	SDL_BITMAPORDER_4321,
42 	SDL_BITMAPORDER_1234,
43 }
44 
45 alias SDL_PackedOrder = int;
46 enum: SDL_PackedOrder{
47 	SDL_PACKEDORDER_NONE,
48 	SDL_PACKEDORDER_XRGB,
49 	SDL_PACKEDORDER_RGBX,
50 	SDL_PACKEDORDER_ARGB,
51 	SDL_PACKEDORDER_RGBA,
52 	SDL_PACKEDORDER_XBGR,
53 	SDL_PACKEDORDER_BGRX,
54 	SDL_PACKEDORDER_ABGR,
55 	SDL_PACKEDORDER_BGRA,
56 }
57 
58 alias SDL_ArrayOrder = int;
59 enum: SDL_ArrayOrder{
60 	SDL_ARRAYORDER_NONE,
61 	SDL_ARRAYORDER_RGB,
62 	SDL_ARRAYORDER_RGBA,
63 	SDL_ARRAYORDER_ARGB,
64 	SDL_ARRAYORDER_BGR,
65 	SDL_ARRAYORDER_BGRA,
66 	SDL_ARRAYORDER_ABGR,
67 }
68 
69 alias SDL_PackedLayout = int;
70 enum: SDL_PackedLayout{
71 	SDL_PACKEDLAYOUT_NONE,
72 	SDL_PACKEDLAYOUT_332,
73 	SDL_PACKEDLAYOUT_4444,
74 	SDL_PACKEDLAYOUT_1555,
75 	SDL_PACKEDLAYOUT_5551,
76 	SDL_PACKEDLAYOUT_565,
77 	SDL_PACKEDLAYOUT_8888,
78 	SDL_PACKEDLAYOUT_2101010,
79 	SDL_PACKEDLAYOUT_1010102,
80 }
81 
82 alias SDL_DEFINE_PIXELFOURCC = SDL_FOURCC;
83 
84 pragma(inline, true) nothrow @nogc pure @safe{
85 	uint SDL_DEFINE_PIXELFORMAT(int type, int order, int layout, int bits, int bytes){
86 		return (1 << 28) | (type << 24) | (order << 20) | (layout << 16) | (bits << 8) | (bytes << 0);
87 	}
88 	
89 	uint SDL_PIXELFLAG(uint x){     return (x >> 28) & 0x0F; }
90 	uint SDL_PIXELTYPE(uint x){     return (x >> 24) & 0x0F; }
91 	uint SDL_PIXELORDER(uint x){    return (x >> 20) & 0x0F; }
92 	uint SDL_PIXELLAYOUT(uint x){   return (x >> 16) & 0x0F; }
93 	uint SDL_BITSPERPIXEL(uint x){  return (x >>  8) & 0xFF; }
94 	
95 	uint SDL_BYTESPERPIXEL(uint x){
96 		if(SDL_ISPIXELFORMAT_FOURCC(x)){
97 			if(x == SDL_PIXELFORMAT_YUY2 || x == SDL_PIXELFORMAT_UYVY || x == SDL_PIXELFORMAT_YVYU){
98 				return 2;
99 			}else{
100 				return 1;
101 			}
102 		}
103 		return (x >> 0) & 0xFF;
104 	}
105 	
106 	bool SDL_ISPIXELFORMAT_INDEXED(uint format){
107 		if(SDL_ISPIXELFORMAT_FOURCC(format)){
108 			static if(sdlSupport >= SDLSupport.v2_30){
109 				return
110 					SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1 ||
111 					SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX2 ||
112 					SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4 ||
113 					SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8;
114 			}else{
115 				return
116 					SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1 ||
117 					SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4 ||
118 					SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8;
119 			}
120 		}
121 		return false;
122 	}
123 	
124 	bool SDL_ISPIXELFORMAT_PACKED(uint format){
125 		if(SDL_ISPIXELFORMAT_FOURCC(format)){
126 			return
127 				SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED8 || SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED16 ||
128 				SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED32;
129 		}
130 		return false;
131 	}
132 	
133 	static if(sdlSupport >= SDLSupport.v2_0_4){
134 		bool SDL_ISPIXELFORMAT_ARRAY(uint format){
135 			if(SDL_ISPIXELFORMAT_FOURCC(format)){
136 				return
137 					SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU8  || SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU16 ||
138 					SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU32 || SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF16 ||
139 					SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF32;
140 			}
141 			return false;
142 		}
143 	}
144 	
145 	bool SDL_ISPIXELFORMAT_ALPHA(uint format){
146 		if(SDL_ISPIXELFORMAT_PACKED(format)){
147 			return (
148 				SDL_PIXELORDER(format) == SDL_PACKEDORDER_ARGB || SDL_PIXELORDER(format) == SDL_PACKEDORDER_RGBA ||
149 				SDL_PIXELORDER(format) == SDL_PACKEDORDER_ABGR || SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA
150 			);
151 		}else static if(sdlSupport >= SDLSupport.v2_0_4){
152 			if(SDL_ISPIXELFORMAT_ARRAY(format)) return (
153 				SDL_PIXELORDER(format) == SDL_ARRAYORDER_ARGB || SDL_PIXELORDER(format) == SDL_ARRAYORDER_RGBA ||
154 				SDL_PIXELORDER(format) == SDL_ARRAYORDER_ABGR || SDL_PIXELORDER(format) == SDL_ARRAYORDER_BGRA
155 			);
156 		}
157 		return false;
158 	}
159 	
160 	uint SDL_ISPIXELFORMAT_FOURCC(uint format){
161 		return format && !(format & 0x80000000);
162 	}
163 }
164 deprecated("Please use the non-template variant instead"){
165 	enum uint SDL_DEFINE_PIXELFORMAT(int type, int order, int layout, int bits, int bytes) =
166 		(1 << 28) | (type << 24) | (order << 20) | (layout << 16) | (bits << 8) | (bytes << 0);
167 	
168 	enum uint SDL_PIXELFLAG(uint x)     = (x >> 28) & 0x0F;
169 	enum uint SDL_PIXELTYPE(uint x)     = (x >> 24) & 0x0F;
170 	enum uint SDL_PIXELORDER(uint x)    = (x >> 20) & 0x0F;
171 	enum uint SDL_PIXELLAYOUT(uint x)   = (x >> 16) & 0x0F;
172 	enum uint SDL_BITSPERPIXEL(uint x)  = (x >>  8) & 0xFF;
173 	
174 	template SDL_BYTESPERPIXEL(uint x){
175 		static if(SDL_ISPIXELFORMAT_FOURCC(x)){
176 			static if(x == SDL_PIXELFORMAT_YUY2 || x == SDL_PIXELFORMAT_UYVY || x == SDL_PIXELFORMAT_YVYU){
177 				enum SDL_BYTESPERPIXEL = 2;
178 			}else{
179 				enum SDL_BYTESPERPIXEL = 1;
180 			}
181 		}else enum SDL_BYTESPERPIXEL = (x >> 0) & 0xFF;
182 	}
183 	
184 	template SDL_ISPIXELFORMAT_INDEXED(uint format){
185 		static if(SDL_ISPIXELFORMAT_FOURCC(format)){
186 			enum SDL_ISPIXELFORMAT_INDEXED =
187 				SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX1 || SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX4 ||
188 				SDL_PIXELTYPE(format) == SDL_PIXELTYPE_INDEX8;
189 		}else enum SDL_ISPIXELFORMAT_INDEXED = false;
190 	}
191 	
192 	template SDL_ISPIXELFORMAT_PACKED(uint format){
193 		static if(SDL_ISPIXELFORMAT_FOURCC(format)){
194 			enum SDL_ISPIXELFORMAT_PACKED =
195 				SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED8 || SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED16 ||
196 				SDL_PIXELTYPE(format) == SDL_PIXELTYPE_PACKED32;
197 		}else enum SDL_ISPIXELFORMAT_PACKED = false;
198 	}
199 	
200 	static if(sdlSupport >= SDLSupport.v2_0_4){
201 		template SDL_ISPIXELFORMAT_ARRAY(uint format){
202 			static if(SDL_ISPIXELFORMAT_FOURCC(format)){
203 				enum SDL_ISPIXELFORMAT_ARRAY =
204 					SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU8  || SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU16 ||
205 					SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYU32 || SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF16 ||
206 					SDL_PIXELTYPE(format) == SDL_PIXELTYPE_ARRAYF32;
207 			}else enum SDL_ISPIXELFORMAT_ARRAY = false;
208 		}
209 	}
210 	
211 	template SDL_ISPIXELFORMAT_ALPHA(uint format){
212 		static if(SDL_ISPIXELFORMAT_PACKED(format)){
213 			enum SDL_ISPIXELFORMAT_ALPHA = (
214 				SDL_PIXELORDER(format) == SDL_PACKEDORDER_ARGB || SDL_PIXELORDER(format) == SDL_PACKEDORDER_RGBA ||
215 				SDL_PIXELORDER(format) == SDL_PACKEDORDER_ABGR || SDL_PIXELORDER(format) == SDL_PACKEDORDER_BGRA
216 			);
217 		}else static if(sdlSupport >= SDLSupport.v2_0_4 && SDL_ISPIXELFORMAT_ARRAY(format)){
218 			enum SDL_ISPIXELFORMAT_ALPHA = (
219 				SDL_PIXELORDER(format) == SDL_ARRAYORDER_ARGB || SDL_PIXELORDER(format) == SDL_ARRAYORDER_RGBA ||
220 				SDL_PIXELORDER(format) == SDL_ARRAYORDER_ABGR || SDL_PIXELORDER(format) == SDL_ARRAYORDER_BGRA
221 			);
222 		}else enum SDL_ISPIXELFORMAT_ALPHA = false;
223 	}
224 	
225 	enum SDL_ISPIXELFORMAT_FOURCC(uint format) = format && !(format & 0x80000000);
226 }
227 
228 alias SDL_PixelFormatEnum = uint;
229 enum: SDL_PixelFormatEnum{
230 	SDL_PIXELFORMAT_UNKNOWN       = 0,
231 	SDL_PIXELFORMAT_INDEX1LSB     = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1,    SDL_BITMAPORDER_4321,  0,                          1,  0),
232 	SDL_PIXELFORMAT_INDEX1MSB     = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX1,    SDL_BITMAPORDER_1234,  0,                          1,  0),
233 	SDL_PIXELFORMAT_INDEX4LSB     = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4,    SDL_BITMAPORDER_4321,  0,                          4,  0),
234 	SDL_PIXELFORMAT_INDEX4MSB     = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX4,    SDL_BITMAPORDER_1234,  0,                          4,  0),
235 	SDL_PIXELFORMAT_INDEX8        = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX8,    0,                     0,                          8,  1),
236 	SDL_PIXELFORMAT_RGB332        = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED8,   SDL_PACKEDORDER_XRGB,  SDL_PACKEDLAYOUT_332,       8,  1),
237 	SDL_PIXELFORMAT_XRGB444       = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_XRGB,  SDL_PACKEDLAYOUT_4444,     12,  2),
238 	SDL_PIXELFORMAT_RGB444        = SDL_PIXELFORMAT_XRGB444,
239 	SDL_PIXELFORMAT_XBGR444       = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_XBGR,  SDL_PACKEDLAYOUT_4444,     12,  2),
240 	SDL_PIXELFORMAT_BGR444        = SDL_PIXELFORMAT_XBGR444,
241 	SDL_PIXELFORMAT_XRGB1555      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_XRGB,  SDL_PACKEDLAYOUT_1555,     15,  2),
242 	SDL_PIXELFORMAT_RGB555        = SDL_PIXELFORMAT_XRGB1555,
243 	SDL_PIXELFORMAT_XBGR1555      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_XBGR,  SDL_PACKEDLAYOUT_1555,     15,  2),
244 	SDL_PIXELFORMAT_BGR555        = SDL_PIXELFORMAT_XBGR1555,
245 	SDL_PIXELFORMAT_ARGB4444      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_ARGB,  SDL_PACKEDLAYOUT_4444,     16,  2),
246 	SDL_PIXELFORMAT_RGBA4444      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_RGBA,  SDL_PACKEDLAYOUT_4444,     16,  2),
247 	SDL_PIXELFORMAT_ABGR4444      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_ABGR,  SDL_PACKEDLAYOUT_4444,     16,  2),
248 	SDL_PIXELFORMAT_BGRA4444      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_BGRA,  SDL_PACKEDLAYOUT_4444,     16,  2),
249 	SDL_PIXELFORMAT_ARGB1555      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_ARGB,  SDL_PACKEDLAYOUT_1555,     16,  2),
250 	SDL_PIXELFORMAT_RGBA5551      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_RGBA,  SDL_PACKEDLAYOUT_5551,     16,  2),
251 	SDL_PIXELFORMAT_ABGR1555      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_ABGR,  SDL_PACKEDLAYOUT_1555,     16,  2),
252 	SDL_PIXELFORMAT_BGRA5551      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_BGRA,  SDL_PACKEDLAYOUT_5551,     16,  2),
253 	SDL_PIXELFORMAT_RGB565        = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_XRGB,  SDL_PACKEDLAYOUT_565,      16,  2),
254 	SDL_PIXELFORMAT_BGR565        = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED16,  SDL_PACKEDORDER_XBGR,  SDL_PACKEDLAYOUT_565,      16,  2),
255 	SDL_PIXELFORMAT_RGB24         = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8,   SDL_ARRAYORDER_RGB,    0,                         24,  3),
256 	SDL_PIXELFORMAT_BGR24         = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_ARRAYU8,   SDL_ARRAYORDER_BGR,    0,                         24,  3),
257 	SDL_PIXELFORMAT_XRGB8888      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32,  SDL_PACKEDORDER_XRGB,  SDL_PACKEDLAYOUT_8888,     24,  4),
258 	SDL_PIXELFORMAT_RGB888        = SDL_PIXELFORMAT_XRGB8888,
259 	SDL_PIXELFORMAT_RGBX8888      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32,  SDL_PACKEDORDER_RGBX,  SDL_PACKEDLAYOUT_8888,     24,  4),
260 	SDL_PIXELFORMAT_XBGR8888      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32,  SDL_PACKEDORDER_XBGR,  SDL_PACKEDLAYOUT_8888,     24,  4),
261 	SDL_PIXELFORMAT_BGR888        = SDL_PIXELFORMAT_XBGR8888,
262 	SDL_PIXELFORMAT_BGRX8888      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32,  SDL_PACKEDORDER_BGRX,  SDL_PACKEDLAYOUT_8888,     24,  4),
263 	SDL_PIXELFORMAT_ARGB8888      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32,  SDL_PACKEDORDER_ARGB,  SDL_PACKEDLAYOUT_8888,     32,  4),
264 	SDL_PIXELFORMAT_RGBA8888      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32,  SDL_PACKEDORDER_RGBA,  SDL_PACKEDLAYOUT_8888,     32,  4),
265 	SDL_PIXELFORMAT_ABGR8888      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32,  SDL_PACKEDORDER_ABGR,  SDL_PACKEDLAYOUT_8888,     32,  4),
266 	SDL_PIXELFORMAT_BGRA8888      = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32,  SDL_PACKEDORDER_BGRA,  SDL_PACKEDLAYOUT_8888,     32,  4),
267 	SDL_PIXELFORMAT_ARGB2101010   = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32,  SDL_PACKEDORDER_ARGB,  SDL_PACKEDLAYOUT_2101010,  32,  4),
268 }
269 version(BigEndian){
270 	enum: SDL_PixelFormatEnum{
271 		SDL_PIXELFORMAT_RGBA32        = SDL_PIXELFORMAT_RGBA8888,
272 		SDL_PIXELFORMAT_ARGB32        = SDL_PIXELFORMAT_ARGB8888,
273 		SDL_PIXELFORMAT_BGRA32        = SDL_PIXELFORMAT_BGRA8888,
274 		SDL_PIXELFORMAT_ABGR32        = SDL_PIXELFORMAT_ABGR8888,
275 	}
276 	static if(sdlSupport >= SDLSupport.v2_30)
277 	enum: SDL_PixelFormatEnum{
278 		SDL_PIXELFORMAT_RGBX32        = SDL_PIXELFORMAT_RGBX8888,
279 		SDL_PIXELFORMAT_XRGB32        = SDL_PIXELFORMAT_XRGB8888,
280 		SDL_PIXELFORMAT_BGRX32        = SDL_PIXELFORMAT_BGRX8888,
281 		SDL_PIXELFORMAT_XBGR32        = SDL_PIXELFORMAT_XBGR8888,
282 	}
283 }else{
284 	enum: SDL_PixelFormatEnum{
285 		SDL_PIXELFORMAT_RGBA32        = SDL_PIXELFORMAT_ABGR8888,
286 		SDL_PIXELFORMAT_ARGB32        = SDL_PIXELFORMAT_BGRA8888,
287 		SDL_PIXELFORMAT_BGRA32        = SDL_PIXELFORMAT_ARGB8888,
288 		SDL_PIXELFORMAT_ABGR32        = SDL_PIXELFORMAT_RGBA8888,
289 	}
290 	static if(sdlSupport >= SDLSupport.v2_30)
291 	enum: SDL_PixelFormatEnum{
292 		SDL_PIXELFORMAT_RGBX32        = SDL_PIXELFORMAT_XBGR8888,
293 		SDL_PIXELFORMAT_XRGB32        = SDL_PIXELFORMAT_BGRX8888,
294 		SDL_PIXELFORMAT_BGRX32        = SDL_PIXELFORMAT_XRGB8888,
295 		SDL_PIXELFORMAT_XBGR32        = SDL_PIXELFORMAT_RGBX8888,
296 	}
297 }
298 enum: SDL_PixelFormatEnum{
299 	SDL_PIXELFORMAT_YV12          = SDL_DEFINE_PIXELFOURCC('Y', 'V', '1', '2'),
300 	SDL_PIXELFORMAT_IYUV          = SDL_DEFINE_PIXELFOURCC('I', 'Y', 'U', 'V'),
301 	SDL_PIXELFORMAT_YUY2          = SDL_DEFINE_PIXELFOURCC('Y', 'U', 'Y', '2'),
302 	SDL_PIXELFORMAT_UYVY          = SDL_DEFINE_PIXELFOURCC('U', 'Y', 'V', 'Y'),
303 	SDL_PIXELFORMAT_YVYU          = SDL_DEFINE_PIXELFOURCC('Y', 'V', 'Y', 'U'),
304 }
305 static if(sdlSupport >= SDLSupport.v2_0_4)
306 enum: SDL_PixelFormatEnum{
307 	SDL_PIXELFORMAT_NV12          = SDL_DEFINE_PIXELFOURCC('N', 'V', '1', '2'),
308 	SDL_PIXELFORMAT_NV21          = SDL_DEFINE_PIXELFOURCC('N', 'V', '2', '1'),
309 }
310 static if(sdlSupport >= SDLSupport.v2_0_8)
311 enum: SDL_PixelFormatEnum{
312 	SDL_PIXELFORMAT_EXTERNAL_OES  = SDL_DEFINE_PIXELFOURCC('O', 'E', 'S', ' '),
313 }
314 static if(sdlSupport >= SDLSupport.v2_30)
315 enum: SDL_PixelFormatEnum{
316 	SDL_PIXELFORMAT_INDEX2LSB = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX2, SDL_BITMAPORDER_4321, 0, 2, 0),
317 	SDL_PIXELFORMAT_INDEX2MSB = SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_INDEX2, SDL_BITMAPORDER_1234, 0, 2, 0),
318 }
319 
320 static assert(SDL_PIXELFORMAT_BGRX8888 == 0x16661804);
321 
322 struct SDL_Color{
323 	ubyte r;
324 	ubyte g;
325 	ubyte b;
326 	ubyte a;
327 }
328 alias SDL_Colour = SDL_Color;
329 
330 struct SDL_Palette{
331 	int ncolors;
332 	alias ncolours = ncolors;
333 	SDL_Color* colors;
334 	alias colours = colors;
335 	uint version_; //NOTE: the original is named `version`
336 	int refcount;
337 }
338 
339 struct SDL_PixelFormat{
340 	SDL_PixelFormatEnum format;
341 	SDL_Palette* palette;
342 	ubyte BitsPerPixel;
343 	ubyte BytesPerPixel;
344 	ubyte[2] padding;
345 	uint Rmask;
346 	uint Gmask;
347 	uint Bmask;
348 	uint Amask;
349 	ubyte Rloss;
350 	ubyte Gloss;
351 	ubyte Bloss;
352 	ubyte Aloss;
353 	ubyte Rshift;
354 	ubyte Gshift;
355 	ubyte Bshift;
356 	ubyte Ashift;
357 	int refcount;
358 	SDL_PixelFormat* next;
359 }
360 
361 mixin(joinFnBinds((){
362 	FnBind[] ret = [
363 		{q{const(char)*}, q{SDL_GetPixelFormatName}, q{SDL_PixelFormatEnum format}},
364 		{q{SDL_bool}, q{SDL_PixelFormatEnumToMasks}, q{SDL_PixelFormatEnum format, int* bpp, uint* rMask, uint* gMask, uint* bMask, uint* aMask}},
365 		{q{uint}, q{SDL_MasksToPixelFormatEnum}, q{int bpp, uint rMask, uint gMask, uint bMask, uint aMask}},
366 		{q{SDL_PixelFormat*}, q{SDL_AllocFormat}, q{uint pixelFormat}},
367 		{q{void}, q{SDL_FreeFormat}, q{SDL_PixelFormat* format}},
368 		{q{SDL_Palette*}, q{SDL_AllocPalette}, q{int nColours}},
369 		{q{int}, q{SDL_SetPixelFormatPalette}, q{SDL_PixelFormat* format, SDL_Palette* palette}},
370 		{q{int}, q{SDL_SetPaletteColors}, q{SDL_Palette* palette, const(SDL_Color)* colours, int firstColour, int nColours}},
371 		{q{void}, q{SDL_FreePalette}, q{SDL_Palette* palette}},
372 		{q{uint}, q{SDL_MapRGB}, q{const(SDL_PixelFormat)* format, ubyte r, ubyte g, ubyte b}},
373 		{q{uint}, q{SDL_MapRGBA}, q{const(SDL_PixelFormat)* format, ubyte r, ubyte g, ubyte b, ubyte a}},
374 		{q{void}, q{SDL_GetRGB}, q{uint pixel, const(SDL_PixelFormat)* format, ubyte* r, ubyte* g, ubyte* b}},
375 		{q{void}, q{SDL_GetRGBA}, q{uint pixel, const(SDL_PixelFormat)* format, ubyte* r, ubyte* g, ubyte* b, ubyte* a}},
376 		{q{void}, q{SDL_CalculateGammaRamp}, q{float gamma, ushort* ramp}},
377 	];
378 	return ret;
379 }()));
380 
381 alias SDL_SetPaletteColours = SDL_SetPaletteColors;