@@ -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 ))
@@ -229,6 +231,7 @@ int IMG_isPNG(SDL_RWops *src)
229
231
}
230
232
231
233
SDL_Surface * IMG_LoadPNG_RW (SDL_RWops * src ) {
234
+ Sint64 start ;
232
235
png_image image ;
233
236
Sint64 src_length ;
234
237
Uint8 * raw_image_buffer ;
@@ -237,28 +240,51 @@ SDL_Surface *IMG_LoadPNG_RW(SDL_RWops *src) {
237
240
void * colormap = NULL ;
238
241
Uint32 pixelformat ;
239
242
240
- if ( (IMG_Init (IMG_INIT_PNG ) & IMG_INIT_PNG ) == 0 ) {
241
- return NULL ;
242
- }
243
-
244
243
/* This function uses libpng's "Simplified API" to read a PNG.
245
244
* See https://github.com/pnggroup/libpng/blob/libpng16/libpng-manual.txt
246
245
* And https://github.com/pnggroup/libpng/blob/libpng16/contrib/examples/pngtopng.c
247
246
* For information about this and example usage, respectively. */
248
247
248
+ if ( !src ) {
249
+ /* The error message has been set in SDL_RWFromFile */
250
+ return NULL ;
251
+ }
252
+ start = SDL_RWtell (src );
253
+ if (start < 0 ) {
254
+ return NULL ; /*SDL error already set*/
255
+ }
256
+
257
+ if ( (IMG_Init (IMG_INIT_PNG ) & IMG_INIT_PNG ) == 0 ) {
258
+ return NULL ;
259
+ }
260
+
249
261
/* Only the image structure version number needs to be set. */
250
262
SDL_memset (& image , 0 , sizeof (image ));
251
263
image .version = PNG_IMAGE_VERSION ;
252
264
253
- src_length = SDL_RWsize (src ); //todo error check
265
+ src_length = SDL_RWsize (src );
266
+ if (src_length < 0 ) {
267
+ return NULL ; /*SDL error already set*/
268
+ }
269
+ if (src_length == 0 ) {
270
+ SDL_SetError ("Cannot load PNG from length-0 RWops." );
271
+ return NULL ;
272
+ }
254
273
255
- printf ("src_length=%i\n" , src_length );
274
+ /* Rewind to beginning of buffer to read entire thing. */
275
+ if (SDL_RWseek (src , RW_SEEK_SET , 0 ) < 0 ) {
276
+ return NULL ; /*SDL error already set*/
277
+ }
256
278
257
- raw_image_buffer = SDL_malloc (src_length ); // ec
258
- SDL_RWseek (src , RW_SEEK_SET , 0 ); // ec
279
+ raw_image_buffer = SDL_malloc (src_length );
280
+ if (raw_image_buffer == NULL ) {
281
+ SDL_OutOfMemory ();
282
+ return NULL ;
283
+ }
284
+
259
285
int objects_read = SDL_RWread (src , raw_image_buffer , 1 , src_length ); // ec
260
286
261
- printf ("objects_read=%i\n" , objects_read );
287
+ // printf("objects_read=%i\n", objects_read);
262
288
263
289
if (lib .png_image_begin_read_from_memory (& image , raw_image_buffer , src_length )) {
264
290
/* If the image is natively encoded with a colormap, set the format to
0 commit comments