From 679c846034f97440661e7dc16ee9bd132138d486 Mon Sep 17 00:00:00 2001 From: divverent Date: Sun, 12 Feb 2012 08:23:43 +0000 Subject: [PATCH] implement the libpng longjmp hack properly. png_jmpbuf is actually a macro! git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@11684 d7cf8633-e32d-0410-b094-e92efae38249 ::stable-branch::merge=c1b9d740b6ec4e5638f4a668546d2dd072c82fd8 --- image_png.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/image_png.c b/image_png.c index 427dfd2d..d165489f 100644 --- a/image_png.c +++ b/image_png.c @@ -30,18 +30,6 @@ #include "image.h" #include "image_png.h" -#ifdef __cplusplus -#ifdef WIN64 -typedef _JBTYPE *qpng_jmpbuf_t; -#elif defined(MACOSX) || defined(WIN32) -typedef int *qpng_jmpbuf_t; -#else -typedef __jmp_buf_tag *qpng_jmpbuf_t; -#endif -#else -typedef void *qpng_jmpbuf_t; -#endif -// why not: typedef jmp_buf qpng_jmpbuf_t; static void (*qpng_set_sig_bytes) (void*, int); static int (*qpng_sig_cmp) (const unsigned char*, size_t, size_t); @@ -76,7 +64,11 @@ static unsigned int (*qpng_access_version_number) (void); // FIXME is this re static void (*qpng_write_info) (void*, void*); static void (*qpng_write_row) (void*, unsigned char*); static void (*qpng_write_end) (void*, void*); -static qpng_jmpbuf_t (*qpng_jmpbuf) (void*); + +// libpng 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))) static dllfunction_t pngfuncs[] = { @@ -113,7 +105,7 @@ 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}, - {"png_jmpbuf", (void **) &qpng_jmpbuf}, + {"png_set_longjmp_fn", (void **) &qpng_set_longjmp_fn}, {NULL, NULL} }; -- 2.39.2