]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - image_png.c
fix C++ compile error
[xonotic/darkplaces.git] / image_png.c
index 427dfd2db706fbcfa48fda7b68892e243714bd51..f8d50151b7e98a2f1e8d027528cd5564a42924a7 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,18 @@ 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 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_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[] =
 {
@@ -113,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},
-       {"png_jmpbuf",          (void **) &qpng_jmpbuf},
+       {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;
 
 
 /*
@@ -164,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;
 }
 
 
@@ -177,6 +189,7 @@ Unload the PNG DLL
 */
 void PNG_CloseLibrary (void)
 {
+       Sys_UnloadLibrary (&png14_dll);
        Sys_UnloadLibrary (&png_dll);
 }
 
@@ -474,7 +487,9 @@ qboolean PNG_SaveImage_preflipped (const char *filename, int width, int height,
        }
 
        png = (void *)qpng_create_write_struct( 
-               (qpng_access_version_number() / 100 == 102) ? PNG_LIBPNG_VER_STRING_12 : PNG_LIBPNG_VER_STRING_14, // nasty hack to support both libpng12 and libpng14
+               (qpng_access_version_number() / 100 == 102) ? PNG_LIBPNG_VER_STRING_12 :
+               (qpng_access_version_number() / 100 == 104) ? PNG_LIBPNG_VER_STRING_14 :
+               PNG_LIBPNG_VER_STRING_15, // nasty hack... whatever
                0, PNG_error_fn, PNG_warning_fn
        );
        if(!png)