]> git.rm.cloudns.org Git - xonotic/darkplaces.git/commitdiff
implement the libpng longjmp hack properly. png_jmpbuf is actually a macro!
authordivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Sun, 12 Feb 2012 08:23:43 +0000 (08:23 +0000)
committerRudolf Polzer <divverent@alientrap.org>
Sun, 12 Feb 2012 08:46:44 +0000 (09:46 +0100)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@11684 d7cf8633-e32d-0410-b094-e92efae38249
::stable-branch::merge=c1b9d740b6ec4e5638f4a668546d2dd072c82fd8

image_png.c

index 427dfd2db706fbcfa48fda7b68892e243714bd51..d165489f2e5f9c39d819401812bd0bff8302c793 100644 (file)
 #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}
 };