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