1 /+
2 +            Copyright 2022 – 2024 Aya Partridge
3 + Distributed under the Boost Software License, Version 1.0.
4 +     (See accompanying file LICENSE_1_0.txt or copy at
5 +           http://www.boost.org/LICENSE_1_0.txt)
6 +/
7 module sdl.endian;
8 
9 import bindbc.sdl.config;
10 import bindbc.sdl.codegen;
11 
12 import sdl.stdinc;
13 
14 pragma(inline, true) nothrow @nogc pure @safe{
15 	ushort SDL_Swap16(ushort x){
16 		return cast(ushort)(
17 			(x << 8) |
18 			(x >> 8)
19 		);
20 	}
21 	uint SDL_Swap32(uint x){
22 		return cast(uint)(
23 			(x << 24) |
24 			((x << 8) & 0x00FF0000) |
25 			((x >> 8) & 0x0000FF00) |
26 			(x >> 24)
27 		);
28 	}
29 	ulong SDL_Swap64(ulong x){
30 		uint lo = cast(uint)(x & 0xFFFFFFFF);
31 		x >>= 32;
32 		uint hi = cast(uint)(x & 0xFFFFFFFF);
33 		x = SDL_Swap32(lo);
34 		x <<= 32;
35 		x |= SDL_Swap32(hi);
36 		return x;
37 	}
38 	float SDL_SwapFloat(float x){
39 		union Swapper{
40 			float f;
41 			uint ui32;
42 		}
43 		Swapper swapper = {f: x};
44 		swapper.ui32 = SDL_Swap32(swapper.ui32);
45 		return swapper.f;
46 	}
47 	
48 	version(LittleEndian){
49 		ushort SDL_SwapLE16(ushort X){ return X; }
50 		uint SDL_SwapLE32(uint X){ return X; }
51 		ulong SDL_SwapLE64(ulong X){ return X; }
52 		float SDL_SwapFloatLE(float X){ return X; }
53 		
54 		ushort SDL_SwapBE16(ushort X){ return SDL_Swap16(X); }
55 		uint SDL_SwapBE32(uint X){ return SDL_Swap32(X); }
56 		ulong SDL_SwapBE64(ulong X){ return SDL_Swap64(X); }
57 		float SDL_SwapFloatBE(float X){ return SDL_SwapFloat(X); }
58 	}else{
59 		ushort SDL_SwapLE16(ushort X){ return SDL_Swap16(X); }
60 		uint SDL_SwapLE32(uint X){ return SDL_Swap32(X); }
61 		ulong SDL_SwapLE64(ulong X){ return SDL_Swap64(X); }
62 		float SDL_SwapFloatLE(float X){ return SDL_SwapFloat(X); }
63 		
64 		ushort SDL_SwapBE16(ushort X){ return X; }
65 		uint SDL_SwapBE32(uint X){ return X; }
66 		ulong SDL_SwapBE64(ulong X){ return X; }
67 		float SDL_SwapFloatBE(float X){ return X; }
68 	}
69 }