Vincent Povirk : winemenubuilder: Use a custom error function.

Alexandre Julliard julliard at winehq.org
Mon Feb 8 11:06:05 CST 2010


Module: wine
Branch: master
Commit: 7f8279e1277f4495c1ab8fd624c73581ec1da2ee
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7f8279e1277f4495c1ab8fd624c73581ec1da2ee

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Fri Feb  5 12:14:18 2010 -0600

winemenubuilder: Use a custom error function.

---

 programs/winemenubuilder/winemenubuilder.c |   26 ++++++++++++++++++++++++--
 1 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c
index e14fe81..62165f6 100644
--- a/programs/winemenubuilder/winemenubuilder.c
+++ b/programs/winemenubuilder/winemenubuilder.c
@@ -188,8 +188,10 @@ static void *libpng_handle;
 MAKE_FUNCPTR(png_create_info_struct);
 MAKE_FUNCPTR(png_create_write_struct);
 MAKE_FUNCPTR(png_destroy_write_struct);
+MAKE_FUNCPTR(png_get_error_ptr);
 MAKE_FUNCPTR(png_init_io);
 MAKE_FUNCPTR(png_set_bgr);
+MAKE_FUNCPTR(png_set_error_fn);
 MAKE_FUNCPTR(png_set_text);
 MAKE_FUNCPTR(png_set_IHDR);
 MAKE_FUNCPTR(png_write_end);
@@ -209,8 +211,10 @@ static void *load_libpng(void)
         LOAD_FUNCPTR(png_create_info_struct);
         LOAD_FUNCPTR(png_create_write_struct);
         LOAD_FUNCPTR(png_destroy_write_struct);
+        LOAD_FUNCPTR(png_get_error_ptr);
         LOAD_FUNCPTR(png_init_io);
         LOAD_FUNCPTR(png_set_bgr);
+        LOAD_FUNCPTR(png_set_error_fn);
         LOAD_FUNCPTR(png_set_IHDR);
         LOAD_FUNCPTR(png_set_text);
         LOAD_FUNCPTR(png_write_end);
@@ -221,6 +225,23 @@ static void *load_libpng(void)
     return libpng_handle;
 }
 
+static void user_error_fn(png_structp png_ptr, png_const_charp error_message)
+{
+    jmp_buf *pjmpbuf;
+
+    /* This uses setjmp/longjmp just like the default. We can't use the
+     * default because there's no way to access the jmp buffer in the png_struct
+     * that works in 1.2 and 1.4 and allows us to dynamically load libpng. */
+    WINE_ERR("PNG error: %s\n", wine_dbgstr_an(error_message, -1));
+    pjmpbuf = ppng_get_error_ptr(png_ptr);
+    longjmp(*pjmpbuf, 1);
+}
+
+static void user_warning_fn(png_structp png_ptr, png_const_charp warning_message)
+{
+    WINE_WARN("PNG warning: %s\n", wine_dbgstr_an(warning_message, -1));
+}
+
 static BOOL SaveIconResAsPNG(const BITMAPINFO *pIcon, const char *png_filename, LPCWSTR commentW)
 {
     static const char comment_key[] = "Created from";
@@ -234,6 +255,7 @@ static BOOL SaveIconResAsPNG(const BITMAPINFO *pIcon, const char *png_filename,
     int nWidth  = pIcon->bmiHeader.biWidth;
     int nHeight = pIcon->bmiHeader.biHeight;
     int nBpp    = pIcon->bmiHeader.biBitCount;
+    jmp_buf jmpbuf;
 
     switch (nBpp)
     {
@@ -306,12 +328,12 @@ static BOOL SaveIconResAsPNG(const BITMAPINFO *pIcon, const char *png_filename,
         !(info_ptr = ppng_create_info_struct(png_ptr)))
         goto error;
 
-    if (setjmp(png_jmpbuf(png_ptr)))
+    if (setjmp(jmpbuf))
     {
         /* All future errors jump here */
-        WINE_ERR("png error\n");
         goto error;
     }
+    ppng_set_error_fn(png_ptr, &jmpbuf, user_error_fn, user_warning_fn);
 
     ppng_init_io(png_ptr, fp);
     ppng_set_IHDR(png_ptr, info_ptr, nWidth, nHeight, 8,




More information about the wine-cvs mailing list