1 /*
2 
3 Boost Software License - Version 1.0 - August 17th,2003
4 
5 Permission is hereby granted,free of charge,to any person or organization
6 obtaining a copy of the software and accompanying documentation covered by
7 this license (the "Software") to use,reproduce,display,distribute,
8 execute,and transmit the Software,and to prepare derivative works of the
9 Software,and to permit third-parties to whom the Software is furnished to
10 do so,all subject to the following:
11 
12 The copyright notices in the Software and this entire statement,including
13 the above license grant,this restriction and the following disclaimer,
14 must be included in all copies of the Software,in whole or in part,and
15 all derivative works of the Software,unless such copies or derivative
16 works are solely in the form of machine-executable object code generated by
17 a source language processor.
18 
19 THE SOFTWARE IS PROVIDED "AS IS",WITHOUT WARRANTY OF ANY KIND,EXPRESS OR
20 IMPLIED,INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE,TITLE AND NON-INFRINGEMENT. IN NO EVENT
22 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
23 FOR ANY DAMAGES OR OTHER LIABILITY,WHETHER IN CONTRACT,TORT OR OTHERWISE,
24 ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 DEALINGS IN THE SOFTWARE.
26 
27 */
28 module derelict.sdl2.image;
29 
30 import derelict.sdl2.config,
31        derelict.sdl2.internal.sdl_types;
32 
33 static if(staticSDL)
34     import derelict.sdl2.internal.sdl_static : SDL_GetError, SDL_SetError;
35 else
36     import derelict.sdl2.internal.sdl_dynamic : SDL_GetError, SDL_SetError;
37 
38 alias IMG_SetError = SDL_SetError;
39 alias IMG_GetError = SDL_GetError;
40 
41 enum : Uint8 {
42     SDL_IMAGE_MAJOR_VERSION     = 2,
43     SDL_IMAGE_MINOR_VERSION     = 0,
44     SDL_IMAGE_PATCHLEVEL        = 0,
45 }
46 
47 @nogc nothrow void SDL_IMAGE_VERSION(SDL_version* X) {
48     X.major     = SDL_IMAGE_MAJOR_VERSION;
49     X.minor     = SDL_IMAGE_MINOR_VERSION;
50     X.patch     = SDL_IMAGE_PATCHLEVEL;
51 }
52 
53 enum {
54     IMG_INIT_JPG    = 0x00000001,
55     IMG_INIT_PNG    = 0x00000002,
56     IMG_INIT_TIF    = 0x00000004,
57     IMG_INIT_WEBP   = 0x00000008,
58 }
59 
60 static if(staticImage) {
61     extern(C) @nogc nothrow {
62         int IMG_Init(int);
63         int IMG_Quit();
64         const(SDL_version)* IMG_Linked_Version();
65         SDL_Surface* IMG_LoadTyped_RW(SDL_RWops*,int,const(char)*);
66         SDL_Surface* IMG_Load(const(char)*);
67         SDL_Surface* IMG_Load_RW(SDL_RWops*,int);
68         SDL_Texture* IMG_LoadTexture(SDL_Renderer*,const(char)*);
69         SDL_Texture* IMG_LoadTexture_RW(SDL_Renderer*,SDL_RWops*,int);
70         SDL_Texture* IMG_LoadTextureTyped_RW(SDL_Renderer*,SDL_RWops*,int,const(char)*);
71         int IMG_isICO(SDL_RWops*);
72         int IMG_isCUR(SDL_RWops*);
73         int IMG_isBMP(SDL_RWops*);
74         int IMG_isGIF(SDL_RWops*);
75         int IMG_isJPG(SDL_RWops*);
76         int IMG_isLBM(SDL_RWops*);
77         int IMG_isPCX(SDL_RWops*);
78         int IMG_isPNG(SDL_RWops*);
79         int IMG_isPNM(SDL_RWops*);
80         int IMG_isTIF(SDL_RWops*);
81         int IMG_isXCF(SDL_RWops*);
82         int IMG_isXPM(SDL_RWops*);
83         int IMG_isXV(SDL_RWops*);
84         int IMG_isWEBP(SDL_RWops*);
85         SDL_Surface* IMG_LoadICO_RW(SDL_RWops*);
86         SDL_Surface* IMG_LoadCUR_RW(SDL_RWops*);
87         SDL_Surface* IMG_LoadBMP_RW(SDL_RWops*);
88         SDL_Surface* IMG_LoadGIF_RW(SDL_RWops*);
89         SDL_Surface* IMG_LoadJPG_RW(SDL_RWops*);
90         SDL_Surface* IMG_LoadLBM_RW(SDL_RWops*);
91         SDL_Surface* IMG_LoadPCX_RW(SDL_RWops*);
92         SDL_Surface* IMG_LoadPNG_RW(SDL_RWops*);
93         SDL_Surface* IMG_LoadPNM_RW(SDL_RWops*);
94         SDL_Surface* IMG_LoadTGA_RW(SDL_RWops*);
95         SDL_Surface* IMG_LoadTIF_RW(SDL_RWops*);
96         SDL_Surface* IMG_LoadXCF_RW(SDL_RWops*);
97         SDL_Surface* IMG_LoadXPM_RW(SDL_RWops*);
98         SDL_Surface* IMG_LoadXV_RW(SDL_RWops*);
99         SDL_Surface* IMG_LoadWEBP_RW(SDL_RWops*);
100         SDL_Surface* IMG_ReadXPMFromArray(char**);
101         int IMG_SavePNG(SDL_Surface*,const(char)*);
102         int IMG_SavePNG_RW(SDL_Surface*,SDL_RWops*,int);
103     }
104 }
105 else {
106     import derelict.util.loader,
107            derelict.util.exception,
108            derelict.util.system;
109 
110     extern(C) @nogc nothrow {
111         alias da_IMG_Init = int function(int);
112         alias da_IMG_Quit = int function();
113         alias da_IMG_Linked_Version = const(SDL_version)* function();
114         alias da_IMG_LoadTyped_RW = SDL_Surface* function(SDL_RWops*,int,const(char)*);
115         alias da_IMG_Load = SDL_Surface* function(const(char)*);
116         alias da_IMG_Load_RW = SDL_Surface* function(SDL_RWops*,int);
117 
118         alias da_IMG_LoadTexture = SDL_Texture* function(SDL_Renderer*,const(char)*);
119         alias da_IMG_LoadTexture_RW = SDL_Texture* function(SDL_Renderer*,SDL_RWops*,int);
120         alias da_IMG_LoadTextureTyped_RW = SDL_Texture* function(SDL_Renderer*,SDL_RWops*,int,const(char)*);
121 
122         alias da_IMG_isICO = int function(SDL_RWops*);
123         alias da_IMG_isCUR = int function(SDL_RWops*);
124         alias da_IMG_isBMP = int function(SDL_RWops*);
125         alias da_IMG_isGIF = int function(SDL_RWops*);
126         alias da_IMG_isJPG = int function(SDL_RWops*);
127         alias da_IMG_isLBM = int function(SDL_RWops*);
128         alias da_IMG_isPCX = int function(SDL_RWops*);
129         alias da_IMG_isPNG = int function(SDL_RWops*);
130         alias da_IMG_isPNM = int function(SDL_RWops*);
131         alias da_IMG_isTIF = int function(SDL_RWops*);
132         alias da_IMG_isXCF = int function(SDL_RWops*);
133         alias da_IMG_isXPM = int function(SDL_RWops*);
134         alias da_IMG_isXV = int function(SDL_RWops*);
135         alias da_IMG_isWEBP = int function(SDL_RWops*);
136 
137         alias da_IMG_LoadICO_RW = SDL_Surface* function(SDL_RWops*);
138         alias da_IMG_LoadCUR_RW = SDL_Surface* function(SDL_RWops*);
139         alias da_IMG_LoadBMP_RW = SDL_Surface* function(SDL_RWops*);
140         alias da_IMG_LoadGIF_RW = SDL_Surface* function(SDL_RWops*);
141         alias da_IMG_LoadJPG_RW = SDL_Surface* function(SDL_RWops*);
142         alias da_IMG_LoadLBM_RW = SDL_Surface* function(SDL_RWops*);
143         alias da_IMG_LoadPCX_RW = SDL_Surface* function(SDL_RWops*);
144         alias da_IMG_LoadPNG_RW = SDL_Surface* function(SDL_RWops*);
145         alias da_IMG_LoadPNM_RW = SDL_Surface* function(SDL_RWops*);
146         alias da_IMG_LoadTGA_RW = SDL_Surface* function(SDL_RWops*);
147         alias da_IMG_LoadTIF_RW = SDL_Surface* function(SDL_RWops*);
148         alias da_IMG_LoadXCF_RW = SDL_Surface* function(SDL_RWops*);
149         alias da_IMG_LoadXPM_RW = SDL_Surface* function(SDL_RWops*);
150         alias da_IMG_LoadXV_RW = SDL_Surface* function(SDL_RWops*);
151         alias da_IMG_LoadWEBP_RW = SDL_Surface* function(SDL_RWops*);
152 
153         alias da_IMG_ReadXPMFromArray = SDL_Surface* function(char**);
154 
155         alias da_IMG_SavePNG = int function(SDL_Surface*,const(char)*);
156         alias da_IMG_SavePNG_RW = int function(SDL_Surface*,SDL_RWops*,int);
157     }
158 
159     __gshared {
160         da_IMG_Init IMG_Init;
161         da_IMG_Quit IMG_Quit;
162         da_IMG_Linked_Version IMG_Linked_Version;
163         da_IMG_LoadTyped_RW IMG_LoadTyped_RW;
164         da_IMG_Load IMG_Load;
165         da_IMG_Load_RW IMG_Load_RW;
166         da_IMG_LoadTexture IMG_LoadTexture;
167         da_IMG_LoadTexture_RW IMG_LoadTexture_RW;
168         da_IMG_LoadTextureTyped_RW IMG_LoadTextureTyped_RW;
169         da_IMG_isICO IMG_isICO;
170         da_IMG_isCUR IMG_isCUR;
171         da_IMG_isBMP IMG_isBMP;
172         da_IMG_isGIF IMG_isGIF;
173         da_IMG_isJPG IMG_isJPG;
174         da_IMG_isLBM IMG_isLBM;
175         da_IMG_isPCX IMG_isPCX;
176         da_IMG_isPNG IMG_isPNG;
177         da_IMG_isPNM IMG_isPNM;
178         da_IMG_isTIF IMG_isTIF;
179         da_IMG_isXCF IMG_isXCF;
180         da_IMG_isXPM IMG_isXPM;
181         da_IMG_isXV IMG_isXV;
182         da_IMG_isWEBP IMG_isWEBP;
183         da_IMG_LoadICO_RW IMG_LoadICO_RW;
184         da_IMG_LoadCUR_RW IMG_LoadCUR_RW;
185         da_IMG_LoadBMP_RW IMG_LoadBMP_RW;
186         da_IMG_LoadGIF_RW IMG_LoadGIF_RW;
187         da_IMG_LoadJPG_RW IMG_LoadJPG_RW;
188         da_IMG_LoadLBM_RW IMG_LoadLBM_RW;
189         da_IMG_LoadPCX_RW IMG_LoadPCX_RW;
190         da_IMG_LoadPNG_RW IMG_LoadPNG_RW;
191         da_IMG_LoadPNM_RW IMG_LoadPNM_RW;
192         da_IMG_LoadTGA_RW IMG_LoadTGA_RW;
193         da_IMG_LoadTIF_RW IMG_LoadTIF_RW;
194         da_IMG_LoadXCF_RW IMG_LoadXCF_RW;
195         da_IMG_LoadXPM_RW IMG_LoadXPM_RW;
196         da_IMG_LoadXV_RW IMG_LoadXV_RW;
197         da_IMG_LoadWEBP_RW IMG_LoadWEBP_RW;
198         da_IMG_ReadXPMFromArray IMG_ReadXPMFromArray;
199         da_IMG_SavePNG IMG_SavePNG;
200         da_IMG_SavePNG_RW IMG_SavePNG_RW;
201     }
202 
203     class DerelictSDL2ImageLoader : SharedLibLoader {
204         this()
205         {
206             super(libNames);
207         }
208 
209         protected override void loadSymbols()
210         {
211             bindFunc(cast(void**)&IMG_Init,"IMG_Init");
212             bindFunc(cast(void**)&IMG_Quit,"IMG_Quit");
213             bindFunc(cast(void**)&IMG_Linked_Version,"IMG_Linked_Version");
214             bindFunc(cast(void**)&IMG_LoadTyped_RW,"IMG_LoadTyped_RW");
215             bindFunc(cast(void**)&IMG_Load,"IMG_Load");
216             bindFunc(cast(void**)&IMG_Load_RW,"IMG_Load_RW");
217             bindFunc(cast(void**)&IMG_LoadTexture,"IMG_LoadTexture");
218             bindFunc(cast(void**)&IMG_LoadTexture_RW,"IMG_LoadTexture_RW");
219             bindFunc(cast(void**)&IMG_LoadTextureTyped_RW,"IMG_LoadTextureTyped_RW");
220             bindFunc(cast(void**)&IMG_isICO,"IMG_isICO");
221             bindFunc(cast(void**)&IMG_isCUR,"IMG_isCUR");
222             bindFunc(cast(void**)&IMG_isBMP,"IMG_isBMP");
223             bindFunc(cast(void**)&IMG_isGIF,"IMG_isGIF");
224             bindFunc(cast(void**)&IMG_isJPG,"IMG_isJPG");
225             bindFunc(cast(void**)&IMG_isLBM,"IMG_isLBM");
226             bindFunc(cast(void**)&IMG_isPCX,"IMG_isPCX");
227             bindFunc(cast(void**)&IMG_isPNG,"IMG_isPNG");
228             bindFunc(cast(void**)&IMG_isPNM,"IMG_isPNM");
229             bindFunc(cast(void**)&IMG_isTIF,"IMG_isTIF");
230             bindFunc(cast(void**)&IMG_isXCF,"IMG_isXCF");
231             bindFunc(cast(void**)&IMG_isXPM,"IMG_isXPM");
232             bindFunc(cast(void**)&IMG_isXV,"IMG_isXV");
233             bindFunc(cast(void**)&IMG_isWEBP,"IMG_isWEBP");
234             bindFunc(cast(void**)&IMG_LoadICO_RW,"IMG_LoadICO_RW");
235             bindFunc(cast(void**)&IMG_LoadCUR_RW,"IMG_LoadCUR_RW");
236             bindFunc(cast(void**)&IMG_LoadBMP_RW,"IMG_LoadBMP_RW");
237             bindFunc(cast(void**)&IMG_LoadGIF_RW,"IMG_LoadGIF_RW");
238             bindFunc(cast(void**)&IMG_LoadJPG_RW,"IMG_LoadJPG_RW");
239             bindFunc(cast(void**)&IMG_LoadLBM_RW,"IMG_LoadLBM_RW");
240             bindFunc(cast(void**)&IMG_LoadPCX_RW,"IMG_LoadPCX_RW");
241             bindFunc(cast(void**)&IMG_LoadPNG_RW,"IMG_LoadPNG_RW");
242             bindFunc(cast(void**)&IMG_LoadPNM_RW,"IMG_LoadPNM_RW");
243             bindFunc(cast(void**)&IMG_LoadTGA_RW,"IMG_LoadTGA_RW");
244             bindFunc(cast(void**)&IMG_LoadTIF_RW,"IMG_LoadTIF_RW");
245             bindFunc(cast(void**)&IMG_LoadXCF_RW,"IMG_LoadXCF_RW");
246             bindFunc(cast(void**)&IMG_LoadXPM_RW,"IMG_LoadXPM_RW");
247             bindFunc(cast(void**)&IMG_LoadXV_RW,"IMG_LoadXV_RW");
248             bindFunc(cast(void**)&IMG_isXV,"IMG_isXV");
249             bindFunc(cast(void**)&IMG_LoadWEBP_RW,"IMG_LoadWEBP_RW");
250             bindFunc(cast(void**)&IMG_SavePNG,"IMG_SavePNG");
251             bindFunc(cast(void**)&IMG_SavePNG_RW,"IMG_SavePNG_RW");
252         }
253     }
254 
255     __gshared DerelictSDL2ImageLoader DerelictSDL2Image;
256 
257     shared static this()
258     {
259         DerelictSDL2Image = new DerelictSDL2ImageLoader();
260     }
261 
262     private:
263         static if(Derelict_OS_Windows)
264             enum libNames = "SDL2_image.dll";
265         else static if(Derelict_OS_Mac)
266             enum libNames = "/usr/local/lib/libSDL2_image.dylib,../Frameworks/SDL2_image.framework/SDL2_image,/Library/Frameworks/SDL2_image.framework/SDL2_image,/System/Library/Frameworks/SDL2_image.framework/SDL2_image";
267         else static if(Derelict_OS_Posix)
268             enum libNames = "libSDL2_image.so,libSDL2_image-2.0.so,libSDL2_image-2.0.so.0,/usr/local/lib/libSDL2_image.so,/usr/local/lib/libSDL2_image-2.0.so,/usr/local/lib/libSDL2_image-2.0.so.0";
269         else
270             static assert(0,"Need to implement SDL2_image libNames for this operating system.");
271 }