diff --git a/configure b/configure index f6bbde77b31..8bf1dec30a9 100755 --- a/configure +++ b/configure @@ -311,7 +311,7 @@ ac_includes_default="\ # include #endif" -ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS WIN16_FILES WIN16_INSTALL build build_cpu build_vendor build_os host host_cpu host_vendor host_os SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX CPPBIN ac_ct_CPPBIN TOOLSDIR CPP X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS LEX LEXLIB LEX_OUTPUT_ROOT XLEX BISON AS ac_ct_AS LD ac_ct_LD AR ac_ct_AR RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP WINDRES ac_ct_WINDRES LN_S LN EGREP LDCONFIG INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LINT LINTFLAGS DB2HTML DB2PDF DB2PS DB2TXT FONTFORGE LIBPTHREAD XLIB XFILES OPENGLFILES GLU32FILES OPENGL_LIBS GLUT_LIBS GLUT32FILES NASLIBS CURSESLIBS sane_devel SANELIBS SANEINCL ICULIBS ft_devel ft_devel2 FREETYPELIBS FREETYPEINCL FONTSSUBDIRS ARTSCCONFIG ARTSLIBS ARTSINCL ALSALIBS AUDIOIOLIBS LCMSLIBS CAPI4LINUXLIBS EXTRACFLAGS DLLEXT DLLFLAGS DLLIBS LDSHARED LDDLLFLAGS LIBEXT IMPLIBEXT DLLTOOL ac_ct_DLLTOOL DLLWRAP ac_ct_DLLWRAP LDEXECFLAGS LDLIBWINEFLAGS COREFOUNDATIONLIB IOKITLIB CROSSTEST CROSSCC CROSSWINDRES LDPATH CRTLIBS SOCKETLIBS WINE_BINARIES MAIN_BINARY LDD ALLOCA LIBOBJS LTLIBOBJS' +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS WIN16_FILES WIN16_INSTALL build build_cpu build_vendor build_os host host_cpu host_vendor host_os SET_MAKE CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT CXX CXXFLAGS ac_ct_CXX CPPBIN ac_ct_CPPBIN TOOLSDIR CPP X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS LEX LEXLIB LEX_OUTPUT_ROOT XLEX BISON AS ac_ct_AS LD ac_ct_LD AR ac_ct_AR RANLIB ac_ct_RANLIB STRIP ac_ct_STRIP WINDRES ac_ct_WINDRES LN_S LN EGREP LDCONFIG INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA LINT LINTFLAGS DB2HTML DB2PDF DB2PS DB2TXT FONTFORGE LIBPTHREAD XLIB XFILES OPENGLFILES GLU32FILES OPENGL_LIBS GLUT_LIBS GLUT32FILES NASLIBS CURSESLIBS sane_devel SANELIBS SANEINCL ICULIBS ft_devel ft_devel2 FREETYPELIBS FREETYPEINCL FONTSSUBDIRS ARTSCCONFIG ARTSLIBS ARTSINCL ALSALIBS AUDIOIOLIBS CAPI4LINUXLIBS EXTRACFLAGS DLLEXT DLLFLAGS DLLIBS LDSHARED LDDLLFLAGS LIBEXT IMPLIBEXT DLLTOOL ac_ct_DLLTOOL DLLWRAP ac_ct_DLLWRAP LDEXECFLAGS LDLIBWINEFLAGS COREFOUNDATIONLIB IOKITLIB CROSSTEST CROSSCC CROSSWINDRES LDPATH CRTLIBS SOCKETLIBS WINE_BINARIES MAIN_BINARY LDD ALLOCA LIBOBJS LTLIBOBJS' ac_subst_files='MAKE_RULES MAKE_DLL_RULES MAKE_TEST_RULES MAKE_LIB_RULES MAKE_PROG_RULES' # Initialize some variables set by options. @@ -11629,231 +11629,6 @@ done -for ac_header in lcms.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 -else - # Is the header compilable? -echo "$as_me:$LINENO: checking $ac_header usability" >&5 -echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest.$ac_objext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_header_compiler=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_header_compiler=no -fi -rm -f conftest.err conftest.$ac_objext conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 -echo "${ECHO_T}$ac_header_compiler" >&6 - -# Is the header present? -echo "$as_me:$LINENO: checking $ac_header presence" >&5 -echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include <$ac_header> -_ACEOF -if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 - (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null; then - if test -s conftest.err; then - ac_cpp_err=$ac_c_preproc_warn_flag - ac_cpp_err=$ac_cpp_err$ac_c_werror_flag - else - ac_cpp_err= - fi -else - ac_cpp_err=yes -fi -if test -z "$ac_cpp_err"; then - ac_header_preproc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_header_preproc=no -fi -rm -f conftest.err conftest.$ac_ext -echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 -echo "${ECHO_T}$ac_header_preproc" >&6 - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in - yes:no: ) - { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 -echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} - ac_header_preproc=yes - ;; - no:yes:* ) - { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 -echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 -echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 -echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 -echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 -echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} - { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 -echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} - ( - cat <<\_ASBOX -## ------------------------------------ ## -## Report this to wine-devel@winehq.org ## -## ------------------------------------ ## -_ASBOX - ) | - sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac -echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 -if eval "test \"\${$as_ac_Header+set}\" = set"; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - eval "$as_ac_Header=\$ac_header_preproc" -fi -echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 -echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 - -fi -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - echo "$as_me:$LINENO: checking for cmsOpenProfileFromFile in -llcms" >&5 -echo $ECHO_N "checking for cmsOpenProfileFromFile in -llcms... $ECHO_C" >&6 -if test "${ac_cv_lib_lcms_cmsOpenProfileFromFile+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-llcms $LIBS" -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -/* Override any gcc2 internal prototype to avoid an error. */ -#ifdef __cplusplus -extern "C" -#endif -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char cmsOpenProfileFromFile (); -int -main () -{ -cmsOpenProfileFromFile (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; } && - { ac_try='test -s conftest$ac_exeext' - { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 - (eval $ac_try) 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_lib_lcms_cmsOpenProfileFromFile=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -ac_cv_lib_lcms_cmsOpenProfileFromFile=no -fi -rm -f conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -LIBS=$ac_check_lib_save_LIBS -fi -echo "$as_me:$LINENO: result: $ac_cv_lib_lcms_cmsOpenProfileFromFile" >&5 -echo "${ECHO_T}$ac_cv_lib_lcms_cmsOpenProfileFromFile" >&6 -if test $ac_cv_lib_lcms_cmsOpenProfileFromFile = yes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_LCMS 1 -_ACEOF - - LCMSLIBS="-llcms" - - -fi - - -fi - -done - - - - for ac_header in capi20.h do as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` @@ -15860,6 +15635,80 @@ cat >>confdefs.h <<_ACEOF #define SONAME_LIBGIF "$ac_cv_lib_soname_gif" _ACEOF fi + +echo "$as_me:$LINENO: checking for -llcms soname" >&5 +echo $ECHO_N "checking for -llcms soname... $ECHO_C" >&6 +if test "${ac_cv_lib_soname_lcms+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_get_soname_save_LIBS=$LIBS +LIBS="-llcms $LIBS" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char cmsOpenProfileFromFile (); +int +main () +{ +cmsOpenProfileFromFile (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_soname_lcms=`$ac_cv_path_LDD conftest$ac_exeext | grep liblcms\\.$LIBEXT | sed "s/^.*\(liblcms\.$LIBEXT[^ ]*\).*$/\1/"` + if test "x$ac_cv_lib_soname_lcms" = "x" + then + ac_cv_lib_soname_lcms="liblcms.$LIBEXT" + fi +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_soname_lcms="liblcms.$LIBEXT" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS=$ac_get_soname_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_soname_lcms" >&5 +echo "${ECHO_T}$ac_cv_lib_soname_lcms" >&6 +if test "x$ac_cv_lib_soname_lcms" != xNONE +then +cat >>confdefs.h <<_ACEOF +#define SONAME_LIBLCMS "$ac_cv_lib_soname_lcms" +_ACEOF +fi fi @@ -16528,6 +16377,7 @@ done + for ac_header in \ @@ -16544,6 +16394,7 @@ for ac_header in \ io.h \ jack/jack.h \ jpeglib.h \ + lcms.h \ libio.h \ libutil.h \ link.h \ @@ -20278,7 +20129,7 @@ MAKE_LIB_RULES=libs/Makelib.rules MAKE_PROG_RULES=programs/Makeprog.rules - ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules dlls/Maketest.rules libs/Makelib.rules programs/Makeprog.rules Makefile dlls/Makefile dlls/advapi32/Makefile dlls/advapi32/tests/Makefile dlls/advpack/Makefile dlls/amstream/Makefile dlls/atl/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/cabinet/Makefile dlls/capi2032/Makefile dlls/cards/Makefile dlls/cfgmgr32/Makefile dlls/comcat/Makefile dlls/comctl32/Makefile dlls/comctl32/tests/Makefile dlls/commdlg/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/ctl3d/Makefile dlls/d3d8/Makefile dlls/d3d9/Makefile dlls/d3dim/Makefile dlls/d3drm/Makefile dlls/d3dx8/Makefile dlls/d3dxof/Makefile dlls/dbghelp/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/ddraw/tests/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dinput8/Makefile dlls/dmband/Makefile dlls/dmcompos/Makefile dlls/dmime/Makefile dlls/dmloader/Makefile dlls/dmscript/Makefile dlls/dmstyle/Makefile dlls/dmsynth/Makefile dlls/dmusic/Makefile dlls/dmusic32/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dpnet/Makefile dlls/dpnhpast/Makefile dlls/dsound/Makefile dlls/dsound/tests/Makefile dlls/dswave/Makefile dlls/dxdiagn/Makefile dlls/dxerr8/Makefile dlls/dxerr9/Makefile dlls/dxguid/Makefile dlls/gdi/Makefile dlls/gdi/tests/Makefile dlls/glu32/Makefile dlls/glut32/Makefile dlls/hhctrl.ocx/Makefile dlls/iccvid/Makefile dlls/icmp/Makefile dlls/ifsmgr.vxd/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/iphlpapi/Makefile dlls/iphlpapi/tests/Makefile dlls/itss/Makefile dlls/kernel/Makefile dlls/kernel/tests/Makefile dlls/lzexpand/Makefile dlls/mapi32/Makefile dlls/mapi32/tests/Makefile dlls/mlang/Makefile dlls/mlang/tests/Makefile dlls/mmdevldr.vxd/Makefile dlls/monodebg.vxd/Makefile dlls/mpr/Makefile dlls/msacm/Makefile dlls/msacm/imaadp32/Makefile dlls/msacm/msadp32/Makefile dlls/msacm/msg711/Makefile dlls/msacm/winemp3/Makefile dlls/msacm/tests/Makefile dlls/mscms/Makefile dlls/msdmo/Makefile dlls/mshtml/Makefile dlls/msi/Makefile dlls/msimg32/Makefile dlls/msisys/Makefile dlls/msnet32/Makefile dlls/msrle32/Makefile dlls/msvcrt/Makefile dlls/msvcrt/tests/Makefile dlls/msvcrt20/Makefile dlls/msvcrt40/Makefile dlls/msvcrtd/Makefile dlls/msvcrtd/tests/Makefile dlls/msvidc32/Makefile dlls/msvideo/Makefile dlls/mswsock/Makefile dlls/netapi32/Makefile dlls/netapi32/tests/Makefile dlls/newdev/Makefile dlls/ntdll/Makefile dlls/ntdll/tests/Makefile dlls/odbc32/Makefile dlls/ole32/Makefile dlls/ole32/tests/Makefile dlls/oleacc/Makefile dlls/oleaut32/Makefile dlls/oleaut32/tests/Makefile dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/psapi/Makefile dlls/psapi/tests/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/quartz/tests/Makefile dlls/rasapi32/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile dlls/rpcrt4/tests/Makefile dlls/rsabase/Makefile dlls/rsabase/tests/Makefile dlls/secur32/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shell32/tests/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/shlwapi/tests/Makefile dlls/snmpapi/Makefile dlls/sti/Makefile dlls/strmiids/Makefile dlls/tapi32/Makefile dlls/ttydrv/Makefile dlls/twain/Makefile dlls/unicows/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/urlmon/tests/Makefile dlls/user/Makefile dlls/user/tests/Makefile dlls/uuid/Makefile dlls/uxtheme/Makefile dlls/vdhcp.vxd/Makefile dlls/vdmdbg/Makefile dlls/version/Makefile dlls/version/tests/Makefile dlls/vmm.vxd/Makefile dlls/vnbt.vxd/Makefile dlls/vnetbios.vxd/Makefile dlls/vtdapi.vxd/Makefile dlls/vwin32.vxd/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile dlls/wined3d/Makefile dlls/winedos/Makefile dlls/wineps/Makefile dlls/wininet/Makefile dlls/wininet/tests/Makefile dlls/winmm/Makefile dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile dlls/winmm/mciavi/Makefile dlls/winmm/mcicda/Makefile dlls/winmm/mciseq/Makefile dlls/winmm/mciwave/Makefile dlls/winmm/midimap/Makefile dlls/winmm/tests/Makefile dlls/winmm/wavemap/Makefile dlls/winmm/winealsa/Makefile dlls/winmm/winearts/Makefile dlls/winmm/wineaudioio/Makefile dlls/winmm/winejack/Makefile dlls/winmm/winenas/Makefile dlls/winmm/wineoss/Makefile dlls/winnls/Makefile dlls/winsock/Makefile dlls/winsock/tests/Makefile dlls/winspool/Makefile dlls/winspool/tests/Makefile dlls/wintab32/Makefile dlls/wintrust/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile dlls/x11drv/Makefile documentation/Makefile fonts/Makefile include/Makefile libs/Makefile libs/port/Makefile libs/unicode/Makefile libs/wine/Makefile libs/wpp/Makefile loader/Makefile programs/Makefile programs/avitools/Makefile programs/clock/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/expand/Makefile programs/msiexec/Makefile programs/notepad/Makefile programs/progman/Makefile programs/regedit/Makefile programs/regsvr32/Makefile programs/rpcss/Makefile programs/rundll32/Makefile programs/start/Makefile programs/taskmgr/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wcmd/Makefile programs/wineboot/Makefile programs/winebrowser/Makefile programs/winecfg/Makefile programs/wineconsole/Makefile programs/winedbg/Makefile programs/winefile/Makefile programs/winemenubuilder/Makefile programs/winemine/Makefile programs/winepath/Makefile programs/winetest/Makefile programs/winevdm/Makefile programs/winhelp/Makefile programs/winver/Makefile server/Makefile tools/Makefile tools/widl/Makefile tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/winegcc/Makefile tools/wmc/Makefile tools/wrc/Makefile" + ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules dlls/Maketest.rules libs/Makelib.rules programs/Makeprog.rules Makefile dlls/Makefile dlls/advapi32/Makefile dlls/advapi32/tests/Makefile dlls/advpack/Makefile dlls/amstream/Makefile dlls/atl/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/cabinet/Makefile dlls/capi2032/Makefile dlls/cards/Makefile dlls/cfgmgr32/Makefile dlls/comcat/Makefile dlls/comctl32/Makefile dlls/comctl32/tests/Makefile dlls/commdlg/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/ctl3d/Makefile dlls/d3d8/Makefile dlls/d3d9/Makefile dlls/d3dim/Makefile dlls/d3drm/Makefile dlls/d3dx8/Makefile dlls/d3dxof/Makefile dlls/dbghelp/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/ddraw/tests/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dinput8/Makefile dlls/dmband/Makefile dlls/dmcompos/Makefile dlls/dmime/Makefile dlls/dmloader/Makefile dlls/dmscript/Makefile dlls/dmstyle/Makefile dlls/dmsynth/Makefile dlls/dmusic/Makefile dlls/dmusic32/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dpnet/Makefile dlls/dpnhpast/Makefile dlls/dsound/Makefile dlls/dsound/tests/Makefile dlls/dswave/Makefile dlls/dxdiagn/Makefile dlls/dxerr8/Makefile dlls/dxerr9/Makefile dlls/dxguid/Makefile dlls/gdi/Makefile dlls/gdi/tests/Makefile dlls/glu32/Makefile dlls/glut32/Makefile dlls/hhctrl.ocx/Makefile dlls/iccvid/Makefile dlls/icmp/Makefile dlls/ifsmgr.vxd/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/iphlpapi/Makefile dlls/iphlpapi/tests/Makefile dlls/itss/Makefile dlls/kernel/Makefile dlls/kernel/tests/Makefile dlls/lzexpand/Makefile dlls/mapi32/Makefile dlls/mapi32/tests/Makefile dlls/mlang/Makefile dlls/mlang/tests/Makefile dlls/mmdevldr.vxd/Makefile dlls/monodebg.vxd/Makefile dlls/mpr/Makefile dlls/msacm/Makefile dlls/msacm/imaadp32/Makefile dlls/msacm/msadp32/Makefile dlls/msacm/msg711/Makefile dlls/msacm/winemp3/Makefile dlls/msacm/tests/Makefile dlls/mscms/Makefile dlls/mscms/tests/Makefile dlls/msdmo/Makefile dlls/mshtml/Makefile dlls/msi/Makefile dlls/msimg32/Makefile dlls/msisys/Makefile dlls/msnet32/Makefile dlls/msrle32/Makefile dlls/msvcrt/Makefile dlls/msvcrt/tests/Makefile dlls/msvcrt20/Makefile dlls/msvcrt40/Makefile dlls/msvcrtd/Makefile dlls/msvcrtd/tests/Makefile dlls/msvidc32/Makefile dlls/msvideo/Makefile dlls/mswsock/Makefile dlls/netapi32/Makefile dlls/netapi32/tests/Makefile dlls/newdev/Makefile dlls/ntdll/Makefile dlls/ntdll/tests/Makefile dlls/odbc32/Makefile dlls/ole32/Makefile dlls/ole32/tests/Makefile dlls/oleacc/Makefile dlls/oleaut32/Makefile dlls/oleaut32/tests/Makefile dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/psapi/Makefile dlls/psapi/tests/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/quartz/tests/Makefile dlls/rasapi32/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile dlls/rpcrt4/tests/Makefile dlls/rsabase/Makefile dlls/rsabase/tests/Makefile dlls/secur32/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shell32/tests/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/shlwapi/tests/Makefile dlls/snmpapi/Makefile dlls/sti/Makefile dlls/strmiids/Makefile dlls/tapi32/Makefile dlls/ttydrv/Makefile dlls/twain/Makefile dlls/unicows/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/urlmon/tests/Makefile dlls/user/Makefile dlls/user/tests/Makefile dlls/uuid/Makefile dlls/uxtheme/Makefile dlls/vdhcp.vxd/Makefile dlls/vdmdbg/Makefile dlls/version/Makefile dlls/version/tests/Makefile dlls/vmm.vxd/Makefile dlls/vnbt.vxd/Makefile dlls/vnetbios.vxd/Makefile dlls/vtdapi.vxd/Makefile dlls/vwin32.vxd/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile dlls/wined3d/Makefile dlls/winedos/Makefile dlls/wineps/Makefile dlls/wininet/Makefile dlls/wininet/tests/Makefile dlls/winmm/Makefile dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile dlls/winmm/mciavi/Makefile dlls/winmm/mcicda/Makefile dlls/winmm/mciseq/Makefile dlls/winmm/mciwave/Makefile dlls/winmm/midimap/Makefile dlls/winmm/tests/Makefile dlls/winmm/wavemap/Makefile dlls/winmm/winealsa/Makefile dlls/winmm/winearts/Makefile dlls/winmm/wineaudioio/Makefile dlls/winmm/winejack/Makefile dlls/winmm/winenas/Makefile dlls/winmm/wineoss/Makefile dlls/winnls/Makefile dlls/winsock/Makefile dlls/winsock/tests/Makefile dlls/winspool/Makefile dlls/winspool/tests/Makefile dlls/wintab32/Makefile dlls/wintrust/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile dlls/x11drv/Makefile documentation/Makefile fonts/Makefile include/Makefile libs/Makefile libs/port/Makefile libs/unicode/Makefile libs/wine/Makefile libs/wpp/Makefile loader/Makefile programs/Makefile programs/avitools/Makefile programs/clock/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/expand/Makefile programs/msiexec/Makefile programs/notepad/Makefile programs/progman/Makefile programs/regedit/Makefile programs/regsvr32/Makefile programs/rpcss/Makefile programs/rundll32/Makefile programs/start/Makefile programs/taskmgr/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wcmd/Makefile programs/wineboot/Makefile programs/winebrowser/Makefile programs/winecfg/Makefile programs/wineconsole/Makefile programs/winedbg/Makefile programs/winefile/Makefile programs/winemenubuilder/Makefile programs/winemine/Makefile programs/winepath/Makefile programs/winetest/Makefile programs/winevdm/Makefile programs/winhelp/Makefile programs/winver/Makefile server/Makefile tools/Makefile tools/widl/Makefile tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/winegcc/Makefile tools/wmc/Makefile tools/wrc/Makefile" cat >confcache <<\_ACEOF @@ -20897,6 +20748,7 @@ do "dlls/msacm/winemp3/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msacm/winemp3/Makefile" ;; "dlls/msacm/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msacm/tests/Makefile" ;; "dlls/mscms/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/mscms/Makefile" ;; + "dlls/mscms/tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/mscms/tests/Makefile" ;; "dlls/msdmo/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msdmo/Makefile" ;; "dlls/mshtml/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/mshtml/Makefile" ;; "dlls/msi/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msi/Makefile" ;; @@ -21240,7 +21092,6 @@ s,@ARTSLIBS@,$ARTSLIBS,;t t s,@ARTSINCL@,$ARTSINCL,;t t s,@ALSALIBS@,$ALSALIBS,;t t s,@AUDIOIOLIBS@,$AUDIOIOLIBS,;t t -s,@LCMSLIBS@,$LCMSLIBS,;t t s,@CAPI4LINUXLIBS@,$CAPI4LINUXLIBS,;t t s,@EXTRACFLAGS@,$EXTRACFLAGS,;t t s,@DLLEXT@,$DLLEXT,;t t diff --git a/configure.ac b/configure.ac index b08512e4267..ef88545daf4 100644 --- a/configure.ac +++ b/configure.ac @@ -631,15 +631,6 @@ AC_CHECK_HEADERS(libaudioio.h, [AUDIOIOLIBS="-laudioio" AC_DEFINE(HAVE_LIBAUDIOIO, 1, [Define if you have libaudioIO])])]) -dnl **** Check for lcms **** - -AC_CHECK_HEADERS(lcms.h, - [AC_CHECK_LIB(lcms,cmsOpenProfileFromFile, - [AC_DEFINE(HAVE_LCMS,1,[Define if you have lcms libs and headers]) - AC_SUBST(LCMSLIBS,"-llcms") - ]) -]) - dnl **** Check for capi4linux **** AC_CHECK_HEADERS(capi20.h,[ @@ -1047,6 +1038,7 @@ then WINE_GET_SONAME(jpeg,jpeg_start_decompress) WINE_GET_SONAME(ungif,DGifOpen) WINE_GET_SONAME(gif,DGifOpen) + WINE_GET_SONAME(lcms,cmsOpenProfileFromFile) fi @@ -1131,6 +1123,7 @@ AC_CHECK_HEADERS(\ io.h \ jack/jack.h \ jpeglib.h \ + lcms.h \ libio.h \ libutil.h \ link.h \ @@ -1619,6 +1612,7 @@ dlls/msacm/msg711/Makefile dlls/msacm/winemp3/Makefile dlls/msacm/tests/Makefile dlls/mscms/Makefile +dlls/mscms/tests/Makefile dlls/msdmo/Makefile dlls/mshtml/Makefile dlls/msi/Makefile diff --git a/dlls/mscms/Makefile.in b/dlls/mscms/Makefile.in index cd2acdb53ca..fba3e7d6b0a 100644 --- a/dlls/mscms/Makefile.in +++ b/dlls/mscms/Makefile.in @@ -4,10 +4,13 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = mscms.dll IMPORTS = kernel32 -EXTRALIBS = @LCMSLIBS@ C_SRCS = \ - mscms_main.c + handle.c \ + mscms_main.c \ + profile.c + +SUBDIRS = tests @MAKE_DLL_RULES@ diff --git a/dlls/mscms/handle.c b/dlls/mscms/handle.c new file mode 100644 index 00000000000..66c6610718d --- /dev/null +++ b/dlls/mscms/handle.c @@ -0,0 +1,154 @@ +/* + * MSCMS - Color Management System for Wine + * + * Copyright 2004 Hans Leidekker + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include + +#include "windef.h" +#include "winbase.h" + +#include "wingdi.h" +#include "icm.h" + +#include "mscms_priv.h" + +#ifdef HAVE_LCMS_H + +static CRITICAL_SECTION MSCMS_handle_cs; +static CRITICAL_SECTION_DEBUG MSCMS_handle_cs_debug = +{ + 0, 0, &MSCMS_handle_cs, + { &MSCMS_handle_cs_debug.ProcessLocksList, + &MSCMS_handle_cs_debug.ProcessLocksList }, + 0, 0, { 0, (DWORD)(__FILE__ ": MSCMS_handle_cs") } +}; +static CRITICAL_SECTION MSCMS_handle_cs = { &MSCMS_handle_cs_debug, -1, 0, 0, 0, 0 }; + +/* A simple structure to tie together Windows file handles and lcms color + * profile handles. Windows color profile handles are built from indexes + * into an array of these structures. The 'file' field is set to NULL in + * case of a memory based profile + */ + +struct handlemap +{ + HANDLE file; + cmsHPROFILE cmsprofile; +}; + +#define CMSMAXHANDLES 0x80 + +static struct handlemap handlemaptable[CMSMAXHANDLES]; + +HPROFILE MSCMS_cmsprofile2hprofile( cmsHPROFILE cmsprofile ) +{ + HPROFILE ret = NULL; + unsigned int i; + + if (!cmsprofile) return ret; + + EnterCriticalSection( &MSCMS_handle_cs ); + + for (i = 0; i <= CMSMAXHANDLES; i++) + { + if (handlemaptable[i].cmsprofile == cmsprofile) + { + ret = (HPROFILE)(i + 1); goto out; + } + } + +out: + LeaveCriticalSection( &MSCMS_handle_cs ); + + return ret; +} + +cmsHPROFILE MSCMS_hprofile2cmsprofile( HPROFILE profile ) +{ + HANDLE ret; + unsigned int i; + + EnterCriticalSection( &MSCMS_handle_cs ); + + i = (unsigned int)profile - 1; + ret = handlemaptable[i].cmsprofile; + + LeaveCriticalSection( &MSCMS_handle_cs ); + + return ret; +} + +HANDLE MSCMS_hprofile2handle( HPROFILE profile ) +{ + HANDLE ret; + unsigned int i; + + EnterCriticalSection( &MSCMS_handle_cs ); + + i = (unsigned int)profile - 1; + ret = handlemaptable[i].file; + + LeaveCriticalSection( &MSCMS_handle_cs ); + + return ret; +} + +HPROFILE MSCMS_create_hprofile_handle( HANDLE file, cmsHPROFILE cmsprofile ) +{ + HPROFILE ret = NULL; + unsigned int i; + + if (!cmsprofile) return ret; + + EnterCriticalSection( &MSCMS_handle_cs ); + + for (i = 0; i <= CMSMAXHANDLES; i++) + { + if (handlemaptable[i].cmsprofile == 0) + { + handlemaptable[i].file = file; + handlemaptable[i].cmsprofile = cmsprofile; + + ret = (HPROFILE)(i + 1); goto out; + } + } + +out: + LeaveCriticalSection( &MSCMS_handle_cs ); + + return ret; +} + +void MSCMS_destroy_hprofile_handle( HPROFILE profile ) +{ + unsigned int i; + + if (profile) + { + EnterCriticalSection( &MSCMS_handle_cs ); + + i = (unsigned int)profile - 1; + memset( &handlemaptable[i], 0, sizeof(struct handlemap) ); + + LeaveCriticalSection( &MSCMS_handle_cs ); + } +} + +#endif /* HAVE_LCMS_H */ diff --git a/dlls/mscms/lcms_api.h b/dlls/mscms/lcms_api.h new file mode 100644 index 00000000000..5cf7ac388ff --- /dev/null +++ b/dlls/mscms/lcms_api.h @@ -0,0 +1,39 @@ +/* + * MSCMS - Color Management System for Wine + * + * Copyright 2004 Hans Leidekker + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "mscms_priv.h" + +#ifndef LCMS_API_FUNCTION +#error "This file should be included with LCMS_API_FUNCTION defined!" +#endif + +#ifdef HAVE_LCMS_H + +LCMS_API_FUNCTION(cmsCloseProfile) +LCMS_API_FUNCTION(cmsOpenProfileFromFile) +LCMS_API_FUNCTION(cmsOpenProfileFromMem) + +#ifndef LCMS_API_NO_REDEFINE +#define cmsCloseProfile pcmsCloseProfile +#define cmsOpenProfileFromFile pcmsOpenProfileFromFile +#define cmsOpenProfileFromMem pcmsOpenProfileFromMem +#endif /* LCMS_API_NO_REDEFINE */ + +#endif /* HAVE_LCMS_H */ diff --git a/dlls/mscms/mscms.spec b/dlls/mscms/mscms.spec index 065ac89972d..a4e8b5397b3 100644 --- a/dlls/mscms/mscms.spec +++ b/dlls/mscms/mscms.spec @@ -18,8 +18,8 @@ @ stub EnumColorProfilesW @ stub GenerateCopyFilePaths @ stub GetCMMInfo -@ stub GetColorDirectoryA -@ stub GetColorDirectoryW +@ stdcall GetColorDirectoryA(ptr ptr long) +@ stdcall GetColorDirectoryW(ptr ptr long) @ stub GetColorProfileElement @ stub GetColorProfileElementTag @ stub GetColorProfileFromHandle @@ -31,8 +31,8 @@ @ stub GetPS2ColorSpaceArray @ stub GetStandardColorSpaceProfileA @ stub GetStandardColorSpaceProfileW -@ stub InstallColorProfileA -@ stub InstallColorProfileW +@ stdcall InstallColorProfileA(ptr ptr) +@ stdcall InstallColorProfileW(ptr ptr) @ stub InternalGetDeviceConfig @ stub InternalGetPS2CSAFromLCS @ stub InternalGetPS2ColorRenderingDictionary @@ -55,7 +55,7 @@ @ stub SpoolerCopyFileEvent @ stub TranslateBitmapBits @ stub TranslateColors -@ stub UninstallColorProfileA -@ stub UninstallColorProfileW +@ stdcall UninstallColorProfileA(ptr ptr long) +@ stdcall UninstallColorProfileW(ptr ptr long) @ stub UnregisterCMMA @ stub UnregisterCMMW diff --git a/dlls/mscms/mscms_main.c b/dlls/mscms/mscms_main.c index e4757d859e6..94d7a3e6b46 100644 --- a/dlls/mscms/mscms_main.c +++ b/dlls/mscms/mscms_main.c @@ -20,77 +20,113 @@ #include "config.h" +#include "wine/port.h" +#include "wine/debug.h" +#include "wine/library.h" + #include #include "windef.h" #include "winbase.h" + #include "wingdi.h" #include "icm.h" -#include "wine/debug.h" + +#define LCMS_API_NO_REDEFINE +#define LCMS_API_FUNCTION(f) typeof(f) * p##f; +#include "lcms_api.h" +#undef LCMS_API_FUNCTION WINE_DEFAULT_DEBUG_CHANNEL(mscms); -#ifdef HAVE_LCMS - -/* These basic Windows types are defined in lcms.h when compiling on - * a non-Windows platforms (why?), so they would normally not conflict - * with anything included earlier. But since we are building Wine they - * most certainly will have been defined before we include lcms.h. - * The preprocessor comes to the rescue. - */ - -#define BYTE LCMS_BYTE -#define LPBYTE LCMS_LPBYTE -#define WORD LCMS_WORD -#define LPWORD LCMS_LPWORD -#define DWORD LCMS_DWORD -#define LPDWORD LCMS_LPDWORD -#define BOOL LCMS_BOOL -#define LPSTR LCMS_LPSTR -#define LPVOID LCMS_LPVOID - -#undef cdecl -#undef FAR - -#undef ZeroMemory -#undef CopyMemory - -#undef LOWORD -#undef MAX_PATH - -#include - -/* Funny thing is lcms.h defines DWORD as an 'unsigned int' whereas Wine - * defines it as an 'unsigned long'. To avoid compiler warnings we use a - * preprocessor define for DWORD and LPDWORD to get back Wine's orginal - * (typedef) definitions. - */ - -#undef DWORD -#undef LPDWORD - -#define DWORD DWORD -#define LPDWORD LPDWORD - +#ifdef HAVE_LCMS_H +#ifndef SONAME_LIBLCMS +#define SONAME_LIBLCMS "liblcms.so" #endif -HPROFILE WINAPI OpenColorProfileA( PPROFILE profile, DWORD access, DWORD sharing, DWORD creation ) +static void *lcmshandle = NULL; +#endif /* HAVE_LCMS_H */ + +static BOOL MSCMS_init_lcms() { - FIXME("( %p, %lx, %lx, %lx ) stub!\n", profile, access, sharing, creation ); +#ifdef HAVE_LCMS_H + /* dynamically load lcms if not yet loaded */ + if (!lcmshandle) + { + lcmshandle = wine_dlopen( SONAME_LIBLCMS, RTLD_NOW, NULL, 0 ); - return NULL; -} + /* We can't really do anything useful without liblcms */ + if (!lcmshandle) + { + WINE_MESSAGE( + "Wine cannot find the LittleCMS library. To enable Wine to use color\n" + "management functions please install a version of LittleCMS greater\n" + "than or equal to 1.13.\n" + "http://www.littlecms.com\n" ); -HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing, DWORD creation ) -{ - FIXME("( %p, %lx, %lx, %lx ) stub!\n", profile, access, sharing, creation ); + return FALSE; + } + } - return NULL; -} + #define LOAD_FUNCPTR(f) \ + if ((p##f = wine_dlsym( lcmshandle, #f, NULL, 0 )) == NULL) \ + goto sym_not_found; -BOOL WINAPI CloseColorProfile( HPROFILE profile ) -{ - FIXME("( %p ) stub!\n", profile ); + LOAD_FUNCPTR(cmsCloseProfile); + LOAD_FUNCPTR(cmsOpenProfileFromFile); + LOAD_FUNCPTR(cmsOpenProfileFromMem); + #undef LOAD_FUNCPTR + +return TRUE; + +sym_not_found: + WINE_MESSAGE( + "Wine cannot find certain functions that it needs inside the LittleCMS\n" + "library. To enable Wine to use LittleCMS for color management please\n" + "upgrade liblcms to at least version 1.13.\n" + "http://www.littlecms.com\n" ); + + wine_dlclose( lcmshandle, NULL, 0 ); + lcmshandle = NULL; return FALSE; + +#endif /* HAVE_LCMS_H */ + WINE_MESSAGE( + "This version of Wine was compiled without support for color management\n" + "functions. This means many color functions are empty stubs and you should\n" + "expect your application to fail. To enable Wine to use LittleCMS for color\n" + "management please install a liblcms development package version 1.13 or\n" + "higher and rebuild Wine.\n" + "http://www.littlecms.com\n" ); + + return TRUE; +} + +static void MSCMS_deinit_lcms() +{ +#ifdef HAVE_LCMS_H + if (lcmshandle) + { + wine_dlclose( lcmshandle, NULL, 0 ); + lcmshandle = NULL; + } +#endif /* HAVE_LCMS_H */ +} + +BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) +{ + TRACE( "(%p, 0x%08lx, %p)\n", hinst, reason, reserved ); + + switch (reason) + { + case DLL_PROCESS_ATTACH: + return MSCMS_init_lcms(); + + case DLL_PROCESS_DETACH: + MSCMS_deinit_lcms(); + break; + } + + return TRUE; } diff --git a/dlls/mscms/mscms_priv.h b/dlls/mscms/mscms_priv.h new file mode 100644 index 00000000000..9e9e8a00e44 --- /dev/null +++ b/dlls/mscms/mscms_priv.h @@ -0,0 +1,70 @@ +/* + * MSCMS - Color Management System for Wine + * + * Copyright 2004 Hans Leidekker + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifdef HAVE_LCMS_H + +/* These basic Windows types are defined in lcms.h when compiling on + * a non-Windows platforms (why?), so they would normally not conflict + * with anything included earlier. But since we are building Wine they + * most certainly will have been defined before we include lcms.h. + * The preprocessor comes to the rescue. + */ + +#define BYTE LCMS_BYTE +#define LPBYTE LCMS_LPBYTE +#define WORD LCMS_WORD +#define LPWORD LCMS_LPWORD +#define DWORD LCMS_DWORD +#define LPDWORD LCMS_LPDWORD +#define BOOL LCMS_BOOL +#define LPSTR LCMS_LPSTR +#define LPVOID LCMS_LPVOID + +#undef cdecl +#undef FAR + +#undef ZeroMemory +#undef CopyMemory + +#undef LOWORD +#undef MAX_PATH + +#include + +/* Funny thing is lcms.h defines DWORD as an 'unsigned int' whereas Wine + * defines it as an 'unsigned long'. To avoid compiler warnings we use a + * preprocessor define for DWORD and LPDWORD to get back Wine's orginal + * (typedef) definitions. + */ + +#undef DWORD +#undef LPDWORD + +#define DWORD DWORD +#define LPDWORD LPDWORD + +extern HPROFILE MSCMS_cmsprofile2hprofile( cmsHPROFILE cmsprofile ); +extern cmsHPROFILE MSCMS_hprofile2cmsprofile( HPROFILE profile ); +extern HANDLE MSCMS_hprofile2handle( HPROFILE profile ); + +extern HPROFILE MSCMS_create_hprofile_handle( HANDLE file, cmsHPROFILE cmsprofile ); +extern void MSCMS_destroy_hprofile_handle( HPROFILE profile ); + +#endif /* HAVE_LCMS_H */ diff --git a/dlls/mscms/profile.c b/dlls/mscms/profile.c new file mode 100644 index 00000000000..b95fd1b6a75 --- /dev/null +++ b/dlls/mscms/profile.c @@ -0,0 +1,263 @@ +/* + * MSCMS - Color Management System for Wine + * + * Copyright 2004 Hans Leidekker + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" +#include "wine/debug.h" + +#include + +#include "windef.h" +#include "winbase.h" +#include "winnls.h" + +#include "wingdi.h" +#include "icm.h" + +#define LCMS_API_FUNCTION(f) extern typeof(f) * p##f; +#include "lcms_api.h" +#undef LCMS_API_FUNCTION + +WINE_DEFAULT_DEBUG_CHANNEL(mscms); + +BOOL WINAPI GetColorDirectoryA( PCSTR machine, PSTR buffer, PDWORD size ) +{ + INT len; + LPWSTR bufferW; + BOOL ret = FALSE; + DWORD sizeW = *size * sizeof(WCHAR); + + TRACE( "( %p, %ld )\n", buffer, *size ); + + if (machine || !buffer) return FALSE; + + bufferW = HeapAlloc( GetProcessHeap(), 0, sizeW ); + + if (bufferW) + { + ret = GetColorDirectoryW( NULL, bufferW, &sizeW ); + *size = sizeW / sizeof(WCHAR); + + if (ret) + { + len = WideCharToMultiByte( CP_ACP, 0, bufferW, *size, buffer, *size, NULL, NULL ); + if (!len) ret = FALSE; + } + + HeapFree( GetProcessHeap(), 0, bufferW ); + } + + return ret; +} + +BOOL WINAPI GetColorDirectoryW( PCWSTR machine, PWSTR buffer, PDWORD size ) +{ + /* FIXME: Get this directory from the registry? */ + static const WCHAR colordir[] = + { 'c',':','\\','w','i','n','d','o','w','s','\\', 's','y','s','t','e','m','3','2', + '\\','s','p','o','o','l','\\','d','r','i','v','e','r','s','\\','c','o','l','o','r',0 }; + + DWORD len; + + TRACE( "( %p, %ld )\n", buffer, *size ); + + if (machine || !buffer) return FALSE; + + len = lstrlenW( colordir ) * sizeof(WCHAR); + + if (len <= *size) + { + lstrcatW( buffer, colordir ); + return TRUE; + } + + *size = len; + return FALSE; +} + +BOOL WINAPI InstallColorProfileA( PCSTR machine, PCSTR profile ) +{ + UINT len; + LPWSTR profileW; + BOOL ret = FALSE; + + TRACE( "( %s )\n", debugstr_a(profile) ); + + if (machine || !profile) return FALSE; + + len = MultiByteToWideChar( CP_ACP, 0, profile, -1, NULL, 0 ); + profileW = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ); + + if (profileW) + { + MultiByteToWideChar( CP_ACP, 0, profile, -1, profileW, len ); + + ret = InstallColorProfileW( NULL, profileW ); + HeapFree( GetProcessHeap(), 0, profileW ); + } + + return ret; +} + +BOOL WINAPI InstallColorProfileW( PCWSTR machine, PCWSTR profile ) +{ + FIXME( "( %s ) stub\n", debugstr_w(profile) ); + + if (machine || !profile) return FALSE; + + return FALSE; +} + +BOOL WINAPI UninstallColorProfileA( PCSTR machine, PCSTR profile, BOOL delete ) +{ + if (machine || !profile) return FALSE; + + if (delete) + return DeleteFileA( profile ); + + return TRUE; +} + +BOOL WINAPI UninstallColorProfileW( PCWSTR machine, PCWSTR profile, BOOL delete ) +{ + if (machine || !profile) return FALSE; + + if (delete) + return DeleteFileW( profile ); + + return TRUE; +} + +HPROFILE WINAPI OpenColorProfileA( PPROFILE profile, DWORD access, DWORD sharing, DWORD creation ) +{ + HPROFILE handle = NULL; + + TRACE( "( %p, %lx, %lx, %lx )\n", profile, access, sharing, creation ); + + if (!profile || !profile->pProfileData) return NULL; + + /* No AW conversion needed for memory based profiles */ + if (profile->dwType & PROFILE_MEMBUFFER) + return OpenColorProfileW( profile, access, sharing, creation ); + + if (profile->dwType & PROFILE_FILENAME) + { + UINT len; + PROFILE profileW; + + profileW.dwType = profile->dwType; + + len = MultiByteToWideChar( CP_ACP, 0, profile->pProfileData, -1, NULL, 0 ); + profileW.pProfileData = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) ); + + if (profileW.pProfileData) + { + profileW.cbDataSize = len * sizeof(WCHAR); + MultiByteToWideChar( CP_ACP, 0, profile->pProfileData, -1, profileW.pProfileData, len ); + + handle = OpenColorProfileW( &profileW, access, sharing, creation ); + HeapFree( GetProcessHeap(), 0, profileW.pProfileData ); + } + } + + return handle; +} + +/****************************************************************************** + * OpenColorProfileW [MSCMS.@] + * + * Open a color profile. + * + * PARAMS + * profile [I] Pointer to a color profile structure + * access [I] Desired access + * sharing [I] Sharing mode + * creation [I] Creation mode + * + * RETURNS + * Success: Handle to the opened profile + * Failure: NULL + * + * NOTES + * Values for access: PROFILE_READ or PROFILE_READWRITE + * Values for sharing: 0 (no sharing), FILE_SHARE_READ and/or FILE_SHARE_WRITE + * Values for creation: one of CREATE_NEW, CREATE_ALWAYS, OPEN_EXISTING, + * OPEN_ALWAYS, TRUNCATE_EXISTING. + */ + +HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing, DWORD creation ) +{ +#ifdef HAVE_LCMS_H + cmsHPROFILE cmsprofile = NULL; + HANDLE handle = NULL; + + TRACE( "( %p, %lx, %lx, %lx )\n", profile, access, sharing, creation ); + + if (!profile || !profile->pProfileData) return NULL; + + if (profile->dwType & PROFILE_MEMBUFFER) + { + FIXME( "Memory based profile not yet supported.\n" ); return NULL; + } + + if (profile->dwType & PROFILE_FILENAME) + { + char *unixname; + DWORD flags = 0; + + TRACE("profile file: %s\n", debugstr_w( (WCHAR *)profile->pProfileData )); + + if (access & PROFILE_READ) flags = GENERIC_READ; + if (access & PROFILE_READWRITE) flags = GENERIC_READ|GENERIC_WRITE; + + if (!flags) return NULL; + + handle = CreateFileW( profile->pProfileData, flags, sharing, NULL, creation, 0, NULL ); + if (handle == INVALID_HANDLE_VALUE) return NULL; + + unixname = wine_get_unix_file_name( (WCHAR *)profile->pProfileData ); + + if (unixname) + { + cmsprofile = cmsOpenProfileFromFile( unixname, flags & GENERIC_READ ? "r" : "w" ); + HeapFree( GetProcessHeap(), 0, unixname ); + } + } + + if (cmsprofile) return MSCMS_create_hprofile_handle( handle, cmsprofile ); + +#endif /* HAVE_LCMS_H */ + return NULL; +} + +BOOL WINAPI CloseColorProfile( HPROFILE profile ) +{ + BOOL ret1, ret2 = FALSE; + + TRACE( "( %p )\n", profile ); + +#ifdef HAVE_LCMS_H + ret1 = cmsCloseProfile( MSCMS_hprofile2cmsprofile( profile ) ); + ret2 = CloseHandle( MSCMS_hprofile2handle( profile ) ); + + MSCMS_destroy_hprofile_handle( profile ); + +#endif /* HAVE_LCMS_H */ + return ret1 && ret2; +} diff --git a/dlls/mscms/tests/.cvsignore b/dlls/mscms/tests/.cvsignore new file mode 100644 index 00000000000..a41660f9a6b --- /dev/null +++ b/dlls/mscms/tests/.cvsignore @@ -0,0 +1,3 @@ +Makefile +profile.ok +testlist.c diff --git a/dlls/mscms/tests/Makefile.in b/dlls/mscms/tests/Makefile.in new file mode 100644 index 00000000000..7d459111702 --- /dev/null +++ b/dlls/mscms/tests/Makefile.in @@ -0,0 +1,13 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +TESTDLL = mscms.dll +IMPORTS = mscms kernel32 + +CTESTS = \ + profile.c + +@MAKE_TEST_RULES@ + +### Dependencies: diff --git a/dlls/mscms/tests/profile.c b/dlls/mscms/tests/profile.c new file mode 100644 index 00000000000..9690b32a329 --- /dev/null +++ b/dlls/mscms/tests/profile.c @@ -0,0 +1,398 @@ +/* + * Tests for color profile functions + * + * Copyright 2004 Hans Leidekker + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include + +#include "windef.h" +#include "winbase.h" +#include "winnls.h" + +#include "wingdi.h" +#include "icm.h" + +#include "wine/test.h" + +static const char machine[] = "dummy"; +static const WCHAR machineW[] = { 'd','u','m','m','y',0 }; + +/* Two common places to find the standard color space profile */ +static const char profile1[] = +"c:\\windows\\system\\color\\srgb color space profile.icm"; +static const char profile2[] = +"c:\\windows\\system32\\spool\\drivers\\color\\srgb color space profile.icm"; + +static const WCHAR profile1W[] = +{ 'c',':','\\','w','i','n','d','o','w','s','\\', 's','y','s','t','e','m', + '\\','c','o','l','o','r','\\','s','r','g','b',' ','c','o','l','o','r',' ', + 's','p','a','c','e',' ','p','r','o','f','i','l','e','.','i','c','m',0 }; +static const WCHAR profile2W[] = +{ 'c',':','\\','w','i','n','d','o','w','s','\\', 's','y','s','t','e','m','3','2', + '\\','s','p','o','o','l','\\','d','r','i','v','e','r','s', + '\\','c','o','l','o','r','\\','s','r','g','b',' ','c','o','l','o','r',' ', + 's','p','a','c','e',' ','p','r','o','f','i','l','e','.','i','c','m',0 }; + +static LPSTR standardprofile = NULL; +static LPWSTR standardprofileW = NULL; + +static LPSTR testprofile = NULL; +static LPWSTR testprofileW = NULL; + +static void test_GetColorDirectoryA() +{ + BOOL ret; + DWORD size; + char buffer[MAX_PATH]; + + /* Parameter checks */ + + size = 0; + + ret = GetColorDirectoryA( NULL, NULL, &size ); + ok( !ret, "GetColorDirectoryA() succeeded (%ld)\n", GetLastError() ); + + size = 0; + + ret = GetColorDirectoryA( NULL, buffer, &size ); + ok( !ret, "GetColorDirectoryA() succeeded (%ld)\n", GetLastError() ); + + size = 1; + + ret = GetColorDirectoryA( NULL, buffer, &size ); + ok( !ret, "GetColorDirectoryA() succeeded (%ld)\n", GetLastError() ); + + size = sizeof(buffer); + + ret = GetColorDirectoryA( machine, buffer, &size ); + ok( !ret, "GetColorDirectoryA() succeeded (%ld)\n", GetLastError() ); + + /* Functional checks */ + + size = sizeof(buffer); + + ret = GetColorDirectoryA( NULL, buffer, &size ); + ok( ret, "GetColorDirectoryA() failed (%ld)\n", GetLastError() ); +} + +static void test_GetColorDirectoryW() +{ + BOOL ret; + DWORD size; + WCHAR buffer[MAX_PATH]; + + /* Parameter checks */ + + size = 0; + + ret = GetColorDirectoryW( NULL, NULL, &size ); + ok( !ret, "GetColorDirectoryW() succeeded (%ld)\n", GetLastError() ); + + size = 0; + + ret = GetColorDirectoryW( NULL, buffer, &size ); + ok( !ret, "GetColorDirectoryW() succeeded (%ld)\n", GetLastError() ); + + size = 1; + + ret = GetColorDirectoryW( NULL, buffer, &size ); + ok( !ret, "GetColorDirectoryW() succeeded (%ld)\n", GetLastError() ); + + size = sizeof(buffer); + + ret = GetColorDirectoryW( machineW, buffer, &size ); + ok( !ret, "GetColorDirectoryW() succeeded (%ld)\n", GetLastError() ); + + /* Functional checks */ + + size = sizeof(buffer); + + ret = GetColorDirectoryW( NULL, buffer, &size ); + ok( ret, "GetColorDirectoryW() failed (%ld)\n", GetLastError() ); +} + +static void test_InstallColorProfileA() +{ + BOOL ret; + + /* Parameter checks */ + + ret = InstallColorProfileA( NULL, NULL ); + ok( !ret, "InstallColorProfileA() succeeded (%ld)\n", GetLastError() ); + + ret = InstallColorProfileA( machine, NULL ); + ok( !ret, "InstallColorProfileA() succeeded (%ld)\n", GetLastError() ); + + ret = InstallColorProfileA( NULL, machine ); + ok( !ret, "InstallColorProfileA() failed (%ld)\n", GetLastError() ); + + if (standardprofile) + { + ret = InstallColorProfileA( NULL, standardprofile ); + ok( ret, "InstallColorProfileA() failed (%ld)\n", GetLastError() ); + } + + /* Functional checks */ + + if (testprofile) + { + ret = InstallColorProfileA( NULL, testprofile ); + ok( ret, "InstallColorProfileA() failed (%ld)\n", GetLastError() ); + + ret = UninstallColorProfileA( NULL, testprofile, TRUE ); + ok( ret, "UninstallColorProfileA() failed (%ld)\n", GetLastError() ); + } +} + +static void test_InstallColorProfileW() +{ + BOOL ret; + + /* Parameter checks */ + + ret = InstallColorProfileW( NULL, NULL ); + ok( !ret, "InstallColorProfileW() succeeded (%ld)\n", GetLastError() ); + + ret = InstallColorProfileW( machineW, NULL ); + ok( !ret, "InstallColorProfileW() succeeded (%ld)\n", GetLastError() ); + + ret = InstallColorProfileW( NULL, machineW ); + ok( !ret, "InstallColorProfileW() failed (%ld)\n", GetLastError() ); + + if (standardprofileW) + { + ret = InstallColorProfileW( NULL, standardprofileW ); + ok( ret, "InstallColorProfileW() failed (%ld)\n", GetLastError() ); + } + + /* Functional checks */ + + if (testprofileW) + { + ret = InstallColorProfileW( NULL, testprofileW ); + ok( ret, "InstallColorProfileW() failed (%ld)\n", GetLastError() ); + + ret = UninstallColorProfileW( NULL, testprofileW, TRUE ); + ok( ret, "UninstallColorProfileW() failed (%ld)\n", GetLastError() ); + } +} + +static void test_OpenColorProfileA() +{ + PROFILE profile; + HPROFILE handle; + + profile.dwType = PROFILE_FILENAME; + profile.pProfileData = NULL; + profile.cbDataSize = 0; + + /* Parameter checks */ + + handle = OpenColorProfileA( NULL, 0, 0, 0 ); + ok( handle == NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() ); + + handle = OpenColorProfileA( &profile, 0, 0, 0 ); + ok( handle == NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() ); + + handle = OpenColorProfileA( &profile, PROFILE_READ, 0, 0 ); + ok( handle == NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() ); + + handle = OpenColorProfileA( &profile, PROFILE_READWRITE, 0, 0 ); + ok( handle == NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() ); + + ok ( !CloseColorProfile( NULL ), "CloseColorProfile() succeeded" ); + + if (standardprofile) + { + profile.pProfileData = standardprofile; + profile.cbDataSize = strlen(standardprofile); + + handle = OpenColorProfileA( &profile, 0, 0, 0 ); + ok( handle == NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() ); + + handle = OpenColorProfileA( &profile, PROFILE_READ, 0, 0 ); + ok( handle == NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() ); + + handle = OpenColorProfileA( &profile, PROFILE_READ|PROFILE_READWRITE, 0, 0 ); + ok( handle == NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() ); + + /* Functional checks */ + + handle = OpenColorProfileA( &profile, PROFILE_READ, 0, OPEN_EXISTING ); + ok( handle != NULL, "OpenColorProfileA() failed (%ld)\n", GetLastError() ); + + ok( CloseColorProfile( handle ), "CloseColorProfile() failed (%ld)\n", GetLastError() ); + } +} + +static void test_OpenColorProfileW() +{ + PROFILE profile; + HPROFILE handle; + + profile.dwType = PROFILE_FILENAME; + profile.pProfileData = NULL; + profile.cbDataSize = 0; + + /* Parameter checks */ + + handle = OpenColorProfileW( NULL, 0, 0, 0 ); + ok( handle == NULL, "OpenColorProfileW() failed (%ld)\n", GetLastError() ); + + handle = OpenColorProfileW( &profile, 0, 0, 0 ); + ok( handle == NULL, "OpenColorProfileW() failed (%ld)\n", GetLastError() ); + + handle = OpenColorProfileW( &profile, PROFILE_READ, 0, 0 ); + ok( handle == NULL, "OpenColorProfileW() failed (%ld)\n", GetLastError() ); + + handle = OpenColorProfileW( &profile, PROFILE_READWRITE, 0, 0 ); + ok( handle == NULL, "OpenColorProfileW() failed (%ld)\n", GetLastError() ); + + ok ( !CloseColorProfile( NULL ), "CloseColorProfile() succeeded" ); + + if (standardprofileW) + { + profile.pProfileData = standardprofileW; + profile.cbDataSize = lstrlenW(standardprofileW) * sizeof(WCHAR); + + handle = OpenColorProfileW( &profile, 0, 0, 0 ); + ok( handle == NULL, "OpenColorProfileW() failed (%ld)\n", GetLastError() ); + + handle = OpenColorProfileW( &profile, PROFILE_READ, 0, 0 ); + ok( handle == NULL, "OpenColorProfileW() failed (%ld)\n", GetLastError() ); + + handle = OpenColorProfileW( &profile, PROFILE_READ|PROFILE_READWRITE, 0, 0 ); + ok( handle == NULL, "OpenColorProfileW() failed (%ld)\n", GetLastError() ); + + /* Functional checks */ + + handle = OpenColorProfileW( &profile, PROFILE_READ, 0, OPEN_EXISTING ); + ok( handle != NULL, "OpenColorProfileW() failed (%ld)\n", GetLastError() ); + + ok( CloseColorProfile( handle ), "CloseColorProfile() failed (%ld)\n", GetLastError() ); + } +} + +static void test_UninstallColorProfileA() +{ + BOOL ret; + + /* Parameter checks */ + + ret = UninstallColorProfileA( NULL, NULL, FALSE ); + ok( !ret, "UninstallColorProfileA() succeeded (%ld)\n", GetLastError() ); + + ret = UninstallColorProfileA( machine, NULL, FALSE ); + ok( !ret, "UninstallColorProfileA() succeeded (%ld)\n", GetLastError() ); + + /* Functional checks */ + + if (testprofile) + { + ret = InstallColorProfileA( NULL, testprofile ); + ok( ret, "InstallColorProfileA() failed (%ld)\n", GetLastError() ); + + ret = UninstallColorProfileA( NULL, testprofile, TRUE ); + ok( ret, "UninstallColorProfileA() failed (%ld)\n", GetLastError() ); + } +} + +static void test_UninstallColorProfileW() +{ + BOOL ret; + + /* Parameter checks */ + + ret = UninstallColorProfileW( NULL, NULL, FALSE ); + ok( !ret, "UninstallColorProfileW() succeeded (%ld)\n", GetLastError() ); + + ret = UninstallColorProfileW( machineW, NULL, FALSE ); + ok( !ret, "UninstallColorProfileW() succeeded (%ld)\n", GetLastError() ); + + /* Functional checks */ + + if (testprofileW) + { + ret = InstallColorProfileW( NULL, testprofileW ); + ok( ret, "InstallColorProfileW() failed (%ld)\n", GetLastError() ); + + ret = UninstallColorProfileW( NULL, testprofileW, TRUE ); + ok( ret, "UninstallColorProfileW() failed (%ld)\n", GetLastError() ); + } +} + +START_TEST(profile) +{ + UINT len; + HANDLE handle; + char path[MAX_PATH], file[MAX_PATH]; + WCHAR fileW[MAX_PATH]; + + /* See if we can find the standard color profile */ + handle = CreateFileA( (LPCSTR)&profile1, 0 , 0, NULL, OPEN_EXISTING, 0, NULL ); + + if (handle != INVALID_HANDLE_VALUE) + { + standardprofile = (LPSTR)&profile1; + standardprofileW = (LPWSTR)&profile1W; + CloseHandle( handle ); + } + + handle = CreateFileA( (LPCSTR)&profile2, 0 , 0, NULL, OPEN_EXISTING, 0, NULL ); + + if (handle != INVALID_HANDLE_VALUE) + { + standardprofile = (LPSTR)&profile2; + standardprofileW = (LPWSTR)&profile2W; + CloseHandle( handle ); + } + + /* If found, create a temporary copy for testing purposes */ + if (standardprofile && GetTempPath( sizeof(path), path )) + { + if (GetTempFileName( path, "rgb", 0, file )) + { + if (CopyFileA( standardprofile, file, FALSE )) + { + + testprofile = (LPSTR)&file; + + len = MultiByteToWideChar( CP_ACP, 0, testprofile, -1, NULL, 0 ); + MultiByteToWideChar( CP_ACP, 0, testprofile, -1, fileW, len ); + + testprofileW = (LPWSTR)&fileW; + } + } + } + + test_GetColorDirectoryA(); + test_GetColorDirectoryW(); + + test_InstallColorProfileA(); + test_InstallColorProfileW(); + + test_OpenColorProfileA(); + test_OpenColorProfileW(); + + test_UninstallColorProfileA(); + test_UninstallColorProfileW(); + + /* Clean up */ + if (testprofile) + DeleteFileA( testprofile ); +} diff --git a/include/config.h.in b/include/config.h.in index c7911210d48..6e42a460fde 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -245,9 +245,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_JPEGLIB_H -/* Define if you have lcms libs and headers */ -#undef HAVE_LCMS - /* Define to 1 if you have the header file. */ #undef HAVE_LCMS_H @@ -905,6 +902,9 @@ /* Define to the soname of the libjpeg library. */ #undef SONAME_LIBJPEG +/* Define to the soname of the liblcms library. */ +#undef SONAME_LIBLCMS + /* Define to the soname of the libncurses library. */ #undef SONAME_LIBNCURSES diff --git a/include/icm.h b/include/icm.h index 7d71f57a331..9854aa025db 100644 --- a/include/icm.h +++ b/include/icm.h @@ -98,14 +98,30 @@ typedef struct tagPROFILE { DWORD cbDataSize; } PROFILE, *PPROFILE, *LPPROFILE; +BOOL WINAPI GetColorDirectoryA(PCSTR,PSTR,PDWORD); +BOOL WINAPI GetColorDirectoryW(PCWSTR,PWSTR,PDWORD); +#define GetColorDirectory WINELIB_NAME_AW(GetColorDirectory) + +BOOL WINAPI InstallColorProfileA(PCSTR,PCSTR); +BOOL WINAPI InstallColorProfileW(PCWSTR,PCWSTR); +#define InstallColorProfile WINELIB_NAME_AW(InstallColorProfile) + +BOOL WINAPI UninstallColorProfileA(PCSTR,PCSTR,BOOL); +BOOL WINAPI UninstallColorProfileW(PCWSTR,PCWSTR,BOOL); +#define UninstallColorProfile WINELIB_NAME_AW(UninstallColorProfile) + HPROFILE WINAPI OpenColorProfileA(PPROFILE,DWORD,DWORD,DWORD); HPROFILE WINAPI OpenColorProfileW(PPROFILE,DWORD,DWORD,DWORD); #define OpenColorProfile WINELIB_NAME_AW(OpenColorProfile) + BOOL WINAPI CloseColorProfile(HPROFILE); #define PROFILE_FILENAME 1 #define PROFILE_MEMBUFFER 2 +#define PROFILE_READ 1 +#define PROFILE_READWRITE 2 + #ifdef __cplusplus } #endif