png: fixes for building against libpng-1.6, and fn.pointer type fixes. SDL-1.2
authorOzkan Sezer <sezeroz@gmail.com>
Sun, 14 Oct 2018 15:00:50 +0300
branchSDL-1.2
changeset 60198b284005f5e
parent 599 f5f1e8452f74
child 602 5d369ebb4940
png: fixes for building against libpng-1.6, and fn.pointer type fixes.

from default branch commits f83e70f2ec6c, 4c41cee3e961, 777206f89dd2,
4c73e89f2551, 43873c313f32, e729829dbfc2, 4078e65827ea, ace61a625208,
218eb926ba90, 71f0d661144f, and 4b70bfe18fb7 -- bugs 1884, 1912, 3082,
and 3214.
IMG_png.c
     1.1 --- a/IMG_png.c	Sat Oct 13 17:21:40 2018 +0300
     1.2 +++ b/IMG_png.c	Sun Oct 14 15:00:50 2018 +0300
     1.3 @@ -71,33 +71,44 @@
     1.4  #include <png.h>
     1.5  
     1.6  /* Check for the older version of libpng */
     1.7 -#if (PNG_LIBPNG_VER_MAJOR == 1) && (PNG_LIBPNG_VER_MINOR < 4)
     1.8 +#if (PNG_LIBPNG_VER_MAJOR == 1) 
     1.9 +#if (PNG_LIBPNG_VER_MINOR < 5)
    1.10  #define LIBPNG_VERSION_12
    1.11 +typedef png_bytep png_const_bytep;
    1.12 +typedef png_color *png_const_colorp;
    1.13 +#endif
    1.14 +#if (PNG_LIBPNG_VER_MINOR < 6)
    1.15 +typedef png_structp png_const_structrp;
    1.16 +typedef png_infop png_const_inforp;
    1.17 +typedef png_structp png_structrp;
    1.18 +typedef png_infop png_inforp;
    1.19 +#endif
    1.20  #endif
    1.21  
    1.22  static struct {
    1.23  	int loaded;
    1.24  	void *handle;
    1.25 -	png_infop (*png_create_info_struct) (png_structp png_ptr);
    1.26 +	png_infop (*png_create_info_struct) (png_const_structrp png_ptr);
    1.27  	png_structp (*png_create_read_struct) (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warn_fn);
    1.28  	void (*png_destroy_read_struct) (png_structpp png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr);
    1.29 -	png_uint_32 (*png_get_IHDR) (png_structp png_ptr, png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, int *interlace_method, int *compression_method, int *filter_method);
    1.30 -	png_voidp (*png_get_io_ptr) (png_structp png_ptr);
    1.31 -	png_byte (*png_get_channels) (png_structp png_ptr, png_infop info_ptr);
    1.32 -	png_uint_32 (*png_get_PLTE) (png_structp png_ptr, png_infop info_ptr, png_colorp *palette, int *num_palette);
    1.33 -	png_uint_32 (*png_get_tRNS) (png_structp png_ptr, png_infop info_ptr, png_bytep *trans, int *num_trans, png_color_16p *trans_values);
    1.34 -	png_uint_32 (*png_get_valid) (png_structp png_ptr, png_infop info_ptr, png_uint_32 flag);
    1.35 -	void (*png_read_image) (png_structp png_ptr, png_bytepp image);
    1.36 -	void (*png_read_info) (png_structp png_ptr, png_infop info_ptr);
    1.37 -	void (*png_read_update_info) (png_structp png_ptr, png_infop info_ptr);
    1.38 -	void (*png_set_expand) (png_structp png_ptr);
    1.39 -	void (*png_set_gray_to_rgb) (png_structp png_ptr);
    1.40 -	void (*png_set_packing) (png_structp png_ptr);
    1.41 -	void (*png_set_read_fn) (png_structp png_ptr, png_voidp io_ptr, png_rw_ptr read_data_fn);
    1.42 -	void (*png_set_strip_16) (png_structp png_ptr);
    1.43 -	int (*png_sig_cmp) (png_bytep sig, png_size_t start, png_size_t num_to_check);
    1.44 +	png_uint_32 (*png_get_IHDR) (png_const_structrp png_ptr, png_const_inforp info_ptr, png_uint_32 *width, png_uint_32 *height, int *bit_depth, int *color_type, int *interlace_method, int *compression_method, int *filter_method);
    1.45 +	png_voidp (*png_get_io_ptr) (png_const_structrp png_ptr);
    1.46 +	png_byte (*png_get_channels) (png_const_structrp png_ptr, png_const_inforp info_ptr);
    1.47 +	png_uint_32 (*png_get_PLTE) (png_const_structrp png_ptr, png_inforp info_ptr, png_colorp *palette, int *num_palette);
    1.48 +	png_uint_32 (*png_get_tRNS) (png_const_structrp png_ptr, png_inforp info_ptr, png_bytep *trans, int *num_trans, png_color_16p *trans_values);
    1.49 +	png_uint_32 (*png_get_valid) (png_const_structrp png_ptr, png_const_inforp info_ptr, png_uint_32 flag);
    1.50 +	void (*png_read_image) (png_structrp png_ptr, png_bytepp image);
    1.51 +	void (*png_read_info) (png_structrp png_ptr, png_inforp info_ptr);
    1.52 +	void (*png_read_update_info) (png_structrp png_ptr, png_inforp info_ptr);
    1.53 +	void (*png_set_expand) (png_structrp png_ptr);
    1.54 +	void (*png_set_gray_to_rgb) (png_structrp png_ptr);
    1.55 +	void (*png_set_packing) (png_structrp png_ptr);
    1.56 +	void (*png_set_read_fn) (png_structrp png_ptr, png_voidp io_ptr, png_rw_ptr read_data_fn);
    1.57 +	void (*png_set_strip_16) (png_structrp png_ptr);
    1.58 +	int (*png_set_interlace_handling) (png_structp png_ptr);
    1.59 +	int (*png_sig_cmp) (png_const_bytep sig, png_size_t start, png_size_t num_to_check);
    1.60  #ifndef LIBPNG_VERSION_12
    1.61 -	jmp_buf* (*png_set_longjmp_fn) (png_structp, png_longjmp_ptr, size_t);
    1.62 +	jmp_buf* (*png_set_longjmp_fn) (png_structrp, png_longjmp_ptr, size_t);
    1.63  #endif
    1.64  } lib;
    1.65  
    1.66 @@ -110,14 +121,14 @@
    1.67  			return -1;
    1.68  		}
    1.69  		lib.png_create_info_struct =
    1.70 -			(png_infop (*) (png_structp))
    1.71 +			(png_infop (*) (png_const_structrp))
    1.72  			SDL_LoadFunction(lib.handle, "png_create_info_struct");
    1.73  		if ( lib.png_create_info_struct == NULL ) {
    1.74  			SDL_UnloadObject(lib.handle);
    1.75  			return -1;
    1.76  		}
    1.77  		lib.png_create_read_struct =
    1.78 -			(png_structp (*) (png_const_charp, png_voidp, png_error_ptr, png_error_ptr))
    1.79 +			(png_structrp (*) (png_const_charp, png_voidp, png_error_ptr, png_error_ptr))
    1.80  			SDL_LoadFunction(lib.handle, "png_create_read_struct");
    1.81  		if ( lib.png_create_read_struct == NULL ) {
    1.82  			SDL_UnloadObject(lib.handle);
    1.83 @@ -131,105 +142,112 @@
    1.84  			return -1;
    1.85  		}
    1.86  		lib.png_get_IHDR =
    1.87 -			(png_uint_32 (*) (png_structp, png_infop, png_uint_32 *, png_uint_32 *, int *, int *, int *, int *, int *))
    1.88 +			(png_uint_32 (*) (png_const_structrp, png_const_inforp, png_uint_32 *, png_uint_32 *, int *, int *, int *, int *, int *))
    1.89  			SDL_LoadFunction(lib.handle, "png_get_IHDR");
    1.90  		if ( lib.png_get_IHDR == NULL ) {
    1.91  			SDL_UnloadObject(lib.handle);
    1.92  			return -1;
    1.93  		}
    1.94  		lib.png_get_channels =
    1.95 -			(png_byte (*) (png_structp, png_infop))
    1.96 +			(png_byte (*) (png_const_structrp, png_const_inforp))
    1.97  			SDL_LoadFunction(lib.handle, "png_get_channels");
    1.98  		if ( lib.png_get_channels == NULL ) {
    1.99  			SDL_UnloadObject(lib.handle);
   1.100  			return -1;
   1.101  		}
   1.102  		lib.png_get_io_ptr =
   1.103 -			(png_voidp (*) (png_structp))
   1.104 +			(png_voidp (*) (png_const_structrp))
   1.105  			SDL_LoadFunction(lib.handle, "png_get_io_ptr");
   1.106  		if ( lib.png_get_io_ptr == NULL ) {
   1.107  			SDL_UnloadObject(lib.handle);
   1.108  			return -1;
   1.109  		}
   1.110  		lib.png_get_PLTE =
   1.111 -			(png_uint_32 (*) (png_structp, png_infop, png_colorp *, int *))
   1.112 +			(png_uint_32 (*) (png_const_structrp, png_inforp, png_colorp *, int *))
   1.113  			SDL_LoadFunction(lib.handle, "png_get_PLTE");
   1.114  		if ( lib.png_get_PLTE == NULL ) {
   1.115  			SDL_UnloadObject(lib.handle);
   1.116  			return -1;
   1.117  		}
   1.118  		lib.png_get_tRNS =
   1.119 -			(png_uint_32 (*) (png_structp, png_infop, png_bytep *, int *, png_color_16p *))
   1.120 +			(png_uint_32 (*) (png_const_structrp, png_inforp, png_bytep *, int *, png_color_16p *))
   1.121  			SDL_LoadFunction(lib.handle, "png_get_tRNS");
   1.122  		if ( lib.png_get_tRNS == NULL ) {
   1.123  			SDL_UnloadObject(lib.handle);
   1.124  			return -1;
   1.125  		}
   1.126  		lib.png_get_valid =
   1.127 -			(png_uint_32 (*) (png_structp, png_infop, png_uint_32))
   1.128 +			(png_uint_32 (*) (png_const_structrp, png_const_inforp, png_uint_32))
   1.129  			SDL_LoadFunction(lib.handle, "png_get_valid");
   1.130  		if ( lib.png_get_valid == NULL ) {
   1.131  			SDL_UnloadObject(lib.handle);
   1.132  			return -1;
   1.133  		}
   1.134  		lib.png_read_image =
   1.135 -			(void (*) (png_structp, png_bytepp))
   1.136 +			(void (*) (png_structrp, png_bytepp))
   1.137  			SDL_LoadFunction(lib.handle, "png_read_image");
   1.138  		if ( lib.png_read_image == NULL ) {
   1.139  			SDL_UnloadObject(lib.handle);
   1.140  			return -1;
   1.141  		}
   1.142  		lib.png_read_info =
   1.143 -			(void (*) (png_structp, png_infop))
   1.144 +			(void (*) (png_structrp, png_inforp))
   1.145  			SDL_LoadFunction(lib.handle, "png_read_info");
   1.146  		if ( lib.png_read_info == NULL ) {
   1.147  			SDL_UnloadObject(lib.handle);
   1.148  			return -1;
   1.149  		}
   1.150  		lib.png_read_update_info =
   1.151 -			(void (*) (png_structp, png_infop))
   1.152 +			(void (*) (png_structrp, png_inforp))
   1.153  			SDL_LoadFunction(lib.handle, "png_read_update_info");
   1.154  		if ( lib.png_read_update_info == NULL ) {
   1.155  			SDL_UnloadObject(lib.handle);
   1.156  			return -1;
   1.157  		}
   1.158  		lib.png_set_expand =
   1.159 -			(void (*) (png_structp))
   1.160 +			(void (*) (png_structrp))
   1.161  			SDL_LoadFunction(lib.handle, "png_set_expand");
   1.162  		if ( lib.png_set_expand == NULL ) {
   1.163  			SDL_UnloadObject(lib.handle);
   1.164  			return -1;
   1.165  		}
   1.166  		lib.png_set_gray_to_rgb =
   1.167 -			(void (*) (png_structp))
   1.168 +			(void (*) (png_structrp))
   1.169  			SDL_LoadFunction(lib.handle, "png_set_gray_to_rgb");
   1.170  		if ( lib.png_set_gray_to_rgb == NULL ) {
   1.171  			SDL_UnloadObject(lib.handle);
   1.172  			return -1;
   1.173  		}
   1.174  		lib.png_set_packing =
   1.175 -			(void (*) (png_structp))
   1.176 +			(void (*) (png_structrp))
   1.177  			SDL_LoadFunction(lib.handle, "png_set_packing");
   1.178  		if ( lib.png_set_packing == NULL ) {
   1.179  			SDL_UnloadObject(lib.handle);
   1.180  			return -1;
   1.181  		}
   1.182  		lib.png_set_read_fn =
   1.183 -			(void (*) (png_structp, png_voidp, png_rw_ptr))
   1.184 +			(void (*) (png_structrp, png_voidp, png_rw_ptr))
   1.185  			SDL_LoadFunction(lib.handle, "png_set_read_fn");
   1.186  		if ( lib.png_set_read_fn == NULL ) {
   1.187  			SDL_UnloadObject(lib.handle);
   1.188  			return -1;
   1.189  		}
   1.190  		lib.png_set_strip_16 =
   1.191 -			(void (*) (png_structp))
   1.192 +			(void (*) (png_structrp))
   1.193  			SDL_LoadFunction(lib.handle, "png_set_strip_16");
   1.194  		if ( lib.png_set_strip_16 == NULL ) {
   1.195  			SDL_UnloadObject(lib.handle);
   1.196  			return -1;
   1.197  		}
   1.198 +		lib.png_set_interlace_handling =
   1.199 +			(void (*) (png_structp))
   1.200 +			SDL_LoadFunction(lib.handle, "png_set_interlace_handling");
   1.201 +		if ( lib.png_set_interlace_handling == NULL ) {
   1.202 +			SDL_UnloadObject(lib.handle);
   1.203 +			return -1;
   1.204 +		}
   1.205  		lib.png_sig_cmp =
   1.206 -			(int (*) (png_bytep, png_size_t, png_size_t))
   1.207 +			(int (*) (png_const_bytep, png_size_t, png_size_t))
   1.208  			SDL_LoadFunction(lib.handle, "png_sig_cmp");
   1.209  		if ( lib.png_sig_cmp == NULL ) {
   1.210  			SDL_UnloadObject(lib.handle);
   1.211 @@ -237,7 +255,7 @@
   1.212  		}
   1.213  #ifndef LIBPNG_VERSION_12
   1.214  		lib.png_set_longjmp_fn =
   1.215 -			(jmp_buf * (*) (png_structp, png_longjmp_ptr, size_t))
   1.216 +			(jmp_buf * (*) (png_structrp, png_longjmp_ptr, size_t))
   1.217  			SDL_LoadFunction(lib.handle, "png_set_longjmp_fn");
   1.218  		if ( lib.png_set_longjmp_fn == NULL ) {
   1.219  			SDL_UnloadObject(lib.handle);
   1.220 @@ -280,6 +298,7 @@
   1.221  		lib.png_set_packing = png_set_packing;
   1.222  		lib.png_set_read_fn = png_set_read_fn;
   1.223  		lib.png_set_strip_16 = png_set_strip_16;
   1.224 +		lib.png_set_interlace_handling = png_set_interlace_handling;
   1.225  		lib.png_sig_cmp = png_sig_cmp;
   1.226  #ifndef LIBPNG_VERSION_12
   1.227  		lib.png_set_longjmp_fn = png_set_longjmp_fn;
   1.228 @@ -404,6 +423,9 @@
   1.229  	/* tell libpng to strip 16 bit/color files down to 8 bits/color */
   1.230  	lib.png_set_strip_16(png_ptr) ;
   1.231  
   1.232 +	/* tell libpng to de-interlace (if the image is interlaced) */
   1.233 +	lib.png_set_interlace_handling(png_ptr) ;
   1.234 +
   1.235  	/* Extract multiple pixels with bit depths of 1, 2, and 4 from a single
   1.236  	 * byte into separate bytes (useful for paletted and grayscale images).
   1.237  	 */
   1.238 @@ -515,9 +537,9 @@
   1.239  	    if(color_type == PNG_COLOR_TYPE_GRAY) {
   1.240  		palette->ncolors = 256;
   1.241  		for(i = 0; i < 256; i++) {
   1.242 -		    palette->colors[i].r = i;
   1.243 -		    palette->colors[i].g = i;
   1.244 -		    palette->colors[i].b = i;
   1.245 +		    palette->colors[i].r = (Uint8)i;
   1.246 +		    palette->colors[i].g = (Uint8)i;
   1.247 +		    palette->colors[i].b = (Uint8)i;
   1.248  		}
   1.249  	    } else if (png_num_palette > 0 ) {
   1.250  		palette->ncolors = png_num_palette;