@@ -117,6 +117,7 @@ static struct {
117
117
#endif
118
118
int (* png_image_begin_read_from_memory ) (png_imagep image , png_const_voidp memory , size_t size );
119
119
int (* png_image_finish_read ) (png_imagep image , png_const_colorp background , void * buffer , png_int_32 row_stride , void * colormap );
120
+ void (* png_image_free ) (png_imagep image );
120
121
#if SDL_IMAGE_SAVE_PNG
121
122
png_structp (* png_create_write_struct ) (png_const_charp user_png_ver , png_voidp error_ptr , png_error_ptr error_fn , png_error_ptr warn_fn );
122
123
void (* png_destroy_write_struct ) (png_structpp png_ptr_ptr , png_infopp info_ptr_ptr );
@@ -174,6 +175,7 @@ int IMG_InitPNG()
174
175
#endif
175
176
FUNCTION_LOADER (png_image_begin_read_from_memory , int (* ) (png_imagep image , png_const_voidp memory , size_t size ))
176
177
FUNCTION_LOADER (png_image_finish_read , int (* ) (png_imagep image , png_const_colorp background , void * buffer , png_int_32 row_stride , void * colormap ))
178
+ FUNCTION_LOADER (png_image_free , void (* ) (png_imagep image ))
177
179
#if SDL_IMAGE_SAVE_PNG
178
180
FUNCTION_LOADER (png_create_write_struct , png_structp (* ) (png_const_charp user_png_ver , png_voidp error_ptr , png_error_ptr error_fn , png_error_ptr warn_fn ))
179
181
FUNCTION_LOADER (png_destroy_write_struct , void (* ) (png_structpp png_ptr_ptr , png_infopp info_ptr_ptr ))
@@ -237,25 +239,48 @@ SDL_Surface *IMG_LoadPNG_RW(SDL_RWops *src) {
237
239
void * colormap = NULL ;
238
240
Uint32 pixelformat ;
239
241
240
- if ( (IMG_Init (IMG_INIT_PNG ) & IMG_INIT_PNG ) == 0 ) {
241
- return NULL ;
242
- }
243
-
244
242
/* This function uses libpng's "Simplified API" to read a PNG.
245
243
* See https://github.com/pnggroup/libpng/blob/libpng16/libpng-manual.txt
246
244
* And https://github.com/pnggroup/libpng/blob/libpng16/contrib/examples/pngtopng.c
247
245
* For information about this and example usage, respectively. */
248
246
247
+ if ( !src ) {
248
+ /* The error message has been set in SDL_RWFromFile */
249
+ return NULL ;
250
+ }
251
+ start = SDL_RWtell (src );
252
+ if (start < 0 ) {
253
+ return NULL ; /*SDL error already set*/
254
+ }
255
+
256
+ if ( (IMG_Init (IMG_INIT_PNG ) & IMG_INIT_PNG ) == 0 ) {
257
+ return NULL ;
258
+ }
259
+
249
260
/* Only the image structure version number needs to be set. */
250
261
SDL_memset (& image , 0 , sizeof (image ));
251
262
image .version = PNG_IMAGE_VERSION ;
252
263
253
- src_length = SDL_RWsize (src ); //todo error check
264
+ src_length = SDL_RWsize (src );
265
+ if (src_length < 0 ) {
266
+ return NULL ; /*SDL error already set*/
267
+ }
268
+ if (src_length == 0 ) {
269
+ SDL_SetError ("Cannot load PNG from length-0 RWops." );
270
+ return NULL ;
271
+ }
254
272
255
- printf ("src_length=%i\n" , src_length );
273
+ /* Rewind to beginning of buffer to read entire thing. */
274
+ if (SDL_RWseek (src , RW_SEEK_SET , 0 ) < 0 ) {
275
+ return NULL ; /*SDL error already set*/
276
+ }
256
277
257
- raw_image_buffer = SDL_malloc (src_length ); // ec
258
- SDL_RWseek (src , RW_SEEK_SET , 0 ); // ec
278
+ raw_image_buffer = SDL_malloc (src_length );
279
+ if (raw_image_buffer == NULL ) {
280
+ SDL_OutOfMemory ();
281
+ return NULL ;
282
+ }
283
+
259
284
int objects_read = SDL_RWread (src , raw_image_buffer , 1 , src_length ); // ec
260
285
261
286
printf ("objects_read=%i\n" , objects_read );
0 commit comments