summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChong Yidong <cyd@stupidchicken.com>2011-01-29 16:28:26 -0500
committerChong Yidong <cyd@stupidchicken.com>2011-01-29 16:28:26 -0500
commit7f9c5df9660fc124e5d1399eaf4b3f5da94c71aa (patch)
tree71452aa6e099477a1770338244e72c0a65e40d8b
parente935c6a287abf3dc87e2bc79d9019460a689d4aa (diff)
downloademacs-7f9c5df9660fc124e5d1399eaf4b3f5da94c71aa.tar.gz
Fix png support to allow compiling with libpng-1.5 (Bug#7908).
* image.c (fn_png_longjmp, fn_png_set_longjmp_fn): New png function definitions for compiling with libpng-1.5. (PNG_LONGJMP, PNG_JMPBUF): New macros for libpng-1.5. (my_png_error, png_load): Use them. Suggested by Thomas Klausner.
-rw-r--r--src/ChangeLog8
-rw-r--r--src/image.c34
2 files changed, 40 insertions, 2 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index a6e8d04d7c0..1d14be1ab70 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,11 @@
+2011-01-29 Chong Yidong <cyd@stupidchicken.com>
+
+ * image.c (fn_png_longjmp, fn_png_set_longjmp_fn): New png
+ function definitions for compiling with libpng-1.5.
+ (PNG_LONGJMP, PNG_JMPBUF): New macros for libpng-1.5.
+ (my_png_error, png_load): Use them. Suggested by Thomas Klausner
+ (Bug#7908).
+
2011-01-28 Chong Yidong <cyd@stupidchicken.com>
* m/intel386.h: Define NO_ARG_ARRAY. Suggested by Dan Nicolaescu.
diff --git a/src/image.c b/src/image.c
index 631c73a6008..cc8589f924a 100644
--- a/src/image.c
+++ b/src/image.c
@@ -5590,6 +5590,11 @@ DEF_IMGLIB_FN (png_read_image);
DEF_IMGLIB_FN (png_read_end);
DEF_IMGLIB_FN (png_error);
+#if (PNG_LIBPNG_VER >= 10500)
+DEF_IMGLIB_FN (png_longjmp);
+DEF_IMGLIB_FN (png_set_longjmp_fn);
+#endif /* libpng version >= 1.5 */
+
static int
init_png_functions (Lisp_Object libraries)
{
@@ -5620,6 +5625,12 @@ init_png_functions (Lisp_Object libraries)
LOAD_IMGLIB_FN (library, png_read_image);
LOAD_IMGLIB_FN (library, png_read_end);
LOAD_IMGLIB_FN (library, png_error);
+
+#if (PNG_LIBPNG_VER >= 10500)
+ LOAD_IMGLIB_FN (library, png_longjmp);
+ LOAD_IMGLIB_FN (library, png_set_longjmp_fn);
+#endif /* libpng version >= 1.5 */
+
return 1;
}
#else
@@ -5646,8 +5657,27 @@ init_png_functions (Lisp_Object libraries)
#define fn_png_read_end png_read_end
#define fn_png_error png_error
+#if (PNG_LIBPNG_VER >= 10500)
+#define fn_png_longjmp png_longjmp
+#define fn_png_set_longjmp_fn png_set_longjmp_fn
+#endif /* libpng version >= 1.5 */
+
#endif /* HAVE_NTGUI */
+
+#if (PNG_LIBPNG_VER < 10500)
+#define PNG_LONGJMP(ptr) (longjmp (ptr->jmpbuf, 1))
+#define PNG_JMPBUF(ptr) ((ptr)->jmpbuf)
+#else
+/* In libpng version 1.5, the jmpbuf member is hidden.
+ We need the extra cast for PNG_JMPBUF because, for Windows,
+ DEF_IMGLIB_FN defines the return value of fn_png_set_longjmp_fn to
+ be int (Bug#7908). */
+#define PNG_LONGJMP(ptr) (fn_png_longjmp (png_ptr, 1))
+#define PNG_JMPBUF(ptr) \
+ (*(jmp_buf *)(fn_png_set_longjmp_fn((ptr), longjmp, sizeof (jmp_buf))))
+#endif
+
/* Error and warning handlers installed when the PNG library
is initialized. */
@@ -5660,7 +5690,7 @@ my_png_error (png_ptr, msg)
/* Avoid compiler warning about deprecated direct access to
png_ptr's fields in libpng versions 1.4.x. */
image_error ("PNG error: %s", build_string (msg), Qnil);
- longjmp (png_ptr->jmpbuf, 1);
+ PNG_LONGJMP (png_ptr);
}
@@ -5836,7 +5866,7 @@ png_load (f, img)
/* Set error jump-back. We come back here when the PNG library
detects an error. */
- if (setjmp (png_ptr->jmpbuf))
+ if (setjmp (PNG_JMPBUF (png_ptr)))
{
error:
if (png_ptr)