From 615e0e64f9fa3a910c58af2a382943546d3230a6 Mon Sep 17 00:00:00 2001 From: Marcus Meissner Date: Sat, 27 Feb 2010 23:13:21 +0100 Subject: [PATCH] windowscodecs: Handle old libpng.so using distros (as SLE 10). --- configure | 84 ++++++++++++++++++++++++++++++++++ configure.ac | 5 ++ dlls/windowscodecs/pngformat.c | 12 +++++ include/config.h.in | 3 ++ 4 files changed, 104 insertions(+) diff --git a/configure b/configure index 5ecb68f851f..6d98218c8ab 100755 --- a/configure +++ b/configure @@ -11060,6 +11060,49 @@ _ACEOF fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_set_expand_gray_1_2_4_to_8 in -lpng" >&5 +$as_echo_n "checking for png_set_expand_gray_1_2_4_to_8 in -lpng... " >&6; } +if test "${ac_cv_lib_png_png_set_expand_gray_1_2_4_to_8+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng -lm -lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char png_set_expand_gray_1_2_4_to_8 (); +int +main () +{ +return png_set_expand_gray_1_2_4_to_8 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_png_png_set_expand_gray_1_2_4_to_8=yes +else + ac_cv_lib_png_png_set_expand_gray_1_2_4_to_8=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_set_expand_gray_1_2_4_to_8" >&5 +$as_echo "$ac_cv_lib_png_png_set_expand_gray_1_2_4_to_8" >&6; } +if test "x$ac_cv_lib_png_png_set_expand_gray_1_2_4_to_8" = x""yes; then : + +$as_echo "#define HAVE_PNG_SET_EXPAND_GRAY_1_2_4_TO_8 1" >>confdefs.h + + +fi + elif test -n "$X_CFLAGS" -a "x$with_png" != "xno" then ac_save_CPPFLAGS="$CPPFLAGS" @@ -11132,6 +11175,47 @@ _ACEOF fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_set_expand_gray_1_2_4_to_8 in -lpng" >&5 +$as_echo_n "checking for png_set_expand_gray_1_2_4_to_8 in -lpng... " >&6; } +if test "${ac_cv_lib_png_png_set_expand_gray_1_2_4_to_8+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lpng $X_LIBS -lm -lz $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char png_set_expand_gray_1_2_4_to_8 (); +int +main () +{ +return png_set_expand_gray_1_2_4_to_8 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_png_png_set_expand_gray_1_2_4_to_8=yes +else + ac_cv_lib_png_png_set_expand_gray_1_2_4_to_8=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_set_expand_gray_1_2_4_to_8" >&5 +$as_echo "$ac_cv_lib_png_png_set_expand_gray_1_2_4_to_8" >&6; } +if test "x$ac_cv_lib_png_png_set_expand_gray_1_2_4_to_8" = x""yes; then : + $as_echo "#define HAVE_PNG_SET_EXPAND_GRAY_1_2_4_TO_8 1" >>confdefs.h + +fi + fi fi if test "x$ac_cv_lib_soname_png" = "x"; then : diff --git a/configure.ac b/configure.ac index 07962005717..8eb37a28a15 100644 --- a/configure.ac +++ b/configure.ac @@ -1420,6 +1420,9 @@ dnl **** Check for libpng **** if test "$ac_cv_header_png_h" = "yes" then WINE_CHECK_SONAME(png,png_create_read_struct,,,-lm -lz,[[libpng[[0-9]]*]]) + AC_CHECK_LIB(png,png_set_expand_gray_1_2_4_to_8, + [AC_DEFINE(HAVE_PNG_SET_EXPAND_GRAY_1_2_4_TO_8,1,[Define to 1 if libpng has the png_set_expand_gray_1_2_4_to_8 function.])] + ,,-lm -lz) elif test -n "$X_CFLAGS" -a "x$with_png" != "xno" then dnl libpng is in the X directory on Mac OS X @@ -1432,6 +1435,8 @@ then then AC_SUBST(PNGINCL,"$X_CFLAGS") WINE_CHECK_SONAME(png,png_create_read_struct,,,[$X_LIBS -lm -lz],[[libpng[[0-9]]*]]) + AC_CHECK_LIB(png,png_set_expand_gray_1_2_4_to_8, + [AC_DEFINE(HAVE_PNG_SET_EXPAND_GRAY_1_2_4_TO_8,1)],,[$X_LIBS -lm -lz]) fi fi WINE_WARNING_WITH(png,[test "x$ac_cv_lib_soname_png" = "x"], diff --git a/dlls/windowscodecs/pngformat.c b/dlls/windowscodecs/pngformat.c index 482ea90089d..22b37b063f4 100644 --- a/dlls/windowscodecs/pngformat.c +++ b/dlls/windowscodecs/pngformat.c @@ -60,7 +60,11 @@ MAKE_FUNCPTR(png_get_PLTE); MAKE_FUNCPTR(png_get_tRNS); MAKE_FUNCPTR(png_set_bgr); MAKE_FUNCPTR(png_set_error_fn); +#if HAVE_PNG_SET_EXPAND_GRAY_1_2_4_TO_8 MAKE_FUNCPTR(png_set_expand_gray_1_2_4_to_8); +#else +MAKE_FUNCPTR(png_set_gray_1_2_4_to_8); +#endif MAKE_FUNCPTR(png_set_filler); MAKE_FUNCPTR(png_set_gray_to_rgb); MAKE_FUNCPTR(png_set_IHDR); @@ -103,7 +107,11 @@ static void *load_libpng(void) LOAD_FUNCPTR(png_get_tRNS); LOAD_FUNCPTR(png_set_bgr); LOAD_FUNCPTR(png_set_error_fn); +#if HAVE_PNG_SET_EXPAND_GRAY_1_2_4_TO_8 LOAD_FUNCPTR(png_set_expand_gray_1_2_4_to_8); +#else + LOAD_FUNCPTR(png_set_gray_1_2_4_to_8); +#endif LOAD_FUNCPTR(png_set_filler); LOAD_FUNCPTR(png_set_gray_to_rgb); LOAD_FUNCPTR(png_set_IHDR); @@ -306,7 +314,11 @@ static HRESULT WINAPI PngDecoder_Initialize(IWICBitmapDecoder *iface, IStream *p { if (bit_depth < 8) { +#if HAVE_PNG_SET_EXPAND_GRAY_1_2_4_TO_8 ppng_set_expand_gray_1_2_4_to_8(This->png_ptr); +#else + ppng_set_gray_1_2_4_to_8(This->png_ptr); +#endif bit_depth = 8; } ppng_set_gray_to_rgb(This->png_ptr); diff --git a/include/config.h.in b/include/config.h.in index 4e8fcd11c49..7c34980ad92 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -582,6 +582,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_PNG_H +/* Define to 1 if libpng has the png_set_expand_gray_1_2_4_to_8 function. */ +#undef HAVE_PNG_SET_EXPAND_GRAY_1_2_4_TO_8 + /* Define to 1 if you have the `poll' function. */ #undef HAVE_POLL