Skip to content

Latest commit

 

History

History
241 lines (214 loc) · 6.76 KB

IMG.c

File metadata and controls

241 lines (214 loc) · 6.76 KB
 
Aug 10, 2000
Aug 10, 2000
1
/*
Dec 31, 2011
Dec 31, 2011
2
SDL_image: An example image loading library for use with SDL
Mar 1, 2018
Mar 1, 2018
3
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
Dec 31, 2011
Dec 31, 2011
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Aug 10, 2000
Aug 10, 2000
20
21
22
23
24
25
*/
/* A simple library to load images of various formats as SDL surfaces */
#include "SDL_image.h"
Nov 29, 2000
Nov 29, 2000
26
27
#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
Aug 10, 2000
Aug 10, 2000
28
29
/* Table of image detection and loading functions */
static struct {
Sep 12, 2017
Sep 12, 2017
30
const char *type;
May 22, 2013
May 22, 2013
31
32
int (SDLCALL *is)(SDL_RWops *src);
SDL_Surface *(SDLCALL *load)(SDL_RWops *src);
Aug 10, 2000
Aug 10, 2000
33
} supported[] = {
May 22, 2013
May 22, 2013
34
35
36
37
38
39
40
41
42
43
44
/* keep magicless formats first */
{ "TGA", NULL, IMG_LoadTGA_RW },
{ "CUR", IMG_isCUR, IMG_LoadCUR_RW },
{ "ICO", IMG_isICO, IMG_LoadICO_RW },
{ "BMP", IMG_isBMP, IMG_LoadBMP_RW },
{ "GIF", IMG_isGIF, IMG_LoadGIF_RW },
{ "JPG", IMG_isJPG, IMG_LoadJPG_RW },
{ "LBM", IMG_isLBM, IMG_LoadLBM_RW },
{ "PCX", IMG_isPCX, IMG_LoadPCX_RW },
{ "PNG", IMG_isPNG, IMG_LoadPNG_RW },
{ "PNM", IMG_isPNM, IMG_LoadPNM_RW }, /* P[BGP]M share code */
Oct 22, 2017
Oct 22, 2017
45
{ "SVG", IMG_isSVG, IMG_LoadSVG_RW },
May 22, 2013
May 22, 2013
46
47
48
49
50
{ "TIF", IMG_isTIF, IMG_LoadTIF_RW },
{ "XCF", IMG_isXCF, IMG_LoadXCF_RW },
{ "XPM", IMG_isXPM, IMG_LoadXPM_RW },
{ "XV", IMG_isXV, IMG_LoadXV_RW },
{ "WEBP", IMG_isWEBP, IMG_LoadWEBP_RW },
Aug 10, 2000
Aug 10, 2000
51
52
};
Jul 23, 2003
Jul 23, 2003
53
54
const SDL_version *IMG_Linked_Version(void)
{
May 22, 2013
May 22, 2013
55
56
57
static SDL_version linked_version;
SDL_IMAGE_VERSION(&linked_version);
return(&linked_version);
Jul 23, 2003
Jul 23, 2003
58
59
}
Dec 13, 2017
Dec 13, 2017
60
61
62
63
64
65
extern int IMG_InitJPG(void);
extern void IMG_QuitJPG(void);
extern int IMG_InitPNG(void);
extern void IMG_QuitPNG(void);
extern int IMG_InitTIF(void);
extern void IMG_QuitTIF(void);
Sep 26, 2009
Sep 26, 2009
66
Dec 13, 2017
Dec 13, 2017
67
68
extern int IMG_InitWEBP(void);
extern void IMG_QuitWEBP(void);
Dec 30, 2011
Dec 30, 2011
69
Sep 26, 2009
Sep 26, 2009
70
71
72
73
static int initialized = 0;
int IMG_Init(int flags)
{
May 22, 2013
May 22, 2013
74
75
int result = 0;
Jul 26, 2014
Jul 26, 2014
76
77
78
79
80
/* Passing 0 returns the currently initialized loaders */
if (!flags) {
return initialized;
}
May 22, 2013
May 22, 2013
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
if (flags & IMG_INIT_JPG) {
if ((initialized & IMG_INIT_JPG) || IMG_InitJPG() == 0) {
result |= IMG_INIT_JPG;
}
}
if (flags & IMG_INIT_PNG) {
if ((initialized & IMG_INIT_PNG) || IMG_InitPNG() == 0) {
result |= IMG_INIT_PNG;
}
}
if (flags & IMG_INIT_TIF) {
if ((initialized & IMG_INIT_TIF) || IMG_InitTIF() == 0) {
result |= IMG_INIT_TIF;
}
}
if (flags & IMG_INIT_WEBP) {
if ((initialized & IMG_INIT_WEBP) || IMG_InitWEBP() == 0) {
result |= IMG_INIT_WEBP;
}
}
initialized |= result;
Jul 26, 2014
Jul 26, 2014
103
return result;
Sep 26, 2009
Sep 26, 2009
104
105
106
107
}
void IMG_Quit()
{
May 22, 2013
May 22, 2013
108
109
110
111
112
113
114
115
116
117
118
119
120
if (initialized & IMG_INIT_JPG) {
IMG_QuitJPG();
}
if (initialized & IMG_INIT_PNG) {
IMG_QuitPNG();
}
if (initialized & IMG_INIT_TIF) {
IMG_QuitTIF();
}
if (initialized & IMG_INIT_WEBP) {
IMG_QuitWEBP();
}
initialized = 0;
Sep 26, 2009
Sep 26, 2009
121
122
}
Jan 4, 2009
Jan 4, 2009
123
#if !defined(__APPLE__) || defined(SDL_IMAGE_USE_COMMON_BACKEND)
Aug 10, 2000
Aug 10, 2000
124
125
126
127
/* Load an image from a file */
SDL_Surface *IMG_Load(const char *file)
{
SDL_RWops *src = SDL_RWFromFile(file, "rb");
Jun 15, 2015
Jun 15, 2015
128
const char *ext = SDL_strrchr(file, '.');
Dec 19, 2003
Dec 19, 2003
129
130
131
132
133
134
135
if(ext) {
ext++;
}
if(!src) {
/* The error message has been set in SDL_RWFromFile */
return NULL;
}
Aug 10, 2000
Aug 10, 2000
136
137
return IMG_LoadTyped_RW(src, 1, ext);
}
Jan 4, 2009
Jan 4, 2009
138
#endif
Aug 10, 2000
Aug 10, 2000
139
140
141
142
143
144
145
146
/* Load an image from an SDL datasource (for compatibility) */
SDL_Surface *IMG_Load_RW(SDL_RWops *src, int freesrc)
{
return IMG_LoadTyped_RW(src, freesrc, NULL);
}
/* Portable case-insensitive string compare function */
Nov 20, 2001
Nov 20, 2001
147
static int IMG_string_equals(const char *str1, const char *str2)
Aug 10, 2000
Aug 10, 2000
148
{
May 22, 2013
May 22, 2013
149
while ( *str1 && *str2 ) {
Jun 15, 2015
Jun 15, 2015
150
151
if ( SDL_toupper((unsigned char)*str1) !=
SDL_toupper((unsigned char)*str2) )
May 22, 2013
May 22, 2013
152
153
154
155
156
break;
++str1;
++str2;
}
return (!*str1 && !*str2);
Aug 10, 2000
Aug 10, 2000
157
158
159
}
/* Load an image from an SDL datasource, optionally specifying the type */
Jan 23, 2012
Jan 23, 2012
160
SDL_Surface *IMG_LoadTyped_RW(SDL_RWops *src, int freesrc, const char *type)
Aug 10, 2000
Aug 10, 2000
161
{
May 22, 2013
May 22, 2013
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
int i;
SDL_Surface *image;
/* Make sure there is something to do.. */
if ( src == NULL ) {
IMG_SetError("Passed a NULL data source");
return(NULL);
}
/* See whether or not this data source can handle seeking */
if ( SDL_RWseek(src, 0, RW_SEEK_CUR) < 0 ) {
IMG_SetError("Can't seek in this data source");
if(freesrc)
SDL_RWclose(src);
return(NULL);
}
/* Detect the type of image being loaded */
image = NULL;
for ( i=0; i < ARRAYSIZE(supported); ++i ) {
if(supported[i].is) {
if(!supported[i].is(src))
continue;
} else {
/* magicless format */
if(!type
|| !IMG_string_equals(type, supported[i].type))
continue;
}
Jan 4, 2002
Jan 4, 2002
191
#ifdef DEBUG_IMGLIB
May 22, 2013
May 22, 2013
192
193
fprintf(stderr, "IMGLIB: Loading image as %s\n",
supported[i].type);
Jan 4, 2002
Jan 4, 2002
194
#endif
May 22, 2013
May 22, 2013
195
196
197
198
199
200
201
202
203
204
205
image = supported[i].load(src);
if(freesrc)
SDL_RWclose(src);
return image;
}
if ( freesrc ) {
SDL_RWclose(src);
}
IMG_SetError("Unsupported image format");
return NULL;
Aug 10, 2000
Aug 10, 2000
206
207
}
Jun 3, 2013
Jun 3, 2013
208
#if SDL_VERSION_ATLEAST(2,0,0)
Jan 23, 2012
Jan 23, 2012
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
SDL_Texture *IMG_LoadTexture(SDL_Renderer *renderer, const char *file)
{
SDL_Texture *texture = NULL;
SDL_Surface *surface = IMG_Load(file);
if (surface) {
texture = SDL_CreateTextureFromSurface(renderer, surface);
SDL_FreeSurface(surface);
}
return texture;
}
SDL_Texture *IMG_LoadTexture_RW(SDL_Renderer *renderer, SDL_RWops *src, int freesrc)
{
SDL_Texture *texture = NULL;
SDL_Surface *surface = IMG_Load_RW(src, freesrc);
if (surface) {
texture = SDL_CreateTextureFromSurface(renderer, surface);
SDL_FreeSurface(surface);
}
return texture;
}
SDL_Texture *IMG_LoadTextureTyped_RW(SDL_Renderer *renderer, SDL_RWops *src, int freesrc, const char *type)
{
SDL_Texture *texture = NULL;
SDL_Surface *surface = IMG_LoadTyped_RW(src, freesrc, type);
if (surface) {
texture = SDL_CreateTextureFromSurface(renderer, surface);
SDL_FreeSurface(surface);
}
return texture;
}
Jun 3, 2013
Jun 3, 2013
241
#endif /* SDL 2.0 */