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, -- 1.6.3.3