From: divverent Date: Sun, 12 Feb 2012 08:42:00 +0000 (+0000) Subject: also support 1.2 again X-Git-Tag: xonotic-v0.8.0~96^2~329 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=9ca5fac7f41e25a450e7ab28e262915863d1354f;p=xonotic%2Fdarkplaces.git also support 1.2 again git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@11685 d7cf8633-e32d-0410-b094-e92efae38249 --- diff --git a/image_png.c b/image_png.c index d165489f..f71dfdea 100644 --- a/image_png.c +++ b/image_png.c @@ -65,10 +65,17 @@ static void (*qpng_write_info) (void*, void*); static void (*qpng_write_row) (void*, unsigned char*); static void (*qpng_write_end) (void*, void*); -// libpng longjmp hack +// libpng 1.4+ longjmp hack typedef void (*qpng_longjmp_ptr) (jmp_buf, int); static jmp_buf* (*qpng_set_longjmp_fn) (void *, qpng_longjmp_ptr, size_t); -#define qpng_jmpbuf(png_ptr) (*qpng_set_longjmp_fn((png_ptr), longjmp, sizeof (jmp_buf))) +#define qpng_jmpbuf_14(png_ptr) (*qpng_set_longjmp_fn((png_ptr), longjmp, sizeof (jmp_buf))) + +// libpng 1.2 longjmp hack +#define qpng_jmpbuf_12(png_ptr) (*((jmp_buf *) png_ptr)) + +// all version support +#define qpng_jmpbuf(png_ptr) \ + (qpng_set_longjmp_fn ? qpng_jmpbuf_14(png_ptr) : qpng_jmpbuf_12(png_ptr)) static dllfunction_t pngfuncs[] = { @@ -105,12 +112,17 @@ static dllfunction_t pngfuncs[] = {"png_write_info", (void **) &qpng_write_info}, {"png_write_row", (void **) &qpng_write_row}, {"png_write_end", (void **) &qpng_write_end}, + {NULL, NULL} +}; +static dllfunction_t png14funcs[] = +{ {"png_set_longjmp_fn", (void **) &qpng_set_longjmp_fn}, {NULL, NULL} }; // Handle for PNG DLL dllhandle_t png_dll = NULL; +dllhandle_t png14_dll = NULL; /* @@ -156,7 +168,15 @@ qboolean PNG_OpenLibrary (void) return true; // Load the DLL - return Sys_LoadLibrary (dllnames, &png_dll, pngfuncs); + if(!Sys_LoadLibrary (dllnames, &png_dll, pngfuncs)) + return false; + if(qpng_access_version_number() / 100 >= 104) + if(!Sys_LoadLibrary (dllnames, &png14_dll, png14funcs)) + { + Sys_UnloadLibrary (&png_dll); + return false; + } + return true; } @@ -169,6 +189,7 @@ Unload the PNG DLL */ void PNG_CloseLibrary (void) { + Sys_UnloadLibrary (&png14_dll); Sys_UnloadLibrary (&png_dll); }