1
2 // Copyright 2018 - 2021 Michael D. Parker
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 bindbc.sdl.bind.sdlrwops;
8
9 import core.stdc.stdio : FILE;
10 import bindbc.sdl.config;
11 import bindbc.sdl.bind.sdlstdinc : SDL_bool;
12
13 enum : uint {
14 SDL_RWOPS_UNKNOWN = 0,
15 SDL_RWOPS_WINFILE = 1,
16 SDL_RWOPS_STDFILE = 2,
17 SDL_RWOPS_JNIFILE = 3,
18 SDL_RWOPS_MEMORY = 4,
19 SDL_RWOPS_MEMORY_RO = 5,
20 }
21
22 struct SDL_RWops {
23 extern(C) @nogc nothrow {
24 long function(SDL_RWops*) size;
25 long function(SDL_RWops*, long, int) seek;
26 size_t function(SDL_RWops*, void*, size_t, size_t) read;
27 size_t function(SDL_RWops*, const(void)*, size_t, size_t) write;
28 int function(SDL_RWops*) close;
29 }
30
31 uint type;
32
33 union Hidden {
34 // version(Android)
35 version(Windows) {
36 struct Windowsio {
37 int append;
38 void* h;
39 struct Buffer {
40 void* data;
41 size_t size;
42 size_t left;
43 }
44 Buffer buffer;
45 }
46 Windowsio windowsio;
47 }
48
49 struct Stdio {
50 int autoclose;
51 FILE* fp;
52 }
53 Stdio stdio;
54
55 struct Mem {
56 ubyte* base;
57 ubyte* here;
58 ubyte* stop;
59 }
60 Mem mem;
61
62 struct Unknown {
63 void* data1;
64 void* data2;
65 }
66 Unknown unknown;
67 }
68 Hidden hidden;
69 }
70
71 enum {
72 RW_SEEK_SET = 0,
73 RW_SEEK_CUR = 1,
74 RW_SEEK_END = 2,
75 }
76
77 static if(sdlSupport < SDLSupport.sdl2010) {
78 @nogc nothrow {
79 long SDL_RWsize(SDL_RWops* ctx) { return ctx.size(ctx); }
80 long SDL_RWseek(SDL_RWops* ctx, long offset, int whence) { return ctx.seek(ctx, offset, whence); }
81 long SDL_RWtell(SDL_RWops* ctx) { return ctx.seek(ctx, 0, RW_SEEK_CUR); }
82 size_t SDL_RWread(SDL_RWops* ctx, void* ptr, size_t size, size_t n) { return ctx.read(ctx, ptr, size, n); }
83 size_t SDL_RWwrite(SDL_RWops* ctx, const(void)* ptr, size_t size, size_t n) { return ctx.write(ctx, ptr, size, n); }
84 int SDL_RWclose(SDL_RWops* ctx) { return ctx.close(ctx); }
85 }
86 }
87
88 static if(sdlSupport >= SDLSupport.sdl206) {
89 @nogc nothrow
90 void* SDL_LoadFile(const(char)* filename, size_t datasize) {
91 pragma(inline, true);
92 return SDL_LoadFile_RW(SDL_RWFromFile(filename, "rb"), datasize, 1);
93 }
94 }
95
96 static if(staticBinding) {
97 extern(C) @nogc nothrow {
98 SDL_RWops* SDL_RWFromFile(const(char)* file, const(char)* mode);
99 SDL_RWops* SDL_RWFromFP(FILE* ffp, SDL_bool autoclose);
100 SDL_RWops* SDL_RWFromMem(void* mem, int size);
101 SDL_RWops* SDL_RWFromConstMem(const(void)* mem, int size);
102 SDL_RWops* SDL_AllocRW();
103 void SDL_FreeRW(SDL_RWops* context);
104 ubyte SDL_ReadU8(SDL_RWops* context);
105 ushort SDL_ReadLE16(SDL_RWops* context);
106 ushort SDL_ReadBE16(SDL_RWops* context);
107 uint SDL_ReadLE32(SDL_RWops* context);
108 uint SDL_ReadBE32(SDL_RWops* context);
109 ulong SDL_ReadLE64(SDL_RWops* context);
110 ulong SDL_ReadBE64(SDL_RWops* context);
111 size_t SDL_WriteU8(SDL_RWops* context,ubyte value);
112 size_t SDL_WriteLE16(SDL_RWops* context,ushort value);
113 size_t SDL_WriteBE16(SDL_RWops* context,ushort value);
114 size_t SDL_WriteLE32(SDL_RWops* context,uint value);
115 size_t SDL_WriteBE32(SDL_RWops* context,uint value);
116 size_t SDL_WriteLE64(SDL_RWops* context,ulong value);
117 size_t SDL_WriteBE64(SDL_RWops* context,ulong value);
118
119 static if(sdlSupport >= SDLSupport.sdl206) {
120 void* SDL_LoadFile_RW(SDL_RWops* context, size_t datasize, int freesrc);
121 }
122 static if(sdlSupport >= SDLSupport.sdl2010) {
123 long SDL_RWsize(SDL_RWops* context);
124 long SDL_RWseek(SDL_RWops* context, long offset, int whence);
125 long SDL_RWtell(SDL_RWops* context);
126 size_t SDL_RWread(SDL_RWops* context, void* ptr, size_t size, size_t maxnum);
127 size_t SDL_RWwrite(SDL_RWops* context, const(void)* ptr, size_t size, size_t num);
128 int SDL_RWclose(SDL_RWops* context);
129 }
130 }
131 }
132 else {
133 extern(C) @nogc nothrow {
134 alias pSDL_RWFromFile = SDL_RWops* function(const(char)* file, const(char)* mode);
135 alias pSDL_RWFromFP = SDL_RWops* function(FILE* ffp, SDL_bool autoclose);
136 alias pSDL_RWFromMem = SDL_RWops* function(void* mem, int size);
137 alias pSDL_RWFromConstMem = SDL_RWops* function(const(void)* mem, int size);
138 alias pSDL_AllocRW = SDL_RWops* function();
139 alias pSDL_FreeRW = void function(SDL_RWops* context);
140 alias pSDL_ReadU8 = ubyte function(SDL_RWops* context);
141 alias pSDL_ReadLE16 = ushort function(SDL_RWops* context);
142 alias pSDL_ReadBE16 = ushort function(SDL_RWops* context);
143 alias pSDL_ReadLE32 = uint function(SDL_RWops* context);
144 alias pSDL_ReadBE32 = uint function(SDL_RWops* context);
145 alias pSDL_ReadLE64 = ulong function(SDL_RWops* context);
146 alias pSDL_ReadBE64 = ulong function(SDL_RWops* context);
147 alias pSDL_WriteU8 = size_t function(SDL_RWops* context,ubyte value);
148 alias pSDL_WriteLE16 = size_t function(SDL_RWops* context,ushort value);
149 alias pSDL_WriteBE16 = size_t function(SDL_RWops* context,ushort value);
150 alias pSDL_WriteLE32 = size_t function(SDL_RWops* context,uint value);
151 alias pSDL_WriteBE32 = size_t function(SDL_RWops* context,uint value);
152 alias pSDL_WriteLE64 = size_t function(SDL_RWops* context,ulong value);
153 alias pSDL_WriteBE64 = size_t function(SDL_RWops* context,ulong value);
154 }
155 __gshared {
156 pSDL_RWFromFile SDL_RWFromFile;
157 pSDL_RWFromFP SDL_RWFromFP;
158 pSDL_RWFromMem SDL_RWFromMem;
159 pSDL_RWFromConstMem SDL_RWFromConstMem;
160 pSDL_AllocRW SDL_AllocRW;
161 pSDL_FreeRW SDL_FreeRW;
162 pSDL_ReadU8 SDL_ReadU8;
163 pSDL_ReadLE16 SDL_ReadLE16;
164 pSDL_ReadBE16 SDL_ReadBE16;
165 pSDL_ReadLE32 SDL_ReadLE32;
166 pSDL_ReadBE32 SDL_ReadBE32;
167 pSDL_ReadLE64 SDL_ReadLE64;
168 pSDL_ReadBE64 SDL_ReadBE64;
169 pSDL_WriteU8 SDL_WriteU8;
170 pSDL_WriteLE16 SDL_WriteLE16;
171 pSDL_WriteBE16 SDL_WriteBE16;
172 pSDL_WriteLE32 SDL_WriteLE32;
173 pSDL_WriteBE32 SDL_WriteBE32;
174 pSDL_WriteLE64 SDL_WriteLE64;
175 pSDL_WriteBE64 SDL_WriteBE64;
176 }
177 static if(sdlSupport >= SDLSupport.sdl206) {
178 extern(C) @nogc nothrow {
179 alias pSDL_LoadFile_RW = void* function(SDL_RWops* context, size_t datasize, int freesrc);
180 }
181 __gshared {
182 pSDL_LoadFile_RW SDL_LoadFile_RW;
183 }
184 }
185 static if(sdlSupport >= SDLSupport.sdl2010) {
186 extern(C) @nogc nothrow {
187 alias pSDL_RWsize = long function(SDL_RWops* context);
188 alias pSDL_RWseek = long function(SDL_RWops* context, long offset, int whence);
189 alias pSDL_RWtell = long function(SDL_RWops* context);
190 alias pSDL_RWread = size_t function(SDL_RWops* context, void* ptr, size_t size, size_t maxnum);
191 alias pSDL_RWwrite = size_t function(SDL_RWops* context, const(void)* ptr, size_t size, size_t num);
192 alias pSDL_RWclose = int function(SDL_RWops* context);
193 }
194 __gshared {
195 pSDL_RWsize SDL_RWsize;
196 pSDL_RWseek SDL_RWseek;
197 pSDL_RWtell SDL_RWtell;
198 pSDL_RWread SDL_RWread;
199 pSDL_RWwrite SDL_RWwrite;
200 pSDL_RWclose SDL_RWclose;
201 }
202 }
203 }