From b876a850dc70f630ef575f1bac6fccce38c387bd Mon Sep 17 00:00:00 2001 From: Jan Zerebecki Date: Sat, 13 Jun 2009 09:59:01 +0200 Subject: [PATCH] push 573c111636dcd80fa61914ac833187ced6019cb7 --- .gitignore | 1 + Make.rules.in | 6 +- Makefile.in | 5 +- configure | 232 +++++++- configure.ac | 69 ++- dlls/Makedll.rules.in | 5 +- dlls/advpack/advpack.spec | 2 +- dlls/advpack/files.c | 38 ++ dlls/comctl32/listview.c | 199 ++++--- dlls/comctl32/rebar.c | 2 +- dlls/comctl32/status.c | 2 +- dlls/comctl32/syslink.c | 6 +- dlls/comctl32/tab.c | 4 +- dlls/comctl32/tests/listview.c | 409 ++++++++++++- dlls/comctl32/toolbar.c | 8 +- dlls/comctl32/tooltips.c | 22 +- dlls/comctl32/treeview.c | 2 +- dlls/comdlg32/filedlg.c | 2 +- dlls/comdlg32/printdlg.c | 8 +- dlls/credui/credui_main.c | 2 +- dlls/crypt32/cert.c | 2 +- dlls/crypt32/chain.c | 24 +- dlls/crypt32/crypt32_Fr.rc | 3 +- dlls/cryptdlg/cryptdlg.rc | 1 + dlls/cryptdlg/{cryptdlg.rc => cryptdlg_De.rc} | 26 +- dlls/cryptui/cryptui.rc | 1 + dlls/cryptui/cryptui_De.rc | 465 +++++++++++++++ dlls/d3d10core/device.c | 2 +- dlls/d3d8/device.c | 28 +- dlls/d3d8/volume.c | 22 +- dlls/d3d8/volumetexture.c | 23 +- dlls/d3d9/device.c | 41 +- dlls/d3d9/volume.c | 23 +- dlls/d3d9/volumetexture.c | 23 +- dlls/ddraw/ddraw.c | 8 +- dlls/gdi32/region.c | 28 +- dlls/gdi32/tests/gdiobj.c | 40 ++ dlls/gdiplus/brush.c | 7 + dlls/gdiplus/gdiplus.spec | 8 +- dlls/gdiplus/graphics.c | 41 +- dlls/gdiplus/tests/graphics.c | 62 ++ dlls/jscript/date.c | 302 +++++++++- dlls/jscript/tests/api.js | 26 + dlls/kernel32/format_msg.c | 3 + dlls/kernel32/kernel32.spec | 3 +- dlls/kernel32/process.c | 21 + dlls/kernel32/tests/comm.c | 14 +- dlls/kernel32/tests/file.c | 194 ++++--- dlls/kernel32/tests/pipe.c | 3 + dlls/kernel32/tests/process.c | 56 ++ dlls/mlang/mlang.c | 75 ++- dlls/mlang/tests/mlang.c | 259 ++++++++- dlls/msctf/Makefile.in | 3 +- dlls/msctf/compartmentmgr.c | 199 +++++++ dlls/msctf/context.c | 10 + dlls/msctf/documentmgr.c | 10 + dlls/msctf/msctf_internal.h | 2 + dlls/msctf/threadmgr.c | 11 + dlls/mshtml/Fr.rc | 13 +- dlls/mshtml/nsembed.c | 2 +- dlls/mshtml/tests/dom.c | 31 +- dlls/msi/streams.c | 6 +- dlls/msi/table.c | 146 ++--- dlls/msi/tests/db.c | 37 ++ dlls/msi/tests/install.c | 391 ++++++++++++- dlls/ntdll/loader.c | 10 +- dlls/ole32/clipboard.c | 3 +- dlls/ole32/comcat.c | 26 +- dlls/ole32/compobj.c | 6 +- dlls/ole32/errorinfo.c | 2 +- dlls/ole32/ftmarshal.c | 2 +- dlls/ole32/marshal.c | 4 +- dlls/oleacc/oleacc.rc | 1 + dlls/oleacc/oleacc_De.rc | 90 +++ dlls/oleaut32/tests/typelib.c | 55 ++ dlls/oleaut32/typelib.c | 8 +- dlls/oleaut32/typelib2.c | 7 +- dlls/olesvr32/olesvr32.spec | 2 +- dlls/olesvr32/olesvr_main.c | 10 + dlls/opengl32/make_opengl | 8 +- dlls/opengl32/opengl32.spec | 40 -- dlls/opengl32/opengl_ext.c | 630 +++++++++++++++++---- dlls/opengl32/opengl_ext.h | 4 - dlls/opengl32/opengl_norm.c | 380 ------------- dlls/riched32/tests/editor.c | 142 +++-- dlls/rpcrt4/cpsf.c | 5 +- dlls/setupapi/De.rc | 27 + dlls/setupapi/Fr.rc | 27 +- dlls/setupapi/tests/parser.c | 83 ++- dlls/shell32/changenotify.c | 31 + dlls/shell32/shell32_De.rc | 7 + dlls/shell32/shell32_Fr.rc | 4 +- dlls/shell32/tests/appbar.c | 6 +- dlls/shlwapi/Makefile.in | 2 +- dlls/shlwapi/shlwapi.spec | 2 +- dlls/urlmon/bindctx.c | 2 +- dlls/urlmon/tests/url.c | 2 +- dlls/user32/message.c | 2 + dlls/user32/spy.c | 3 +- dlls/user32/sysparams.c | 13 +- dlls/user32/tests/msg.c | 54 ++ dlls/user32/user_private.h | 6 + dlls/windowscodecs/Makefile.in | 13 + .../{cryptdlg/cryptdlg.rc => windowscodecs/main.c} | 32 +- dlls/windowscodecs/windowscodecs.spec | 114 ++++ dlls/wined3d/arb_program_shader.c | 559 ++++++++++++++---- dlls/wined3d/ati_fragment_shader.c | 35 +- dlls/wined3d/buffer.c | 10 + dlls/wined3d/context.c | 63 ++- dlls/wined3d/device.c | 89 ++- dlls/wined3d/directx.c | 19 +- dlls/wined3d/glsl_shader.c | 105 ++-- dlls/wined3d/state.c | 8 - dlls/wined3d/surface.c | 150 ++--- dlls/wined3d/surface_base.c | 116 ++-- dlls/wined3d/utils.c | 120 +++- dlls/wined3d/volume.c | 17 +- dlls/wined3d/wined3d_gl.h | 9 + dlls/wined3d/wined3d_private.h | 13 +- dlls/winex11.drv/keyboard.c | 2 +- dlls/wininet/http.c | 218 +++---- dlls/winmm/tests/wave.c | 2 +- dlls/wintrust/softpub.c | 16 +- dlls/wintrust/wintrust.spec | 4 +- documentation/Makefile.in | 9 +- include/Makefile.in | 1 + include/commctrl.h | 107 +++- include/config.h.in | 3 + include/wincodec.idl | 304 ++++++++++ include/wine/port.h | 23 - include/wine/wined3d.idl | 17 +- programs/notepad/Fr.rc | 2 + programs/reg/Fr.rc | 6 + programs/regedit/Fr.rc | 3 +- programs/start/Cs.rc | 1 + programs/start/De.rc | 1 + programs/start/En.rc | 1 + programs/start/Es.rc | 1 + programs/start/Fr.rc | 1 + programs/start/It.rc | 1 + programs/start/Ko.rc | 1 + programs/start/Nl.rc | 1 + programs/start/Pl.rc | 1 + programs/start/Pt.rc | 1 + programs/start/Ru.rc | 1 + programs/start/Si.rc | 1 + programs/start/Tr.rc | 1 + programs/start/start.c | 21 +- programs/winecfg/Nl.rc | 10 +- programs/winedbg/rsrc_De.rc | 2 +- programs/winemenubuilder/winemenubuilder.c | 70 ++- programs/winemine/Lt.rc | 96 ++++ programs/winemine/rsrc.rc | 1 + programs/wordpad/De.rc | 1 + programs/wordpad/Fr.rc | 3 +- server/fd.c | 6 + server/file.h | 1 + server/named_pipe.c | 10 +- server/queue.c | 10 +- tools/c2man.pl | 132 ++++- tools/widl/hash.c | 37 +- tools/widl/parser.y | 2 + tools/widl/proxy.c | 3 +- tools/widl/widltypes.h | 1 + tools/widl/write_msft.c | 21 +- tools/wine.desktop | 2 +- tools/wine.inf.in | 3 +- tools/winebuild/relay.c | 2 + 168 files changed, 6179 insertions(+), 1882 deletions(-) copy dlls/cryptdlg/{cryptdlg.rc => cryptdlg_De.rc} (56%) create mode 100644 dlls/cryptui/cryptui_De.rc create mode 100644 dlls/msctf/compartmentmgr.c create mode 100644 dlls/oleacc/oleacc_De.rc create mode 100644 dlls/windowscodecs/Makefile.in copy dlls/{cryptdlg/cryptdlg.rc => windowscodecs/main.c} (62%) create mode 100644 dlls/windowscodecs/windowscodecs.spec create mode 100644 include/wincodec.idl create mode 100644 programs/winemine/Lt.rc diff --git a/.gitignore b/.gitignore index 78ff6c52e45..a47a09636fb 100644 --- a/.gitignore +++ b/.gitignore @@ -165,6 +165,7 @@ include/unknwn.h include/urlhist.h include/urlmon.h include/vmr9.h +include/wincodec.h include/wine/itss.h include/wine/svcctl.h include/wine/wined3d.h diff --git a/Make.rules.in b/Make.rules.in index b1ccd7c1040..c01a2b714a4 100644 --- a/Make.rules.in +++ b/Make.rules.in @@ -302,11 +302,15 @@ $(DOCSUBDIRS:%=%/__doc_html__): dummy $(DOCSUBDIRS:%=%/__doc_sgml__): dummy @cd `dirname $@` && $(MAKE) doc-sgml +$(DOCSUBDIRS:%=%/__doc_xml__): dummy + @cd `dirname $@` && $(MAKE) doc-xml + man: $(DOCSUBDIRS:%=%/__man__) doc-html: $(DOCSUBDIRS:%=%/__doc_html__) doc-sgml: $(DOCSUBDIRS:%=%/__doc_sgml__) +doc-xml: $(DOCSUBDIRS:%=%/__doc_xml__) -.PHONY: man doc-html doc-sgml $(DOCSUBDIRS:%=%/__man__) $(DOCSUBDIRS:%=%/__doc_html__) $(DOCSUBDIRS:%=%/__doc_sgml__) +.PHONY: man doc-html doc-sgml doc-xml $(DOCSUBDIRS:%=%/__man__) $(DOCSUBDIRS:%=%/__doc_html__) $(DOCSUBDIRS:%=%/__doc_sgml__) $(DOCSUBDIRS:%=%/__doc_xml__) # Misc. rules diff --git a/Makefile.in b/Makefile.in index 5d9039a3f56..7c1eb50663b 100644 --- a/Makefile.in +++ b/Makefile.in @@ -16,6 +16,7 @@ # manpages: compile manpages for Wine API # htmlpages: compile html pages for Wine API # sgmlpages: compile sgml source for the Wine API Guide +# xmlpages: compile xml source for the Wine API Guide # Directories @@ -132,14 +133,14 @@ tags ctags: $(RM) tags (test -d .git && git ls-files '*.[chly]' '*.idl' || find -L $(TOPSRCDIR) -name '*.[ch]' -print) | xargs ctags -a -manpages htmlpages sgmlpages: dummy +manpages htmlpages sgmlpages xmlpages: dummy @cd documentation && $(MAKE) $@ distclean:: clean $(RM) config.* configure.lineno TAGS tags include/config.h include/stamp-h $(RM) -r autom4te.cache -.PHONY: manpages htmlpages sgmlpages distclean +.PHONY: manpages htmlpages sgmlpages xmlpages distclean # Makefile rules diff --git a/configure b/configure index 62e91a1446c..e6ad3a9a3a2 100755 --- a/configure +++ b/configure @@ -16868,6 +16868,76 @@ echo "${ECHO_T}$ac_cv_c_string_h_warnings" >&6; } fi +{ echo "$as_me:$LINENO: checking whether external symbols need an underscore prefix" >&5 +echo $ECHO_N "checking whether external symbols need an underscore prefix... $ECHO_C" >&6; } +if test "${ac_cv_c_extern_prefix+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +extern int ac_test; +int +main () +{ +asm(".globl _ac_test\n_ac_test:\t.long 0"); if (ac_test) return 1 + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && + $as_test_x conftest$ac_exeext; then + ac_cv_c_extern_prefix="yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_extern_prefix="no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_extern_prefix" >&5 +echo "${ECHO_T}$ac_cv_c_extern_prefix" >&6; } + + + +if test "$ac_cv_c_extern_prefix" = "yes" +then + cat >>confdefs.h <<\_ACEOF +#define __ASM_NAME(name) "_" name +_ACEOF + + asm_name_prefix="_" +else + cat >>confdefs.h <<\_ACEOF +#define __ASM_NAME(name) name +_ACEOF + + asm_name_prefix="" +fi + + { echo "$as_me:$LINENO: checking how to define a function in assembly code" >&5 echo $ECHO_N "checking how to define a function in assembly code... $ECHO_C" >&6; } if test "${ac_cv_asm_func_def+set}" = set; then @@ -17011,28 +17081,81 @@ case "$ac_cv_asm_func_def" in cat >>confdefs.h <<\_ACEOF #define __ASM_FUNC(name) ".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef" _ACEOF - ;; + + asm_func_header=".def $asm_name_prefix\" #name \"; .scl 2; .type 32; .endef" ;; ".type @function") cat >>confdefs.h <<\_ACEOF #define __ASM_FUNC(name) ".type " __ASM_NAME(name) ",@function" _ACEOF - ;; + + asm_func_header=".type $asm_name_prefix\" #name \",@function" ;; ".type 2") cat >>confdefs.h <<\_ACEOF #define __ASM_FUNC(name) ".type " __ASM_NAME(name) ",2" _ACEOF - ;; + + asm_func_header=".type $asm_name_prefix\" #name \",2" ;; *) cat >>confdefs.h <<\_ACEOF #define __ASM_FUNC(name) "" _ACEOF - ;; + + asm_func_header="" ;; esac +{ echo "$as_me:$LINENO: checking whether asm() works outside of functions" >&5 +echo $ECHO_N "checking whether asm() works outside of functions... $ECHO_C" >&6; } +if test "${ac_cv_c_asm_outside_funcs+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +asm(".text\n\t.long 0"); +int +main () +{ -{ echo "$as_me:$LINENO: checking whether external symbols need an underscore prefix" >&5 -echo $ECHO_N "checking whether external symbols need an underscore prefix... $ECHO_C" >&6; } -if test "${ac_cv_c_extern_prefix+set}" = set; then + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_asm_outside_funcs="yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_asm_outside_funcs="no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_asm_outside_funcs" >&5 +echo "${ECHO_T}$ac_cv_c_asm_outside_funcs" >&6; } + +{ echo "$as_me:$LINENO: checking whether .previous is supported in assembly code" >&5 +echo $ECHO_N "checking whether .previous is supported in assembly code... $ECHO_C" >&6; } +if test "${ac_cv_c_dot_previous+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -17041,11 +17164,11 @@ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -extern int ac_test; + int main () { -asm(".globl _ac_test\n_ac_test:\t.long 0"); if (ac_test) return 1 +asm(".text\nac_test:\t.long 0\n\t.previous"); ; return 0; } @@ -17068,31 +17191,95 @@ eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 test ! -s conftest.err } && test -s conftest$ac_exeext && $as_test_x conftest$ac_exeext; then - ac_cv_c_extern_prefix="yes" + ac_cv_c_dot_previous="yes" else echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_c_extern_prefix="no" + ac_cv_c_dot_previous="no" fi rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi -{ echo "$as_me:$LINENO: result: $ac_cv_c_extern_prefix" >&5 -echo "${ECHO_T}$ac_cv_c_extern_prefix" >&6; } +{ echo "$as_me:$LINENO: result: $ac_cv_c_dot_previous" >&5 +echo "${ECHO_T}$ac_cv_c_dot_previous" >&6; } +{ echo "$as_me:$LINENO: checking whether CFI directives are supported in assembly code" >&5 +echo $ECHO_N "checking whether CFI directives are supported in assembly code... $ECHO_C" >&6; } +if test "${ac_cv_c_cfi_support+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +asm(".text\nac_test:\t.cfi_startproc\n\t.long 0\n\t.cfi_endproc"); +int +main () +{ + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&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); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_cfi_support="yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 -if test "$ac_cv_c_extern_prefix" = "yes" + ac_cv_c_cfi_support="no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_c_cfi_support" >&5 +echo "${ECHO_T}$ac_cv_c_cfi_support" >&6; } + +asm_func_header=".globl $asm_name_prefix\" #name \"\\n\\t$asm_func_header\\n$asm_name_prefix\" #name \":\\n\\t" +asm_func_trailer="" +if test "$ac_cv_c_dot_previous" = "yes" then - cat >>confdefs.h <<\_ACEOF -#define __ASM_NAME(name) "_" name + asm_func_trailer="\\n\\t.previous" +fi +if test "$ac_cv_c_cfi_support" = "yes" +then + asm_func_header="$asm_func_header.cfi_startproc\\n\\t" + asm_func_trailer="\\n\\t.cfi_endproc$asm_func_trailer" +fi + +asm_func_code="$asm_func_header\" code \"$asm_func_trailer" + + + +if test "$ac_cv_c_asm_outside_funcs" = "yes" +then + cat >>confdefs.h <<_ACEOF +#define __ASM_GLOBAL_FUNC(name,code) asm(".text\n\t.align 4\n\t$asm_func_code"); _ACEOF else - cat >>confdefs.h <<\_ACEOF -#define __ASM_NAME(name) name + cat >>confdefs.h <<_ACEOF +#define __ASM_GLOBAL_FUNC(name,code) void __asm_dummy_##name(void) { asm(".text\n\t.align 4\n\t$asm_func_code"); } _ACEOF fi @@ -25950,6 +26137,14 @@ dlls/windebug.dll16/Makefile: dlls/windebug.dll16/Makefile.in dlls/Makedll.rules ac_config_files="$ac_config_files dlls/windebug.dll16/Makefile" ALL_MAKEFILES="$ALL_MAKEFILES \\ + dlls/windowscodecs/Makefile" +test "x$enable_windowscodecs" != xno && ALL_DLL_DIRS="$ALL_DLL_DIRS \\ + windowscodecs" +ALL_MAKEFILE_DEPENDS="$ALL_MAKEFILE_DEPENDS +dlls/windowscodecs/Makefile: dlls/windowscodecs/Makefile.in dlls/Makedll.rules" +ac_config_files="$ac_config_files dlls/windowscodecs/Makefile" + +ALL_MAKEFILES="$ALL_MAKEFILES \\ dlls/winealsa.drv/Makefile" test "x$enable_winealsa_drv" != xno && ALL_DLL_DIRS="$ALL_DLL_DIRS \\ winealsa.drv" @@ -27899,6 +28094,7 @@ do "dlls/win87em.dll16/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/win87em.dll16/Makefile" ;; "dlls/winaspi.dll16/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/winaspi.dll16/Makefile" ;; "dlls/windebug.dll16/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/windebug.dll16/Makefile" ;; + "dlls/windowscodecs/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/windowscodecs/Makefile" ;; "dlls/winealsa.drv/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/winealsa.drv/Makefile" ;; "dlls/wineaudioio.drv/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/wineaudioio.drv/Makefile" ;; "dlls/winecoreaudio.drv/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/winecoreaudio.drv/Makefile" ;; diff --git a/configure.ac b/configure.ac index 8b09a7a8a34..24a9b070357 100644 --- a/configure.ac +++ b/configure.ac @@ -1403,6 +1403,24 @@ then fi fi +dnl **** Check for underscore on external symbols **** + +AC_CACHE_CHECK([whether external symbols need an underscore prefix], ac_cv_c_extern_prefix, + WINE_TRY_ASM_LINK([".globl _ac_test\n_ac_test:\t.long 0"], + [extern int ac_test;], + [if (ac_test) return 1], + ac_cv_c_extern_prefix="yes",ac_cv_c_extern_prefix="no")) + +AH_TEMPLATE(__ASM_NAME,[Define to a macro to generate an assembly name from a C symbol]) +if test "$ac_cv_c_extern_prefix" = "yes" +then + AC_DEFINE([__ASM_NAME(name)], ["_" name]) + asm_name_prefix="_" +else + AC_DEFINE([__ASM_NAME(name)], [name]) + asm_name_prefix="" +fi + dnl **** Check how to define a function in assembly code **** AC_CACHE_CHECK([how to define a function in assembly code], ac_cv_asm_func_def, @@ -1418,29 +1436,51 @@ AC_CACHE_CHECK([how to define a function in assembly code], ac_cv_asm_func_def, AH_TEMPLATE(__ASM_FUNC,[Define to a macro to generate an assembly function directive]) case "$ac_cv_asm_func_def" in ".def") - AC_DEFINE([__ASM_FUNC(name)], [".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef"]) ;; + AC_DEFINE([__ASM_FUNC(name)], [".def " __ASM_NAME(name) "; .scl 2; .type 32; .endef"]) + asm_func_header=".def $asm_name_prefix\" #name \"; .scl 2; .type 32; .endef" ;; ".type @function") - AC_DEFINE([__ASM_FUNC(name)], [".type " __ASM_NAME(name) ",@function"]) ;; + AC_DEFINE([__ASM_FUNC(name)], [".type " __ASM_NAME(name) ",@function"]) + asm_func_header=".type $asm_name_prefix\" #name \",@function" ;; ".type 2") - AC_DEFINE([__ASM_FUNC(name)], [".type " __ASM_NAME(name) ",2"]) ;; + AC_DEFINE([__ASM_FUNC(name)], [".type " __ASM_NAME(name) ",2"]) + asm_func_header=".type $asm_name_prefix\" #name \",2" ;; *) - AC_DEFINE([__ASM_FUNC(name)], [""]) ;; + AC_DEFINE([__ASM_FUNC(name)], [""]) + asm_func_header="" ;; esac -dnl **** Check for underscore on external symbols **** +AC_CACHE_CHECK([whether asm() works outside of functions], ac_cv_c_asm_outside_funcs, + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[asm(".text\n\t.long 0");]],)], + ac_cv_c_asm_outside_funcs="yes",ac_cv_c_asm_outside_funcs="no")) -AC_CACHE_CHECK([whether external symbols need an underscore prefix], ac_cv_c_extern_prefix, - WINE_TRY_ASM_LINK([".globl _ac_test\n_ac_test:\t.long 0"], - [extern int ac_test;], - [if (ac_test) return 1], - ac_cv_c_extern_prefix="yes",ac_cv_c_extern_prefix="no")) +AC_CACHE_CHECK([whether .previous is supported in assembly code], ac_cv_c_dot_previous, + WINE_TRY_ASM_LINK([".text\nac_test:\t.long 0\n\t.previous"],,, + ac_cv_c_dot_previous="yes",ac_cv_c_dot_previous="no")) -AH_TEMPLATE(__ASM_NAME,[Define to a macro to generate an assembly name from a C symbol]) -if test "$ac_cv_c_extern_prefix" = "yes" +AC_CACHE_CHECK([whether CFI directives are supported in assembly code], ac_cv_c_cfi_support, + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[asm(".text\nac_test:\t.cfi_startproc\n\t.long 0\n\t.cfi_endproc");]])], + ac_cv_c_cfi_support="yes",ac_cv_c_cfi_support="no")) + +asm_func_header=".globl $asm_name_prefix\" #name \"\\n\\t$asm_func_header\\n$asm_name_prefix\" #name \":\\n\\t" +asm_func_trailer="" +if test "$ac_cv_c_dot_previous" = "yes" +then + asm_func_trailer="\\n\\t.previous" +fi +if test "$ac_cv_c_cfi_support" = "yes" +then + asm_func_header="$asm_func_header.cfi_startproc\\n\\t" + asm_func_trailer="\\n\\t.cfi_endproc$asm_func_trailer" +fi + +asm_func_code="$asm_func_header\" code \"$asm_func_trailer" + +AH_TEMPLATE(__ASM_GLOBAL_FUNC,[Define to a macro to generate an assembly function]) +if test "$ac_cv_c_asm_outside_funcs" = "yes" then - AC_DEFINE([__ASM_NAME(name)], ["_" name]) + AC_DEFINE_UNQUOTED([__ASM_GLOBAL_FUNC(name,code)],[asm(".text\n\t.align 4\n\t$asm_func_code");]) else - AC_DEFINE([__ASM_NAME(name)], [name]) + AC_DEFINE_UNQUOTED([__ASM_GLOBAL_FUNC(name,code)],[void __asm_dummy_##name(void) { asm(".text\n\t.align 4\n\t$asm_func_code"); }]) fi dnl **** Platform-specific checks **** @@ -2304,6 +2344,7 @@ WINE_CONFIG_MAKEFILE([dlls/win32s16.dll16/Makefile],[dlls/Makedll.rules],[dlls], WINE_CONFIG_MAKEFILE([dlls/win87em.dll16/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS],[enable_win16]) WINE_CONFIG_MAKEFILE([dlls/winaspi.dll16/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS],[enable_win16]) WINE_CONFIG_MAKEFILE([dlls/windebug.dll16/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS],[enable_win16]) +WINE_CONFIG_MAKEFILE([dlls/windowscodecs/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS]) WINE_CONFIG_MAKEFILE([dlls/winealsa.drv/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS]) WINE_CONFIG_MAKEFILE([dlls/wineaudioio.drv/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS]) WINE_CONFIG_MAKEFILE([dlls/winecoreaudio.drv/Makefile],[dlls/Makedll.rules],[dlls],[ALL_DLL_DIRS]) diff --git a/dlls/Makedll.rules.in b/dlls/Makedll.rules.in index 5a77d9e4a17..9c7be290e0b 100644 --- a/dlls/Makedll.rules.in +++ b/dlls/Makedll.rules.in @@ -70,7 +70,10 @@ doc-html: $(C_SRCS) dummy doc-sgml: $(C_SRCS) dummy $(C2MAN) -o $(TOPOBJDIR)/documentation/api-guide -R$(TOPOBJDIR) -C$(SRCDIR) $(INCLUDES) -Ts $(MAINSPEC:%=-w %) $(SPEC_SRCS16:%=-w %) $(C_SRCS) $(C_SRCS16) -.PHONY: man doc-html doc-sgml +doc-xml: $(C_SRCS) dummy + $(C2MAN) -o $(TOPOBJDIR)/documentation/api-guide-xml -R$(TOPOBJDIR) -C$(SRCDIR) $(INCLUDES) -Tx $(MAINSPEC:%=-w %) $(SPEC_SRCS16:%=-w %) $(C_SRCS) $(C_SRCS16) + +.PHONY: man doc-html doc-sgml doc-xml # Rules for installation diff --git a/dlls/advpack/advpack.spec b/dlls/advpack/advpack.spec index 2ba1057332f..665d1e11158 100644 --- a/dlls/advpack/advpack.spec +++ b/dlls/advpack/advpack.spec @@ -17,7 +17,7 @@ @ stdcall ExecuteCabW(ptr ptr ptr) @ stdcall ExecuteCab(ptr ptr ptr) ExecuteCabA @ stdcall ExtractFilesA(str str long ptr ptr long) -# stdcall ExtractFilesW(wstr wstr long ptr ptr long) +@ stdcall ExtractFilesW(wstr wstr long ptr ptr long) @ stdcall ExtractFiles(str str long ptr ptr long) ExtractFilesA @ stdcall FileSaveMarkNotExistA(str str str) @ stdcall FileSaveMarkNotExistW(wstr wstr wstr) diff --git a/dlls/advpack/files.c b/dlls/advpack/files.c index 63f4080b934..216b8632dc7 100644 --- a/dlls/advpack/files.c +++ b/dlls/advpack/files.c @@ -749,6 +749,44 @@ done: } /*********************************************************************** + * ExtractFilesW (ADVPACK.@) + * + * Extracts the specified files from a cab archive into + * a destination directory. + * + * PARAMS + * CabName [I] Filename of the cab archive. + * ExpandDir [I] Destination directory for the extracted files. + * Flags [I] Reserved. + * FileList [I] Optional list of files to extract. See NOTES. + * LReserved [I] Reserved. Must be NULL. + * Reserved [I] Reserved. Must be 0. + * + * RETURNS + * Success: S_OK. + * Failure: E_FAIL. + * + * NOTES + * FileList is a colon-separated list of filenames. If FileList is + * non-NULL, only the files in the list will be extracted from the + * cab file, otherwise all files will be extracted. Any number of + * spaces, tabs, or colons can be before or after the list, but + * the list itself must only be separated by colons. + * + * BUGS + * Unimplemented. + */ +HRESULT WINAPI ExtractFilesW(LPCWSTR CabName, LPCWSTR ExpandDir, DWORD Flags, + LPCWSTR FileList, LPVOID LReserved, DWORD Reserved) +{ + + FIXME("(%s, %s, %d, %s, %p, %d) stub!\n", debugstr_w(CabName), debugstr_w(ExpandDir), + Flags, debugstr_w(FileList), LReserved, Reserved); + + return E_FAIL; +} + +/*********************************************************************** * FileSaveMarkNotExistA (ADVPACK.@) * * See FileSaveMarkNotExistW. diff --git a/dlls/comctl32/listview.c b/dlls/comctl32/listview.c index dafb914f695..8ef516a3ec5 100644 --- a/dlls/comctl32/listview.c +++ b/dlls/comctl32/listview.c @@ -6,6 +6,7 @@ * Copyright 2000 Jason Mawdsley * Copyright 2001 CodeWeavers Inc. * Copyright 2002 Dimitrie O. Paun + * Copyright 2009 Nikolay Sivov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -81,7 +82,6 @@ * -- LVS_NOLABELWRAP * -- LVS_NOSCROLL (see Q137520) * -- LVS_ALIGNTOP - * -- LVS_TYPESTYLEMASK * * Extended Styles * -- LVS_EX_BORDERSELECT @@ -120,7 +120,6 @@ * -- LVM_GETISEARCHSTRINGW, LVM_GETISEARCHSTRINGA * -- LVM_GETTILEINFO, LVM_SETTILEINFO * -- LVM_GETTILEVIEWINFO, LVM_SETTILEVIEWINFO - * -- LVM_GETUNICODEFORMAT, LVM_SETUNICODEFORMAT * -- LVM_GETWORKAREAS, LVM_SETWORKAREAS * -- LVM_HASGROUP, LVM_INSERTGROUP, LVM_REMOVEGROUP, LVM_REMOVEALLGROUPS * -- LVM_INSERTGROUPSORTED @@ -137,7 +136,6 @@ * -- ListView_GetHoverTime, ListView_SetHoverTime * -- ListView_GetISearchString * -- ListView_GetNumberOfWorkAreas - * -- ListView_GetUnicodeFormat, ListView_SetUnicodeFormat * -- ListView_GetWorkAreas, ListView_SetWorkAreas * * Functions: @@ -418,7 +416,7 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *, INT, const LVITEMW *); static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *, INT, INT, HWND); static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *, INT, INT, HWND); static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *, INT, BOOL); -static HWND CreateEditLabelT(LISTVIEW_INFO *, LPCWSTR, DWORD, INT, INT, INT, INT, BOOL); +static HWND CreateEditLabelT(LISTVIEW_INFO *, LPCWSTR, DWORD, BOOL); static HIMAGELIST LISTVIEW_SetImageList(LISTVIEW_INFO *, INT, HIMAGELIST); static INT LISTVIEW_HitTest(const LISTVIEW_INFO *, LPLVHITTESTINFO, BOOL, BOOL); @@ -1241,12 +1239,25 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons INT nPerCol = max((infoPtr->rcList.bottom - infoPtr->rcList.top) / infoPtr->nItemHeight, 1); INT nFirstRow = max(frame.top / infoPtr->nItemHeight, 0); INT nLastRow = min((frame.bottom - 1) / infoPtr->nItemHeight, nPerCol - 1); - INT nFirstCol = max(frame.left / infoPtr->nItemWidth, 0); - INT nLastCol = min((frame.right - 1) / infoPtr->nItemWidth, (infoPtr->nItemCount + nPerCol - 1) / nPerCol); - INT lower = nFirstCol * nPerCol + nFirstRow; + INT nFirstCol; + INT nLastCol; + INT lower; RANGE item_range; INT nCol; + if (infoPtr->nItemWidth) + { + nFirstCol = max(frame.left / infoPtr->nItemWidth, 0); + nLastCol = min((frame.right - 1) / infoPtr->nItemWidth, (infoPtr->nItemCount + nPerCol - 1) / nPerCol); + } + else + { + nFirstCol = max(frame.left, 0); + nLastCol = min(frame.right - 1, (infoPtr->nItemCount + nPerCol - 1) / nPerCol); + } + + lower = nFirstCol * nPerCol + nFirstRow; + TRACE("nPerCol=%d, nFirstRow=%d, nLastRow=%d, nFirstCol=%d, nLastCol=%d, lower=%d\n", nPerCol, nFirstRow, nLastRow, nFirstCol, nLastCol, lower); @@ -1495,7 +1506,7 @@ static inline INT LISTVIEW_GetCountPerRow(const LISTVIEW_INFO *infoPtr) { INT nListWidth = infoPtr->rcList.right - infoPtr->rcList.left; - return max(nListWidth/infoPtr->nItemWidth, 1); + return max(nListWidth/(infoPtr->nItemWidth ? infoPtr->nItemWidth : 1), 1); } /*** @@ -1738,7 +1749,8 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr) if(horzInfo.nPage < infoPtr->nItemWidth) horzInfo.nPage = infoPtr->nItemWidth; - horzInfo.nPage /= infoPtr->nItemWidth; + if (infoPtr->nItemWidth) + horzInfo.nPage /= infoPtr->nItemWidth; } else if (infoPtr->uView == LV_VIEW_DETAILS) { @@ -2507,11 +2519,15 @@ static INT LISTVIEW_CalculateItemWidth(const LISTVIEW_INFO *infoPtr) nItemWidth = infoPtr->iconSpacing.cx; else if (infoPtr->uView == LV_VIEW_DETAILS) { - RECT rcHeader; - if (DPA_GetPtrCount(infoPtr->hdpaColumns) > 0) { - LISTVIEW_GetHeaderRect(infoPtr, DPA_GetPtrCount(infoPtr->hdpaColumns) - 1, &rcHeader); + RECT rcHeader; + INT index; + + index = SendMessageW(infoPtr->hwndHeader, HDM_ORDERTOINDEX, + DPA_GetPtrCount(infoPtr->hdpaColumns) - 1, 0); + + LISTVIEW_GetHeaderRect(infoPtr, index, &rcHeader); nItemWidth = rcHeader.right; } } @@ -2528,7 +2544,7 @@ static INT LISTVIEW_CalculateItemWidth(const LISTVIEW_INFO *infoPtr) nItemWidth = max(DEFAULT_COLUMN_WIDTH, nItemWidth + WIDTH_PADDING); } - return max(nItemWidth, 1); + return nItemWidth; } /*** @@ -3494,7 +3510,6 @@ static inline BOOL is_assignable_item(const LVITEMW *lpLVItem, LONG lStyle) */ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL isNew, BOOL isW, BOOL *bChanged) { - UINT uView = infoPtr->dwStyle & LVS_TYPEMASK; ITEM_INFO *lpItem; NMLISTVIEW nmlv; UINT uChanged = 0; @@ -3619,7 +3634,7 @@ static BOOL set_main_item(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL } infoPtr->nFocusedItem = lpLVItem->iItem; - LISTVIEW_EnsureVisible(infoPtr, lpLVItem->iItem, uView == LVS_LIST); + LISTVIEW_EnsureVisible(infoPtr, lpLVItem->iItem, infoPtr->uView == LV_VIEW_LIST); } else if (infoPtr->nFocusedItem == lpLVItem->iItem) { @@ -4676,14 +4691,11 @@ static void LISTVIEW_ScrollColumns(LISTVIEW_INFO *infoPtr, INT nColumn, INT dx) rcCol.left = rcCol.right; /* adjust the other columns */ - for (nCol = 0; nCol < DPA_GetPtrCount(infoPtr->hdpaColumns); nCol++) + for (nCol = nColumn; nCol < DPA_GetPtrCount(infoPtr->hdpaColumns); nCol++) { lpColumnInfo = LISTVIEW_GetColumnInfo(infoPtr, nCol); - if (lpColumnInfo->rcHeader.left >= rcCol.left) - { - lpColumnInfo->rcHeader.left += dx; - lpColumnInfo->rcHeader.right += dx; - } + lpColumnInfo->rcHeader.left += dx; + lpColumnInfo->rcHeader.right += dx; } /* do not update screen if not in report mode */ @@ -4800,7 +4812,6 @@ static BOOL LISTVIEW_DeleteColumn(LISTVIEW_INFO *infoPtr, INT nColumn) */ static void LISTVIEW_ScrollOnInsert(LISTVIEW_INFO *infoPtr, INT nItem, INT dir) { - UINT uView = infoPtr->dwStyle & LVS_TYPEMASK; INT nPerCol, nItemCol, nItemRow; RECT rcScroll; POINT Origin; @@ -4823,9 +4834,9 @@ static void LISTVIEW_ScrollOnInsert(LISTVIEW_INFO *infoPtr, INT nItem, INT dir) LISTVIEW_UpdateScroll(infoPtr); /* figure out the item's position */ - if (uView == LVS_REPORT) + if (infoPtr->uView == LV_VIEW_DETAILS) nPerCol = infoPtr->nItemCount + 1; - else if (uView == LVS_LIST) + else if (infoPtr->uView == LV_VIEW_LIST) nPerCol = LISTVIEW_GetCountPerColumn(infoPtr); else /* LV_VIEW_ICON, or LV_VIEW_SMALLICON */ return; @@ -4849,7 +4860,7 @@ static void LISTVIEW_ScrollOnInsert(LISTVIEW_INFO *infoPtr, INT nItem, INT dir) } /* report has only that column, so we're done */ - if (uView == LVS_REPORT) return; + if (infoPtr->uView == LV_VIEW_DETAILS) return; /* now for LISTs, we have to deal with the columns to the right */ rcScroll.left = (nItemCol + 1) * infoPtr->nItemWidth; @@ -5055,14 +5066,15 @@ static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW) WCHAR szDispText[DISP_TEXT_SIZE] = { 0 }; NMLVDISPINFOW dispInfo; RECT rect; + SIZE sz; HWND hwndSelf = infoPtr->hwndSelf; + HDC hdc; + HFONT hOldFont = NULL; + TEXTMETRICW textMetric; TRACE("(nItem=%d, isW=%d)\n", nItem, isW); if (~infoPtr->dwStyle & LVS_EDITLABELS) return 0; - if (nItem < 0 || nItem >= infoPtr->nItemCount) return 0; - - infoPtr->nEditLabelItem = nItem; /* Is the EditBox still there, if so remove it */ if(infoPtr->hwndEdit != 0) @@ -5071,6 +5083,10 @@ static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW) infoPtr->hwndEdit = 0; } + if (nItem < 0 || nItem >= infoPtr->nItemCount) return 0; + + infoPtr->nEditLabelItem = nItem; + LISTVIEW_SetSelection(infoPtr, nItem); LISTVIEW_SetItemFocus(infoPtr, nItem); LISTVIEW_InvalidateItem(infoPtr, nItem); @@ -5087,8 +5103,7 @@ static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW) dispInfo.item.cchTextMax = DISP_TEXT_SIZE; if (!LISTVIEW_GetItemT(infoPtr, &dispInfo.item, isW)) return 0; - infoPtr->hwndEdit = CreateEditLabelT(infoPtr, dispInfo.item.pszText, WS_VISIBLE, - rect.left-2, rect.top-1, 0, rect.bottom - rect.top+2, isW); + infoPtr->hwndEdit = CreateEditLabelT(infoPtr, dispInfo.item.pszText, WS_VISIBLE, isW); if (!infoPtr->hwndEdit) return 0; if (notify_dispinfoT(infoPtr, LVN_BEGINLABELEDITW, &dispInfo, isW)) @@ -5100,6 +5115,27 @@ static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW) return 0; } + /* Now position and display edit box */ + hdc = GetDC(infoPtr->hwndSelf); + + /* Select the font to get appropriate metric dimensions */ + if(infoPtr->hFont != 0) + hOldFont = SelectObject(hdc, infoPtr->hFont); + + /* Get String Length in pixels */ + GetTextExtentPoint32W(hdc, dispInfo.item.pszText, lstrlenW(dispInfo.item.pszText), &sz); + + /* Add Extra spacing for the next character */ + GetTextMetricsW(hdc, &textMetric); + sz.cx += (textMetric.tmMaxCharWidth * 2); + + if(infoPtr->hFont != 0) + SelectObject(hdc, hOldFont); + + ReleaseDC(infoPtr->hwndSelf, hdc); + + MoveWindow(infoPtr->hwndEdit, rect.left - 2, rect.top - 1, sz.cx, + rect.bottom - rect.top + 2, FALSE); ShowWindow(infoPtr->hwndEdit, SW_NORMAL); SetFocus(infoPtr->hwndEdit); SendMessageW(infoPtr->hwndEdit, EM_SETSEL, 0, -1); @@ -5122,7 +5158,6 @@ static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW) */ static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *infoPtr, INT nItem, BOOL bPartial) { - UINT uView = infoPtr->dwStyle & LVS_TYPEMASK; INT nScrollPosHeight = 0; INT nScrollPosWidth = 0; INT nHorzAdjust = 0; @@ -5138,41 +5173,41 @@ static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *infoPtr, INT nItem, BOOL bPart if (rcItem.left < infoPtr->rcList.left || rcItem.right > infoPtr->rcList.right) { - /* scroll left/right, but in LVS_REPORT mode */ - if (uView == LVS_LIST) + /* scroll left/right, but in LV_VIEW_DETAILS mode */ + if (infoPtr->uView == LV_VIEW_LIST) nScrollPosWidth = infoPtr->nItemWidth; - else if ((uView == LVS_SMALLICON) || (uView == LVS_ICON)) + else if ((infoPtr->uView == LV_VIEW_SMALLICON) || (infoPtr->uView == LV_VIEW_ICON)) nScrollPosWidth = 1; if (rcItem.left < infoPtr->rcList.left) { nHorzAdjust = -1; - if (uView != LVS_REPORT) nHorzDiff = rcItem.left - infoPtr->rcList.left; + if (infoPtr->uView != LV_VIEW_DETAILS) nHorzDiff = rcItem.left - infoPtr->rcList.left; } else { nHorzAdjust = 1; - if (uView != LVS_REPORT) nHorzDiff = rcItem.right - infoPtr->rcList.right; + if (infoPtr->uView != LV_VIEW_DETAILS) nHorzDiff = rcItem.right - infoPtr->rcList.right; } } if (rcItem.top < infoPtr->rcList.top || rcItem.bottom > infoPtr->rcList.bottom) { /* scroll up/down, but not in LVS_LIST mode */ - if (uView == LVS_REPORT) + if (infoPtr->uView == LV_VIEW_DETAILS) nScrollPosHeight = infoPtr->nItemHeight; - else if ((uView == LVS_ICON) || (uView == LVS_SMALLICON)) + else if ((infoPtr->uView == LV_VIEW_ICON) || (infoPtr->uView == LV_VIEW_SMALLICON)) nScrollPosHeight = 1; if (rcItem.top < infoPtr->rcList.top) { nVertAdjust = -1; - if (uView != LVS_LIST) nVertDiff = rcItem.top - infoPtr->rcList.top; + if (infoPtr->uView != LV_VIEW_LIST) nVertDiff = rcItem.top - infoPtr->rcList.top; } else { nVertAdjust = 1; - if (uView != LVS_LIST) nVertDiff = rcItem.bottom - infoPtr->rcList.bottom; + if (infoPtr->uView != LV_VIEW_LIST) nVertDiff = rcItem.bottom - infoPtr->rcList.bottom; } } @@ -5730,6 +5765,14 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, dispInfo.item.iImage = I_IMAGECALLBACK; } + /* Only items support indentation */ + if ((lpLVItem->mask & LVIF_INDENT) && lpItem->iIndent == I_INDENTCALLBACK && + (isubitem == 0)) + { + dispInfo.item.mask |= LVIF_INDENT; + dispInfo.item.iIndent = I_INDENTCALLBACK; + } + /* Apps depend on calling back for text if it is NULL or LPSTR_TEXTCALLBACKW */ if ((lpLVItem->mask & LVIF_TEXT) && !(lpLVItem->mask & LVIF_NORECOMPUTE) && !is_textW(pItemHdr->pszText)) @@ -5821,8 +5864,16 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem, } /* and last, but not least, the indent field */ - if (lpLVItem->mask & LVIF_INDENT) - lpLVItem->iIndent = lpItem->iIndent; + if (dispInfo.item.mask & LVIF_INDENT) + { + lpLVItem->iIndent = dispInfo.item.iIndent; + if ((dispInfo.item.mask & LVIF_DI_SETITEM) && lpItem->iIndent == I_INDENTCALLBACK) + lpItem->iIndent = dispInfo.item.iIndent; + } + else if (lpLVItem->mask & LVIF_INDENT) + { + lpLVItem->iIndent = lpItem->iIndent; + } return TRUE; } @@ -6676,7 +6727,6 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht, */ static INT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, BOOL isW) { - UINT uView = infoPtr->dwStyle & LVS_TYPEMASK; INT nItem; HDPA hdpaSubItems; NMLISTVIEW nmlv; @@ -6763,7 +6813,7 @@ static INT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, if (!set_main_item(infoPtr, &item, TRUE, isW, &has_changed)) goto undo; /* make room for the position, if we are in the right mode */ - if ((uView == LVS_SMALLICON) || (uView == LVS_ICON)) + if ((infoPtr->uView == LV_VIEW_SMALLICON) || (infoPtr->uView == LV_VIEW_ICON)) { if (DPA_InsertPtr(infoPtr->hdpaPosX, nItem, 0) == -1) goto undo; @@ -6783,7 +6833,7 @@ static INT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem, return -1; /* align items (set position of each item) */ - if ((uView == LVS_SMALLICON || uView == LVS_ICON)) + if (infoPtr->uView == LV_VIEW_SMALLICON || infoPtr->uView == LV_VIEW_ICON) { POINT pt; @@ -7937,9 +7987,9 @@ static HWND LISTVIEW_SetToolTips( LISTVIEW_INFO *infoPtr, HWND hwndNewToolTip) */ static BOOL LISTVIEW_SetUnicodeFormat( LISTVIEW_INFO *infoPtr, BOOL fUnicode) { - BOOL rc = infoPtr->notifyFormat; - infoPtr->notifyFormat = (fUnicode)?NFR_UNICODE:NFR_ANSI; - return rc; + SHORT rc = infoPtr->notifyFormat; + infoPtr->notifyFormat = (fUnicode) ? NFR_UNICODE : NFR_ANSI; + return rc == NFR_UNICODE; } /* @@ -8343,7 +8393,6 @@ fail: static LRESULT LISTVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs) { LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongPtrW(hwnd, 0); - UINT uView = lpcs->style & LVS_TYPEMASK; TRACE("(lpcs=%p)\n", lpcs); @@ -8352,8 +8401,10 @@ static LRESULT LISTVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs) infoPtr->notifyFormat = SendMessageW(infoPtr->hwndNotify, WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY); + /* on error defaulting to ANSI notifications */ + if (infoPtr->notifyFormat == 0) infoPtr->notifyFormat = NFR_ANSI; - if ((uView == LVS_REPORT) && (lpcs->style & WS_VISIBLE)) + if ((infoPtr->uView == LV_VIEW_DETAILS) && (lpcs->style & WS_VISIBLE)) { if (LISTVIEW_CreateHeader(infoPtr) < 0) return -1; } @@ -8363,7 +8414,7 @@ static LRESULT LISTVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs) /* init item size to avoid division by 0 */ LISTVIEW_UpdateItemSize (infoPtr); - if (uView == LVS_REPORT) + if (infoPtr->uView == LV_VIEW_DETAILS) { if (!(LVS_NOCOLUMNHEADER & lpcs->style) && (WS_VISIBLE & lpcs->style)) { @@ -8375,7 +8426,7 @@ static LRESULT LISTVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs) OpenThemeData(hwnd, themeClass); /* initialize the icon sizes */ - set_icon_size(&infoPtr->iconSize, infoPtr->himlNormal, uView != LVS_ICON); + set_icon_size(&infoPtr->iconSize, infoPtr->himlNormal, infoPtr->uView != LV_VIEW_ICON); set_icon_size(&infoPtr->iconStateSize, infoPtr->himlState, TRUE); return 0; } @@ -9342,7 +9393,7 @@ static LRESULT LISTVIEW_NotifyFormat(LISTVIEW_INFO *infoPtr, HWND hwndFrom, INT TRACE("(hwndFrom=%p, nCommand=%d)\n", hwndFrom, nCommand); if (nCommand == NF_REQUERY) - infoPtr->notifyFormat = SendMessageW(hwndFrom, WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, NF_QUERY); + infoPtr->notifyFormat = SendMessageW(infoPtr->hwndNotify, WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, NF_QUERY); return infoPtr->notifyFormat; } @@ -9721,13 +9772,11 @@ static LRESULT LISTVIEW_Size(LISTVIEW_INFO *infoPtr, int Width, int Height) */ static void LISTVIEW_UpdateSize(LISTVIEW_INFO *infoPtr) { - UINT uView = infoPtr->dwStyle & LVS_TYPEMASK; - - TRACE("uView=%d, rcList(old)=%s\n", uView, wine_dbgstr_rect(&infoPtr->rcList)); + TRACE("uView=%d, rcList(old)=%s\n", infoPtr->uView, wine_dbgstr_rect(&infoPtr->rcList)); GetClientRect(infoPtr->hwndSelf, &infoPtr->rcList); - if (uView == LVS_LIST) + if (infoPtr->uView == LV_VIEW_LIST) { /* Apparently the "LIST" style is supposed to have the same * number of items in a column even if there is no scroll bar. @@ -9740,7 +9789,7 @@ static void LISTVIEW_UpdateSize(LISTVIEW_INFO *infoPtr) infoPtr->rcList.bottom -= GetSystemMetrics(SM_CYHSCROLL); infoPtr->rcList.bottom = max (infoPtr->rcList.bottom - 2, 0); } - else if (uView == LVS_REPORT) + else if (infoPtr->uView == LV_VIEW_DETAILS) { HDLAYOUT hl; WINDOWPOS wp; @@ -9918,10 +9967,8 @@ static INT LISTVIEW_StyleChanging(LISTVIEW_INFO *infoPtr, WPARAM wStyleType, */ static LRESULT LISTVIEW_ShowWindow(LISTVIEW_INFO *infoPtr, BOOL bShown, INT iStatus) { - UINT uView = infoPtr->dwStyle & LVS_TYPEMASK; - /* header delayed creation */ - if ((uView == LVS_REPORT) && bShown) + if ((infoPtr->uView == LV_VIEW_DETAILS) && bShown) { LISTVIEW_CreateHeader(infoPtr); @@ -9942,7 +9989,7 @@ static LRESULT LISTVIEW_ShowWindow(LISTVIEW_INFO *infoPtr, BOOL bShown, INT iSta * RETURN: * Current version */ -static inline LRESULT LISTVIEW_GetVersion(LISTVIEW_INFO *infoPtr) +static inline LRESULT LISTVIEW_GetVersion(const LISTVIEW_INFO *infoPtr) { return infoPtr->iVersion; } @@ -10734,41 +10781,21 @@ static LRESULT CALLBACK EditLblWndProcA(HWND hwnd, UINT uMsg, WPARAM wParam, LPA * * RETURN: */ -static HWND CreateEditLabelT(LISTVIEW_INFO *infoPtr, LPCWSTR text, DWORD style, - INT x, INT y, INT width, INT height, BOOL isW) +static HWND CreateEditLabelT(LISTVIEW_INFO *infoPtr, LPCWSTR text, DWORD style, BOOL isW) { WCHAR editName[5] = { 'E', 'd', 'i', 't', '\0' }; HWND hedit; - SIZE sz; - HDC hdc; - HDC hOldFont=0; - TEXTMETRICW textMetric; HINSTANCE hinst = (HINSTANCE)GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_HINSTANCE); TRACE("(text=%s, ..., isW=%d)\n", debugtext_t(text, isW), isW); style |= WS_CHILDWINDOW|WS_CLIPSIBLINGS|ES_LEFT|ES_AUTOHSCROLL|WS_BORDER; - hdc = GetDC(infoPtr->hwndSelf); - - /* Select the font to get appropriate metric dimensions */ - if(infoPtr->hFont != 0) - hOldFont = SelectObject(hdc, infoPtr->hFont); - - /*Get String Length in pixels */ - GetTextExtentPoint32W(hdc, text, lstrlenW(text), &sz); - - /*Add Extra spacing for the next character */ - GetTextMetricsW(hdc, &textMetric); - sz.cx += (textMetric.tmMaxCharWidth * 2); - if(infoPtr->hFont != 0) - SelectObject(hdc, hOldFont); - - ReleaseDC(infoPtr->hwndSelf, hdc); + /* Window will be resized and positioned after LVN_BEGINLABELEDIT */ if (isW) - hedit = CreateWindowW(editName, text, style, x, y, sz.cx, height, infoPtr->hwndSelf, 0, hinst, 0); + hedit = CreateWindowW(editName, text, style, 0, 0, 0, 0, infoPtr->hwndSelf, 0, hinst, 0); else - hedit = CreateWindowA("Edit", (LPCSTR)text, style, x, y, sz.cx, height, infoPtr->hwndSelf, 0, hinst, 0); + hedit = CreateWindowA("Edit", (LPCSTR)text, style, 0, 0, 0, 0, infoPtr->hwndSelf, 0, hinst, 0); if (!hedit) return 0; diff --git a/dlls/comctl32/rebar.c b/dlls/comctl32/rebar.c index 982c8445daf..8e18e228192 100644 --- a/dlls/comctl32/rebar.c +++ b/dlls/comctl32/rebar.c @@ -452,7 +452,7 @@ static int get_rect_cy(const REBAR_INFO *infoPtr, const RECT *lpRect) return lpRect->bottom - lpRect->top; } -static int round_child_height(REBAR_BAND *lpBand, int cyHeight) +static int round_child_height(const REBAR_BAND *lpBand, int cyHeight) { int cy = 0; if (lpBand->cyIntegral == 0) diff --git a/dlls/comctl32/status.c b/dlls/comctl32/status.c index f7d203b0065..11a977d376a 100644 --- a/dlls/comctl32/status.c +++ b/dlls/comctl32/status.c @@ -333,7 +333,7 @@ STATUSBAR_Refresh (STATUS_INFO *infoPtr, HDC hdc) static int -STATUSBAR_InternalHitTest(const STATUS_INFO *infoPtr, const LPPOINT pt) +STATUSBAR_InternalHitTest(const STATUS_INFO *infoPtr, const POINT *pt) { int i; if (infoPtr->simple) diff --git a/dlls/comctl32/syslink.c b/dlls/comctl32/syslink.c index 1b89bc714aa..f36177913c6 100644 --- a/dlls/comctl32/syslink.c +++ b/dlls/comctl32/syslink.c @@ -1329,10 +1329,8 @@ static LRESULT SYSLINK_SetFocus (SYSLINK_INFO *infoPtr) if(Focus != NULL) { SYSLINK_SetFocusLink(infoPtr, Focus); + SYSLINK_RepaintLink(infoPtr, Focus); } - - SYSLINK_RepaintLink(infoPtr, Focus); - return 0; } @@ -1476,7 +1474,7 @@ static BOOL SYSKEY_SelectNextPrevLink (const SYSLINK_INFO *infoPtr, BOOL Prev) { OldFocus = SYSLINK_SetFocusLink(infoPtr, NewFocus); - if(OldFocus != NewFocus) + if(OldFocus && OldFocus != NewFocus) { SYSLINK_RepaintLink(infoPtr, OldFocus); } diff --git a/dlls/comctl32/tab.c b/dlls/comctl32/tab.c index b8846979c71..4b439b29172 100644 --- a/dlls/comctl32/tab.c +++ b/dlls/comctl32/tab.c @@ -1445,7 +1445,7 @@ static void TAB_SetItemBounds (TAB_INFO *infoPtr) static void -TAB_EraseTabInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect) +TAB_EraseTabInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, const RECT *drawRect) { LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE); HBRUSH hbr = CreateSolidBrush (comctl32_color.clrBtnFace); @@ -3223,7 +3223,7 @@ TAB_SetExtendedStyle (TAB_INFO *infoPtr, DWORD exMask, DWORD exStyle) } static inline LRESULT -TAB_GetExtendedStyle (TAB_INFO *infoPtr) +TAB_GetExtendedStyle (const TAB_INFO *infoPtr) { return infoPtr->exStyle; } diff --git a/dlls/comctl32/tests/listview.c b/dlls/comctl32/tests/listview.c index 9ecbeedde4d..3895bea378c 100644 --- a/dlls/comctl32/tests/listview.c +++ b/dlls/comctl32/tests/listview.c @@ -29,7 +29,8 @@ #define PARENT_SEQ_INDEX 0 #define PARENT_FULL_SEQ_INDEX 1 #define LISTVIEW_SEQ_INDEX 2 -#define NUM_MSG_SEQUENCES 3 +#define EDITBOX_SEQ_INDEX 3 +#define NUM_MSG_SEQUENCES 4 #define LISTVIEW_ID 0 #define HEADER_ID 1 @@ -38,7 +39,17 @@ #define expect2(expected1, expected2, got1, got2) ok(expected1 == got1 && expected2 == got2, \ "expected (%d,%d), got (%d,%d)\n", expected1, expected2, got1, got2) -HWND hwndparent; +static const WCHAR testparentclassW[] = + {'L','i','s','t','v','i','e','w',' ','t','e','s','t',' ','p','a','r','e','n','t','W', 0}; + +HWND hwndparent, hwndparentW; +/* prevents edit box creation, LVN_BEGINLABELEDIT return value */ +BOOL blockEdit; +/* format reported to control: + -1 falls to defproc, anything else returned */ +INT notifyFormat; + +static HWND subclass_editbox(HWND hwndListview); static struct msg_sequence *sequences[NUM_MSG_SEQUENCES]; @@ -196,6 +207,19 @@ static const struct message getitemposition_seq2[] = { { 0 } }; +static const struct message editbox_create_pos[] = { + /* sequence sent after LVN_BEGINLABELEDIT */ + { WM_WINDOWPOSCHANGING, sent }, + { WM_NCCALCSIZE, sent }, + { WM_WINDOWPOSCHANGED, sent }, + { WM_MOVE, sent|defwinproc }, + { WM_SIZE, sent|defwinproc }, + /* the rest is todo */ + { WM_WINDOWPOSCHANGING, sent }, + { WM_WINDOWPOSCHANGED, sent }, + { 0 } +}; + struct subclass_info { WNDPROC oldproc; @@ -230,9 +254,32 @@ static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LP } add_message(sequences, PARENT_FULL_SEQ_INDEX, &msg); - /* always accept new item text */ - if (message == WM_NOTIFY && lParam && ((NMHDR*)lParam)->code == LVN_ENDLABELEDIT) - return TRUE; + switch (message) + { + case WM_NOTIFY: + { + switch (((NMHDR*)lParam)->code) + { + case LVN_BEGINLABELEDIT: + /* subclass edit box */ + if (!blockEdit) + subclass_editbox(((NMHDR*)lParam)->hwndFrom); + + return blockEdit; + + case LVN_ENDLABELEDIT: + /* always accept new item text */ + return TRUE; + } + break; + } + case WM_NOTIFYFORMAT: + { + /* force to return format */ + if (lParam == NF_QUERY && notifyFormat != -1) return notifyFormat; + break; + } + } defwndproc_counter++; ret = DefWindowProcA(hwnd, message, wParam, lParam); @@ -241,34 +288,64 @@ static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LP return ret; } -static BOOL register_parent_wnd_class(void) +static BOOL register_parent_wnd_class(BOOL Unicode) { - WNDCLASSA cls; - - cls.style = 0; - cls.lpfnWndProc = parent_wnd_proc; - cls.cbClsExtra = 0; - cls.cbWndExtra = 0; - cls.hInstance = GetModuleHandleA(NULL); - cls.hIcon = 0; - cls.hCursor = LoadCursorA(0, IDC_ARROW); - cls.hbrBackground = GetStockObject(WHITE_BRUSH); - cls.lpszMenuName = NULL; - cls.lpszClassName = "Listview test parent class"; - return RegisterClassA(&cls); + WNDCLASSA clsA; + WNDCLASSW clsW; + + if (Unicode) + { + clsW.style = 0; + clsW.lpfnWndProc = parent_wnd_proc; + clsW.cbClsExtra = 0; + clsW.cbWndExtra = 0; + clsW.hInstance = GetModuleHandleW(NULL); + clsW.hIcon = 0; + clsW.hCursor = LoadCursorA(0, IDC_ARROW); + clsW.hbrBackground = GetStockObject(WHITE_BRUSH); + clsW.lpszMenuName = NULL; + clsW.lpszClassName = testparentclassW; + } + else + { + clsA.style = 0; + clsA.lpfnWndProc = parent_wnd_proc; + clsA.cbClsExtra = 0; + clsA.cbWndExtra = 0; + clsA.hInstance = GetModuleHandleA(NULL); + clsA.hIcon = 0; + clsA.hCursor = LoadCursorA(0, IDC_ARROW); + clsA.hbrBackground = GetStockObject(WHITE_BRUSH); + clsA.lpszMenuName = NULL; + clsA.lpszClassName = "Listview test parent class"; + } + + return Unicode ? RegisterClassW(&clsW) : RegisterClassA(&clsA); } -static HWND create_parent_window(void) +static HWND create_parent_window(BOOL Unicode) { - if (!register_parent_wnd_class()) + static const WCHAR nameW[] = {'t','e','s','t','p','a','r','e','n','t','n','a','m','e','W'}; + + if (!register_parent_wnd_class(Unicode)) return NULL; - return CreateWindowEx(0, "Listview test parent class", - "Listview test parent window", - WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | - WS_MAXIMIZEBOX | WS_VISIBLE, - 0, 0, 100, 100, - GetDesktopWindow(), NULL, GetModuleHandleA(NULL), NULL); + blockEdit = FALSE; + notifyFormat = -1; + + if (Unicode) + return CreateWindowExW(0, testparentclassW, nameW, + WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | + WS_MAXIMIZEBOX | WS_VISIBLE, + 0, 0, 100, 100, + GetDesktopWindow(), NULL, GetModuleHandleW(NULL), NULL); + else + return CreateWindowExA(0, "Listview test parent class", + "Listview test parent window", + WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | + WS_MAXIMIZEBOX | WS_VISIBLE, + 0, 0, 100, 100, + GetDesktopWindow(), NULL, GetModuleHandleA(NULL), NULL); } static LRESULT WINAPI listview_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) @@ -332,6 +409,38 @@ static HWND create_listview_control(DWORD style) return hwnd; } +/* unicode listview window with specified parent */ +static HWND create_listview_controlW(DWORD style, HWND parent) +{ + struct subclass_info *info; + HWND hwnd; + RECT rect; + static const WCHAR nameW[] = {'f','o','o',0}; + + info = HeapAlloc(GetProcessHeap(), 0, sizeof(struct subclass_info)); + if (!info) + return NULL; + + GetClientRect(parent, &rect); + hwnd = CreateWindowExW(0, WC_LISTVIEWW, nameW, + WS_CHILD | WS_BORDER | WS_VISIBLE | LVS_REPORT | style, + 0, 0, rect.right, rect.bottom, + parent, NULL, GetModuleHandleW(NULL), NULL); + ok(hwnd != NULL, "gle=%d\n", GetLastError()); + + if (!hwnd) + { + HeapFree(GetProcessHeap(), 0, info); + return NULL; + } + + info->oldproc = (WNDPROC)SetWindowLongPtrW(hwnd, GWLP_WNDPROC, + (LONG_PTR)listview_subclass_proc); + SetWindowLongPtrW(hwnd, GWLP_USERDATA, (LONG_PTR)info); + + return hwnd; +} + static HWND create_custom_listview_control(DWORD style) { struct subclass_info *info; @@ -402,6 +511,52 @@ static HWND subclass_header(HWND hwndListview) return hwnd; } +static LRESULT WINAPI editbox_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + struct subclass_info *info = (struct subclass_info *)GetWindowLongPtrA(hwnd, GWLP_USERDATA); + static LONG defwndproc_counter = 0; + LRESULT ret; + struct message msg; + + msg.message = message; + msg.flags = sent|wparam|lparam; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wParam; + msg.lParam = lParam; + + /* all we need is sizing */ + if (message == WM_WINDOWPOSCHANGING || + message == WM_NCCALCSIZE || + message == WM_WINDOWPOSCHANGED || + message == WM_MOVE || + message == WM_SIZE) + { + add_message(sequences, EDITBOX_SEQ_INDEX, &msg); + } + + defwndproc_counter++; + ret = CallWindowProcA(info->oldproc, hwnd, message, wParam, lParam); + defwndproc_counter--; + return ret; +} + +static HWND subclass_editbox(HWND hwndListview) +{ + struct subclass_info *info; + HWND hwnd; + + info = HeapAlloc(GetProcessHeap(), 0, sizeof(struct subclass_info)); + if (!info) + return NULL; + + hwnd = (HWND)SendMessage(hwndListview, LVM_GETEDITCONTROL, 0, 0); + info->oldproc = (WNDPROC)SetWindowLongPtrA(hwnd, GWLP_WNDPROC, + (LONG_PTR)editbox_subclass_proc); + SetWindowLongPtrA(hwnd, GWLP_USERDATA, (LONG_PTR)info); + + return hwnd; +} + /* Performs a single LVM_HITTEST test */ static void test_lvm_hittest(HWND hwnd, INT x, INT y, INT item, UINT flags, BOOL todo_item, BOOL todo_flags, int line) @@ -1415,6 +1570,11 @@ static void test_item_count(void) HWND hwnd; DWORD r; + HDC hdc; + HFONT hOldFont; + TEXTMETRICA tm; + RECT rect; + INT height; LVITEM item0; LVITEM item1; @@ -1426,6 +1586,19 @@ static void test_item_count(void) hwnd = create_listview_control(0); ok(hwnd != NULL, "failed to create a listview window\n"); + /* resize in dpiaware manner to fit all 3 items added */ + hdc = GetDC(0); + hOldFont = SelectObject(hdc, GetStockObject(SYSTEM_FONT)); + GetTextMetricsA(hdc, &tm); + /* 2 extra pixels for bounds and header border */ + height = tm.tmHeight + 2; + SelectObject(hdc, hOldFont); + ReleaseDC(0, hdc); + + GetWindowRect(hwnd, &rect); + /* 3 items + 1 header + 1 to be sure */ + MoveWindow(hwnd, 0, 0, rect.right - rect.left, 5 * height, FALSE); + flush_sequences(sequences, NUM_MSG_SEQUENCES); trace("test item count\n"); @@ -2656,7 +2829,7 @@ static void test_getitemrect(void) /* zero width rectangle with no padding */ expect(0, rect.left); - todo_wine expect(0, rect.right); + expect(0, rect.right); insert_column(hwnd, 0); insert_column(hwnd, 1); @@ -2957,6 +3130,182 @@ static void test_editbox(void) expect(lstrlen(item.pszText), r); ok(strcmp(buffer, testitem1A) == 0, "Expected item text to change\n"); + /* LVM_EDITLABEL with -1 destroys current edit */ + hwndedit = (HWND)SendMessage(hwnd, LVM_GETEDITCONTROL, 0, 0); + ok(hwndedit == NULL, "Expected Edit window not to be created\n"); + /* no edit present */ + hwndedit = (HWND)SendMessage(hwnd, LVM_EDITLABEL, -1, 0); + ok(hwndedit == NULL, "Expected Edit window not to be created\n"); + hwndedit = (HWND)SendMessage(hwnd, LVM_EDITLABEL, 0, 0); + ok(IsWindow(hwndedit), "Expected Edit window to be created\n"); + /* edit present */ + ok(GetFocus() == hwndedit, "Expected Edit to be focused\n"); + hwndedit2 = (HWND)SendMessage(hwnd, LVM_EDITLABEL, -1, 0); + ok(hwndedit2 == NULL, "Expected Edit window not to be created\n"); + ok(!IsWindow(hwndedit), "Expected Edit window to be destroyed\n"); + ok(GetFocus() == hwnd, "Expected List to be focused\n"); + /* check another negative value */ + hwndedit = (HWND)SendMessage(hwnd, LVM_EDITLABEL, 0, 0); + ok(IsWindow(hwndedit), "Expected Edit window to be created\n"); + ok(GetFocus() == hwndedit, "Expected Edit to be focused\n"); + hwndedit2 = (HWND)SendMessage(hwnd, LVM_EDITLABEL, -2, 0); + ok(hwndedit2 == NULL, "Expected Edit window not to be created\n"); + ok(!IsWindow(hwndedit), "Expected Edit window to be destroyed\n"); + ok(GetFocus() == hwnd, "Expected List to be focused\n"); + /* and value greater then max item index */ + hwndedit = (HWND)SendMessage(hwnd, LVM_EDITLABEL, 0, 0); + ok(IsWindow(hwndedit), "Expected Edit window to be created\n"); + ok(GetFocus() == hwndedit, "Expected Edit to be focused\n"); + r = SendMessage(hwnd, LVM_GETITEMCOUNT, 0, 0); + hwndedit2 = (HWND)SendMessage(hwnd, LVM_EDITLABEL, r, 0); + ok(hwndedit2 == NULL, "Expected Edit window not to be created\n"); + ok(!IsWindow(hwndedit), "Expected Edit window to be destroyed\n"); + ok(GetFocus() == hwnd, "Expected List to be focused\n"); + + /* messaging tests */ + SetFocus(hwnd); + flush_sequences(sequences, NUM_MSG_SEQUENCES); + blockEdit = FALSE; + hwndedit = (HWND)SendMessage(hwnd, LVM_EDITLABEL, 0, 0); + ok(IsWindow(hwndedit), "Expected Edit window to be created\n"); + /* testing only sizing messages */ + ok_sequence(sequences, EDITBOX_SEQ_INDEX, editbox_create_pos, + "edit box create - sizing", TRUE); + + DestroyWindow(hwnd); +} + +static void test_notifyformat(void) +{ + HWND hwnd; + DWORD r; + + hwnd = create_listview_control(0); + ok(hwnd != NULL, "failed to create a listview window\n"); + + /* CCM_GETUNICODEFORMAT == LVM_GETUNICODEFORMAT, + CCM_SETUNICODEFORMAT == LVM_SETUNICODEFORMAT */ + r = SendMessage(hwnd, LVM_GETUNICODEFORMAT, 0, 0); + expect(0, r); + r = SendMessage(hwnd, WM_NOTIFYFORMAT, 0, NF_QUERY); + /* set */ + r = SendMessage(hwnd, LVM_SETUNICODEFORMAT, 1, 0); + expect(0, r); + r = SendMessage(hwnd, LVM_GETUNICODEFORMAT, 0, 0); + if (r == 1) + { + r = SendMessage(hwnd, LVM_SETUNICODEFORMAT, 0, 0); + expect(1, r); + r = SendMessage(hwnd, LVM_GETUNICODEFORMAT, 0, 0); + expect(0, r); + } + else + { + win_skip("LVM_GETUNICODEFORMAT is unsupported\n"); + DestroyWindow(hwnd); + return; + } + + DestroyWindow(hwnd); + + /* test failure in parent WM_NOTIFYFORMAT */ + notifyFormat = 0; + hwnd = create_listview_control(0); + ok(hwnd != NULL, "failed to create a listview window\n"); + r = SendMessage(hwnd, LVM_GETUNICODEFORMAT, 0, 0); + expect(0, r); + r = SendMessage(hwnd, WM_NOTIFYFORMAT, 0, NF_QUERY); + ok(r != 0, "Expected valid format\n"); + + notifyFormat = NFR_UNICODE; + r = SendMessage(hwnd, WM_NOTIFYFORMAT, 0, NF_REQUERY); + expect(NFR_UNICODE, r); + r = SendMessage(hwnd, LVM_GETUNICODEFORMAT, 0, 0); + expect(1, r); + + notifyFormat = NFR_ANSI; + r = SendMessage(hwnd, WM_NOTIFYFORMAT, 0, NF_REQUERY); + expect(NFR_ANSI, r); + r = SendMessage(hwnd, LVM_GETUNICODEFORMAT, 0, 0); + expect(0, r); + + DestroyWindow(hwnd); + + /* try different unicode window combination and defaults */ + if (!GetModuleHandleW(NULL)) + { + win_skip("Additional notify format tests are incompatible with Win9x\n"); + return; + } + + hwndparentW = create_parent_window(TRUE); + ok(IsWindow(hwndparentW), "Unicode parent creation failed\n"); + if (!IsWindow(hwndparentW)) return; + + notifyFormat = -1; + hwnd = create_listview_controlW(0, hwndparentW); + ok(hwnd != NULL, "failed to create a listview window\n"); + r = SendMessageW(hwnd, LVM_GETUNICODEFORMAT, 0, 0); + expect(1, r); + DestroyWindow(hwnd); + /* recieving error code defaulting to ansi */ + notifyFormat = 0; + hwnd = create_listview_controlW(0, hwndparentW); + ok(hwnd != NULL, "failed to create a listview window\n"); + r = SendMessageW(hwnd, LVM_GETUNICODEFORMAT, 0, 0); + expect(0, r); + DestroyWindow(hwnd); + /* recieving ansi code from unicode window, use it */ + notifyFormat = NFR_ANSI; + hwnd = create_listview_controlW(0, hwndparentW); + ok(hwnd != NULL, "failed to create a listview window\n"); + r = SendMessageW(hwnd, LVM_GETUNICODEFORMAT, 0, 0); + expect(0, r); + DestroyWindow(hwnd); + /* unicode listview with ansi parent window */ + notifyFormat = -1; + hwnd = create_listview_controlW(0, hwndparent); + ok(hwnd != NULL, "failed to create a listview window\n"); + r = SendMessageW(hwnd, LVM_GETUNICODEFORMAT, 0, 0); + expect(0, r); + DestroyWindow(hwnd); + /* unicode listview with ansi parent window, return error code */ + notifyFormat = 0; + hwnd = create_listview_controlW(0, hwndparent); + ok(hwnd != NULL, "failed to create a listview window\n"); + r = SendMessageW(hwnd, LVM_GETUNICODEFORMAT, 0, 0); + expect(0, r); + DestroyWindow(hwnd); + + DestroyWindow(hwndparentW); +} + +static void test_indentation(void) +{ + HWND hwnd; + LVITEMA item; + DWORD r; + + hwnd = create_listview_control(0); + ok(hwnd != NULL, "failed to create a listview window\n"); + + memset(&item, 0, sizeof(item)); + item.mask = LVIF_INDENT; + item.iItem = 0; + item.iIndent = I_INDENTCALLBACK; + r = SendMessage(hwnd, LVM_INSERTITEMA, 0, (LPARAM)&item); + expect(0, r); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + item.iItem = 0; + item.mask = LVIF_INDENT; + r = SendMessage(hwnd, LVM_GETITEM, 0, (LPARAM)&item); + expect(TRUE, r); + + ok_sequence(sequences, PARENT_SEQ_INDEX, single_getdispinfo_parent_seq, + "get indent dispinfo", FALSE); + DestroyWindow(hwnd); } @@ -2980,7 +3329,7 @@ START_TEST(listview) init_msg_sequences(sequences, NUM_MSG_SEQUENCES); flush_sequences(sequences, NUM_MSG_SEQUENCES); - hwndparent = create_parent_window(); + hwndparent = create_parent_window(FALSE); ok_sequence(sequences, PARENT_SEQ_INDEX, create_parent_wnd_seq, "create parent window", TRUE); flush_sequences(sequences, NUM_MSG_SEQUENCES); @@ -3009,6 +3358,8 @@ START_TEST(listview) test_getitemposition(); test_columnscreation(); test_editbox(); + test_notifyformat(); + test_indentation(); DestroyWindow(hwndparent); } diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c index 5a0344fc4ff..9bbac21edb4 100644 --- a/dlls/comctl32/toolbar.c +++ b/dlls/comctl32/toolbar.c @@ -240,7 +240,7 @@ typedef enum static const WCHAR themeClass[] = { 'T','o','o','l','b','a','r',0 }; static BOOL TOOLBAR_GetButtonInfo(const TOOLBAR_INFO *infoPtr, NMTOOLBARW *nmtb); -static BOOL TOOLBAR_IsButtonRemovable(const TOOLBAR_INFO *infoPtr, int iItem, PCUSTOMBUTTON btnInfo); +static BOOL TOOLBAR_IsButtonRemovable(const TOOLBAR_INFO *infoPtr, int iItem, const CUSTOMBUTTON *btnInfo); static HIMAGELIST TOOLBAR_GetImageList(const PIMLENTRY *pies, INT cies, INT id); static PIMLENTRY TOOLBAR_GetImageListEntry(const PIMLENTRY *pies, INT cies, INT id); static VOID TOOLBAR_DeleteImageList(PIMLENTRY **pies, INT *cies); @@ -1770,7 +1770,7 @@ TOOLBAR_LayoutToolbar(TOOLBAR_INFO *infoPtr) static INT -TOOLBAR_InternalHitTest (TOOLBAR_INFO *infoPtr, const POINT *lpPt) +TOOLBAR_InternalHitTest (const TOOLBAR_INFO *infoPtr, const POINT *lpPt) { TBUTTON_INFO *btnPtr; INT i; @@ -3676,7 +3676,7 @@ TOOLBAR_HideButton (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam) static inline LRESULT -TOOLBAR_HitTest (TOOLBAR_INFO *infoPtr, LPARAM lParam) +TOOLBAR_HitTest (const TOOLBAR_INFO *infoPtr, LPARAM lParam) { return TOOLBAR_InternalHitTest (infoPtr, (LPPOINT)lParam); } @@ -7039,7 +7039,7 @@ static BOOL TOOLBAR_GetButtonInfo(const TOOLBAR_INFO *infoPtr, NMTOOLBARW *nmtb) } -static BOOL TOOLBAR_IsButtonRemovable(const TOOLBAR_INFO *infoPtr, int iItem, PCUSTOMBUTTON btnInfo) +static BOOL TOOLBAR_IsButtonRemovable(const TOOLBAR_INFO *infoPtr, int iItem, const CUSTOMBUTTON *btnInfo) { NMTOOLBARW nmtb; diff --git a/dlls/comctl32/tooltips.c b/dlls/comctl32/tooltips.c index 9d7c327502a..54600e81c87 100644 --- a/dlls/comctl32/tooltips.c +++ b/dlls/comctl32/tooltips.c @@ -1020,7 +1020,7 @@ TOOLTIPS_Activate (TOOLTIPS_INFO *infoPtr, BOOL activate) static LRESULT -TOOLTIPS_AddToolA (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo) +TOOLTIPS_AddToolA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo) { TTTOOL_INFO *toolPtr; INT nResult; @@ -1109,7 +1109,7 @@ TOOLTIPS_AddToolA (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo) static LRESULT -TOOLTIPS_AddToolW (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpToolInfo) +TOOLTIPS_AddToolW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo) { TTTOOL_INFO *toolPtr; INT nResult; @@ -1376,7 +1376,7 @@ TOOLTIPS_EnumToolsW (const TOOLTIPS_INFO *infoPtr, UINT uIndex, LPTTTOOLINFOW lp } static LRESULT -TOOLTIPS_GetBubbleSize (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpToolInfo) +TOOLTIPS_GetBubbleSize (const TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo) { INT nTool; SIZE size; @@ -1711,7 +1711,7 @@ TOOLTIPS_HitTestW (const TOOLTIPS_INFO *infoPtr, LPTTHITTESTINFOW lptthit) static LRESULT -TOOLTIPS_NewToolRectA (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpti) +TOOLTIPS_NewToolRectA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpti) { INT nTool; @@ -1733,7 +1733,7 @@ TOOLTIPS_NewToolRectA (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpti) static LRESULT -TOOLTIPS_NewToolRectW (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpti) +TOOLTIPS_NewToolRectW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpti) { INT nTool; @@ -1867,7 +1867,7 @@ TOOLTIPS_SetDelayTime (TOOLTIPS_INFO *infoPtr, DWORD duration, INT nTime) static LRESULT -TOOLTIPS_SetMargin (TOOLTIPS_INFO *infoPtr, LPRECT lpRect) +TOOLTIPS_SetMargin (TOOLTIPS_INFO *infoPtr, const RECT *lpRect) { infoPtr->rcMargin.left = lpRect->left; infoPtr->rcMargin.right = lpRect->right; @@ -1970,7 +1970,7 @@ TOOLTIPS_SetTitleW (TOOLTIPS_INFO *infoPtr, UINT_PTR uTitleIcon, LPCWSTR pszTitl static LRESULT -TOOLTIPS_SetToolInfoA (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo) +TOOLTIPS_SetToolInfoA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo) { TTTOOL_INFO *toolPtr; INT nTool; @@ -2026,7 +2026,7 @@ TOOLTIPS_SetToolInfoA (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo) static LRESULT -TOOLTIPS_SetToolInfoW (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpToolInfo) +TOOLTIPS_SetToolInfoW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo) { TTTOOL_INFO *toolPtr; INT nTool; @@ -2090,7 +2090,7 @@ TOOLTIPS_SetToolInfoW (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpToolInfo) static LRESULT -TOOLTIPS_TrackActivate (TOOLTIPS_INFO *infoPtr, BOOL track_activate, LPTTTOOLINFOA lpToolInfo) +TOOLTIPS_TrackActivate (TOOLTIPS_INFO *infoPtr, BOOL track_activate, const TTTOOLINFOA *lpToolInfo) { if (track_activate) { @@ -2149,7 +2149,7 @@ TOOLTIPS_Update (TOOLTIPS_INFO *infoPtr) static LRESULT -TOOLTIPS_UpdateTipTextA (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo) +TOOLTIPS_UpdateTipTextA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo) { TTTOOL_INFO *toolPtr; INT nTool; @@ -2204,7 +2204,7 @@ TOOLTIPS_UpdateTipTextA (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo) static LRESULT -TOOLTIPS_UpdateTipTextW (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpToolInfo) +TOOLTIPS_UpdateTipTextW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo) { TTTOOL_INFO *toolPtr; INT nTool; diff --git a/dlls/comctl32/treeview.c b/dlls/comctl32/treeview.c index d01a1278cf0..8bea9738a2b 100644 --- a/dlls/comctl32/treeview.c +++ b/dlls/comctl32/treeview.c @@ -710,7 +710,7 @@ static void TREEVIEW_UpdateDispInfo(const TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem, UINT mask) { - NMTVDISPINFOW callback; + NMTVDISPINFOEXW callback; HWND hwnd = infoPtr->hwnd; TRACE("mask %x callbackMask %x\n", mask, wineItem->callbackMask); diff --git a/dlls/comdlg32/filedlg.c b/dlls/comdlg32/filedlg.c index 10fccc2cea3..b8206243c19 100644 --- a/dlls/comdlg32/filedlg.c +++ b/dlls/comdlg32/filedlg.c @@ -3297,7 +3297,7 @@ void FILEDLG95_FILENAME_FillFromSelection (HWND hwnd) * Although shell32 is already linked the behaviour of exported StrRetToStrN * is dependent on whether emulated OS is unicode or not. */ -static HRESULT COMDLG32_StrRetToStrNW (LPWSTR dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl) +static HRESULT COMDLG32_StrRetToStrNW (LPWSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) { switch (src->uType) { diff --git a/dlls/comdlg32/printdlg.c b/dlls/comdlg32/printdlg.c index 6726c6a9cba..21366fd7750 100644 --- a/dlls/comdlg32/printdlg.c +++ b/dlls/comdlg32/printdlg.c @@ -2364,7 +2364,7 @@ static inline BOOL is_metric(const pagesetup_data *data) return pagesetup_get_flags(data) & PSD_INHUNDREDTHSOFMILLIMETERS; } -static inline LONG tenths_mm_to_size(pagesetup_data *data, LONG size) +static inline LONG tenths_mm_to_size(const pagesetup_data *data, LONG size) { if (is_metric(data)) return 10 * size; @@ -2372,7 +2372,7 @@ static inline LONG tenths_mm_to_size(pagesetup_data *data, LONG size) return 10 * size * 100 / 254; } -static inline LONG thousandths_inch_to_size(pagesetup_data *data, LONG size) +static inline LONG thousandths_inch_to_size(const pagesetup_data *data, LONG size) { if (is_metric(data)) return size * 254 / 100; @@ -2537,7 +2537,7 @@ typedef enum } devnames_name; -static inline WORD get_devname_offset(DEVNAMES *dn, devnames_name which) +static inline WORD get_devname_offset(const DEVNAMES *dn, devnames_name which) { switch(which) { @@ -3010,7 +3010,7 @@ static void update_margin_edits(HWND hDlg, const pagesetup_data *data, WORD id) } } -static void margin_edit_notification(HWND hDlg, pagesetup_data *data, WORD msg, WORD id) +static void margin_edit_notification(HWND hDlg, const pagesetup_data *data, WORD msg, WORD id) { switch (msg) { diff --git a/dlls/credui/credui_main.c b/dlls/credui/credui_main.c index 7e3c8a02ab9..a6bbde62eb8 100644 --- a/dlls/credui/credui_main.c +++ b/dlls/credui/credui_main.c @@ -138,7 +138,7 @@ struct cred_dialog_params BOOL fBalloonTipActive; }; -static void CredDialogFillUsernameCombo(HWND hwndUsername, struct cred_dialog_params *params) +static void CredDialogFillUsernameCombo(HWND hwndUsername, const struct cred_dialog_params *params) { DWORD count; DWORD i; diff --git a/dlls/crypt32/cert.c b/dlls/crypt32/cert.c index 2780cba6343..2b43d3e59a8 100644 --- a/dlls/crypt32/cert.c +++ b/dlls/crypt32/cert.c @@ -2419,7 +2419,7 @@ static void CRYPT_SetBitInField(struct BitField *field, DWORD bit) field->indexes[indexIndex] |= 1 << (bit % BITS_PER_DWORD); } -static BOOL CRYPT_IsBitInFieldSet(struct BitField *field, DWORD bit) +static BOOL CRYPT_IsBitInFieldSet(const struct BitField *field, DWORD bit) { BOOL set = FALSE; DWORD indexIndex = bit / BITS_PER_DWORD; diff --git a/dlls/crypt32/chain.c b/dlls/crypt32/chain.c index 2e414cdddf8..b22cb5b0cc4 100644 --- a/dlls/crypt32/chain.c +++ b/dlls/crypt32/chain.c @@ -262,7 +262,7 @@ static void CRYPT_CheckSimpleChainForCycles(PCERT_SIMPLE_CHAIN chain) } /* Checks whether the chain is cyclic by examining the last element's status */ -static inline BOOL CRYPT_IsSimpleChainCyclic(PCERT_SIMPLE_CHAIN chain) +static inline BOOL CRYPT_IsSimpleChainCyclic(const CERT_SIMPLE_CHAIN *chain) { if (chain->cElement) return chain->rgpElement[chain->cElement - 1]->TrustStatus.dwErrorStatus @@ -272,7 +272,7 @@ static inline BOOL CRYPT_IsSimpleChainCyclic(PCERT_SIMPLE_CHAIN chain) } static inline void CRYPT_CombineTrustStatus(CERT_TRUST_STATUS *chainStatus, - CERT_TRUST_STATUS *elementStatus) + const CERT_TRUST_STATUS *elementStatus) { /* Any error that applies to an element also applies to a chain.. */ chainStatus->dwErrorStatus |= elementStatus->dwErrorStatus; @@ -282,7 +282,7 @@ static inline void CRYPT_CombineTrustStatus(CERT_TRUST_STATUS *chainStatus, chainStatus->dwInfoStatus |= (elementStatus->dwInfoStatus & 0xfffffff0); } -static BOOL CRYPT_AddCertToSimpleChain(PCertificateChainEngine engine, +static BOOL CRYPT_AddCertToSimpleChain(const CertificateChainEngine *engine, PCERT_SIMPLE_CHAIN chain, PCCERT_CONTEXT cert, DWORD subjectInfoStatus) { BOOL ret = FALSE; @@ -720,7 +720,7 @@ static void CRYPT_CheckChainNameConstraints(PCERT_SIMPLE_CHAIN chain) } } -static void dump_basic_constraints(PCERT_EXTENSION ext) +static void dump_basic_constraints(const CERT_EXTENSION *ext) { CERT_BASIC_CONSTRAINTS_INFO *info; DWORD size = 0; @@ -737,7 +737,7 @@ static void dump_basic_constraints(PCERT_EXTENSION ext) } } -static void dump_basic_constraints2(PCERT_EXTENSION ext) +static void dump_basic_constraints2(const CERT_EXTENSION *ext) { CERT_BASIC_CONSTRAINTS2_INFO constraints; DWORD size = sizeof(CERT_BASIC_CONSTRAINTS2_INFO); @@ -754,7 +754,7 @@ static void dump_basic_constraints2(PCERT_EXTENSION ext) } } -static void dump_extension(PCERT_EXTENSION ext) +static void dump_extension(const CERT_EXTENSION *ext) { TRACE_(chain)("%s (%scritical)\n", debugstr_a(ext->pszObjId), ext->fCritical ? "" : "not "); @@ -1008,7 +1008,7 @@ static PCCERT_CONTEXT CRYPT_GetIssuer(HCERTSTORE store, PCCERT_CONTEXT subject, /* Builds a simple chain by finding an issuer for the last cert in the chain, * until reaching a self-signed cert, or until no issuer can be found. */ -static BOOL CRYPT_BuildSimpleChain(PCertificateChainEngine engine, +static BOOL CRYPT_BuildSimpleChain(const CertificateChainEngine *engine, HCERTSTORE world, PCERT_SIMPLE_CHAIN chain) { BOOL ret = TRUE; @@ -1116,7 +1116,7 @@ static BOOL CRYPT_BuildCandidateChainFromCert(HCERTCHAINENGINE hChainEngine, /* Makes and returns a copy of chain, up to and including element iElement. */ static PCERT_SIMPLE_CHAIN CRYPT_CopySimpleChainToElement( - PCERT_SIMPLE_CHAIN chain, DWORD iElement) + const CERT_SIMPLE_CHAIN *chain, DWORD iElement) { PCERT_SIMPLE_CHAIN copy = CryptMemAlloc(sizeof(CERT_SIMPLE_CHAIN)); @@ -1345,7 +1345,7 @@ static PCertificateChain CRYPT_BuildAlternateContextFromChain( #define IS_TRUST_ERROR_SET(TrustStatus, bits) \ (TrustStatus)->dwErrorStatus & (bits) -static DWORD CRYPT_ChainQuality(PCertificateChain chain) +static DWORD CRYPT_ChainQuality(const CertificateChain *chain) { DWORD quality = CHAIN_QUALITY_HIGHEST; @@ -1402,7 +1402,7 @@ static PCertificateChain CRYPT_ChooseHighestQualityChain( } static BOOL CRYPT_AddAlternateChainToChain(PCertificateChain chain, - PCertificateChain alternate) + const CertificateChain *alternate) { BOOL ret; @@ -1427,7 +1427,7 @@ static BOOL CRYPT_AddAlternateChainToChain(PCertificateChain chain, } static PCERT_CHAIN_ELEMENT CRYPT_FindIthElementInChain( - PCERT_CHAIN_CONTEXT chain, DWORD i) + const CERT_CHAIN_CONTEXT *chain, DWORD i) { DWORD j, iElement; PCERT_CHAIN_ELEMENT element = NULL; @@ -1448,7 +1448,7 @@ typedef struct _CERT_CHAIN_PARA_NO_EXTRA_FIELDS { } CERT_CHAIN_PARA_NO_EXTRA_FIELDS, *PCERT_CHAIN_PARA_NO_EXTRA_FIELDS; static void CRYPT_VerifyChainRevocation(PCERT_CHAIN_CONTEXT chain, - LPFILETIME pTime, PCERT_CHAIN_PARA pChainPara, DWORD chainFlags) + LPFILETIME pTime, const CERT_CHAIN_PARA *pChainPara, DWORD chainFlags) { DWORD cContext; diff --git a/dlls/crypt32/crypt32_Fr.rc b/dlls/crypt32/crypt32_Fr.rc index 08a1898852e..35ade1e1a9e 100644 --- a/dlls/crypt32/crypt32_Fr.rc +++ b/dlls/crypt32/crypt32_Fr.rc @@ -1,7 +1,7 @@ /* * crypt32 dll French resources * - * Copyright 2006-2008 Jonathan Ernst + * Copyright 2006-2009 Jonathan Ernst * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -171,6 +171,7 @@ STRINGTABLE DISCARDABLE IDS_LOCALIZEDNAME_MY "Personnel" IDS_LOCALIZEDNAME_CA "Autorités intermédiaires" IDS_LOCALIZEDNAME_ADDRESSBOOK "Autres personnes" + IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Éditeurs de confiance" } STRINGTABLE DISCARDABLE diff --git a/dlls/cryptdlg/cryptdlg.rc b/dlls/cryptdlg/cryptdlg.rc index e8156531dcc..a4946529a14 100644 --- a/dlls/cryptdlg/cryptdlg.rc +++ b/dlls/cryptdlg/cryptdlg.rc @@ -22,6 +22,7 @@ #include "winuser.h" #include "cryptres.h" +#include "cryptdlg_De.rc" #include "cryptdlg_En.rc" #include "cryptdlg_Fr.rc" #include "cryptdlg_Ko.rc" diff --git a/dlls/cryptdlg/cryptdlg.rc b/dlls/cryptdlg/cryptdlg_De.rc similarity index 56% copy from dlls/cryptdlg/cryptdlg.rc copy to dlls/cryptdlg/cryptdlg_De.rc index e8156531dcc..9e948fe5bfe 100644 --- a/dlls/cryptdlg/cryptdlg.rc +++ b/dlls/cryptdlg/cryptdlg_De.rc @@ -1,7 +1,7 @@ /* * cryptdlg dll resources * - * Copyright 2008 Juan Lang + * Copyright 2009 André Hentschel * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,12 +17,20 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "windef.h" -#include "winbase.h" -#include "winuser.h" -#include "cryptres.h" -#include "cryptdlg_En.rc" -#include "cryptdlg_Fr.rc" -#include "cryptdlg_Ko.rc" -#include "cryptdlg_Nl.rc" +LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_CERT_POLICY "Zertifikatsrichtlinie" + IDS_POLICY_ID "Richtlinien Qualifizierung: " + IDS_POLICY_QUALIFIER_INFO "Richtlinien Qualifizierungs Information" + IDS_POLICY_QUALIFIER_ID "Richtlinien Qualifizierungs-ID=" + IDS_CPS "CPS" + IDS_USER_NOTICE "Benutzerbenachrichtigung" + IDS_QUALIFIER "Qualifizierung" + IDS_NOTICE_REF "Benachrichtigungsbezug" + IDS_ORGANIZATION "Organisation=" + IDS_NOTICE_NUM "Benachrichtigungsnummer=" + IDS_NOTICE_TEXT "Benachrichtigungstext=" +} diff --git a/dlls/cryptui/cryptui.rc b/dlls/cryptui/cryptui.rc index 4b170e3f4bf..ef998f883e9 100644 --- a/dlls/cryptui/cryptui.rc +++ b/dlls/cryptui/cryptui.rc @@ -46,6 +46,7 @@ IDB_CERT_WATERMARK BITMAP LOADONCALL DISCARDABLE certwatermark.bmp /* @makedep: certheader.bmp */ IDB_CERT_HEADER BITMAP LOADONCALL DISCARDABLE certheader.bmp +#include "cryptui_De.rc" #include "cryptui_En.rc" #include "cryptui_Ko.rc" #include "cryptui_Nl.rc" diff --git a/dlls/cryptui/cryptui_De.rc b/dlls/cryptui/cryptui_De.rc new file mode 100644 index 00000000000..e9c81822ae5 --- /dev/null +++ b/dlls/cryptui/cryptui_De.rc @@ -0,0 +1,465 @@ +/* + * cryptui dll resources + * + * Copyright 2009 André Hentschel + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#pragma code_page(65001) + +LANGUAGE LANG_GERMAN, SUBLANG_DEFAULT + +STRINGTABLE DISCARDABLE +{ + IDS_CERTIFICATE "Zertifikat" + IDS_CERTIFICATEINFORMATION "Zertifikatsinformationen" + IDS_CERT_INFO_BAD_SIG "Das Zertifikat hat einen ungültige Signatur. Das Zertifikat wurde eventuell manipuliert." + IDS_CERT_INFO_UNTRUSTED_CA "Dieses Stammzertifikat ist nicht vertrauenswürdig. Installieren Sie das Zertifikat zu den vertrauenswürdigen Stammzertifikatsstellen, um die Vertrauensstellung zu aktivieren." + IDS_CERT_INFO_UNTRUSTED_ROOT "Das Zertifikat hat kein gültiges Stammzertifikat." + IDS_CERT_INFO_PARTIAL_CHAIN "Der Zertifikats-Aussteller konnte nicht gefunden werden." + IDS_CERT_INFO_BAD_PURPOSES "Die geplanten Zwecke des Zertifikats konnten nicht verifiziert werden." + IDS_CERT_INFO_PURPOSES "Dieses Zertifikat dient folgenden Zwecken:" + IDS_SUBJECT_HEADING "Ausgestellt für: " + IDS_ISSUER_HEADING "Ausgestellt von: " + IDS_VALID_FROM "Gültig ab " + IDS_VALID_TO " bis " + IDS_CERTIFICATE_BAD_SIGNATURE "Das Zertifikat hat einen ungültige Signatur." + IDS_CERTIFICATE_BAD_TIME "Dieses Zertifikat ist entweder abgelaufen oder noch nicht gültig." + IDS_CERTIFICATE_BAD_TIMENEST "Das Zertifikat überschreitet die Gültigkeit des Ausstellers." + IDS_CERTIFICATE_REVOKED "Das Zertifikat wurde vom Aussteller zurückgezogen." + IDS_CERTIFICATE_VALID "Dieses Zertifikat ist gültig." + IDS_FIELD "Feld" + IDS_VALUE "Wert" + IDS_FIELDS_ALL "" + IDS_FIELDS_V1 "Nur Version-1-Felder" + IDS_FIELDS_EXTENSIONS "Nur Erweiterungen" + IDS_FIELDS_CRITICAL_EXTENSIONS "Nur kritische Erweiterungen" + IDS_FIELDS_PROPERTIES "Nur Eigenschaften" + IDS_FIELD_VERSION "Version" + IDS_FIELD_SERIAL_NUMBER "Seriennummer" + IDS_FIELD_ISSUER "Aussteller" + IDS_FIELD_VALID_FROM "Gültig ab" + IDS_FIELD_VALID_TO "Gültig bis" + IDS_FIELD_SUBJECT "Antragsteller" + IDS_FIELD_PUBLIC_KEY "Öffentlicher Schlüssel" + IDS_FIELD_PUBLIC_KEY_FORMAT "%s (%d Bits)" + IDS_PROP_HASH "SHA1 Hash" + IDS_PROP_ENHKEY_USAGE "Erweiterte Schlüsselnutzung (Eigenschaft)" + IDS_PROP_FRIENDLY_NAME "Angezeigter Name" + IDS_PROP_DESCRIPTION "Beschreibung" + IDS_CERTIFICATE_PROPERTIES "Zertifikatseigenschaften" + IDS_CERTIFICATE_PURPOSE_ERROR "Bitte geben Sie die OID im Format 1.2.3.4 an" + IDS_CERTIFICATE_PURPOSE_EXISTS "Die eingegebene OID existiert bereits." + IDS_SELECT_STORE_TITLE "Zertifikatsspeicher wählen" + IDS_SELECT_STORE "Bitte wählen Sie einen Zertifikatsspeicher." + IDS_IMPORT_WIZARD "Importassistent für die Zertifikatsverwaltung" + IDS_IMPORT_TYPE_MISMATCH "Die Datei enthält Objekte, die nicht den Kriterien entsprechen. Bitte wählen Sie eine andere Datei." + IDS_IMPORT_FILE_TITLE "Zu importierende Datei" + IDS_IMPORT_FILE_SUBTITLE "Geben Sie die zu importierende Datei an." + IDS_IMPORT_STORE_TITLE "Zertifikatsspeicher wählen" + IDS_IMPORT_STORE_SUBTITLE "Zertifikatsspeicher sind Systemspeicher für Zertifikate." + IDS_IMPORT_FILTER_CERT "X.509 Zertifikat (*.cer; *.crt)" + IDS_IMPORT_FILTER_PFX "Privater Informationsaustausch (*.pfx; *.p12)" + IDS_IMPORT_FILTER_CRL "Zertifikatssperrliste (*.crl)" + IDS_IMPORT_FILTER_CTL "Zertifikatsvertrauensliste (*.stl)" + IDS_IMPORT_FILTER_SERIALIZED_STORE "Microsoft Speicher serieller Zertifikate (*.sst)" + IDS_IMPORT_FILTER_CMS "CMS/PKCS #7 Zertifikate (*.spc; *.p7b)" + IDS_IMPORT_FILTER_ALL "Alle Dateien (*.*)" + IDS_IMPORT_EMPTY_FILE "Bitte wählen Sie eine Datei." + IDS_IMPORT_BAD_FORMAT "Unbekanntes Format. Wählen Sie eine andere Datei." + IDS_IMPORT_OPEN_FAILED "Konnte die Datei nicht öffnen: " + IDS_IMPORT_DEST_DETERMINED "Automatisch ausgewählt" + IDS_IMPORT_SELECT_STORE "Bitte wählen Sie einen Speicher" + IDS_IMPORT_STORE_SELECTION "Zertifikatsspeicher gewählt" + IDS_IMPORT_DEST_AUTOMATIC "Automatisch ausgewählt" + IDS_IMPORT_FILE "Datei" + IDS_IMPORT_CONTENT "Inhalt" + IDS_IMPORT_CONTENT_CERT "Zertifikat" + IDS_IMPORT_CONTENT_CRL "Zertifikatssperrliste" + IDS_IMPORT_CONTENT_CTL "Zertifikatsvertrauensliste" + IDS_IMPORT_CONTENT_CMS "CMS/PKCS #7 Zertifikat" + IDS_IMPORT_CONTENT_PFX "Privater Informationsaustausch" + IDS_IMPORT_CONTENT_STORE "Zertifikatsspeicher" + IDS_IMPORT_SUCCEEDED "Importvorgang erfolgreich." + IDS_IMPORT_FAILED "Importvorgang gescheitert." + IDS_WIZARD_TITLE_FONT "Arial" + IDS_PURPOSE_ALL "" + IDS_PURPOSE_ADVANCED "" + IDS_SUBJECT_COLUMN "Ausgestellt für" + IDS_ISSUER_COLUMN "Ausgestellt von" + IDS_EXPIRATION_COLUMN "Verfallsdatum" + IDS_FRIENDLY_NAME_COLUMN "Angezeigter Name" + IDS_ALLOWED_PURPOSE_ALL "" + IDS_ALLOWED_PURPOSE_NONE "" + IDS_WARN_REMOVE_MY "Sie sind danach nicht länger fähig Nachrichten mit diesem Zertifikat zu entschlüsseln oder zu unterzeichnen.\nSind Sie sicher, dass Sie es löschen möchten?" + IDS_WARN_REMOVE_PLURAL_MY "Sie sind danach nicht länger fähig Nachrichten mit diesen Zertifikaten zu entschlüsseln oder zu unterzeichnen.\nSind Sie sicher, dass Sie sie löschen möchten?" + IDS_WARN_REMOVE_ADDRESSBOOK "Sie sind danach nicht länger fähig Nachrichten mit diesem Zertifikat zu entschlüsseln oder zu unterzeichnen.\nSind Sie sicher, dass Sie es löschen möchten?" + IDS_WARN_REMOVE_PLURAL_ADDRESSBOOK "Sie sind danach nicht länger fähig Nachrichten mit diesen Zertifikaten zu entschlüsseln oder zu unterzeichnen.\nSind Sie sicher, dass Sie sie löschen möchten?" + IDS_WARN_REMOVE_CA "Von dieser CA ausgestellte Zertifikate werden nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie es löschen möchten?" + IDS_WARN_REMOVE_PLURAL_CA "Von diesen CAs ausgestellte Zertifikate werden nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie sie löschen möchten?" + IDS_WARN_REMOVE_ROOT "Von dieser Stamm-CA ausgestellte Zertifikate werden nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie es löschen möchten?" + IDS_WARN_REMOVE_PLURAL_ROOT "Von diesen Stamm-CAs ausgestellte Zertifikate werden nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie sie löschen möchten?" + IDS_WARN_REMOVE_TRUSTEDPUBLISHER "Software die von diesem Hersteller signiert ist wird nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie ihn löschen möchten?" + IDS_WARN_REMOVE_PLURAL_TRUSTEDPUBLISHER "Software die von diesen Herstellern signiert ist wird nicht länger vertrauenswürdig sein.\nSind Sie sicher, dass Sie sie löschen möchten?" + IDS_WARN_REMOVE_DEFAULT "Sind Sie sicher, dass Sie dieses Zertifikat entfernen möchten?" + IDS_WARN_REMOVE_PLURAL_DEFAULT "Sind Sie sicher, dass Sie diese Zertifikate entfernen möchten?" + IDS_CERT_MGR "Zertifikate" + IDS_PURPOSE_SERVER_AUTH "Garantiert die Identität eines entfernten Computers" + IDS_PURPOSE_CLIENT_AUTH "Beweist Ihre Identität für einen entfernten Computers" + IDS_PURPOSE_CODE_SIGNING "Schützt Software vor Manipulation nach der Veröffentlichung" + IDS_PURPOSE_EMAIL_PROTECTION "Sichert E-Mail Nachrichten" + IDS_PURPOSE_IPSEC "Erlaubt sichere Kommunikation über das Internet" + IDS_PURPOSE_TIMESTAMP_SIGNING "Erlaubt Daten mit der aktuellen Zeit zu signieren" + IDS_PURPOSE_CTL_USAGE_SIGNING "Erlaubt Ihnen eine Zertifikatsvertrauensliste zu signieren" + IDS_PURPOSE_EFS "Erlaubt es lokale Daten zu verschlüsseln" + IDS_PURPOSE_EFS_RECOVERY "Datenwiederherstellung" + IDS_PURPOSE_WHQL "Windows Hardware Treiber Verifizierung" + IDS_PURPOSE_NT5 "Windows System Komponenten Verifizierung" + IDS_PURPOSE_OEM_WHQL "OEM Windows System Komponenten Verifizierung" + IDS_PURPOSE_EMBEDDED_NT "Embedded Windows System Komponenten Verifizierung" + IDS_PURPOSE_ROOT_LIST_SIGNER "Stammlisten Signierer" + IDS_PURPOSE_QUALIFIED_SUBORDINATION "Qualifizierte Unterordnung" + IDS_PURPOSE_KEY_RECOVERY "Schlüsselwiederherstellung" + IDS_PURPOSE_DOCUMENT_SIGNING "Dokument signieren" + IDS_PURPOSE_LIFETIME_SIGNING "Lebensdauer signieren" + IDS_PURPOSE_DRM "Digitale Rechte" + IDS_PURPOSE_LICENSES "Lizenzschlüssel" + IDS_PURPOSE_LICENSE_SERVER "Lizenz Server Verifizierung" + IDS_PURPOSE_ENROLLMENT_AGENT "Zertifikatsanfrage" + IDS_PURPOSE_SMARTCARD_LOGON "Smart Card Anmeldung" + IDS_PURPOSE_CA_EXCHANGE "Private Schlüsselarchive" + IDS_PURPOSE_KEY_RECOVERY_AGENT "Schlüsselwiederherstellung" + IDS_PURPOSE_DS_EMAIL_REPLICATION "Verzeichnissdienst E-Mail-Replikation" + IDS_EXPORT_WIZARD "Exportassistent für die Zertifikatsverwaltung" + IDS_EXPORT_FORMAT_TITLE "Export Format" + IDS_EXPORT_FORMAT_SUBTITLE "Wählen Sie ein Dateiformat." + IDS_EXPORT_FILE_TITLE "Export Dateiname" + IDS_EXPORT_FILE_SUBTITLE "Geben Sie die Datei an, in die Sie exportieren möchten." + IDS_EXPORT_FILE_EXISTS "Die angegebene Datei existiert bereits. Möchten Sie sie ersetzen?" + IDS_EXPORT_FILTER_CERT "DER-codiertes binäres X.509 (*.cer)" + IDS_EXPORT_FILTER_BASE64_CERT "Base64-codiertes X.509 (*.cer)" + IDS_EXPORT_FILTER_CRL "Zertifikatssperrliste (*.crl)" + IDS_EXPORT_FILTER_CTL "Zertifikatsvertrauensliste (*.stl)" + IDS_EXPORT_FILTER_CMS "CMS/PKCS #7 Zertifikate (*.p7b)" + IDS_EXPORT_FILTER_PFX "Privater Informationsaustausch (*.pfx)" + IDS_EXPORT_FILTER_SERIALIZED_CERT_STORE "Zertifikatsspeicher (*.sst)" + IDS_EXPORT_FORMAT "Dateiformat" + IDS_EXPORT_INCLUDE_CHAIN "Alle Zertifikate im Zertifizierungspfad einbeziehen" + IDS_EXPORT_KEYS "Schlüssel exportieren" + IDS_YES "Ja" + IDS_NO "Nein" + IDS_EXPORT_SUCCEEDED "Exportvorgang erfolgreich." + IDS_EXPORT_FAILED "Exportvorgang gescheitert." + IDS_EXPORT_PRIVATE_KEY_TITLE "Privaten Schlüssel exportieren" + IDS_EXPORT_PRIVATE_KEY_SUBTITLE "Das Zertifikat enthält einen privaten Schlüssel der eventuell mit dem Zertifikat exportiert wird." + IDS_EXPORT_PASSWORD_TITLE "Passwort eingeben" + IDS_EXPORT_PASSWORD_SUBTITLE "Der private Schlüssel sollte Passwortgeschützt sein." + IDS_EXPORT_PASSWORD_MISMATCH "Die Passwörter sind unterschiedlich." + IDS_EXPORT_PRIVATE_KEY_UNAVAILABLE "Hinweis: Der private Schlüssel des Zertifikats konnte nicht geöffnet werden." + IDS_EXPORT_PRIVATE_KEY_NON_EXPORTABLE "Hinweis: Der private Schlüssel des Zertifikats kann nicht exportiert werden." +} + +IDD_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236 +CAPTION "Allgemein" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", -1, "Static", WS_BORDER|SS_WHITERECT, 6,10,241,200 + CONTROL "", IDC_CERTIFICATE_ICON,"RichEdit20W", + ES_READONLY|WS_DISABLED,8,11,26,26 + CONTROL "", IDC_CERTIFICATE_INFO,"RichEdit20W", + ES_READONLY|WS_DISABLED,34,11,212,26 + CONTROL "", -1, "Static", SS_BLACKFRAME, 16,37,222,1 + CONTROL "", IDC_CERTIFICATE_STATUS,"RichEdit20W", + ES_READONLY|ES_MULTILINE,8,38,238,78 + CONTROL "", -1, "Static", SS_BLACKFRAME, 16,116,222,1 + CONTROL "", IDC_CERTIFICATE_NAMES,"RichEdit20W", + ES_READONLY|ES_MULTILINE|WS_DISABLED,8,118,238,90 + PUSHBUTTON "&Zertifikat installieren...", IDC_ADDTOSTORE,93,216,80,14 + PUSHBUTTON "Au&sstellererklärung", IDC_ISSUERSTATEMENT,177,216,70,14 +END + +IDD_DETAIL DIALOG DISCARDABLE 0, 0, 255, 236 +CAPTION "Details" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Anzeigen:", -1, 6,12,40,14 + COMBOBOX IDC_DETAIL_SELECT, 43,10,100,14, + CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP + CONTROL "", IDC_DETAIL_LIST, "SysListView32", + LVS_REPORT|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 6,28,241,100 + CONTROL "", IDC_DETAIL_VALUE, "RichEdit20W", + ES_READONLY|ES_MULTILINE|WS_TABSTOP, 6,136,241,70 + PUSHBUTTON "&Eigenschaften bearbeiten...", IDC_EDITPROPERTIES,75,216,98,14 + PUSHBUTTON "In &Datei kopieren...", IDC_EXPORT,177,216,70,14 +END + +IDD_HIERARCHY DIALOG DISCARDABLE 0, 0, 255, 236 +CAPTION "Zertifizierungspfad" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "&Zertifizierungspfad", -1,6,10,245,165, BS_GROUPBOX + CONTROL "",IDC_CERTPATH, "SysTreeView32", TVS_HASLINES|WS_BORDER, + 13,22,231,130 + PUSHBUTTON "&Zertifikat anzeigen", IDC_VIEWCERTIFICATE,175,156,70,14 + LTEXT "Zertifizierungs&status:", IDC_CERTIFICATESTATUS,6,183,70,14 + CONTROL "", IDC_CERTIFICATESTATUSTEXT,"RichEdit20W", + WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,195,245,36 +END + +IDD_USERNOTICE DIALOG DISCARDABLE 0, 0, 255, 256 +CAPTION "Haftungsausschluss" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", IDC_USERNOTICE,"RichEdit20W", + WS_BORDER|ES_READONLY|ES_MULTILINE|WS_DISABLED,6,10,241,200 + PUSHBUTTON "Schließen", IDOK,95,216,70,14 + PUSHBUTTON "weitere &Informationen", IDC_CPS,171,216,76,14 +END + +IDD_CERT_PROPERTIES_GENERAL DIALOG DISCARDABLE 0, 0, 255, 236 +CAPTION "Allgemein" +STYLE WS_VISIBLE +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Name:", -1, 6,14,60,14 + EDITTEXT IDC_FRIENDLY_NAME, 60,12,191,14, ES_AUTOHSCROLL|WS_TABSTOP + LTEXT "&Beschreibung:", -1, 6,32,60,14 + EDITTEXT IDC_DESCRIPTION, 60,30,191,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL + GROUPBOX "Zertifikatszwecke", -1,6,48,245,165, BS_GROUPBOX + AUTORADIOBUTTON "&Alle Zwecke für dieses Zertifikat aktivieren", + IDC_ENABLE_ALL_PURPOSES, 12,58,180,14, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "A&lle Zwecke für dieses Zertifikat deaktivieren", + IDC_DISABLE_ALL_PURPOSES, 12,70,180,14, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "Nur &folgende Zwecke aktivieren:", + IDC_ENABLE_SELECTED_PURPOSES, 12,82,180,14, BS_AUTORADIOBUTTON + CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 24,100,220,90 + PUSHBUTTON "&Zweck hinzufügen...", IDC_ADD_PURPOSE,173,194,71,14 +END + +IDD_ADD_CERT_PURPOSE DIALOG DISCARDABLE 0,0,200,68 +CAPTION "Zweck hinzufügen" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Geben Sie die Objekt-ID (OID) für den Zertifikatszweck an, den Sie hinzufügen möchten:", + -1, 6,6,190,28 + EDITTEXT IDC_NEW_PURPOSE, 6,28,190,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL + PUSHBUTTON "OK", IDOK, 33,48,60,14 + PUSHBUTTON "Abbrechen", IDCANCEL, 100,48,60,14 +END + +IDD_SELECT_STORE DIALOG DISCARDABLE 0,0,200,136 +CAPTION "Zertifikatsspeicher wählen" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Zertifikatsspeicher wählen den Sie benutzen möchten:", IDC_STORE_TEXT, 6,6,190,28 + CONTROL "",IDC_STORE_LIST, "SysTreeView32", TVS_HASLINES|WS_BORDER|WS_TABSTOP, + 6,28,188,70 + CHECKBOX "&Physikalischen Speicher anzeigen", IDC_SHOW_PHYSICAL_STORES, 6,102,90,14, + BS_AUTOCHECKBOX|WS_TABSTOP + PUSHBUTTON "OK", IDOK, 90,118,50,14, BS_DEFPUSHBUTTON + PUSHBUTTON "Abbrechen", IDCANCEL, 144,118,50,14 +END + +IDD_IMPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Importassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Willkommen", IDC_IMPORT_TITLE, + 115,1,195,40 + LTEXT "Dieser Assistent hilft ihnen Zertifikate, Zertifikatssperrlisten und Zertifikatsvertrauenslisten aus einer Datei zu importieren.", + -1, 115,33,195,24 + LTEXT "Ein Zertifikat dient zur Identifikation von Ihnen oder ihrem Computer. Es kann auch für die Authentifizierung und zum Unterzeichnen genutzt werden. Zertifikatsspeicher sind Sammlungen von Zertifikaten, Zertifikatssperrlisten und Zertifikatsvertrauenslisten.", + -1, 115,64,195,40 + LTEXT "Klicken Sie Weiter um fortzufahren.", + -1, 115,111,195,8 +END + +IDD_IMPORT_FILE DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Importassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Dateiname:", -1, 21,1,195,10 + EDITTEXT IDC_IMPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP + PUSHBUTTON "D&urchsuchen...", IDC_IMPORT_BROWSE_FILE, 236,11,60,14 + LTEXT "Hinweis: Es können mehrere Zertifikate in einer Datei folgender Formate gespeichert werden:", + -1, 21,26,265,16 + LTEXT "Syntaxstandard kryptografischer Meldungen /PKCS #7 Messages (.p7b)", + -1, 31,49,265,10 + LTEXT "Privater Informationsaustausch/PKCS #12 (.pfx, .p12)", + -1, 31,64,265,10 + LTEXT "Microsoft Speicher serieller Zertifikate (.sst)", + -1, 31,79,265,10 +END + +IDD_IMPORT_STORE DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Importassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Wine kann automatisch einen Zertifikatsspeicher wählen, oder Sie wählen einen aus.", + -1, 21,1,195,20 + AUTORADIOBUTTON "A&utomatisch einen Zertifikatsspeicher wählen", + IDC_IMPORT_AUTO_STORE, 31,18,180,12, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "&Alle Zertifikate im folgendem Zertifikatsspeicher speichern:", + IDC_IMPORT_SPECIFY_STORE, 31,30,180,12, BS_AUTORADIOBUTTON + EDITTEXT IDC_IMPORT_STORE, 44,49,185,14, ES_READONLY + PUSHBUTTON "&Durchsuchen...", IDC_IMPORT_BROWSE_STORE, 236,49,60,14 +END + +IDD_IMPORT_FINISH DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Importassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Fertigstellen des Assistenten", IDC_IMPORT_TITLE, + 115,1,195,40 + LTEXT "Importvorgang ordnungsgemäß abgeschlossen.", + -1, 115,33,195,24 + LTEXT "Sie haben folgende Einstellungen gewählt:", + -1, 115,57,195,12 + CONTROL "", IDC_IMPORT_SETTINGS, "SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 115,67,174,100 +END + +IDD_CERT_MGR DIALOG DISCARDABLE 0,0,335,270 +CAPTION "Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Geplanter Zweck:", -1, 7,9,100,12 + COMBOBOX IDC_MGR_PURPOSE_SELECTION, 83,7,245,14, + CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP + CONTROL "", IDC_MGR_STORES, "SysTabControl32", + WS_CLIPSIBLINGS|WS_TABSTOP, 7,25,321,140 + CONTROL "", IDC_MGR_CERTS, "SysListView32", + LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, 15,46,305,111 + PUSHBUTTON "&Importieren...", IDC_MGR_IMPORT, 7,172,51,14 + PUSHBUTTON "&Exportieren...", IDC_MGR_EXPORT, 62,172,51,14, WS_DISABLED + PUSHBUTTON "&Entfernen", IDC_MGR_REMOVE, 117,172,51,14, WS_DISABLED + PUSHBUTTON "&Erweitert...", IDC_MGR_ADVANCED, 277,172,51,14 + GROUPBOX "Beabsichtigte Zwecke des Zertifikates", -1,7,194,321,47, BS_GROUPBOX + LTEXT "", IDC_MGR_PURPOSES, 13,208,252,30 + PUSHBUTTON "&Anzeigen...", IDC_MGR_VIEW, 269,218,51,14, WS_DISABLED + PUSHBUTTON "&Schließen", IDCANCEL, 277,249,51,14, BS_DEFPUSHBUTTON +END + +IDD_CERT_MGR_ADVANCED DIALOG DISCARDABLE 0,0,248,176 +CAPTION "Erweiterte Optionen" +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Zertifikatszweck", -1, 7,7,234,141, BS_GROUPBOX + LTEXT "Wählen Sie mindestens einen Zweck, der als Erweitert aufgeführt werden soll.", + -1, 14,18,220,16 + LTEXT "&Zertifikatszwecke:", -1, 14,41,90,12, WS_TABSTOP + CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 14,51,220,90 + PUSHBUTTON "OK", IDOK, 132,155,51,14, BS_DEFPUSHBUTTON + PUSHBUTTON "Abbrechen", IDCANCEL, 190,155,51,14 +END + +IDD_EXPORT_WELCOME DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Exportassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Willkommen", IDC_EXPORT_TITLE, + 115,1,195,40 + LTEXT "Dieser Assistent hilft ihnen Zertifikate, Zertifikatssperrlisten und Zertifikatsvertrauenslisten in eine Datei zu exportieren.", + -1, 115,33,195,16 + LTEXT "Ein Zertifikat dient zur Identifikation von Ihnen oder ihrem Computer. Es kann auch für die Authentifizierung und zum Unterzeichnen genutzt werden. Zertifikatsspeicher sind Sammlungen von Zertifikaten, Zertifikatssperrlisten und Zertifikatsvertrauenslisten.", + -1, 115,56,195,40 + LTEXT "Klicken Sie Weiter um fortzufahren.", + -1, 115,103,195,8 +END + +IDD_EXPORT_PRIVATE_KEY DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Exportassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Wenn Sie sich entscheiden den privaten Schlüssel zu exportieren, werden Sie später nach einem Passwort gefragt.", -1, 21,1,195,23 + LTEXT "Privaten Schlüssel exportieren?", -1, 21,24,195,15 + AUTORADIOBUTTON "&Ja, privaten Schlüssel exportieren", + IDC_EXPORT_PRIVATE_KEY_YES, 31,36,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "&Nein, privaten Schlüssel nicht exportieren", + IDC_EXPORT_PRIVATE_KEY_NO, 31,48,200,12, BS_AUTORADIOBUTTON + LTEXT "", IDC_EXPORT_PRIVATE_KEY_UNAVAILABLE, 21,60,200,24 +END + +IDD_EXPORT_PASSWORD DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Exportassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Passwort:", -1, 21,1,195,10 + EDITTEXT IDC_EXPORT_PASSWORD, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP + LTEXT "Passwort &bestätigen:", -1, 21,35,195,10 + EDITTEXT IDC_EXPORT_PASSWORD_CONFIRM, 21,45,208,14, ES_AUTOHSCROLL|WS_TABSTOP +END + +IDD_EXPORT_FORMAT DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Exportassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Wählen Sie das gewünschte Format:", -1, 21,1,195,10 + AUTORADIOBUTTON "&DER-codiertes X.509 (.cer)", + IDC_EXPORT_FORMAT_DER, 31,18,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP + AUTORADIOBUTTON "B&ase64-codiertes X.509 (.cer):", + IDC_EXPORT_FORMAT_BASE64, 31,30,200,12, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "&Syntaxstandard kryptografischer Meldungen/PKCS #7 Zertifikate (.p7b)", + IDC_EXPORT_FORMAT_CMS, 31,42,250,12, BS_AUTORADIOBUTTON + CHECKBOX "&Wenn möglich alle Zertifikate im Zertifizierungspfad einbeziehen", + IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,250,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + AUTORADIOBUTTON "&Privater Informationsaustausch/PKCS #12 (.pfx)", + IDC_EXPORT_FORMAT_PFX, 31,72,250,12, BS_AUTORADIOBUTTON|WS_DISABLED + CHECKBOX "W&enn möglich alle Zertifikate im Zertifizierungspfad einbeziehen", + IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,250,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + CHECKBOX "&Verstärkte Sicherheit aktivieren", + IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,200,8, + BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED + CHECKBOX "Priva&ten Schlüssel löschen wenn der Export erfolgreich war", + IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,250,8, + BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED +END + +IDD_EXPORT_FILE DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Exportassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "&Dateiname:", -1, 21,1,195,10 + EDITTEXT IDC_EXPORT_FILENAME, 21,11,208,14, ES_AUTOHSCROLL|WS_TABSTOP + PUSHBUTTON "&Durchsuchen...", IDC_EXPORT_BROWSE_FILE, 236,11,60,14 +END + +IDD_EXPORT_FINISH DIALOG DISCARDABLE 0,0,317,143 +CAPTION "Exportassistent für die Zertifikatsverwaltung" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Fertigstellen des Assistenten", IDC_EXPORT_TITLE, + 115,1,195,40 + LTEXT "Exportvorgang ordnungsgemäß abgeschlossen.", + -1, 115,33,195,24 + LTEXT "Sie haben folgende Einstellungen gewählt:", + -1, 115,57,195,12 + CONTROL "", IDC_EXPORT_SETTINGS, "SysListView32", + LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, + 115,67,174,100 +END + +#pragma code_page(default) diff --git a/dlls/d3d10core/device.c b/dlls/d3d10core/device.c index 20e7c4632a6..030ed3924de 100644 --- a/dlls/d3d10core/device.c +++ b/dlls/d3d10core/device.c @@ -700,7 +700,7 @@ static HRESULT STDMETHODCALLTYPE d3d10_device_CreateTexture2D(ID3D10Device *ifac hr = IWineD3DDevice_CreateSurface(This->wined3d_device, desc->Width, desc->Height, wined3dformat_from_dxgi_format(desc->Format), FALSE, FALSE, 0, - &object->wined3d_surface, WINED3DRTYPE_SURFACE, desc->Usage, WINED3DPOOL_DEFAULT, + &object->wined3d_surface, desc->Usage, WINED3DPOOL_DEFAULT, desc->SampleDesc.Count > 1 ? desc->SampleDesc.Count : WINED3DMULTISAMPLE_NONE, desc->SampleDesc.Quality, SURFACE_OPENGL, (IUnknown *)object); if (FAILED(hr)) diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 6af8d1e7738..eb7cc1610d4 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -794,7 +794,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateIndexBuffer(LPDIRECT3DDEVICE8 i return hrc; } -static HRESULT IDirect3DDevice8Impl_CreateSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface8 **ppSurface,D3DRESOURCETYPE Type, UINT Usage,D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality) { +static HRESULT IDirect3DDevice8Impl_CreateSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, + D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface8 **ppSurface, + UINT Usage, D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality) +{ HRESULT hrc; IDirect3DSurface8Impl *object; IDirect3DDevice8Impl *This = (IDirect3DDevice8Impl *)iface; @@ -825,8 +828,8 @@ static HRESULT IDirect3DDevice8Impl_CreateSurface(LPDIRECT3DDEVICE8 iface, UINT EnterCriticalSection(&d3d8_cs); hrc = IWineD3DDevice_CreateSurface(This->WineD3DDevice, Width, Height, wined3dformat_from_d3dformat(Format), - Lockable, Discard, Level, &object->wineD3DSurface, Type, Usage & WINED3DUSAGE_MASK, - (WINED3DPOOL)Pool, MultiSample, MultisampleQuality, SURFACE_OPENGL, (IUnknown *)object); + Lockable, Discard, Level, &object->wineD3DSurface, Usage & WINED3DUSAGE_MASK, (WINED3DPOOL)Pool, + MultiSample, MultisampleQuality, SURFACE_OPENGL, (IUnknown *)object); LeaveCriticalSection(&d3d8_cs); if (hrc != D3D_OK || NULL == object->wineD3DSurface) { /* free up object */ @@ -845,7 +848,9 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 HRESULT hr; TRACE("Relay\n"); - hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, Lockable, FALSE /* Discard */, 0 /* Level */ , ppSurface, D3DRTYPE_SURFACE, D3DUSAGE_RENDERTARGET, D3DPOOL_DEFAULT, MultiSample, 0); + hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, Lockable, FALSE /* Discard */, + 0 /* Level */, ppSurface, D3DUSAGE_RENDERTARGET, D3DPOOL_DEFAULT, MultiSample, 0); + return hr; } @@ -854,9 +859,9 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DD TRACE("Relay\n"); /* TODO: Verify that Discard is false */ - hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Lockable */, FALSE, 0 /* Level */ - ,ppSurface, D3DRTYPE_SURFACE, D3DUSAGE_DEPTHSTENCIL, - D3DPOOL_DEFAULT, MultiSample, 0); + hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Lockable */, FALSE, + 0 /* Level */, ppSurface, D3DUSAGE_DEPTHSTENCIL, D3DPOOL_DEFAULT, MultiSample, 0); + return hr; } @@ -865,8 +870,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 HRESULT hr; TRACE("Relay\n"); - hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Loackable */ , FALSE /*Discard*/ , 0 /* Level */ , ppSurface, - D3DRTYPE_SURFACE, 0 /* Usage (undefined/none) */ , D3DPOOL_SYSTEMMEM, D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */); + hr = IDirect3DDevice8Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Lockable */, FALSE /* Discard */, + 0 /* Level */, ppSurface, 0 /* Usage (undefined/none) */, D3DPOOL_SYSTEMMEM, D3DMULTISAMPLE_NONE, + 0 /* MultisampleQuality */); + return hr; } @@ -2561,8 +2568,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSurface(IWineD3DDeviceParen hr = IDirect3DDevice8Impl_CreateSurface((IDirect3DDevice8 *)This, width, height, d3dformat_from_wined3dformat(format), lockable, FALSE /* Discard */, level, - (IDirect3DSurface8 **)&d3d_surface, D3DRTYPE_SURFACE, usage, pool, - D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */); + (IDirect3DSurface8 **)&d3d_surface, usage, pool, D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */); if (FAILED(hr)) { ERR("(%p) CreateSurface failed, returning %#x\n", iface, hr); diff --git a/dlls/d3d8/volume.c b/dlls/d3d8/volume.c index 474aad86230..4a7066c6f77 100644 --- a/dlls/d3d8/volume.c +++ b/dlls/d3d8/volume.c @@ -154,21 +154,21 @@ static HRESULT WINAPI IDirect3DVolume8Impl_GetDesc(LPDIRECT3DVOLUME8 iface, D3DV TRACE("(%p) Relay\n", This); - /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */ - wined3ddesc.Format = (WINED3DFORMAT *)&pDesc->Format; - wined3ddesc.Type = (WINED3DRESOURCETYPE *)&pDesc->Type; - wined3ddesc.Usage = &pDesc->Usage; - wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool; - wined3ddesc.Size = &pDesc->Size; - wined3ddesc.Width = &pDesc->Width; - wined3ddesc.Height = &pDesc->Height; - wined3ddesc.Depth = &pDesc->Depth; - EnterCriticalSection(&d3d8_cs); hr = IWineD3DVolume_GetDesc(This->wineD3DVolume, &wined3ddesc); LeaveCriticalSection(&d3d8_cs); - if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(pDesc->Format); + if (SUCCEEDED(hr)) + { + pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format); + pDesc->Type = wined3ddesc.Type; + pDesc->Usage = wined3ddesc.Usage; + pDesc->Pool = wined3ddesc.Pool; + pDesc->Size = wined3ddesc.Size; + pDesc->Width = wined3ddesc.Width; + pDesc->Height = wined3ddesc.Height; + pDesc->Depth = wined3ddesc.Depth; + } return hr; } diff --git a/dlls/d3d8/volumetexture.c b/dlls/d3d8/volumetexture.c index 098827aedd8..25aa93dc698 100644 --- a/dlls/d3d8/volumetexture.c +++ b/dlls/d3d8/volumetexture.c @@ -197,26 +197,25 @@ static DWORD WINAPI IDirect3DVolumeTexture8Impl_GetLevelCount(LPDIRECT3DVOLUMETE static HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetLevelDesc(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level, D3DVOLUME_DESC* pDesc) { IDirect3DVolumeTexture8Impl *This = (IDirect3DVolumeTexture8Impl *)iface; WINED3DVOLUME_DESC wined3ddesc; - UINT tmpInt = -1; HRESULT hr; TRACE("(%p) Relay\n", This); - /* As d3d8 and d3d8 structures differ, pass in ptrs to where data needs to go */ - wined3ddesc.Format = (WINED3DFORMAT *)&pDesc->Format; - wined3ddesc.Type = (WINED3DRESOURCETYPE *)&pDesc->Type; - wined3ddesc.Usage = &pDesc->Usage; - wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool; - wined3ddesc.Size = &tmpInt; - wined3ddesc.Width = &pDesc->Width; - wined3ddesc.Height = &pDesc->Height; - wined3ddesc.Depth = &pDesc->Depth; - EnterCriticalSection(&d3d8_cs); hr = IWineD3DVolumeTexture_GetLevelDesc(This->wineD3DVolumeTexture, Level, &wined3ddesc); LeaveCriticalSection(&d3d8_cs); - if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(pDesc->Format); + if (SUCCEEDED(hr)) + { + pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format); + pDesc->Type = wined3ddesc.Type; + pDesc->Usage = wined3ddesc.Usage; + pDesc->Pool = wined3ddesc.Pool; + pDesc->Size = wined3ddesc.Size; + pDesc->Width = wined3ddesc.Width; + pDesc->Height = wined3ddesc.Height; + pDesc->Depth = wined3ddesc.Depth; + } return hr; } diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index 8f95ad11114..9d02539a982 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -454,15 +454,8 @@ static HRESULT WINAPI reset_enum_callback(IWineD3DResource *resource, void *data break; case D3DRTYPE_VOLUME: - volume_desc.Format = &dummy_format; - volume_desc.Type = &type; - volume_desc.Usage = &dummy_dword; - volume_desc.Pool = &pool; - volume_desc.Size = &dummy_dword; - volume_desc.Width = &dummy_dword; - volume_desc.Height = &dummy_dword; - volume_desc.Depth = &dummy_dword; IWineD3DVolume_GetDesc((IWineD3DVolume *) resource, &volume_desc); + pool = volume_desc.Pool; break; case D3DRTYPE_INDEXBUFFER: @@ -647,7 +640,10 @@ static void WINAPI IDirect3DDevice9Impl_GetGammaRamp(LPDIRECT3DDEVICE9EX iface, } -static HRESULT IDirect3DDevice9Impl_CreateSurface(LPDIRECT3DDEVICE9EX iface, UINT Width, UINT Height, D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface9 **ppSurface,D3DRESOURCETYPE Type, UINT Usage, D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality,HANDLE* pSharedHandle ) { +static HRESULT IDirect3DDevice9Impl_CreateSurface(LPDIRECT3DDEVICE9EX iface, UINT Width, UINT Height, + D3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IDirect3DSurface9 **ppSurface, + UINT Usage, D3DPOOL Pool, D3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality) +{ HRESULT hrc; IDirect3DSurface9Impl *object; IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface; @@ -678,8 +674,8 @@ static HRESULT IDirect3DDevice9Impl_CreateSurface(LPDIRECT3DDEVICE9EX iface, UIN EnterCriticalSection(&d3d9_cs); hrc = IWineD3DDevice_CreateSurface(This->WineD3DDevice, Width, Height, wined3dformat_from_d3dformat(Format), - Lockable, Discard, Level, &object->wineD3DSurface, Type, Usage & WINED3DUSAGE_MASK, - (WINED3DPOOL)Pool, MultiSample, MultisampleQuality, SURFACE_OPENGL, (IUnknown *)object); + Lockable, Discard, Level, &object->wineD3DSurface, Usage & WINED3DUSAGE_MASK, (WINED3DPOOL)Pool, + MultiSample, MultisampleQuality, SURFACE_OPENGL, (IUnknown *)object); LeaveCriticalSection(&d3d9_cs); if (hrc != D3D_OK || NULL == object->wineD3DSurface) { @@ -705,8 +701,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_CreateRenderTarget(LPDIRECT3DDEVICE HRESULT hr; TRACE("Relay\n"); - hr = IDirect3DDevice9Impl_CreateSurface(iface,Width,Height,Format,Lockable,FALSE/*Discard*/, 0/*Level*/, ppSurface,D3DRTYPE_SURFACE,D3DUSAGE_RENDERTARGET,D3DPOOL_DEFAULT,MultiSample,MultisampleQuality,pSharedHandle); - return hr; + hr = IDirect3DDevice9Impl_CreateSurface(iface, Width, Height, Format, Lockable, FALSE /* Discard */, + 0 /* Level */, ppSurface, D3DUSAGE_RENDERTARGET, D3DPOOL_DEFAULT, MultiSample, MultisampleQuality); + + return hr; } static HRESULT WINAPI IDirect3DDevice9Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE9EX iface, UINT Width, UINT Height, @@ -716,10 +714,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_CreateDepthStencilSurface(LPDIRECT3 HRESULT hr; TRACE("Relay\n"); - hr = IDirect3DDevice9Impl_CreateSurface(iface,Width,Height,Format,TRUE/* Lockable */,Discard, 0/* Level */ - ,ppSurface,D3DRTYPE_SURFACE,D3DUSAGE_DEPTHSTENCIL, - D3DPOOL_DEFAULT,MultiSample,MultisampleQuality,pSharedHandle); - return hr; + hr = IDirect3DDevice9Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Lockable */, Discard, + 0 /* Level */, ppSurface, D3DUSAGE_DEPTHSTENCIL, D3DPOOL_DEFAULT, MultiSample, MultisampleQuality); + + return hr; } @@ -804,7 +802,7 @@ static HRESULT WINAPI IDirect3DDevice9Impl_ColorFill(LPDIRECT3DDEVICE9EX iface /* This method is only allowed with surfaces that are render targets, or offscreen plain surfaces * in D3DPOOL_DEFAULT */ - if(!(usage & WINED3DUSAGE_RENDERTARGET) && (pool != D3DPOOL_DEFAULT || restype != D3DRTYPE_SURFACE)) { + if(!(usage & WINED3DUSAGE_RENDERTARGET) && (pool != WINED3DPOOL_DEFAULT || restype != WINED3DRTYPE_SURFACE)) { LeaveCriticalSection(&d3d9_cs); WARN("Surface is not a render target, or not a stand-alone D3DPOOL_DEFAULT surface\n"); return D3DERR_INVALIDCALL; @@ -831,7 +829,9 @@ static HRESULT WINAPI IDirect3DDevice9Impl_CreateOffscreenPlainSurface(LPDIREC Why, their always lockable? should I change the usage to dynamic? */ - hr = IDirect3DDevice9Impl_CreateSurface(iface,Width,Height,Format,TRUE/*Loackable*/,FALSE/*Discard*/,0/*Level*/ , ppSurface,D3DRTYPE_SURFACE, 0/*Usage (undefined/none)*/,(WINED3DPOOL) Pool,D3DMULTISAMPLE_NONE,0/*MultisampleQuality*/,pSharedHandle); + hr = IDirect3DDevice9Impl_CreateSurface(iface, Width, Height, Format, TRUE /* Lockable */, FALSE /* Discard */, + 0 /* Level */, ppSurface, 0 /* Usage (undefined/none) */, (WINED3DPOOL)Pool, D3DMULTISAMPLE_NONE, + 0 /* MultisampleQuality */); return hr; } @@ -2007,8 +2007,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSurface(IWineD3DDeviceParen hr = IDirect3DDevice9Impl_CreateSurface((IDirect3DDevice9Ex *)This, width, height, d3dformat_from_wined3dformat(format), lockable, FALSE /* Discard */, level, - (IDirect3DSurface9 **)&d3d_surface, D3DRTYPE_SURFACE, usage, pool, - D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */, NULL); + (IDirect3DSurface9 **)&d3d_surface, usage, pool, D3DMULTISAMPLE_NONE, 0 /* MultisampleQuality */); if (FAILED(hr)) { ERR("(%p) CreateSurface failed, returning %#x\n", iface, hr); diff --git a/dlls/d3d9/volume.c b/dlls/d3d9/volume.c index 93b06b53158..7c49a9aaad2 100644 --- a/dlls/d3d9/volume.c +++ b/dlls/d3d9/volume.c @@ -167,29 +167,26 @@ static HRESULT WINAPI IDirect3DVolume9Impl_GetContainer(LPDIRECT3DVOLUME9 iface, static HRESULT WINAPI IDirect3DVolume9Impl_GetDesc(LPDIRECT3DVOLUME9 iface, D3DVOLUME_DESC* pDesc) { IDirect3DVolume9Impl *This = (IDirect3DVolume9Impl *)iface; WINED3DVOLUME_DESC wined3ddesc; - UINT tmpInt = -1; - WINED3DFORMAT format; HRESULT hr; TRACE("(%p) Relay\n", This); - /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */ - wined3ddesc.Format = &format; - wined3ddesc.Type = (WINED3DRESOURCETYPE *)&pDesc->Type; - wined3ddesc.Usage = &pDesc->Usage; - wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool; - wined3ddesc.Size = &tmpInt; - wined3ddesc.Width = &pDesc->Width; - wined3ddesc.Height = &pDesc->Height; - wined3ddesc.Depth = &pDesc->Depth; - EnterCriticalSection(&d3d9_cs); hr = IWineD3DVolume_GetDesc(This->wineD3DVolume, &wined3ddesc); LeaveCriticalSection(&d3d9_cs); - if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(format); + if (SUCCEEDED(hr)) + { + pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format); + pDesc->Type = wined3ddesc.Type; + pDesc->Usage = wined3ddesc.Usage; + pDesc->Pool = wined3ddesc.Pool; + pDesc->Width = wined3ddesc.Width; + pDesc->Height = wined3ddesc.Height; + pDesc->Depth = wined3ddesc.Depth; + } return hr; } diff --git a/dlls/d3d9/volumetexture.c b/dlls/d3d9/volumetexture.c index 07b686fe5a4..efeb919b57c 100644 --- a/dlls/d3d9/volumetexture.c +++ b/dlls/d3d9/volumetexture.c @@ -281,29 +281,26 @@ static void WINAPI IDirect3DVolumeTexture9Impl_GenerateMipSubLevels(LPDIRECT3DVO static HRESULT WINAPI IDirect3DVolumeTexture9Impl_GetLevelDesc(LPDIRECT3DVOLUMETEXTURE9 iface, UINT Level, D3DVOLUME_DESC* pDesc) { IDirect3DVolumeTexture9Impl *This = (IDirect3DVolumeTexture9Impl *)iface; WINED3DVOLUME_DESC wined3ddesc; - UINT tmpInt = -1; - WINED3DFORMAT format; HRESULT hr; TRACE("(%p) Relay\n", This); - /* As d3d8 and d3d9 structures differ, pass in ptrs to where data needs to go */ - wined3ddesc.Format = &format; - wined3ddesc.Type = (WINED3DRESOURCETYPE *)&pDesc->Type; - wined3ddesc.Usage = &pDesc->Usage; - wined3ddesc.Pool = (WINED3DPOOL *) &pDesc->Pool; - wined3ddesc.Size = &tmpInt; - wined3ddesc.Width = &pDesc->Width; - wined3ddesc.Height = &pDesc->Height; - wined3ddesc.Depth = &pDesc->Depth; - EnterCriticalSection(&d3d9_cs); hr = IWineD3DVolumeTexture_GetLevelDesc(This->wineD3DVolumeTexture, Level, &wined3ddesc); LeaveCriticalSection(&d3d9_cs); - if (SUCCEEDED(hr)) pDesc->Format = d3dformat_from_wined3dformat(format); + if (SUCCEEDED(hr)) + { + pDesc->Format = d3dformat_from_wined3dformat(wined3ddesc.Format); + pDesc->Type = wined3ddesc.Type; + pDesc->Usage = wined3ddesc.Usage; + pDesc->Pool = wined3ddesc.Pool; + pDesc->Width = wined3ddesc.Width; + pDesc->Height = wined3ddesc.Height; + pDesc->Depth = wined3ddesc.Depth; + } return hr; } diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c index e6db2c8aedf..bfd716d0638 100644 --- a/dlls/ddraw/ddraw.c +++ b/dlls/ddraw/ddraw.c @@ -1729,7 +1729,7 @@ IDirectDrawImpl_RecreateSurfacesCallback(IDirectDrawSurface7 *surf, /* Create the new surface */ hr = IWineD3DDevice_CreateSurface(This->wineD3DDevice, Width, Height, Format, TRUE /* Lockable */, FALSE /* Discard */, surfImpl->mipmap_level, &surfImpl->WineD3DSurface, - Type, Usage, Pool, MultiSampleType, MultiSampleQuality, This->ImplType, Parent); + Usage, Pool, MultiSampleType, MultiSampleQuality, This->ImplType, Parent); if(hr != D3D_OK) return hr; @@ -1842,7 +1842,7 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This, HRESULT hr; UINT Width = 0, Height = 0; WINED3DFORMAT Format = WINED3DFMT_UNKNOWN; - WINED3DRESOURCETYPE ResType = WINED3DRTYPE_SURFACE; + WINED3DRESOURCETYPE ResType; DWORD Usage = 0; WINED3DSURFTYPE ImplType = This->ImplType; WINED3DSURFACE_DESC Desc; @@ -2026,8 +2026,8 @@ IDirectDrawImpl_CreateNewSurface(IDirectDrawImpl *This, /* Now create the WineD3D Surface */ hr = IWineD3DDevice_CreateSurface(This->wineD3DDevice, pDDSD->dwWidth, pDDSD->dwHeight, Format, - TRUE /* Lockable */, FALSE /* Discard */, level, &(*ppSurf)->WineD3DSurface, ResType, Usage, - Pool, WINED3DMULTISAMPLE_NONE, 0 /* MultiSampleQuality */, ImplType, Parent); + TRUE /* Lockable */, FALSE /* Discard */, level, &(*ppSurf)->WineD3DSurface, + Usage, Pool, WINED3DMULTISAMPLE_NONE, 0 /* MultiSampleQuality */, ImplType, Parent); if(hr != D3D_OK) { diff --git a/dlls/gdi32/region.c b/dlls/gdi32/region.c index f9d078c0619..f3c5e133c42 100644 --- a/dlls/gdi32/region.c +++ b/dlls/gdi32/region.c @@ -1144,27 +1144,45 @@ BOOL WINAPI RectInRegion( HRGN hrgn, const RECT *rect ) { RGNOBJ * obj; BOOL ret = FALSE; + RECT rc; + + /* swap the coordinates to make right >= left and bottom >= top */ + /* (region building rectangles are normalized the same way) */ + if( rect->top > rect->bottom) { + rc.top = rect->bottom; + rc.bottom = rect->top; + } else { + rc.top = rect->top; + rc.bottom = rect->bottom; + } + if( rect->right < rect->left) { + rc.right = rect->left; + rc.left = rect->right; + } else { + rc.right = rect->right; + rc.left = rect->left; + } if ((obj = GDI_GetObjPtr( hrgn, OBJ_REGION ))) { RECT *pCurRect, *pRectEnd; /* this is (just) a useful optimization */ - if ((obj->rgn.numRects > 0) && EXTENTCHECK(&obj->rgn.extents, rect)) + if ((obj->rgn.numRects > 0) && EXTENTCHECK(&obj->rgn.extents, &rc)) { for (pCurRect = obj->rgn.rects, pRectEnd = pCurRect + obj->rgn.numRects; pCurRect < pRectEnd; pCurRect++) { - if (pCurRect->bottom <= rect->top) + if (pCurRect->bottom <= rc.top) continue; /* not far enough down yet */ - if (pCurRect->top >= rect->bottom) + if (pCurRect->top >= rc.bottom) break; /* too far down */ - if (pCurRect->right <= rect->left) + if (pCurRect->right <= rc.left) continue; /* not far enough over yet */ - if (pCurRect->left >= rect->right) { + if (pCurRect->left >= rc.right) { continue; } diff --git a/dlls/gdi32/tests/gdiobj.c b/dlls/gdi32/tests/gdiobj.c index 67a135e3cb9..c1adc0f57f9 100644 --- a/dlls/gdi32/tests/gdiobj.c +++ b/dlls/gdi32/tests/gdiobj.c @@ -266,9 +266,49 @@ static void test_GetCurrentObject(void) DeleteDC(hdc); } +static void test_region(void) +{ + HRGN hrgn = CreateRectRgn(10, 10, 20, 20); + RECT rc = { 5, 5, 15, 15 }; + BOOL ret = RectInRegion( hrgn, &rc); + ok( ret, "RectInRegion should return TRUE\n"); + /* swap left and right */ + SetRect( &rc, 15, 5, 5, 15 ); + ret = RectInRegion( hrgn, &rc); + ok( ret, "RectInRegion should return TRUE\n"); + /* swap top and bottom */ + SetRect( &rc, 5, 15, 15, 5 ); + ret = RectInRegion( hrgn, &rc); + ok( ret, "RectInRegion should return TRUE\n"); + /* swap both */ + SetRect( &rc, 15, 15, 5, 5 ); + ret = RectInRegion( hrgn, &rc); + ok( ret, "RectInRegion should return TRUE\n"); + DeleteObject(hrgn); + /* swap left and right in the region */ + hrgn = CreateRectRgn(20, 10, 10, 20); + SetRect( &rc, 5, 5, 15, 15 ); + ret = RectInRegion( hrgn, &rc); + ok( ret, "RectInRegion should return TRUE\n"); + /* swap left and right */ + SetRect( &rc, 15, 5, 5, 15 ); + ret = RectInRegion( hrgn, &rc); + ok( ret, "RectInRegion should return TRUE\n"); + /* swap top and bottom */ + SetRect( &rc, 5, 15, 15, 5 ); + ret = RectInRegion( hrgn, &rc); + ok( ret, "RectInRegion should return TRUE\n"); + /* swap both */ + SetRect( &rc, 15, 15, 5, 5 ); + ret = RectInRegion( hrgn, &rc); + ok( ret, "RectInRegion should return TRUE\n"); + DeleteObject(hrgn); +} + START_TEST(gdiobj) { test_gdi_objects(); test_thread_objects(); test_GetCurrentObject(); + test_region(); } diff --git a/dlls/gdiplus/brush.c b/dlls/gdiplus/brush.c index 92052f74ec3..824ece0fc85 100644 --- a/dlls/gdiplus/brush.c +++ b/dlls/gdiplus/brush.c @@ -1315,6 +1315,13 @@ GpStatus WINGDIPAPI GdipSetPathGradientBlend(GpPathGradient *brush, GDIPCONST RE return NotImplemented; } +GpStatus WINGDIPAPI GdipSetPathGradientPresetBlend(GpPathGradient *brush, + GDIPCONST ARGB *blend, GDIPCONST REAL *pos, INT count) +{ + FIXME("(%p,%p,%p,%i): stub\n", brush, blend, pos, count); + return NotImplemented; +} + GpStatus WINGDIPAPI GdipSetPathGradientCenterColor(GpPathGradient *grad, ARGB argb) { diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec index c658e002dfc..03c9629d2d8 100644 --- a/dlls/gdiplus/gdiplus.spec +++ b/dlls/gdiplus/gdiplus.spec @@ -169,7 +169,7 @@ @ stub GdipDrawCurve3I @ stdcall GdipDrawCurve(ptr ptr ptr long) @ stdcall GdipDrawCurveI(ptr ptr ptr long) -@ stub GdipDrawDriverString +@ stdcall GdipDrawDriverString(ptr ptr long ptr ptr ptr long ptr) @ stdcall GdipDrawEllipse(ptr ptr long long long long) @ stdcall GdipDrawEllipseI(ptr ptr long long long long) @ stdcall GdipDrawImage(ptr ptr long long) @@ -401,7 +401,7 @@ @ stdcall GdipGetTextureTransform(ptr ptr) @ stdcall GdipGetTextureWrapMode(ptr ptr) @ stub GdipGetVisibleClipBounds -@ stub GdipGetVisibleClipBoundsI +@ stdcall GdipGetVisibleClipBoundsI(ptr ptr) @ stdcall GdipGetWorldTransform(ptr ptr) @ stdcall GdipGraphicsClear(ptr long) @ stub GdipGraphicsSetAbort @@ -440,7 +440,7 @@ @ stdcall GdipLoadImageFromStream(ptr ptr) @ stdcall GdipLoadImageFromStreamICM(ptr ptr) @ stdcall GdipMeasureCharacterRanges(ptr wstr long ptr ptr ptr long ptr) -@ stub GdipMeasureDriverString +@ stdcall GdipMeasureDriverString(ptr ptr long ptr ptr long ptr ptr) @ stdcall GdipMeasureString(ptr wstr long ptr ptr ptr ptr ptr ptr) @ stub GdipMultiplyLineTransform @ stdcall GdipMultiplyMatrix(ptr ptr long) @@ -556,7 +556,7 @@ @ stdcall GdipSetPathGradientGammaCorrection(ptr long) @ stub GdipSetPathGradientLinearBlend @ stub GdipSetPathGradientPath -@ stub GdipSetPathGradientPresetBlend +@ stdcall GdipSetPathGradientPresetBlend(ptr ptr ptr long) @ stdcall GdipSetPathGradientSigmaBlend(ptr long long) @ stdcall GdipSetPathGradientSurroundColorsWithCount(ptr ptr ptr) @ stub GdipSetPathGradientTransform diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 269815933f9..85ecf43646b 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -955,7 +955,7 @@ GpStatus WINGDIPAPI GdipCreateFromHDC2(HDC hdc, HANDLE hDevice, GpGraphics **gra TRACE("(%p, %p, %p)\n", hdc, hDevice, graphics); if(hDevice != NULL) { - FIXME("Don't know how to hadle parameter hDevice\n"); + FIXME("Don't know how to handle parameter hDevice\n"); return NotImplemented; } @@ -1459,7 +1459,13 @@ GpStatus WINGDIPAPI GdipDrawCurve2(GpGraphics *graphics, GpPen *pen, if(graphics->busy) return ObjectBusy; + if(count < 2) + return InvalidParameter; + pt = GdipAlloc(len_pt * sizeof(GpPointF)); + if(!pt) + return OutOfMemory; + tension = tension * TENSION_CONST; calc_curve_bezier_endp(points[0].X, points[0].Y, points[1].X, points[1].Y, @@ -3839,3 +3845,36 @@ GpStatus WINGDIPAPI GdipTranslateClipI(GpGraphics *graphics, INT dx, INT dy) return GdipTranslateRegion(graphics->clip, (REAL)dx, (REAL)dy); } + + +/***************************************************************************** + * GdipMeasureDriverString [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipMeasureDriverString(GpGraphics *graphics, GDIPCONST UINT16 *text, INT length, + GDIPCONST GpFont *font, GDIPCONST PointF *positions, + INT flags, GDIPCONST GpMatrix *matrix, RectF *boundingBox) +{ + FIXME("(%p %p %d %p %p %d %p %p): stub\n", graphics, text, length, font, positions, flags, matrix, boundingBox); + return NotImplemented; +} + +/***************************************************************************** + * GdipGetVisibleClipBoundsI [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipGetVisibleClipBoundsI(GpGraphics *graphics, GpRect *rect) +{ + FIXME("(%p %p): stub\n", graphics, rect); + return NotImplemented; +} + +/***************************************************************************** + * GdipDrawDriverString [GDIPLUS.@] + */ +GpStatus WINGDIPAPI GdipDrawDriverString(GpGraphics *graphics, GDIPCONST UINT16 *text, INT length, + GDIPCONST GpFont *font, GDIPCONST GpBrush *brush, + GDIPCONST PointF *positions, INT flags, + GDIPCONST GpMatrix *matrix ) +{ + FIXME("(%p %p %d %p %p %p %d %p): stub \n", graphics, text, length, font, brush, positions, flags, matrix); + return NotImplemented; +} diff --git a/dlls/gdiplus/tests/graphics.c b/dlls/gdiplus/tests/graphics.c index 61143c6ec98..668d2618e55 100644 --- a/dlls/gdiplus/tests/graphics.c +++ b/dlls/gdiplus/tests/graphics.c @@ -367,6 +367,67 @@ static void test_GdipDrawBezierI(void) ReleaseDC(0, hdc); } +static void test_GdipDrawCurve(void) +{ + GpStatus status; + GpGraphics *graphics = NULL; + GpPen *pen = NULL; + HDC hdc = GetDC(0); + GpPointF points[3]; + + points[0].X = 0; + points[0].Y = 0; + + points[1].X = 40; + points[1].Y = 20; + + points[2].X = 10; + points[2].Y = 40; + + /* make a graphics object and pen object */ + ok(hdc != NULL, "Expected HDC to be initialized\n"); + + status = GdipCreateFromHDC(hdc, &graphics); + expect(Ok, status); + ok(graphics != NULL, "Expected graphics to be initialized\n"); + + status = GdipCreatePen1((ARGB)0xffff00ff, 10.0f, UnitPixel, &pen); + expect(Ok, status); + ok(pen != NULL, "Expected pen to be initialized\n"); + + /* InvalidParameter cases: null graphics, null pen */ + status = GdipDrawCurve(NULL, NULL, points, 3); + expect(InvalidParameter, status); + + status = GdipDrawCurve(graphics, NULL, points, 3); + expect(InvalidParameter, status); + + status = GdipDrawCurve(NULL, pen, points, 3); + expect(InvalidParameter, status); + + /* InvalidParameter cases: invalid count */ + status = GdipDrawCurve(graphics, pen, points, -1); + expect(InvalidParameter, status); + + status = GdipDrawCurve(graphics, pen, points, 0); + expect(InvalidParameter, status); + + status = GdipDrawCurve(graphics, pen, points, 1); + expect(InvalidParameter, status); + + /* Valid test cases */ + status = GdipDrawCurve(graphics, pen, points, 2); + expect(Ok, status); + + status = GdipDrawCurve(graphics, pen, points, 3); + expect(Ok, status); + + GdipDeletePen(pen); + GdipDeleteGraphics(graphics); + + ReleaseDC(0, hdc); +} + static void test_GdipDrawLineI(void) { GpStatus status; @@ -1095,6 +1156,7 @@ START_TEST(graphics) test_GdipDrawBezierI(); test_GdipDrawArc(); test_GdipDrawArcI(); + test_GdipDrawCurve(); test_GdipDrawLineI(); test_GdipDrawLinesI(); test_GdipDrawString(); diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c index e17ad268f56..1dd9b964937 100644 --- a/dlls/jscript/date.c +++ b/dlls/jscript/date.c @@ -83,6 +83,148 @@ static const WCHAR setUTCMonthW[] = {'s','e','t','U','T','C','M','o','n','t','h' static const WCHAR setFullYearW[] = {'s','e','t','F','u','l','l','Y','e','a','r',0}; static const WCHAR setUTCFullYearW[] = {'s','e','t','U','T','C','F','u','l','l','Y','e','a','r',0}; +/*ECMA-262 3th Edition 15.9.1.2 */ +#define MS_PER_DAY 86400000 +#define MS_PER_HOUR 3600000 +#define MS_PER_MINUTE 60000 + +/* ECMA-262 3th Edition 15.9.1.2 */ +static inline DOUBLE day(DOUBLE time) +{ + return floor(time / MS_PER_DAY); +} + +/* ECMA-262 3th Edition 15.9.1.3 */ +static inline DOUBLE days_in_year(DOUBLE year) +{ + int y; + + if(year != (int)year) + return ret_nan(); + + y = year; + if(y%4 != 0) return 365; + if(y%100 != 0) return 366; + if(y%400 != 0) return 365; + return 366; +} + +/* ECMA-262 3th Edition 15.9.1.3 */ +static inline DOUBLE day_from_year(DOUBLE year) +{ + int y; + + if(year != (int)year) + return ret_nan(); + + y = year; + return 365*(y-1970) + floor((y-1969)/4) + - floor((y-1901)/100) + floor((y-1601)/400); +} + +/* ECMA-262 3th Edition 15.9.1.3 */ +static inline DOUBLE time_from_year(DOUBLE year) +{ + return MS_PER_DAY*day_from_year(year); +} + +/* ECMA-262 3th Edition 15.9.1.3 */ +static inline DOUBLE year_from_time(DOUBLE time) +{ + int y; + + if(isnan(time)) + return ret_nan(); + + y = 1970 + time/365.25/MS_PER_DAY; + + if(time_from_year(y) > time) + while(time_from_year(y) > time) y--; + else + while(time_from_year(y+1)<=time) y++; + + return y; +} + +/* ECMA-262 3th Edition 15.9.1.3 */ +static inline int in_leap_year(DOUBLE time) +{ + if(days_in_year(year_from_time(time))==366) + return 1; + return 0; +} + +/* ECMA-262 3th Edition 15.9.1.4 */ +static inline int day_within_year(DOUBLE time) +{ + return day(time) - day_from_year(year_from_time(time)); +} + +/* ECMA-262 3th Edition 15.9.1.4 */ +static inline DOUBLE month_from_time(DOUBLE time) +{ + int ily = in_leap_year(time); + int dwy = day_within_year(time); + + if(isnan(time)) + return ret_nan(); + + if(0<=dwy && dwy<31) return 0; + if(dwy < 59+ily) return 1; + if(dwy < 90+ily) return 2; + if(dwy < 120+ily) return 3; + if(dwy < 151+ily) return 4; + if(dwy < 181+ily) return 5; + if(dwy < 212+ily) return 6; + if(dwy < 243+ily) return 7; + if(dwy < 273+ily) return 8; + if(dwy < 304+ily) return 9; + if(dwy < 334+ily) return 10; + return 11; +} + +/* ECMA-262 3th Edition 15.9.1.5 */ +static inline DOUBLE date_from_time(DOUBLE time) +{ + int dwy = day_within_year(time); + int ily = in_leap_year(time); + int mft = month_from_time(time); + + if(isnan(time)) + return ret_nan(); + + if(mft==0) return dwy+1; + if(mft==1) return dwy-30; + if(mft==2) return dwy-58-ily; + if(mft==3) return dwy-89-ily; + if(mft==4) return dwy-119-ily; + if(mft==5) return dwy-150-ily; + if(mft==6) return dwy-180-ily; + if(mft==7) return dwy-211-ily; + if(mft==8) return dwy-242-ily; + if(mft==9) return dwy-272-ily; + if(mft==10) return dwy-303-ily; + return dwy-333-ily; +} + +/* ECMA-262 3th Edition 15.9.1.6 */ +static inline DOUBLE week_day(DOUBLE time) +{ + if(isnan(time)) + return ret_nan(); + + return (int)(day(time)+4) % 7; +} + +/* ECMA-262 3th Edition 15.9.1.10 */ +static inline DOUBLE hour_from_time(DOUBLE time) +{ + if(isnan(time)) + return ret_nan(); + + return (int)floor(time/MS_PER_HOUR) % 24; +} + /* ECMA-262 3rd Edition 15.9.1.14 */ static inline DOUBLE time_clip(DOUBLE time) { @@ -188,74 +330,194 @@ static HRESULT Date_getTime(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAM return S_OK; } +/* ECMA-262 3th Edition 15.9.1.3 */ static HRESULT Date_getFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + + num_set_val(retv, year_from_time(time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.3 */ static HRESULT Date_getUTCFullYear(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, year_from_time(date->time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.4 */ static HRESULT Date_getMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + + num_set_val(retv, month_from_time(time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.4 */ static HRESULT Date_getUTCMonth(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, month_from_time(date->time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.5 */ static HRESULT Date_getDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + + num_set_val(retv, date_from_time(time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.5 */ static HRESULT Date_getUTCDate(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, date_from_time(date->time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.6 */ static HRESULT Date_getDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + + num_set_val(retv, week_day(time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.6 */ static HRESULT Date_getUTCDay(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, week_day(date->time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.10 */ static HRESULT Date_getHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + DOUBLE time = date->time - date->bias*MS_PER_MINUTE; + + num_set_val(retv, hour_from_time(time)); + } + return S_OK; } +/* ECMA-262 3th Edition 15.9.1.10 */ static HRESULT Date_getUTCHours(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { - FIXME("\n"); - return E_NOTIMPL; + TRACE("\n"); + + if(!is_class(dispex, JSCLASS_DATE)) { + FIXME("throw TypeError\n"); + return E_FAIL; + } + + if(retv) { + DateInstance *date = (DateInstance*)dispex; + num_set_val(retv, hour_from_time(date->time)); + } + return S_OK; } static HRESULT Date_getMinutes(DispatchEx *dispex, LCID lcid, WORD flags, DISPPARAMS *dp, diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js index 1f922b902b3..ceb314f2a99 100644 --- a/dlls/jscript/tests/api.js +++ b/dlls/jscript/tests/api.js @@ -945,6 +945,32 @@ ok(date.setTime(123) === 123, "date.setTime(123) !== 123"); ok(date.setTime("123", NaN) === 123, "date.setTime(\"123\") !== 123"); ok(isNaN(date.setTime(NaN)), "date.setTime(NaN) is not NaN"); +ok(date.setTime(0) === date.getTime(), "date.setTime(0) !== date.getTime()"); +ok(date.getUTCFullYear() === 1970, "date.getUTCFullYear() = " + date.getUTCFullYear()); +ok(date.getUTCMonth() === 0, "date.getUTCMonth() = " + date.getUTCMonth()); +ok(date.getUTCDate() === 1, "date.getUTCDate() = " + date.getUTCDate()); +ok(date.getUTCDay() === 4, "date.getUTCDay() = " + date.getUTCDay()); +ok(date.getUTCHours() === 0, "date.getUTCHours() = " + date.getUTCHours()); +date.setTime(60*24*60*60*1000); +ok(date.getUTCFullYear() === 1970, "date.getUTCFullYear() = " + date.getUTCFullYear()); +ok(date.getUTCMonth() === 2, "date.getUTCMonth() = " + date.getUTCMonth()); +ok(date.getUTCDate() === 2, "date.getUTCDate() = " + date.getUTCDate()); +ok(date.getUTCDay() === 1, "date.getUTCDay() = " + date.getUTCDay()); +ok(date.getUTCHours() === 0, "date.getUTCHours() = " + date.getUTCHours()); +date.setTime(59*24*60*60*1000 + 4*365*24*60*60*1000 + 1000*60*60); +ok(date.getUTCFullYear() === 1974, "date.getUTCFullYear() = " + date.getUTCFullYear()); +ok(date.getUTCMonth() === 1, "date.getUTCMonth() = " + date.getUTCMonth()); +ok(date.getUTCMonth(123) === 1, "date.getUTCMonth() = " + date.getUTCMonth()); +ok(date.getUTCDate() === 28, "date.getUTCDate() = " + date.getUTCDate()); +ok(date.getUTCDay() === 4, "date.getUTCDay() = " + date.getUTCDay()); +ok(date.getUTCHours() === 1, "date.getUTCHours() = " + date.getUTCHours()); +date.setTime(Infinity); +ok(isNaN(date.getUTCFullYear()), "date.getUTCFullYear() is not NaN"); +ok(isNaN(date.getUTCMonth()), "date.getUTCMonth() is not NaN"); +ok(isNaN(date.getUTCDate()), "date.getUTCDate() is not NaN"); +ok(isNaN(date.getUTCDay()), "date.getUTCDay() is not NaN"); +ok(isNaN(date.getUTCHours()), "date.getUTCHours() is not NaN"); + ok(typeof(Math.PI) === "number", "typeof(Math.PI) = " + typeof(Math.PI)); ok(Math.floor(Math.PI*100) === 314, "Math.PI = " + Math.PI); Math.PI = "test"; diff --git a/dlls/kernel32/format_msg.c b/dlls/kernel32/format_msg.c index f4baaaec81d..e8f9fbc9831 100644 --- a/dlls/kernel32/format_msg.c +++ b/dlls/kernel32/format_msg.c @@ -485,7 +485,10 @@ DWORD WINAPI FormatMessageW( if (fmtstr[strlenW(fmtstr)-1]=='s' && argliststart[0]) { DWORD xarr[3]; + WCHAR *fmt_end = fmtstr + strlenW(fmtstr) - 1; + /* remap %ws to %ls */ + if (fmt_end > fmtstr && (fmt_end[-1] == 'w')) fmt_end[-1] = 'l'; xarr[0]=*(argliststart+0); /* possible invalid pointers */ xarr[1]=*(argliststart+1); diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index b55562186fe..5182e71fc1a 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -865,7 +865,7 @@ @ stdcall QueryDepthSList(ptr) ntdll.RtlQueryDepthSList @ stdcall QueryDosDeviceA(str ptr long) @ stdcall QueryDosDeviceW(wstr ptr long) -@ stub QueryFullProcessImageNameA +@ stdcall QueryFullProcessImageNameA(ptr long ptr ptr) @ stdcall QueryFullProcessImageNameW(ptr long ptr ptr) @ stdcall QueryInformationJobObject(long long ptr long ptr) # @ stub QueryMemoryResourceNotification @@ -928,6 +928,7 @@ @ stdcall -arch=x86_64 RtlLookupFunctionEntry(long ptr ptr) ntdll.RtlLookupFunctionEntry @ stdcall RtlMoveMemory(ptr ptr long) ntdll.RtlMoveMemory @ stdcall RtlUnwind(ptr ptr ptr long) ntdll.RtlUnwind +@ stdcall -arch=x86_64 RtlUnwindEx(long long ptr long ptr) ntdll.RtlUnwindEx @ stdcall -arch=x86_64 RtlVirtualUnwind(long long long ptr ptr ptr ptr ptr) ntdll.RtlVirtualUnwind @ stdcall RtlZeroMemory(ptr long) ntdll.RtlZeroMemory @ stdcall -i386 -norelay SMapLS() diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index f00d972ab96..31faf73244f 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -3134,6 +3134,27 @@ BOOL WINAPI GetProcessHandleCount(HANDLE hProcess, DWORD *cnt) } /****************************************************************** + * QueryFullProcessImageNameA (KERNEL32.@) + */ +BOOL WINAPI QueryFullProcessImageNameA(HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD pdwSize) +{ + BOOL retval; + DWORD pdwSizeW = *pdwSize; + LPWSTR lpExeNameW = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, *pdwSize * sizeof(WCHAR)); + + retval = QueryFullProcessImageNameW(hProcess, dwFlags, lpExeNameW, &pdwSizeW); + + if(retval) + retval = (0 != WideCharToMultiByte(CP_ACP, 0, lpExeNameW, -1, + lpExeName, *pdwSize, NULL, NULL)); + if(retval) + *pdwSize = strlen(lpExeName); + + HeapFree(GetProcessHeap(), 0, lpExeNameW); + return retval; +} + +/****************************************************************** * QueryFullProcessImageNameW (KERNEL32.@) */ BOOL WINAPI QueryFullProcessImageNameW(HANDLE hProcess, DWORD dwFlags, LPWSTR lpExeName, PDWORD pdwSize) diff --git a/dlls/kernel32/tests/comm.c b/dlls/kernel32/tests/comm.c index 8cd07ad6bcb..2fb95cdb939 100644 --- a/dlls/kernel32/tests/comm.c +++ b/dlls/kernel32/tests/comm.c @@ -561,6 +561,7 @@ static void test_BuildCommDCBW(TEST *ptest, int initial_value, DCB *pexpected_dc BOOL result; DCB dcb; WCHAR wide_string[sizeof(ptest->string)]; + static int reportedDCBW = 0; MultiByteToWideChar(CP_ACP, 0, ptest->string, -1, wide_string, sizeof(wide_string) / sizeof(WCHAR)); @@ -572,7 +573,8 @@ static void test_BuildCommDCBW(TEST *ptest, int initial_value, DCB *pexpected_dc if(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - win_skip("BuildCommDCBW is not available\n"); + if(!reportedDCBW++) + win_skip("BuildCommDCBW is not implemented\n"); return; } @@ -587,6 +589,7 @@ static void test_BuildCommDCBAndTimeoutsW(TEST *ptest, int initial_value, DCB *p DCB dcb; COMMTIMEOUTS timeouts; WCHAR wide_string[sizeof(ptest->string)]; + static int reportedDCBAndTW = 0; MultiByteToWideChar(CP_ACP, 0, ptest->string, -1, wide_string, sizeof(wide_string) / sizeof(WCHAR)); @@ -599,14 +602,15 @@ static void test_BuildCommDCBAndTimeoutsW(TEST *ptest, int initial_value, DCB *p if(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) { - win_skip("BuildCommDCBAndTimeoutsW is not available\n"); + if(!reportedDCBAndTW++) + win_skip("BuildCommDCBAndTimeoutsW is not implemented\n"); return; } /* check results */ - check_result("BuildCommDCBAndTimeoutsA", ptest, initial_value, result); - check_dcb("BuildCommDCBAndTimeoutsA", ptest, initial_value, &dcb, pexpected_dcb); - check_timeouts("BuildCommDCBAndTimeoutsA", ptest, initial_value, &timeouts, pexpected_timeouts); + check_result("BuildCommDCBAndTimeoutsW", ptest, initial_value, result); + check_dcb("BuildCommDCBAndTimeoutsW", ptest, initial_value, &dcb, pexpected_dcb); + check_timeouts("BuildCommDCBAndTimeoutsW", ptest, initial_value, &timeouts, pexpected_timeouts); } static void test_BuildCommDCB(void) diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index 4ad10eb1b88..e2ad49d596f 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -55,10 +55,11 @@ static const char sillytext[] = "sdlkfjasdlkfj a dslkj adsklf \n \nasdklf askldfa sdlkf \nsadklf asdklf asdf "; struct test_list { - const char *file; - const DWORD err; - const DWORD options; - const BOOL todo_flag; + const char *file; /* file string to test */ + const DWORD err; /* Win NT and further error code */ + const LONG err2; /* Win 9x & ME error code or -1 */ + const DWORD options; /* option flag to use for open */ + const BOOL todo_flag; /* todo_wine indicator */ } ; static void InitFunctionPointers(void) @@ -717,19 +718,19 @@ static void test_CreateFileA(void) static const char nt_drive[] = "\\\\?\\A:"; DWORD i, ret, len; struct test_list p[] = { - {"", ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, TRUE }, /* dir as file w \ */ - {"", ERROR_SUCCESS, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* dir as dir w \ */ - {"a", ERROR_FILE_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, FALSE }, /* non-exist file */ - {"a\\", ERROR_FILE_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, FALSE }, /* non-exist dir */ - {"removeme", ERROR_ACCESS_DENIED, FILE_ATTRIBUTE_NORMAL, FALSE }, /* exist dir w/o \ */ - {"removeme\\", ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, TRUE }, /* exst dir w \ */ - {"c:", ERROR_ACCESS_DENIED, FILE_ATTRIBUTE_NORMAL, FALSE }, /* device in file namespace */ - {"c:", ERROR_SUCCESS, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* device in file namespace as dir */ - {"c:\\", ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, TRUE }, /* root dir w \ */ - {"c:\\", ERROR_SUCCESS, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* root dir w \ as dir */ - {"\\\\?\\c:", ERROR_SUCCESS, FILE_ATTRIBUTE_NORMAL,FALSE }, /* dev namespace drive */ - {"\\\\?\\c:\\", ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, TRUE }, /* dev namespace drive w \ */ - {NULL, 0, 0, FALSE} + {"", ERROR_PATH_NOT_FOUND, -1, FILE_ATTRIBUTE_NORMAL, TRUE }, /* dir as file w \ */ + {"", ERROR_SUCCESS, ERROR_PATH_NOT_FOUND, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* dir as dir w \ */ + {"a", ERROR_FILE_NOT_FOUND, -1, FILE_ATTRIBUTE_NORMAL, FALSE }, /* non-exist file */ + {"a\\", ERROR_FILE_NOT_FOUND, ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, FALSE }, /* non-exist dir */ + {"removeme", ERROR_ACCESS_DENIED, -1, FILE_ATTRIBUTE_NORMAL, FALSE }, /* exist dir w/o \ */ + {"removeme\\", ERROR_PATH_NOT_FOUND, -1, FILE_ATTRIBUTE_NORMAL, TRUE }, /* exst dir w \ */ + {"c:", ERROR_ACCESS_DENIED, ERROR_PATH_NOT_FOUND, FILE_ATTRIBUTE_NORMAL, FALSE }, /* device in file namespace */ + {"c:", ERROR_SUCCESS, ERROR_PATH_NOT_FOUND, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* device in file namespace as dir */ + {"c:\\", ERROR_PATH_NOT_FOUND, ERROR_ACCESS_DENIED, FILE_ATTRIBUTE_NORMAL, TRUE }, /* root dir w \ */ + {"c:\\", ERROR_SUCCESS, ERROR_ACCESS_DENIED, FILE_FLAG_BACKUP_SEMANTICS, FALSE }, /* root dir w \ as dir */ + {"\\\\?\\c:", ERROR_SUCCESS, ERROR_BAD_NETPATH, FILE_ATTRIBUTE_NORMAL,FALSE }, /* dev namespace drive */ + {"\\\\?\\c:\\", ERROR_PATH_NOT_FOUND, ERROR_BAD_NETPATH, FILE_ATTRIBUTE_NORMAL, TRUE }, /* dev namespace drive w \ */ + {NULL, 0, -1, 0, FALSE} }; BY_HANDLE_FILE_INFORMATION Finfo; @@ -829,13 +830,17 @@ static void test_CreateFileA(void) } /* otherwise validate results with expectations */ else if (p[i].todo_flag) - todo_wine ok((hFile == INVALID_HANDLE_VALUE && p[i].err == GetLastError()) || + todo_wine ok( + (hFile == INVALID_HANDLE_VALUE && + (p[i].err == GetLastError() || p[i].err2 == GetLastError())) || (hFile != INVALID_HANDLE_VALUE && p[i].err == ERROR_SUCCESS), "CreateFileA failed on %s, hFile %p, err=%u, should be %u\n", filename, hFile, GetLastError(), p[i].err); else - ok((hFile == INVALID_HANDLE_VALUE && p[i].err == GetLastError()) || - (hFile != INVALID_HANDLE_VALUE && p[i].err == ERROR_SUCCESS), + ok( + (hFile == INVALID_HANDLE_VALUE && + (p[i].err == GetLastError() || p[i].err2 == GetLastError())) || + (hFile != INVALID_HANDLE_VALUE && p[i].err == ERROR_SUCCESS), "CreateFileA failed on %s, hFile %p, err=%u, should be %u\n", filename, hFile, GetLastError(), p[i].err); if (hFile != INVALID_HANDLE_VALUE) @@ -852,21 +857,26 @@ static void test_CreateFileA(void) NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); - ok(hFile != INVALID_HANDLE_VALUE && GetLastError() == ERROR_SUCCESS, + if (hFile != INVALID_HANDLE_VALUE && GetLastError() != ERROR_PATH_NOT_FOUND) + { + ok(hFile != INVALID_HANDLE_VALUE && GetLastError() == ERROR_SUCCESS, "CreateFileA did not work, last error %u on volume <%s>\n", GetLastError(), temp_path ); - if (hFile != INVALID_HANDLE_VALUE) - { - ret = GetFileInformationByHandle( hFile, &Finfo ); - if (ret) + if (hFile != INVALID_HANDLE_VALUE) { - ok(Finfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY, - "CreateFileA probably did not open temp directory %s correctly\n file information does not include FILE_ATTRIBUTE_DIRECTORY, actual=0x%08x\n", + ret = GetFileInformationByHandle( hFile, &Finfo ); + if (ret) + { + ok(Finfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY, + "CreateFileA probably did not open temp directory %s correctly\n file information does not include FILE_ATTRIBUTE_DIRECTORY, actual=0x%08x\n", temp_path, Finfo.dwFileAttributes); + } + CloseHandle( hFile ); } - CloseHandle( hFile ); } + else + skip("Probable Win9x, got ERROR_PATH_NOT_FOUND w/ FILE_FLAG_BACKUP_SEMANTICS or %s\n", temp_path); /* *** Test opening volumes/devices using drive letter *** */ @@ -879,7 +889,8 @@ static void test_CreateFileA(void) FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL ); - if (hFile != INVALID_HANDLE_VALUE || GetLastError() != ERROR_ACCESS_DENIED) + if (hFile != INVALID_HANDLE_VALUE || + (GetLastError() != ERROR_ACCESS_DENIED && GetLastError() != ERROR_BAD_NETPATH)) { /* if we have adm rights to volume, then try rest of tests */ ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA did not open %s, last error=%u\n", @@ -946,6 +957,9 @@ static void test_CreateFileA(void) if (hFile != INVALID_HANDLE_VALUE) CloseHandle( hFile ); } + /* If we see ERROR_BAD_NETPATH then on Win9x or WinME, so skip */ + else if (GetLastError() == ERROR_BAD_NETPATH) + skip("Probable Win9x, got ERROR_BAD_NETPATH (53)\n"); else skip("Do not have authority to access volumes. Tests skipped\n"); @@ -957,78 +971,86 @@ static void test_CreateFileA(void) strcpy(filename, "c:\\"); filename[0] = windowsdir[0]; ret = pGetVolumeNameForVolumeMountPointA( filename, Volume_1, MAX_PATH ); - ok(ret == TRUE, "GetVolumeNameForVolumeMountPointA failed\n"); - ok(strlen(Volume_1) == 49, "GetVolumeNameForVolumeMountPointA returned wrong length name %s\n", Volume_1); - - /* test the result of opening a unique volume name (GUID) */ - /* with the trailing \ */ - /* this should error out */ - strcpy(filename, Volume_1); - hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + ok(ret, "GetVolumeNameForVolumeMountPointA failed, for %s, last error=%d\n", filename, GetLastError()); + if (ret) + { + ok(strlen(Volume_1) == 49, "GetVolumeNameForVolumeMountPointA returned wrong length name <%s>\n", Volume_1); + + /* test the result of opening a unique volume name (GUID) + * with the trailing \ + * this should error out + */ + strcpy(filename, Volume_1); + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL ); - todo_wine - ok(hFile == INVALID_HANDLE_VALUE, - "CreateFileA should not have opened %s, hFile %p\n", - filename, hFile); - todo_wine - ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND, - "CreateFileA should have returned ERROR_PATH_NOT_FOUND on %s, but got %u\n", - filename, GetLastError()); - if (hFile != INVALID_HANDLE_VALUE) - CloseHandle( hFile ); + todo_wine + ok(hFile == INVALID_HANDLE_VALUE, + "CreateFileA should not have opened %s, hFile %p\n", + filename, hFile); + todo_wine + ok(hFile == INVALID_HANDLE_VALUE && GetLastError() == ERROR_PATH_NOT_FOUND, + "CreateFileA should have returned ERROR_PATH_NOT_FOUND on %s, but got %u\n", + filename, GetLastError()); + if (hFile != INVALID_HANDLE_VALUE) + CloseHandle( hFile ); - /* test the result of opening a unique volume name (GUID) */ - /* with the temp path string as dir */ - /* this should work */ - strcpy(filename, Volume_1); - strcat(filename, temp_path+3); - hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + /* test the result of opening a unique volume name (GUID) + * with the temp path string as dir + * this should work + */ + strcpy(filename, Volume_1); + strcat(filename, temp_path+3); + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); - todo_wine - ok(hFile != INVALID_HANDLE_VALUE, - "CreateFileA should have opened %s, but got %u\n", - filename, GetLastError()); - if (hFile != INVALID_HANDLE_VALUE) - CloseHandle( hFile ); + todo_wine + ok(hFile != INVALID_HANDLE_VALUE, + "CreateFileA should have opened %s, but got %u\n", + filename, GetLastError()); + if (hFile != INVALID_HANDLE_VALUE) + CloseHandle( hFile ); - /* test the result of opening a unique volume name (GUID) */ - /* without the trailing \ and in device namespace */ - /* this should work */ - strcpy(filename, Volume_1); - filename[2] = '.'; - filename[48] = 0; - hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, + /* test the result of opening a unique volume name (GUID) + * without the trailing \ and in device namespace + * this should work + */ + strcpy(filename, Volume_1); + filename[2] = '.'; + filename[48] = 0; + hFile = CreateFileA( filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL ); - if (hFile != INVALID_HANDLE_VALUE || GetLastError() != ERROR_ACCESS_DENIED) - { - /* if we have adm rights to volume, then try rest of tests */ - ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA did not open %s, last error=%u\n", - filename, GetLastError()); - if (hFile != INVALID_HANDLE_VALUE) + if (hFile != INVALID_HANDLE_VALUE || GetLastError() != ERROR_ACCESS_DENIED) { - /* if we opened the volume/device, try to read it. Since it */ - /* opened, we should be able to read it. We don't care about*/ - /* what the data is at this time. */ - len = 512; - ret = ReadFile( hFile, buffer, len, &len, NULL ); - todo_wine ok(ret, "Failed to read volume, last error %u, %u, for %s\n", - GetLastError(), ret, filename); - if (ret) + /* if we have adm rights to volume, then try rest of tests */ + ok(hFile != INVALID_HANDLE_VALUE, "CreateFileA did not open %s, last error=%u\n", + filename, GetLastError()); + if (hFile != INVALID_HANDLE_VALUE) { - trace("buffer is\n"); - dumpmem(buffer, 64); - } - CloseHandle( hFile ); - } + /* if we opened the volume/device, try to read it. Since it */ + /* opened, we should be able to read it. We don't care about*/ + /* what the data is at this time. */ + len = 512; + ret = ReadFile( hFile, buffer, len, &len, NULL ); + todo_wine ok(ret, "Failed to read volume, last error %u, %u, for %s\n", + GetLastError(), ret, filename); + if (ret) + { + trace("buffer is\n"); + dumpmem(buffer, 64); + } + CloseHandle( hFile ); + } + } + else + skip("Do not have authority to access volumes. Tests skipped\n"); } else - skip("Do not have authority to access volumes. Tests skipped\n"); + win_skip("GetVolumeNameForVolumeMountPointA not functioning\n"); } else win_skip("GetVolumeNameForVolumeMountPointA not found\n"); diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c index a1080faad3d..948c704e99e 100644 --- a/dlls/kernel32/tests/pipe.c +++ b/dlls/kernel32/tests/pipe.c @@ -836,6 +836,7 @@ static int test_DisconnectNamedPipe(void) char ibuf[32]; DWORD written; DWORD readden; + DWORD ret; SetLastError(0xdeadbeef); hnp = CreateNamedPipe(PIPENAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_WAIT, @@ -876,6 +877,8 @@ static int test_DisconnectNamedPipe(void) "ReadFile from disconnected pipe with bytes waiting\n"); ok(!DisconnectNamedPipe(hnp) && GetLastError() == ERROR_PIPE_NOT_CONNECTED, "DisconnectNamedPipe worked twice\n"); + ret = WaitForSingleObject(hFile, 0); + ok(ret == WAIT_TIMEOUT, "WaitForSingleObject returned %X\n", ret); ok(CloseHandle(hFile), "CloseHandle\n"); } diff --git a/dlls/kernel32/tests/process.c b/dlls/kernel32/tests/process.c index 05fab17cbe0..d8087a642c5 100644 --- a/dlls/kernel32/tests/process.c +++ b/dlls/kernel32/tests/process.c @@ -41,6 +41,12 @@ ok((expected) == value, "Expected " #actual " to be %d (" #expected ") is %d\n", \ (expected), value); \ } while (0) +#define expect_eq_s(expected, actual) \ + do { \ + LPCSTR value = (actual); \ + ok(lstrcmpA((expected), value) == 0, "Expected " #actual " to be L\"%s\" (" #expected ") is L\"%s\"\n", \ + expected, value); \ + } while (0) #define expect_eq_ws_i(expected, actual) \ do { \ LPCWSTR value = (actual); \ @@ -68,6 +74,7 @@ static const char *wine_dbgstr_w(LPCWSTR wstr) static HINSTANCE hkernel32; static LPVOID (WINAPI *pVirtualAllocEx)(HANDLE, LPVOID, SIZE_T, DWORD, DWORD); static BOOL (WINAPI *pVirtualFreeEx)(HANDLE, LPVOID, SIZE_T, DWORD); +static BOOL (WINAPI *pQueryFullProcessImageNameA)(HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize); static BOOL (WINAPI *pQueryFullProcessImageNameW)(HANDLE hProcess, DWORD dwFlags, LPWSTR lpExeName, PDWORD lpdwSize); /* ############################### */ @@ -206,6 +213,7 @@ static int init(void) hkernel32 = GetModuleHandleA("kernel32"); pVirtualAllocEx = (void *) GetProcAddress(hkernel32, "VirtualAllocEx"); pVirtualFreeEx = (void *) GetProcAddress(hkernel32, "VirtualFreeEx"); + pQueryFullProcessImageNameA = (void *) GetProcAddress(hkernel32, "QueryFullProcessImageNameA"); pQueryFullProcessImageNameW = (void *) GetProcAddress(hkernel32, "QueryFullProcessImageNameW"); return 1; } @@ -1618,6 +1626,53 @@ static void test_GetProcessVersion(void) CloseHandle(pi.hThread); } +static void test_ProcessNameA(void) +{ +#define INIT_STR "Just some words" + DWORD length, size; + CHAR buf[1024]; + + if (!pQueryFullProcessImageNameA) + { + win_skip("QueryFullProcessImageNameA unavailable (added in Windows Vista)\n"); + return; + } + /* get the buffer length without \0 terminator */ + length = 1024; + expect_eq_d(TRUE, pQueryFullProcessImageNameA(GetCurrentProcess(), 0, buf, &length)); + expect_eq_d(length, lstrlenA(buf)); + + /* when the buffer is too small + * - function fail with error ERROR_INSUFFICIENT_BUFFER + * - the size variable is not modified + * tested with the biggest too small size + */ + size = length; + sprintf(buf,INIT_STR); + expect_eq_d(FALSE, pQueryFullProcessImageNameA(GetCurrentProcess(), 0, buf, &size)); + expect_eq_d(ERROR_INSUFFICIENT_BUFFER, GetLastError()); + expect_eq_d(length, size); + expect_eq_s(INIT_STR, buf); + + /* retest with smaller buffer size + */ + size = 4; + sprintf(buf,INIT_STR); + expect_eq_d(FALSE, pQueryFullProcessImageNameA(GetCurrentProcess(), 0, buf, &size)); + expect_eq_d(ERROR_INSUFFICIENT_BUFFER, GetLastError()); + expect_eq_d(4, size); + expect_eq_s(INIT_STR, buf); + + /* this is a difference between the ascii and the unicode version + * the unicode version crashes when the size is big enough to hold the result + * ascii version throughs an error + */ + size = 1024; + expect_eq_d(FALSE, pQueryFullProcessImageNameA(GetCurrentProcess(), 0, NULL, &size)); + expect_eq_d(1024, size); + expect_eq_d(ERROR_INVALID_PARAMETER, GetLastError()); +} + static void test_ProcessName(void) { HANDLE hSelf; @@ -1741,6 +1796,7 @@ START_TEST(process) test_ExitCode(); test_OpenProcess(); test_GetProcessVersion(); + test_ProcessNameA(); test_ProcessName(); test_Handles(); /* things that can be tested: diff --git a/dlls/mlang/mlang.c b/dlls/mlang/mlang.c index 4d2f7be3fda..4d3c2e58558 100644 --- a/dlls/mlang/mlang.c +++ b/dlls/mlang/mlang.c @@ -2536,8 +2536,38 @@ static HRESULT WINAPI fnIMultiLanguage_GetRfc1766Info( LCID Locale, PRFC1766INFO pRfc1766Info) { - FIXME("\n"); - return E_NOTIMPL; + LCTYPE type = LOCALE_SLANGUAGE; + + TRACE("(%p, 0x%04x, %p)\n", iface, Locale, pRfc1766Info); + + if (!pRfc1766Info) + return E_INVALIDARG; + + if ((PRIMARYLANGID(Locale) == LANG_ENGLISH) || + (PRIMARYLANGID(Locale) == LANG_CHINESE) || + (PRIMARYLANGID(Locale) == LANG_ARABIC)) { + + if (!SUBLANGID(Locale)) + type = LOCALE_SENGLANGUAGE; /* suppress country */ + } + else + { + if (!SUBLANGID(Locale)) { + TRACE("SUBLANGID missing in 0x%04x\n", Locale); + return E_FAIL; + } + } + + pRfc1766Info->lcid = Locale; + pRfc1766Info->wszRfc1766[0] = 0; + pRfc1766Info->wszLocaleName[0] = 0; + + if ((!lcid_to_rfc1766W(Locale, pRfc1766Info->wszRfc1766, MAX_RFC1766_NAME)) && + (GetLocaleInfoW(Locale, type, pRfc1766Info->wszLocaleName, MAX_LOCALE_NAME) > 0)) + return S_OK; + + /* Locale not supported */ + return E_INVALIDARG; } static HRESULT WINAPI fnIMultiLanguage_CreateConvertCharset( @@ -2871,8 +2901,45 @@ static HRESULT WINAPI fnIMultiLanguage2_GetRfc1766Info( LANGID LangId, PRFC1766INFO pRfc1766Info) { - FIXME("\n"); - return E_NOTIMPL; + static LANGID last_lang = -1; + LCTYPE type = LOCALE_SLANGUAGE; + + TRACE("(%p, 0x%04x, 0x%04x, %p)\n", iface, Locale, LangId, pRfc1766Info); + + if (!pRfc1766Info) + return E_INVALIDARG; + + if ((PRIMARYLANGID(Locale) == LANG_ENGLISH) || + (PRIMARYLANGID(Locale) == LANG_CHINESE) || + (PRIMARYLANGID(Locale) == LANG_ARABIC)) { + + if (!SUBLANGID(Locale)) + type = LOCALE_SENGLANGUAGE; /* suppress country */ + } + else + { + if (!SUBLANGID(Locale)) { + TRACE("SUBLANGID missing in 0x%04x\n", Locale); + return E_FAIL; + } + } + + pRfc1766Info->lcid = Locale; + pRfc1766Info->wszRfc1766[0] = 0; + pRfc1766Info->wszLocaleName[0] = 0; + + if ((PRIMARYLANGID(LangId) != LANG_ENGLISH) && + (last_lang != LangId)) { + FIXME("Only english names supported (requested: 0x%04x)\n", LangId); + last_lang = LangId; + } + + if ((!lcid_to_rfc1766W(Locale, pRfc1766Info->wszRfc1766, MAX_RFC1766_NAME)) && + (GetLocaleInfoW(Locale, type, pRfc1766Info->wszLocaleName, MAX_LOCALE_NAME) > 0)) + return S_OK; + + /* Locale not supported */ + return E_INVALIDARG; } static HRESULT WINAPI fnIMultiLanguage2_CreateConvertCharset( diff --git a/dlls/mlang/tests/mlang.c b/dlls/mlang/tests/mlang.c index d646d39151e..6a871b89ed9 100644 --- a/dlls/mlang/tests/mlang.c +++ b/dlls/mlang/tests/mlang.c @@ -22,6 +22,7 @@ #define COBJMACROS #include +#include #include "windef.h" #include "winbase.h" @@ -53,6 +54,8 @@ typedef struct lcid_tag_table { LPCSTR rfc1766; LCID lcid; HRESULT hr; + LCID broken_lcid; + LPCSTR broken_rfc; } lcid_table_entry; /* en, ar and zh use SUBLANG_NEUTRAL for the rfc1766 name without the country @@ -86,7 +89,7 @@ static const lcid_table_entry lcid_table[] = { {"fr-ca", 0x0c0c, S_OK}, {"fr-ch", 0x100c, S_OK}, {"fr-lu", 0x140c, S_OK}, - {"fr-mc", 0x180c, S_OK}, + {"fr-mc", 0x180c, S_OK, 0x040c, "fr"}, {"it", 0x0410, S_OK}, {"it-ch", 0x0810, S_OK}, @@ -96,10 +99,132 @@ static const lcid_table_entry lcid_table[] = { {"pl", 0x0415, S_OK}, {"ru", 0x0419, S_OK}, - {"kok", 0x0457, S_OK} + {"kok", 0x0457, S_OK, 0x0412, "x-kok"} }; +#define TODO_NAME 1 + +typedef struct info_table_tag { + LCID lcid; + LANGID lang; + DWORD todo; + LPCSTR rfc1766; + LPCWSTR localename; + LPCWSTR broken_name; +} info_table_entry; + +static const WCHAR de_en[] = {'E','n','g','l','i','s','c','h',0}; +static const WCHAR de_enca[] = {'E','n','g','l','i','s','c','h',' ', + '(','K','a','n','a','d','a',')',0}; +static const WCHAR de_engb[] = {'E','n','g','l','i','s','c','h',' ', + '(','G','r','o',0xDF,'b','r','i','t','a','n','n','i','e','n',')',0}; +static const WCHAR de_engb2[] ={'E','n','g','l','i','s','c','h',' ', + '(','V','e','r','e','i','n','i','g','t','e','s',' ', + 'K',0xF6,'n','i','g','r','e','i','c',0}; +static const WCHAR de_enus[] = {'E','n','g','l','i','s','c','h',' ', + '(','U','S','A',')',0}; +static const WCHAR de_de[] = {'D','e','u','t','s','c','h',' ', + '(','D','e','u','t','s','c','h','l','a','n','d',')',0}; +static const WCHAR de_deat[] = {'D','e','u','t','s','c','h',' ', + '(',0xD6,'s','t','e','r','r','e','i','c','h',')',0}; +static const WCHAR de_dech[] = {'D','e','u','t','s','c','h',' ', + '(','S','c','h','w','e','i','z',')',0}; + +static const WCHAR en_en[] = {'E','n','g','l','i','s','h',0}; +static const WCHAR en_enca[] = {'E','n','g','l','i','s','h',' ', + '(','C','a','n','a','d','a',')',0}; +static const WCHAR en_engb[] = {'E','n','g','l','i','s','h',' ', + '(','U','n','i','t','e','d',' ','K','i','n','g','d','o','m',')',0}; +static const WCHAR en_enus[] = {'E','n','g','l','i','s','h',' ', + '(','U','n','i','t','e','d',' ','S','t','a','t','e','s',')',0}; +static const WCHAR en_de[] = {'G','e','r','m','a','n',' ', + '(','G','e','r','m','a','n','y',')',0}; +static const WCHAR en_deat[] = {'G','e','r','m','a','n',' ', + '(','A','u','s','t','r','i','a',')',0}; +static const WCHAR en_dech[] = {'G','e','r','m','a','n',' ', + '(','S','w','i','t','z','e','r','l','a','n','d',')',0}; + +static const WCHAR fr_en[] = {'A','n','g','l','a','i','s',0}; +static const WCHAR fr_enca[] = {'A','n','g','l','a','i','s',' ', + '(','C','a','n','a','d','a',')',0}; +static const WCHAR fr_engb[] = {'A','n','g','l','a','i','s',' ', + '(','R','o','y','a','u','m','e','-','U','n','i',')',0}; +static const WCHAR fr_enus[] = {'A','n','g','l','a','i','s',' ', + '(',0xC9, 't','a','t','s','-','U','n','i','s',')',0}; +static const WCHAR fr_enus2[] ={'A','n','g','l','a','i','s',' ', + '(','U','.','S','.',')',0}; +static const WCHAR fr_de[] = {'A','l','l','e','m','a','n','d',' ', + '(','A','l','l','e','m','a','g','n','e',')',0}; +static const WCHAR fr_de2[] = {'A','l','l','e','m','a','n','d',' ', + '(','S','t','a','n','d','a','r','d',')',0}; +static const WCHAR fr_deat[] = {'A','l','l','e','m','a','n','d',' ', + '(','A','u','t','r','i','c','h','e',')',0}; +static const WCHAR fr_dech[] = {'A','l','l','e','m','a','n','d',' ', + '(','S','u','i','s','s','e',')',0}; + +static const info_table_entry info_table[] = { + {MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), + 0, "en", en_en}, + {MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), + 0, "en-us", en_enus}, + {MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK), MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), + 0, "en-gb", en_engb}, + {MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), + 0, "en-us", en_enus}, + {MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_CAN), MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), + 0, "en-ca", en_enca}, + + {MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), + 0, "de", en_de}, + {MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), + 0, "de", en_de}, + {MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS), MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), + 0, "de-ch", en_dech}, + {MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN), MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), + 0, "de-at", en_deat}, + + {MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), + TODO_NAME, "en", de_en}, + {MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), + TODO_NAME, "en-us", de_enus}, + {MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK), MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), + TODO_NAME, "en-gb", de_engb, de_engb2}, + {MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), + TODO_NAME, "en-us", de_enus}, + {MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_CAN), MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), + TODO_NAME, "en-ca", de_enca}, + + {MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), + TODO_NAME, "de", de_de}, + {MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), + TODO_NAME, "de",de_de}, + {MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS), MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), + TODO_NAME, "de-ch", de_dech}, + {MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN), MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), + TODO_NAME, "de-at", de_deat}, + + {MAKELANGID(LANG_ENGLISH, SUBLANG_NEUTRAL), MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), + TODO_NAME, "en", fr_en}, + {MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), + TODO_NAME, "en-us", fr_enus, fr_enus2}, + {MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK), MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), + TODO_NAME, "en-gb", fr_engb}, + {MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), + TODO_NAME, "en-us", fr_enus, fr_enus2}, + {MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_CAN), MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), + TODO_NAME, "en-ca", fr_enca}, + + {MAKELANGID(LANG_GERMAN, SUBLANG_DEFAULT), MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), + TODO_NAME, "de", fr_de, fr_de2}, + {MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN), MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), + TODO_NAME, "de", fr_de, fr_de2}, + {MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_SWISS), MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), + TODO_NAME, "de-ch", fr_dech}, + {MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN), MAKELANGID(LANG_FRENCH, SUBLANG_DEFAULT), + TODO_NAME, "de-at", fr_deat} + +}; static BOOL init_function_ptrs(void) { @@ -130,6 +255,55 @@ static BOOL init_function_ptrs(void) ok(0, (format), string1, string2); \ } +/* lstrcmpW is not supported on Win9x! */ +static int mylstrcmpW(const WCHAR* str1, const WCHAR* str2) +{ + if (!str2) return 1; + while (*str1 && *str1==*str2) { + str1++; + str2++; + } + return *str1-*str2; +} + +#define DEBUGSTR_W_MAXLEN 64 + +static CHAR * debugstr_w(const WCHAR * strW) +{ + static CHAR buffers[DEBUGSTR_W_MAXLEN * 2]; + static DWORD pos = 0; + CHAR * strA; + DWORD len = DEBUGSTR_W_MAXLEN - 4; + + strA = &buffers[pos]; + + *strA++ = 'L'; + *strA++ = '"'; + + while (*strW && (len > 4)) { + if ((*strW < ' ') || (*strW > 126)) { + sprintf(strA, "\\%04x", *strW); + strA +=5; + len -=5; + } + else + { + *strA++ = *strW; + len--; + } + strW++; + } + *strA++ = '"'; + *strA = '\0'; + + strA = &buffers[pos]; + pos += DEBUGSTR_W_MAXLEN; + if (pos >= sizeof(buffers)) pos = 0; + + return strA; + +} + static void test_multibyte_to_unicode_translations(IMultiLanguage2 *iML2) { /* these APIs are broken regarding constness of the input buffer */ @@ -901,10 +1075,13 @@ static void test_GetLcidFromRfc1766(IMultiLanguage2 *iML2) MultiByteToWideChar(CP_ACP, 0, lcid_table[i].rfc1766, -1, rfc1766W, MAX_RFC1766_NAME); ret = IMultiLanguage2_GetLcidFromRfc1766(iML2, &lcid, rfc1766W); - ok(ret == lcid_table[i].hr, + /* IE <6.0 guess 0x412 (ko) from "kok" */ + ok((ret == lcid_table[i].hr) || + broken(lcid_table[i].broken_lcid && (ret == S_FALSE)), "#%02d: HRESULT 0x%x (expected 0x%x)\n", i, ret, lcid_table[i].hr); - ok(lcid == lcid_table[i].lcid, + ok((lcid == lcid_table[i].lcid) || + broken(lcid == lcid_table[i].broken_lcid), /* IE <6.0 */ "#%02d: got LCID 0x%x (expected 0x%x)\n", i, lcid, lcid_table[i].lcid); } @@ -951,11 +1128,13 @@ static void test_Rfc1766ToLcid(void) lcid = -1; ret = Rfc1766ToLcidA(&lcid, lcid_table[i].rfc1766); - ok(ret == lcid_table[i].hr, + /* IE <6.0 guess 0x412 (ko) from "kok" */ + ok( (ret == lcid_table[i].hr) || + broken(lcid_table[i].broken_lcid && (ret == S_FALSE)), "#%02d: HRESULT 0x%x (expected 0x%x)\n", i, ret, lcid_table[i].hr); - - ok(lcid == lcid_table[i].lcid, + ok( (lcid == lcid_table[i].lcid) || + broken(lcid == lcid_table[i].broken_lcid), /* IE <6.0 */ "#%02d: got LCID 0x%x (expected 0x%x)\n", i, lcid, lcid_table[i].lcid); } @@ -992,7 +1171,9 @@ static void test_GetRfc1766FromLcid(IMultiLanguage2 *iML2) LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, lcid_table[i].rfc1766, lstrlenA(lcid_table[i].rfc1766) + 1, expected, MAX_RFC1766_NAME); - ok(!lstrcmpA(buffer, expected), + /* IE <6.0 return "x-kok" for LCID 0x457 ("kok") */ + ok( (!lstrcmpA(buffer, expected)) || + broken(!lstrcmpA(buffer, lcid_table[i].broken_rfc)), "#%02d: got '%s' (expected '%s')\n", i, buffer, expected); SysFreeString(rfcstr); @@ -1016,7 +1197,9 @@ static void test_LcidToRfc1766(void) hr = LcidToRfc1766A(lcid_table[i].lcid, buffer, MAX_RFC1766_NAME); - ok(hr == lcid_table[i].hr, + /* IE <5.0 does not recognize 0x180c (fr-mc) and 0x457 (kok) */ + ok( (hr == lcid_table[i].hr) || + broken(lcid_table[i].broken_lcid && (hr == E_FAIL)), "#%02d: HRESULT 0x%x (expected 0x%x)\n", i, hr, lcid_table[i].hr); if (hr != S_OK) @@ -1025,7 +1208,10 @@ static void test_LcidToRfc1766(void) LCMapStringA(LOCALE_USER_DEFAULT, LCMAP_LOWERCASE, lcid_table[i].rfc1766, lstrlenA(lcid_table[i].rfc1766) + 1, expected, MAX_RFC1766_NAME); - ok(!lstrcmpA(buffer, expected), + /* IE <6.0 return "x-kok" for LCID 0x457 ("kok") */ + /* IE <5.0 return "fr" for LCID 0x180c ("fr-mc") */ + ok( (!lstrcmpA(buffer, expected)) || + broken(!lstrcmpA(buffer, lcid_table[i].broken_rfc)), "#%02d: got '%s' (expected '%s')\n", i, buffer, expected); } @@ -1050,6 +1236,58 @@ static void test_LcidToRfc1766(void) } +static void test_GetRfc1766Info(IMultiLanguage2 *iML2) +{ + CHAR rfc1766A[MAX_RFC1766_NAME + 1]; + BYTE buffer[sizeof(RFC1766INFO) + 4]; + PRFC1766INFO prfc = (RFC1766INFO *) buffer; + HRESULT ret; + DWORD i; + + for(i = 0; i < sizeof(info_table) / sizeof(info_table[0]); i++) { + memset(buffer, 'x', sizeof(RFC1766INFO) + 2); + buffer[sizeof(buffer) -1] = 0; + buffer[sizeof(buffer) -2] = 0; + + ret = IMultiLanguage2_GetRfc1766Info(iML2, info_table[i].lcid, info_table[i].lang, prfc); + WideCharToMultiByte(CP_ACP, 0, prfc->wszRfc1766, -1, rfc1766A, MAX_RFC1766_NAME, NULL, NULL); + ok(ret == S_OK, "#%02d: got 0x%x (expected S_OK)\n", i, ret); + ok(prfc->lcid == info_table[i].lcid, + "#%02d: got 0x%04x (expected 0x%04x)\n", i, prfc->lcid, info_table[i].lcid); + + ok(!lstrcmpA(rfc1766A, info_table[i].rfc1766), + "#%02d: got '%s' (expected '%s')\n", i, rfc1766A, info_table[i].rfc1766); + + if (info_table[i].todo & TODO_NAME) { + todo_wine + ok( (!mylstrcmpW(prfc->wszLocaleName, info_table[i].localename)) || + broken(!mylstrcmpW(prfc->wszLocaleName, info_table[i].broken_name)), /* IE < 6.0 */ + "#%02d: got %s (expected %s)\n", i, + debugstr_w(prfc->wszLocaleName), debugstr_w(info_table[i].localename)); + } + else + ok( (!mylstrcmpW(prfc->wszLocaleName, info_table[i].localename)) || + broken(!mylstrcmpW(prfc->wszLocaleName, info_table[i].broken_name)), /* IE < 6.0 */ + "#%02d: got %s (expected %s)\n", i, + debugstr_w(prfc->wszLocaleName), debugstr_w(info_table[i].localename)); + + } + + /* SUBLANG_NEUTRAL only allowed for english, arabic, chinese */ + ret = IMultiLanguage2_GetRfc1766Info(iML2, MAKELANGID(LANG_GERMAN, SUBLANG_NEUTRAL), LANG_ENGLISH, prfc); + ok(ret == E_FAIL, "got 0x%x (expected E_FAIL)\n", ret); + + ret = IMultiLanguage2_GetRfc1766Info(iML2, MAKELANGID(LANG_ITALIAN, SUBLANG_NEUTRAL), LANG_ENGLISH, prfc); + ok(ret == E_FAIL, "got 0x%x (expected E_FAIL)\n", ret); + + /* NULL not allowed */ + ret = IMultiLanguage2_GetRfc1766Info(iML2, 0, LANG_ENGLISH, prfc); + ok(ret == E_FAIL, "got 0x%x (expected E_FAIL)\n", ret); + + ret = IMultiLanguage2_GetRfc1766Info(iML2, LANG_ENGLISH, LANG_ENGLISH, NULL); + ok(ret == E_INVALIDARG, "got 0x%x (expected E_INVALIDARG)\n", ret); +} + static void test_IMultiLanguage2_ConvertStringFromUnicode(IMultiLanguage2 *iML2) { CHAR dest[MAX_PATH]; @@ -1621,6 +1859,7 @@ START_TEST(mlang) test_rfc1766(iML2); test_GetLcidFromRfc1766(iML2); test_GetRfc1766FromLcid(iML2); + test_GetRfc1766Info(iML2); test_EnumCodePages(iML2, 0); test_EnumCodePages(iML2, MIMECONTF_MIME_LATEST); diff --git a/dlls/msctf/Makefile.in b/dlls/msctf/Makefile.in index 33c69ec4adc..2c319f130e0 100644 --- a/dlls/msctf/Makefile.in +++ b/dlls/msctf/Makefile.in @@ -3,10 +3,11 @@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = msctf.dll -IMPORTS = uuid ole32 user32 advapi32 kernel32 ntdll +IMPORTS = uuid ole32 oleaut32 user32 advapi32 kernel32 ntdll C_SRCS = \ categorymgr.c \ + compartmentmgr.c \ context.c \ documentmgr.c \ inputprocessor.c \ diff --git a/dlls/msctf/compartmentmgr.c b/dlls/msctf/compartmentmgr.c new file mode 100644 index 00000000000..33369c29389 --- /dev/null +++ b/dlls/msctf/compartmentmgr.c @@ -0,0 +1,199 @@ +/* + * ITfCompartmentMgr implementation + * + * Copyright 2009 Aric Stewart, CodeWeavers + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" + +#include + +#define COBJMACROS + +#include "wine/debug.h" +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winuser.h" +#include "shlwapi.h" +#include "winerror.h" +#include "objbase.h" +#include "oleauto.h" + +#include "wine/unicode.h" +#include "wine/list.h" + +#include "msctf.h" +#include "msctf_internal.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msctf); + +typedef struct tagCompartmentValue { + struct list entry; + GUID guid; + TfClientId owner; + ITfCompartment *compartment; +} CompartmentValue; + +typedef struct tagCompartmentMgr { + const ITfCompartmentMgrVtbl *CompartmentMgrVtbl; + LONG refCount; + + IUnknown *pUnkOuter; + + struct list values; +} CompartmentMgr; + + +HRESULT CompartmentMgr_Destructor(ITfCompartmentMgr *iface) +{ + CompartmentMgr *This = (CompartmentMgr *)iface; + struct list *cursor, *cursor2; + + LIST_FOR_EACH_SAFE(cursor, cursor2, &This->values) + { + CompartmentValue* value = LIST_ENTRY(cursor,CompartmentValue,entry); + list_remove(cursor); + ITfCompartment_Release(value->compartment); + HeapFree(GetProcessHeap(),0,value); + } + + HeapFree(GetProcessHeap(),0,This); + return S_OK; +} + +/***************************************************** + * ITfCompartmentMgr functions + *****************************************************/ +static HRESULT WINAPI CompartmentMgr_QueryInterface(ITfCompartmentMgr *iface, REFIID iid, LPVOID *ppvOut) +{ + CompartmentMgr *This = (CompartmentMgr *)iface; + if (This->pUnkOuter) + return IUnknown_QueryInterface(This->pUnkOuter, iid, *ppvOut); + else + { + *ppvOut = NULL; + + if (IsEqualIID(iid, &IID_IUnknown) || IsEqualIID(iid, &IID_ITfCompartmentMgr)) + { + *ppvOut = This; + } + + if (*ppvOut) + { + IUnknown_AddRef(iface); + return S_OK; + } + + WARN("unsupported interface: %s\n", debugstr_guid(iid)); + return E_NOINTERFACE; + } +} + +static ULONG WINAPI CompartmentMgr_AddRef(ITfCompartmentMgr *iface) +{ + CompartmentMgr *This = (CompartmentMgr *)iface; + if (This->pUnkOuter) + return IUnknown_AddRef(This->pUnkOuter); + else + return InterlockedIncrement(&This->refCount); +} + +static ULONG WINAPI CompartmentMgr_Release(ITfCompartmentMgr *iface) +{ + CompartmentMgr *This = (CompartmentMgr *)iface; + if (This->pUnkOuter) + return IUnknown_Release(This->pUnkOuter); + else + { + ULONG ret; + + ret = InterlockedDecrement(&This->refCount); + if (ret == 0) + CompartmentMgr_Destructor(iface); + return ret; + } +} + +HRESULT WINAPI CompartmentMgr_GetCompartment(ITfCompartmentMgr *iface, + REFGUID rguid, ITfCompartment **ppcomp) +{ + CompartmentMgr *This = (CompartmentMgr *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +HRESULT WINAPI CompartmentMgr_ClearCompartment(ITfCompartmentMgr *iface, + TfClientId tid, REFGUID rguid) +{ + CompartmentMgr *This = (CompartmentMgr *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +HRESULT WINAPI CompartmentMgr_EnumCompartments(ITfCompartmentMgr *iface, + IEnumGUID **ppEnum) +{ + CompartmentMgr *This = (CompartmentMgr *)iface; + FIXME("STUB:(%p)\n",This); + return E_NOTIMPL; +} + +static const ITfCompartmentMgrVtbl CompartmentMgr_CompartmentMgrVtbl = +{ + CompartmentMgr_QueryInterface, + CompartmentMgr_AddRef, + CompartmentMgr_Release, + + CompartmentMgr_GetCompartment, + CompartmentMgr_ClearCompartment, + CompartmentMgr_EnumCompartments +}; + +HRESULT CompartmentMgr_Constructor(IUnknown *pUnkOuter, REFIID riid, IUnknown **ppOut) +{ + CompartmentMgr *This; + + if (!ppOut) + return E_POINTER; + + if (pUnkOuter && !IsEqualIID (riid, &IID_IUnknown)) + return CLASS_E_NOAGGREGATION; + + This = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(CompartmentMgr)); + if (This == NULL) + return E_OUTOFMEMORY; + + This->CompartmentMgrVtbl = &CompartmentMgr_CompartmentMgrVtbl; + This->pUnkOuter = pUnkOuter; + list_init(&This->values); + + if (pUnkOuter) + { + TRACE("returning %p\n", This); + *ppOut = (IUnknown*)This; + return S_OK; + } + else + { + HRESULT hr; + hr = IUnknown_QueryInterface((IUnknown*)This, riid, (LPVOID*)ppOut); + if (FAILED(hr)) + HeapFree(GetProcessHeap(),0,This); + return hr; + } +} diff --git a/dlls/msctf/context.c b/dlls/msctf/context.c index be1ee2deb6e..2c7acb068bc 100644 --- a/dlls/msctf/context.c +++ b/dlls/msctf/context.c @@ -68,6 +68,9 @@ typedef struct tagContext { LONG refCount; BOOL connected; + /* Aggregation */ + ITfCompartmentMgr *CompartmentMgr; + TfClientId tidOwner; TfEditCookie defaultCookie; TS_STATUS documentStatus; @@ -175,6 +178,7 @@ static void Context_Destructor(Context *This) free_sink(sink); } + CompartmentMgr_Destructor(This->CompartmentMgr); HeapFree(GetProcessHeap(),0,This); } @@ -195,6 +199,10 @@ static HRESULT WINAPI Context_QueryInterface(ITfContext *iface, REFIID iid, LPVO { *ppvOut = &This->InsertAtSelectionVtbl; } + else if (IsEqualIID(iid, &IID_ITfCompartmentMgr)) + { + *ppvOut = This->CompartmentMgr; + } if (*ppvOut) { @@ -718,6 +726,8 @@ HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfContext **pp This->tidOwner = tidOwner; This->connected = FALSE; + CompartmentMgr_Constructor((IUnknown*)This, &IID_IUnknown, (IUnknown**)&This->CompartmentMgr); + cookie->lockType = TF_ES_READ; cookie->pOwningContext = This; diff --git a/dlls/msctf/documentmgr.c b/dlls/msctf/documentmgr.c index 7fd354aa1b8..3d4dbe9066b 100644 --- a/dlls/msctf/documentmgr.c +++ b/dlls/msctf/documentmgr.c @@ -45,6 +45,9 @@ typedef struct tagDocumentMgr { const ITfSourceVtbl *SourceVtbl; LONG refCount; + /* Aggregation */ + ITfCompartmentMgr *CompartmentMgr; + ITfContext* contextStack[2]; /* limit of 2 contexts */ ITfThreadMgrEventSink* ThreadMgrSink; } DocumentMgr; @@ -61,6 +64,7 @@ static void DocumentMgr_Destructor(DocumentMgr *This) ITfContext_Release(This->contextStack[0]); if (This->contextStack[1]) ITfContext_Release(This->contextStack[1]); + CompartmentMgr_Destructor(This->CompartmentMgr); HeapFree(GetProcessHeap(),0,This); } @@ -77,6 +81,10 @@ static HRESULT WINAPI DocumentMgr_QueryInterface(ITfDocumentMgr *iface, REFIID i { *ppvOut = &This->SourceVtbl; } + else if (IsEqualIID(iid, &IID_ITfCompartmentMgr)) + { + *ppvOut = This->CompartmentMgr; + } if (*ppvOut) { @@ -303,6 +311,8 @@ HRESULT DocumentMgr_Constructor(ITfThreadMgrEventSink *ThreadMgrSink, ITfDocumen This->refCount = 1; This->ThreadMgrSink = ThreadMgrSink; + CompartmentMgr_Constructor((IUnknown*)This, &IID_IUnknown, (IUnknown**)&This->CompartmentMgr); + TRACE("returning %p\n", This); *ppOut = (ITfDocumentMgr*)This; return S_OK; diff --git a/dlls/msctf/msctf_internal.h b/dlls/msctf/msctf_internal.h index f88516b0598..b4e74466e81 100644 --- a/dlls/msctf/msctf_internal.h +++ b/dlls/msctf/msctf_internal.h @@ -36,6 +36,8 @@ extern HRESULT Context_Constructor(TfClientId tidOwner, IUnknown *punk, ITfConte extern HRESULT InputProcessorProfiles_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); extern HRESULT CategoryMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut); extern HRESULT Range_Constructor(ITfContext *context, ITextStoreACP *textstore, DWORD lockType, DWORD anchorStart, DWORD anchorEnd, ITfRange **ppOut); +extern HRESULT CompartmentMgr_Constructor(IUnknown *pUnkOuter, REFIID riid, IUnknown **ppOut); +extern HRESULT CompartmentMgr_Destructor(ITfCompartmentMgr *This); extern HRESULT Context_Initialize(ITfContext *cxt); extern HRESULT Context_Uninitialize(ITfContext *cxt); diff --git a/dlls/msctf/threadmgr.c b/dlls/msctf/threadmgr.c index 9b887f0a24b..490bfc6580b 100644 --- a/dlls/msctf/threadmgr.c +++ b/dlls/msctf/threadmgr.c @@ -78,6 +78,9 @@ typedef struct tagACLMulti { /* const ITfSourceSingleVtbl *SourceSingleVtbl; */ LONG refCount; + /* Aggregation */ + ITfCompartmentMgr *CompartmentMgr; + const ITfThreadMgrEventSinkVtbl *ThreadMgrEventSinkVtbl; /* internal */ ITfDocumentMgr *focus; @@ -183,6 +186,8 @@ static void ThreadMgr_Destructor(ThreadMgr *This) HeapFree(GetProcessHeap(),0,key); } + CompartmentMgr_Destructor(This->CompartmentMgr); + HeapFree(GetProcessHeap(),0,This); } @@ -211,6 +216,10 @@ static HRESULT WINAPI ThreadMgr_QueryInterface(ITfThreadMgr *iface, REFIID iid, { *ppvOut = &This->ClientIdVtbl; } + else if (IsEqualIID(iid, &IID_ITfCompartmentMgr)) + { + *ppvOut = This->CompartmentMgr; + } if (*ppvOut) { @@ -1054,6 +1063,8 @@ HRESULT ThreadMgr_Constructor(IUnknown *pUnkOuter, IUnknown **ppOut) This->refCount = 1; TlsSetValue(tlsIndex,This); + CompartmentMgr_Constructor((IUnknown*)This, &IID_IUnknown, (IUnknown**)&This->CompartmentMgr); + list_init(&This->CurrentPreservedKeys); list_init(&This->ActiveLanguageProfileNotifySink); diff --git a/dlls/mshtml/Fr.rc b/dlls/mshtml/Fr.rc index 25426701de4..507d0c2ba32 100644 --- a/dlls/mshtml/Fr.rc +++ b/dlls/mshtml/Fr.rc @@ -2,7 +2,7 @@ * MsHTML resources * French Language Support * - * Copyright 2005-2007 Jonathan Ernst + * Copyright 2005-2009 Jonathan Ernst * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -56,3 +56,14 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "OK", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "Annuler", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP } + +ID_PROMPT_DIALOG DIALOG 0, 0, 200, 90 +STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + LTEXT "", ID_PROMPT_PROMPT, 10, 10, 180, 30 + EDITTEXT ID_PROMPT_EDIT, 10, 45, 180, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Annuler", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP +} diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c index 16ac21ebbd5..9a3f3961dc9 100644 --- a/dlls/mshtml/nsembed.c +++ b/dlls/mshtml/nsembed.c @@ -515,7 +515,7 @@ BOOL load_gecko(BOOL silent) || (install_wine_gecko(silent) && load_wine_gecko(gre_path))) ret = init_xpcom(gre_path); else - MESSAGE("Could not load Mozilla. HTML rendering will be disabled.\n"); + MESSAGE("Could not load wine-gecko. HTML rendering will be disabled.\n"); }else { ret = pCompMgr != NULL; } diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 497fc0ac668..7e436930428 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -58,14 +58,10 @@ static const char cond_comment_str[] = "" ""; -static const WCHAR noneW[] = {'N','o','n','e',0}; - static WCHAR characterW[] = {'c','h','a','r','a','c','t','e','r',0}; static WCHAR texteditW[] = {'t','e','x','t','e','d','i','t',0}; static WCHAR wordW[] = {'w','o','r','d',0}; -static const WCHAR text_javascriptW[] = {'t','e','x','t','/','j','a','v','a','s','c','r','i','p','t',0}; - typedef enum { ET_NONE, ET_HTML, @@ -374,9 +370,9 @@ static const char *dbgstr_guid(REFIID riid) static int strcmp_wa(LPCWSTR strw, const char *stra) { - WCHAR buf[512]; - MultiByteToWideChar(CP_ACP, 0, stra, -1, buf, sizeof(buf)/sizeof(WCHAR)); - return lstrcmpW(strw, buf); + CHAR buf[512]; + WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL); + return lstrcmpA(stra, buf); } static BSTR a2bstr(const char *str) @@ -2957,7 +2953,8 @@ static void test_default_style(IHTMLStyle *style) hres = IHTMLStyle_get_margin(style, &str); ok(hres == S_OK, "get_margin failed: %08x\n", hres); - ok(strcmp_wa(str, "1"), "margin = %s\n", dbgstr_w(str)); + todo_wine + ok(!strcmp_wa(str, "1px"), "margin = %s\n", dbgstr_w(str)); hres = IHTMLStyle_put_margin(style, NULL); ok(hres == S_OK, "put_margin failed: %08x\n", hres); @@ -3637,7 +3634,7 @@ static void test_default_selection(IHTMLDocument2 *doc) hres = IHTMLSelectionObject_get_type(selection, &str); ok(hres == S_OK, "get_type failed: %08x\n", hres); - ok(!lstrcmpW(str, noneW), "type = %s\n", dbgstr_w(str)); + ok(!strcmp_wa(str, "None"), "type = %s\n", dbgstr_w(str)); SysFreeString(str); hres = IHTMLSelectionObject_createRange(selection, &disp); @@ -3660,7 +3657,6 @@ static void test_default_body(IHTMLBodyElement *body) VARIANT v; WCHAR sBodyText[] = {'#','F','F','0','0','0','0',0}; WCHAR sTextInvalid[] = {'I','n','v','a','l','i','d',0}; - WCHAR sResInvalid[] = {'#','0','0','a','0','d','0',0}; bstr = (void*)0xdeadbeef; hres = IHTMLBodyElement_get_background(body, &bstr); @@ -3687,12 +3683,13 @@ static void test_default_body(IHTMLBodyElement *body) V_BSTR(&v) = SysAllocString(sTextInvalid); hres = IHTMLBodyElement_put_text(body, v); ok(hres == S_OK, "expect S_OK got 0x%08d\n", hres); + VariantClear(&v); V_VT(&v) = VT_NULL; hres = IHTMLBodyElement_get_text(body, &v); ok(hres == S_OK, "expect S_OK got 0x%08d\n", hres); ok(V_VT(&v) == VT_BSTR, "Expected VT_BSTR got %d\n", V_VT(&v)); - ok(!lstrcmpW(sResInvalid, V_BSTR(&v)), "bstr != sResInvalid\n"); + ok(!strcmp_wa(V_BSTR(&v), "#00a0d0"), "v != '#00a0d0'\n"); VariantClear(&v); /* get_text - Valid Text */ @@ -3700,19 +3697,19 @@ static void test_default_body(IHTMLBodyElement *body) V_BSTR(&v) = SysAllocString(sBodyText); hres = IHTMLBodyElement_put_text(body, v); ok(hres == S_OK, "expect S_OK got 0x%08d\n", hres); + VariantClear(&v); V_VT(&v) = VT_NULL; hres = IHTMLBodyElement_get_text(body, &v); ok(hres == S_OK, "expect S_OK got 0x%08d\n", hres); ok(V_VT(&v) == VT_BSTR, "Expected VT_BSTR got %d\n", V_VT(&v)); - ok(lstrcmpW(bstr, V_BSTR(&v)), "bstr != V_BSTR(&v)\n"); + ok(!strcmp_wa(V_BSTR(&v), "#ff0000"), "v != '#ff0000'\n"); VariantClear(&v); } static void test_body_funs(IHTMLBodyElement *body) { static WCHAR sRed[] = {'r','e','d',0}; - static WCHAR sRedbg[] = {'#','f','f','0','0','0','0',0}; VARIANT vbg; VARIANT vDefaultbg; HRESULT hres; @@ -3730,7 +3727,7 @@ static void test_body_funs(IHTMLBodyElement *body) hres = IHTMLBodyElement_get_bgColor(body, &vbg); ok(hres == S_OK, "get_bgColor failed: %08x\n", hres); ok(V_VT(&vDefaultbg) == VT_BSTR, "V_VT(&vDefaultbg) != VT_BSTR\n"); - ok(!lstrcmpW(V_BSTR(&vbg), sRedbg), "Unexpected type %s\n", dbgstr_w(V_BSTR(&vbg))); + ok(!strcmp_wa(V_BSTR(&vbg), "#ff0000"), "Unexpected bgcolor %s\n", dbgstr_w(V_BSTR(&vbg))); VariantClear(&vbg); /* Restore Originial */ @@ -4316,7 +4313,7 @@ static void test_elems(IHTMLDocument2 *doc) hres = IHTMLScriptElement_get_type(script, &type); ok(hres == S_OK, "get_type failed: %08x\n", hres); - ok(!lstrcmpW(type, text_javascriptW), "Unexpected type %s\n", dbgstr_w(type)); + ok(!strcmp_wa(type, "text/javascript"), "Unexpected type %s\n", dbgstr_w(type)); SysFreeString(type); /* test defer */ @@ -4730,12 +4727,10 @@ static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, D BSTR state; HRESULT hres; - static const WCHAR completeW[] = {'c','o','m','p','l','e','t','e',0}; - hres = IHTMLDocument2_get_readyState(notif_doc, &state); ok(hres == S_OK, "get_readyState failed: %08x\n", hres); - if(!lstrcmpW(state, completeW)) + if(!strcmp_wa(state, "complete")) doc_complete = TRUE; SysFreeString(state); diff --git a/dlls/msi/streams.c b/dlls/msi/streams.c index 2d869cc0d29..12f707e5e57 100644 --- a/dlls/msi/streams.c +++ b/dlls/msi/streams.c @@ -60,7 +60,7 @@ static BOOL streams_set_table_size(MSISTREAMSVIEW *sv, UINT size) if (size >= sv->max_streams) { sv->max_streams *= 2; - sv->streams = msi_realloc(sv->streams, sv->max_streams * sizeof(STREAM *)); + sv->streams = msi_realloc_zero(sv->streams, sv->max_streams * sizeof(STREAM *)); if (!sv->streams) return FALSE; } @@ -387,7 +387,7 @@ static UINT STREAMS_delete(struct tagMSIVIEW *view) for (i = 0; i < sv->num_rows; i++) { - if (sv->streams[i]->stream) + if (sv->streams[i] && sv->streams[i]->stream) IStream_Release(sv->streams[i]->stream); msi_free(sv->streams[i]); } @@ -462,7 +462,7 @@ static INT add_streams_to_table(MSISTREAMSVIEW *sv) return -1; sv->max_streams = 1; - sv->streams = msi_alloc(sizeof(STREAM *)); + sv->streams = msi_alloc_zero(sizeof(STREAM *)); if (!sv->streams) return -1; diff --git a/dlls/msi/table.c b/dlls/msi/table.c index 885c0ddf796..0b5b99164b9 100644 --- a/dlls/msi/table.c +++ b/dlls/msi/table.c @@ -73,9 +73,8 @@ typedef struct tagMSIORDERINFO struct tagMSITABLE { BYTE **data; + BOOL *data_persistent; UINT row_count; - BYTE **nonpersistent_data; - UINT nonpersistent_row_count; struct list entry; MSICOLUMNINFO *colinfo; UINT col_count; @@ -476,9 +475,7 @@ static void free_table( MSITABLE *table ) for( i=0; irow_count; i++ ) msi_free( table->data[i] ); msi_free( table->data ); - for( i=0; inonpersistent_row_count; i++ ) - msi_free( table->nonpersistent_data[i] ); - msi_free( table->nonpersistent_data ); + msi_free( table->data_persistent ); msi_free_colinfo( table->colinfo, table->col_count ); msi_free( table->colinfo ); msi_free( table ); @@ -520,6 +517,9 @@ static UINT read_table_from_storage( MSIDATABASE *db, MSITABLE *t, IStorage *stg t->data = msi_alloc_zero( t->row_count * sizeof (USHORT*) ); if( !t->data ) goto err; + t->data_persistent = msi_alloc_zero( t->row_count * sizeof(BOOL)); + if ( !t->data_persistent ) + goto err; /* transpose all the data */ TRACE("Transposing data from %d rows\n", t->row_count ); @@ -528,6 +528,7 @@ static UINT read_table_from_storage( MSIDATABASE *db, MSITABLE *t, IStorage *stg t->data[i] = msi_alloc( row_size ); if( !t->data[i] ) goto err; + t->data_persistent[i] = TRUE; for( j=0; jcol_count; j++ ) { @@ -634,8 +635,7 @@ UINT msi_create_table( MSIDATABASE *db, LPCWSTR name, column_info *col_info, table->ref_count = 1; table->row_count = 0; table->data = NULL; - table->nonpersistent_row_count = 0; - table->nonpersistent_data = NULL; + table->data_persistent = NULL; table->colinfo = NULL; table->col_count = 0; table->persistent = persistent; @@ -783,8 +783,7 @@ static UINT get_table( MSIDATABASE *db, LPCWSTR name, MSITABLE **table_ret ) table->row_count = 0; table->data = NULL; - table->nonpersistent_row_count = 0; - table->nonpersistent_data = NULL; + table->data_persistent = NULL; table->colinfo = NULL; table->col_count = 0; table->persistent = MSICONDITION_TRUE; @@ -833,6 +832,7 @@ static UINT save_table( MSIDATABASE *db, const MSITABLE *t ) goto err; } + rawsize = 0; p = rawdata; for( i=0; icol_count; i++ ) { @@ -840,6 +840,10 @@ static UINT save_table( MSIDATABASE *db, const MSITABLE *t ) { UINT offset = t->colinfo[i].offset; + if (!t->data_persistent[j]) continue; + if (i == 0) + rawsize += row_size; + *p++ = t->data[j][offset]; *p++ = t->data[j][offset + 1]; if( 4 == bytes_per_column( db, &t->colinfo[i] ) ) @@ -1087,11 +1091,6 @@ BOOL TABLE_Exists( MSIDATABASE *db, LPCWSTR name ) if( table->data[ i ][ 0 ] == table_id ) return TRUE; - count = table->nonpersistent_row_count; - for( i=0; inonpersistent_data[ i ][ 0 ] == table_id ) - return TRUE; - return FALSE; } @@ -1113,7 +1112,6 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT * { MSITABLEVIEW *tv = (MSITABLEVIEW*)view; UINT offset, n; - BYTE **data; if( !tv->table ) return ERROR_INVALID_PARAMETER; @@ -1122,7 +1120,7 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT * return ERROR_INVALID_PARAMETER; /* how many rows are there ? */ - if( row >= tv->table->row_count + tv->table->nonpersistent_row_count ) + if( row >= tv->table->row_count ) return ERROR_NO_MORE_ITEMS; if( tv->columns[col-1].offset >= tv->row_size ) @@ -1135,14 +1133,6 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT * if (tv->order) row = tv->order->reorder[row]; - if (row >= tv->table->row_count) - { - row -= tv->table->row_count; - data = tv->table->nonpersistent_data; - } - else - data = tv->table->data; - n = bytes_per_column( tv->db, &tv->columns[col-1] ); if (n != 2 && n != 3 && n != 4) { @@ -1151,7 +1141,7 @@ static UINT TABLE_fetch_int( struct tagMSIVIEW *view, UINT row, UINT col, UINT * } offset = tv->columns[col-1].offset; - *val = read_table_int(data, row, offset, n); + *val = read_table_int(tv->table->data, row, offset, n); /* TRACE("Data [%d][%d] = %d\n", row, col, *val ); */ @@ -1277,7 +1267,6 @@ static UINT TABLE_fetch_stream( struct tagMSIVIEW *view, UINT row, UINT col, ISt static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val ) { UINT offset, n, i; - BYTE **data; if( !tv->table ) return ERROR_INVALID_PARAMETER; @@ -1285,7 +1274,7 @@ static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val ) if( (col==0) || (col>tv->num_cols) ) return ERROR_INVALID_PARAMETER; - if( row >= tv->table->row_count + tv->table->nonpersistent_row_count ) + if( row >= tv->table->row_count ) return ERROR_INVALID_PARAMETER; if( tv->columns[col-1].offset >= tv->row_size ) @@ -1298,14 +1287,6 @@ static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val ) msi_free( tv->columns[col-1].hash_table ); tv->columns[col-1].hash_table = NULL; - if (row >= tv->table->row_count) - { - row -= tv->table->row_count; - data = tv->table->nonpersistent_data; - } - else - data = tv->table->data; - n = bytes_per_column( tv->db, &tv->columns[col-1] ); if ( n != 2 && n != 3 && n != 4 ) { @@ -1315,7 +1296,7 @@ static UINT TABLE_set_int( MSITABLEVIEW *tv, UINT row, UINT col, UINT val ) offset = tv->columns[col-1].offset; for ( i = 0; i < n; i++ ) - data[row][offset + i] = (val >> i * 8) & 0xff; + tv->table->data[row][offset + i] = (val >> i * 8) & 0xff; return ERROR_SUCCESS; } @@ -1393,9 +1374,8 @@ static UINT TABLE_set_row( struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UI if ( !(mask&(1<= tv->table->row_count then it is a non-persistent row */ persistent = (tv->table->persistent != MSICONDITION_FALSE) && - (row < tv->table->row_count); + (tv->table->data_persistent[row]); /* FIXME: should we allow updating keys? */ val = 0; @@ -1469,8 +1449,10 @@ static UINT table_create_new_row( struct tagMSIVIEW *view, UINT *num, BOOL tempo { MSITABLEVIEW *tv = (MSITABLEVIEW*)view; BYTE **p, *row; + BOOL *b; UINT sz; BYTE ***data_ptr; + BOOL **data_persist_ptr; UINT *row_count; TRACE("%p %s\n", view, temporary ? "TRUE" : "FALSE"); @@ -1482,20 +1464,11 @@ static UINT table_create_new_row( struct tagMSIVIEW *view, UINT *num, BOOL tempo if( !row ) return ERROR_NOT_ENOUGH_MEMORY; - if( temporary ) - { - row_count = &tv->table->nonpersistent_row_count; - data_ptr = &tv->table->nonpersistent_data; - if (*num == -1) - *num = tv->table->row_count + tv->table->nonpersistent_row_count; - } - else - { - row_count = &tv->table->row_count; - data_ptr = &tv->table->data; - if (*num == -1) - *num = tv->table->row_count; - } + row_count = &tv->table->row_count; + data_ptr = &tv->table->data; + data_persist_ptr = &tv->table->data_persistent; + if (*num == -1) + *num = tv->table->row_count; sz = (*row_count + 1) * sizeof (BYTE*); if( *data_ptr ) @@ -1508,8 +1481,24 @@ static UINT table_create_new_row( struct tagMSIVIEW *view, UINT *num, BOOL tempo return ERROR_NOT_ENOUGH_MEMORY; } + sz = (*row_count + 1) * sizeof (BOOL); + if( *data_persist_ptr ) + b = msi_realloc( *data_persist_ptr, sz ); + else + b = msi_alloc( sz ); + if( !b ) + { + msi_free( row ); + msi_free( p ); + return ERROR_NOT_ENOUGH_MEMORY; + } + *data_ptr = p; (*data_ptr)[*row_count] = row; + + *data_persist_ptr = b; + (*data_persist_ptr)[*row_count] = !temporary; + (*row_count)++; return ERROR_SUCCESS; @@ -1545,7 +1534,7 @@ static UINT TABLE_get_dimensions( struct tagMSIVIEW *view, UINT *rows, UINT *col { if( !tv->table ) return ERROR_INVALID_PARAMETER; - *rows = tv->table->row_count + tv->table->nonpersistent_row_count; + *rows = tv->table->row_count; } return ERROR_SUCCESS; @@ -1620,8 +1609,7 @@ static UINT table_validate_new( MSITABLEVIEW *tv, MSIRECORD *rec ) static UINT TABLE_insert_row( struct tagMSIVIEW *view, MSIRECORD *rec, UINT row, BOOL temporary ) { MSITABLEVIEW *tv = (MSITABLEVIEW*)view; - UINT i, r, idx, size; - BYTE **data; + UINT i, r; TRACE("%p %p %s\n", tv, rec, temporary ? "TRUE" : "FALSE" ); @@ -1635,27 +1623,16 @@ static UINT TABLE_insert_row( struct tagMSIVIEW *view, MSIRECORD *rec, UINT row, if( r != ERROR_SUCCESS ) return r; - idx = row; - if( temporary ) - { - data = tv->table->nonpersistent_data; - size = tv->table->nonpersistent_row_count; - idx -= tv->table->row_count; - } - else - { - data = tv->table->data; - size = tv->table->row_count; - } - /* shift the rows to make room for the new row */ - if( idx != size - 1 ) + for (i = tv->table->row_count - 1; i > row; i--) { - for (i = 1; i < size - idx; i++) - memmove(&(data[size - i][0]), - &(data[size - i - 1][0]), tv->row_size); + memmove(&(tv->table->data[i][0]), + &(tv->table->data[i - 1][0]), tv->row_size); + tv->table->data_persistent[i] = tv->table->data_persistent[i - 1]; } + /* Re-set the persistence flag */ + tv->table->data_persistent[row] = !temporary; return TABLE_set_row( view, row, rec, (1<num_cols) - 1 ); } @@ -1663,7 +1640,6 @@ static UINT TABLE_delete_row( struct tagMSIVIEW *view, UINT row ) { MSITABLEVIEW *tv = (MSITABLEVIEW*)view; UINT r, num_rows, num_cols, i; - BYTE **data; TRACE("%p %d\n", tv, row); @@ -1677,19 +1653,8 @@ static UINT TABLE_delete_row( struct tagMSIVIEW *view, UINT row ) if ( row >= num_rows ) return ERROR_FUNCTION_FAILED; - if ( row < tv->table->row_count ) - { - num_rows = tv->table->row_count; - tv->table->row_count--; - data = tv->table->data; - } - else - { - num_rows = tv->table->nonpersistent_row_count; - row -= tv->table->row_count; - tv->table->nonpersistent_row_count--; - data = tv->table->nonpersistent_data; - } + num_rows = tv->table->row_count; + tv->table->row_count--; /* reset the hash tables */ for (i = 0; i < tv->num_cols; i++) @@ -1702,7 +1667,10 @@ static UINT TABLE_delete_row( struct tagMSIVIEW *view, UINT row ) return ERROR_SUCCESS; for (i = row + 1; i < num_rows; i++) - memcpy(data[i - 1], data[i], tv->row_size); + { + memcpy(tv->table->data[i - 1], tv->table->data[i], tv->row_size); + tv->table->data_persistent[i - 1] = tv->table->data_persistent[i]; + } return ERROR_SUCCESS; } @@ -1856,7 +1824,7 @@ static UINT TABLE_find_matching_rows( struct tagMSIVIEW *view, UINT col, if( !tv->columns[col-1].hash_table ) { UINT i; - UINT num_rows = tv->table->row_count + tv->table->nonpersistent_row_count; + UINT num_rows = tv->table->row_count; MSICOLUMNHASHENTRY **hash_table; MSICOLUMNHASHENTRY *new_entry; @@ -2625,7 +2593,7 @@ static UINT msi_table_find_row( MSITABLEVIEW *tv, MSIRECORD *rec, UINT *row ) data = msi_record_to_row( tv, rec ); if( !data ) return r; - for( i = 0; i < tv->table->row_count + tv->table->nonpersistent_row_count; i++ ) + for( i = 0; i < tv->table->row_count; i++ ) { r = msi_row_matches( tv, i, data ); if( r == ERROR_SUCCESS ) diff --git a/dlls/msi/tests/db.c b/dlls/msi/tests/db.c index 95f2170c8f3..2d296b580c7 100644 --- a/dlls/msi/tests/db.c +++ b/dlls/msi/tests/db.c @@ -7391,6 +7391,43 @@ static void test_insertorder(void) MsiViewClose(view); MsiCloseHandle(view); + + query = "DELETE FROM `T` WHERE `A` IS NULL"; + r = run_query(hdb, 0, query); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + query = "INSERT INTO `T` ( `B`, `C` ) VALUES ( 12, 13 ) TEMPORARY"; + r = run_query(hdb, 0, query); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + query = "SELECT * FROM `T`"; + r = MsiDatabaseOpenView(hdb, query, &view); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + r = MsiViewExecute(view, 0); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + for (i = 0; i < 6; i++) + { + r = MsiViewFetch(view, &rec); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", r); + + r = MsiRecordGetInteger(rec, 1); + ok(r == ordervals[i][0], "Expected %d, got %d\n", ordervals[i][0], r); + + r = MsiRecordGetInteger(rec, 2); + ok(r == ordervals[i][1], "Expected %d, got %d\n", ordervals[i][1], r); + + r = MsiRecordGetInteger(rec, 3); + ok(r == ordervals[i][2], "Expected %d, got %d\n", ordervals[i][2], r); + + MsiCloseHandle(rec); + } + + r = MsiViewFetch(view, &rec); + ok(r == ERROR_NO_MORE_ITEMS, "Expected ERROR_NO_MORE_ITEMS, got %d\n", r); + + MsiViewClose(view); + MsiCloseHandle(view); MsiCloseHandle(hdb); DeleteFileA(msifile); } diff --git a/dlls/msi/tests/install.c b/dlls/msi/tests/install.c index a554e346c7e..4912f8cf009 100644 --- a/dlls/msi/tests/install.c +++ b/dlls/msi/tests/install.c @@ -62,7 +62,7 @@ static const CHAR component_dat[] = "Component\tComponentId\tDirectory_\tAttribu "Component\tComponent\n" "Five\t{8CC92E9D-14B2-4CA4-B2AA-B11D02078087}\tNEWDIR\t2\t\tfive.txt\n" "Four\t{FD37B4EA-7209-45C0-8917-535F35A2F080}\tCABOUTDIR\t2\t\tfour.txt\n" - "One\t{783B242E-E185-4A56-AF86-C09815EC053C}\tMSITESTDIR\t2\t\tone.txt\n" + "One\t{783B242E-E185-4A56-AF86-C09815EC053C}\tMSITESTDIR\t2\tNOT REINSTALL\tone.txt\n" "Three\t{010B6ADD-B27D-4EDD-9B3D-34C4F7D61684}\tCHANGEDDIR\t2\t\tthree.txt\n" "Two\t{BF03D1A6-20DA-4A65-82F3-6CAC995915CE}\tFIRSTDIR\t2\t\ttwo.txt\n" "dangler\t{6091DF25-EF96-45F1-B8E9-A9B1420C7A3C}\tTARGETDIR\t4\t\tregdata\n" @@ -159,6 +159,74 @@ static const CHAR property_dat[] = "Property\tValue\n" "SERVNAME\tTestService\n" "SERVDISP\tTestServiceDisp\n"; +static const CHAR up_property_dat[] = "Property\tValue\n" + "s72\tl0\n" + "Property\tProperty\n" + "DefaultUIFont\tDlgFont8\n" + "HASUIRUN\t0\n" + "INSTALLLEVEL\t3\n" + "InstallMode\tTypical\n" + "Manufacturer\tWine\n" + "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n" + "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n" + "ProductID\tnone\n" + "ProductLanguage\t1033\n" + "ProductName\tMSITEST\n" + "ProductVersion\t1.1.1\n" + "PROMPTROLLBACKCOST\tP\n" + "Setup\tSetup\n" + "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n" + "AdminProperties\tPOSTADMIN\n" + "ROOTDRIVE\tC:\\\n" + "SERVNAME\tTestService\n" + "SERVDISP\tTestServiceDisp\n" + "RemovePreviousVersions\t1\n"; + +static const CHAR up2_property_dat[] = "Property\tValue\n" + "s72\tl0\n" + "Property\tProperty\n" + "DefaultUIFont\tDlgFont8\n" + "HASUIRUN\t0\n" + "INSTALLLEVEL\t3\n" + "InstallMode\tTypical\n" + "Manufacturer\tWine\n" + "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n" + "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n" + "ProductID\tnone\n" + "ProductLanguage\t1033\n" + "ProductName\tMSITEST\n" + "ProductVersion\t1.1.2\n" + "PROMPTROLLBACKCOST\tP\n" + "Setup\tSetup\n" + "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n" + "AdminProperties\tPOSTADMIN\n" + "ROOTDRIVE\tC:\\\n" + "SERVNAME\tTestService\n" + "SERVDISP\tTestServiceDisp\n"; + +static const CHAR up3_property_dat[] = "Property\tValue\n" + "s72\tl0\n" + "Property\tProperty\n" + "DefaultUIFont\tDlgFont8\n" + "HASUIRUN\t0\n" + "INSTALLLEVEL\t3\n" + "InstallMode\tTypical\n" + "Manufacturer\tWine\n" + "PIDTemplate\t12345<###-%%%%%%%>@@@@@\n" + "ProductCode\t{7DF88A48-996F-4EC8-A022-BF956F9B2CBB}\n" + "ProductID\tnone\n" + "ProductLanguage\t1033\n" + "ProductName\tMSITEST\n" + "ProductVersion\t1.1.2\n" + "PROMPTROLLBACKCOST\tP\n" + "Setup\tSetup\n" + "UpgradeCode\t{4C0EAA15-0264-4E5A-8758-609EF142B92D}\n" + "AdminProperties\tPOSTADMIN\n" + "ROOTDRIVE\tC:\\\n" + "SERVNAME\tTestService\n" + "SERVDISP\tTestServiceDisp\n" + "RemovePreviousVersions\t1\n"; + static const CHAR registry_dat[] = "Registry\tRoot\tKey\tName\tValue\tComponent_\n" "s72\ti2\tl255\tL255\tL0\ts72\n" "Registry\tRegistry\n" @@ -807,6 +875,111 @@ static const msi_table tables[] = ADD_TABLE(service_control) }; +static const msi_table up_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(up_property), + ADD_TABLE(registry), + ADD_TABLE(service_install), + ADD_TABLE(service_control) +}; + +static const msi_table up2_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(up2_property), + ADD_TABLE(registry), + ADD_TABLE(service_install), + ADD_TABLE(service_control) +}; + +static const msi_table up3_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(up3_property), + ADD_TABLE(registry), + ADD_TABLE(service_install), + ADD_TABLE(service_control) +}; + +static const msi_table up4_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(pp_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(property), + ADD_TABLE(registry), + ADD_TABLE(service_install), + ADD_TABLE(service_control) +}; + +static const msi_table up5_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(pp_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(up_property), + ADD_TABLE(registry), + ADD_TABLE(service_install), + ADD_TABLE(service_control) +}; + +static const msi_table up6_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(pp_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(up2_property), + ADD_TABLE(registry), + ADD_TABLE(service_install), + ADD_TABLE(service_control) +}; + +static const msi_table up7_tables[] = +{ + ADD_TABLE(component), + ADD_TABLE(directory), + ADD_TABLE(feature), + ADD_TABLE(feature_comp), + ADD_TABLE(file), + ADD_TABLE(pp_install_exec_seq), + ADD_TABLE(media), + ADD_TABLE(up3_property), + ADD_TABLE(registry), + ADD_TABLE(service_install), + ADD_TABLE(service_control) +}; + static const msi_table cc_tables[] = { ADD_TABLE(cc_component), @@ -1746,6 +1919,7 @@ static void test_MsiInstallProduct(void) create_test_files(); create_database(msifile, tables, sizeof(tables) / sizeof(msi_table)); + /* install, don't publish */ r = MsiInstallProductA(msifile, NULL); ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); @@ -1792,6 +1966,209 @@ static void test_MsiInstallProduct(void) RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest"); + /* not published, reinstall */ + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "File not installed\n"); + + res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest"); + + create_database(msifile, up_tables, sizeof(up_tables) / sizeof(msi_table)); + + /* not published, RemovePreviousVersions set */ + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "File not installed\n"); + + res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest"); + + create_database(msifile, up2_tables, sizeof(up2_tables) / sizeof(msi_table)); + + /* not published, version number bumped */ + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "File not installed\n"); + + res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest"); + + create_database(msifile, up3_tables, sizeof(up3_tables) / sizeof(msi_table)); + + /* not published, RemovePreviousVersions set and version number bumped */ + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "File not installed\n"); + + res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + ok(res == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %d\n", res); + RegDeleteKeyA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest"); + + create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table)); + + /* install, publish product */ + r = MsiInstallProductA(msifile, "PUBLISH_PRODUCT=1"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "File not installed\n"); + + res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + create_database(msifile, up4_tables, sizeof(up4_tables) / sizeof(msi_table)); + + /* published, reinstall */ + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "File not installed\n"); + + res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + create_database(msifile, up5_tables, sizeof(up5_tables) / sizeof(msi_table)); + + /* published product, RemovePreviousVersions set */ + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "File not installed\n"); + + res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + create_database(msifile, up6_tables, sizeof(up6_tables) / sizeof(msi_table)); + + /* published product, version number bumped */ + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "File not installed\n"); + + res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + create_database(msifile, up7_tables, sizeof(up7_tables) / sizeof(msi_table)); + + /* published product, RemovePreviousVersions set and version number bumped */ + r = MsiInstallProductA(msifile, NULL); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + + ok(delete_pf("msitest\\cabout\\new\\five.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\new", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\cabout\\four.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\cabout", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\changed\\three.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\changed", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\first\\two.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\first", FALSE), "File not installed\n"); + ok(delete_pf("msitest\\one.txt", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\filename", TRUE), "File not installed\n"); + ok(delete_pf("msitest\\service.exe", TRUE), "File not installed\n"); + ok(delete_pf("msitest", FALSE), "File not installed\n"); + + res = RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Wine\\msitest", &hkey); + ok(res == ERROR_FILE_NOT_FOUND, "Expected ERROR_FILE_NOT_FOUND, got %d\n", res); + + r = MsiInstallProductA(msifile, "REMOVE=ALL"); + ok(r == ERROR_SUCCESS, "Expected ERROR_SUCCESS, got %u\n", r); + delete_test_files(); } @@ -5688,7 +6065,7 @@ static void test_propcase(void) START_TEST(install) { DWORD len; - char temp_path[MAX_PATH], prev_path[MAX_PATH]; + char temp_path[MAX_PATH], prev_path[MAX_PATH], log_file[MAX_PATH]; STATEMGRSTATUS status; BOOL ret = FALSE; @@ -5718,9 +6095,13 @@ START_TEST(install) } /* Create only one log file and don't append. We have to pass something - * for the log mode for this to work. + * for the log mode for this to work. The logfile needs to have an absolute + * path otherwise we still end up with some extra logfiles as some tests + * change the current directory. */ - MsiEnableLogA(INSTALLLOGMODE_FATALEXIT, "msitest.log", 0); + lstrcpyA(log_file, temp_path); + lstrcatA(log_file, "\\msitest.log"); + MsiEnableLogA(INSTALLLOGMODE_FATALEXIT, log_file, 0); test_MsiInstallProduct(); test_MsiSetComponentState(); @@ -5761,7 +6142,7 @@ START_TEST(install) test_adminimage(); test_propcase(); - DeleteFileA("msitest.log"); + DeleteFileA(log_file); if (pSRSetRestorePointA && ret) { diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index 925261a9f53..166766b8ee9 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -1467,7 +1467,6 @@ static NTSTATUS load_native_dll( LPCWSTR load_path, LPCWSTR name, HANDLE file, { void *module; HANDLE mapping; - OBJECT_ATTRIBUTES attr; LARGE_INTEGER size; IMAGE_NT_HEADERS *nt; SIZE_T len = 0; @@ -1476,16 +1475,9 @@ static NTSTATUS load_native_dll( LPCWSTR load_path, LPCWSTR name, HANDLE file, TRACE("Trying native dll %s\n", debugstr_w(name)); - attr.Length = sizeof(attr); - attr.RootDirectory = 0; - attr.ObjectName = NULL; - attr.Attributes = 0; - attr.SecurityDescriptor = NULL; - attr.SecurityQualityOfService = NULL; size.QuadPart = 0; - status = NtCreateSection( &mapping, STANDARD_RIGHTS_REQUIRED | SECTION_QUERY | SECTION_MAP_READ, - &attr, &size, PAGE_READONLY, SEC_IMAGE, file ); + NULL, &size, PAGE_READONLY, SEC_IMAGE, file ); if (status != STATUS_SUCCESS) return status; module = NULL; diff --git a/dlls/ole32/clipboard.c b/dlls/ole32/clipboard.c index 1e72ec21217..81231aad4b1 100644 --- a/dlls/ole32/clipboard.c +++ b/dlls/ole32/clipboard.c @@ -997,8 +997,7 @@ static HRESULT get_priv_data(ole_priv_data **data) { char buf[100]; GetClipboardFormatNameA(cf, buf, sizeof(buf)); - TRACE("\tcf %04x %s\n", cf, buf); - ; + TRACE("cf %04x %s\n", cf, buf); } TRACE("count %d\n", count); size += count * sizeof(ret->entries[0]); diff --git a/dlls/ole32/comcat.c b/dlls/ole32/comcat.c index cee1ebb7d68..b8060bdefca 100644 --- a/dlls/ole32/comcat.c +++ b/dlls/ole32/comcat.c @@ -278,7 +278,7 @@ static HRESULT WINAPI COMCAT_ICatRegister_QueryInterface( LPVOID *ppvObj) { ComCatMgrImpl *This = (ComCatMgrImpl *)iface; - TRACE("\n\tIID:\t%s\n",debugstr_guid(riid)); + TRACE("%s\n",debugstr_guid(riid)); if (ppvObj == NULL) return E_POINTER; @@ -515,7 +515,7 @@ static HRESULT WINAPI COMCAT_ICatInformation_GetCategoryDesc( HKEY key; HRESULT res; - TRACE("\n\tCATID:\t%s\n\tLCID:\t%X\n",debugstr_guid(rcatid), lcid); + TRACE("CATID: %s LCID: %x\n",debugstr_guid(rcatid), lcid); if (rcatid == NULL || ppszDesc == NULL) return E_INVALIDARG; @@ -596,12 +596,12 @@ static HRESULT WINAPI COMCAT_ICatInformation_IsClassOfCategories( if (WINE_TRACE_ON(ole)) { ULONG count; - TRACE("\n\tCLSID:\t%s\n\tImplemented %u\n",debugstr_guid(rclsid),cImplemented); + TRACE("CLSID: %s Implemented %u\n",debugstr_guid(rclsid),cImplemented); for (count = 0; count < cImplemented; ++count) - TRACE("\t\t%s\n",debugstr_guid(&rgcatidImpl[count])); - TRACE("\tRequired %u\n",cRequired); + TRACE(" %s\n",debugstr_guid(&rgcatidImpl[count])); + TRACE("Required %u\n",cRequired); for (count = 0; count < cRequired; ++count) - TRACE("\t\t%s\n",debugstr_guid(&rgcatidReq[count])); + TRACE(" %s\n",debugstr_guid(&rgcatidReq[count])); } if ((cImplemented && rgcatidImpl == NULL) || @@ -637,7 +637,7 @@ static HRESULT WINAPI COMCAT_ICatInformation_EnumImplCategoriesOfClass( 'n', 't', 'e', 'd', ' ', 'C', 'a', 't', 'e', 'g', 'o', 'r', 'i', 'e', 's', 0 }; - TRACE("\n\tCLSID:\t%s\n",debugstr_guid(rclsid)); + TRACE("%s\n",debugstr_guid(rclsid)); if (rclsid == NULL || ppenumCATID == NULL) return E_POINTER; @@ -659,7 +659,7 @@ static HRESULT WINAPI COMCAT_ICatInformation_EnumReqCategoriesOfClass( 'd', ' ', 'C', 'a', 't', 'e', 'g', 'o', 'r', 'i', 'e', 's', 0 }; - TRACE("\n\tCLSID:\t%s\n",debugstr_guid(rclsid)); + TRACE("%s\n",debugstr_guid(rclsid)); if (rclsid == NULL || ppenumCATID == NULL) return E_POINTER; @@ -719,7 +719,7 @@ static HRESULT WINAPI COMCAT_IClassFactory_QueryInterface( REFIID riid, LPVOID *ppvObj) { - TRACE("\n\tIID:\t%s\n",debugstr_guid(riid)); + TRACE("%s\n",debugstr_guid(riid)); if (ppvObj == NULL) return E_POINTER; @@ -760,7 +760,7 @@ static HRESULT WINAPI COMCAT_IClassFactory_CreateInstance( LPVOID *ppvObj) { HRESULT res; - TRACE("\n\tIID:\t%s\n",debugstr_guid(riid)); + TRACE("%s\n",debugstr_guid(riid)); if (ppvObj == NULL) return E_POINTER; @@ -834,7 +834,7 @@ static HRESULT WINAPI COMCAT_IEnumCATEGORYINFO_QueryInterface( REFIID riid, LPVOID *ppvObj) { - TRACE("\n\tIID:\t%s\n",debugstr_guid(riid)); + TRACE("%s\n",debugstr_guid(riid)); if (ppvObj == NULL) return E_POINTER; @@ -1017,7 +1017,7 @@ static HRESULT WINAPI COMCAT_CLSID_IEnumGUID_QueryInterface( REFIID riid, LPVOID *ppvObj) { - TRACE("\n\tIID:\t%s\n",debugstr_guid(riid)); + TRACE("%s\n",debugstr_guid(riid)); if (ppvObj == NULL) return E_POINTER; @@ -1203,7 +1203,7 @@ static HRESULT WINAPI COMCAT_CATID_IEnumGUID_QueryInterface( REFIID riid, LPVOID *ppvObj) { - TRACE("\n\tIID:\t%s\n",debugstr_guid(riid)); + TRACE("%s\n",debugstr_guid(riid)); if (ppvObj == NULL) return E_POINTER; diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c index 154c18d67df..586a930bf45 100644 --- a/dlls/ole32/compobj.c +++ b/dlls/ole32/compobj.c @@ -2265,7 +2265,7 @@ HRESULT WINAPI CoGetClassObject( APARTMENT *apt; BOOL release_apt = FALSE; - TRACE("\n\tCLSID:\t%s,\n\tIID:\t%s\n", debugstr_guid(rclsid), debugstr_guid(iid)); + TRACE("CLSID: %s,IID: %s\n", debugstr_guid(rclsid), debugstr_guid(iid)); if (!ppv) return E_INVALIDARG; @@ -2283,8 +2283,8 @@ HRESULT WINAPI CoGetClassObject( } if (pServerInfo) { - FIXME("\tpServerInfo: name=%s\n",debugstr_w(pServerInfo->pwszName)); - FIXME("\t\tpAuthInfo=%p\n",pServerInfo->pAuthInfo); + FIXME("pServerInfo->name=%s pAuthInfo=%p\n", + debugstr_w(pServerInfo->pwszName), pServerInfo->pAuthInfo); } /* diff --git a/dlls/ole32/errorinfo.c b/dlls/ole32/errorinfo.c index 64b81ff4dd2..f69635bc493 100644 --- a/dlls/ole32/errorinfo.c +++ b/dlls/ole32/errorinfo.c @@ -191,7 +191,7 @@ static HRESULT WINAPI IErrorInfoImpl_QueryInterface( VOID** ppvoid) { ErrorInfoImpl *This = impl_from_IErrorInfo(iface); - TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvoid); + TRACE("(%p)->(%s,%p)\n",This,debugstr_guid(riid),ppvoid); *ppvoid = NULL; diff --git a/dlls/ole32/ftmarshal.c b/dlls/ole32/ftmarshal.c index f82410efe31..13802854fa6 100644 --- a/dlls/ole32/ftmarshal.c +++ b/dlls/ole32/ftmarshal.c @@ -110,7 +110,7 @@ FTMarshalImpl_QueryInterface (LPMARSHAL iface, REFIID riid, LPVOID * ppv) FTMarshalImpl *This = impl_from_IMarshal(iface); - TRACE ("(%p)->(\n\tIID:\t%s,%p)\n", This, debugstr_guid (riid), ppv); + TRACE ("(%p)->(%s,%p)\n", This, debugstr_guid (riid), ppv); return IUnknown_QueryInterface (This->pUnkOuter, riid, ppv); } diff --git a/dlls/ole32/marshal.c b/dlls/ole32/marshal.c index 006615320fc..3703de9f2b8 100644 --- a/dlls/ole32/marshal.c +++ b/dlls/ole32/marshal.c @@ -431,7 +431,7 @@ static HRESULT WINAPI Proxy_MarshalInterface( if (SUCCEEDED(hr)) { - TRACE("writing stdobjref:\n\tflags = %04x\n\tcPublicRefs = %d\n\toxid = %s\n\toid = %s\n\tipid = %s\n", + TRACE("writing stdobjref: flags = %04x cPublicRefs = %d oxid = %s oid = %s ipid = %s\n", stdobjref.flags, stdobjref.cPublicRefs, wine_dbgstr_longlong(stdobjref.oxid), wine_dbgstr_longlong(stdobjref.oid), @@ -1239,7 +1239,7 @@ static HRESULT unmarshal_object(const STDOBJREF *stdobjref, APARTMENT *apt, assert(apt); - TRACE("stdobjref:\n\tflags = %04x\n\tcPublicRefs = %d\n\toxid = %s\n\toid = %s\n\tipid = %s\n", + TRACE("stdobjref: flags = %04x cPublicRefs = %d oxid = %s oid = %s ipid = %s\n", stdobjref->flags, stdobjref->cPublicRefs, wine_dbgstr_longlong(stdobjref->oxid), wine_dbgstr_longlong(stdobjref->oid), diff --git a/dlls/oleacc/oleacc.rc b/dlls/oleacc/oleacc.rc index fcffbc11ce9..3be579a746c 100644 --- a/dlls/oleacc/oleacc.rc +++ b/dlls/oleacc/oleacc.rc @@ -21,6 +21,7 @@ #include "windef.h" #include "oleacc.h" +#include "oleacc_De.rc" #include "oleacc_En.rc" #include "oleacc_Fr.rc" #include "oleacc_Ko.rc" diff --git a/dlls/oleacc/oleacc_De.rc b/dlls/oleacc/oleacc_De.rc new file mode 100644 index 00000000000..7d96d2a1960 --- /dev/null +++ b/dlls/oleacc/oleacc_De.rc @@ -0,0 +1,90 @@ +/* + * German resources for oleacc + * + * Copyright 2009 André Hentschel + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL + +STRINGTABLE DISCARDABLE +{ + 0 "unbekanntes Objekt" /* undocumented */ + ROLE_SYSTEM_TITLEBAR "Titelleiste" + ROLE_SYSTEM_MENUBAR "Menüleiste" + ROLE_SYSTEM_SCROLLBAR "Bildlaufleiste" + ROLE_SYSTEM_GRIP "Fangpunkt" + ROLE_SYSTEM_SOUND "Audio" + ROLE_SYSTEM_CURSOR "Cursor" + ROLE_SYSTEM_CARET "Caret-Zeichen" + ROLE_SYSTEM_ALERT "Warnung" + ROLE_SYSTEM_WINDOW "Fenster" + ROLE_SYSTEM_CLIENT "Client" + ROLE_SYSTEM_MENUPOPUP "Kontextmenü" + ROLE_SYSTEM_MENUITEM "Menübefehl" + ROLE_SYSTEM_TOOLTIP "Tooltip" + ROLE_SYSTEM_APPLICATION "Anwendung" + ROLE_SYSTEM_DOCUMENT "Dokument" + ROLE_SYSTEM_PANE "Ausschnitt" + ROLE_SYSTEM_CHART "Diagramm" + ROLE_SYSTEM_DIALOG "Dialog" + ROLE_SYSTEM_BORDER "Rahmen" + ROLE_SYSTEM_GROUPING "Gruppierung" + ROLE_SYSTEM_SEPARATOR "Trennlinie" + ROLE_SYSTEM_TOOLBAR "Symbolleiste" + ROLE_SYSTEM_STATUSBAR "Statusleiste" + ROLE_SYSTEM_TABLE "Tabelle" + ROLE_SYSTEM_COLUMNHEADER "Spaltenkopf" + ROLE_SYSTEM_ROWHEADER "Zeilenkopf" + ROLE_SYSTEM_COLUMN "Spalte" + ROLE_SYSTEM_ROW "Zeile" + ROLE_SYSTEM_CELL "Zelle" + ROLE_SYSTEM_LINK "Link" + ROLE_SYSTEM_HELPBALLOON "Hilfesprechblase" + ROLE_SYSTEM_CHARACTER "Assistent" + ROLE_SYSTEM_LIST "Liste" + ROLE_SYSTEM_LISTITEM "Listenelement" + ROLE_SYSTEM_OUTLINE "Gliederung" + ROLE_SYSTEM_OUTLINEITEM "Gliederungselement" + ROLE_SYSTEM_PAGETAB "Registerkarte" + ROLE_SYSTEM_PROPERTYPAGE "Eigenschaftenseite" + ROLE_SYSTEM_INDICATOR "Anzeige" + ROLE_SYSTEM_GRAPHIC "Grafik" + ROLE_SYSTEM_STATICTEXT "Text" + ROLE_SYSTEM_TEXT "Text" + ROLE_SYSTEM_PUSHBUTTON "Schaltfläche" + ROLE_SYSTEM_CHECKBUTTON "Kontrollkästchen" + ROLE_SYSTEM_RADIOBUTTON "Optionskästchen" + ROLE_SYSTEM_COMBOBOX "Kombinationsfeld" + ROLE_SYSTEM_DROPLIST "Drop Down" + ROLE_SYSTEM_PROGRESSBAR "Fortschrittsanzeige" + ROLE_SYSTEM_DIAL "wählen" + ROLE_SYSTEM_HOTKEYFIELD "Schnellzugriffsfeld" + ROLE_SYSTEM_SLIDER "Schieberegler" + ROLE_SYSTEM_SPINBUTTON "Drehfeld" + ROLE_SYSTEM_DIAGRAM "Diagramm" + ROLE_SYSTEM_ANIMATION "Animation" + ROLE_SYSTEM_EQUATION "Gleichung" + ROLE_SYSTEM_BUTTONDROPDOWN "Dropdown Schaltfläche" + ROLE_SYSTEM_BUTTONMENU "Menü Schaltfläche" + ROLE_SYSTEM_BUTTONDROPDOWNGRID "Raster Dropdown Schaltfläche" + ROLE_SYSTEM_WHITESPACE "Leerzeichen" + ROLE_SYSTEM_PAGETABLIST "Register" + ROLE_SYSTEM_CLOCK "Uhr" + ROLE_SYSTEM_SPLITBUTTON "Trenn Schaltfläche" + ROLE_SYSTEM_IPADDRESS "IP Addresse" + ROLE_SYSTEM_OUTLINEBUTTON "Gliederung Schaltfläche" +} diff --git a/dlls/oleaut32/tests/typelib.c b/dlls/oleaut32/tests/typelib.c index 6a07a49caaf..2748ed0c62c 100644 --- a/dlls/oleaut32/tests/typelib.c +++ b/dlls/oleaut32/tests/typelib.c @@ -1378,6 +1378,58 @@ static const char *create_test_typelib(void) return filename; } +static void test_create_typelib_lcid(LCID lcid) +{ + char filename[MAX_PATH]; + WCHAR name[MAX_PATH]; + HRESULT hr; + ICreateTypeLib2 *tl; + HANDLE file; + DWORD msft_header[5]; /* five is enough for now */ + DWORD read; + + GetTempFileNameA( ".", "tlb", 0, filename ); + MultiByteToWideChar(CP_ACP, 0, filename, -1, name, MAX_PATH); + + hr = CreateTypeLib2(SYS_WIN32, name, &tl); + ok(hr == S_OK, "got %08x\n", hr); + + hr = ICreateTypeLib2_SetLcid(tl, lcid); + ok(hr == S_OK, "got %08x\n", hr); + + hr = ICreateTypeLib2_SaveAllChanges(tl); + ICreateTypeLib2_Release(tl); + + file = CreateFileA( filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0 ); + ok( file != INVALID_HANDLE_VALUE, "file creation failed\n" ); + + ReadFile( file, msft_header, sizeof(msft_header), &read, NULL ); + ok(read == sizeof(msft_header), "read %d\n", read); + CloseHandle( file ); + + ok(msft_header[0] == 0x5446534d, "got %08x\n", msft_header[0]); + ok(msft_header[1] == 0x00010002, "got %08x\n", msft_header[1]); + ok(msft_header[2] == 0xffffffff, "got %08x\n", msft_header[2]); + ok(msft_header[3] == (lcid ? lcid : 0x409), "got %08x (lcid %08x)\n", msft_header[3], lcid); + ok(msft_header[4] == lcid, "got %08x (lcid %08x)\n", msft_header[4], lcid); + + DeleteFileA(filename); +} + +static void test_create_typelibs(void) +{ + test_create_typelib_lcid(LOCALE_SYSTEM_DEFAULT); + test_create_typelib_lcid(LOCALE_USER_DEFAULT); + test_create_typelib_lcid(LOCALE_NEUTRAL); + + test_create_typelib_lcid(0x009); + test_create_typelib_lcid(0x409); + test_create_typelib_lcid(0x809); + + test_create_typelib_lcid(0x007); + test_create_typelib_lcid(0x407); +} + START_TEST(typelib) { const char *filename; @@ -1394,4 +1446,7 @@ START_TEST(typelib) test_dump_typelib( filename ); DeleteFile( filename ); } + + test_create_typelibs(); + } diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 5ddbe1b4acc..10f5e238af2 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -2872,13 +2872,7 @@ static ITypeLib2* ITypeLib2_Constructor_MSFT(LPVOID pLib, DWORD dwTLBLength) /* TLIBATTR fields */ MSFT_ReadGuid(&pTypeLibImpl->LibAttr.guid, tlbHeader.posguid, &cx); - /* pTypeLibImpl->LibAttr.lcid = tlbHeader.lcid;*/ - /* Windows seems to have zero here, is this correct? */ - if(SUBLANGID(tlbHeader.lcid) == SUBLANG_NEUTRAL) - pTypeLibImpl->LibAttr.lcid = MAKELCID(MAKELANGID(PRIMARYLANGID(tlbHeader.lcid),0),0); - else - pTypeLibImpl->LibAttr.lcid = 0; - + pTypeLibImpl->LibAttr.lcid = tlbHeader.lcid2; pTypeLibImpl->LibAttr.syskind = tlbHeader.varflags & 0x0f; /* check the mask */ pTypeLibImpl->LibAttr.wMajorVerNum = LOWORD(tlbHeader.version); pTypeLibImpl->LibAttr.wMinorVerNum = HIWORD(tlbHeader.version); diff --git a/dlls/oleaut32/typelib2.c b/dlls/oleaut32/typelib2.c index 3d092e50d89..b011342e6d2 100644 --- a/dlls/oleaut32/typelib2.c +++ b/dlls/oleaut32/typelib2.c @@ -3204,7 +3204,10 @@ static HRESULT WINAPI ICreateTypeLib2_fnSetHelpContext(ICreateTypeLib2 * iface, /****************************************************************************** * ICreateTypeLib2_SetLcid {OLEAUT32} * - * See ICreateTypeLib_SetLcid. + * Sets both the lcid and lcid2 members in the header to lcid. + * + * As a special case if lcid == LOCALE_NEUTRAL (0), then the first header lcid + * is set to US English while the second one is set to 0. */ static HRESULT WINAPI ICreateTypeLib2_fnSetLcid(ICreateTypeLib2 * iface, LCID lcid) { @@ -3214,6 +3217,8 @@ static HRESULT WINAPI ICreateTypeLib2_fnSetLcid(ICreateTypeLib2 * iface, LCID lc This->typelib_header.lcid = This->typelib_header.lcid2 = lcid; + if(lcid == LOCALE_NEUTRAL) This->typelib_header.lcid = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); + return S_OK; } diff --git a/dlls/olesvr32/olesvr32.spec b/dlls/olesvr32/olesvr32.spec index 9fdd02d9d84..9db60ec44a6 100644 --- a/dlls/olesvr32/olesvr32.spec +++ b/dlls/olesvr32/olesvr32.spec @@ -1,6 +1,6 @@ 1 stub WEP 2 stdcall OleRegisterServer(str ptr ptr long long) - 3 stub OleRevokeServer + 3 stdcall OleRevokeServer(long) 4 stdcall OleBlockServer(long) 5 stdcall OleUnblockServer(long ptr) 6 stdcall OleRegisterServerDoc(ptr str ptr ptr) diff --git a/dlls/olesvr32/olesvr_main.c b/dlls/olesvr32/olesvr_main.c index b48d58bf75a..57c28e1b9b2 100644 --- a/dlls/olesvr32/olesvr_main.c +++ b/dlls/olesvr32/olesvr_main.c @@ -210,3 +210,13 @@ OLESTATUS WINAPI OleSavedServerDoc(LHSERVERDOC hDoc) FIXME("(%d): stub.\n", hDoc); return OLE_OK; } + +/****************************************************************************** + * OleRevokeServer [OLESVR32.3] + * + */ +OLESTATUS WINAPI OleRevokeServer(LHSERVER hServer) +{ + FIXME("(%d): stub.\n", hServer); + return OLE_OK; +} diff --git a/dlls/opengl32/make_opengl b/dlls/opengl32/make_opengl index 752ac871e5b..b2966dc52db 100755 --- a/dlls/opengl32/make_opengl +++ b/dlls/opengl32/make_opengl @@ -22,7 +22,7 @@ use strict; # http://oss.sgi.com/cgi-bin/cvsweb.cgi/projects/ogl-sample/main/doc/registry/specs/ # # - opengl_version is the OpenGL version emulated by the library -# (can be 1.0 to 1.5). The default is 1.2. +# (can be 1.0 to 1.5). The default is 1.1. # # This script generates the three following files : # @@ -314,7 +314,7 @@ if (@ARGV > 1) { $name0=~s%^.*/%%; die "Usage: $name0 [version]\n"; } -my $version = $ARGV[0] || "1.2"; +my $version = $ARGV[0] || "1.1"; if ($version eq "1.0") { %norm_categories = %cat_1_0; } elsif ($version eq "1.1") { @@ -644,9 +644,7 @@ foreach (sort keys %norm_functions) { print SPEC ") wine_$func_name\n"; } -print SPEC "@ stub glGetLevelParameterfv -@ stub glGetLevelParameteriv -@ stdcall wglChoosePixelFormat(long ptr) gdi32.ChoosePixelFormat +print SPEC "@ stdcall wglChoosePixelFormat(long ptr) gdi32.ChoosePixelFormat @ stdcall wglCopyContext(long long long) gdi32.wglCopyContext @ stdcall wglCreateContext(long) gdi32.wglCreateContext @ stdcall wglCreateLayerContext(long long) diff --git a/dlls/opengl32/opengl32.spec b/dlls/opengl32/opengl32.spec index 762fb5ed997..a9657716f62 100644 --- a/dlls/opengl32/opengl32.spec +++ b/dlls/opengl32/opengl32.spec @@ -5,8 +5,6 @@ @ stdcall glBegin( long ) wine_glBegin @ stdcall glBindTexture( long long ) wine_glBindTexture @ stdcall glBitmap( long long long long long long ptr ) wine_glBitmap -@ stdcall glBlendColor( long long long long ) wine_glBlendColor -@ stdcall glBlendEquation( long ) wine_glBlendEquation @ stdcall glBlendFunc( long long ) wine_glBlendFunc @ stdcall glCallList( long ) wine_glCallList @ stdcall glCallLists( long long ptr ) wine_glCallLists @@ -52,26 +50,11 @@ @ stdcall glColorMask( long long long long ) wine_glColorMask @ stdcall glColorMaterial( long long ) wine_glColorMaterial @ stdcall glColorPointer( long long long ptr ) wine_glColorPointer -@ stdcall glColorSubTable( long long long long long ptr ) wine_glColorSubTable -@ stdcall glColorTable( long long long long long ptr ) wine_glColorTable -@ stdcall glColorTableParameterfv( long long ptr ) wine_glColorTableParameterfv -@ stdcall glColorTableParameteriv( long long ptr ) wine_glColorTableParameteriv -@ stdcall glConvolutionFilter1D( long long long long long ptr ) wine_glConvolutionFilter1D -@ stdcall glConvolutionFilter2D( long long long long long long ptr ) wine_glConvolutionFilter2D -@ stdcall glConvolutionParameterf( long long long ) wine_glConvolutionParameterf -@ stdcall glConvolutionParameterfv( long long ptr ) wine_glConvolutionParameterfv -@ stdcall glConvolutionParameteri( long long long ) wine_glConvolutionParameteri -@ stdcall glConvolutionParameteriv( long long ptr ) wine_glConvolutionParameteriv -@ stdcall glCopyColorSubTable( long long long long long ) wine_glCopyColorSubTable -@ stdcall glCopyColorTable( long long long long long ) wine_glCopyColorTable -@ stdcall glCopyConvolutionFilter1D( long long long long long ) wine_glCopyConvolutionFilter1D -@ stdcall glCopyConvolutionFilter2D( long long long long long long ) wine_glCopyConvolutionFilter2D @ stdcall glCopyPixels( long long long long long ) wine_glCopyPixels @ stdcall glCopyTexImage1D( long long long long long long long ) wine_glCopyTexImage1D @ stdcall glCopyTexImage2D( long long long long long long long long ) wine_glCopyTexImage2D @ stdcall glCopyTexSubImage1D( long long long long long long ) wine_glCopyTexSubImage1D @ stdcall glCopyTexSubImage2D( long long long long long long long long ) wine_glCopyTexSubImage2D -@ stdcall glCopyTexSubImage3D( long long long long long long long long long ) wine_glCopyTexSubImage3D @ stdcall glCullFace( long ) wine_glCullFace @ stdcall glDeleteLists( long long ) wine_glDeleteLists @ stdcall glDeleteTextures( long ptr ) wine_glDeleteTextures @@ -84,7 +67,6 @@ @ stdcall glDrawBuffer( long ) wine_glDrawBuffer @ stdcall glDrawElements( long long long ptr ) wine_glDrawElements @ stdcall glDrawPixels( long long long long ptr ) wine_glDrawPixels -@ stdcall glDrawRangeElements( long long long long long ptr ) wine_glDrawRangeElements @ stdcall glEdgeFlag( long ) wine_glEdgeFlag @ stdcall glEdgeFlagPointer( long ptr ) wine_glEdgeFlagPointer @ stdcall glEdgeFlagv( ptr ) wine_glEdgeFlagv @@ -117,21 +99,10 @@ @ stdcall glGenTextures( long ptr ) wine_glGenTextures @ stdcall glGetBooleanv( long ptr ) wine_glGetBooleanv @ stdcall glGetClipPlane( long ptr ) wine_glGetClipPlane -@ stdcall glGetColorTable( long long long ptr ) wine_glGetColorTable -@ stdcall glGetColorTableParameterfv( long long ptr ) wine_glGetColorTableParameterfv -@ stdcall glGetColorTableParameteriv( long long ptr ) wine_glGetColorTableParameteriv -@ stdcall glGetConvolutionFilter( long long long ptr ) wine_glGetConvolutionFilter -@ stdcall glGetConvolutionParameterfv( long long ptr ) wine_glGetConvolutionParameterfv -@ stdcall glGetConvolutionParameteriv( long long ptr ) wine_glGetConvolutionParameteriv @ stdcall glGetDoublev( long ptr ) wine_glGetDoublev @ stdcall glGetError( ) wine_glGetError @ stdcall glGetFloatv( long ptr ) wine_glGetFloatv -@ stdcall glGetHistogram( long long long long ptr ) wine_glGetHistogram -@ stdcall glGetHistogramParameterfv( long long ptr ) wine_glGetHistogramParameterfv -@ stdcall glGetHistogramParameteriv( long long ptr ) wine_glGetHistogramParameteriv @ stdcall glGetIntegerv( long ptr ) wine_glGetIntegerv -@ stub glGetLevelParameterfv -@ stub glGetLevelParameteriv @ stdcall glGetLightfv( long long ptr ) wine_glGetLightfv @ stdcall glGetLightiv( long long ptr ) wine_glGetLightiv @ stdcall glGetMapdv( long long ptr ) wine_glGetMapdv @@ -139,15 +110,11 @@ @ stdcall glGetMapiv( long long ptr ) wine_glGetMapiv @ stdcall glGetMaterialfv( long long ptr ) wine_glGetMaterialfv @ stdcall glGetMaterialiv( long long ptr ) wine_glGetMaterialiv -@ stdcall glGetMinmax( long long long long ptr ) wine_glGetMinmax -@ stdcall glGetMinmaxParameterfv( long long ptr ) wine_glGetMinmaxParameterfv -@ stdcall glGetMinmaxParameteriv( long long ptr ) wine_glGetMinmaxParameteriv @ stdcall glGetPixelMapfv( long ptr ) wine_glGetPixelMapfv @ stdcall glGetPixelMapuiv( long ptr ) wine_glGetPixelMapuiv @ stdcall glGetPixelMapusv( long ptr ) wine_glGetPixelMapusv @ stdcall glGetPointerv( long ptr ) wine_glGetPointerv @ stdcall glGetPolygonStipple( ptr ) wine_glGetPolygonStipple -@ stdcall glGetSeparableFilter( long long long ptr ptr ptr ) wine_glGetSeparableFilter @ stdcall glGetString( long ) wine_glGetString @ stdcall glGetTexEnvfv( long long ptr ) wine_glGetTexEnvfv @ stdcall glGetTexEnviv( long long ptr ) wine_glGetTexEnviv @@ -160,7 +127,6 @@ @ stdcall glGetTexParameterfv( long long ptr ) wine_glGetTexParameterfv @ stdcall glGetTexParameteriv( long long ptr ) wine_glGetTexParameteriv @ stdcall glHint( long long ) wine_glHint -@ stdcall glHistogram( long long long long ) wine_glHistogram @ stdcall glIndexMask( long ) wine_glIndexMask @ stdcall glIndexPointer( long long ptr ) wine_glIndexPointer @ stdcall glIndexd( double ) wine_glIndexd @@ -207,7 +173,6 @@ @ stdcall glMateriali( long long long ) wine_glMateriali @ stdcall glMaterialiv( long long ptr ) wine_glMaterialiv @ stdcall glMatrixMode( long ) wine_glMatrixMode -@ stdcall glMinmax( long long long ) wine_glMinmax @ stdcall glMultMatrixd( ptr ) wine_glMultMatrixd @ stdcall glMultMatrixf( ptr ) wine_glMultMatrixf @ stdcall glNewList( long long ) wine_glNewList @@ -280,15 +245,12 @@ @ stdcall glRects( long long long long ) wine_glRects @ stdcall glRectsv( ptr ptr ) wine_glRectsv @ stdcall glRenderMode( long ) wine_glRenderMode -@ stdcall glResetHistogram( long ) wine_glResetHistogram -@ stdcall glResetMinmax( long ) wine_glResetMinmax @ stdcall glRotated( double double double double ) wine_glRotated @ stdcall glRotatef( long long long long ) wine_glRotatef @ stdcall glScaled( double double double ) wine_glScaled @ stdcall glScalef( long long long ) wine_glScalef @ stdcall glScissor( long long long long ) wine_glScissor @ stdcall glSelectBuffer( long ptr ) wine_glSelectBuffer -@ stdcall glSeparableFilter2D( long long long long long long ptr ptr ) wine_glSeparableFilter2D @ stdcall glShadeModel( long ) wine_glShadeModel @ stdcall glStencilFunc( long long long ) wine_glStencilFunc @ stdcall glStencilMask( long ) wine_glStencilMask @@ -338,14 +300,12 @@ @ stdcall glTexGeniv( long long ptr ) wine_glTexGeniv @ stdcall glTexImage1D( long long long long long long long ptr ) wine_glTexImage1D @ stdcall glTexImage2D( long long long long long long long long ptr ) wine_glTexImage2D -@ stdcall glTexImage3D( long long long long long long long long long ptr ) wine_glTexImage3D @ stdcall glTexParameterf( long long long ) wine_glTexParameterf @ stdcall glTexParameterfv( long long ptr ) wine_glTexParameterfv @ stdcall glTexParameteri( long long long ) wine_glTexParameteri @ stdcall glTexParameteriv( long long ptr ) wine_glTexParameteriv @ stdcall glTexSubImage1D( long long long long long long ptr ) wine_glTexSubImage1D @ stdcall glTexSubImage2D( long long long long long long long long ptr ) wine_glTexSubImage2D -@ stdcall glTexSubImage3D( long long long long long long long long long long ptr ) wine_glTexSubImage3D @ stdcall glTranslated( double double double ) wine_glTranslated @ stdcall glTranslatef( long long long ) wine_glTranslatef @ stdcall glVertex2d( double double ) wine_glVertex2d diff --git a/dlls/opengl32/opengl_ext.c b/dlls/opengl32/opengl_ext.c index 81cc1d2969b..28c0bb7fea5 100644 --- a/dlls/opengl32/opengl_ext.c +++ b/dlls/opengl32/opengl_ext.c @@ -78,7 +78,9 @@ enum extensions EXT_glBinormal3sEXT, EXT_glBinormal3svEXT, EXT_glBinormalPointerEXT, + EXT_glBlendColor, EXT_glBlendColorEXT, + EXT_glBlendEquation, EXT_glBlendEquationEXT, EXT_glBlendEquationSeparate, EXT_glBlendEquationSeparateEXT, @@ -129,9 +131,13 @@ enum extensions EXT_glColorPointerEXT, EXT_glColorPointerListIBM, EXT_glColorPointervINTEL, + EXT_glColorSubTable, EXT_glColorSubTableEXT, + EXT_glColorTable, EXT_glColorTableEXT, + EXT_glColorTableParameterfv, EXT_glColorTableParameterfvSGI, + EXT_glColorTableParameteriv, EXT_glColorTableParameterivSGI, EXT_glColorTableSGI, EXT_glCombinerInputNV, @@ -167,16 +173,26 @@ enum extensions EXT_glCompressedTextureSubImage1DEXT, EXT_glCompressedTextureSubImage2DEXT, EXT_glCompressedTextureSubImage3DEXT, + EXT_glConvolutionFilter1D, EXT_glConvolutionFilter1DEXT, + EXT_glConvolutionFilter2D, EXT_glConvolutionFilter2DEXT, + EXT_glConvolutionParameterf, EXT_glConvolutionParameterfEXT, + EXT_glConvolutionParameterfv, EXT_glConvolutionParameterfvEXT, + EXT_glConvolutionParameteri, EXT_glConvolutionParameteriEXT, + EXT_glConvolutionParameteriv, EXT_glConvolutionParameterivEXT, EXT_glCopyBufferSubData, + EXT_glCopyColorSubTable, EXT_glCopyColorSubTableEXT, + EXT_glCopyColorTable, EXT_glCopyColorTableSGI, + EXT_glCopyConvolutionFilter1D, EXT_glCopyConvolutionFilter1DEXT, + EXT_glCopyConvolutionFilter2D, EXT_glCopyConvolutionFilter2DEXT, EXT_glCopyMultiTexImage1DEXT, EXT_glCopyMultiTexImage2DEXT, @@ -187,6 +203,7 @@ enum extensions EXT_glCopyTexImage2DEXT, EXT_glCopyTexSubImage1DEXT, EXT_glCopyTexSubImage2DEXT, + EXT_glCopyTexSubImage3D, EXT_glCopyTexSubImage3DEXT, EXT_glCopyTextureImage1DEXT, EXT_glCopyTextureImage2DEXT, @@ -242,6 +259,7 @@ enum extensions EXT_glDisableVertexAttribArrayARB, EXT_glDisablei, EXT_glDrawArraysEXT, + EXT_glDrawArraysInstanced, EXT_glDrawArraysInstancedARB, EXT_glDrawArraysInstancedEXT, EXT_glDrawBufferRegion, @@ -250,11 +268,13 @@ enum extensions EXT_glDrawBuffersATI, EXT_glDrawElementArrayAPPLE, EXT_glDrawElementArrayATI, + EXT_glDrawElementsInstanced, EXT_glDrawElementsInstancedARB, EXT_glDrawElementsInstancedEXT, EXT_glDrawMeshArraysSUN, EXT_glDrawRangeElementArrayAPPLE, EXT_glDrawRangeElementArrayATI, + EXT_glDrawRangeElements, EXT_glDrawRangeElementsEXT, EXT_glDrawTransformFeedbackNV, EXT_glEdgeFlagPointerEXT, @@ -390,9 +410,12 @@ enum extensions EXT_glGetBufferPointervARB, EXT_glGetBufferSubData, EXT_glGetBufferSubDataARB, + EXT_glGetColorTable, EXT_glGetColorTableEXT, + EXT_glGetColorTableParameterfv, EXT_glGetColorTableParameterfvEXT, EXT_glGetColorTableParameterfvSGI, + EXT_glGetColorTableParameteriv, EXT_glGetColorTableParameterivEXT, EXT_glGetColorTableParameterivSGI, EXT_glGetColorTableSGI, @@ -405,8 +428,11 @@ enum extensions EXT_glGetCompressedTexImage, EXT_glGetCompressedTexImageARB, EXT_glGetCompressedTextureImageEXT, + EXT_glGetConvolutionFilter, EXT_glGetConvolutionFilterEXT, + EXT_glGetConvolutionParameterfv, EXT_glGetConvolutionParameterfvEXT, + EXT_glGetConvolutionParameteriv, EXT_glGetConvolutionParameterivEXT, EXT_glGetDetailTexFuncSGIS, EXT_glGetDoubleIndexedvEXT, @@ -425,8 +451,11 @@ enum extensions EXT_glGetFramebufferAttachmentParameterivEXT, EXT_glGetFramebufferParameterivEXT, EXT_glGetHandleARB, + EXT_glGetHistogram, EXT_glGetHistogramEXT, + EXT_glGetHistogramParameterfv, EXT_glGetHistogramParameterfvEXT, + EXT_glGetHistogramParameteriv, EXT_glGetHistogramParameterivEXT, EXT_glGetImageTransformParameterfvHP, EXT_glGetImageTransformParameterivHP, @@ -447,8 +476,11 @@ enum extensions EXT_glGetMapControlPointsNV, EXT_glGetMapParameterfvNV, EXT_glGetMapParameterivNV, + EXT_glGetMinmax, EXT_glGetMinmaxEXT, + EXT_glGetMinmaxParameterfv, EXT_glGetMinmaxParameterfvEXT, + EXT_glGetMinmaxParameteriv, EXT_glGetMinmaxParameterivEXT, EXT_glGetMultiTexEnvfvEXT, EXT_glGetMultiTexEnvivEXT, @@ -518,6 +550,7 @@ enum extensions EXT_glGetQueryivARB, EXT_glGetRenderbufferParameteriv, EXT_glGetRenderbufferParameterivEXT, + EXT_glGetSeparableFilter, EXT_glGetSeparableFilterEXT, EXT_glGetShaderInfoLog, EXT_glGetShaderSource, @@ -593,6 +626,7 @@ enum extensions EXT_glGlobalAlphaFactoruiSUN, EXT_glGlobalAlphaFactorusSUN, EXT_glHintPGI, + EXT_glHistogram, EXT_glHistogramEXT, EXT_glIglooInterfaceSGIX, EXT_glImageTransformParameterfHP, @@ -676,6 +710,7 @@ enum extensions EXT_glMatrixScalefEXT, EXT_glMatrixTranslatedEXT, EXT_glMatrixTranslatefEXT, + EXT_glMinmax, EXT_glMinmaxEXT, EXT_glMultTransposeMatrixd, EXT_glMultTransposeMatrixdARB, @@ -893,6 +928,7 @@ enum extensions EXT_glPolygonOffsetEXT, EXT_glPresentFrameDualFillNV, EXT_glPresentFrameKeyedNV, + EXT_glPrimitiveRestartIndex, EXT_glPrimitiveRestartIndexNV, EXT_glPrimitiveRestartNV, EXT_glPrioritizeTexturesEXT, @@ -1002,7 +1038,9 @@ enum extensions EXT_glReplacementCodeusSUN, EXT_glReplacementCodeusvSUN, EXT_glRequestResidentProgramsNV, + EXT_glResetHistogram, EXT_glResetHistogramEXT, + EXT_glResetMinmax, EXT_glResetMinmaxEXT, EXT_glResizeBuffersMESA, EXT_glResumeTransformFeedbackNV, @@ -1054,6 +1092,7 @@ enum extensions EXT_glSelectPerfMonitorCountersAMD, EXT_glSelectTextureCoordSetSGIS, EXT_glSelectTextureSGIS, + EXT_glSeparableFilter2D, EXT_glSeparableFilter2DEXT, EXT_glSetFenceAPPLE, EXT_glSetFenceNV, @@ -1098,6 +1137,7 @@ enum extensions EXT_glTestFenceAPPLE, EXT_glTestFenceNV, EXT_glTestObjectAPPLE, + EXT_glTexBuffer, EXT_glTexBufferARB, EXT_glTexBufferEXT, EXT_glTexBumpParameterfvATI, @@ -1128,6 +1168,7 @@ enum extensions EXT_glTexCoordPointerListIBM, EXT_glTexCoordPointervINTEL, EXT_glTexFilterFuncSGIS, + EXT_glTexImage3D, EXT_glTexImage3DEXT, EXT_glTexImage4DSGIS, EXT_glTexParameterIiv, @@ -1137,6 +1178,7 @@ enum extensions EXT_glTexRenderbufferNV, EXT_glTexSubImage1DEXT, EXT_glTexSubImage2DEXT, + EXT_glTexSubImage3D, EXT_glTexSubImage3DEXT, EXT_glTexSubImage4DSGIS, EXT_glTextureBufferEXT, @@ -1360,7 +1402,7 @@ enum extensions EXT_glVertexAttrib4usv, EXT_glVertexAttrib4usvARB, EXT_glVertexAttribArrayObjectATI, - EXT_glVertexAttribDivisor, + EXT_glVertexAttribDivisorARB, EXT_glVertexAttribI1i, EXT_glVertexAttribI1iEXT, EXT_glVertexAttribI1iv, @@ -1466,7 +1508,6 @@ enum extensions EXT_glVertexWeightfvEXT, EXT_glVertexWeighthNV, EXT_glVertexWeighthvNV, - EXT_glVideoParameterivNV, EXT_glWeightPointerARB, EXT_glWeightbvARB, EXT_glWeightdvARB, @@ -2106,6 +2147,14 @@ static void WINAPI wine_glBinormalPointerEXT( GLenum type, GLsizei stride, GLvoi LEAVE_GL(); } +static void WINAPI wine_glBlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) { + void (*func_glBlendColor)( GLclampf, GLclampf, GLclampf, GLclampf ) = extension_funcs[EXT_glBlendColor]; + TRACE("(%f, %f, %f, %f)\n", red, green, blue, alpha ); + ENTER_GL(); + func_glBlendColor( red, green, blue, alpha ); + LEAVE_GL(); +} + static void WINAPI wine_glBlendColorEXT( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) { void (*func_glBlendColorEXT)( GLclampf, GLclampf, GLclampf, GLclampf ) = extension_funcs[EXT_glBlendColorEXT]; TRACE("(%f, %f, %f, %f)\n", red, green, blue, alpha ); @@ -2114,6 +2163,14 @@ static void WINAPI wine_glBlendColorEXT( GLclampf red, GLclampf green, GLclampf LEAVE_GL(); } +static void WINAPI wine_glBlendEquation( GLenum mode ) { + void (*func_glBlendEquation)( GLenum ) = extension_funcs[EXT_glBlendEquation]; + TRACE("(%d)\n", mode ); + ENTER_GL(); + func_glBlendEquation( mode ); + LEAVE_GL(); +} + static void WINAPI wine_glBlendEquationEXT( GLenum mode ) { void (*func_glBlendEquationEXT)( GLenum ) = extension_funcs[EXT_glBlendEquationEXT]; TRACE("(%d)\n", mode ); @@ -2522,6 +2579,14 @@ static void WINAPI wine_glColorPointervINTEL( GLint size, GLenum type, GLvoid** LEAVE_GL(); } +static void WINAPI wine_glColorSubTable( GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, GLvoid* data ) { + void (*func_glColorSubTable)( GLenum, GLsizei, GLsizei, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glColorSubTable]; + TRACE("(%d, %d, %d, %d, %d, %p)\n", target, start, count, format, type, data ); + ENTER_GL(); + func_glColorSubTable( target, start, count, format, type, data ); + LEAVE_GL(); +} + static void WINAPI wine_glColorSubTableEXT( GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, GLvoid* data ) { void (*func_glColorSubTableEXT)( GLenum, GLsizei, GLsizei, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glColorSubTableEXT]; TRACE("(%d, %d, %d, %d, %d, %p)\n", target, start, count, format, type, data ); @@ -2530,6 +2595,14 @@ static void WINAPI wine_glColorSubTableEXT( GLenum target, GLsizei start, GLsize LEAVE_GL(); } +static void WINAPI wine_glColorTable( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, GLvoid* table ) { + void (*func_glColorTable)( GLenum, GLenum, GLsizei, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glColorTable]; + TRACE("(%d, %d, %d, %d, %d, %p)\n", target, internalformat, width, format, type, table ); + ENTER_GL(); + func_glColorTable( target, internalformat, width, format, type, table ); + LEAVE_GL(); +} + static void WINAPI wine_glColorTableEXT( GLenum target, GLenum internalFormat, GLsizei width, GLenum format, GLenum type, GLvoid* table ) { void (*func_glColorTableEXT)( GLenum, GLenum, GLsizei, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glColorTableEXT]; TRACE("(%d, %d, %d, %d, %d, %p)\n", target, internalFormat, width, format, type, table ); @@ -2538,6 +2611,14 @@ static void WINAPI wine_glColorTableEXT( GLenum target, GLenum internalFormat, G LEAVE_GL(); } +static void WINAPI wine_glColorTableParameterfv( GLenum target, GLenum pname, GLfloat* params ) { + void (*func_glColorTableParameterfv)( GLenum, GLenum, GLfloat* ) = extension_funcs[EXT_glColorTableParameterfv]; + TRACE("(%d, %d, %p)\n", target, pname, params ); + ENTER_GL(); + func_glColorTableParameterfv( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glColorTableParameterfvSGI( GLenum target, GLenum pname, GLfloat* params ) { void (*func_glColorTableParameterfvSGI)( GLenum, GLenum, GLfloat* ) = extension_funcs[EXT_glColorTableParameterfvSGI]; TRACE("(%d, %d, %p)\n", target, pname, params ); @@ -2546,6 +2627,14 @@ static void WINAPI wine_glColorTableParameterfvSGI( GLenum target, GLenum pname, LEAVE_GL(); } +static void WINAPI wine_glColorTableParameteriv( GLenum target, GLenum pname, GLint* params ) { + void (*func_glColorTableParameteriv)( GLenum, GLenum, GLint* ) = extension_funcs[EXT_glColorTableParameteriv]; + TRACE("(%d, %d, %p)\n", target, pname, params ); + ENTER_GL(); + func_glColorTableParameteriv( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glColorTableParameterivSGI( GLenum target, GLenum pname, GLint* params ) { void (*func_glColorTableParameterivSGI)( GLenum, GLenum, GLint* ) = extension_funcs[EXT_glColorTableParameterivSGI]; TRACE("(%d, %d, %p)\n", target, pname, params ); @@ -2826,6 +2915,14 @@ static void WINAPI wine_glCompressedTextureSubImage3DEXT( GLuint texture, GLenum LEAVE_GL(); } +static void WINAPI wine_glConvolutionFilter1D( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, GLvoid* image ) { + void (*func_glConvolutionFilter1D)( GLenum, GLenum, GLsizei, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glConvolutionFilter1D]; + TRACE("(%d, %d, %d, %d, %d, %p)\n", target, internalformat, width, format, type, image ); + ENTER_GL(); + func_glConvolutionFilter1D( target, internalformat, width, format, type, image ); + LEAVE_GL(); +} + static void WINAPI wine_glConvolutionFilter1DEXT( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, GLvoid* image ) { void (*func_glConvolutionFilter1DEXT)( GLenum, GLenum, GLsizei, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glConvolutionFilter1DEXT]; TRACE("(%d, %d, %d, %d, %d, %p)\n", target, internalformat, width, format, type, image ); @@ -2834,6 +2931,14 @@ static void WINAPI wine_glConvolutionFilter1DEXT( GLenum target, GLenum internal LEAVE_GL(); } +static void WINAPI wine_glConvolutionFilter2D( GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* image ) { + void (*func_glConvolutionFilter2D)( GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glConvolutionFilter2D]; + TRACE("(%d, %d, %d, %d, %d, %d, %p)\n", target, internalformat, width, height, format, type, image ); + ENTER_GL(); + func_glConvolutionFilter2D( target, internalformat, width, height, format, type, image ); + LEAVE_GL(); +} + static void WINAPI wine_glConvolutionFilter2DEXT( GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* image ) { void (*func_glConvolutionFilter2DEXT)( GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glConvolutionFilter2DEXT]; TRACE("(%d, %d, %d, %d, %d, %d, %p)\n", target, internalformat, width, height, format, type, image ); @@ -2842,6 +2947,14 @@ static void WINAPI wine_glConvolutionFilter2DEXT( GLenum target, GLenum internal LEAVE_GL(); } +static void WINAPI wine_glConvolutionParameterf( GLenum target, GLenum pname, GLfloat params ) { + void (*func_glConvolutionParameterf)( GLenum, GLenum, GLfloat ) = extension_funcs[EXT_glConvolutionParameterf]; + TRACE("(%d, %d, %f)\n", target, pname, params ); + ENTER_GL(); + func_glConvolutionParameterf( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glConvolutionParameterfEXT( GLenum target, GLenum pname, GLfloat params ) { void (*func_glConvolutionParameterfEXT)( GLenum, GLenum, GLfloat ) = extension_funcs[EXT_glConvolutionParameterfEXT]; TRACE("(%d, %d, %f)\n", target, pname, params ); @@ -2850,6 +2963,14 @@ static void WINAPI wine_glConvolutionParameterfEXT( GLenum target, GLenum pname, LEAVE_GL(); } +static void WINAPI wine_glConvolutionParameterfv( GLenum target, GLenum pname, GLfloat* params ) { + void (*func_glConvolutionParameterfv)( GLenum, GLenum, GLfloat* ) = extension_funcs[EXT_glConvolutionParameterfv]; + TRACE("(%d, %d, %p)\n", target, pname, params ); + ENTER_GL(); + func_glConvolutionParameterfv( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glConvolutionParameterfvEXT( GLenum target, GLenum pname, GLfloat* params ) { void (*func_glConvolutionParameterfvEXT)( GLenum, GLenum, GLfloat* ) = extension_funcs[EXT_glConvolutionParameterfvEXT]; TRACE("(%d, %d, %p)\n", target, pname, params ); @@ -2858,6 +2979,14 @@ static void WINAPI wine_glConvolutionParameterfvEXT( GLenum target, GLenum pname LEAVE_GL(); } +static void WINAPI wine_glConvolutionParameteri( GLenum target, GLenum pname, GLint params ) { + void (*func_glConvolutionParameteri)( GLenum, GLenum, GLint ) = extension_funcs[EXT_glConvolutionParameteri]; + TRACE("(%d, %d, %d)\n", target, pname, params ); + ENTER_GL(); + func_glConvolutionParameteri( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glConvolutionParameteriEXT( GLenum target, GLenum pname, GLint params ) { void (*func_glConvolutionParameteriEXT)( GLenum, GLenum, GLint ) = extension_funcs[EXT_glConvolutionParameteriEXT]; TRACE("(%d, %d, %d)\n", target, pname, params ); @@ -2866,6 +2995,14 @@ static void WINAPI wine_glConvolutionParameteriEXT( GLenum target, GLenum pname, LEAVE_GL(); } +static void WINAPI wine_glConvolutionParameteriv( GLenum target, GLenum pname, GLint* params ) { + void (*func_glConvolutionParameteriv)( GLenum, GLenum, GLint* ) = extension_funcs[EXT_glConvolutionParameteriv]; + TRACE("(%d, %d, %p)\n", target, pname, params ); + ENTER_GL(); + func_glConvolutionParameteriv( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glConvolutionParameterivEXT( GLenum target, GLenum pname, GLint* params ) { void (*func_glConvolutionParameterivEXT)( GLenum, GLenum, GLint* ) = extension_funcs[EXT_glConvolutionParameterivEXT]; TRACE("(%d, %d, %p)\n", target, pname, params ); @@ -2882,6 +3019,14 @@ static void WINAPI wine_glCopyBufferSubData( GLenum readTarget, GLenum writeTarg LEAVE_GL(); } +static void WINAPI wine_glCopyColorSubTable( GLenum target, GLsizei start, GLint x, GLint y, GLsizei width ) { + void (*func_glCopyColorSubTable)( GLenum, GLsizei, GLint, GLint, GLsizei ) = extension_funcs[EXT_glCopyColorSubTable]; + TRACE("(%d, %d, %d, %d, %d)\n", target, start, x, y, width ); + ENTER_GL(); + func_glCopyColorSubTable( target, start, x, y, width ); + LEAVE_GL(); +} + static void WINAPI wine_glCopyColorSubTableEXT( GLenum target, GLsizei start, GLint x, GLint y, GLsizei width ) { void (*func_glCopyColorSubTableEXT)( GLenum, GLsizei, GLint, GLint, GLsizei ) = extension_funcs[EXT_glCopyColorSubTableEXT]; TRACE("(%d, %d, %d, %d, %d)\n", target, start, x, y, width ); @@ -2890,6 +3035,14 @@ static void WINAPI wine_glCopyColorSubTableEXT( GLenum target, GLsizei start, GL LEAVE_GL(); } +static void WINAPI wine_glCopyColorTable( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ) { + void (*func_glCopyColorTable)( GLenum, GLenum, GLint, GLint, GLsizei ) = extension_funcs[EXT_glCopyColorTable]; + TRACE("(%d, %d, %d, %d, %d)\n", target, internalformat, x, y, width ); + ENTER_GL(); + func_glCopyColorTable( target, internalformat, x, y, width ); + LEAVE_GL(); +} + static void WINAPI wine_glCopyColorTableSGI( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ) { void (*func_glCopyColorTableSGI)( GLenum, GLenum, GLint, GLint, GLsizei ) = extension_funcs[EXT_glCopyColorTableSGI]; TRACE("(%d, %d, %d, %d, %d)\n", target, internalformat, x, y, width ); @@ -2898,6 +3051,14 @@ static void WINAPI wine_glCopyColorTableSGI( GLenum target, GLenum internalforma LEAVE_GL(); } +static void WINAPI wine_glCopyConvolutionFilter1D( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ) { + void (*func_glCopyConvolutionFilter1D)( GLenum, GLenum, GLint, GLint, GLsizei ) = extension_funcs[EXT_glCopyConvolutionFilter1D]; + TRACE("(%d, %d, %d, %d, %d)\n", target, internalformat, x, y, width ); + ENTER_GL(); + func_glCopyConvolutionFilter1D( target, internalformat, x, y, width ); + LEAVE_GL(); +} + static void WINAPI wine_glCopyConvolutionFilter1DEXT( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ) { void (*func_glCopyConvolutionFilter1DEXT)( GLenum, GLenum, GLint, GLint, GLsizei ) = extension_funcs[EXT_glCopyConvolutionFilter1DEXT]; TRACE("(%d, %d, %d, %d, %d)\n", target, internalformat, x, y, width ); @@ -2906,6 +3067,14 @@ static void WINAPI wine_glCopyConvolutionFilter1DEXT( GLenum target, GLenum inte LEAVE_GL(); } +static void WINAPI wine_glCopyConvolutionFilter2D( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height ) { + void (*func_glCopyConvolutionFilter2D)( GLenum, GLenum, GLint, GLint, GLsizei, GLsizei ) = extension_funcs[EXT_glCopyConvolutionFilter2D]; + TRACE("(%d, %d, %d, %d, %d, %d)\n", target, internalformat, x, y, width, height ); + ENTER_GL(); + func_glCopyConvolutionFilter2D( target, internalformat, x, y, width, height ); + LEAVE_GL(); +} + static void WINAPI wine_glCopyConvolutionFilter2DEXT( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height ) { void (*func_glCopyConvolutionFilter2DEXT)( GLenum, GLenum, GLint, GLint, GLsizei, GLsizei ) = extension_funcs[EXT_glCopyConvolutionFilter2DEXT]; TRACE("(%d, %d, %d, %d, %d, %d)\n", target, internalformat, x, y, width, height ); @@ -2986,6 +3155,14 @@ static void WINAPI wine_glCopyTexSubImage2DEXT( GLenum target, GLint level, GLin LEAVE_GL(); } +static void WINAPI wine_glCopyTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ) { + void (*func_glCopyTexSubImage3D)( GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei ) = extension_funcs[EXT_glCopyTexSubImage3D]; + TRACE("(%d, %d, %d, %d, %d, %d, %d, %d, %d)\n", target, level, xoffset, yoffset, zoffset, x, y, width, height ); + ENTER_GL(); + func_glCopyTexSubImage3D( target, level, xoffset, yoffset, zoffset, x, y, width, height ); + LEAVE_GL(); +} + static void WINAPI wine_glCopyTexSubImage3DEXT( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ) { void (*func_glCopyTexSubImage3DEXT)( GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei ) = extension_funcs[EXT_glCopyTexSubImage3DEXT]; TRACE("(%d, %d, %d, %d, %d, %d, %d, %d, %d)\n", target, level, xoffset, yoffset, zoffset, x, y, width, height ); @@ -3434,6 +3611,14 @@ static void WINAPI wine_glDrawArraysEXT( GLenum mode, GLint first, GLsizei count LEAVE_GL(); } +static void WINAPI wine_glDrawArraysInstanced( GLenum mode, GLint first, GLsizei count, GLsizei primcount ) { + void (*func_glDrawArraysInstanced)( GLenum, GLint, GLsizei, GLsizei ) = extension_funcs[EXT_glDrawArraysInstanced]; + TRACE("(%d, %d, %d, %d)\n", mode, first, count, primcount ); + ENTER_GL(); + func_glDrawArraysInstanced( mode, first, count, primcount ); + LEAVE_GL(); +} + static void WINAPI wine_glDrawArraysInstancedARB( GLenum mode, GLint first, GLsizei count, GLsizei primcount ) { void (*func_glDrawArraysInstancedARB)( GLenum, GLint, GLsizei, GLsizei ) = extension_funcs[EXT_glDrawArraysInstancedARB]; TRACE("(%d, %d, %d, %d)\n", mode, first, count, primcount ); @@ -3498,6 +3683,14 @@ static void WINAPI wine_glDrawElementArrayATI( GLenum mode, GLsizei count ) { LEAVE_GL(); } +static void WINAPI wine_glDrawElementsInstanced( GLenum mode, GLsizei count, GLenum type, GLvoid* indices, GLsizei primcount ) { + void (*func_glDrawElementsInstanced)( GLenum, GLsizei, GLenum, GLvoid*, GLsizei ) = extension_funcs[EXT_glDrawElementsInstanced]; + TRACE("(%d, %d, %d, %p, %d)\n", mode, count, type, indices, primcount ); + ENTER_GL(); + func_glDrawElementsInstanced( mode, count, type, indices, primcount ); + LEAVE_GL(); +} + static void WINAPI wine_glDrawElementsInstancedARB( GLenum mode, GLsizei count, GLenum type, GLvoid* indices, GLsizei primcount ) { void (*func_glDrawElementsInstancedARB)( GLenum, GLsizei, GLenum, GLvoid*, GLsizei ) = extension_funcs[EXT_glDrawElementsInstancedARB]; TRACE("(%d, %d, %d, %p, %d)\n", mode, count, type, indices, primcount ); @@ -3538,6 +3731,14 @@ static void WINAPI wine_glDrawRangeElementArrayATI( GLenum mode, GLuint start, G LEAVE_GL(); } +static void WINAPI wine_glDrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLvoid* indices ) { + void (*func_glDrawRangeElements)( GLenum, GLuint, GLuint, GLsizei, GLenum, GLvoid* ) = extension_funcs[EXT_glDrawRangeElements]; + TRACE("(%d, %d, %d, %d, %d, %p)\n", mode, start, end, count, type, indices ); + ENTER_GL(); + func_glDrawRangeElements( mode, start, end, count, type, indices ); + LEAVE_GL(); +} + static void WINAPI wine_glDrawRangeElementsEXT( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLvoid* indices ) { void (*func_glDrawRangeElementsEXT)( GLenum, GLuint, GLuint, GLsizei, GLenum, GLvoid* ) = extension_funcs[EXT_glDrawRangeElementsEXT]; TRACE("(%d, %d, %d, %d, %d, %p)\n", mode, start, end, count, type, indices ); @@ -4632,6 +4833,14 @@ static void WINAPI wine_glGetBufferSubDataARB( GLenum target, INT_PTR offset, IN LEAVE_GL(); } +static void WINAPI wine_glGetColorTable( GLenum target, GLenum format, GLenum type, GLvoid* table ) { + void (*func_glGetColorTable)( GLenum, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glGetColorTable]; + TRACE("(%d, %d, %d, %p)\n", target, format, type, table ); + ENTER_GL(); + func_glGetColorTable( target, format, type, table ); + LEAVE_GL(); +} + static void WINAPI wine_glGetColorTableEXT( GLenum target, GLenum format, GLenum type, GLvoid* data ) { void (*func_glGetColorTableEXT)( GLenum, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glGetColorTableEXT]; TRACE("(%d, %d, %d, %p)\n", target, format, type, data ); @@ -4640,6 +4849,14 @@ static void WINAPI wine_glGetColorTableEXT( GLenum target, GLenum format, GLenum LEAVE_GL(); } +static void WINAPI wine_glGetColorTableParameterfv( GLenum target, GLenum pname, GLfloat* params ) { + void (*func_glGetColorTableParameterfv)( GLenum, GLenum, GLfloat* ) = extension_funcs[EXT_glGetColorTableParameterfv]; + TRACE("(%d, %d, %p)\n", target, pname, params ); + ENTER_GL(); + func_glGetColorTableParameterfv( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glGetColorTableParameterfvEXT( GLenum target, GLenum pname, GLfloat* params ) { void (*func_glGetColorTableParameterfvEXT)( GLenum, GLenum, GLfloat* ) = extension_funcs[EXT_glGetColorTableParameterfvEXT]; TRACE("(%d, %d, %p)\n", target, pname, params ); @@ -4656,6 +4873,14 @@ static void WINAPI wine_glGetColorTableParameterfvSGI( GLenum target, GLenum pna LEAVE_GL(); } +static void WINAPI wine_glGetColorTableParameteriv( GLenum target, GLenum pname, GLint* params ) { + void (*func_glGetColorTableParameteriv)( GLenum, GLenum, GLint* ) = extension_funcs[EXT_glGetColorTableParameteriv]; + TRACE("(%d, %d, %p)\n", target, pname, params ); + ENTER_GL(); + func_glGetColorTableParameteriv( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glGetColorTableParameterivEXT( GLenum target, GLenum pname, GLint* params ) { void (*func_glGetColorTableParameterivEXT)( GLenum, GLenum, GLint* ) = extension_funcs[EXT_glGetColorTableParameterivEXT]; TRACE("(%d, %d, %p)\n", target, pname, params ); @@ -4752,6 +4977,14 @@ static void WINAPI wine_glGetCompressedTextureImageEXT( GLuint texture, GLenum t LEAVE_GL(); } +static void WINAPI wine_glGetConvolutionFilter( GLenum target, GLenum format, GLenum type, GLvoid* image ) { + void (*func_glGetConvolutionFilter)( GLenum, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glGetConvolutionFilter]; + TRACE("(%d, %d, %d, %p)\n", target, format, type, image ); + ENTER_GL(); + func_glGetConvolutionFilter( target, format, type, image ); + LEAVE_GL(); +} + static void WINAPI wine_glGetConvolutionFilterEXT( GLenum target, GLenum format, GLenum type, GLvoid* image ) { void (*func_glGetConvolutionFilterEXT)( GLenum, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glGetConvolutionFilterEXT]; TRACE("(%d, %d, %d, %p)\n", target, format, type, image ); @@ -4760,6 +4993,14 @@ static void WINAPI wine_glGetConvolutionFilterEXT( GLenum target, GLenum format, LEAVE_GL(); } +static void WINAPI wine_glGetConvolutionParameterfv( GLenum target, GLenum pname, GLfloat* params ) { + void (*func_glGetConvolutionParameterfv)( GLenum, GLenum, GLfloat* ) = extension_funcs[EXT_glGetConvolutionParameterfv]; + TRACE("(%d, %d, %p)\n", target, pname, params ); + ENTER_GL(); + func_glGetConvolutionParameterfv( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glGetConvolutionParameterfvEXT( GLenum target, GLenum pname, GLfloat* params ) { void (*func_glGetConvolutionParameterfvEXT)( GLenum, GLenum, GLfloat* ) = extension_funcs[EXT_glGetConvolutionParameterfvEXT]; TRACE("(%d, %d, %p)\n", target, pname, params ); @@ -4768,6 +5009,14 @@ static void WINAPI wine_glGetConvolutionParameterfvEXT( GLenum target, GLenum pn LEAVE_GL(); } +static void WINAPI wine_glGetConvolutionParameteriv( GLenum target, GLenum pname, GLint* params ) { + void (*func_glGetConvolutionParameteriv)( GLenum, GLenum, GLint* ) = extension_funcs[EXT_glGetConvolutionParameteriv]; + TRACE("(%d, %d, %p)\n", target, pname, params ); + ENTER_GL(); + func_glGetConvolutionParameteriv( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glGetConvolutionParameterivEXT( GLenum target, GLenum pname, GLint* params ) { void (*func_glGetConvolutionParameterivEXT)( GLenum, GLenum, GLint* ) = extension_funcs[EXT_glGetConvolutionParameterivEXT]; TRACE("(%d, %d, %p)\n", target, pname, params ); @@ -4918,6 +5167,14 @@ static unsigned int WINAPI wine_glGetHandleARB( GLenum pname ) { return ret_value; } +static void WINAPI wine_glGetHistogram( GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid* values ) { + void (*func_glGetHistogram)( GLenum, GLboolean, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glGetHistogram]; + TRACE("(%d, %d, %d, %d, %p)\n", target, reset, format, type, values ); + ENTER_GL(); + func_glGetHistogram( target, reset, format, type, values ); + LEAVE_GL(); +} + static void WINAPI wine_glGetHistogramEXT( GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid* values ) { void (*func_glGetHistogramEXT)( GLenum, GLboolean, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glGetHistogramEXT]; TRACE("(%d, %d, %d, %d, %p)\n", target, reset, format, type, values ); @@ -4926,6 +5183,14 @@ static void WINAPI wine_glGetHistogramEXT( GLenum target, GLboolean reset, GLenu LEAVE_GL(); } +static void WINAPI wine_glGetHistogramParameterfv( GLenum target, GLenum pname, GLfloat* params ) { + void (*func_glGetHistogramParameterfv)( GLenum, GLenum, GLfloat* ) = extension_funcs[EXT_glGetHistogramParameterfv]; + TRACE("(%d, %d, %p)\n", target, pname, params ); + ENTER_GL(); + func_glGetHistogramParameterfv( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glGetHistogramParameterfvEXT( GLenum target, GLenum pname, GLfloat* params ) { void (*func_glGetHistogramParameterfvEXT)( GLenum, GLenum, GLfloat* ) = extension_funcs[EXT_glGetHistogramParameterfvEXT]; TRACE("(%d, %d, %p)\n", target, pname, params ); @@ -4934,6 +5199,14 @@ static void WINAPI wine_glGetHistogramParameterfvEXT( GLenum target, GLenum pnam LEAVE_GL(); } +static void WINAPI wine_glGetHistogramParameteriv( GLenum target, GLenum pname, GLint* params ) { + void (*func_glGetHistogramParameteriv)( GLenum, GLenum, GLint* ) = extension_funcs[EXT_glGetHistogramParameteriv]; + TRACE("(%d, %d, %p)\n", target, pname, params ); + ENTER_GL(); + func_glGetHistogramParameteriv( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glGetHistogramParameterivEXT( GLenum target, GLenum pname, GLint* params ) { void (*func_glGetHistogramParameterivEXT)( GLenum, GLenum, GLint* ) = extension_funcs[EXT_glGetHistogramParameterivEXT]; TRACE("(%d, %d, %p)\n", target, pname, params ); @@ -5096,6 +5369,14 @@ static void WINAPI wine_glGetMapParameterivNV( GLenum target, GLenum pname, GLin LEAVE_GL(); } +static void WINAPI wine_glGetMinmax( GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid* values ) { + void (*func_glGetMinmax)( GLenum, GLboolean, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glGetMinmax]; + TRACE("(%d, %d, %d, %d, %p)\n", target, reset, format, type, values ); + ENTER_GL(); + func_glGetMinmax( target, reset, format, type, values ); + LEAVE_GL(); +} + static void WINAPI wine_glGetMinmaxEXT( GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid* values ) { void (*func_glGetMinmaxEXT)( GLenum, GLboolean, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glGetMinmaxEXT]; TRACE("(%d, %d, %d, %d, %p)\n", target, reset, format, type, values ); @@ -5104,6 +5385,14 @@ static void WINAPI wine_glGetMinmaxEXT( GLenum target, GLboolean reset, GLenum f LEAVE_GL(); } +static void WINAPI wine_glGetMinmaxParameterfv( GLenum target, GLenum pname, GLfloat* params ) { + void (*func_glGetMinmaxParameterfv)( GLenum, GLenum, GLfloat* ) = extension_funcs[EXT_glGetMinmaxParameterfv]; + TRACE("(%d, %d, %p)\n", target, pname, params ); + ENTER_GL(); + func_glGetMinmaxParameterfv( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glGetMinmaxParameterfvEXT( GLenum target, GLenum pname, GLfloat* params ) { void (*func_glGetMinmaxParameterfvEXT)( GLenum, GLenum, GLfloat* ) = extension_funcs[EXT_glGetMinmaxParameterfvEXT]; TRACE("(%d, %d, %p)\n", target, pname, params ); @@ -5112,6 +5401,14 @@ static void WINAPI wine_glGetMinmaxParameterfvEXT( GLenum target, GLenum pname, LEAVE_GL(); } +static void WINAPI wine_glGetMinmaxParameteriv( GLenum target, GLenum pname, GLint* params ) { + void (*func_glGetMinmaxParameteriv)( GLenum, GLenum, GLint* ) = extension_funcs[EXT_glGetMinmaxParameteriv]; + TRACE("(%d, %d, %p)\n", target, pname, params ); + ENTER_GL(); + func_glGetMinmaxParameteriv( target, pname, params ); + LEAVE_GL(); +} + static void WINAPI wine_glGetMinmaxParameterivEXT( GLenum target, GLenum pname, GLint* params ) { void (*func_glGetMinmaxParameterivEXT)( GLenum, GLenum, GLint* ) = extension_funcs[EXT_glGetMinmaxParameterivEXT]; TRACE("(%d, %d, %p)\n", target, pname, params ); @@ -5664,6 +5961,14 @@ static void WINAPI wine_glGetRenderbufferParameterivEXT( GLenum target, GLenum p LEAVE_GL(); } +static void WINAPI wine_glGetSeparableFilter( GLenum target, GLenum format, GLenum type, GLvoid* row, GLvoid* column, GLvoid* span ) { + void (*func_glGetSeparableFilter)( GLenum, GLenum, GLenum, GLvoid*, GLvoid*, GLvoid* ) = extension_funcs[EXT_glGetSeparableFilter]; + TRACE("(%d, %d, %d, %p, %p, %p)\n", target, format, type, row, column, span ); + ENTER_GL(); + func_glGetSeparableFilter( target, format, type, row, column, span ); + LEAVE_GL(); +} + static void WINAPI wine_glGetSeparableFilterEXT( GLenum target, GLenum format, GLenum type, GLvoid* row, GLvoid* column, GLvoid* span ) { void (*func_glGetSeparableFilterEXT)( GLenum, GLenum, GLenum, GLvoid*, GLvoid*, GLvoid* ) = extension_funcs[EXT_glGetSeparableFilterEXT]; TRACE("(%d, %d, %d, %p, %p, %p)\n", target, format, type, row, column, span ); @@ -6278,6 +6583,14 @@ static void WINAPI wine_glHintPGI( GLenum target, GLint mode ) { LEAVE_GL(); } +static void WINAPI wine_glHistogram( GLenum target, GLsizei width, GLenum internalformat, GLboolean sink ) { + void (*func_glHistogram)( GLenum, GLsizei, GLenum, GLboolean ) = extension_funcs[EXT_glHistogram]; + TRACE("(%d, %d, %d, %d)\n", target, width, internalformat, sink ); + ENTER_GL(); + func_glHistogram( target, width, internalformat, sink ); + LEAVE_GL(); +} + static void WINAPI wine_glHistogramEXT( GLenum target, GLsizei width, GLenum internalformat, GLboolean sink ) { void (*func_glHistogramEXT)( GLenum, GLsizei, GLenum, GLboolean ) = extension_funcs[EXT_glHistogramEXT]; TRACE("(%d, %d, %d, %d)\n", target, width, internalformat, sink ); @@ -7000,6 +7313,14 @@ static void WINAPI wine_glMatrixTranslatefEXT( GLenum mode, GLfloat x, GLfloat y LEAVE_GL(); } +static void WINAPI wine_glMinmax( GLenum target, GLenum internalformat, GLboolean sink ) { + void (*func_glMinmax)( GLenum, GLenum, GLboolean ) = extension_funcs[EXT_glMinmax]; + TRACE("(%d, %d, %d)\n", target, internalformat, sink ); + ENTER_GL(); + func_glMinmax( target, internalformat, sink ); + LEAVE_GL(); +} + static void WINAPI wine_glMinmaxEXT( GLenum target, GLenum internalformat, GLboolean sink ) { void (*func_glMinmaxEXT)( GLenum, GLenum, GLboolean ) = extension_funcs[EXT_glMinmaxEXT]; TRACE("(%d, %d, %d)\n", target, internalformat, sink ); @@ -8744,6 +9065,14 @@ static void WINAPI wine_glPresentFrameKeyedNV( GLuint video_slot, UINT64 minPres LEAVE_GL(); } +static void WINAPI wine_glPrimitiveRestartIndex( GLuint index ) { + void (*func_glPrimitiveRestartIndex)( GLuint ) = extension_funcs[EXT_glPrimitiveRestartIndex]; + TRACE("(%d)\n", index ); + ENTER_GL(); + func_glPrimitiveRestartIndex( index ); + LEAVE_GL(); +} + static void WINAPI wine_glPrimitiveRestartIndexNV( GLuint index ) { void (*func_glPrimitiveRestartIndexNV)( GLuint ) = extension_funcs[EXT_glPrimitiveRestartIndexNV]; TRACE("(%d)\n", index ); @@ -9616,6 +9945,14 @@ static void WINAPI wine_glRequestResidentProgramsNV( GLsizei n, GLuint* programs LEAVE_GL(); } +static void WINAPI wine_glResetHistogram( GLenum target ) { + void (*func_glResetHistogram)( GLenum ) = extension_funcs[EXT_glResetHistogram]; + TRACE("(%d)\n", target ); + ENTER_GL(); + func_glResetHistogram( target ); + LEAVE_GL(); +} + static void WINAPI wine_glResetHistogramEXT( GLenum target ) { void (*func_glResetHistogramEXT)( GLenum ) = extension_funcs[EXT_glResetHistogramEXT]; TRACE("(%d)\n", target ); @@ -9624,6 +9961,14 @@ static void WINAPI wine_glResetHistogramEXT( GLenum target ) { LEAVE_GL(); } +static void WINAPI wine_glResetMinmax( GLenum target ) { + void (*func_glResetMinmax)( GLenum ) = extension_funcs[EXT_glResetMinmax]; + TRACE("(%d)\n", target ); + ENTER_GL(); + func_glResetMinmax( target ); + LEAVE_GL(); +} + static void WINAPI wine_glResetMinmaxEXT( GLenum target ) { void (*func_glResetMinmaxEXT)( GLenum ) = extension_funcs[EXT_glResetMinmaxEXT]; TRACE("(%d)\n", target ); @@ -10032,6 +10377,14 @@ static void WINAPI wine_glSelectTextureSGIS( GLenum target ) { LEAVE_GL(); } +static void WINAPI wine_glSeparableFilter2D( GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* row, GLvoid* column ) { + void (*func_glSeparableFilter2D)( GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, GLvoid*, GLvoid* ) = extension_funcs[EXT_glSeparableFilter2D]; + TRACE("(%d, %d, %d, %d, %d, %d, %p, %p)\n", target, internalformat, width, height, format, type, row, column ); + ENTER_GL(); + func_glSeparableFilter2D( target, internalformat, width, height, format, type, row, column ); + LEAVE_GL(); +} + static void WINAPI wine_glSeparableFilter2DEXT( GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* row, GLvoid* column ) { void (*func_glSeparableFilter2DEXT)( GLenum, GLenum, GLsizei, GLsizei, GLenum, GLenum, GLvoid*, GLvoid* ) = extension_funcs[EXT_glSeparableFilter2DEXT]; TRACE("(%d, %d, %d, %d, %d, %d, %p, %p)\n", target, internalformat, width, height, format, type, row, column ); @@ -10390,6 +10743,14 @@ static GLboolean WINAPI wine_glTestObjectAPPLE( GLenum object, GLuint name ) { return ret_value; } +static void WINAPI wine_glTexBuffer( GLenum target, GLenum internalformat, GLuint buffer ) { + void (*func_glTexBuffer)( GLenum, GLenum, GLuint ) = extension_funcs[EXT_glTexBuffer]; + TRACE("(%d, %d, %d)\n", target, internalformat, buffer ); + ENTER_GL(); + func_glTexBuffer( target, internalformat, buffer ); + LEAVE_GL(); +} + static void WINAPI wine_glTexBufferARB( GLenum target, GLenum internalformat, GLuint buffer ) { void (*func_glTexBufferARB)( GLenum, GLenum, GLuint ) = extension_funcs[EXT_glTexBufferARB]; TRACE("(%d, %d, %d)\n", target, internalformat, buffer ); @@ -10630,6 +10991,14 @@ static void WINAPI wine_glTexFilterFuncSGIS( GLenum target, GLenum filter, GLsiz LEAVE_GL(); } +static void WINAPI wine_glTexImage3D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLvoid* pixels ) { + void (*func_glTexImage3D)( GLenum, GLint, GLint, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glTexImage3D]; + TRACE("(%d, %d, %d, %d, %d, %d, %d, %d, %d, %p)\n", target, level, internalformat, width, height, depth, border, format, type, pixels ); + ENTER_GL(); + func_glTexImage3D( target, level, internalformat, width, height, depth, border, format, type, pixels ); + LEAVE_GL(); +} + static void WINAPI wine_glTexImage3DEXT( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLvoid* pixels ) { void (*func_glTexImage3DEXT)( GLenum, GLint, GLenum, GLsizei, GLsizei, GLsizei, GLint, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glTexImage3DEXT]; TRACE("(%d, %d, %d, %d, %d, %d, %d, %d, %d, %p)\n", target, level, internalformat, width, height, depth, border, format, type, pixels ); @@ -10702,6 +11071,14 @@ static void WINAPI wine_glTexSubImage2DEXT( GLenum target, GLint level, GLint xo LEAVE_GL(); } +static void WINAPI wine_glTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid* pixels ) { + void (*func_glTexSubImage3D)( GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glTexSubImage3D]; + TRACE("(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %p)\n", target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels ); + ENTER_GL(); + func_glTexSubImage3D( target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels ); + LEAVE_GL(); +} + static void WINAPI wine_glTexSubImage3DEXT( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid* pixels ) { void (*func_glTexSubImage3DEXT)( GLenum, GLint, GLint, GLint, GLint, GLsizei, GLsizei, GLsizei, GLenum, GLenum, GLvoid* ) = extension_funcs[EXT_glTexSubImage3DEXT]; TRACE("(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %p)\n", target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels ); @@ -12492,11 +12869,11 @@ static void WINAPI wine_glVertexAttribArrayObjectATI( GLuint index, GLint size, LEAVE_GL(); } -static void WINAPI wine_glVertexAttribDivisor( GLuint index, GLuint divisor ) { - void (*func_glVertexAttribDivisor)( GLuint, GLuint ) = extension_funcs[EXT_glVertexAttribDivisor]; +static void WINAPI wine_glVertexAttribDivisorARB( GLuint index, GLuint divisor ) { + void (*func_glVertexAttribDivisorARB)( GLuint, GLuint ) = extension_funcs[EXT_glVertexAttribDivisorARB]; TRACE("(%d, %d)\n", index, divisor ); ENTER_GL(); - func_glVertexAttribDivisor( index, divisor ); + func_glVertexAttribDivisorARB( index, divisor ); LEAVE_GL(); } @@ -13340,14 +13717,6 @@ static void WINAPI wine_glVertexWeighthvNV( unsigned short* weight ) { LEAVE_GL(); } -static void WINAPI wine_glVideoParameterivNV( GLuint video_slot, GLenum pname, GLint* params ) { - void (*func_glVideoParameterivNV)( GLuint, GLenum, GLint* ) = extension_funcs[EXT_glVideoParameterivNV]; - TRACE("(%d, %d, %p)\n", video_slot, pname, params ); - ENTER_GL(); - func_glVideoParameterivNV( video_slot, pname, params ); - LEAVE_GL(); -} - static void WINAPI wine_glWeightPointerARB( GLint size, GLenum type, GLsizei stride, GLvoid* pointer ) { void (*func_glWeightPointerARB)( GLint, GLenum, GLsizei, GLvoid* ) = extension_funcs[EXT_glWeightPointerARB]; TRACE("(%d, %d, %d, %p)\n", size, type, stride, pointer ); @@ -13948,7 +14317,9 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glBinormal3sEXT", "GL_EXT_coordinate_frame", wine_glBinormal3sEXT }, { "glBinormal3svEXT", "GL_EXT_coordinate_frame", wine_glBinormal3svEXT }, { "glBinormalPointerEXT", "GL_EXT_coordinate_frame", wine_glBinormalPointerEXT }, + { "glBlendColor", "GL_VERSION_1_2", wine_glBlendColor }, { "glBlendColorEXT", "GL_EXT_blend_color", wine_glBlendColorEXT }, + { "glBlendEquation", "GL_VERSION_1_2", wine_glBlendEquation }, { "glBlendEquationEXT", "GL_EXT_blend_minmax", wine_glBlendEquationEXT }, { "glBlendEquationSeparate", "GL_VERSION_2_0", wine_glBlendEquationSeparate }, { "glBlendEquationSeparateEXT", "GL_EXT_blend_equation_separate", wine_glBlendEquationSeparateEXT }, @@ -13975,7 +14346,7 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glClearColorIiEXT", "GL_EXT_texture_integer", wine_glClearColorIiEXT }, { "glClearColorIuiEXT", "GL_EXT_texture_integer", wine_glClearColorIuiEXT }, { "glClearDepthdNV", "GL_NV_depth_buffer_float", wine_glClearDepthdNV }, - { "glClientActiveTexture", "GL_VERSION_1_3", wine_glClientActiveTexture }, + { "glClientActiveTexture", "GL_VERSION_1_3_DEPRECATED", wine_glClientActiveTexture }, { "glClientActiveTextureARB", "GL_ARB_multitexture", wine_glClientActiveTextureARB }, { "glClientActiveVertexStreamATI", "GL_ATI_vertex_streams", wine_glClientActiveVertexStreamATI }, { "glClientAttribDefaultEXT", "GL_EXT_direct_state_access", wine_glClientAttribDefaultEXT }, @@ -13999,9 +14370,13 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glColorPointerEXT", "GL_EXT_vertex_array", wine_glColorPointerEXT }, { "glColorPointerListIBM", "GL_IBM_vertex_array_lists", wine_glColorPointerListIBM }, { "glColorPointervINTEL", "GL_INTEL_parallel_arrays", wine_glColorPointervINTEL }, + { "glColorSubTable", "GL_VERSION_1_2_DEPRECATED", wine_glColorSubTable }, { "glColorSubTableEXT", "GL_EXT_color_subtable", wine_glColorSubTableEXT }, + { "glColorTable", "GL_VERSION_1_2_DEPRECATED", wine_glColorTable }, { "glColorTableEXT", "GL_EXT_paletted_texture", wine_glColorTableEXT }, + { "glColorTableParameterfv", "GL_VERSION_1_2_DEPRECATED", wine_glColorTableParameterfv }, { "glColorTableParameterfvSGI", "GL_SGI_color_table", wine_glColorTableParameterfvSGI }, + { "glColorTableParameteriv", "GL_VERSION_1_2_DEPRECATED", wine_glColorTableParameteriv }, { "glColorTableParameterivSGI", "GL_SGI_color_table", wine_glColorTableParameterivSGI }, { "glColorTableSGI", "GL_SGI_color_table", wine_glColorTableSGI }, { "glCombinerInputNV", "GL_NV_register_combiners", wine_glCombinerInputNV }, @@ -14037,16 +14412,26 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glCompressedTextureSubImage1DEXT", "GL_EXT_direct_state_access", wine_glCompressedTextureSubImage1DEXT }, { "glCompressedTextureSubImage2DEXT", "GL_EXT_direct_state_access", wine_glCompressedTextureSubImage2DEXT }, { "glCompressedTextureSubImage3DEXT", "GL_EXT_direct_state_access", wine_glCompressedTextureSubImage3DEXT }, + { "glConvolutionFilter1D", "GL_VERSION_1_2_DEPRECATED", wine_glConvolutionFilter1D }, { "glConvolutionFilter1DEXT", "GL_EXT_convolution", wine_glConvolutionFilter1DEXT }, + { "glConvolutionFilter2D", "GL_VERSION_1_2_DEPRECATED", wine_glConvolutionFilter2D }, { "glConvolutionFilter2DEXT", "GL_EXT_convolution", wine_glConvolutionFilter2DEXT }, + { "glConvolutionParameterf", "GL_VERSION_1_2_DEPRECATED", wine_glConvolutionParameterf }, { "glConvolutionParameterfEXT", "GL_EXT_convolution", wine_glConvolutionParameterfEXT }, + { "glConvolutionParameterfv", "GL_VERSION_1_2_DEPRECATED", wine_glConvolutionParameterfv }, { "glConvolutionParameterfvEXT", "GL_EXT_convolution", wine_glConvolutionParameterfvEXT }, + { "glConvolutionParameteri", "GL_VERSION_1_2_DEPRECATED", wine_glConvolutionParameteri }, { "glConvolutionParameteriEXT", "GL_EXT_convolution", wine_glConvolutionParameteriEXT }, + { "glConvolutionParameteriv", "GL_VERSION_1_2_DEPRECATED", wine_glConvolutionParameteriv }, { "glConvolutionParameterivEXT", "GL_EXT_convolution", wine_glConvolutionParameterivEXT }, { "glCopyBufferSubData", "GL_ARB_copy_buffer", wine_glCopyBufferSubData }, + { "glCopyColorSubTable", "GL_VERSION_1_2_DEPRECATED", wine_glCopyColorSubTable }, { "glCopyColorSubTableEXT", "GL_EXT_color_subtable", wine_glCopyColorSubTableEXT }, + { "glCopyColorTable", "GL_VERSION_1_2_DEPRECATED", wine_glCopyColorTable }, { "glCopyColorTableSGI", "GL_SGI_color_table", wine_glCopyColorTableSGI }, + { "glCopyConvolutionFilter1D", "GL_VERSION_1_2_DEPRECATED", wine_glCopyConvolutionFilter1D }, { "glCopyConvolutionFilter1DEXT", "GL_EXT_convolution", wine_glCopyConvolutionFilter1DEXT }, + { "glCopyConvolutionFilter2D", "GL_VERSION_1_2_DEPRECATED", wine_glCopyConvolutionFilter2D }, { "glCopyConvolutionFilter2DEXT", "GL_EXT_convolution", wine_glCopyConvolutionFilter2DEXT }, { "glCopyMultiTexImage1DEXT", "GL_EXT_direct_state_access", wine_glCopyMultiTexImage1DEXT }, { "glCopyMultiTexImage2DEXT", "GL_EXT_direct_state_access", wine_glCopyMultiTexImage2DEXT }, @@ -14057,6 +14442,7 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glCopyTexImage2DEXT", "GL_EXT_copy_texture", wine_glCopyTexImage2DEXT }, { "glCopyTexSubImage1DEXT", "GL_EXT_copy_texture", wine_glCopyTexSubImage1DEXT }, { "glCopyTexSubImage2DEXT", "GL_EXT_copy_texture", wine_glCopyTexSubImage2DEXT }, + { "glCopyTexSubImage3D", "GL_VERSION_1_2", wine_glCopyTexSubImage3D }, { "glCopyTexSubImage3DEXT", "GL_EXT_copy_texture", wine_glCopyTexSubImage3DEXT }, { "glCopyTextureImage1DEXT", "GL_EXT_direct_state_access", wine_glCopyTextureImage1DEXT }, { "glCopyTextureImage2DEXT", "GL_EXT_direct_state_access", wine_glCopyTextureImage2DEXT }, @@ -14112,6 +14498,7 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glDisableVertexAttribArrayARB", "GL_ARB_vertex_program", wine_glDisableVertexAttribArrayARB }, { "glDisablei", "GL_VERSION_3_0", wine_glDisablei }, { "glDrawArraysEXT", "GL_EXT_vertex_array", wine_glDrawArraysEXT }, + { "glDrawArraysInstanced", "GL_VERSION_3_1", wine_glDrawArraysInstanced }, { "glDrawArraysInstancedARB", "GL_ARB_draw_instanced", wine_glDrawArraysInstancedARB }, { "glDrawArraysInstancedEXT", "GL_EXT_draw_instanced", wine_glDrawArraysInstancedEXT }, { "glDrawBufferRegion", "GL_KTX_buffer_region", wine_glDrawBufferRegion }, @@ -14120,11 +14507,13 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glDrawBuffersATI", "GL_ATI_draw_buffers", wine_glDrawBuffersATI }, { "glDrawElementArrayAPPLE", "GL_APPLE_element_array", wine_glDrawElementArrayAPPLE }, { "glDrawElementArrayATI", "GL_ATI_element_array", wine_glDrawElementArrayATI }, + { "glDrawElementsInstanced", "GL_VERSION_3_1", wine_glDrawElementsInstanced }, { "glDrawElementsInstancedARB", "GL_ARB_draw_instanced", wine_glDrawElementsInstancedARB }, { "glDrawElementsInstancedEXT", "GL_EXT_draw_instanced", wine_glDrawElementsInstancedEXT }, { "glDrawMeshArraysSUN", "GL_SUN_mesh_array", wine_glDrawMeshArraysSUN }, { "glDrawRangeElementArrayAPPLE", "GL_APPLE_element_array", wine_glDrawRangeElementArrayAPPLE }, { "glDrawRangeElementArrayATI", "GL_ATI_element_array", wine_glDrawRangeElementArrayATI }, + { "glDrawRangeElements", "GL_VERSION_1_2", wine_glDrawRangeElements }, { "glDrawRangeElementsEXT", "GL_EXT_draw_range_elements", wine_glDrawRangeElementsEXT }, { "glDrawTransformFeedbackNV", "GL_NV_transform_feedback2", wine_glDrawTransformFeedbackNV }, { "glEdgeFlagPointerEXT", "GL_EXT_vertex_array", wine_glEdgeFlagPointerEXT }, @@ -14163,16 +14552,16 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glFlushRasterSGIX", "GL_SGIX_flush_raster", wine_glFlushRasterSGIX }, { "glFlushVertexArrayRangeAPPLE", "GL_APPLE_vertex_array_range", wine_glFlushVertexArrayRangeAPPLE }, { "glFlushVertexArrayRangeNV", "GL_NV_vertex_array_range", wine_glFlushVertexArrayRangeNV }, - { "glFogCoordPointer", "GL_VERSION_1_4", wine_glFogCoordPointer }, + { "glFogCoordPointer", "GL_VERSION_1_4_DEPRECATED", wine_glFogCoordPointer }, { "glFogCoordPointerEXT", "GL_EXT_fog_coord", wine_glFogCoordPointerEXT }, { "glFogCoordPointerListIBM", "GL_IBM_vertex_array_lists", wine_glFogCoordPointerListIBM }, - { "glFogCoordd", "GL_VERSION_1_4", wine_glFogCoordd }, + { "glFogCoordd", "GL_VERSION_1_4_DEPRECATED", wine_glFogCoordd }, { "glFogCoorddEXT", "GL_EXT_fog_coord", wine_glFogCoorddEXT }, - { "glFogCoorddv", "GL_VERSION_1_4", wine_glFogCoorddv }, + { "glFogCoorddv", "GL_VERSION_1_4_DEPRECATED", wine_glFogCoorddv }, { "glFogCoorddvEXT", "GL_EXT_fog_coord", wine_glFogCoorddvEXT }, - { "glFogCoordf", "GL_VERSION_1_4", wine_glFogCoordf }, + { "glFogCoordf", "GL_VERSION_1_4_DEPRECATED", wine_glFogCoordf }, { "glFogCoordfEXT", "GL_EXT_fog_coord", wine_glFogCoordfEXT }, - { "glFogCoordfv", "GL_VERSION_1_4", wine_glFogCoordfv }, + { "glFogCoordfv", "GL_VERSION_1_4_DEPRECATED", wine_glFogCoordfv }, { "glFogCoordfvEXT", "GL_EXT_fog_coord", wine_glFogCoordfvEXT }, { "glFogCoordhNV", "GL_NV_half_float", wine_glFogCoordhNV }, { "glFogCoordhvNV", "GL_NV_half_float", wine_glFogCoordhvNV }, @@ -14260,9 +14649,12 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glGetBufferPointervARB", "GL_ARB_vertex_buffer_object", wine_glGetBufferPointervARB }, { "glGetBufferSubData", "GL_VERSION_1_5", wine_glGetBufferSubData }, { "glGetBufferSubDataARB", "GL_ARB_vertex_buffer_object", wine_glGetBufferSubDataARB }, + { "glGetColorTable", "GL_VERSION_1_2_DEPRECATED", wine_glGetColorTable }, { "glGetColorTableEXT", "GL_EXT_paletted_texture", wine_glGetColorTableEXT }, + { "glGetColorTableParameterfv", "GL_VERSION_1_2_DEPRECATED", wine_glGetColorTableParameterfv }, { "glGetColorTableParameterfvEXT", "GL_EXT_paletted_texture", wine_glGetColorTableParameterfvEXT }, { "glGetColorTableParameterfvSGI", "GL_SGI_color_table", wine_glGetColorTableParameterfvSGI }, + { "glGetColorTableParameteriv", "GL_VERSION_1_2_DEPRECATED", wine_glGetColorTableParameteriv }, { "glGetColorTableParameterivEXT", "GL_EXT_paletted_texture", wine_glGetColorTableParameterivEXT }, { "glGetColorTableParameterivSGI", "GL_SGI_color_table", wine_glGetColorTableParameterivSGI }, { "glGetColorTableSGI", "GL_SGI_color_table", wine_glGetColorTableSGI }, @@ -14275,8 +14667,11 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glGetCompressedTexImage", "GL_VERSION_1_3", wine_glGetCompressedTexImage }, { "glGetCompressedTexImageARB", "GL_ARB_texture_compression", wine_glGetCompressedTexImageARB }, { "glGetCompressedTextureImageEXT", "GL_EXT_direct_state_access", wine_glGetCompressedTextureImageEXT }, + { "glGetConvolutionFilter", "GL_VERSION_1_2_DEPRECATED", wine_glGetConvolutionFilter }, { "glGetConvolutionFilterEXT", "GL_EXT_convolution", wine_glGetConvolutionFilterEXT }, + { "glGetConvolutionParameterfv", "GL_VERSION_1_2_DEPRECATED", wine_glGetConvolutionParameterfv }, { "glGetConvolutionParameterfvEXT", "GL_EXT_convolution", wine_glGetConvolutionParameterfvEXT }, + { "glGetConvolutionParameteriv", "GL_VERSION_1_2_DEPRECATED", wine_glGetConvolutionParameteriv }, { "glGetConvolutionParameterivEXT", "GL_EXT_convolution", wine_glGetConvolutionParameterivEXT }, { "glGetDetailTexFuncSGIS", "GL_SGIS_detail_texture", wine_glGetDetailTexFuncSGIS }, { "glGetDoubleIndexedvEXT", "GL_EXT_direct_state_access", wine_glGetDoubleIndexedvEXT }, @@ -14295,8 +14690,11 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glGetFramebufferAttachmentParameterivEXT", "GL_EXT_framebuffer_object", wine_glGetFramebufferAttachmentParameterivEXT }, { "glGetFramebufferParameterivEXT", "GL_EXT_direct_state_access", wine_glGetFramebufferParameterivEXT }, { "glGetHandleARB", "GL_ARB_shader_objects", wine_glGetHandleARB }, + { "glGetHistogram", "GL_VERSION_1_2_DEPRECATED", wine_glGetHistogram }, { "glGetHistogramEXT", "GL_EXT_histogram", wine_glGetHistogramEXT }, + { "glGetHistogramParameterfv", "GL_VERSION_1_2_DEPRECATED", wine_glGetHistogramParameterfv }, { "glGetHistogramParameterfvEXT", "GL_EXT_histogram", wine_glGetHistogramParameterfvEXT }, + { "glGetHistogramParameteriv", "GL_VERSION_1_2_DEPRECATED", wine_glGetHistogramParameteriv }, { "glGetHistogramParameterivEXT", "GL_EXT_histogram", wine_glGetHistogramParameterivEXT }, { "glGetImageTransformParameterfvHP", "GL_HP_image_transform", wine_glGetImageTransformParameterfvHP }, { "glGetImageTransformParameterivHP", "GL_HP_image_transform", wine_glGetImageTransformParameterivHP }, @@ -14317,8 +14715,11 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glGetMapControlPointsNV", "GL_NV_evaluators", wine_glGetMapControlPointsNV }, { "glGetMapParameterfvNV", "GL_NV_evaluators", wine_glGetMapParameterfvNV }, { "glGetMapParameterivNV", "GL_NV_evaluators", wine_glGetMapParameterivNV }, + { "glGetMinmax", "GL_VERSION_1_2_DEPRECATED", wine_glGetMinmax }, { "glGetMinmaxEXT", "GL_EXT_histogram", wine_glGetMinmaxEXT }, + { "glGetMinmaxParameterfv", "GL_VERSION_1_2_DEPRECATED", wine_glGetMinmaxParameterfv }, { "glGetMinmaxParameterfvEXT", "GL_EXT_histogram", wine_glGetMinmaxParameterfvEXT }, + { "glGetMinmaxParameteriv", "GL_VERSION_1_2_DEPRECATED", wine_glGetMinmaxParameteriv }, { "glGetMinmaxParameterivEXT", "GL_EXT_histogram", wine_glGetMinmaxParameterivEXT }, { "glGetMultiTexEnvfvEXT", "GL_EXT_direct_state_access", wine_glGetMultiTexEnvfvEXT }, { "glGetMultiTexEnvivEXT", "GL_EXT_direct_state_access", wine_glGetMultiTexEnvivEXT }, @@ -14388,6 +14789,7 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glGetQueryivARB", "GL_ARB_occlusion_query", wine_glGetQueryivARB }, { "glGetRenderbufferParameteriv", "GL_ARB_framebuffer_object", wine_glGetRenderbufferParameteriv }, { "glGetRenderbufferParameterivEXT", "GL_EXT_framebuffer_object", wine_glGetRenderbufferParameterivEXT }, + { "glGetSeparableFilter", "GL_VERSION_1_2_DEPRECATED", wine_glGetSeparableFilter }, { "glGetSeparableFilterEXT", "GL_EXT_convolution", wine_glGetSeparableFilterEXT }, { "glGetShaderInfoLog", "GL_VERSION_2_0", wine_glGetShaderInfoLog }, { "glGetShaderSource", "GL_VERSION_2_0", wine_glGetShaderSource }, @@ -14463,6 +14865,7 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glGlobalAlphaFactoruiSUN", "GL_SUN_global_alpha", wine_glGlobalAlphaFactoruiSUN }, { "glGlobalAlphaFactorusSUN", "GL_SUN_global_alpha", wine_glGlobalAlphaFactorusSUN }, { "glHintPGI", "GL_PGI_misc_hints", wine_glHintPGI }, + { "glHistogram", "GL_VERSION_1_2_DEPRECATED", wine_glHistogram }, { "glHistogramEXT", "GL_EXT_histogram", wine_glHistogramEXT }, { "glIglooInterfaceSGIX", "GL_SGIX_igloo_interface", wine_glIglooInterfaceSGIX }, { "glImageTransformParameterfHP", "GL_HP_image_transform", wine_glImageTransformParameterfHP }, @@ -14508,9 +14911,9 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glListParameterivSGIX", "GL_SGIX_list_priority", wine_glListParameterivSGIX }, { "glLoadIdentityDeformationMapSGIX", "GL_SGIX_polynomial_ffd", wine_glLoadIdentityDeformationMapSGIX }, { "glLoadProgramNV", "GL_NV_vertex_program", wine_glLoadProgramNV }, - { "glLoadTransposeMatrixd", "GL_VERSION_1_3", wine_glLoadTransposeMatrixd }, + { "glLoadTransposeMatrixd", "GL_VERSION_1_3_DEPRECATED", wine_glLoadTransposeMatrixd }, { "glLoadTransposeMatrixdARB", "GL_ARB_transpose_matrix", wine_glLoadTransposeMatrixdARB }, - { "glLoadTransposeMatrixf", "GL_VERSION_1_3", wine_glLoadTransposeMatrixf }, + { "glLoadTransposeMatrixf", "GL_VERSION_1_3_DEPRECATED", wine_glLoadTransposeMatrixf }, { "glLoadTransposeMatrixfARB", "GL_ARB_transpose_matrix", wine_glLoadTransposeMatrixfARB }, { "glLockArraysEXT", "GL_EXT_compiled_vertex_array", wine_glLockArraysEXT }, { "glMTexCoord2fSGIS", "GL_SGIS_multitexture", wine_glMTexCoord2fSGIS }, @@ -14546,10 +14949,11 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glMatrixScalefEXT", "GL_EXT_direct_state_access", wine_glMatrixScalefEXT }, { "glMatrixTranslatedEXT", "GL_EXT_direct_state_access", wine_glMatrixTranslatedEXT }, { "glMatrixTranslatefEXT", "GL_EXT_direct_state_access", wine_glMatrixTranslatefEXT }, + { "glMinmax", "GL_VERSION_1_2_DEPRECATED", wine_glMinmax }, { "glMinmaxEXT", "GL_EXT_histogram", wine_glMinmaxEXT }, - { "glMultTransposeMatrixd", "GL_VERSION_1_3", wine_glMultTransposeMatrixd }, + { "glMultTransposeMatrixd", "GL_VERSION_1_3_DEPRECATED", wine_glMultTransposeMatrixd }, { "glMultTransposeMatrixdARB", "GL_ARB_transpose_matrix", wine_glMultTransposeMatrixdARB }, - { "glMultTransposeMatrixf", "GL_VERSION_1_3", wine_glMultTransposeMatrixf }, + { "glMultTransposeMatrixf", "GL_VERSION_1_3_DEPRECATED", wine_glMultTransposeMatrixf }, { "glMultTransposeMatrixfARB", "GL_ARB_transpose_matrix", wine_glMultTransposeMatrixfARB }, { "glMultiDrawArrays", "GL_VERSION_1_4", wine_glMultiDrawArrays }, { "glMultiDrawArraysEXT", "GL_EXT_multi_draw_arrays", wine_glMultiDrawArraysEXT }, @@ -14560,108 +14964,108 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glMultiModeDrawArraysIBM", "GL_IBM_multimode_draw_arrays", wine_glMultiModeDrawArraysIBM }, { "glMultiModeDrawElementsIBM", "GL_IBM_multimode_draw_arrays", wine_glMultiModeDrawElementsIBM }, { "glMultiTexBufferEXT", "GL_EXT_direct_state_access", wine_glMultiTexBufferEXT }, - { "glMultiTexCoord1d", "GL_VERSION_1_3", wine_glMultiTexCoord1d }, + { "glMultiTexCoord1d", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord1d }, { "glMultiTexCoord1dARB", "GL_ARB_multitexture", wine_glMultiTexCoord1dARB }, { "glMultiTexCoord1dSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord1dSGIS }, - { "glMultiTexCoord1dv", "GL_VERSION_1_3", wine_glMultiTexCoord1dv }, + { "glMultiTexCoord1dv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord1dv }, { "glMultiTexCoord1dvARB", "GL_ARB_multitexture", wine_glMultiTexCoord1dvARB }, { "glMultiTexCoord1dvSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord1dvSGIS }, - { "glMultiTexCoord1f", "GL_VERSION_1_3", wine_glMultiTexCoord1f }, + { "glMultiTexCoord1f", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord1f }, { "glMultiTexCoord1fARB", "GL_ARB_multitexture", wine_glMultiTexCoord1fARB }, { "glMultiTexCoord1fSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord1fSGIS }, - { "glMultiTexCoord1fv", "GL_VERSION_1_3", wine_glMultiTexCoord1fv }, + { "glMultiTexCoord1fv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord1fv }, { "glMultiTexCoord1fvARB", "GL_ARB_multitexture", wine_glMultiTexCoord1fvARB }, { "glMultiTexCoord1fvSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord1fvSGIS }, { "glMultiTexCoord1hNV", "GL_NV_half_float", wine_glMultiTexCoord1hNV }, { "glMultiTexCoord1hvNV", "GL_NV_half_float", wine_glMultiTexCoord1hvNV }, - { "glMultiTexCoord1i", "GL_VERSION_1_3", wine_glMultiTexCoord1i }, + { "glMultiTexCoord1i", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord1i }, { "glMultiTexCoord1iARB", "GL_ARB_multitexture", wine_glMultiTexCoord1iARB }, { "glMultiTexCoord1iSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord1iSGIS }, - { "glMultiTexCoord1iv", "GL_VERSION_1_3", wine_glMultiTexCoord1iv }, + { "glMultiTexCoord1iv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord1iv }, { "glMultiTexCoord1ivARB", "GL_ARB_multitexture", wine_glMultiTexCoord1ivARB }, { "glMultiTexCoord1ivSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord1ivSGIS }, - { "glMultiTexCoord1s", "GL_VERSION_1_3", wine_glMultiTexCoord1s }, + { "glMultiTexCoord1s", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord1s }, { "glMultiTexCoord1sARB", "GL_ARB_multitexture", wine_glMultiTexCoord1sARB }, { "glMultiTexCoord1sSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord1sSGIS }, - { "glMultiTexCoord1sv", "GL_VERSION_1_3", wine_glMultiTexCoord1sv }, + { "glMultiTexCoord1sv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord1sv }, { "glMultiTexCoord1svARB", "GL_ARB_multitexture", wine_glMultiTexCoord1svARB }, { "glMultiTexCoord1svSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord1svSGIS }, - { "glMultiTexCoord2d", "GL_VERSION_1_3", wine_glMultiTexCoord2d }, + { "glMultiTexCoord2d", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord2d }, { "glMultiTexCoord2dARB", "GL_ARB_multitexture", wine_glMultiTexCoord2dARB }, { "glMultiTexCoord2dSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord2dSGIS }, - { "glMultiTexCoord2dv", "GL_VERSION_1_3", wine_glMultiTexCoord2dv }, + { "glMultiTexCoord2dv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord2dv }, { "glMultiTexCoord2dvARB", "GL_ARB_multitexture", wine_glMultiTexCoord2dvARB }, { "glMultiTexCoord2dvSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord2dvSGIS }, - { "glMultiTexCoord2f", "GL_VERSION_1_3", wine_glMultiTexCoord2f }, + { "glMultiTexCoord2f", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord2f }, { "glMultiTexCoord2fARB", "GL_ARB_multitexture", wine_glMultiTexCoord2fARB }, { "glMultiTexCoord2fSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord2fSGIS }, - { "glMultiTexCoord2fv", "GL_VERSION_1_3", wine_glMultiTexCoord2fv }, + { "glMultiTexCoord2fv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord2fv }, { "glMultiTexCoord2fvARB", "GL_ARB_multitexture", wine_glMultiTexCoord2fvARB }, { "glMultiTexCoord2fvSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord2fvSGIS }, { "glMultiTexCoord2hNV", "GL_NV_half_float", wine_glMultiTexCoord2hNV }, { "glMultiTexCoord2hvNV", "GL_NV_half_float", wine_glMultiTexCoord2hvNV }, - { "glMultiTexCoord2i", "GL_VERSION_1_3", wine_glMultiTexCoord2i }, + { "glMultiTexCoord2i", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord2i }, { "glMultiTexCoord2iARB", "GL_ARB_multitexture", wine_glMultiTexCoord2iARB }, { "glMultiTexCoord2iSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord2iSGIS }, - { "glMultiTexCoord2iv", "GL_VERSION_1_3", wine_glMultiTexCoord2iv }, + { "glMultiTexCoord2iv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord2iv }, { "glMultiTexCoord2ivARB", "GL_ARB_multitexture", wine_glMultiTexCoord2ivARB }, { "glMultiTexCoord2ivSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord2ivSGIS }, - { "glMultiTexCoord2s", "GL_VERSION_1_3", wine_glMultiTexCoord2s }, + { "glMultiTexCoord2s", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord2s }, { "glMultiTexCoord2sARB", "GL_ARB_multitexture", wine_glMultiTexCoord2sARB }, { "glMultiTexCoord2sSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord2sSGIS }, - { "glMultiTexCoord2sv", "GL_VERSION_1_3", wine_glMultiTexCoord2sv }, + { "glMultiTexCoord2sv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord2sv }, { "glMultiTexCoord2svARB", "GL_ARB_multitexture", wine_glMultiTexCoord2svARB }, { "glMultiTexCoord2svSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord2svSGIS }, - { "glMultiTexCoord3d", "GL_VERSION_1_3", wine_glMultiTexCoord3d }, + { "glMultiTexCoord3d", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord3d }, { "glMultiTexCoord3dARB", "GL_ARB_multitexture", wine_glMultiTexCoord3dARB }, { "glMultiTexCoord3dSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord3dSGIS }, - { "glMultiTexCoord3dv", "GL_VERSION_1_3", wine_glMultiTexCoord3dv }, + { "glMultiTexCoord3dv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord3dv }, { "glMultiTexCoord3dvARB", "GL_ARB_multitexture", wine_glMultiTexCoord3dvARB }, { "glMultiTexCoord3dvSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord3dvSGIS }, - { "glMultiTexCoord3f", "GL_VERSION_1_3", wine_glMultiTexCoord3f }, + { "glMultiTexCoord3f", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord3f }, { "glMultiTexCoord3fARB", "GL_ARB_multitexture", wine_glMultiTexCoord3fARB }, { "glMultiTexCoord3fSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord3fSGIS }, - { "glMultiTexCoord3fv", "GL_VERSION_1_3", wine_glMultiTexCoord3fv }, + { "glMultiTexCoord3fv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord3fv }, { "glMultiTexCoord3fvARB", "GL_ARB_multitexture", wine_glMultiTexCoord3fvARB }, { "glMultiTexCoord3fvSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord3fvSGIS }, { "glMultiTexCoord3hNV", "GL_NV_half_float", wine_glMultiTexCoord3hNV }, { "glMultiTexCoord3hvNV", "GL_NV_half_float", wine_glMultiTexCoord3hvNV }, - { "glMultiTexCoord3i", "GL_VERSION_1_3", wine_glMultiTexCoord3i }, + { "glMultiTexCoord3i", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord3i }, { "glMultiTexCoord3iARB", "GL_ARB_multitexture", wine_glMultiTexCoord3iARB }, { "glMultiTexCoord3iSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord3iSGIS }, - { "glMultiTexCoord3iv", "GL_VERSION_1_3", wine_glMultiTexCoord3iv }, + { "glMultiTexCoord3iv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord3iv }, { "glMultiTexCoord3ivARB", "GL_ARB_multitexture", wine_glMultiTexCoord3ivARB }, { "glMultiTexCoord3ivSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord3ivSGIS }, - { "glMultiTexCoord3s", "GL_VERSION_1_3", wine_glMultiTexCoord3s }, + { "glMultiTexCoord3s", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord3s }, { "glMultiTexCoord3sARB", "GL_ARB_multitexture", wine_glMultiTexCoord3sARB }, { "glMultiTexCoord3sSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord3sSGIS }, - { "glMultiTexCoord3sv", "GL_VERSION_1_3", wine_glMultiTexCoord3sv }, + { "glMultiTexCoord3sv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord3sv }, { "glMultiTexCoord3svARB", "GL_ARB_multitexture", wine_glMultiTexCoord3svARB }, { "glMultiTexCoord3svSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord3svSGIS }, - { "glMultiTexCoord4d", "GL_VERSION_1_3", wine_glMultiTexCoord4d }, + { "glMultiTexCoord4d", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord4d }, { "glMultiTexCoord4dARB", "GL_ARB_multitexture", wine_glMultiTexCoord4dARB }, { "glMultiTexCoord4dSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord4dSGIS }, - { "glMultiTexCoord4dv", "GL_VERSION_1_3", wine_glMultiTexCoord4dv }, + { "glMultiTexCoord4dv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord4dv }, { "glMultiTexCoord4dvARB", "GL_ARB_multitexture", wine_glMultiTexCoord4dvARB }, { "glMultiTexCoord4dvSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord4dvSGIS }, - { "glMultiTexCoord4f", "GL_VERSION_1_3", wine_glMultiTexCoord4f }, + { "glMultiTexCoord4f", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord4f }, { "glMultiTexCoord4fARB", "GL_ARB_multitexture", wine_glMultiTexCoord4fARB }, { "glMultiTexCoord4fSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord4fSGIS }, - { "glMultiTexCoord4fv", "GL_VERSION_1_3", wine_glMultiTexCoord4fv }, + { "glMultiTexCoord4fv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord4fv }, { "glMultiTexCoord4fvARB", "GL_ARB_multitexture", wine_glMultiTexCoord4fvARB }, { "glMultiTexCoord4fvSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord4fvSGIS }, { "glMultiTexCoord4hNV", "GL_NV_half_float", wine_glMultiTexCoord4hNV }, { "glMultiTexCoord4hvNV", "GL_NV_half_float", wine_glMultiTexCoord4hvNV }, - { "glMultiTexCoord4i", "GL_VERSION_1_3", wine_glMultiTexCoord4i }, + { "glMultiTexCoord4i", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord4i }, { "glMultiTexCoord4iARB", "GL_ARB_multitexture", wine_glMultiTexCoord4iARB }, { "glMultiTexCoord4iSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord4iSGIS }, - { "glMultiTexCoord4iv", "GL_VERSION_1_3", wine_glMultiTexCoord4iv }, + { "glMultiTexCoord4iv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord4iv }, { "glMultiTexCoord4ivARB", "GL_ARB_multitexture", wine_glMultiTexCoord4ivARB }, { "glMultiTexCoord4ivSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord4ivSGIS }, - { "glMultiTexCoord4s", "GL_VERSION_1_3", wine_glMultiTexCoord4s }, + { "glMultiTexCoord4s", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord4s }, { "glMultiTexCoord4sARB", "GL_ARB_multitexture", wine_glMultiTexCoord4sARB }, { "glMultiTexCoord4sSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord4sSGIS }, - { "glMultiTexCoord4sv", "GL_VERSION_1_3", wine_glMultiTexCoord4sv }, + { "glMultiTexCoord4sv", "GL_VERSION_1_3_DEPRECATED", wine_glMultiTexCoord4sv }, { "glMultiTexCoord4svARB", "GL_ARB_multitexture", wine_glMultiTexCoord4svARB }, { "glMultiTexCoord4svSGIS", "GL_SGIS_multitexture", wine_glMultiTexCoord4svSGIS }, { "glMultiTexCoordPointerEXT", "GL_EXT_direct_state_access", wine_glMultiTexCoordPointerEXT }, @@ -14763,6 +15167,7 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glPolygonOffsetEXT", "GL_EXT_polygon_offset", wine_glPolygonOffsetEXT }, { "glPresentFrameDualFillNV", "GL_NV_present_video", wine_glPresentFrameDualFillNV }, { "glPresentFrameKeyedNV", "GL_NV_present_video", wine_glPresentFrameKeyedNV }, + { "glPrimitiveRestartIndex", "GL_VERSION_3_1", wine_glPrimitiveRestartIndex }, { "glPrimitiveRestartIndexNV", "GL_NV_primitive_restart", wine_glPrimitiveRestartIndexNV }, { "glPrimitiveRestartNV", "GL_NV_primitive_restart", wine_glPrimitiveRestartNV }, { "glPrioritizeTexturesEXT", "GL_EXT_texture_object", wine_glPrioritizeTexturesEXT }, @@ -14872,7 +15277,9 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glReplacementCodeusSUN", "GL_SUN_triangle_list", wine_glReplacementCodeusSUN }, { "glReplacementCodeusvSUN", "GL_SUN_triangle_list", wine_glReplacementCodeusvSUN }, { "glRequestResidentProgramsNV", "GL_NV_vertex_program", wine_glRequestResidentProgramsNV }, + { "glResetHistogram", "GL_VERSION_1_2_DEPRECATED", wine_glResetHistogram }, { "glResetHistogramEXT", "GL_EXT_histogram", wine_glResetHistogramEXT }, + { "glResetMinmax", "GL_VERSION_1_2_DEPRECATED", wine_glResetMinmax }, { "glResetMinmaxEXT", "GL_EXT_histogram", wine_glResetMinmaxEXT }, { "glResizeBuffersMESA", "GL_MESA_resize_buffers", wine_glResizeBuffersMESA }, { "glResumeTransformFeedbackNV", "GL_NV_transform_feedback2", wine_glResumeTransformFeedbackNV }, @@ -14884,46 +15291,47 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glSampleMaskSGIS", "GL_SGIS_multisample", wine_glSampleMaskSGIS }, { "glSamplePatternEXT", "GL_EXT_multisample", wine_glSamplePatternEXT }, { "glSamplePatternSGIS", "GL_SGIS_multisample", wine_glSamplePatternSGIS }, - { "glSecondaryColor3b", "GL_VERSION_1_4", wine_glSecondaryColor3b }, + { "glSecondaryColor3b", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3b }, { "glSecondaryColor3bEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3bEXT }, - { "glSecondaryColor3bv", "GL_VERSION_1_4", wine_glSecondaryColor3bv }, + { "glSecondaryColor3bv", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3bv }, { "glSecondaryColor3bvEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3bvEXT }, - { "glSecondaryColor3d", "GL_VERSION_1_4", wine_glSecondaryColor3d }, + { "glSecondaryColor3d", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3d }, { "glSecondaryColor3dEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3dEXT }, - { "glSecondaryColor3dv", "GL_VERSION_1_4", wine_glSecondaryColor3dv }, + { "glSecondaryColor3dv", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3dv }, { "glSecondaryColor3dvEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3dvEXT }, - { "glSecondaryColor3f", "GL_VERSION_1_4", wine_glSecondaryColor3f }, + { "glSecondaryColor3f", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3f }, { "glSecondaryColor3fEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3fEXT }, - { "glSecondaryColor3fv", "GL_VERSION_1_4", wine_glSecondaryColor3fv }, + { "glSecondaryColor3fv", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3fv }, { "glSecondaryColor3fvEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3fvEXT }, { "glSecondaryColor3hNV", "GL_NV_half_float", wine_glSecondaryColor3hNV }, { "glSecondaryColor3hvNV", "GL_NV_half_float", wine_glSecondaryColor3hvNV }, - { "glSecondaryColor3i", "GL_VERSION_1_4", wine_glSecondaryColor3i }, + { "glSecondaryColor3i", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3i }, { "glSecondaryColor3iEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3iEXT }, - { "glSecondaryColor3iv", "GL_VERSION_1_4", wine_glSecondaryColor3iv }, + { "glSecondaryColor3iv", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3iv }, { "glSecondaryColor3ivEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3ivEXT }, - { "glSecondaryColor3s", "GL_VERSION_1_4", wine_glSecondaryColor3s }, + { "glSecondaryColor3s", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3s }, { "glSecondaryColor3sEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3sEXT }, - { "glSecondaryColor3sv", "GL_VERSION_1_4", wine_glSecondaryColor3sv }, + { "glSecondaryColor3sv", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3sv }, { "glSecondaryColor3svEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3svEXT }, - { "glSecondaryColor3ub", "GL_VERSION_1_4", wine_glSecondaryColor3ub }, + { "glSecondaryColor3ub", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3ub }, { "glSecondaryColor3ubEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3ubEXT }, - { "glSecondaryColor3ubv", "GL_VERSION_1_4", wine_glSecondaryColor3ubv }, + { "glSecondaryColor3ubv", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3ubv }, { "glSecondaryColor3ubvEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3ubvEXT }, - { "glSecondaryColor3ui", "GL_VERSION_1_4", wine_glSecondaryColor3ui }, + { "glSecondaryColor3ui", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3ui }, { "glSecondaryColor3uiEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3uiEXT }, - { "glSecondaryColor3uiv", "GL_VERSION_1_4", wine_glSecondaryColor3uiv }, + { "glSecondaryColor3uiv", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3uiv }, { "glSecondaryColor3uivEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3uivEXT }, - { "glSecondaryColor3us", "GL_VERSION_1_4", wine_glSecondaryColor3us }, + { "glSecondaryColor3us", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3us }, { "glSecondaryColor3usEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3usEXT }, - { "glSecondaryColor3usv", "GL_VERSION_1_4", wine_glSecondaryColor3usv }, + { "glSecondaryColor3usv", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColor3usv }, { "glSecondaryColor3usvEXT", "GL_EXT_secondary_color", wine_glSecondaryColor3usvEXT }, - { "glSecondaryColorPointer", "GL_VERSION_1_4", wine_glSecondaryColorPointer }, + { "glSecondaryColorPointer", "GL_VERSION_1_4_DEPRECATED", wine_glSecondaryColorPointer }, { "glSecondaryColorPointerEXT", "GL_EXT_secondary_color", wine_glSecondaryColorPointerEXT }, { "glSecondaryColorPointerListIBM", "GL_IBM_vertex_array_lists", wine_glSecondaryColorPointerListIBM }, { "glSelectPerfMonitorCountersAMD", "GL_AMD_performance_monitor", wine_glSelectPerfMonitorCountersAMD }, { "glSelectTextureCoordSetSGIS", "GL_SGIS_multitexture", wine_glSelectTextureCoordSetSGIS }, { "glSelectTextureSGIS", "GL_SGIS_multitexture", wine_glSelectTextureSGIS }, + { "glSeparableFilter2D", "GL_VERSION_1_2_DEPRECATED", wine_glSeparableFilter2D }, { "glSeparableFilter2DEXT", "GL_EXT_convolution", wine_glSeparableFilter2DEXT }, { "glSetFenceAPPLE", "GL_APPLE_fence", wine_glSetFenceAPPLE }, { "glSetFenceNV", "GL_NV_fence", wine_glSetFenceNV }, @@ -14968,6 +15376,7 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glTestFenceAPPLE", "GL_APPLE_fence", wine_glTestFenceAPPLE }, { "glTestFenceNV", "GL_NV_fence", wine_glTestFenceNV }, { "glTestObjectAPPLE", "GL_APPLE_fence", wine_glTestObjectAPPLE }, + { "glTexBuffer", "GL_VERSION_3_1", wine_glTexBuffer }, { "glTexBufferARB", "GL_ARB_texture_buffer_object", wine_glTexBufferARB }, { "glTexBufferEXT", "GL_EXT_texture_buffer_object", wine_glTexBufferEXT }, { "glTexBumpParameterfvATI", "GL_ATI_envmap_bumpmap", wine_glTexBumpParameterfvATI }, @@ -14998,6 +15407,7 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glTexCoordPointerListIBM", "GL_IBM_vertex_array_lists", wine_glTexCoordPointerListIBM }, { "glTexCoordPointervINTEL", "GL_INTEL_parallel_arrays", wine_glTexCoordPointervINTEL }, { "glTexFilterFuncSGIS", "GL_SGIS_texture_filter4", wine_glTexFilterFuncSGIS }, + { "glTexImage3D", "GL_VERSION_1_2", wine_glTexImage3D }, { "glTexImage3DEXT", "GL_EXT_texture3D", wine_glTexImage3DEXT }, { "glTexImage4DSGIS", "GL_SGIS_texture4D", wine_glTexImage4DSGIS }, { "glTexParameterIiv", "GL_VERSION_3_0", wine_glTexParameterIiv }, @@ -15007,6 +15417,7 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glTexRenderbufferNV", "GL_NV_explicit_multisample", wine_glTexRenderbufferNV }, { "glTexSubImage1DEXT", "GL_EXT_subtexture", wine_glTexSubImage1DEXT }, { "glTexSubImage2DEXT", "GL_EXT_subtexture", wine_glTexSubImage2DEXT }, + { "glTexSubImage3D", "GL_VERSION_1_2", wine_glTexSubImage3D }, { "glTexSubImage3DEXT", "GL_EXT_texture3D", wine_glTexSubImage3DEXT }, { "glTexSubImage4DSGIS", "GL_SGIS_texture4D", wine_glTexSubImage4DSGIS }, { "glTextureBufferEXT", "GL_EXT_direct_state_access", wine_glTextureBufferEXT }, @@ -15230,46 +15641,46 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glVertexAttrib4usv", "GL_VERSION_2_0", wine_glVertexAttrib4usv }, { "glVertexAttrib4usvARB", "GL_ARB_vertex_program", wine_glVertexAttrib4usvARB }, { "glVertexAttribArrayObjectATI", "GL_ATI_vertex_attrib_array_object", wine_glVertexAttribArrayObjectATI }, - { "glVertexAttribDivisor", "GL_ARB_instanced_arrays", wine_glVertexAttribDivisor }, - { "glVertexAttribI1i", "GL_VERSION_3_0", wine_glVertexAttribI1i }, + { "glVertexAttribDivisorARB", "GL_ARB_instanced_arrays", wine_glVertexAttribDivisorARB }, + { "glVertexAttribI1i", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI1i }, { "glVertexAttribI1iEXT", "GL_NV_vertex_program4", wine_glVertexAttribI1iEXT }, - { "glVertexAttribI1iv", "GL_VERSION_3_0", wine_glVertexAttribI1iv }, + { "glVertexAttribI1iv", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI1iv }, { "glVertexAttribI1ivEXT", "GL_NV_vertex_program4", wine_glVertexAttribI1ivEXT }, - { "glVertexAttribI1ui", "GL_VERSION_3_0", wine_glVertexAttribI1ui }, + { "glVertexAttribI1ui", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI1ui }, { "glVertexAttribI1uiEXT", "GL_NV_vertex_program4", wine_glVertexAttribI1uiEXT }, - { "glVertexAttribI1uiv", "GL_VERSION_3_0", wine_glVertexAttribI1uiv }, + { "glVertexAttribI1uiv", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI1uiv }, { "glVertexAttribI1uivEXT", "GL_NV_vertex_program4", wine_glVertexAttribI1uivEXT }, - { "glVertexAttribI2i", "GL_VERSION_3_0", wine_glVertexAttribI2i }, + { "glVertexAttribI2i", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI2i }, { "glVertexAttribI2iEXT", "GL_NV_vertex_program4", wine_glVertexAttribI2iEXT }, - { "glVertexAttribI2iv", "GL_VERSION_3_0", wine_glVertexAttribI2iv }, + { "glVertexAttribI2iv", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI2iv }, { "glVertexAttribI2ivEXT", "GL_NV_vertex_program4", wine_glVertexAttribI2ivEXT }, - { "glVertexAttribI2ui", "GL_VERSION_3_0", wine_glVertexAttribI2ui }, + { "glVertexAttribI2ui", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI2ui }, { "glVertexAttribI2uiEXT", "GL_NV_vertex_program4", wine_glVertexAttribI2uiEXT }, - { "glVertexAttribI2uiv", "GL_VERSION_3_0", wine_glVertexAttribI2uiv }, + { "glVertexAttribI2uiv", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI2uiv }, { "glVertexAttribI2uivEXT", "GL_NV_vertex_program4", wine_glVertexAttribI2uivEXT }, - { "glVertexAttribI3i", "GL_VERSION_3_0", wine_glVertexAttribI3i }, + { "glVertexAttribI3i", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI3i }, { "glVertexAttribI3iEXT", "GL_NV_vertex_program4", wine_glVertexAttribI3iEXT }, - { "glVertexAttribI3iv", "GL_VERSION_3_0", wine_glVertexAttribI3iv }, + { "glVertexAttribI3iv", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI3iv }, { "glVertexAttribI3ivEXT", "GL_NV_vertex_program4", wine_glVertexAttribI3ivEXT }, - { "glVertexAttribI3ui", "GL_VERSION_3_0", wine_glVertexAttribI3ui }, + { "glVertexAttribI3ui", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI3ui }, { "glVertexAttribI3uiEXT", "GL_NV_vertex_program4", wine_glVertexAttribI3uiEXT }, - { "glVertexAttribI3uiv", "GL_VERSION_3_0", wine_glVertexAttribI3uiv }, + { "glVertexAttribI3uiv", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI3uiv }, { "glVertexAttribI3uivEXT", "GL_NV_vertex_program4", wine_glVertexAttribI3uivEXT }, - { "glVertexAttribI4bv", "GL_VERSION_3_0", wine_glVertexAttribI4bv }, + { "glVertexAttribI4bv", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI4bv }, { "glVertexAttribI4bvEXT", "GL_NV_vertex_program4", wine_glVertexAttribI4bvEXT }, - { "glVertexAttribI4i", "GL_VERSION_3_0", wine_glVertexAttribI4i }, + { "glVertexAttribI4i", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI4i }, { "glVertexAttribI4iEXT", "GL_NV_vertex_program4", wine_glVertexAttribI4iEXT }, - { "glVertexAttribI4iv", "GL_VERSION_3_0", wine_glVertexAttribI4iv }, + { "glVertexAttribI4iv", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI4iv }, { "glVertexAttribI4ivEXT", "GL_NV_vertex_program4", wine_glVertexAttribI4ivEXT }, - { "glVertexAttribI4sv", "GL_VERSION_3_0", wine_glVertexAttribI4sv }, + { "glVertexAttribI4sv", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI4sv }, { "glVertexAttribI4svEXT", "GL_NV_vertex_program4", wine_glVertexAttribI4svEXT }, - { "glVertexAttribI4ubv", "GL_VERSION_3_0", wine_glVertexAttribI4ubv }, + { "glVertexAttribI4ubv", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI4ubv }, { "glVertexAttribI4ubvEXT", "GL_NV_vertex_program4", wine_glVertexAttribI4ubvEXT }, - { "glVertexAttribI4ui", "GL_VERSION_3_0", wine_glVertexAttribI4ui }, + { "glVertexAttribI4ui", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI4ui }, { "glVertexAttribI4uiEXT", "GL_NV_vertex_program4", wine_glVertexAttribI4uiEXT }, - { "glVertexAttribI4uiv", "GL_VERSION_3_0", wine_glVertexAttribI4uiv }, + { "glVertexAttribI4uiv", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI4uiv }, { "glVertexAttribI4uivEXT", "GL_NV_vertex_program4", wine_glVertexAttribI4uivEXT }, - { "glVertexAttribI4usv", "GL_VERSION_3_0", wine_glVertexAttribI4usv }, + { "glVertexAttribI4usv", "GL_VERSION_3_0_DEPRECATED", wine_glVertexAttribI4usv }, { "glVertexAttribI4usvEXT", "GL_NV_vertex_program4", wine_glVertexAttribI4usvEXT }, { "glVertexAttribIPointer", "GL_VERSION_3_0", wine_glVertexAttribIPointer }, { "glVertexAttribIPointerEXT", "GL_NV_vertex_program4", wine_glVertexAttribIPointerEXT }, @@ -15336,7 +15747,6 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glVertexWeightfvEXT", "GL_EXT_vertex_weighting", wine_glVertexWeightfvEXT }, { "glVertexWeighthNV", "GL_NV_half_float", wine_glVertexWeighthNV }, { "glVertexWeighthvNV", "GL_NV_half_float", wine_glVertexWeighthvNV }, - { "glVideoParameterivNV", "GL_NV_present_video", wine_glVideoParameterivNV }, { "glWeightPointerARB", "GL_ARB_vertex_blend", wine_glWeightPointerARB }, { "glWeightbvARB", "GL_ARB_vertex_blend", wine_glWeightbvARB }, { "glWeightdvARB", "GL_ARB_vertex_blend", wine_glWeightdvARB }, @@ -15346,52 +15756,52 @@ const OpenGL_extension extension_registry[NB_EXTENSIONS] = { { "glWeightubvARB", "GL_ARB_vertex_blend", wine_glWeightubvARB }, { "glWeightuivARB", "GL_ARB_vertex_blend", wine_glWeightuivARB }, { "glWeightusvARB", "GL_ARB_vertex_blend", wine_glWeightusvARB }, - { "glWindowPos2d", "GL_VERSION_1_4", wine_glWindowPos2d }, + { "glWindowPos2d", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos2d }, { "glWindowPos2dARB", "GL_ARB_window_pos", wine_glWindowPos2dARB }, { "glWindowPos2dMESA", "GL_MESA_window_pos", wine_glWindowPos2dMESA }, - { "glWindowPos2dv", "GL_VERSION_1_4", wine_glWindowPos2dv }, + { "glWindowPos2dv", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos2dv }, { "glWindowPos2dvARB", "GL_ARB_window_pos", wine_glWindowPos2dvARB }, { "glWindowPos2dvMESA", "GL_MESA_window_pos", wine_glWindowPos2dvMESA }, - { "glWindowPos2f", "GL_VERSION_1_4", wine_glWindowPos2f }, + { "glWindowPos2f", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos2f }, { "glWindowPos2fARB", "GL_ARB_window_pos", wine_glWindowPos2fARB }, { "glWindowPos2fMESA", "GL_MESA_window_pos", wine_glWindowPos2fMESA }, - { "glWindowPos2fv", "GL_VERSION_1_4", wine_glWindowPos2fv }, + { "glWindowPos2fv", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos2fv }, { "glWindowPos2fvARB", "GL_ARB_window_pos", wine_glWindowPos2fvARB }, { "glWindowPos2fvMESA", "GL_MESA_window_pos", wine_glWindowPos2fvMESA }, - { "glWindowPos2i", "GL_VERSION_1_4", wine_glWindowPos2i }, + { "glWindowPos2i", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos2i }, { "glWindowPos2iARB", "GL_ARB_window_pos", wine_glWindowPos2iARB }, { "glWindowPos2iMESA", "GL_MESA_window_pos", wine_glWindowPos2iMESA }, - { "glWindowPos2iv", "GL_VERSION_1_4", wine_glWindowPos2iv }, + { "glWindowPos2iv", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos2iv }, { "glWindowPos2ivARB", "GL_ARB_window_pos", wine_glWindowPos2ivARB }, { "glWindowPos2ivMESA", "GL_MESA_window_pos", wine_glWindowPos2ivMESA }, - { "glWindowPos2s", "GL_VERSION_1_4", wine_glWindowPos2s }, + { "glWindowPos2s", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos2s }, { "glWindowPos2sARB", "GL_ARB_window_pos", wine_glWindowPos2sARB }, { "glWindowPos2sMESA", "GL_MESA_window_pos", wine_glWindowPos2sMESA }, - { "glWindowPos2sv", "GL_VERSION_1_4", wine_glWindowPos2sv }, + { "glWindowPos2sv", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos2sv }, { "glWindowPos2svARB", "GL_ARB_window_pos", wine_glWindowPos2svARB }, { "glWindowPos2svMESA", "GL_MESA_window_pos", wine_glWindowPos2svMESA }, - { "glWindowPos3d", "GL_VERSION_1_4", wine_glWindowPos3d }, + { "glWindowPos3d", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos3d }, { "glWindowPos3dARB", "GL_ARB_window_pos", wine_glWindowPos3dARB }, { "glWindowPos3dMESA", "GL_MESA_window_pos", wine_glWindowPos3dMESA }, - { "glWindowPos3dv", "GL_VERSION_1_4", wine_glWindowPos3dv }, + { "glWindowPos3dv", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos3dv }, { "glWindowPos3dvARB", "GL_ARB_window_pos", wine_glWindowPos3dvARB }, { "glWindowPos3dvMESA", "GL_MESA_window_pos", wine_glWindowPos3dvMESA }, - { "glWindowPos3f", "GL_VERSION_1_4", wine_glWindowPos3f }, + { "glWindowPos3f", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos3f }, { "glWindowPos3fARB", "GL_ARB_window_pos", wine_glWindowPos3fARB }, { "glWindowPos3fMESA", "GL_MESA_window_pos", wine_glWindowPos3fMESA }, - { "glWindowPos3fv", "GL_VERSION_1_4", wine_glWindowPos3fv }, + { "glWindowPos3fv", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos3fv }, { "glWindowPos3fvARB", "GL_ARB_window_pos", wine_glWindowPos3fvARB }, { "glWindowPos3fvMESA", "GL_MESA_window_pos", wine_glWindowPos3fvMESA }, - { "glWindowPos3i", "GL_VERSION_1_4", wine_glWindowPos3i }, + { "glWindowPos3i", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos3i }, { "glWindowPos3iARB", "GL_ARB_window_pos", wine_glWindowPos3iARB }, { "glWindowPos3iMESA", "GL_MESA_window_pos", wine_glWindowPos3iMESA }, - { "glWindowPos3iv", "GL_VERSION_1_4", wine_glWindowPos3iv }, + { "glWindowPos3iv", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos3iv }, { "glWindowPos3ivARB", "GL_ARB_window_pos", wine_glWindowPos3ivARB }, { "glWindowPos3ivMESA", "GL_MESA_window_pos", wine_glWindowPos3ivMESA }, - { "glWindowPos3s", "GL_VERSION_1_4", wine_glWindowPos3s }, + { "glWindowPos3s", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos3s }, { "glWindowPos3sARB", "GL_ARB_window_pos", wine_glWindowPos3sARB }, { "glWindowPos3sMESA", "GL_MESA_window_pos", wine_glWindowPos3sMESA }, - { "glWindowPos3sv", "GL_VERSION_1_4", wine_glWindowPos3sv }, + { "glWindowPos3sv", "GL_VERSION_1_4_DEPRECATED", wine_glWindowPos3sv }, { "glWindowPos3svARB", "GL_ARB_window_pos", wine_glWindowPos3svARB }, { "glWindowPos3svMESA", "GL_MESA_window_pos", wine_glWindowPos3svMESA }, { "glWindowPos4dMESA", "GL_MESA_window_pos", wine_glWindowPos4dMESA }, diff --git a/dlls/opengl32/opengl_ext.h b/dlls/opengl32/opengl_ext.h index 8ae7c2f4a95..988317f385c 100644 --- a/dlls/opengl32/opengl_ext.h +++ b/dlls/opengl32/opengl_ext.h @@ -24,11 +24,7 @@ #undef WINAPI #define XMD_H /* This is to prevent the Xmd.h inclusion bug :-/ */ -#define GL_GLEXT_PROTOTYPES #include -#ifdef HAVE_GL_GLEXT_H -# include -#endif #undef XMD_H #undef APIENTRY diff --git a/dlls/opengl32/opengl_norm.c b/dlls/opengl32/opengl_norm.c index fcd4be49c5b..a1d3f9492ed 100644 --- a/dlls/opengl32/opengl_norm.c +++ b/dlls/opengl32/opengl_norm.c @@ -80,26 +80,6 @@ void WINAPI wine_glBitmap( GLsizei width, GLsizei height, GLfloat xorig, GLfloat } /*********************************************************************** - * glBlendColor (OPENGL32.@) - */ -void WINAPI wine_glBlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha ) { - TRACE("(%f, %f, %f, %f)\n", red, green, blue, alpha ); - ENTER_GL(); - glBlendColor( red, green, blue, alpha ); - LEAVE_GL(); -} - -/*********************************************************************** - * glBlendEquation (OPENGL32.@) - */ -void WINAPI wine_glBlendEquation( GLenum mode ) { - TRACE("(%d)\n", mode ); - ENTER_GL(); - glBlendEquation( mode ); - LEAVE_GL(); -} - -/*********************************************************************** * glBlendFunc (OPENGL32.@) */ void WINAPI wine_glBlendFunc( GLenum sfactor, GLenum dfactor ) { @@ -550,146 +530,6 @@ void WINAPI wine_glColorPointer( GLint size, GLenum type, GLsizei stride, GLvoid } /*********************************************************************** - * glColorSubTable (OPENGL32.@) - */ -void WINAPI wine_glColorSubTable( GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type, GLvoid* data ) { - TRACE("(%d, %d, %d, %d, %d, %p)\n", target, start, count, format, type, data ); - ENTER_GL(); - glColorSubTable( target, start, count, format, type, data ); - LEAVE_GL(); -} - -/*********************************************************************** - * glColorTable (OPENGL32.@) - */ -void WINAPI wine_glColorTable( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, GLvoid* table ) { - TRACE("(%d, %d, %d, %d, %d, %p)\n", target, internalformat, width, format, type, table ); - ENTER_GL(); - glColorTable( target, internalformat, width, format, type, table ); - LEAVE_GL(); -} - -/*********************************************************************** - * glColorTableParameterfv (OPENGL32.@) - */ -void WINAPI wine_glColorTableParameterfv( GLenum target, GLenum pname, GLfloat* params ) { - TRACE("(%d, %d, %p)\n", target, pname, params ); - ENTER_GL(); - glColorTableParameterfv( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** - * glColorTableParameteriv (OPENGL32.@) - */ -void WINAPI wine_glColorTableParameteriv( GLenum target, GLenum pname, GLint* params ) { - TRACE("(%d, %d, %p)\n", target, pname, params ); - ENTER_GL(); - glColorTableParameteriv( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** - * glConvolutionFilter1D (OPENGL32.@) - */ -void WINAPI wine_glConvolutionFilter1D( GLenum target, GLenum internalformat, GLsizei width, GLenum format, GLenum type, GLvoid* image ) { - TRACE("(%d, %d, %d, %d, %d, %p)\n", target, internalformat, width, format, type, image ); - ENTER_GL(); - glConvolutionFilter1D( target, internalformat, width, format, type, image ); - LEAVE_GL(); -} - -/*********************************************************************** - * glConvolutionFilter2D (OPENGL32.@) - */ -void WINAPI wine_glConvolutionFilter2D( GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* image ) { - TRACE("(%d, %d, %d, %d, %d, %d, %p)\n", target, internalformat, width, height, format, type, image ); - ENTER_GL(); - glConvolutionFilter2D( target, internalformat, width, height, format, type, image ); - LEAVE_GL(); -} - -/*********************************************************************** - * glConvolutionParameterf (OPENGL32.@) - */ -void WINAPI wine_glConvolutionParameterf( GLenum target, GLenum pname, GLfloat params ) { - TRACE("(%d, %d, %f)\n", target, pname, params ); - ENTER_GL(); - glConvolutionParameterf( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** - * glConvolutionParameterfv (OPENGL32.@) - */ -void WINAPI wine_glConvolutionParameterfv( GLenum target, GLenum pname, GLfloat* params ) { - TRACE("(%d, %d, %p)\n", target, pname, params ); - ENTER_GL(); - glConvolutionParameterfv( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** - * glConvolutionParameteri (OPENGL32.@) - */ -void WINAPI wine_glConvolutionParameteri( GLenum target, GLenum pname, GLint params ) { - TRACE("(%d, %d, %d)\n", target, pname, params ); - ENTER_GL(); - glConvolutionParameteri( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** - * glConvolutionParameteriv (OPENGL32.@) - */ -void WINAPI wine_glConvolutionParameteriv( GLenum target, GLenum pname, GLint* params ) { - TRACE("(%d, %d, %p)\n", target, pname, params ); - ENTER_GL(); - glConvolutionParameteriv( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** - * glCopyColorSubTable (OPENGL32.@) - */ -void WINAPI wine_glCopyColorSubTable( GLenum target, GLsizei start, GLint x, GLint y, GLsizei width ) { - TRACE("(%d, %d, %d, %d, %d)\n", target, start, x, y, width ); - ENTER_GL(); - glCopyColorSubTable( target, start, x, y, width ); - LEAVE_GL(); -} - -/*********************************************************************** - * glCopyColorTable (OPENGL32.@) - */ -void WINAPI wine_glCopyColorTable( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ) { - TRACE("(%d, %d, %d, %d, %d)\n", target, internalformat, x, y, width ); - ENTER_GL(); - glCopyColorTable( target, internalformat, x, y, width ); - LEAVE_GL(); -} - -/*********************************************************************** - * glCopyConvolutionFilter1D (OPENGL32.@) - */ -void WINAPI wine_glCopyConvolutionFilter1D( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width ) { - TRACE("(%d, %d, %d, %d, %d)\n", target, internalformat, x, y, width ); - ENTER_GL(); - glCopyConvolutionFilter1D( target, internalformat, x, y, width ); - LEAVE_GL(); -} - -/*********************************************************************** - * glCopyConvolutionFilter2D (OPENGL32.@) - */ -void WINAPI wine_glCopyConvolutionFilter2D( GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height ) { - TRACE("(%d, %d, %d, %d, %d, %d)\n", target, internalformat, x, y, width, height ); - ENTER_GL(); - glCopyConvolutionFilter2D( target, internalformat, x, y, width, height ); - LEAVE_GL(); -} - -/*********************************************************************** * glCopyPixels (OPENGL32.@) */ void WINAPI wine_glCopyPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum type ) { @@ -740,16 +580,6 @@ void WINAPI wine_glCopyTexSubImage2D( GLenum target, GLint level, GLint xoffset, } /*********************************************************************** - * glCopyTexSubImage3D (OPENGL32.@) - */ -void WINAPI wine_glCopyTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLint x, GLint y, GLsizei width, GLsizei height ) { - TRACE("(%d, %d, %d, %d, %d, %d, %d, %d, %d)\n", target, level, xoffset, yoffset, zoffset, x, y, width, height ); - ENTER_GL(); - glCopyTexSubImage3D( target, level, xoffset, yoffset, zoffset, x, y, width, height ); - LEAVE_GL(); -} - -/*********************************************************************** * glCullFace (OPENGL32.@) */ void WINAPI wine_glCullFace( GLenum mode ) { @@ -870,16 +700,6 @@ void WINAPI wine_glDrawPixels( GLsizei width, GLsizei height, GLenum format, GLe } /*********************************************************************** - * glDrawRangeElements (OPENGL32.@) - */ -void WINAPI wine_glDrawRangeElements( GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, GLvoid* indices ) { - TRACE("(%d, %d, %d, %d, %d, %p)\n", mode, start, end, count, type, indices ); - ENTER_GL(); - glDrawRangeElements( mode, start, end, count, type, indices ); - LEAVE_GL(); -} - -/*********************************************************************** * glEdgeFlag (OPENGL32.@) */ void WINAPI wine_glEdgeFlag( GLboolean flag ) { @@ -1182,66 +1002,6 @@ void WINAPI wine_glGetClipPlane( GLenum plane, GLdouble* equation ) { } /*********************************************************************** - * glGetColorTable (OPENGL32.@) - */ -void WINAPI wine_glGetColorTable( GLenum target, GLenum format, GLenum type, GLvoid* table ) { - TRACE("(%d, %d, %d, %p)\n", target, format, type, table ); - ENTER_GL(); - glGetColorTable( target, format, type, table ); - LEAVE_GL(); -} - -/*********************************************************************** - * glGetColorTableParameterfv (OPENGL32.@) - */ -void WINAPI wine_glGetColorTableParameterfv( GLenum target, GLenum pname, GLfloat* params ) { - TRACE("(%d, %d, %p)\n", target, pname, params ); - ENTER_GL(); - glGetColorTableParameterfv( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** - * glGetColorTableParameteriv (OPENGL32.@) - */ -void WINAPI wine_glGetColorTableParameteriv( GLenum target, GLenum pname, GLint* params ) { - TRACE("(%d, %d, %p)\n", target, pname, params ); - ENTER_GL(); - glGetColorTableParameteriv( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** - * glGetConvolutionFilter (OPENGL32.@) - */ -void WINAPI wine_glGetConvolutionFilter( GLenum target, GLenum format, GLenum type, GLvoid* image ) { - TRACE("(%d, %d, %d, %p)\n", target, format, type, image ); - ENTER_GL(); - glGetConvolutionFilter( target, format, type, image ); - LEAVE_GL(); -} - -/*********************************************************************** - * glGetConvolutionParameterfv (OPENGL32.@) - */ -void WINAPI wine_glGetConvolutionParameterfv( GLenum target, GLenum pname, GLfloat* params ) { - TRACE("(%d, %d, %p)\n", target, pname, params ); - ENTER_GL(); - glGetConvolutionParameterfv( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** - * glGetConvolutionParameteriv (OPENGL32.@) - */ -void WINAPI wine_glGetConvolutionParameteriv( GLenum target, GLenum pname, GLint* params ) { - TRACE("(%d, %d, %p)\n", target, pname, params ); - ENTER_GL(); - glGetConvolutionParameteriv( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** * glGetDoublev (OPENGL32.@) */ void WINAPI wine_glGetDoublev( GLenum pname, GLdouble* params ) { @@ -1274,36 +1034,6 @@ void WINAPI wine_glGetFloatv( GLenum pname, GLfloat* params ) { } /*********************************************************************** - * glGetHistogram (OPENGL32.@) - */ -void WINAPI wine_glGetHistogram( GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid* values ) { - TRACE("(%d, %d, %d, %d, %p)\n", target, reset, format, type, values ); - ENTER_GL(); - glGetHistogram( target, reset, format, type, values ); - LEAVE_GL(); -} - -/*********************************************************************** - * glGetHistogramParameterfv (OPENGL32.@) - */ -void WINAPI wine_glGetHistogramParameterfv( GLenum target, GLenum pname, GLfloat* params ) { - TRACE("(%d, %d, %p)\n", target, pname, params ); - ENTER_GL(); - glGetHistogramParameterfv( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** - * glGetHistogramParameteriv (OPENGL32.@) - */ -void WINAPI wine_glGetHistogramParameteriv( GLenum target, GLenum pname, GLint* params ) { - TRACE("(%d, %d, %p)\n", target, pname, params ); - ENTER_GL(); - glGetHistogramParameteriv( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** * glGetLightfv (OPENGL32.@) */ void WINAPI wine_glGetLightfv( GLenum light, GLenum pname, GLfloat* params ) { @@ -1374,36 +1104,6 @@ void WINAPI wine_glGetMaterialiv( GLenum face, GLenum pname, GLint* params ) { } /*********************************************************************** - * glGetMinmax (OPENGL32.@) - */ -void WINAPI wine_glGetMinmax( GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid* values ) { - TRACE("(%d, %d, %d, %d, %p)\n", target, reset, format, type, values ); - ENTER_GL(); - glGetMinmax( target, reset, format, type, values ); - LEAVE_GL(); -} - -/*********************************************************************** - * glGetMinmaxParameterfv (OPENGL32.@) - */ -void WINAPI wine_glGetMinmaxParameterfv( GLenum target, GLenum pname, GLfloat* params ) { - TRACE("(%d, %d, %p)\n", target, pname, params ); - ENTER_GL(); - glGetMinmaxParameterfv( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** - * glGetMinmaxParameteriv (OPENGL32.@) - */ -void WINAPI wine_glGetMinmaxParameteriv( GLenum target, GLenum pname, GLint* params ) { - TRACE("(%d, %d, %p)\n", target, pname, params ); - ENTER_GL(); - glGetMinmaxParameteriv( target, pname, params ); - LEAVE_GL(); -} - -/*********************************************************************** * glGetPixelMapfv (OPENGL32.@) */ void WINAPI wine_glGetPixelMapfv( GLenum map, GLfloat* values ) { @@ -1454,16 +1154,6 @@ void WINAPI wine_glGetPolygonStipple( GLubyte* mask ) { } /*********************************************************************** - * glGetSeparableFilter (OPENGL32.@) - */ -void WINAPI wine_glGetSeparableFilter( GLenum target, GLenum format, GLenum type, GLvoid* row, GLvoid* column, GLvoid* span ) { - TRACE("(%d, %d, %d, %p, %p, %p)\n", target, format, type, row, column, span ); - ENTER_GL(); - glGetSeparableFilter( target, format, type, row, column, span ); - LEAVE_GL(); -} - -/*********************************************************************** * glGetTexEnvfv (OPENGL32.@) */ void WINAPI wine_glGetTexEnvfv( GLenum target, GLenum pname, GLfloat* params ) { @@ -1574,16 +1264,6 @@ void WINAPI wine_glHint( GLenum target, GLenum mode ) { } /*********************************************************************** - * glHistogram (OPENGL32.@) - */ -void WINAPI wine_glHistogram( GLenum target, GLsizei width, GLenum internalformat, GLboolean sink ) { - TRACE("(%d, %d, %d, %d)\n", target, width, internalformat, sink ); - ENTER_GL(); - glHistogram( target, width, internalformat, sink ); - LEAVE_GL(); -} - -/*********************************************************************** * glIndexMask (OPENGL32.@) */ void WINAPI wine_glIndexMask( GLuint mask ) { @@ -2050,16 +1730,6 @@ void WINAPI wine_glMatrixMode( GLenum mode ) { } /*********************************************************************** - * glMinmax (OPENGL32.@) - */ -void WINAPI wine_glMinmax( GLenum target, GLenum internalformat, GLboolean sink ) { - TRACE("(%d, %d, %d)\n", target, internalformat, sink ); - ENTER_GL(); - glMinmax( target, internalformat, sink ); - LEAVE_GL(); -} - -/*********************************************************************** * glMultMatrixd (OPENGL32.@) */ void WINAPI wine_glMultMatrixd( GLdouble* m ) { @@ -2782,26 +2452,6 @@ GLint WINAPI wine_glRenderMode( GLenum mode ) { } /*********************************************************************** - * glResetHistogram (OPENGL32.@) - */ -void WINAPI wine_glResetHistogram( GLenum target ) { - TRACE("(%d)\n", target ); - ENTER_GL(); - glResetHistogram( target ); - LEAVE_GL(); -} - -/*********************************************************************** - * glResetMinmax (OPENGL32.@) - */ -void WINAPI wine_glResetMinmax( GLenum target ) { - TRACE("(%d)\n", target ); - ENTER_GL(); - glResetMinmax( target ); - LEAVE_GL(); -} - -/*********************************************************************** * glRotated (OPENGL32.@) */ void WINAPI wine_glRotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ) { @@ -2862,16 +2512,6 @@ void WINAPI wine_glSelectBuffer( GLsizei size, GLuint* buffer ) { } /*********************************************************************** - * glSeparableFilter2D (OPENGL32.@) - */ -void WINAPI wine_glSeparableFilter2D( GLenum target, GLenum internalformat, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* row, GLvoid* column ) { - TRACE("(%d, %d, %d, %d, %d, %d, %p, %p)\n", target, internalformat, width, height, format, type, row, column ); - ENTER_GL(); - glSeparableFilter2D( target, internalformat, width, height, format, type, row, column ); - LEAVE_GL(); -} - -/*********************************************************************** * glShadeModel (OPENGL32.@) */ void WINAPI wine_glShadeModel( GLenum mode ) { @@ -3362,16 +3002,6 @@ void WINAPI wine_glTexImage2D( GLenum target, GLint level, GLint internalformat, } /*********************************************************************** - * glTexImage3D (OPENGL32.@) - */ -void WINAPI wine_glTexImage3D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, GLvoid* pixels ) { - TRACE("(%d, %d, %d, %d, %d, %d, %d, %d, %d, %p)\n", target, level, internalformat, width, height, depth, border, format, type, pixels ); - ENTER_GL(); - glTexImage3D( target, level, internalformat, width, height, depth, border, format, type, pixels ); - LEAVE_GL(); -} - -/*********************************************************************** * glTexParameterf (OPENGL32.@) */ void WINAPI wine_glTexParameterf( GLenum target, GLenum pname, GLfloat param ) { @@ -3432,16 +3062,6 @@ void WINAPI wine_glTexSubImage2D( GLenum target, GLint level, GLint xoffset, GLi } /*********************************************************************** - * glTexSubImage3D (OPENGL32.@) - */ -void WINAPI wine_glTexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, GLvoid* pixels ) { - TRACE("(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %p)\n", target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels ); - ENTER_GL(); - glTexSubImage3D( target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels ); - LEAVE_GL(); -} - -/*********************************************************************** * glTranslated (OPENGL32.@) */ void WINAPI wine_glTranslated( GLdouble x, GLdouble y, GLdouble z ) { diff --git a/dlls/riched32/tests/editor.c b/dlls/riched32/tests/editor.c index 269a42592b2..0d853a6e790 100644 --- a/dlls/riched32/tests/editor.c +++ b/dlls/riched32/tests/editor.c @@ -348,11 +348,12 @@ static const struct getline_s { int line; size_t buffer_len; const char *text; + const char *broken_text; } gl[] = { - {0, 10, "foo bar\r\n"}, - {1, 10, "\r"}, - {2, 10, "\r\r\n"}, - {3, 10, "bar\n"}, + {0, 10, "foo bar\r\n", "foo bar\r\n"}, + {1, 10, "\r", "\r\r\r\n"}, + {2, 10, "\r\r\n", "bar\n"}, + {3, 10, "bar\n", "\r\n"}, {4, 10, "\r\n"}, /* Buffer smaller than line length */ @@ -367,19 +368,40 @@ static void test_EM_GETLINE(void) HWND hwndRichEdit = new_richedit(NULL); static const int nBuf = 1024; char dest[1024], origdest[1024]; + LRESULT linecount; const char text[] = "foo bar\r\n" "\r" "\r\r\n" "bar\n"; + BOOL broken_os = FALSE; SendMessage(hwndRichEdit, WM_SETTEXT, 0, (LPARAM) text); + linecount = SendMessage(hwndRichEdit, EM_GETLINECOUNT, 0, 0); + if (linecount == 4) + { + broken_os = TRUE; + win_skip("Win9x, WinME and NT4 handle '\\r only' differently\n"); + } memset(origdest, 0xBB, nBuf); for (i = 0; i < sizeof(gl)/sizeof(struct getline_s); i++) { - int nCopied; - int expected_nCopied = min(gl[i].buffer_len, strlen(gl[i].text)); - int expected_bytes_written = min(gl[i].buffer_len, strlen(gl[i].text) + 1); + int nCopied, expected_nCopied, expected_bytes_written; + char gl_text[1024]; + + if (gl[i].line >= linecount) + continue; /* Win9x, WinME and NT4 */ + + if (broken_os && gl[i].broken_text) + /* Win9x, WinME and NT4 */ + strcpy(gl_text, gl[i].broken_text); + else + strcpy(gl_text, gl[i].text); + + expected_nCopied = min(gl[i].buffer_len, strlen(gl_text)); + /* Cater for the fact that Win9x, WinME and NT4 don't append the '\0' */ + expected_bytes_written = min(gl[i].buffer_len, strlen(gl_text) + (broken_os ? 0 : 1)); + memset(dest, 0xBB, nBuf); *(WORD *) dest = gl[i].buffer_len; @@ -393,11 +415,11 @@ static void test_EM_GETLINE(void) ok(!dest[0] && !dest[1] && !strncmp(dest+2, origdest+2, nBuf-2), "buffer_len=0\n"); else if (gl[i].buffer_len == 1) - ok(dest[0] == gl[i].text[0] && !dest[1] && + ok(dest[0] == gl_text[0] && !dest[1] && !strncmp(dest+2, origdest+2, nBuf-2), "buffer_len=1\n"); else { - ok(!strncmp(dest, gl[i].text, expected_bytes_written), + ok(!strncmp(dest, gl_text, expected_bytes_written), "%d: expected_bytes_written=%d\n", i, expected_bytes_written); ok(!strncmp(dest + expected_bytes_written, origdest + expected_bytes_written, nBuf - expected_bytes_written), @@ -650,6 +672,7 @@ static void check_EM_FINDTEXTEX(HWND hwnd, const char *name, struct find_s *f, ft.chrg.cpMin = f->start; ft.chrg.cpMax = f->end; ft.lpstrText = f->needle; + ft.chrgText.cpMax = 0xdeadbeef; findloc = SendMessage(hwnd, EM_FINDTEXTEX, f->flags, (LPARAM) &ft); ok(findloc == f->expected_loc, "EM_FINDTEXTEX(%s,%d) '%s' in range(%d,%d), flags %08x, start at %d\n", @@ -659,7 +682,8 @@ static void check_EM_FINDTEXTEX(HWND hwnd, const char *name, struct find_s *f, name, id, f->needle, f->start, f->end, f->flags, ft.chrgText.cpMin, f->expected_loc); expected_end_loc = ((f->expected_loc == -1) ? -1 : f->expected_loc + strlen(f->needle)); - ok(ft.chrgText.cpMax == expected_end_loc, + ok(ft.chrgText.cpMax == expected_end_loc || + broken(ft.chrgText.cpMin == -1 && ft.chrgText.cpMax == 0xdeadbeef), /* Win9x, WinME and NT4 */ "EM_FINDTEXTEX(%s,%d) '%s' in range(%d,%d), flags %08x, end at %d, expected %d\n", name, id, f->needle, f->start, f->end, f->flags, ft.chrgText.cpMax, expected_end_loc); } @@ -825,7 +849,7 @@ static void test_word_wrap(void) POINTL point = {0, 60}; /* This point must be below the first line */ const char *text = "Must be long enough to test line wrapping"; DWORD dwCommonStyle = WS_VISIBLE|WS_POPUP|WS_VSCROLL|ES_MULTILINE; - int res, pos, lines; + int res, pos, lines, prevlines, reflines[3]; /* Test the effect of WS_HSCROLL and ES_AUTOHSCROLL styles on wrapping * when specified on window creation and set later. */ @@ -866,11 +890,19 @@ static void test_word_wrap(void) res = SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM) text); ok(res, "WM_SETTEXT failed.\n"); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); - ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); + ok(!pos || + broken(pos == lstrlen(text)), /* Win9x, WinME and NT4 */ + "pos=%d indicating word wrap when none is expected.\n", pos); + lines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + ok(lines == 1, "Line was not expected to wrap (lines=%d).\n", lines); SetWindowLong(hwnd, GWL_STYLE, dwCommonStyle); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); - ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); + ok(!pos || + broken(pos == lstrlen(text)), /* Win9x, WinME and NT4 */ + "pos=%d indicating word wrap when none is expected.\n", pos); + lines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + ok(lines == 1, "Line was not expected to wrap (lines=%d).\n", lines); DestroyWindow(hwnd); hwnd = CreateWindow(RICHEDIT_CLASS10A, NULL, @@ -880,17 +912,29 @@ static void test_word_wrap(void) res = SendMessage(hwnd, WM_SETTEXT, 0, (LPARAM) text); ok(res, "WM_SETTEXT failed.\n"); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); - ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); + ok(!pos || + broken(pos == lstrlen(text)), /* Win9x, WinME and NT4 */ + "pos=%d indicating word wrap when none is expected.\n", pos); + lines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + ok(lines == 1, "Line was not expected to wrap (lines=%d).\n", lines); SetWindowLong(hwnd, GWL_STYLE, dwCommonStyle); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); - ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); + ok(!pos || + broken(pos == lstrlen(text)), /* Win9x, WinME and NT4 */ + "pos=%d indicating word wrap when none is expected.\n", pos); + lines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + ok(lines == 1, "Line was not expected to wrap (lines=%d).\n", lines); /* Test the effect of EM_SETTARGETDEVICE on word wrap. */ res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 1); ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); pos = SendMessage(hwnd, EM_CHARFROMPOS, 0, (LPARAM) &point); - ok(!pos, "pos=%d indicating word wrap when none is expected.\n", pos); + ok(!pos || + broken(pos == lstrlen(text)), /* Win9x, WinME and NT4 */ + "pos=%d indicating word wrap when none is expected.\n", pos); + lines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + ok(lines == 1, "Line was not expected to wrap (lines=%d).\n", lines); res = SendMessage(hwnd, EM_SETTARGETDEVICE, 0, 0); ok(res, "EM_SETTARGETDEVICE failed (returned %d).\n", res); @@ -898,29 +942,55 @@ static void test_word_wrap(void) ok(pos, "pos=%d indicating no word wrap when it is expected.\n", pos); DestroyWindow(hwnd); - /* Test to see if wrapping happens with redraw disabled. */ + /* First lets see if the text would wrap normally (needed for reference) */ + hwnd = CreateWindow(RICHEDIT_CLASS10A, NULL, dwCommonStyle, + 0, 0, 200, 80, NULL, NULL, hmoduleRichEdit, NULL); + ok(hwnd != NULL, "error: %d\n", (int) GetLastError()); + ok(IsWindowVisible(hwnd), "Window should be visible.\n"); + res = SendMessage(hwnd, EM_REPLACESEL, FALSE, (LPARAM) text); + ok(res, "EM_REPLACESEL failed.\n"); + /* Should have wrapped */ + reflines[0] = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + ok(reflines[0] > 1, "Line was expected to wrap (%d lines).\n", reflines[0]); + /* Resize the window to fit the line */ + MoveWindow(hwnd, 0, 0, 600, 80, TRUE); + /* Text should not be wrapped */ + reflines[1] = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + ok(reflines[1] == 1, "Line wasn't expected to wrap (%d lines).\n", reflines[1]); + /* Resize the window again to make sure the line wraps again */ + MoveWindow(hwnd, 0, 0, 10, 80, TRUE); + reflines[2] = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + ok(reflines[2] > 1, "Line was expected to wrap (%d lines).\n", reflines[2]); + DestroyWindow(hwnd); + + /* Same test with redraw disabled */ hwnd = CreateWindow(RICHEDIT_CLASS10A, NULL, dwCommonStyle, - 0, 0, 400, 80, NULL, NULL, hmoduleRichEdit, NULL); + 0, 0, 200, 80, NULL, NULL, hmoduleRichEdit, NULL); ok(hwnd != NULL, "error: %d\n", (int) GetLastError()); ok(IsWindowVisible(hwnd), "Window should be visible.\n"); + /* Redraw is disabled by making the window invisible. */ SendMessage(hwnd, WM_SETREDRAW, FALSE, 0); - /* redraw is disabled by making the window invisible. */ ok(!IsWindowVisible(hwnd), "Window shouldn't be visible.\n"); res = SendMessage(hwnd, EM_REPLACESEL, FALSE, (LPARAM) text); ok(res, "EM_REPLACESEL failed.\n"); - MoveWindow(hwnd, 0, 0, 100, 80, TRUE); - SendMessage(hwnd, WM_SETREDRAW, TRUE, 0); - /* Wrapping didn't happen while redraw was disabled. */ - lines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); - todo_wine ok(lines == 1, "Line wasn't expected to wrap (lines=%d).\n", lines); - /* There isn't even a rewrap from resizing the window. */ + /* Should have wrapped */ + prevlines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); + ok(prevlines == reflines[0], + "Line was expected to wrap (%d lines).\n", prevlines); + /* Resize the window to fit the line, no change to the number of lines */ + MoveWindow(hwnd, 0, 0, 600, 80, TRUE); lines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); - todo_wine ok(lines == 1, "Line wasn't expected to wrap (lines=%d).\n", lines); - res = SendMessage(hwnd, EM_REPLACESEL, FALSE, (LPARAM) text); - ok(res, "EM_REPLACESEL failed.\n"); + todo_wine + ok(lines == prevlines || + broken(lines == reflines[1]), /* Win98, WinME and NT4 */ + "Expected no change in the number of lines\n"); + /* Resize the window again to make sure the line wraps again */ + MoveWindow(hwnd, 0, 0, 10, 80, TRUE); lines = SendMessage(hwnd, EM_GETLINECOUNT, 0, 0); - ok(lines > 1, "Line was expected to wrap (lines=%d).\n", lines); - + todo_wine + ok(lines == prevlines || + broken(lines == reflines[2]), /* Win98, WinME and NT4 */ + "Expected no change in the number of lines\n"); DestroyWindow(hwnd); } @@ -940,7 +1010,8 @@ static void test_EM_GETOPTIONS(void) WS_POPUP|WS_VSCROLL|WS_HSCROLL, 0, 0, 200, 60, NULL, NULL, hmoduleRichEdit, NULL); options = SendMessage(hwnd, EM_GETOPTIONS, 0, 0); - ok(options == ECO_AUTOVSCROLL, + ok(options == ECO_AUTOVSCROLL || + broken(options == 0), /* Win9x, WinME and NT4 */ "Incorrect initial options %x\n", options); DestroyWindow(hwnd); } @@ -957,10 +1028,15 @@ static void test_autoscroll(void) 0, 0, 200, 60, NULL, NULL, hmoduleRichEdit, NULL); ok(hwnd != NULL, "class: %s, error: %d\n", RICHEDIT_CLASS10A, (int) GetLastError()); ret = SendMessage(hwnd, EM_GETOPTIONS, 0, 0); - ok(ret & ECO_AUTOVSCROLL, "ECO_AUTOVSCROLL isn't set.\n"); + ok(ret & ECO_AUTOVSCROLL || + broken(!(ret & ECO_AUTOVSCROLL)), /* Win9x, WinME and NT4 */ + "ECO_AUTOVSCROLL isn't set.\n"); ok(!(ret & ECO_AUTOHSCROLL), "ECO_AUTOHSCROLL is set.\n"); ret = GetWindowLong(hwnd, GWL_STYLE); - todo_wine ok(ret & ES_AUTOVSCROLL, "ES_AUTOVSCROLL isn't set.\n"); + todo_wine + ok(ret & ES_AUTOVSCROLL || + broken(!(ret & ES_AUTOVSCROLL)), /* Win9x, WinMe and NT4 */ + "ES_AUTOVSCROLL isn't set.\n"); ok(!(ret & ES_AUTOHSCROLL), "ES_AUTOHSCROLL is set.\n"); DestroyWindow(hwnd); diff --git a/dlls/rpcrt4/cpsf.c b/dlls/rpcrt4/cpsf.c index fe551857472..ac1eccf56fa 100644 --- a/dlls/rpcrt4/cpsf.c +++ b/dlls/rpcrt4/cpsf.c @@ -167,8 +167,9 @@ static void init_psfactory( CStdPSFactoryBuffer *psfac, const ProxyFileInfo **fi if (file_list[i]->pDelegatedIIDs && file_list[i]->pDelegatedIIDs[j]) { - fill_delegated_proxy_table( (IUnknownVtbl *)proxies[j]->Vtbl, - stubs[j]->header.DispatchTableCount ); + void **vtbl = proxies[j]->Vtbl; + if (file_list[i]->TableVersion > 1) vtbl++; + fill_delegated_proxy_table( (IUnknownVtbl *)vtbl, stubs[j]->header.DispatchTableCount ); pSrcRpcStubVtbl = (void * const *)&CStdStubBuffer_Delegating_Vtbl; } diff --git a/dlls/setupapi/De.rc b/dlls/setupapi/De.rc index 52ea34bf23f..fc388ed1ece 100644 --- a/dlls/setupapi/De.rc +++ b/dlls/setupapi/De.rc @@ -2,6 +2,7 @@ * German resources for SETUPAPI * * Copyright 2004 Henning Gerhardt + * Copyright 2009 André Hentschel * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,8 +19,18 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +#pragma code_page(65001) + LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +{ + IDS_PROMPTDISK "Die Datei '%s' von %s wird benötigt." + IDS_UNKNOWN "Unbekannt" + IDS_COPYFROM "Dateien kopieren von:" + IDS_INFO "Geben Sie den Pfad zur Datei ein und klicken Sie OK." +} + COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "Dateien kopieren..." @@ -32,3 +43,19 @@ BEGIN LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP END + +IDPROMPTFORDISK DIALOG MOVEABLE DISCARDABLE 0, 0, 250, 120 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Erforderliche Dateien" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Legen Sie das Installationsmedium des Herstellers in\ndas ausgewählte Laufwerk ein", IDC_FILENEEDED, 10, 10, 175, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", IDC_INFO, 10, 50, 175, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "Dateien des Herstellers kopieren von:", IDC_COPYFROM, 10, 90, 175, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + CONTROL "", IDC_PATH, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 10, 100, 175, 14 + PUSHBUTTON "OK", IDOK, 195, 10, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Abbrechen", IDCANCEL, 195, 30, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Durchsuchen...", IDC_RUNDLG_BROWSE, 190, 100, 55, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +#pragma code_page(default) diff --git a/dlls/setupapi/Fr.rc b/dlls/setupapi/Fr.rc index 54e45d93e81..54054256913 100644 --- a/dlls/setupapi/Fr.rc +++ b/dlls/setupapi/Fr.rc @@ -3,6 +3,7 @@ * * Copyright 2001 Andreas Mohr * Copyright 2003 Vincent Béron + * Copyright 2009 Jonathan Ernst * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -21,15 +22,37 @@ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL +STRINGTABLE DISCARDABLE +{ + IDS_PROMPTDISK "Le fichier « %s » sur %s est requis" + IDS_UNKNOWN "Inconnu" + IDS_COPYFROM "Copier les fichiers depuis :" + IDS_INFO "Saisissez le chemin du fichier, puis cliquez sur OK." +} + COPYFILEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 208, 105 STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION CAPTION "Copie de fichiers..." FONT 8, "MS Shell Dlg" BEGIN PUSHBUTTON "Annuler", IDCANCEL, 79, 84, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - LTEXT "Source:", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "Source :", -1, 7, 7, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP LTEXT "", SOURCESTRORD, 7, 18, 194, 11, WS_CHILD | WS_VISIBLE | WS_GROUP - LTEXT "Destination:", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "Destination :", -1, 7, 30, 77, 11, WS_CHILD | WS_VISIBLE | WS_GROUP LTEXT "", DESTSTRORD, 7, 41, 194, 22, WS_CHILD | WS_VISIBLE | WS_GROUP CONTROL "", PROGRESSORD, "setupx_progress", 7, 63, 194, 13, WS_CHILD | WS_VISIBLE | WS_TABSTOP END + +IDPROMPTFORDISK DIALOG MOVEABLE DISCARDABLE 0, 0, 250, 120 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Fichiers requis" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Veuillez insérer le disque d'installation du fabriquant et\nassurez vous que le lecteur correct est sélectionné ci-dessous", IDC_FILENEEDED, 10, 10, 175, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "", IDC_INFO, 10, 50, 175, 22, WS_CHILD | WS_VISIBLE | WS_GROUP + LTEXT "Copier les fichiers du fabriquan depuis :", IDC_COPYFROM, 10, 90, 175, 11, WS_CHILD | WS_VISIBLE | WS_GROUP + CONTROL "", IDC_PATH, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 10, 100, 175, 14 + PUSHBUTTON "OK", IDOK, 195, 10, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Annuler", IDCANCEL, 195, 30, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Parcourir...", IDC_RUNDLG_BROWSE, 195, 100, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END diff --git a/dlls/setupapi/tests/parser.c b/dlls/setupapi/tests/parser.c index a67a5cd4f5d..f12d02dcbc6 100644 --- a/dlls/setupapi/tests/parser.c +++ b/dlls/setupapi/tests/parser.c @@ -32,14 +32,18 @@ /* function pointers */ static HMODULE hSetupAPI; -static LPCWSTR (WINAPI *pSetupGetField)(PINFCONTEXT,DWORD); +static LPCSTR (WINAPI *pSetupGetFieldA)(PINFCONTEXT,DWORD); +static LPCWSTR (WINAPI *pSetupGetFieldW)(PINFCONTEXT,DWORD); static BOOL (WINAPI *pSetupEnumInfSectionsA)( HINF hinf, UINT index, PSTR buffer, DWORD size, UINT *need ); static void init_function_pointers(void) { hSetupAPI = GetModuleHandleA("setupapi.dll"); - pSetupGetField = (void *)GetProcAddress(hSetupAPI, "pSetupGetField"); + /* Nice, pSetupGetField is either A or W depending on the Windows version! The actual test + * takes care of this difference */ + pSetupGetFieldA = (void *)GetProcAddress(hSetupAPI, "pSetupGetField"); + pSetupGetFieldW = (void *)GetProcAddress(hSetupAPI, "pSetupGetField"); pSetupEnumInfSectionsA = (void *)GetProcAddress(hSetupAPI, "SetupEnumInfSectionsA" ); } @@ -497,7 +501,14 @@ static const char *contents = "[Version]\n" "[Strings]\n" "RTMQFE_NAME = \"RTMQFE\"\n"; -static const WCHAR getfield_res[][20] = +static const CHAR getfield_resA[][20] = +{ + "RTMQFE", + "%RTMGFE_NAME%", + "SP1RTM", +}; + +static const WCHAR getfield_resW[][20] = { {'R','T','M','Q','F','E',0}, {'%','R','T','M','G','F','E','_','N','A','M','E','%',0}, @@ -509,10 +520,20 @@ static void test_pSetupGetField(void) UINT err; BOOL ret; HINF hinf; - LPCWSTR field; + LPCSTR fieldA; + LPCWSTR fieldW; INFCONTEXT context; int i; int len; + BOOL unicode = TRUE; + + SetLastError(0xdeadbeef); + lstrcmpW(NULL, NULL); + if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("Using A-functions instead of W\n"); + unicode = FALSE; + } hinf = test_file_contents( contents, &err ); ok( hinf != NULL, "Expected valid INF file\n" ); @@ -524,23 +545,47 @@ static void test_pSetupGetField(void) for ( i = 0; i < 3; i++ ) { - field = pSetupGetField( &context, i ); - ok( field != NULL, "Failed to get field %i\n", i ); - ok( !lstrcmpW( getfield_res[i], field ), "Wrong string returned\n" ); + if (unicode) + { + fieldW = pSetupGetFieldW( &context, i ); + ok( fieldW != NULL, "Failed to get field %i\n", i ); + ok( !lstrcmpW( getfield_resW[i], fieldW ), "Wrong string returned\n" ); + } + else + { + fieldA = pSetupGetFieldA( &context, i ); + ok( fieldA != NULL, "Failed to get field %i\n", i ); + ok( !lstrcmpA( getfield_resA[i], fieldA ), "Wrong string returned\n" ); + } } - field = pSetupGetField( &context, 3 ); - ok( field != NULL, "Failed to get field 3\n" ); - len = lstrlenW( field ); - ok( len == 511 /* NT4, W2K, XP and W2K3 */ || - len == 4096 /* Vista */ || - len == 256 /* Win9x and WinME */, - "Unexpected length, got %d\n", len ); - - field = pSetupGetField( &context, 4 ); - ok( field == NULL, "Expected NULL, got %p\n", field ); - ok( GetLastError() == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError() ); + if (unicode) + { + fieldW = pSetupGetFieldW( &context, 3 ); + ok( fieldW != NULL, "Failed to get field 3\n" ); + len = lstrlenW( fieldW ); + ok( len == 511 || /* NT4, W2K, XP and W2K3 */ + len == 4096, /* Vista */ + "Unexpected length, got %d\n", len ); + + fieldW = pSetupGetFieldW( &context, 4 ); + ok( fieldW == NULL, "Expected NULL, got %p\n", fieldW ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError() ); + } + else + { + fieldA = pSetupGetFieldA( &context, 3 ); + ok( fieldA != NULL, "Failed to get field 3\n" ); + len = lstrlenA( fieldA ); + ok( len == 511, /* Win9x, WinME */ + "Unexpected length, got %d\n", len ); + + fieldA = pSetupGetFieldA( &context, 4 ); + ok( fieldA == NULL, "Expected NULL, got %p\n", fieldA ); + ok( GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError() ); + } SetupCloseInfFile( hinf ); } diff --git a/dlls/shell32/changenotify.c b/dlls/shell32/changenotify.c index 96345b66d8c..43a5fb8263b 100644 --- a/dlls/shell32/changenotify.c +++ b/dlls/shell32/changenotify.c @@ -105,6 +105,31 @@ static const char * DumpEvent( LONG event ) #undef DUMPEV } +static BOOL RefreshFileTypeAssociations(void) +{ + static WCHAR szWinemenubuilder[] = { + 'w','i','n','e','m','e','n','u','b','u','i','l','d','e','r','.','e','x','e', + ' ','-','a',0 }; + STARTUPINFOW si; + PROCESS_INFORMATION pi; + BOOL ret; + + TRACE("starting %s\n",debugstr_w(szWinemenubuilder)); + + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + + ret = CreateProcessW( NULL, szWinemenubuilder, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); + + if (ret) + { + CloseHandle( pi.hProcess ); + CloseHandle( pi.hThread ); + } + + return ret; +} + static const char * NodeName(const NOTIFICATIONLIST *item) { const char *str; @@ -397,6 +422,12 @@ void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID } TRACE("notify Done\n"); LeaveCriticalSection(&SHELL32_ChangenotifyCS); + + if (wEventId & SHCNE_ASSOCCHANGED) + { + TRACE("refreshing file type associations\n"); + RefreshFileTypeAssociations(); + } /* if we allocated it, free it. The ANSI flag is also set in its Unicode sibling. */ if ((typeFlag & SHCNF_PATHA) || (typeFlag & SHCNF_PRINTERA)) diff --git a/dlls/shell32/shell32_De.rc b/dlls/shell32/shell32_De.rc index cb8d39f3557..051ca6b9014 100644 --- a/dlls/shell32/shell32_De.rc +++ b/dlls/shell32/shell32_De.rc @@ -242,6 +242,12 @@ STRINGTABLE IDS_SHUTDOWN_TITLE "Beenden" IDS_SHUTDOWN_PROMPT "Möchten Sie die aktuelle Wine Sitzung beenden?" + /* Run File dialog */ + IDS_RUNDLG_ERROR "Konnte Ausführen-Dialog nicht anzeigen (interner Fehler)" + IDS_RUNDLG_BROWSE_ERROR "Konnte Durchsuchen-Dialog nicht anzeigen (interner Fehler)" + IDS_RUNDLG_BROWSE_CAPTION "Durchsuchen" + IDS_RUNDLG_BROWSE_FILTER "Programme\0*.exe\0Alle Dateien\0*.*\0\0" + /* shell folder path default values */ IDS_PROGRAMS "Startmenü\\Programme" IDS_PERSONAL "Eigene Dateien" @@ -276,6 +282,7 @@ STRINGTABLE IDS_CPANEL_TITLE "Wine Control Panel" IDS_CPANEL_NAME "Name" IDS_CPANEL_DESCRIPTION "Description" + IDS_SHLEXEC_NOASSOC "Es ist kein Programm mit diesem Dateityp verknüpft." } STRINGTABLE diff --git a/dlls/shell32/shell32_Fr.rc b/dlls/shell32/shell32_Fr.rc index b8308fdbaa3..e4fc4bb8c29 100644 --- a/dlls/shell32/shell32_Fr.rc +++ b/dlls/shell32/shell32_Fr.rc @@ -3,7 +3,7 @@ * French language support * * Copyright 1998 Juergen Schmied - * Copyright 2006-2008 Jonathan Ernst + * Copyright 2006-2009 Jonathan Ernst * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -288,6 +288,8 @@ STRINGTABLE IDS_CPANEL_TITLE "Wine Control Panel" IDS_CPANEL_NAME "Name" IDS_CPANEL_DESCRIPTION "Description" + + IDS_SHLEXEC_NOASSOC "Il n'y a aucun programme Windows configuré pour ouvrir ce type de fichier." } STRINGTABLE diff --git a/dlls/shell32/tests/appbar.c b/dlls/shell32/tests/appbar.c index 51bea2b2fdd..e23d7283e01 100644 --- a/dlls/shell32/tests/appbar.c +++ b/dlls/shell32/tests/appbar.c @@ -71,15 +71,15 @@ static void testwindow_setpos(HWND hwnd) abd.rc.top = abd.rc.bottom - (info->desired_rect.bottom - info->desired_rect.top); break; case ABE_LEFT: - ok(info->desired_rect.right == abd.rc.right, "ABM_QUERYPOS changed right of rect from %i to %i\n", info->desired_rect.top, abd.rc.top); + ok(info->desired_rect.right == abd.rc.right, "ABM_QUERYPOS changed right of rect from %i to %i\n", info->desired_rect.right, abd.rc.right); abd.rc.right = abd.rc.left + (info->desired_rect.right - info->desired_rect.left); break; case ABE_RIGHT: - ok(info->desired_rect.left == abd.rc.left, "ABM_QUERYPOS changed left of rect from %i to %i\n", info->desired_rect.top, abd.rc.top); + ok(info->desired_rect.left == abd.rc.left, "ABM_QUERYPOS changed left of rect from %i to %i\n", info->desired_rect.left, abd.rc.left); abd.rc.left = abd.rc.right - (info->desired_rect.right - info->desired_rect.left); break; case ABE_TOP: - ok(info->desired_rect.bottom == abd.rc.bottom, "ABM_QUERYPOS changed bottom of rect from %i to %i\n", info->desired_rect.top, abd.rc.top); + ok(info->desired_rect.bottom == abd.rc.bottom, "ABM_QUERYPOS changed bottom of rect from %i to %i\n", info->desired_rect.bottom, abd.rc.bottom); abd.rc.bottom = abd.rc.top + (info->desired_rect.bottom - info->desired_rect.top); break; } diff --git a/dlls/shlwapi/Makefile.in b/dlls/shlwapi/Makefile.in index c178148bc25..bafe9f27e39 100644 --- a/dlls/shlwapi/Makefile.in +++ b/dlls/shlwapi/Makefile.in @@ -6,7 +6,7 @@ VPATH = @srcdir@ MODULE = shlwapi.dll IMPORTLIB = shlwapi IMPORTS = uuid user32 gdi32 advapi32 kernel32 ntdll -DELAYIMPORTS = oleaut32 ole32 comctl32 comdlg32 mpr mlang urlmon shell32 winmm version +DELAYIMPORTS = oleaut32 ole32 comctl32 comdlg32 mpr mlang urlmon shell32 winmm version dnsapi C_SRCS = \ assoc.c \ diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec index d9cc3a5f842..b7ea3aa6fff 100644 --- a/dlls/shlwapi/shlwapi.spec +++ b/dlls/shlwapi/shlwapi.spec @@ -193,7 +193,7 @@ 193 stdcall -noname SHGetCurColorRes() 194 stdcall -noname SHWaitForSendMessageThread(ptr long) 195 stdcall -noname SHIsExpandableFolder(ptr ptr) -196 stub -noname DnsRecordSetCompare #stdcall @(ptr ptr ptr ptr) dnsapi.DnsRecordSetCompare +196 stdcall -noname DnsRecordSetCompare(ptr ptr ptr ptr) dnsapi.DnsRecordSetCompare 197 stdcall -noname SHFillRectClr(long ptr long) 198 stdcall -noname SHSearchMapInt(ptr ptr long long) 199 stdcall -noname IUnknown_Set(ptr ptr) diff --git a/dlls/urlmon/bindctx.c b/dlls/urlmon/bindctx.c index 044b817eda5..8c1949bae8c 100644 --- a/dlls/urlmon/bindctx.c +++ b/dlls/urlmon/bindctx.c @@ -386,7 +386,7 @@ static HRESULT WINAPI BSCHttpNegotiate_GetRootSecurityId(IHttpNegotiate2 *iface, TRACE("(%p)->(%p %p %ld)\n", This, pbSecurityId, pcbSecurityId, dwReserved); if(!This->http_negotiate2) - return E_FAIL; + return E_NOTIMPL; return IHttpNegotiate2_GetRootSecurityId(This->http_negotiate2, pbSecurityId, pcbSecurityId, dwReserved); diff --git a/dlls/urlmon/tests/url.c b/dlls/urlmon/tests/url.c index 7b9c89fdebf..c3815d67576 100644 --- a/dlls/urlmon/tests/url.c +++ b/dlls/urlmon/tests/url.c @@ -1963,7 +1963,7 @@ static BOOL test_bscholder(IBindStatusCallback *holder) if(SUCCEEDED(hres)) { have_IHttpNegotiate2 = TRUE; hres = IHttpNegotiate2_GetRootSecurityId(http_negotiate2, (void*)0xdeadbeef, (void*)0xdeadbeef, 0); - ok(hres == E_FAIL, "GetRootSecurityId failed: %08x\n", hres); + ok(hres == E_FAIL || hres == E_NOTIMPL, "GetRootSecurityId failed: %08x\n", hres); SET_EXPECT(QueryInterface_IHttpNegotiate2); hres = IServiceProvider_QueryService(serv_prov, &IID_IHttpNegotiate2, &IID_IHttpNegotiate2, diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 0d820011542..f4913e1b343 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -2034,6 +2034,8 @@ static BOOL peek_message( MSG *msg, HWND hwnd, UINT first, UINT last, UINT flags if (!(buffer = HeapAlloc( GetProcessHeap(), 0, buffer_size ))) return FALSE; if (!first && !last) last = ~0; + if (hwnd == HWND_BROADCAST || hwnd == HWND_TOPMOST || hwnd == HWND_BOTTOM) + hwnd = (HWND)-1; for (;;) { diff --git a/dlls/user32/spy.c b/dlls/user32/spy.c index 8cd926bc2d7..c2bd60b99b8 100644 --- a/dlls/user32/spy.c +++ b/dlls/user32/spy.c @@ -2489,7 +2489,8 @@ static void SPY_DumpStructure(const SPY_INSTANCE *sp_e, BOOL enter) SetLastError(save_error); if (strcmpW(TOOLBARCLASSNAMEW, from_class) == 0) dumplen = sizeof(NMTBCUSTOMDRAW)-sizeof(NMHDR); - } else if ((pnmh->code >= HDN_ITEMCHANGINGA) && (pnmh->code <= HDN_ENDDRAG)) { + } else if ( pnmh->code >= HDN_ENDDRAG + && pnmh->code <= HDN_ITEMCHANGINGA ) { dumplen = sizeof(NMHEADERA)-sizeof(NMHDR); } if (dumplen > 0) { diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c index 0563271b0c0..94757a30613 100644 --- a/dlls/user32/sysparams.c +++ b/dlls/user32/sysparams.c @@ -2435,10 +2435,17 @@ BOOL WINAPI SystemParametersInfoW( UINT uiAction, UINT uiParam, ret = FALSE; break; - WINE_SPI_FIXME(SPI_GETFOCUSBORDERWIDTH); /* 0x200E _WIN32_WINNT >= 0x510 */ - WINE_SPI_FIXME(SPI_SETFOCUSBORDERWIDTH); /* 0x200F _WIN32_WINNT >= 0x510 */ - WINE_SPI_FIXME(SPI_GETFOCUSBORDERHEIGHT); /* 0x2010 _WIN32_WINNT >= 0x510 */ + case SPI_GETFOCUSBORDERWIDTH: /* 0x200E _WIN32_WINNT >= 0x510 */ + case SPI_GETFOCUSBORDERHEIGHT: /* 0x200F _WIN32_WINNT >= 0x510 */ + if (!pvParam) + ret = FALSE; + else + *(UINT *)pvParam = 1; + break; + + WINE_SPI_FIXME(SPI_SETFOCUSBORDERWIDTH); /* 0x2010 _WIN32_WINNT >= 0x510 */ WINE_SPI_FIXME(SPI_SETFOCUSBORDERHEIGHT); /* 0x2011 _WIN32_WINNT >= 0x510 */ + case SPI_GETFONTSMOOTHINGORIENTATION: /* 0x2012 */ spi_idx = SPI_SETFONTSMOOTHINGORIENTATION_IDX; if (!spi_loaded[spi_idx]) diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index 0a59ae8b55f..28b0420b8a0 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -11592,6 +11592,59 @@ static void test_defwinproc(void) DestroyWindow( hwnd); } +static void test_PostMessage(void) +{ + static const struct + { + HWND hwnd; + BOOL ret; + } data[] = + { + { HWND_TOP /* 0 */, TRUE }, + { HWND_BROADCAST, TRUE }, + { HWND_BOTTOM, TRUE }, + { HWND_TOPMOST, TRUE }, + { HWND_NOTOPMOST, FALSE }, + { HWND_MESSAGE, FALSE }, + { (HWND)0xdeadbeef, FALSE } + }; + int i; + HWND hwnd; + BOOL ret; + MSG msg; + + hwnd = CreateWindowExA(0, "static", NULL, WS_POPUP, 0,0,0,0,0,0,0, NULL); + assert(hwnd); + + flush_events(); + + PostMessage(hwnd, WM_USER+1, 0x1234, 0x5678); + PostMessage(0, WM_USER+2, 0x5678, 0x1234); + + for (i = 0; i < sizeof(data)/sizeof(data[0]); i++) + { + memset(&msg, 0xab, sizeof(msg)); + ret = PeekMessageA(&msg, data[i].hwnd, 0, 0, PM_NOREMOVE); + ok(ret == data[i].ret, "%d: hwnd %p expected %d, got %d\n", i, data[i].hwnd, data[i].ret, ret); + if (data[i].ret) + { + if (data[i].hwnd) + ok(ret && msg.hwnd == 0 && msg.message == WM_USER+2 && + msg.wParam == 0x5678 && msg.lParam == 0x1234, + "got ret %d hwnd %p msg %04x wParam %08lx lParam %08lx instead of TRUE/0/WM_USER/0x1234/0x5678\n", + ret, msg.hwnd, msg.message, msg.wParam, msg.lParam); + else + ok(ret && msg.hwnd == hwnd && msg.message == WM_USER+1 && + msg.wParam == 0x1234 && msg.lParam == 0x5678, + "got ret %d hwnd %p msg %04x wParam %08lx lParam %08lx instead of TRUE/0/WM_USER/0x1234/0x5678\n", + ret, msg.hwnd, msg.message, msg.wParam, msg.lParam); + } + } + + DestroyWindow(hwnd); + flush_events(); +} + START_TEST(msg) { BOOL ret; @@ -11633,6 +11686,7 @@ START_TEST(msg) hEvent_hook = 0; #endif + test_PostMessage(); test_ShowWindow(); test_PeekMessage(); test_PeekMessage2(); diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index f1a65852eca..1ff6ef41a59 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -354,4 +354,10 @@ typedef struct extern void CURSORICON_FreeModuleIcons( HMODULE16 hModule ) DECLSPEC_HIDDEN; +/* Mingw's assert() imports MessageBoxA and gets confused by user32 exporting it */ +#ifdef __MINGW32__ +#undef assert +#define assert(expr) ((void)0) +#endif + #endif /* __WINE_USER_PRIVATE_H */ diff --git a/dlls/windowscodecs/Makefile.in b/dlls/windowscodecs/Makefile.in new file mode 100644 index 00000000000..1449089313c --- /dev/null +++ b/dlls/windowscodecs/Makefile.in @@ -0,0 +1,13 @@ +TOPSRCDIR = @top_srcdir@ +TOPOBJDIR = ../.. +SRCDIR = @srcdir@ +VPATH = @srcdir@ +MODULE = windowscodecs.dll +IMPORTS = kernel32 + +C_SRCS = \ + main.c + +@MAKE_DLL_RULES@ + +@DEPENDENCIES@ # everything below this line is overwritten by make depend diff --git a/dlls/cryptdlg/cryptdlg.rc b/dlls/windowscodecs/main.c similarity index 62% copy from dlls/cryptdlg/cryptdlg.rc copy to dlls/windowscodecs/main.c index e8156531dcc..e3912b8462a 100644 --- a/dlls/cryptdlg/cryptdlg.rc +++ b/dlls/windowscodecs/main.c @@ -1,7 +1,5 @@ /* - * cryptdlg dll resources - * - * Copyright 2008 Juan Lang + * Copyright 2009 Vincent Povirk for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -17,12 +15,28 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ + + +#include "config.h" + +#include + #include "windef.h" #include "winbase.h" -#include "winuser.h" -#include "cryptres.h" -#include "cryptdlg_En.rc" -#include "cryptdlg_Fr.rc" -#include "cryptdlg_Ko.rc" -#include "cryptdlg_Nl.rc" +BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) +{ + + switch (fdwReason) + { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ + case DLL_PROCESS_ATTACH: + DisableThreadLibraryCalls(hinstDLL); + break; + case DLL_PROCESS_DETACH: + break; + } + + return TRUE; +} diff --git a/dlls/windowscodecs/windowscodecs.spec b/dlls/windowscodecs/windowscodecs.spec new file mode 100644 index 00000000000..8fc2026a1b4 --- /dev/null +++ b/dlls/windowscodecs/windowscodecs.spec @@ -0,0 +1,114 @@ +@ stub DllGetClassObject +@ stub IEnumString_Next_WIC_Proxy +@ stub IEnumString_Reset_WIC_Proxy +@ stub IPropertyBag2_Write_Proxy +@ stub IWICBitmapClipper_Initialize_Proxy +@ stub IWICBitmapCodecInfo_DoesSupportAnimation_Proxy +@ stub IWICBitmapCodecInfo_DoesSupportLossless_Proxy +@ stub IWICBitmapCodecInfo_DoesSupportMultiframe_Proxy +@ stub IWICBitmapCodecInfo_GetContainerFormat_Proxy +@ stub IWICBitmapCodecInfo_GetDeviceManufacturer_Proxy +@ stub IWICBitmapCodecInfo_GetDeviceModels_Proxy +@ stub IWICBitmapCodecInfo_GetFileExtensions_Proxy +@ stub IWICBitmapCodecInfo_GetMimeTypes_Proxy +@ stub IWICBitmapDecoder_CopyPalette_Proxy +@ stub IWICBitmapDecoder_GetColorContexts_Proxy +@ stub IWICBitmapDecoder_GetDecoderInfo_Proxy +@ stub IWICBitmapDecoder_GetFrameCount_Proxy +@ stub IWICBitmapDecoder_GetFrame_Proxy +@ stub IWICBitmapDecoder_GetMetadataQueryReader_Proxy +@ stub IWICBitmapDecoder_GetPreview_Proxy +@ stub IWICBitmapDecoder_GetThumbnail_Proxy +@ stub IWICBitmapEncoder_Commit_Proxy +@ stub IWICBitmapEncoder_CreateNewFrame_Proxy +@ stub IWICBitmapEncoder_GetEncoderInfo_Proxy +@ stub IWICBitmapEncoder_GetMetadataQueryWriter_Proxy +@ stub IWICBitmapEncoder_Initialize_Proxy +@ stub IWICBitmapEncoder_SetPalette_Proxy +@ stub IWICBitmapEncoder_SetThumbnail_Proxy +@ stub IWICBitmapFlipRotator_Initialize_Proxy +@ stub IWICBitmapFrameDecode_GetColorContexts_Proxy +@ stub IWICBitmapFrameDecode_GetMetadataQueryReader_Proxy +@ stub IWICBitmapFrameDecode_GetThumbnail_Proxy +@ stub IWICBitmapFrameEncode_Commit_Proxy +@ stub IWICBitmapFrameEncode_GetMetadataQueryWriter_Proxy +@ stub IWICBitmapFrameEncode_Initialize_Proxy +@ stub IWICBitmapFrameEncode_SetColorContexts_Proxy +@ stub IWICBitmapFrameEncode_SetResolution_Proxy +@ stub IWICBitmapFrameEncode_SetSize_Proxy +@ stub IWICBitmapFrameEncode_SetThumbnail_Proxy +@ stub IWICBitmapFrameEncode_WriteSource_Proxy +@ stub IWICBitmapLock_GetDataPointer_STA_Proxy +@ stub IWICBitmapLock_GetStride_Proxy +@ stub IWICBitmapScaler_Initialize_Proxy +@ stub IWICBitmapSource_CopyPalette_Proxy +@ stub IWICBitmapSource_CopyPixels_Proxy +@ stub IWICBitmapSource_GetPixelFormat_Proxy +@ stub IWICBitmapSource_GetResolution_Proxy +@ stub IWICBitmapSource_GetSize_Proxy +@ stub IWICBitmap_Lock_Proxy +@ stub IWICBitmap_SetPalette_Proxy +@ stub IWICBitmap_SetResolution_Proxy +@ stub IWICColorContext_InitializeFromMemory_Proxy +@ stub IWICComponentFactory_CreateMetadataWriterFromReader_Proxy +@ stub IWICComponentFactory_CreateQueryWriterFromBlockWriter_Proxy +@ stub IWICComponentInfo_GetAuthor_Proxy +@ stub IWICComponentInfo_GetCLSID_Proxy +@ stub IWICComponentInfo_GetFriendlyName_Proxy +@ stub IWICComponentInfo_GetSpecVersion_Proxy +@ stub IWICComponentInfo_GetVersion_Proxy +@ stub IWICFastMetadataEncoder_Commit_Proxy +@ stub IWICFastMetadataEncoder_GetMetadataQueryWriter_Proxy +@ stub IWICFormatConverter_Initialize_Proxy +@ stub IWICImagingFactory_CreateBitmapClipper_Proxy +@ stub IWICImagingFactory_CreateBitmapFlipRotator_Proxy +@ stub IWICImagingFactory_CreateBitmapFromHBITMAP_Proxy +@ stub IWICImagingFactory_CreateBitmapFromHICON_Proxy +@ stub IWICImagingFactory_CreateBitmapFromMemory_Proxy +@ stub IWICImagingFactory_CreateBitmapFromSource_Proxy +@ stub IWICImagingFactory_CreateBitmapScaler_Proxy +@ stub IWICImagingFactory_CreateBitmap_Proxy +@ stub IWICImagingFactory_CreateComponentInfo_Proxy +@ stub IWICImagingFactory_CreateDecoderFromFileHandle_Proxy +@ stub IWICImagingFactory_CreateDecoderFromFilename_Proxy +@ stub IWICImagingFactory_CreateDecoderFromStream_Proxy +@ stub IWICImagingFactory_CreateEncoder_Proxy +@ stub IWICImagingFactory_CreateFastMetadataEncoderFromDecoder_Proxy +@ stub IWICImagingFactory_CreateFastMetadataEncoderFromFrameDecode_Proxy +@ stub IWICImagingFactory_CreateFormatConverter_Proxy +@ stub IWICImagingFactory_CreatePalette_Proxy +@ stub IWICImagingFactory_CreateQueryWriterFromReader_Proxy +@ stub IWICImagingFactory_CreateQueryWriter_Proxy +@ stub IWICImagingFactory_CreateStream_Proxy +@ stub IWICMetadataBlockReader_GetCount_Proxy +@ stub IWICMetadataBlockReader_GetReaderByIndex_Proxy +@ stub IWICMetadataQueryReader_GetContainerFormat_Proxy +@ stub IWICMetadataQueryReader_GetEnumerator_Proxy +@ stub IWICMetadataQueryReader_GetLocation_Proxy +@ stub IWICMetadataQueryReader_GetMetadataByName_Proxy +@ stub IWICMetadataQueryWriter_RemoveMetadataByName_Proxy +@ stub IWICMetadataQueryWriter_SetMetadataByName_Proxy +@ stub IWICPalette_GetColorCount_Proxy +@ stub IWICPalette_GetColors_Proxy +@ stub IWICPalette_GetType_Proxy +@ stub IWICPalette_HasAlpha_Proxy +@ stub IWICPalette_InitializeCustom_Proxy +@ stub IWICPalette_InitializeFromBitmap_Proxy +@ stub IWICPalette_InitializeFromPalette_Proxy +@ stub IWICPalette_InitializePredefined_Proxy +@ stub IWICPixelFormatInfo_GetBitsPerPixel_Proxy +@ stub IWICPixelFormatInfo_GetChannelCount_Proxy +@ stub IWICPixelFormatInfo_GetChannelMask_Proxy +@ stub IWICStream_InitializeFromIStream_Proxy +@ stub IWICStream_InitializeFromMemory_Proxy +@ stub WICConvertBitmapSource +@ stub WICCreateBitmapFromSection +@ stub WICCreateColorContext_Proxy +@ stub WICCreateImagingFactory_Proxy +@ stub WICGetMetadataContentSize +@ stub WICMapGuidToShortName +@ stub WICMapSchemaToName +@ stub WICMapShortNameToGuid +@ stub WICMatchMetadataContent +@ stub WICSerializeMetadataContent +@ stub WICSetEncoderFormat_Proxy diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index f5f5f8dbe7d..ac7ced4af9d 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -74,19 +74,50 @@ static unsigned int reserved_vs_const(IWineD3DBaseShader *shader, const WineD3D_ #define ARB_SHADER_PRIVCONST_POS ARB_SHADER_PRIVCONST_BASE + 0 /* ARB_program_shader private data */ -struct shader_arb_priv { - GLuint current_vprogram_id; - GLuint current_fprogram_id; - GLuint depth_blt_vprogram_id; - GLuint depth_blt_fprogram_id[tex_type_count]; - BOOL use_arbfp_fixed_func; - struct wine_rb_tree fragment_shaders; -}; - -struct if_frame { +struct control_frame +{ struct list entry; BOOL ifc; BOOL muting; + unsigned int loop_no; +}; + +struct arb_ps_compile_args +{ + struct ps_compile_args super; + DWORD bools; /* WORD is enough, use DWORD for alignment */ +}; + +struct stb_const_desc +{ + unsigned char texunit; + UINT const_num; +}; + +struct arb_ps_compiled_shader +{ + struct arb_ps_compile_args args; + GLuint prgId; + struct stb_const_desc bumpenvmatconst[MAX_TEXTURES]; + unsigned char numbumpenvmatconsts; + struct stb_const_desc luminanceconst[MAX_TEXTURES]; + UINT int_consts[MAX_CONST_I]; + char num_int_consts; + UINT ycorrection; +}; + +struct arb_vs_compile_args +{ + struct vs_compile_args super; + DWORD bools; /* WORD is enough, use DWORD for alignment */ +}; + +struct arb_vs_compiled_shader +{ + struct arb_vs_compile_args args; + GLuint prgId; + UINT int_consts[MAX_CONST_I]; + char num_int_consts; }; struct shader_arb_ctx_priv { @@ -102,18 +133,11 @@ struct shader_arb_ctx_priv { const struct arb_vs_compile_args *cur_vs_args; const struct arb_ps_compile_args *cur_ps_args; - struct list if_frames; + const struct arb_ps_compiled_shader *compiled_fprog; + const struct arb_vs_compiled_shader *compiled_vprog; + struct list control_frames; BOOL muted; -}; - -struct arb_ps_compile_args { - struct ps_compile_args super; - DWORD bools; /* WORD is enough, use DWORD for alignment */ -}; - -struct arb_ps_compiled_shader { - struct arb_ps_compile_args args; - GLuint prgId; + unsigned int num_loops, loop_depth; }; struct arb_pshader_private { @@ -121,21 +145,23 @@ struct arb_pshader_private { UINT num_gl_shaders, shader_array_size; }; -struct arb_vs_compile_args { - struct vs_compile_args super; - DWORD bools; /* WORD is enough, use DWORD for alignment */ -}; - -struct arb_vs_compiled_shader { - struct arb_vs_compile_args args; - GLuint prgId; -}; - struct arb_vshader_private { struct arb_vs_compiled_shader *gl_shaders; UINT num_gl_shaders, shader_array_size; }; +struct shader_arb_priv +{ + GLuint current_vprogram_id; + GLuint current_fprogram_id; + const struct arb_ps_compiled_shader *compiled_fprog; + const struct arb_vs_compiled_shader *compiled_vprog; + GLuint depth_blt_vprogram_id; + GLuint depth_blt_fprogram_id[tex_type_count]; + BOOL use_arbfp_fixed_func; + struct wine_rb_tree fragment_shaders; +}; + /******************************************************** * ARB_[vertex/fragment]_program helper functions follow ********************************************************/ @@ -256,29 +282,92 @@ static void shader_arb_load_np2fixup_constants( static inline void shader_arb_ps_local_constants(IWineD3DDeviceImpl* deviceImpl) { IWineD3DStateBlockImpl* stateBlock = deviceImpl->stateBlock; - IWineD3DBaseShaderImpl* pshader = (IWineD3DBaseShaderImpl*) stateBlock->pixelShader; - IWineD3DPixelShaderImpl *psi = (IWineD3DPixelShaderImpl *) pshader; const WineD3D_GL_Info *gl_info = &deviceImpl->adapter->gl_info; unsigned char i; + struct shader_arb_priv *priv = deviceImpl->shader_priv; + const struct arb_ps_compiled_shader *gl_shader = priv->compiled_fprog; - for(i = 0; i < psi->numbumpenvmatconsts; i++) + for(i = 0; i < gl_shader->numbumpenvmatconsts; i++) { + int texunit = gl_shader->bumpenvmatconst[i].texunit; + /* The state manager takes care that this function is always called if the bump env matrix changes */ - const float *data = (const float *)&stateBlock->textureState[(int) psi->bumpenvmatconst[i].texunit][WINED3DTSS_BUMPENVMAT00]; - GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, psi->bumpenvmatconst[i].const_num, data)); + const float *data = (const float *)&stateBlock->textureState[texunit][WINED3DTSS_BUMPENVMAT00]; + GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->bumpenvmatconst[i].const_num, data)); - if (psi->luminanceconst[i].const_num != WINED3D_CONST_NUM_UNUSED) + if (gl_shader->luminanceconst[i].const_num != WINED3D_CONST_NUM_UNUSED) { /* WINED3DTSS_BUMPENVLSCALE and WINED3DTSS_BUMPENVLOFFSET are next to each other. * point gl to the scale, and load 4 floats. x = scale, y = offset, z and w are junk, we * don't care about them. The pointers are valid for sure because the stateblock is bigger. * (they're WINED3DTSS_TEXTURETRANSFORMFLAGS and WINED3DTSS_ADDRESSW, so most likely 0 or NaN */ - const float *scale = (const float *)&stateBlock->textureState[(int) psi->luminanceconst[i].texunit][WINED3DTSS_BUMPENVLSCALE]; - GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, psi->luminanceconst[i].const_num, scale)); + const float *scale = (const float *)&stateBlock->textureState[texunit][WINED3DTSS_BUMPENVLSCALE]; + GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->luminanceconst[i].const_num, scale)); + } + } + + if(gl_shader->num_int_consts == 0) return; + + for(i = 0; i < MAX_CONST_I; i++) + { + if(gl_shader->int_consts[i] != WINED3D_CONST_NUM_UNUSED) + { + float val[4]; + val[0] = stateBlock->pixelShaderConstantI[4 * i]; + val[1] = stateBlock->pixelShaderConstantI[4 * i + 1]; + val[2] = stateBlock->pixelShaderConstantI[4 * i + 2]; + val[3] = -1.0; + + GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->int_consts[i], val)); + } + } + + if(gl_shader->ycorrection != WINED3D_CONST_NUM_UNUSED) + { + /* ycorrection.x: Backbuffer height(onscreen) or 0(offscreen). + * ycorrection.y: -1.0(onscreen), 1.0(offscreen) + * ycorrection.z: 1.0 + * ycorrection.w: 0.0 + */ + float val[4]; + val[0] = deviceImpl->render_offscreen ? 0.0 : ((IWineD3DSurfaceImpl *) deviceImpl->render_targets[0])->currentDesc.Height; + val[1] = deviceImpl->render_offscreen ? 1.0 : -1.0; + val[2] = 1.0; + val[3] = 0.0; + GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, gl_shader->ycorrection, val)); + checkGLcall("y correction loading\n"); + } +} + +static inline void shader_arb_vs_local_constants(IWineD3DDeviceImpl* deviceImpl) +{ + IWineD3DStateBlockImpl* stateBlock; + const WineD3D_GL_Info *gl_info; + unsigned char i; + struct shader_arb_priv *priv = deviceImpl->shader_priv; + const struct arb_vs_compiled_shader *gl_shader = priv->compiled_vprog; + + if(gl_shader->num_int_consts == 0) return; + + gl_info = &deviceImpl->adapter->gl_info; + stateBlock = deviceImpl->stateBlock; + + for(i = 0; i < MAX_CONST_I; i++) + { + if(gl_shader->int_consts[i] != WINED3D_CONST_NUM_UNUSED) + { + float val[4]; + val[0] = stateBlock->vertexShaderConstantI[4 * i]; + val[1] = stateBlock->vertexShaderConstantI[4 * i + 1]; + val[2] = stateBlock->vertexShaderConstantI[4 * i + 2]; + val[3] = -1.0; + + GL_EXTCALL(glProgramLocalParameter4fvARB(GL_VERTEX_PROGRAM_ARB, gl_shader->int_consts[i], val)); } } } + /** * Loads the app-supplied constants into the currently set ARB_[vertex/fragment]_programs. * @@ -307,6 +396,8 @@ static void shader_arb_load_constants( /* Upload the position fixup */ GL_EXTCALL(glProgramEnvParameter4fvARB(GL_VERTEX_PROGRAM_ARB, ARB_SHADER_PRIVCONST_POS, deviceImpl->posFixup)); + + shader_arb_vs_local_constants(deviceImpl); } if (usePixelShader) { @@ -365,11 +456,11 @@ static DWORD *local_const_mapping(IWineD3DBaseShaderImpl *This) } /* Generate the variable & register declarations for the ARB_vertex_program output target */ -static void shader_generate_arb_declarations(IWineD3DBaseShader *iface, const shader_reg_maps *reg_maps, +static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const shader_reg_maps *reg_maps, SHADER_BUFFER *buffer, const WineD3D_GL_Info *gl_info, DWORD *lconst_map) { IWineD3DBaseShaderImpl* This = (IWineD3DBaseShaderImpl*) iface; - DWORD i, cur, next_local = 0; + DWORD i, next_local = 0; char pshader = shader_is_pshader_version(reg_maps->shader_version.type); unsigned max_constantsF; const local_constant *lconst; @@ -390,6 +481,7 @@ static void shader_generate_arb_declarations(IWineD3DBaseShader *iface, const sh if(This->baseShader.reg_maps.usesrelconstF) { max_constantsF = GL_LIMITS(vshader_constantsF) - reserved_vs_const(iface, gl_info); if(GL_SUPPORT(NV_VERTEX_PROGRAM2_OPTION)) max_constantsF -= GL_LIMITS(clipplanes); + max_constantsF -= count_bits(This->baseShader.reg_maps.integer_constants); } else { max_constantsF = GL_LIMITS(vshader_constantsF) - 1; } @@ -444,37 +536,7 @@ static void shader_generate_arb_declarations(IWineD3DBaseShader *iface, const sh } } - for(i = 0; i < (sizeof(reg_maps->bumpmat) / sizeof(reg_maps->bumpmat[0])); i++) { - IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) This; - if(!reg_maps->bumpmat[i]) continue; - - cur = ps->numbumpenvmatconsts; - ps->bumpenvmatconst[cur].const_num = -1; - ps->bumpenvmatconst[cur].texunit = i; - ps->luminanceconst[cur].const_num = -1; - ps->luminanceconst[cur].texunit = i; - - /* We can fit the constants into the constant limit for sure because texbem, texbeml, bem and beml are only supported - * in 1.x shaders, and GL_ARB_fragment_program has a constant limit of 24 constants. So in the worst case we're loading - * 8 shader constants, 8 bump matrices and 8 luminance parameters and are perfectly fine. (No NP2 fixup on bumpmapped - * textures due to conditional NP2 restrictions) - * - * Use local constants to load the bump env parameters, not program.env. This avoids collisions with d3d constants of - * shaders in newer shader models. Since the bump env parameters have to share their space with NP2 fixup constants, - * their location is shader dependent anyway and they cannot be loaded globally. - */ - ps->bumpenvmatconst[cur].const_num = next_local++; - shader_addline(buffer, "PARAM bumpenvmat%d = program.local[%d];\n", - i, ps->bumpenvmatconst[cur].const_num); - ps->numbumpenvmatconsts = cur + 1; - - if(!reg_maps->luminanceparams[i]) continue; - - ((IWineD3DPixelShaderImpl *)This)->luminanceconst[cur].const_num = next_local++; - shader_addline(buffer, "PARAM luminance%d = program.local[%d];\n", - i, ps->luminanceconst[cur].const_num); - } - + return next_local; } static const char * const shift_tab[] = { @@ -684,6 +746,16 @@ static void shader_arb_get_register_name(const struct wined3d_shader_instruction else sprintf(register_name, "result.texcoord[%u]", reg->idx); break; + case WINED3DSPR_LOOP: + /* Pshader has an implicitly declared loop index counter A0.x that cannot be renamed */ + if(pshader) sprintf(register_name, "A0.x"); + else sprintf(register_name, "aL.y"); + break; + + case WINED3DSPR_CONSTINT: + sprintf(register_name, "I%u", reg->idx); + break; + default: FIXME("Unhandled register type %#x[%u]\n", reg->type, reg->idx); sprintf(register_name, "unrecognized_register[%u]", reg->idx); @@ -1972,6 +2044,122 @@ static void shader_hw_sgn(const struct wined3d_shader_instruction *ins) } } +static void shader_hw_dsy(const struct wined3d_shader_instruction *ins) +{ + SHADER_BUFFER *buffer = ins->ctx->buffer; + char src[50]; + char dst[50]; + char dst_name[50]; + BOOL is_color; + + shader_arb_get_dst_param(ins, &ins->dst[0], dst); + shader_arb_get_src_param(ins, &ins->src[0], 0, src); + shader_arb_get_register_name(ins, &ins->dst[0].reg, dst_name, &is_color); + + shader_addline(buffer, "DDY %s, %s;\n", dst, src); + shader_addline(buffer, "MUL%s %s, %s, ycorrection.y;\n", shader_arb_get_modifier(ins), dst, dst_name); +} + +static void shader_hw_loop(const struct wined3d_shader_instruction *ins) +{ + SHADER_BUFFER *buffer = ins->ctx->buffer; + char src_name[50]; + BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type); + + /* src0 is aL */ + shader_arb_get_src_param(ins, &ins->src[1], 0, src_name); + + if(vshader) + { + struct shader_arb_ctx_priv *priv = ins->ctx->backend_data; + struct list *e = list_head(&priv->control_frames); + struct control_frame *control_frame = LIST_ENTRY(e, struct control_frame, entry); + + if(priv->loop_depth > 1) shader_addline(buffer, "PUSHA aL;\n"); + /* The constant loader makes sure to load -1 into iX.w */ + shader_addline(buffer, "ARLC aL, %s.xywz;\n", src_name); + shader_addline(buffer, "BRA loop_%u_end (LE.x);\n", control_frame->loop_no); + shader_addline(buffer, "loop_%u_start:\n", control_frame->loop_no); + } + else + { + shader_addline(buffer, "LOOP %s;\n", src_name); + } +} + +static void shader_hw_rep(const struct wined3d_shader_instruction *ins) +{ + SHADER_BUFFER *buffer = ins->ctx->buffer; + char src_name[50]; + BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type); + + shader_arb_get_src_param(ins, &ins->src[0], 0, src_name); + + /* The constant loader makes sure to load -1 into iX.w */ + if(vshader) + { + struct shader_arb_ctx_priv *priv = ins->ctx->backend_data; + struct list *e = list_head(&priv->control_frames); + struct control_frame *control_frame = LIST_ENTRY(e, struct control_frame, entry); + + if(priv->loop_depth > 1) shader_addline(buffer, "PUSHA aL;\n"); + + shader_addline(buffer, "ARLC aL, %s.xywz;\n", src_name); + shader_addline(buffer, "BRA loop_%u_end (LE.x);\n", control_frame->loop_no); + shader_addline(buffer, "loop_%u_start:\n", control_frame->loop_no); + } + else + { + shader_addline(buffer, "REP %s;\n", src_name); + } +} + +static void shader_hw_endloop(const struct wined3d_shader_instruction *ins) +{ + SHADER_BUFFER *buffer = ins->ctx->buffer; + BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type); + + if(vshader) + { + struct shader_arb_ctx_priv *priv = ins->ctx->backend_data; + struct list *e = list_head(&priv->control_frames); + struct control_frame *control_frame = LIST_ENTRY(e, struct control_frame, entry); + + shader_addline(buffer, "ARAC aL.xy, aL;\n"); + shader_addline(buffer, "BRA loop_%u_start (GT.x);\n", control_frame->loop_no); + shader_addline(buffer, "loop_%u_end:\n", control_frame->loop_no); + + if(priv->loop_depth > 1) shader_addline(buffer, "POPA aL;\n"); + } + else + { + shader_addline(buffer, "ENDLOOP;\n"); + } +} + +static void shader_hw_endrep(const struct wined3d_shader_instruction *ins) +{ + SHADER_BUFFER *buffer = ins->ctx->buffer; + BOOL vshader = shader_is_vshader_version(ins->ctx->reg_maps->shader_version.type); + + if(vshader) + { + struct shader_arb_ctx_priv *priv = ins->ctx->backend_data; + struct list *e = list_head(&priv->control_frames); + struct control_frame *control_frame = LIST_ENTRY(e, struct control_frame, entry); + + shader_addline(buffer, "ARAC aL.xy, aL;\n"); + shader_addline(buffer, "BRA loop_%u_start (GT.x);\n", control_frame->loop_no); + shader_addline(buffer, "loop_%u_end:\n", control_frame->loop_no); + + if(priv->loop_depth > 1) shader_addline(buffer, "POPA aL;\n"); + } + else + { + shader_addline(buffer, "ENDREP;\n"); + } +} + static GLuint create_arb_blt_vertex_program(const WineD3D_GL_Info *gl_info) { GLuint program_id = 0; @@ -2091,9 +2279,23 @@ static void arbfp_add_sRGB_correction(SHADER_BUFFER *buffer, const char *fragcol /* [0.0;1.0] clamping. Not needed, this is done implicitly */ } +static const DWORD *find_loop_control_values(IWineD3DBaseShaderImpl *This, DWORD idx) +{ + const local_constant *constant; + + LIST_FOR_EACH_ENTRY(constant, &This->baseShader.constantsI, local_constant, entry) + { + if (constant->idx == idx) + { + return constant->value; + } + } + return NULL; +} + /* GL locking is done by the caller */ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, - SHADER_BUFFER *buffer, const struct arb_ps_compile_args *args) + SHADER_BUFFER *buffer, const struct arb_ps_compile_args *args, struct arb_ps_compiled_shader *compiled) { const shader_reg_maps* reg_maps = &This->baseShader.reg_maps; CONST DWORD *function = This->baseShader.function; @@ -2101,7 +2303,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, const local_constant *lconst; GLuint retval; char fragcolor[16]; - DWORD *lconst_map = local_const_mapping((IWineD3DBaseShaderImpl *) This); + DWORD *lconst_map = local_const_mapping((IWineD3DBaseShaderImpl *) This), next_local, cur; struct shader_arb_ctx_priv priv_ctx; BOOL dcl_tmp = args->super.srgb_correction, dcl_td = FALSE; BOOL want_nv_prog = FALSE; @@ -2148,7 +2350,8 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, /* Create the hw ARB shader */ memset(&priv_ctx, 0, sizeof(priv_ctx)); priv_ctx.cur_ps_args = args; - list_init(&priv_ctx.if_frames); + priv_ctx.compiled_fprog = compiled; + list_init(&priv_ctx.control_frames); /* Avoid enabling NV_fragment_program* if we do not need it. * @@ -2238,7 +2441,68 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, } /* Base Declarations */ - shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION, lconst_map); + next_local = shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION, lconst_map); + + for(i = 0; i < (sizeof(reg_maps->bumpmat) / sizeof(reg_maps->bumpmat[0])); i++) { + if(!reg_maps->bumpmat[i]) continue; + + cur = compiled->numbumpenvmatconsts; + compiled->bumpenvmatconst[cur].const_num = WINED3D_CONST_NUM_UNUSED; + compiled->bumpenvmatconst[cur].texunit = i; + compiled->luminanceconst[cur].const_num = WINED3D_CONST_NUM_UNUSED; + compiled->luminanceconst[cur].texunit = i; + + /* We can fit the constants into the constant limit for sure because texbem, texbeml, bem and beml are only supported + * in 1.x shaders, and GL_ARB_fragment_program has a constant limit of 24 constants. So in the worst case we're loading + * 8 shader constants, 8 bump matrices and 8 luminance parameters and are perfectly fine. (No NP2 fixup on bumpmapped + * textures due to conditional NP2 restrictions) + * + * Use local constants to load the bump env parameters, not program.env. This avoids collisions with d3d constants of + * shaders in newer shader models. Since the bump env parameters have to share their space with NP2 fixup constants, + * their location is shader dependent anyway and they cannot be loaded globally. + */ + compiled->bumpenvmatconst[cur].const_num = next_local++; + shader_addline(buffer, "PARAM bumpenvmat%d = program.local[%d];\n", + i, compiled->bumpenvmatconst[cur].const_num); + compiled->numbumpenvmatconsts = cur + 1; + + if(!reg_maps->luminanceparams[i]) continue; + + compiled->luminanceconst[cur].const_num = next_local++; + shader_addline(buffer, "PARAM luminance%d = program.local[%d];\n", + i, compiled->luminanceconst[cur].const_num); + } + + for(i = 0; i < MAX_CONST_I; i++) + { + compiled->int_consts[i] = WINED3D_CONST_NUM_UNUSED; + if (reg_maps->integer_constants & (1 << i) && priv_ctx.target_version >= NV2) + { + const DWORD *control_values = find_loop_control_values((IWineD3DBaseShaderImpl *) This, i); + + if(control_values) + { + shader_addline(buffer, "PARAM I%u = {%u, %u, %u, -1};\n", i, + control_values[0], control_values[1], control_values[2]); + } + else + { + compiled->int_consts[i] = next_local; + compiled->num_int_consts++; + shader_addline(buffer, "PARAM I%u = program.local[%u];\n", i, next_local++); + } + } + } + + if(reg_maps->vpos || reg_maps->usesdsy) + { + compiled->ycorrection = next_local; + shader_addline(buffer, "PARAM ycorrection = program.local[%u];\n", next_local++); + } + else + { + compiled->ycorrection = WINED3D_CONST_NUM_UNUSED; + } /* Base Shader Body */ shader_generate_main((IWineD3DBaseShader *)This, buffer, reg_maps, function, &priv_ctx); @@ -2285,7 +2549,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, /* GL locking is done by the caller */ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, - SHADER_BUFFER *buffer, const struct arb_vs_compile_args *args) + SHADER_BUFFER *buffer, const struct arb_vs_compile_args *args, struct arb_vs_compiled_shader *compiled) { const shader_reg_maps *reg_maps = &This->baseShader.reg_maps; CONST DWORD *function = This->baseShader.function; @@ -2293,13 +2557,13 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, const WineD3D_GL_Info *gl_info = &device->adapter->gl_info; const local_constant *lconst; GLuint ret; - DWORD *lconst_map = local_const_mapping((IWineD3DBaseShaderImpl *) This); + DWORD *lconst_map = local_const_mapping((IWineD3DBaseShaderImpl *) This), next_local; struct shader_arb_ctx_priv priv_ctx; unsigned int i; memset(&priv_ctx, 0, sizeof(priv_ctx)); priv_ctx.cur_vs_args = args; - list_init(&priv_ctx.if_frames); + list_init(&priv_ctx.control_frames); /* Create the hw ARB shader */ shader_addline(buffer, "!!ARBvp1.0\n"); @@ -2310,6 +2574,7 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, if(GL_SUPPORT(NV_VERTEX_PROGRAM2_OPTION)) { shader_addline(buffer, "OPTION NV_vertex_program2;\n"); priv_ctx.target_version = NV2; + shader_addline(buffer, "ADDRESS aL;\n"); } else { priv_ctx.target_version = ARB; } @@ -2326,7 +2591,28 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, shader_addline(buffer, "TEMP TA;\n"); /* Base Declarations */ - shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION, lconst_map); + next_local = shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION, lconst_map); + + for(i = 0; i < MAX_CONST_I; i++) + { + compiled->int_consts[i] = WINED3D_CONST_NUM_UNUSED; + if(reg_maps->integer_constants & (1 << i) && priv_ctx.target_version >= NV2) + { + const DWORD *control_values = find_loop_control_values((IWineD3DBaseShaderImpl *) This, i); + + if(control_values) + { + shader_addline(buffer, "PARAM I%u = {%u, %u, %u, -1};\n", i, + control_values[0], control_values[1], control_values[2]); + } + else + { + compiled->int_consts[i] = next_local; + compiled->num_int_consts++; + shader_addline(buffer, "PARAM I%u = program.local[%u];\n", i, next_local++); + } + } + } /* We need a constant to fixup the final position */ shader_addline(buffer, "PARAM posFixup = program.env[%d];\n", ARB_SHADER_PRIVCONST_POS); @@ -2436,7 +2722,7 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, } /* GL locking is done by the caller */ -static GLuint find_arb_pshader(IWineD3DPixelShaderImpl *shader, const struct arb_ps_compile_args *args) +static struct arb_ps_compiled_shader *find_arb_pshader(IWineD3DPixelShaderImpl *shader, const struct arb_ps_compile_args *args) { UINT i; DWORD new_size; @@ -2456,7 +2742,7 @@ static GLuint find_arb_pshader(IWineD3DPixelShaderImpl *shader, const struct arb */ for(i = 0; i < shader_data->num_gl_shaders; i++) { if(memcmp(&shader_data->gl_shaders[i].args, args, sizeof(*args)) == 0) { - return shader_data->gl_shaders[i].prgId; + return &shader_data->gl_shaders[i]; } } @@ -2465,10 +2751,10 @@ static GLuint find_arb_pshader(IWineD3DPixelShaderImpl *shader, const struct arb if (shader_data->num_gl_shaders) { new_size = shader_data->shader_array_size + max(1, shader_data->shader_array_size / 2); - new_array = HeapReAlloc(GetProcessHeap(), 0, shader_data->gl_shaders, + new_array = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, shader_data->gl_shaders, new_size * sizeof(*shader_data->gl_shaders)); } else { - new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*shader_data->gl_shaders)); + new_array = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data->gl_shaders)); new_size = 1; } @@ -2486,11 +2772,12 @@ static GLuint find_arb_pshader(IWineD3DPixelShaderImpl *shader, const struct arb ((IWineD3DDeviceImpl *)shader->baseShader.device)->stateBlock->textures); shader_buffer_init(&buffer); - ret = shader_arb_generate_pshader(shader, &buffer, args); + ret = shader_arb_generate_pshader(shader, &buffer, args, + &shader_data->gl_shaders[shader_data->num_gl_shaders]); shader_buffer_free(&buffer); - shader_data->gl_shaders[shader_data->num_gl_shaders++].prgId = ret; + shader_data->gl_shaders[shader_data->num_gl_shaders].prgId = ret; - return ret; + return &shader_data->gl_shaders[shader_data->num_gl_shaders++]; } static inline BOOL vs_args_equal(const struct arb_vs_compile_args *stored, const struct arb_vs_compile_args *new, @@ -2500,7 +2787,7 @@ static inline BOOL vs_args_equal(const struct arb_vs_compile_args *stored, const return stored->bools == new->bools; } -static GLuint find_arb_vshader(IWineD3DVertexShaderImpl *shader, const struct arb_vs_compile_args *args) +static struct arb_vs_compiled_shader *find_arb_vshader(IWineD3DVertexShaderImpl *shader, const struct arb_vs_compile_args *args) { UINT i; DWORD new_size; @@ -2521,7 +2808,7 @@ static GLuint find_arb_vshader(IWineD3DVertexShaderImpl *shader, const struct ar */ for(i = 0; i < shader_data->num_gl_shaders; i++) { if(vs_args_equal(&shader_data->gl_shaders[i].args, args, use_map)) { - return shader_data->gl_shaders[i].prgId; + return &shader_data->gl_shaders[i]; } } @@ -2531,10 +2818,10 @@ static GLuint find_arb_vshader(IWineD3DVertexShaderImpl *shader, const struct ar if (shader_data->num_gl_shaders) { new_size = shader_data->shader_array_size + max(1, shader_data->shader_array_size / 2); - new_array = HeapReAlloc(GetProcessHeap(), 0, shader_data->gl_shaders, + new_array = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, shader_data->gl_shaders, new_size * sizeof(*shader_data->gl_shaders)); } else { - new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*shader_data->gl_shaders)); + new_array = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data->gl_shaders)); new_size = 1; } @@ -2549,11 +2836,12 @@ static GLuint find_arb_vshader(IWineD3DVertexShaderImpl *shader, const struct ar shader_data->gl_shaders[shader_data->num_gl_shaders].args = *args; shader_buffer_init(&buffer); - ret = shader_arb_generate_vshader(shader, &buffer, args); + ret = shader_arb_generate_vshader(shader, &buffer, args, + &shader_data->gl_shaders[shader_data->num_gl_shaders]); shader_buffer_free(&buffer); - shader_data->gl_shaders[shader_data->num_gl_shaders++].prgId = ret; + shader_data->gl_shaders[shader_data->num_gl_shaders].prgId = ret; - return ret; + return &shader_data->gl_shaders[shader_data->num_gl_shaders++]; } static inline void find_arb_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWineD3DStateBlockImpl *stateblock, @@ -2569,7 +2857,6 @@ static inline void find_arb_ps_compile_args(IWineD3DPixelShaderImpl *shader, IWi { if(stateblock->pixelShaderConstantB[i]) args->bools |= ( 1 << i); } - } static inline void find_arb_vs_compile_args(IWineD3DVertexShaderImpl *shader, IWineD3DStateBlockImpl *stateblock, @@ -2597,10 +2884,13 @@ static void shader_arb_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) { if (useVS) { struct arb_vs_compile_args compile_args; + struct arb_vs_compiled_shader *compiled; TRACE("Using vertex shader\n"); find_arb_vs_compile_args((IWineD3DVertexShaderImpl *) This->stateBlock->vertexShader, This->stateBlock, &compile_args); - priv->current_vprogram_id = find_arb_vshader((IWineD3DVertexShaderImpl *) This->stateBlock->vertexShader, &compile_args); + compiled = find_arb_vshader((IWineD3DVertexShaderImpl *) This->stateBlock->vertexShader, &compile_args); + priv->current_vprogram_id = compiled->prgId; + priv->compiled_vprog = compiled; /* Bind the vertex program */ GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->current_vprogram_id)); @@ -2610,6 +2900,7 @@ static void shader_arb_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) { glEnable(GL_VERTEX_PROGRAM_ARB); checkGLcall("glEnable(GL_VERTEX_PROGRAM_ARB);"); TRACE("(%p) : Bound vertex program %u and enabled GL_VERTEX_PROGRAM_ARB\n", This, priv->current_vprogram_id); + shader_arb_vs_local_constants(This); } else if(GL_SUPPORT(ARB_VERTEX_PROGRAM)) { priv->current_vprogram_id = 0; glDisable(GL_VERTEX_PROGRAM_ARB); @@ -2618,10 +2909,13 @@ static void shader_arb_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) { if (usePS) { struct arb_ps_compile_args compile_args; + struct arb_ps_compiled_shader *compiled; TRACE("Using pixel shader\n"); find_arb_ps_compile_args((IWineD3DPixelShaderImpl *) This->stateBlock->pixelShader, This->stateBlock, &compile_args); - priv->current_fprogram_id = find_arb_pshader((IWineD3DPixelShaderImpl *) This->stateBlock->pixelShader, - &compile_args); + compiled = find_arb_pshader((IWineD3DPixelShaderImpl *) This->stateBlock->pixelShader, + &compile_args); + priv->current_fprogram_id = compiled->prgId; + priv->compiled_fprog = compiled; /* Bind the fragment program */ GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, priv->current_fprogram_id)); @@ -2854,11 +3148,11 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL /* WINED3DSIH_DP4 */ shader_hw_map2gl, /* WINED3DSIH_DST */ shader_hw_map2gl, /* WINED3DSIH_DSX */ shader_hw_map2gl, - /* WINED3DSIH_DSY */ NULL, + /* WINED3DSIH_DSY */ shader_hw_dsy, /* WINED3DSIH_ELSE */ NULL, /* WINED3DSIH_ENDIF */ NULL, - /* WINED3DSIH_ENDLOOP */ NULL, - /* WINED3DSIH_ENDREP */ NULL, + /* WINED3DSIH_ENDLOOP */ shader_hw_endloop, + /* WINED3DSIH_ENDREP */ shader_hw_endrep, /* WINED3DSIH_EXP */ shader_hw_map2gl, /* WINED3DSIH_EXPP */ shader_hw_map2gl, /* WINED3DSIH_FRC */ shader_hw_map2gl, @@ -2868,7 +3162,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL /* WINED3DSIH_LIT */ shader_hw_map2gl, /* WINED3DSIH_LOG */ shader_hw_map2gl, /* WINED3DSIH_LOGP */ shader_hw_map2gl, - /* WINED3DSIH_LOOP */ NULL, + /* WINED3DSIH_LOOP */ shader_hw_loop, /* WINED3DSIH_LRP */ shader_hw_lrp, /* WINED3DSIH_M3x2 */ shader_hw_mnxn, /* WINED3DSIH_M3x3 */ shader_hw_mnxn, @@ -2886,7 +3180,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL /* WINED3DSIH_PHASE */ NULL, /* WINED3DSIH_POW */ shader_hw_map2gl, /* WINED3DSIH_RCP */ shader_hw_rsq_rcp, - /* WINED3DSIH_REP */ NULL, + /* WINED3DSIH_REP */ shader_hw_rep, /* WINED3DSIH_RET */ NULL, /* WINED3DSIH_RSQ */ shader_hw_rsq_rcp, /* WINED3DSIH_SETP */ NULL, @@ -2952,20 +3246,20 @@ static void shader_arb_handle_instruction(const struct wined3d_shader_instructio SHADER_HANDLER hw_fct; struct shader_arb_ctx_priv *priv = ins->ctx->backend_data; IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *)ins->ctx->shader; - struct if_frame *if_frame; + struct control_frame *control_frame; SHADER_BUFFER *buffer = ins->ctx->buffer; /* boolean if */ if(ins->handler_idx == WINED3DSIH_IF) { - if_frame = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*if_frame)); - list_add_head(&priv->if_frames, &if_frame->entry); + control_frame = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*control_frame)); + list_add_head(&priv->control_frames, &control_frame->entry); if(!priv->muted && get_bool_const(ins, This, ins->src[0].reg.idx) == FALSE) { shader_addline(buffer, "#if(FALSE){\n"); priv->muted = TRUE; - if_frame->muting = TRUE; + control_frame->muting = TRUE; } else shader_addline(buffer, "#if(TRUE) {\n"); @@ -2974,48 +3268,56 @@ static void shader_arb_handle_instruction(const struct wined3d_shader_instructio else if(ins->handler_idx == WINED3DSIH_IFC) { /* IF(bool) and if_cond(a, b) use the same ELSE and ENDIF tokens */ - if_frame = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*if_frame)); - if_frame->ifc = TRUE; - list_add_head(&priv->if_frames, &if_frame->entry); + control_frame = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*control_frame)); + control_frame->ifc = TRUE; + list_add_head(&priv->control_frames, &control_frame->entry); } else if(ins->handler_idx == WINED3DSIH_ELSE) { - struct list *e = list_head(&priv->if_frames); - if_frame = LIST_ENTRY(e, struct if_frame, entry); + struct list *e = list_head(&priv->control_frames); + control_frame = LIST_ENTRY(e, struct control_frame, entry); - if(if_frame->ifc == FALSE) + if(control_frame->ifc == FALSE) { shader_addline(buffer, "#} else {\n"); - if(!priv->muted && !if_frame->muting) + if(!priv->muted && !control_frame->muting) { priv->muted = TRUE; - if_frame->muting = TRUE; + control_frame->muting = TRUE; } - else if(if_frame->muting) priv->muted = FALSE; + else if(control_frame->muting) priv->muted = FALSE; return; /* Instruction is handled. */ } /* In case of an ifc, generate a HW shader instruction */ } else if(ins->handler_idx == WINED3DSIH_ENDIF) { - struct list *e = list_head(&priv->if_frames); - if_frame = LIST_ENTRY(e, struct if_frame, entry); + struct list *e = list_head(&priv->control_frames); + control_frame = LIST_ENTRY(e, struct control_frame, entry); - if(!if_frame->ifc) + if(!control_frame->ifc) { shader_addline(buffer, "#} endif\n"); - if(if_frame->muting) priv->muted = FALSE; - list_remove(&if_frame->entry); - HeapFree(GetProcessHeap(), 0, if_frame); + if(control_frame->muting) priv->muted = FALSE; + list_remove(&control_frame->entry); + HeapFree(GetProcessHeap(), 0, control_frame); return; /* Instruction is handled */ } else { - list_remove(&if_frame->entry); - HeapFree(GetProcessHeap(), 0, if_frame); + list_remove(&control_frame->entry); + HeapFree(GetProcessHeap(), 0, control_frame); /* ifc - generate a hw endif */ } } + else if(ins->handler_idx == WINED3DSIH_LOOP || ins->handler_idx == WINED3DSIH_REP) + { + control_frame = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*control_frame)); + list_add_head(&priv->control_frames, &control_frame->entry); + + control_frame->loop_no = priv->num_loops++; + priv->loop_depth++; + } if(priv->muted) return; @@ -3030,6 +3332,15 @@ static void shader_arb_handle_instruction(const struct wined3d_shader_instructio } hw_fct(ins); + if(ins->handler_idx == WINED3DSIH_ENDLOOP || ins->handler_idx == WINED3DSIH_ENDREP) + { + struct list *e = list_head(&priv->control_frames); + control_frame = LIST_ENTRY(e, struct control_frame, entry); + list_remove(&control_frame->entry); + HeapFree(GetProcessHeap(), 0, control_frame); + priv->loop_depth--; + } + shader_arb_add_instruction_modifiers(ins); } diff --git a/dlls/wined3d/ati_fragment_shader.c b/dlls/wined3d/ati_fragment_shader.c index 1baf9badd35..1f6f2037614 100644 --- a/dlls/wined3d/ati_fragment_shader.c +++ b/dlls/wined3d/ati_fragment_shader.c @@ -423,13 +423,6 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con GL_EXTCALL(glPassTexCoordATI(GL_REG_0_ATI + stage + 1, GL_TEXTURE0_ARB + stage + 1, swizzle)); - - /* We need GL_REG_5_ATI as a temporary register to swizzle the bump matrix. So we run into - * issues if we're bump mapping on stage 4 or 5 - */ - if(stage >= 4) { - FIXME("Bump mapping in stage %d\n", stage); - } } /* Pass 2: Generate perturbation calculations */ @@ -460,22 +453,24 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con ATI_FFP_CONST_BUMPMAT(stage), GL_NONE, GL_2X_BIT_ATI | GL_BIAS_BIT_ATI, GL_REG_0_ATI + stage + 1, GL_RED, GL_NONE); - /* FIXME: How can I make GL_DOT2_ADD_ATI read the factors from blue and alpha? It defaults to red and green, - * and it is fairly easy to make it read GL_BLUE or BL_ALPHA, but I can't get an R * B + G * A. So we're wasting - * one register and two instructions in this pass for a simple swizzling operation. - * For starters it might be good enough to merge the two movs into one, but even that isn't possible :-( + /* Don't use GL_DOT2_ADD_ATI here because we cannot configure it to read the blue and alpha + * component of the bump matrix. Instead do this with two MADs: + * + * coord.a = tex.r * bump.b + coord.g + * coord.g = tex.g * bump.a + coord.a * - * NOTE: GL_BLUE | GL_ALPHA is not possible. It doesn't throw a compilation error, but an OR operation on the - * constants doesn't make sense, considering their values. + * The first instruction writes to alpha so it can be coissued with the above DOT2_ADD. + * coord.a is unused. If the perturbed texture is projected, this was already handled + * in the glPassTexCoordATI above. */ - wrap_op1(gl_info, GL_MOV_ATI, GL_REG_5_ATI, GL_RED_BIT_ATI, GL_NONE, - ATI_FFP_CONST_BUMPMAT(stage), GL_BLUE, GL_NONE); - wrap_op1(gl_info, GL_MOV_ATI, GL_REG_5_ATI, GL_GREEN_BIT_ATI, GL_NONE, - ATI_FFP_CONST_BUMPMAT(stage), GL_ALPHA, GL_NONE); - wrap_op3(gl_info, GL_DOT2_ADD_ATI, GL_REG_0_ATI + stage + 1, GL_GREEN_BIT_ATI, GL_NONE, - GL_REG_0_ATI + stage, GL_NONE, argmodextra_y, - GL_REG_5_ATI, GL_NONE, GL_2X_BIT_ATI | GL_BIAS_BIT_ATI, + wrap_op3(gl_info, GL_MAD_ATI, GL_REG_0_ATI + stage + 1, GL_ALPHA, GL_NONE, + GL_REG_0_ATI + stage, GL_RED, argmodextra_y, + ATI_FFP_CONST_BUMPMAT(stage), GL_BLUE, GL_NONE, GL_REG_0_ATI + stage + 1, GL_GREEN, GL_NONE); + wrap_op3(gl_info, GL_MAD_ATI, GL_REG_0_ATI + stage + 1, GL_GREEN_BIT_ATI, GL_NONE, + GL_REG_0_ATI + stage, GL_GREEN, argmodextra_y, + ATI_FFP_CONST_BUMPMAT(stage), GL_ALPHA, GL_NONE, + GL_REG_0_ATI + stage + 1, GL_ALPHA, GL_NONE); } /* Pass 3: Generate sampling instructions for regular textures */ diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c index 666de8eadc1..e9f3ff6cc03 100644 --- a/dlls/wined3d/buffer.c +++ b/dlls/wined3d/buffer.c @@ -985,6 +985,16 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface) TRACE("(%p)\n", This); + /* In the case that the number of Unmap calls > the + * number of Map calls, d3d returns always D3D_OK. + * This is also needed to prevent Map from returning garbage on + * the next call (this will happen if the lock_count is < 0). */ + if(This->lock_count == 0) + { + TRACE("Unmap called without a previous Map call!\n"); + return WINED3D_OK; + } + if (InterlockedDecrement(&This->lock_count)) { /* Delay loading the buffer until everything is unlocked */ diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index ba1e100bb5b..81bddb18c22 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -66,6 +66,9 @@ static void context_clean_fbo_attachments(IWineD3DDeviceImpl *This) } GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0)); checkGLcall("glFramebufferTexture2D()"); + + GL_EXTCALL(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0)); + checkGLcall("glFramebufferTexture2D()"); } /* GL locking is done by the caller */ @@ -146,7 +149,6 @@ static void context_apply_attachment_filter_states(IWineD3DDevice *iface, IWineD checkGLcall("apply_attachment_filter_states()"); } -/* TODO: Handle stencil attachments */ /* GL locking is done by the caller */ void context_attach_depth_stencil_fbo(IWineD3DDeviceImpl *This, GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer) { @@ -156,20 +158,64 @@ void context_attach_depth_stencil_fbo(IWineD3DDeviceImpl *This, GLenum fbo_targe if (depth_stencil) { + DWORD format_flags = depth_stencil_impl->resource.format_desc->Flags; + if (use_render_buffer && depth_stencil_impl->current_renderbuffer) { - GL_EXTCALL(glFramebufferRenderbufferEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth_stencil_impl->current_renderbuffer->id)); - checkGLcall("glFramebufferRenderbufferEXT()"); - } else { + if (format_flags & WINED3DFMT_FLAG_DEPTH) + { + GL_EXTCALL(glFramebufferRenderbufferEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, depth_stencil_impl->current_renderbuffer->id)); + checkGLcall("glFramebufferRenderbufferEXT()"); + } + + if (format_flags & WINED3DFMT_FLAG_STENCIL) + { + GL_EXTCALL(glFramebufferRenderbufferEXT(fbo_target, GL_STENCIL_ATTACHMENT_EXT, + GL_RENDERBUFFER_EXT, depth_stencil_impl->current_renderbuffer->id)); + checkGLcall("glFramebufferRenderbufferEXT()"); + } + } + else + { context_apply_attachment_filter_states((IWineD3DDevice *)This, depth_stencil, TRUE); - GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, depth_stencil_impl->glDescription.target, - depth_stencil_impl->glDescription.textureName, depth_stencil_impl->glDescription.level)); + if (format_flags & WINED3DFMT_FLAG_DEPTH) + { + GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, + depth_stencil_impl->glDescription.target, depth_stencil_impl->glDescription.textureName, + depth_stencil_impl->glDescription.level)); + checkGLcall("glFramebufferTexture2DEXT()"); + } + + if (format_flags & WINED3DFMT_FLAG_STENCIL) + { + GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_STENCIL_ATTACHMENT_EXT, + depth_stencil_impl->glDescription.target, depth_stencil_impl->glDescription.textureName, + depth_stencil_impl->glDescription.level)); + checkGLcall("glFramebufferTexture2DEXT()"); + } + } + + if (!(format_flags & WINED3DFMT_FLAG_DEPTH)) + { + GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0)); checkGLcall("glFramebufferTexture2DEXT()"); } - } else { + + if (!(format_flags & WINED3DFMT_FLAG_STENCIL)) + { + GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0)); + checkGLcall("glFramebufferTexture2DEXT()"); + } + } + else + { GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0)); checkGLcall("glFramebufferTexture2DEXT()"); + + GL_EXTCALL(glFramebufferTexture2DEXT(fbo_target, GL_STENCIL_ATTACHMENT_EXT, GL_TEXTURE_2D, 0, 0)); + checkGLcall("glFramebufferTexture2DEXT()"); } } @@ -1660,8 +1706,7 @@ void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextU ENTER_GL(); context_bind_fbo((IWineD3DDevice *)This, GL_FRAMEBUFFER_EXT, &context->dst_fbo); context_attach_surface_fbo(This, GL_FRAMEBUFFER_EXT, 0, target); - GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0)); - checkGLcall("glFramebufferRenderbufferEXT"); + context_attach_depth_stencil_fbo(This, GL_FRAMEBUFFER_EXT, NULL, FALSE); LEAVE_GL(); } else { ENTER_GL(); diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index f1dd9389956..df55962e888 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -889,16 +889,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateStateBlock(IWineD3DDevice* iface, return WINED3D_OK; } -static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, - UINT Width, UINT Height, WINED3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, - IWineD3DSurface **ppSurface, WINED3DRESOURCETYPE Type, DWORD Usage, WINED3DPOOL Pool, - WINED3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, WINED3DSURFTYPE Impl, IUnknown *parent) +static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, UINT Width, UINT Height, + WINED3DFORMAT Format, BOOL Lockable, BOOL Discard, UINT Level, IWineD3DSurface **ppSurface, + DWORD Usage, WINED3DPOOL Pool, WINED3DMULTISAMPLE_TYPE MultiSample, DWORD MultisampleQuality, + WINED3DSURFTYPE Impl, IUnknown *parent) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; IWineD3DSurfaceImpl *object; /*NOTE: impl ref allowed since this is a create function */ unsigned int Size = 1; const struct GlPixelFormatDesc *glDesc = getFormatDescEntry(Format, &GLINFO_LOCATION); - UINT mul_4w, mul_4h; HRESULT hr; TRACE("(%p) Create surface\n",This); @@ -912,24 +911,18 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, * by the device. *******************************/ - /** DXTn mipmaps use the same number of 'levels' down to eg. 8x1, but since - * it is based around 4x4 pixel blocks it requires padding, so allocate enough - * space! - *********************************/ - mul_4w = (Width + 3) & ~3; - mul_4h = (Height + 3) & ~3; if (WINED3DFMT_UNKNOWN == Format) { Size = 0; - } else if (Format == WINED3DFMT_DXT1) { - /* DXT1 is half byte per pixel */ - Size = (mul_4w * glDesc->byte_count * mul_4h) >> 1; - - } else if (Format == WINED3DFMT_DXT2 || Format == WINED3DFMT_DXT3 || - Format == WINED3DFMT_DXT4 || Format == WINED3DFMT_DXT5 || - Format == WINED3DFMT_ATI2N) { - Size = (mul_4w * glDesc->byte_count * mul_4h); - } else { - /* The pitch is a multiple of 4 bytes */ + } + else if (glDesc->Flags & WINED3DFMT_FLAG_COMPRESSED) + { + UINT row_block_count = (Width + glDesc->block_width - 1) / glDesc->block_width; + UINT row_count = (Height + glDesc->block_height - 1) / glDesc->block_height; + Size = row_count * row_block_count * glDesc->block_byte_count; + } + else + { + /* The pitch is a multiple of 4 bytes */ Size = ((Width * glDesc->byte_count) + This->surface_alignment - 1) & ~(This->surface_alignment - 1); Size *= Height; } @@ -1022,7 +1015,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, break; case WINED3DPOOL_DEFAULT: /*TODO: Create offscreen plain can cause this check to fail..., find out if it should */ if(!(Usage & WINED3DUSAGE_DYNAMIC) && !(Usage & WINED3DUSAGE_RENDERTARGET) - && !(Usage && WINED3DUSAGE_DEPTHSTENCIL ) && Lockable) + && !(Usage & WINED3DUSAGE_DEPTHSTENCIL ) && Lockable) WARN("Creating a surface with a POOL of DEFAULT with Lockable true, that doesn't specify DYNAMIC usage.\n"); break; default: @@ -2116,9 +2109,8 @@ static void IWineD3DDeviceImpl_LoadLogo(IWineD3DDeviceImpl *This, const char *fi bm.bmHeight = 32; } - hr = IWineD3DDevice_CreateSurface((IWineD3DDevice *) This, bm.bmWidth, bm.bmHeight, WINED3DFMT_R5G6B5, - TRUE, FALSE, 0, &This->logo_surface, WINED3DRTYPE_SURFACE, 0, - WINED3DPOOL_DEFAULT, WINED3DMULTISAMPLE_NONE, 0, SURFACE_OPENGL, NULL); + hr = IWineD3DDevice_CreateSurface((IWineD3DDevice *) This, bm.bmWidth, bm.bmHeight, WINED3DFMT_R5G6B5, TRUE, + FALSE, 0, &This->logo_surface, 0, WINED3DPOOL_DEFAULT, WINED3DMULTISAMPLE_NONE, 0, SURFACE_OPENGL, NULL); if(FAILED(hr)) { ERR("Wine logo requested, but failed to create surface\n"); goto out; @@ -5982,27 +5974,25 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface, } else { /* Full width, so just write out the whole texture */ const unsigned char* data = ((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)) + offset; - if (WINED3DFMT_DXT1 == destFormat || - WINED3DFMT_DXT2 == destFormat || - WINED3DFMT_DXT3 == destFormat || - WINED3DFMT_DXT4 == destFormat || - WINED3DFMT_DXT5 == destFormat) { - if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) { - if (destSurfaceHeight != srcHeight || destSurfaceWidth != srcWidth) { - /* FIXME: The easy way to do this is to lock the destination, and copy the bits across */ - FIXME("Updating part of a compressed texture is not supported at the moment\n"); - } if (destFormat != srcFormat) { - FIXME("Updating mixed format compressed texture is not curretly support\n"); - } else { - GL_EXTCALL(glCompressedTexImage2DARB(glDescription->target, glDescription->level, - dst_format_desc->glInternal, srcWidth, srcHeight, 0, destSize, data)); - } - } else { - FIXME("Attempting to update a DXT compressed texture without hardware support\n"); + if (dst_format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + { + if (destSurfaceHeight != srcHeight || destSurfaceWidth != srcWidth) + { + /* FIXME: The easy way to do this is to lock the destination, and copy the bits across. */ + FIXME("Updating part of a compressed texture is not supported.\n"); } - - - } else { + if (destFormat != srcFormat) + { + FIXME("Updating mixed format compressed textures is not supported.\n"); + } + else + { + GL_EXTCALL(glCompressedTexImage2DARB(glDescription->target, glDescription->level, + dst_format_desc->glInternal, srcWidth, srcHeight, 0, destSize, data)); + } + } + else + { glTexSubImage2D(glDescription->target, glDescription->level, destLeft, destTop, srcWidth, srcHeight, dst_format_desc->glFormat, dst_format_desc->glType, data); } @@ -6176,8 +6166,7 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface, ENTER_GL(); context_bind_fbo(iface, GL_FRAMEBUFFER_EXT, &This->activeContext->dst_fbo); context_attach_surface_fbo(This, GL_FRAMEBUFFER_EXT, 0, surface); - GL_EXTCALL(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0)); - checkGLcall("glFramebufferRenderbufferEXT"); + context_attach_depth_stencil_fbo(This, GL_FRAMEBUFFER_EXT, NULL, FALSE); } if (rect) { @@ -6596,8 +6585,7 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED context_attach_surface_fbo(This, GL_READ_FRAMEBUFFER_EXT, 0, src_surface); glReadBuffer(GL_COLOR_ATTACHMENT0_EXT); checkGLcall("glReadBuffer()"); - GL_EXTCALL(glFramebufferRenderbufferEXT(GL_READ_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0)); - checkGLcall("glFramebufferRenderbufferEXT"); + context_attach_depth_stencil_fbo(This, GL_READ_FRAMEBUFFER_EXT, NULL, FALSE); } LEAVE_GL(); @@ -6644,8 +6632,7 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED context_attach_surface_fbo(This, GL_DRAW_FRAMEBUFFER_EXT, 0, dst_surface); glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); checkGLcall("glDrawBuffer()"); - GL_EXTCALL(glFramebufferRenderbufferEXT(GL_DRAW_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, 0)); - checkGLcall("glFramebufferRenderbufferEXT"); + context_attach_depth_stencil_fbo(This, GL_DRAW_FRAMEBUFFER_EXT, NULL, FALSE); } glDisable(GL_SCISSOR_TEST); IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE)); diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 4a2a27002bc..05443fc8215 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -63,6 +63,7 @@ static const struct { /* ARB */ {"GL_ARB_color_buffer_float", ARB_COLOR_BUFFER_FLOAT, 0 }, + {"GL_ARB_depth_buffer_float", ARB_DEPTH_BUFFER_FLOAT, 0 }, {"GL_ARB_depth_texture", ARB_DEPTH_TEXTURE, 0 }, {"GL_ARB_draw_buffers", ARB_DRAW_BUFFERS, 0 }, {"GL_ARB_fragment_program", ARB_FRAGMENT_PROGRAM, 0 }, @@ -614,21 +615,15 @@ static BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info) { major = minor = 0; gl_string_cursor = strchr(gl_string, '-'); if (gl_string_cursor) { - int error = 0; gl_string_cursor++; /* Check if version number is of the form x.y.z */ - if (*gl_string_cursor > '9' && *gl_string_cursor < '0') - error = 1; - if (!error && *(gl_string_cursor+2) > '9' && *(gl_string_cursor+2) < '0') - error = 1; - if (!error && *(gl_string_cursor+4) > '9' && *(gl_string_cursor+4) < '0') - error = 1; - if (!error && *(gl_string_cursor+1) != '.' && *(gl_string_cursor+3) != '.') - error = 1; - - /* Mark version number as malformed */ - if (error) + if ( *gl_string_cursor < '0' || *gl_string_cursor > '9' + || *(gl_string_cursor+1) != '.' + || *(gl_string_cursor+2) < '0' || *(gl_string_cursor+2) > '9' + || *(gl_string_cursor+3) != '.' + || *(gl_string_cursor+4) < '0' || *(gl_string_cursor+4) > '9' ) + /* Mark version number as malformed */ gl_string_cursor = 0; } diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 6c0fd840f3b..846044f7a8a 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -657,20 +657,21 @@ static void shader_glsl_load_constants( /* Upload the environment bump map matrix if needed. The needsbumpmat member specifies the texture stage to load the matrix from. * It can't be 0 for a valid texbem instruction. */ - for(i = 0; i < ((IWineD3DPixelShaderImpl *) pshader)->numbumpenvmatconsts; i++) { - IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) pshader; - int stage = ps->luminanceconst[i].texunit; + for(i = 0; i < MAX_TEXTURES; i++) { + const float *data; - const float *data = (const float *)&stateBlock->textureState[(int)ps->bumpenvmatconst[i].texunit][WINED3DTSS_BUMPENVMAT00]; + if(prog->bumpenvmat_location[i] == -1) continue; + + data = (const float *)&stateBlock->textureState[i][WINED3DTSS_BUMPENVMAT00]; GL_EXTCALL(glUniformMatrix2fvARB(prog->bumpenvmat_location[i], 1, 0, data)); checkGLcall("glUniformMatrix2fvARB"); /* texbeml needs the luminance scale and offset too. If texbeml is used, needsbumpmat * is set too, so we can check that in the needsbumpmat check */ - if(ps->baseShader.reg_maps.luminanceparams[stage]) { - const GLfloat *scale = (const GLfloat *)&stateBlock->textureState[stage][WINED3DTSS_BUMPENVLSCALE]; - const GLfloat *offset = (const GLfloat *)&stateBlock->textureState[stage][WINED3DTSS_BUMPENVLOFFSET]; + if(prog->luminancescale_location[i] != -1) { + const GLfloat *scale = (const GLfloat *)&stateBlock->textureState[i][WINED3DTSS_BUMPENVLSCALE]; + const GLfloat *offset = (const GLfloat *)&stateBlock->textureState[i][WINED3DTSS_BUMPENVLOFFSET]; GL_EXTCALL(glUniform1fvARB(prog->luminancescale_location[i], 1, scale)); checkGLcall("glUniform1fvARB"); @@ -864,28 +865,20 @@ static void shader_generate_glsl_declarations(IWineD3DBaseShader *iface, const s shader_addline(buffer, "void order_ps_input();\n"); } } else { - IWineD3DPixelShaderImpl *ps_impl = (IWineD3DPixelShaderImpl *) This; - - ps_impl->numbumpenvmatconsts = 0; for(i = 0; i < (sizeof(reg_maps->bumpmat) / sizeof(reg_maps->bumpmat[0])); i++) { if(!reg_maps->bumpmat[i]) { continue; } - ps_impl->bumpenvmatconst[(int) ps_impl->numbumpenvmatconsts].texunit = i; shader_addline(buffer, "uniform mat2 bumpenvmat%d;\n", i); if(reg_maps->luminanceparams) { - ps_impl->luminanceconst[(int) ps_impl->numbumpenvmatconsts].texunit = i; shader_addline(buffer, "uniform float luminancescale%d;\n", i); shader_addline(buffer, "uniform float luminanceoffset%d;\n", i); extra_constants_needed++; - } else { - ps_impl->luminanceconst[(int) ps_impl->numbumpenvmatconsts].texunit = -1; } extra_constants_needed++; - ps_impl->numbumpenvmatconsts++; } if(ps_args->srgb_correction) { @@ -3952,22 +3945,12 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use GLhandleARB reorder_shader_id = 0; unsigned int i; char glsl_name[8]; - GLhandleARB vshader_id, pshader_id; struct ps_compile_args ps_compile_args; struct vs_compile_args vs_compile_args; - if(use_vs) { - find_vs_compile_args((IWineD3DVertexShaderImpl*)This->stateBlock->vertexShader, This->stateBlock, &vs_compile_args); - } else { - /* FIXME: Do we really have to spend CPU cycles to generate a few zeroed bytes? */ - memset(&vs_compile_args, 0, sizeof(vs_compile_args)); - } - if(use_ps) { - find_ps_compile_args((IWineD3DPixelShaderImpl*)This->stateBlock->pixelShader, This->stateBlock, &ps_compile_args); - } else { - /* FIXME: Do we really have to spend CPU cycles to generate a few zeroed bytes? */ - memset(&ps_compile_args, 0, sizeof(ps_compile_args)); - } + if (vshader) find_vs_compile_args((IWineD3DVertexShaderImpl *)vshader, This->stateBlock, &vs_compile_args); + if (pshader) find_ps_compile_args((IWineD3DPixelShaderImpl *)pshader, This->stateBlock, &ps_compile_args); + entry = get_glsl_program_entry(priv, vshader, pshader, &vs_compile_args, &ps_compile_args); if (entry) { priv->glsl_program = entry; @@ -3992,14 +3975,10 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use /* Set the current program */ priv->glsl_program = entry; - if(use_vs) { - vshader_id = find_glsl_vshader((IWineD3DVertexShaderImpl *) vshader, &vs_compile_args); - } else { - vshader_id = 0; - } - /* Attach GLSL vshader */ - if (vshader_id) { + if (vshader) + { + GLhandleARB vshader_id = find_glsl_vshader((IWineD3DVertexShaderImpl *)vshader, &vs_compile_args); WORD map = ((IWineD3DBaseShaderImpl *)vshader)->baseShader.reg_maps.input_registers; char tmp_name[10]; @@ -4037,14 +4016,10 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use list_add_head(&((IWineD3DBaseShaderImpl *)vshader)->baseShader.linked_programs, &entry->vshader_entry); } - if(use_ps) { - pshader_id = find_glsl_pshader((IWineD3DPixelShaderImpl *) pshader, &ps_compile_args); - } else { - pshader_id = 0; - } - /* Attach GLSL pshader */ - if (pshader_id) { + if (pshader) + { + GLhandleARB pshader_id = find_glsl_pshader((IWineD3DPixelShaderImpl *)pshader, &ps_compile_args); TRACE("Attaching GLSL shader object %u to program %u\n", pshader_id, programId); GL_EXTCALL(glAttachObjectARB(programId, pshader_id)); checkGLcall("glAttachObjectARB"); @@ -4077,26 +4052,25 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use } if(pshader) { - for(i = 0; i < ((IWineD3DPixelShaderImpl*)pshader)->numbumpenvmatconsts; i++) { - char name[32]; - sprintf(name, "bumpenvmat%d", ((IWineD3DPixelShaderImpl*)pshader)->bumpenvmatconst[i].texunit); + char name[32]; + WORD map; + + for(i = 0; i < MAX_TEXTURES; i++) { + sprintf(name, "bumpenvmat%u", i); entry->bumpenvmat_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name)); - sprintf(name, "luminancescale%d", ((IWineD3DPixelShaderImpl*)pshader)->luminanceconst[i].texunit); + sprintf(name, "luminancescale%u", i); entry->luminancescale_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name)); - sprintf(name, "luminanceoffset%d", ((IWineD3DPixelShaderImpl*)pshader)->luminanceconst[i].texunit); + sprintf(name, "luminanceoffset%u", i); entry->luminanceoffset_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name)); } - } - if (use_ps && ps_compile_args.np2_fixup) { - char name[32]; - for (i = 0; i < MAX_FRAGMENT_SAMPLERS; ++i) { - if (ps_compile_args.np2_fixup & (1 << i)) { - sprintf(name, "PsamplerNP2Fixup%u", i); - entry->np2Fixup_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name)); - } else { - entry->np2Fixup_location[i] = -1; - } + map = ps_compile_args.np2_fixup; + for (i = 0; map; map >>= 1, ++i) + { + if (!(map & 1)) continue; + + sprintf(name, "PsamplerNP2Fixup%u", i); + entry->np2Fixup_location[i] = GL_EXTCALL(glGetUniformLocationARB(programId, name)); } } @@ -4126,14 +4100,8 @@ static void set_glsl_shader_program(IWineD3DDevice *iface, BOOL use_ps, BOOL use * fixed function fragment processing setups. So once the program is linked these samplers * won't change. */ - if(vshader_id) { - /* Load vertex shader samplers */ - shader_glsl_load_vsamplers(gl_info, This->texUnitMap, programId); - } - if(pshader_id) { - /* Load pixel shader samplers */ - shader_glsl_load_psamplers(gl_info, This->texUnitMap, programId); - } + if (vshader) shader_glsl_load_vsamplers(gl_info, This->texUnitMap, programId); + if (pshader) shader_glsl_load_psamplers(gl_info, This->texUnitMap, programId); /* If the local constants do not have to be loaded with the environment constants, * load them now to have them hardcoded in the GLSL program. This saves some CPU cycles @@ -4399,11 +4367,10 @@ static int glsl_program_key_compare(const void *key, const struct wine_rb_entry if (k->pshader > prog->pshader) return 1; else if (k->pshader < prog->pshader) return -1; - cmp = memcmp(&k->vs_args, &prog->vs_args, sizeof(prog->vs_args)); - if (cmp) return cmp; + if (k->vshader && (cmp = memcmp(&k->vs_args, &prog->vs_args, sizeof(prog->vs_args)))) return cmp; + if (k->pshader && (cmp = memcmp(&k->ps_args, &prog->ps_args, sizeof(prog->ps_args)))) return cmp; - cmp = memcmp(&k->ps_args, &prog->ps_args, sizeof(prog->ps_args)); - return cmp; + return 0; } static BOOL constant_heap_init(struct constant_heap *heap, unsigned int constant_count) diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 1e09385069e..c468d2b4c5f 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -3828,14 +3828,6 @@ static inline void unload_numbered_array(IWineD3DStateBlockImpl *stateblock, Win { GL_EXTCALL(glDisableVertexAttribArrayARB(i)); checkGLcall("glDisableVertexAttribArrayARB(reg)"); - /* Some Windows drivers(NV GF 7) use the latest value that was used when drawing with the now - * deactivated stream disabled, some other drivers(ATI, NV GF 8) set the undefined values to 0x00. - * Let's set them to 0x00 to avoid hitting some undefined aspects of OpenGL. All that is really - * important here is the glDisableVertexAttribArrayARB call above. The test shows that the refrast - * keeps dereferencing the pointers, which would cause crashes in some games like Half Life 2: Episode Two. - */ - GL_EXTCALL(glVertexAttrib4NubARB(i, 0, 0, 0, 0)); - checkGLcall("glVertexAttrib4NubARB(i, 0, 0, 0, 0)"); context->numbered_array_mask &= ~(1 << i); } diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 2f5554fca53..116cff09186 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -146,29 +146,28 @@ static void surface_download_data(IWineD3DSurfaceImpl *This) { ENTER_GL(); - if (format_desc->format == WINED3DFMT_DXT1 || format_desc->format == WINED3DFMT_DXT2 - || format_desc->format == WINED3DFMT_DXT3 || format_desc->format == WINED3DFMT_DXT4 - || format_desc->format == WINED3DFMT_DXT5 || format_desc->format == WINED3DFMT_ATI2N) + if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) { - if (!GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) { /* We can assume this as the texture would not have been created otherwise */ - FIXME("(%p) : Attempting to lock a compressed texture when texture compression isn't supported by opengl\n", This); - } else { - TRACE("(%p) : Calling glGetCompressedTexImageARB level %d, format %#x, type %#x, data %p\n", - This, This->glDescription.level, format_desc->glFormat, format_desc->glType, - This->resource.allocatedMemory); - - if(This->Flags & SFLAG_PBO) { - GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, This->pbo)); - checkGLcall("glBindBufferARB"); - GL_EXTCALL(glGetCompressedTexImageARB(This->glDescription.target, This->glDescription.level, NULL)); - checkGLcall("glGetCompressedTexImageARB()"); - GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0)); - checkGLcall("glBindBufferARB"); - } else { - GL_EXTCALL(glGetCompressedTexImageARB(This->glDescription.target, This->glDescription.level, This->resource.allocatedMemory)); - checkGLcall("glGetCompressedTexImageARB()"); - } + TRACE("(%p) : Calling glGetCompressedTexImageARB level %d, format %#x, type %#x, data %p.\n", + This, This->glDescription.level, format_desc->glFormat, format_desc->glType, + This->resource.allocatedMemory); + + if (This->Flags & SFLAG_PBO) + { + GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, This->pbo)); + checkGLcall("glBindBufferARB"); + GL_EXTCALL(glGetCompressedTexImageARB(This->glDescription.target, This->glDescription.level, NULL)); + checkGLcall("glGetCompressedTexImageARB()"); + GL_EXTCALL(glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0)); + checkGLcall("glBindBufferARB"); + } + else + { + GL_EXTCALL(glGetCompressedTexImageARB(This->glDescription.target, + This->glDescription.level, This->resource.allocatedMemory)); + checkGLcall("glGetCompressedTexImageARB()"); } + LEAVE_GL(); } else { void *mem; @@ -293,39 +292,43 @@ static void surface_upload_data(IWineD3DSurfaceImpl *This, GLenum internal, GLsi if (format_desc->heightscale != 1.0 && format_desc->heightscale != 0.0) height *= format_desc->heightscale; - if (format_desc->format == WINED3DFMT_DXT1 || format_desc->format == WINED3DFMT_DXT2 - || format_desc->format == WINED3DFMT_DXT3 || format_desc->format == WINED3DFMT_DXT4 - || format_desc->format == WINED3DFMT_DXT5 || format_desc->format == WINED3DFMT_ATI2N) + if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) { - if (!GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) { - FIXME("Using DXT1/3/5 without advertized support\n"); - } else { - /* glCompressedTexSubImage2D for uploading and glTexImage2D for allocating does not work well on some drivers(r200 dri, MacOS ATI driver) - * glCompressedTexImage2D does not accept NULL pointers. So for compressed textures surface_allocate_surface does nothing, and this - * function uses glCompressedTexImage2D instead of the SubImage call - */ - TRACE("(%p) : Calling glCompressedTexSubImage2D w %d, h %d, data %p\n", This, width, height, data); - ENTER_GL(); + /* glCompressedTexSubImage2D() for uploading and glTexImage2D() for + * allocating does not work well on some drivers (r200 dri, MacOS ATI + * driver). glCompressedTexImage2D() does not accept NULL pointers. So + * for compressed textures surface_allocate_surface() does nothing, + * and this function uses glCompressedTexImage2D() instead of + * glCompressedTexSubImage2D(). */ + TRACE("(%p) : Calling glCompressedTexImage2DARB w %u, h %u, data %p.\n", This, width, height, data); + + ENTER_GL(); - if(This->Flags & SFLAG_PBO) { - GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, This->pbo)); - checkGLcall("glBindBufferARB"); - TRACE("(%p) pbo: %#x, data: %p\n", This, This->pbo, data); + if (This->Flags & SFLAG_PBO) + { + GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, This->pbo)); + checkGLcall("glBindBufferARB"); - GL_EXTCALL(glCompressedTexImage2DARB(This->glDescription.target, This->glDescription.level, internal, - width, height, 0 /* border */, This->resource.size, NULL)); - checkGLcall("glCompressedTexSubImage2D"); + TRACE("(%p) pbo: %#x, data: %p.\n", This, This->pbo, data); - GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); - checkGLcall("glBindBufferARB"); - } else { - GL_EXTCALL(glCompressedTexImage2DARB(This->glDescription.target, This->glDescription.level, internal, - width, height, 0 /* border */, This->resource.size, data)); - checkGLcall("glCompressedTexSubImage2D"); - } - LEAVE_GL(); + GL_EXTCALL(glCompressedTexImage2DARB(This->glDescription.target, This->glDescription.level, + internal, width, height, 0 /* border */, This->resource.size, NULL)); + checkGLcall("glCompressedTexImage2DARB"); + + GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0)); + checkGLcall("glBindBufferARB"); } - } else { + else + { + GL_EXTCALL(glCompressedTexImage2DARB(This->glDescription.target, This->glDescription.level, + internal, width, height, 0 /* border */, This->resource.size, data)); + checkGLcall("glCompressedTexSubImage2D"); + } + + LEAVE_GL(); + } + else + { TRACE("(%p) : Calling glTexSubImage2D w %d, h %d, data, %p\n", This, width, height, data); ENTER_GL(); @@ -362,9 +365,7 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal, This, This->glDescription.target, This->glDescription.level, debug_d3dformat(format_desc->format), internal, width, height, format, type); - if (format_desc->format == WINED3DFMT_DXT1 || format_desc->format == WINED3DFMT_DXT2 - || format_desc->format == WINED3DFMT_DXT3 || format_desc->format == WINED3DFMT_DXT4 - || format_desc->format == WINED3DFMT_DXT5 || format_desc->format == WINED3DFMT_ATI2N) + if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) { /* glCompressedTexImage2D does not accept NULL pointers, so we cannot allocate a compressed texture without uploading data */ TRACE("Not allocating compressed surfaces, surface_upload_data will specify them\n"); @@ -1670,7 +1671,6 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ } else if(!GL_SUPPORT(EXT_PALETTED_TEXTURE) && GL_SUPPORT(ARB_FRAGMENT_PROGRAM)) { *format = GL_ALPHA; - *internal = GL_RGBA; *type = GL_UNSIGNED_BYTE; *target_bpp = 1; } @@ -1692,7 +1692,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ if (colorkey_active) { *convert = CONVERT_CK_565; *format = GL_RGBA; - *internal = GL_RGBA; + *internal = GL_RGB5_A1; *type = GL_UNSIGNED_SHORT_5_5_5_1; } break; @@ -1701,7 +1701,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ if (colorkey_active) { *convert = CONVERT_CK_5551; *format = GL_BGRA; - *internal = GL_RGBA; + *internal = GL_RGB5_A1; *type = GL_UNSIGNED_SHORT_1_5_5_5_REV; } break; @@ -1710,7 +1710,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ if (colorkey_active) { *convert = CONVERT_CK_RGB24; *format = GL_RGBA; - *internal = GL_RGBA; + *internal = GL_RGBA8; *type = GL_UNSIGNED_INT_8_8_8_8; *target_bpp = 4; } @@ -1720,16 +1720,15 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ if (colorkey_active) { *convert = CONVERT_RGB32_888; *format = GL_RGBA; - *internal = GL_RGBA; + *internal = GL_RGBA8; *type = GL_UNSIGNED_INT_8_8_8_8; } break; case WINED3DFMT_R8G8_SNORM: - if(GL_SUPPORT(NV_TEXTURE_SHADER3)) break; + if (GL_SUPPORT(NV_TEXTURE_SHADER)) break; *convert = CONVERT_V8U8; *format = GL_BGR; - *internal = GL_RGB8; *type = GL_UNSIGNED_BYTE; *target_bpp = 3; break; @@ -1743,7 +1742,6 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ /* Load it into unsigned R5G6B5, swap L and V channels, and revert that in the shader */ *target_bpp = 2; *format = GL_RGB; - *internal = GL_RGB5; *type = GL_UNSIGNED_SHORT_5_6_5; } break; @@ -1760,25 +1758,22 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ */ } else { *format = GL_BGRA; - *internal = GL_RGB8; *type = GL_UNSIGNED_INT_8_8_8_8_REV; } break; case WINED3DFMT_R8G8B8A8_SNORM: - if(GL_SUPPORT(NV_TEXTURE_SHADER3)) break; + if (GL_SUPPORT(NV_TEXTURE_SHADER)) break; *convert = CONVERT_Q8W8V8U8; *format = GL_BGRA; - *internal = GL_RGBA8; *type = GL_UNSIGNED_BYTE; *target_bpp = 4; break; case WINED3DFMT_R16G16_SNORM: - if(GL_SUPPORT(NV_TEXTURE_SHADER3)) break; + if (GL_SUPPORT(NV_TEXTURE_SHADER)) break; *convert = CONVERT_V16U16; *format = GL_BGR; - *internal = GL_RGB16_EXT; *type = GL_UNSIGNED_SHORT; *target_bpp = 6; break; @@ -1790,7 +1785,6 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ */ *convert = CONVERT_A4L4; *format = GL_LUMINANCE_ALPHA; - *internal = GL_LUMINANCE4_ALPHA4; *type = GL_UNSIGNED_BYTE; *target_bpp = 2; break; @@ -1798,7 +1792,6 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ case WINED3DFMT_R16G16_UNORM: *convert = CONVERT_G16R16; *format = GL_RGB; - *internal = GL_RGB16_EXT; *type = GL_UNSIGNED_SHORT; *target_bpp = 6; break; @@ -1806,7 +1799,6 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ case WINED3DFMT_R16G16_FLOAT: *convert = CONVERT_R16G16F; *format = GL_RGB; - *internal = GL_RGB16F_ARB; *type = GL_HALF_FLOAT_ARB; *target_bpp = 6; break; @@ -1814,7 +1806,6 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_ case WINED3DFMT_R32G32_FLOAT: *convert = CONVERT_R32G32F; *format = GL_RGB; - *internal = GL_RGB32F_ARB; *type = GL_FLOAT; *target_bpp = 12; break; @@ -2488,7 +2479,7 @@ static void WINAPI IWineD3DSurfaceImpl_BindTexture(IWineD3DSurface *iface, BOOL ERR("Mipmap surface has a glTexture bound to it!\n"); } - glBindTexture(This->glDescription.target, This->glDescription.textureName); + glBindTexture(This->glDescription.target, *name); checkGLcall("glBindTexture"); LEAVE_GL(); @@ -3550,6 +3541,20 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const rect.y1 += This->currentDesc.Height - h; rect.y2 += This->currentDesc.Height - h; } + if (!is_identity_fixup(This->resource.format_desc->color_fixup)) + { + FIXME("Destination format %s has a fixup, this is not supported.\n", + debug_d3dformat(This->resource.format_desc->format)); + dump_color_fixup_desc(This->resource.format_desc->color_fixup); + } + + if (!myDevice->blitter->color_fixup_supported(Src->resource.format_desc->color_fixup)) + { + FIXME("Source format %s has an unsupported fixup:\n", + debug_d3dformat(Src->resource.format_desc->format)); + dump_color_fixup_desc(Src->resource.format_desc->color_fixup); + } + myDevice->blitter->set_shader((IWineD3DDevice *) myDevice, Src->resource.format_desc, Src->glDescription.target, Src->pow2Width, Src->pow2Height); @@ -3947,11 +3952,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) { This->pow2Height = pow2Height; if (pow2Width > This->currentDesc.Width || pow2Height > This->currentDesc.Height) { - WINED3DFORMAT Format = This->resource.format_desc->format; /** TODO: add support for non power two compressed textures **/ - if (Format == WINED3DFMT_DXT1 || Format == WINED3DFMT_DXT2 || Format == WINED3DFMT_DXT3 - || Format == WINED3DFMT_DXT4 || Format == WINED3DFMT_DXT5 - || Format == WINED3DFMT_ATI2N) + if (This->resource.format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) { FIXME("(%p) Compressed non-power-two textures are not supported w(%d) h(%d)\n", This, This->currentDesc.Width, This->currentDesc.Height); diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c index d487f80e10a..e17f89253dd 100644 --- a/dlls/wined3d/surface_base.c +++ b/dlls/wined3d/surface_base.c @@ -332,19 +332,19 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetPalette(IWineD3DSurface *iface, IWineD DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPitch(IWineD3DSurface *iface) { IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface; - WINED3DFORMAT format = This->resource.format_desc->format; + const struct GlPixelFormatDesc *format_desc = This->resource.format_desc; DWORD ret; TRACE("(%p)\n", This); - /* DXTn formats don't have exact pitches as they are to the new row of blocks, - where each block is 4x4 pixels, 8 bytes (dxt1) and 16 bytes (dxt2/3/4/5) - ie pitch = (width/4) * bytes per block */ - if (format == WINED3DFMT_DXT1) /* DXT1 is 8 bytes per block */ - ret = ((This->currentDesc.Width + 3) >> 2) << 3; - else if (format == WINED3DFMT_DXT2 || format == WINED3DFMT_DXT3 || - format == WINED3DFMT_DXT4 || format == WINED3DFMT_DXT5) /* DXT2/3/4/5 is 16 bytes per block */ - ret = ((This->currentDesc.Width + 3) >> 2) << 4; - else { + if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + { + /* Since compressed formats are block based, pitch means the amount of + * bytes to the next row of block rather than the next row of pixels. */ + UINT row_block_count = (This->currentDesc.Width + format_desc->block_width - 1) / format_desc->block_width; + ret = row_block_count * format_desc->block_byte_count; + } + else + { unsigned char alignment = This->resource.wineD3DDevice->surface_alignment; ret = This->resource.format_desc->byte_count * This->currentDesc.Width; /* Bytes / row */ ret = (ret + alignment - 1) & ~(alignment - 1); @@ -521,14 +521,15 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3D TRACE("(%p) : Setting texture format to (%d,%s)\n", This, format, debug_d3dformat(format)); if (format == WINED3DFMT_UNKNOWN) { This->resource.size = 0; - } else if (format == WINED3DFMT_DXT1) { - /* DXT1 is half byte per pixel */ - This->resource.size = ((max(This->pow2Width, 4) * format_desc->byte_count) * max(This->pow2Height, 4)) >> 1; - - } else if (format == WINED3DFMT_DXT2 || format == WINED3DFMT_DXT3 || - format == WINED3DFMT_DXT4 || format == WINED3DFMT_DXT5) { - This->resource.size = ((max(This->pow2Width, 4) * format_desc->byte_count) * max(This->pow2Height, 4)); - } else { + } + else if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + { + UINT row_block_count = (This->pow2Width + format_desc->block_width - 1) / format_desc->block_width; + UINT row_count = (This->pow2Height + format_desc->block_height - 1) / format_desc->block_height; + This->resource.size = row_count * row_block_count * format_desc->block_byte_count; + } + else + { unsigned char alignment = This->resource.wineD3DDevice->surface_alignment; This->resource.size = ((This->pow2Width * format_desc->byte_count) + alignment - 1) & ~(alignment - 1); This->resource.size *= This->pow2Height; @@ -781,10 +782,9 @@ static IWineD3DSurfaceImpl *surface_convert_format(IWineD3DSurfaceImpl *source, return NULL; } - IWineD3DDevice_CreateSurface((IWineD3DDevice *)source->resource.wineD3DDevice, - source->currentDesc.Width, source->currentDesc.Height, to_fmt, TRUE /* lockable */, - TRUE /* discard */, 0 /* level */, &ret, WINED3DRTYPE_SURFACE, 0 /* usage */, - WINED3DPOOL_SCRATCH, WINED3DMULTISAMPLE_NONE /* TODO: Multisampled conversion */, + IWineD3DDevice_CreateSurface((IWineD3DDevice *)source->resource.wineD3DDevice, source->currentDesc.Width, + source->currentDesc.Height, to_fmt, TRUE /* lockable */, TRUE /* discard */, 0 /* level */, &ret, + 0 /* usage */, WINED3DPOOL_SCRATCH, WINED3DMULTISAMPLE_NONE /* TODO: Multisampled conversion */, 0 /* MultiSampleQuality */, IWineD3DSurface_GetImplType((IWineD3DSurface *) source), NULL /* parent */); if(!ret) { ERR("Failed to create a destination surface for conversion\n"); @@ -1650,63 +1650,39 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst dEntry = This->resource.format_desc; } - /* Handle first the FOURCC surfaces... */ - if (sEntry->Flags & dEntry->Flags & WINED3DFMT_FLAG_FOURCC) + /* Handle compressed surfaces first... */ + if (sEntry->Flags & dEntry->Flags & WINED3DFMT_FLAG_COMPRESSED) { - UINT block_width; - UINT block_height; - UINT block_byte_size; + UINT row_block_count; - TRACE("Fourcc -> Fourcc copy\n"); + TRACE("compressed -> compressed copy\n"); if (trans) - FIXME("trans arg not supported when a FOURCC surface is involved\n"); + FIXME("trans arg not supported when a compressed surface is involved\n"); if (dstx || dsty) FIXME("offset for destination surface is not supported\n"); if (Src->resource.format_desc->format != This->resource.format_desc->format) { - FIXME("FOURCC->FOURCC copy only supported for the same type of surface\n"); + FIXME("compressed -> compressed copy only supported for the same type of surface\n"); ret = WINED3DERR_WRONGTEXTUREFORMAT; goto error; } - if (This->resource.format_desc->format == WINED3DFMT_DXT1) - { - block_width = 4; - block_height = 4; - block_byte_size = 8; - } - else if (This->resource.format_desc->format == WINED3DFMT_DXT2 - || This->resource.format_desc->format == WINED3DFMT_DXT3 - || This->resource.format_desc->format == WINED3DFMT_DXT4 - || This->resource.format_desc->format == WINED3DFMT_DXT5) - { - block_width = 4; - block_height = 4; - block_byte_size = 16; - } - else - { - FIXME("Unsupported FourCC format %s.\n", debug_d3dformat(This->resource.format_desc->format)); - block_width = 1; - block_height = 1; - block_byte_size = This->resource.format_desc->byte_count; - } - - for (y = 0; y < h; y += block_height) + row_block_count = (w + dEntry->block_width - 1) / dEntry->block_width; + for (y = 0; y < h; y += dEntry->block_height) { - memcpy(dbuf, sbuf, (w / block_width) * block_byte_size); + memcpy(dbuf, sbuf, row_block_count * dEntry->block_byte_count); dbuf += dlock.Pitch; sbuf += slock.Pitch; } goto error; } - if ((sEntry->Flags & WINED3DFMT_FLAG_FOURCC) && !(dEntry->Flags & WINED3DFMT_FLAG_FOURCC)) + if ((sEntry->Flags & WINED3DFMT_FLAG_COMPRESSED) && !(dEntry->Flags & WINED3DFMT_FLAG_COMPRESSED)) { /* TODO: Use the libtxc_dxtn.so shared library to do * software decompression */ - ERR("DXTC decompression not supported by now\n"); + ERR("Software decompression not supported.\n"); goto error; } @@ -1844,32 +1820,24 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DL } else { + const struct GlPixelFormatDesc *format_desc = This->resource.format_desc; + TRACE("Lock Rect (%p) = l %d, t %d, r %d, b %d\n", pRect, pRect->left, pRect->top, pRect->right, pRect->bottom); - /* DXTn textures are based on compressed blocks of 4x4 pixels, each - * 16 bytes large (8 bytes in case of DXT1). Because of that Pitch has - * slightly different meaning compared to regular textures. For DXTn - * textures Pitch is the size of a row of blocks, 4 high and "width" - * long. The x offset is calculated differently as well, since moving 4 - * pixels to the right actually moves an entire 4x4 block to right, ie - * 16 bytes (8 in case of DXT1). */ - if (This->resource.format_desc->format == WINED3DFMT_DXT1) - { - pLockedRect->pBits = This->resource.allocatedMemory + (pLockedRect->Pitch * pRect->top / 4) + (pRect->left * 2); - } - else if (This->resource.format_desc->format == WINED3DFMT_DXT2 - || This->resource.format_desc->format == WINED3DFMT_DXT3 - || This->resource.format_desc->format == WINED3DFMT_DXT4 - || This->resource.format_desc->format == WINED3DFMT_DXT5) + if (format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED) { - pLockedRect->pBits = This->resource.allocatedMemory + (pLockedRect->Pitch * pRect->top / 4) + (pRect->left * 4); + /* Compressed textures are block based, so calculate the offset of + * the block that contains the top-left pixel of the locked rectangle. */ + pLockedRect->pBits = This->resource.allocatedMemory + + ((pRect->top / format_desc->block_height) * pLockedRect->Pitch) + + ((pRect->left / format_desc->block_width) * format_desc->block_byte_count); } else { pLockedRect->pBits = This->resource.allocatedMemory + (pLockedRect->Pitch * pRect->top) + - (pRect->left * This->resource.format_desc->byte_count); + (pRect->left * format_desc->byte_count); } This->lockedRect.left = pRect->left; This->lockedRect.top = pRect->top; diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 00f67d0101f..1e3e3fb79f0 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -91,14 +91,14 @@ static const struct StaticPixelFormatDesc formats[] = {WINED3DFMT_A8_UNORM, 0x000000ff, 0x0, 0x0, 0x0, 1, 0, 0, FALSE}, {WINED3DFMT_A8R3G3B2, 0x0000ff00, 0x000000e0, 0x0000001c, 0x00000003, 2, 0, 0, FALSE}, {WINED3DFMT_X4R4G4B4, 0x0, 0x00000f00, 0x000000f0, 0x0000000f, 2, 0, 0, FALSE}, - {WINED3DFMT_R10G10B10A2_UNORM, 0xb0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE}, - {WINED3DFMT_R10G10B10A2_UINT, 0xb0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE}, - {WINED3DFMT_R10G10B10A2_SNORM, 0xb0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE}, + {WINED3DFMT_R10G10B10A2_UNORM, 0xc0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE}, + {WINED3DFMT_R10G10B10A2_UINT, 0xc0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE}, + {WINED3DFMT_R10G10B10A2_SNORM, 0xc0000000, 0x000003ff, 0x000ffc00, 0x3ff00000, 4, 0, 0, FALSE}, {WINED3DFMT_R8G8B8A8_UNORM, 0xff000000, 0x000000ff, 0x0000ff00, 0x00ff0000, 4, 0, 0, FALSE}, {WINED3DFMT_R8G8B8A8_UINT, 0xff000000, 0x000000ff, 0x0000ff00, 0x00ff0000, 4, 0, 0, FALSE}, {WINED3DFMT_X8B8G8R8, 0x0, 0x000000ff, 0x0000ff00, 0x00ff0000, 4, 0, 0, FALSE}, {WINED3DFMT_R16G16_UNORM, 0x0, 0x0000ffff, 0xffff0000, 0x0, 4, 0, 0, FALSE}, - {WINED3DFMT_A2R10G10B10, 0xb0000000, 0x3ff00000, 0x000ffc00, 0x000003ff, 4, 0, 0, FALSE}, + {WINED3DFMT_A2R10G10B10, 0xc0000000, 0x3ff00000, 0x000ffc00, 0x000003ff, 4, 0, 0, FALSE}, {WINED3DFMT_R16G16B16A16_UNORM, 0x1, 0x0000ffff, 0xffff0000, 0x0, 8, 0, 0, FALSE}, /* Luminance */ {WINED3DFMT_L8, 0x0, 0x0, 0x0, 0x0, 1, 0, 0, FALSE}, @@ -134,6 +134,24 @@ static const struct StaticPixelFormatDesc formats[] = {WINED3DFMT_NVHS, 0x0, 0x0, 0x0, 0x0, 2, 0, 0, TRUE }, }; +struct wined3d_format_compression_info +{ + WINED3DFORMAT format; + UINT block_width; + UINT block_height; + UINT block_byte_count; +}; + +static const struct wined3d_format_compression_info format_compression_info[] = +{ + {WINED3DFMT_DXT1, 4, 4, 8}, + {WINED3DFMT_DXT2, 4, 4, 16}, + {WINED3DFMT_DXT3, 4, 4, 16}, + {WINED3DFMT_DXT4, 4, 4, 16}, + {WINED3DFMT_DXT5, 4, 4, 16}, + {WINED3DFMT_ATI2N, 4, 4, 16}, +}; + struct wined3d_format_vertex_info { WINED3DFORMAT format; @@ -446,18 +464,14 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = { GL_LUMINANCE, GL_UNSIGNED_SHORT, WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING, WINED3D_GL_EXT_NONE}, - {WINED3DFMT_D32F_LOCKABLE, GL_DEPTH_COMPONENT32_ARB, GL_DEPTH_COMPONENT32_ARB, 0, + {WINED3DFMT_D32F_LOCKABLE, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT32F, 0, GL_DEPTH_COMPONENT, GL_FLOAT, WINED3DFMT_FLAG_DEPTH, - ARB_DEPTH_TEXTURE}, - {WINED3DFMT_D24FS8, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0, - GL_DEPTH_COMPONENT, GL_FLOAT, - WINED3DFMT_FLAG_DEPTH, - ARB_DEPTH_TEXTURE}, - {WINED3DFMT_D24FS8, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0, - GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, + ARB_DEPTH_BUFFER_FLOAT}, + {WINED3DFMT_D24FS8, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, 0, + GL_DEPTH_STENCIL_EXT, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL, - EXT_PACKED_DEPTH_STENCIL}, + ARB_DEPTH_BUFFER_FLOAT}, /* Vendor-specific formats */ {WINED3DFMT_ATI2N, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, @@ -515,6 +529,32 @@ static BOOL init_format_base_info(WineD3D_GL_Info *gl_info) return TRUE; } +static BOOL init_format_compression_info(WineD3D_GL_Info *gl_info) +{ + unsigned int i; + + for (i = 0; i < (sizeof(format_compression_info) / sizeof(*format_compression_info)); ++i) + { + struct GlPixelFormatDesc *format_desc; + int fmt_idx = getFmtIdx(format_compression_info[i].format); + + if (fmt_idx == -1) + { + ERR("Format %s (%#x) not found.\n", + debug_d3dformat(format_compression_info[i].format), format_compression_info[i].format); + return FALSE; + } + + format_desc = &gl_info->gl_formats[fmt_idx]; + format_desc->block_width = format_compression_info[i].block_width; + format_desc->block_height = format_compression_info[i].block_height; + format_desc->block_byte_count = format_compression_info[i].block_byte_count; + format_desc->Flags |= WINED3DFMT_FLAG_COMPRESSED; + } + + return TRUE; +} + #define GLINFO_LOCATION (*gl_info) static BOOL check_fbo_compat(const WineD3D_GL_Info *gl_info, GLint internal_format, GLenum format, GLenum type) @@ -556,15 +596,31 @@ static void init_format_fbo_compat_info(WineD3D_GL_Info *gl_info) if (!desc->glInternal) continue; + if (desc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) + { + TRACE("Skipping format %s because it's a depth/stencil format.\n", + debug_d3dformat(desc->format)); + continue; + } + + if (desc->Flags & WINED3DFMT_FLAG_COMPRESSED) + { + TRACE("Skipping format %s because it's a compressed format.\n", + debug_d3dformat(desc->format)); + continue; + } + if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) { + TRACE("Checking if format %s is supported as FBO color attachment...\n", debug_d3dformat(desc->format)); + /* Check if the default internal format is supported as a frame buffer target, otherwise * fall back to the render target internal. * * Try to stick to the standard format if possible, this limits precision differences. */ if (check_fbo_compat(gl_info, desc->glInternal, desc->glFormat, desc->glType)) { - TRACE("Format %s is supported as fbo target\n", debug_d3dformat(desc->format)); + TRACE("Format %s is supported as FBO color attachment\n", debug_d3dformat(desc->format)); desc->Flags |= WINED3DFMT_FLAG_FBO_ATTACHABLE; desc->rtInternal = desc->glInternal; } @@ -574,15 +630,19 @@ static void init_format_fbo_compat_info(WineD3D_GL_Info *gl_info) { if (desc->Flags & WINED3DFMT_FLAG_RENDERTARGET) { - FIXME("Internal format of %s not supported as FBO target, and no fallback specified.\n", - debug_d3dformat(desc->format)); + FIXME("Format %s with rendertarget flag is not supported as FBO color attachment," + " and no fallback specified.\n", debug_d3dformat(desc->format)); desc->Flags &= ~WINED3DFMT_FLAG_RENDERTARGET; } + else + { + TRACE("Format %s is not supported as FBO color attachment.\n", debug_d3dformat(desc->format)); + } desc->rtInternal = desc->glInternal; } else { - TRACE("Internal format of %s not supported as FBO target, using render target internal instead.\n", + TRACE("Format %s is not supported as FBO color attachment, using rtInternal format as fallback.\n", debug_d3dformat(desc->format)); } } @@ -776,29 +836,33 @@ static BOOL init_format_vertex_info(WineD3D_GL_Info *gl_info) BOOL initPixelFormatsNoGL(WineD3D_GL_Info *gl_info) { - return init_format_base_info(gl_info); -} - -BOOL initPixelFormats(WineD3D_GL_Info *gl_info) -{ if (!init_format_base_info(gl_info)) return FALSE; - if (!init_format_texture_info(gl_info)) + if (!init_format_compression_info(gl_info)) { HeapFree(GetProcessHeap(), 0, gl_info->gl_formats); return FALSE; } - if (!init_format_vertex_info(gl_info)) - { - HeapFree(GetProcessHeap(), 0, gl_info->gl_formats); - return FALSE; - } + return TRUE; +} + +BOOL initPixelFormats(WineD3D_GL_Info *gl_info) +{ + if (!init_format_base_info(gl_info)) return FALSE; + + if (!init_format_compression_info(gl_info)) goto fail; + if (!init_format_texture_info(gl_info)) goto fail; + if (!init_format_vertex_info(gl_info)) goto fail; apply_format_fixups(gl_info); init_format_fbo_compat_info(gl_info); return TRUE; + +fail: + HeapFree(GetProcessHeap(), 0, gl_info->gl_formats); + return FALSE; } #undef GLINFO_LOCATION diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c index 64d871b83ec..829607d2fba 100644 --- a/dlls/wined3d/volume.c +++ b/dlls/wined3d/volume.c @@ -196,14 +196,15 @@ static HRESULT WINAPI IWineD3DVolumeImpl_GetDesc(IWineD3DVolume *iface, WINED3DV IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface; TRACE("(%p) : copying into %p\n", This, pDesc); - *(pDesc->Format) = This->resource.format_desc->format; - *(pDesc->Type) = This->resource.resourceType; - *(pDesc->Usage) = This->resource.usage; - *(pDesc->Pool) = This->resource.pool; - *(pDesc->Size) = This->resource.size; /* dx8 only */ - *(pDesc->Width) = This->currentDesc.Width; - *(pDesc->Height) = This->currentDesc.Height; - *(pDesc->Depth) = This->currentDesc.Depth; + pDesc->Format = This->resource.format_desc->format; + pDesc->Type = This->resource.resourceType; + pDesc->Usage = This->resource.usage; + pDesc->Pool = This->resource.pool; + pDesc->Size = This->resource.size; /* dx8 only */ + pDesc->Width = This->currentDesc.Width; + pDesc->Height = This->currentDesc.Height; + pDesc->Depth = This->currentDesc.Depth; + return WINED3D_OK; } diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h index 521b3a9abcb..aa598935b2a 100644 --- a/dlls/wined3d/wined3d_gl.h +++ b/dlls/wined3d/wined3d_gl.h @@ -1517,6 +1517,14 @@ BOOL (WINAPI *pwglShareLists)(HGLRC,HGLRC); #endif typedef void (WINE_GLAPI *PGLFNCLAMPCOLORARBPROC) (GLenum target, GLenum clamp); +/* GL_ARB_depth_buffer_float */ +#ifndef GL_ARB_depth_buffer_float +#define GL_ARB_depth_buffer_float 1 +#define GL_DEPTH_COMPONENT32F 0x8cac +#define GL_DEPTH32F_STENCIL8 0x8cad +#define GL_FLOAT_32_UNSIGNED_INT_24_8_REV 0x8dad +#endif + /* GL_ARB_depth_texture */ #ifndef GL_ARB_depth_texture #define GL_ARB_depth_texture 1 @@ -3393,6 +3401,7 @@ typedef enum _GL_SupportedExt { WINED3D_GL_EXT_NONE, /* ARB */ ARB_COLOR_BUFFER_FLOAT, + ARB_DEPTH_BUFFER_FLOAT, ARB_DEPTH_TEXTURE, ARB_DRAW_BUFFERS, ARB_FRAGMENT_PROGRAM, diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index adf623542f1..1997792e763 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -733,11 +733,6 @@ enum vertexprocessing_mode { #define WINED3D_CONST_NUM_UNUSED ~0U -struct stb_const_desc { - unsigned char texunit; - UINT const_num; -}; - enum fogmode { FOG_OFF, FOG_LINEAR, @@ -2690,9 +2685,6 @@ typedef struct IWineD3DPixelShaderImpl { void *backend_priv; /* Some information about the shader behavior */ - struct stb_const_desc bumpenvmatconst[MAX_TEXTURES]; - unsigned char numbumpenvmatconsts; - struct stb_const_desc luminanceconst[MAX_TEXTURES]; char vpos_uniform; BOOL color0_mov; @@ -2750,6 +2742,7 @@ extern WINED3DFORMAT pixelformat_for_depth(DWORD depth); #define WINED3DFMT_FLAG_RENDERTARGET 0x10 #define WINED3DFMT_FLAG_FOURCC 0x20 #define WINED3DFMT_FLAG_FBO_ATTACHABLE 0x40 +#define WINED3DFMT_FLAG_COMPRESSED 0x80 struct GlPixelFormatDesc { @@ -2762,6 +2755,10 @@ struct GlPixelFormatDesc WORD depth_size; WORD stencil_size; + UINT block_width; + UINT block_height; + UINT block_byte_count; + enum wined3d_ffp_emit_idx emit_idx; GLint component_count; GLenum gl_vtx_type; diff --git a/dlls/winex11.drv/keyboard.c b/dlls/winex11.drv/keyboard.c index ae22625efd8..daffe366972 100644 --- a/dlls/winex11.drv/keyboard.c +++ b/dlls/winex11.drv/keyboard.c @@ -2357,7 +2357,7 @@ INT CDECL X11DRV_GetKeyNameText(LONG lParam, LPWSTR lpBuffer, INT nSize) { MultiByteToWideChar(CP_UNIXCP, 0, name, -1, lpBuffer, nSize); lpBuffer[nSize - 1] = 0; - return 1; + return nSize; } } diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index 1bba8d97f17..8f9f404164f 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -165,14 +165,16 @@ struct HttpAuthInfo BOOL finished; /* finished authenticating */ }; -#ifdef HAVE_ZLIB struct gzip_stream_t { +#ifdef HAVE_ZLIB z_stream zstream; - BYTE buf[4096]; -}; - #endif + BYTE buf[8192]; + DWORD buf_size; + DWORD buf_pos; + BOOL end_of_data; +}; static BOOL HTTP_OpenConnection(LPWININETHTTPREQW lpwhr); static BOOL HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr, BOOL clear); @@ -223,6 +225,11 @@ static void init_gzip_stream(WININETHTTPREQW *req) gzip_stream->zstream.opaque = NULL; gzip_stream->zstream.next_in = NULL; gzip_stream->zstream.avail_in = 0; + gzip_stream->zstream.next_out = NULL; + gzip_stream->zstream.avail_out = 0; + gzip_stream->buf_pos = 0; + gzip_stream->buf_size = 0; + gzip_stream->end_of_data = FALSE; zres = inflateInit2(&gzip_stream->zstream, 0x1f); if(zres != Z_OK) { @@ -232,14 +239,6 @@ static void init_gzip_stream(WININETHTTPREQW *req) } req->gzip_stream = gzip_stream; - req->dwContentLength = ~0u; - - if(req->read_size) { - memcpy(gzip_stream->buf, req->read_buf + req->read_pos, req->read_size); - gzip_stream->zstream.next_in = gzip_stream->buf; - gzip_stream->zstream.avail_in = req->read_size; - req->read_size = 0; - } } #else @@ -1750,61 +1749,6 @@ static DWORD HTTPREQ_SetOption(WININETHANDLEHEADER *hdr, DWORD option, void *buf return ERROR_INTERNET_INVALID_OPTION; } -static inline BOOL is_gzip_buf_empty(gzip_stream_t *gzip_stream) -{ -#ifdef HAVE_ZLIB - return gzip_stream->zstream.avail_in == 0; -#else - return TRUE; -#endif -} - -static DWORD read_gzip_data(WININETHTTPREQW *req, BYTE *buf, int size, int flags, int *read_ret) -{ - DWORD ret = ERROR_SUCCESS; - int read = 0; - -#ifdef HAVE_ZLIB - int res, len, zres; - z_stream *zstream; - - zstream = &req->gzip_stream->zstream; - - while(read < size) { - if(is_gzip_buf_empty(req->gzip_stream)) { - res = NETCON_recv( &req->netConnection, req->gzip_stream->buf, - sizeof(req->gzip_stream->buf), flags, &len); - if(!res) { - if(!read) - ret = INTERNET_GetLastError(); - break; - } - - zstream->next_in = req->gzip_stream->buf; - zstream->avail_in = len; - } - - zstream->next_out = buf+read; - zstream->avail_out = size-read; - zres = inflate(zstream, Z_FULL_FLUSH); - read = size - zstream->avail_out; - if(zres == Z_STREAM_END) { - TRACE("end of data\n"); - req->dwContentLength = req->dwContentRead + req->read_size + read; - break; - }else if(zres != Z_OK) { - WARN("inflate failed %d\n", zres); - if(!read) - ret = ERROR_INTERNET_DECODING_FAILED; - break; - } - } -#endif - - *read_ret = read; - return ret; -} - /* read some more data into the read buffer (the read section must be held) */ static BOOL read_more_data( WININETHTTPREQW *req, int maxlen ) { @@ -1820,14 +1764,9 @@ static BOOL read_more_data( WININETHTTPREQW *req, int maxlen ) if (maxlen == -1) maxlen = sizeof(req->read_buf); - if (req->gzip_stream) { - if(read_gzip_data(req, req->read_buf + req->read_size, maxlen - req->read_size, 0, &len) != ERROR_SUCCESS) - return FALSE; - }else { - if(!NETCON_recv( &req->netConnection, req->read_buf + req->read_size, - maxlen - req->read_size, 0, &len )) - return FALSE; - } + if(!NETCON_recv( &req->netConnection, req->read_buf + req->read_size, + maxlen - req->read_size, 0, &len )) + return FALSE; req->read_size += len; return TRUE; @@ -1939,17 +1878,10 @@ static BOOL start_next_chunk( WININETHTTPREQW *req ) } } -/* return the size of data available to be read immediately (the read section must be held) */ -static DWORD get_avail_data( WININETHTTPREQW *req ) -{ - if (req->read_chunked && (req->dwContentLength == ~0u || req->dwContentLength == req->dwContentRead)) - return 0; - return min( req->read_size, req->dwContentLength - req->dwContentRead ); -} - /* check if we have reached the end of the data to read (the read section must be held) */ static BOOL end_of_read_data( WININETHTTPREQW *req ) { + if (req->gzip_stream) return req->gzip_stream->end_of_data && !req->gzip_stream->buf_size; if (req->read_chunked) return (req->dwContentLength == 0); if (req->dwContentLength == ~0u) return FALSE; return (req->dwContentLength == req->dwContentRead); @@ -1973,6 +1905,76 @@ static BOOL refill_buffer( WININETHTTPREQW *req ) return TRUE; } +static DWORD read_gzip_data(WININETHTTPREQW *req, BYTE *buf, int size, BOOL sync, int *read_ret) +{ + DWORD ret = ERROR_SUCCESS; + int read = 0; + +#ifdef HAVE_ZLIB + z_stream *zstream = &req->gzip_stream->zstream; + int zres; + + while(read < size && !req->gzip_stream->end_of_data) { + if(!req->read_size) { + if(!sync || !refill_buffer(req)) + break; + } + + zstream->next_in = req->read_buf+req->read_pos; + zstream->avail_in = req->read_size; + zstream->next_out = buf+read; + zstream->avail_out = size-read; + zres = inflate(zstream, Z_FULL_FLUSH); + read = size - zstream->avail_out; + remove_data(req, req->read_size-zstream->avail_in); + if(zres == Z_STREAM_END) { + TRACE("end of data\n"); + req->gzip_stream->end_of_data = TRUE; + }else if(zres != Z_OK) { + WARN("inflate failed %d\n", zres); + if(!read) + ret = ERROR_INTERNET_DECODING_FAILED; + break; + } + } +#endif + + *read_ret = read; + return ret; +} + +static void refill_gzip_buffer(WININETHTTPREQW *req) +{ + DWORD res; + int len; + + if(!req->gzip_stream || !req->read_size || req->gzip_stream->buf_size == sizeof(req->gzip_stream->buf)) + return; + + if(req->gzip_stream->buf_pos) { + if(req->gzip_stream->buf_size) + memmove(req->gzip_stream->buf, req->gzip_stream->buf + req->gzip_stream->buf_pos, req->gzip_stream->buf_size); + req->gzip_stream->buf_pos = 0; + } + + res = read_gzip_data(req, req->gzip_stream->buf + req->gzip_stream->buf_size, + sizeof(req->gzip_stream->buf) - req->gzip_stream->buf_size, FALSE, &len); + if(res == ERROR_SUCCESS) + req->gzip_stream->buf_size += len; +} + +/* return the size of data available to be read immediately (the read section must be held) */ +static DWORD get_avail_data( WININETHTTPREQW *req ) +{ + if (req->gzip_stream) { + refill_gzip_buffer(req); + return req->gzip_stream->buf_size; + } + if (req->read_chunked && (req->dwContentLength == ~0u || req->dwContentLength == req->dwContentRead)) + return 0; + return min( req->read_size, req->dwContentLength - req->dwContentRead ); +} + static void HTTP_ReceiveRequestData(WININETHTTPREQW *req, BOOL first_notif) { INTERNET_ASYNC_RESULT iar; @@ -1996,37 +1998,51 @@ static void HTTP_ReceiveRequestData(WININETHTTPREQW *req, BOOL first_notif) /* read data from the http connection (the read section must be held) */ static DWORD HTTPREQ_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync) { + BOOL finished_reading = FALSE; int len, bytes_read = 0; DWORD ret = ERROR_SUCCESS; EnterCriticalSection( &req->read_section ); + if (req->read_chunked && (req->dwContentLength == ~0u || req->dwContentLength == req->dwContentRead)) { if (!start_next_chunk( req )) goto done; } - if (req->dwContentLength != ~0u) size = min( size, req->dwContentLength - req->dwContentRead ); - if (req->read_size) - { - bytes_read = min( req->read_size, size ); - memcpy( buffer, req->read_buf + req->read_pos, bytes_read ); - remove_data( req, bytes_read ); - } + if(req->gzip_stream) { + if(req->gzip_stream->buf_size) { + bytes_read = min(req->gzip_stream->buf_size, size); + memcpy(buffer, req->gzip_stream->buf + req->gzip_stream->buf_pos, bytes_read); + req->gzip_stream->buf_pos += bytes_read; + req->gzip_stream->buf_size -= bytes_read; + }else if(!req->read_size && !req->gzip_stream->end_of_data) { + refill_buffer(req); + } - if (size > bytes_read) - { - if (req->gzip_stream) { - if(is_gzip_buf_empty(req->gzip_stream) || !bytes_read || sync) { - ret = read_gzip_data(req, (BYTE*)buffer+bytes_read, size - bytes_read, sync ? MSG_WAITALL : 0, &len); - if(ret == ERROR_SUCCESS) - bytes_read += len; - } - }else if (!bytes_read || sync) { + if(size > bytes_read) { + ret = read_gzip_data(req, (BYTE*)buffer+bytes_read, size-bytes_read, sync, &len); + if(ret == ERROR_SUCCESS) + bytes_read += len; + } + + finished_reading = req->gzip_stream->end_of_data && !req->gzip_stream->buf_size; + }else { + if (req->dwContentLength != ~0u) size = min( size, req->dwContentLength - req->dwContentRead ); + + if (req->read_size) { + bytes_read = min( req->read_size, size ); + memcpy( buffer, req->read_buf + req->read_pos, bytes_read ); + remove_data( req, bytes_read ); + } + + if (size > bytes_read && (!bytes_read || sync)) { if (NETCON_recv( &req->netConnection, (char *)buffer + bytes_read, size - bytes_read, sync ? MSG_WAITALL : 0, &len)) bytes_read += len; /* always return success, even if the network layer returns an error */ } + + finished_reading = !bytes_read && req->dwContentRead == req->dwContentLength; } done: req->dwContentRead += bytes_read; @@ -2044,7 +2060,7 @@ done: WARN("WriteFile failed: %u\n", GetLastError()); } - if(!bytes_read && (req->dwContentRead == req->dwContentLength)) + if(finished_reading) HTTP_FinishedReading(req); return ret; @@ -3255,8 +3271,6 @@ static LPWSTR HTTP_GetRedirectURL(LPWININETHTTPREQW lpwhr, LPCWSTR lpszUrl) LPWSTR orig_url; LPWSTR combined_url; - if (lpszUrl[0]=='/') return WININET_strdupW( lpszUrl ); - urlComponents.dwStructSize = sizeof(URL_COMPONENTSW); urlComponents.lpszScheme = (lpwhr->hdr.dwFlags & INTERNET_FLAG_SECURE) ? szHttps : szHttp; urlComponents.dwSchemeLength = 0; diff --git a/dlls/winmm/tests/wave.c b/dlls/winmm/tests/wave.c index b509f74c909..97544c0f95a 100644 --- a/dlls/winmm/tests/wave.c +++ b/dlls/winmm/tests/wave.c @@ -640,7 +640,7 @@ static void wave_out_test_deviceOut(int device, double duration, trace("CALLBACK_THREAD not implemented\n"); CloseHandle(hevent); return; - } else if (flags && CALLBACK_TYPEMASK) { + } else if (flags & CALLBACK_TYPEMASK) { trace("Undefined callback type!\n"); CloseHandle(hevent); return; diff --git a/dlls/wintrust/softpub.c b/dlls/wintrust/softpub.c index 9a78838839a..9c79fa8bcd3 100644 --- a/dlls/wintrust/softpub.c +++ b/dlls/wintrust/softpub.c @@ -90,7 +90,9 @@ static BOOL SOFTPUB_GetFileSubject(CRYPT_PROVIDER_DATA *data) { BOOL ret; - if (!data->pWintrustData->u.pFile->pgKnownSubject) + if (!WVT_ISINSTRUCT(WINTRUST_FILE_INFO, + data->pWintrustData->u.pFile->cbStruct, pgKnownSubject) || + !data->pWintrustData->u.pFile->pgKnownSubject) { ret = CryptSIPRetrieveSubjectGuid( data->pWintrustData->u.pFile->pcwszFilePath, @@ -1058,3 +1060,15 @@ HRESULT WINAPI SoftpubCleanup(CRYPT_PROVIDER_DATA *data) return S_OK; } + +HRESULT WINAPI HTTPSCertificateTrust(CRYPT_PROVIDER_DATA *data) +{ + FIXME("(%p)\n", data); + return S_OK; +} + +HRESULT WINAPI HTTPSFinalProv(CRYPT_PROVIDER_DATA *data) +{ + FIXME("(%p)\n", data); + return S_OK; +} diff --git a/dlls/wintrust/wintrust.spec b/dlls/wintrust/wintrust.spec index 9c5b1cb8e20..602d4bd79cc 100644 --- a/dlls/wintrust/wintrust.spec +++ b/dlls/wintrust/wintrust.spec @@ -48,8 +48,8 @@ @ stub FindCertsByIssuer @ stdcall GenericChainCertificateTrust(ptr) @ stdcall GenericChainFinalProv(ptr) -@ stub HTTPSCertificateTrust -@ stub HTTPSFinalProv +@ stdcall HTTPSCertificateTrust(ptr) +@ stdcall HTTPSFinalProv(ptr) @ stub IsCatalogFile @ stub MsCatConstructHashTag @ stub MsCatFreeHashTag diff --git a/documentation/Makefile.in b/documentation/Makefile.in index 4723a540731..ece117cd5c0 100644 --- a/documentation/Makefile.in +++ b/documentation/Makefile.in @@ -4,7 +4,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = none -INSTALLDIRS = man$(api_manext) html api-guide $(DESTDIR)$(mandir)/man$(api_manext) +INSTALLDIRS = man$(api_manext) html api-guide api-guide-xml $(DESTDIR)$(mandir)/man$(api_manext) @MAKE_RULES@ @@ -17,10 +17,13 @@ htmlpages: html dummy sgmlpages: api-guide dummy @cd $(DLLDIR) && $(MAKE) doc-sgml -.PHONY: manpages htmlpages sgmlpages install-man +xmlpages: api-guide-xml dummy + @cd $(DLLDIR) && $(MAKE) doc-xml + +.PHONY: manpages htmlpages sgmlpages xmlpages install-man install-man:: manpages $(DESTDIR)$(mandir)/man$(api_manext) for i in man$(api_manext)/*.$(api_manext); do $(INSTALL_DATA) $$i $(DESTDIR)$(mandir)/$$i; done clean:: - $(RM) -r html api-guide man$(api_manext) + $(RM) -r html api-guide api-guide-xml man$(api_manext) diff --git a/include/Makefile.in b/include/Makefile.in index be2762ad62f..3d80857af41 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -77,6 +77,7 @@ PUBLIC_IDL_H_SRCS = \ urlhist.idl \ urlmon.idl \ vmr9.idl \ + wincodec.idl \ wine/itss.idl \ wine/svcctl.idl \ wtypes.idl \ diff --git a/include/commctrl.h b/include/commctrl.h index e39f4a2391f..6347dffc907 100644 --- a/include/commctrl.h +++ b/include/commctrl.h @@ -736,6 +736,8 @@ static const WCHAR WC_HEADERW[] = { 'S','y','s','H','e','a','d','e','r','3','2', #define HDS_FILTERBAR 0x0100 #define HDS_FLAT 0x0200 #define HDS_CHECKBOXES 0x0400 +#define HDS_NOSIZING 0x0800 +#define HDS_OVERFLOW 0x1000 #define HDI_WIDTH 0x0001 #define HDI_HEIGHT HDI_WIDTH @@ -747,6 +749,9 @@ static const WCHAR WC_HEADERW[] = { 'S','y','s','H','e','a','d','e','r','3','2', #define HDI_DI_SETITEM 0x0040 #define HDI_ORDER 0x0080 #define HDI_FILTER 0x0100 +#define HDI_STATE 0x0200 + +#define HDIS_FOCUSED 0x00000001 #define HDF_LEFT 0x0000 #define HDF_RIGHT 0x0001 @@ -763,6 +768,7 @@ static const WCHAR WC_HEADERW[] = { 'S','y','s','H','e','a','d','e','r','3','2', #define HDF_BITMAP 0x2000 #define HDF_STRING 0x4000 #define HDF_OWNERDRAW 0x8000 +#define HDF_SPLITBUTTON 0x1000000 #define HHT_NOWHERE 0x0001 #define HHT_ONHEADER 0x0002 @@ -775,6 +781,8 @@ static const WCHAR WC_HEADERW[] = { 'S','y','s','H','e','a','d','e','r','3','2', #define HHT_TORIGHT 0x0400 #define HHT_TOLEFT 0x0800 #define HHT_ONITEMSTATEICON 0x1000 +#define HHT_ONDROPDOWN 0x2000 +#define HHT_ONOVERFLOW 0x4000 #define HDM_FIRST 0x1200 #define HDM_GETITEMCOUNT (HDM_FIRST+0) @@ -862,10 +870,14 @@ typedef struct _HD_ITEMA INT cchTextMax; INT fmt; LPARAM lParam; + /* (_WIN32_IE >= 0x0300) */ INT iImage; INT iOrder; + /* (_WIN32_IE >= 0x0500) */ UINT type; LPVOID pvFilter; + /* (_WIN32_WINNT >= 0x0600) */ + UINT state; } HDITEMA, *LPHDITEMA; typedef struct _HD_ITEMW @@ -877,10 +889,14 @@ typedef struct _HD_ITEMW INT cchTextMax; INT fmt; LPARAM lParam; + /* (_WIN32_IE >= 0x0300) */ INT iImage; INT iOrder; + /* (_WIN32_IE >= 0x0500) */ UINT type; LPVOID pvFilter; + /* (_WIN32_WINNT >= 0x0600) */ + UINT state; } HDITEMW, *LPHDITEMW; #define HDITEM WINELIB_NAME_AW(HDITEM) @@ -2506,6 +2522,9 @@ typedef struct { INT cChildren; LPARAM lParam; INT iIntegral; + UINT uStateEx; /* _WIN32_IE >= 0x600 */ + HWND hwnd; /* _WIN32_IE >= 0x600 */ + INT iExpandedImage; /* _WIN32_IE >= 0x600 */ } TVITEMEXA, *LPTVITEMEXA; typedef struct { @@ -2520,6 +2539,9 @@ typedef struct { INT cChildren; LPARAM lParam; INT iIntegral; + UINT uStateEx; /* _WIN32_IE >= 0x600 */ + HWND hwnd; /* _WIN32_IE >= 0x600 */ + INT iExpandedImage; /* _WIN32_IE >= 0x600 */ } TVITEMEXW, *LPTVITEMEXW; #define TVITEMEX WINELIB_NAME_AW(TVITEMEX) @@ -2595,8 +2617,20 @@ typedef struct tagTVDISPINFOW { TVITEMW item; } NMTVDISPINFOW, *LPNMTVDISPINFOW; +typedef struct tagTVDISPINFOEXA { + NMHDR hdr; + TVITEMEXA item; +} NMTVDISPINFOEXA, *LPNMTVDISPINFOEXA; + +typedef struct tagTVDISPINFOEXW { + NMHDR hdr; + TVITEMEXW item; +} NMTVDISPINFOEXW, *LPNMTVDISPINFOEXW; + #define NMTVDISPINFO WINELIB_NAME_AW(NMTVDISPINFO) #define LPNMTVDISPINFO WINELIB_NAME_AW(LPNMTVDISPINFO) +#define NMTVDISPINFOEX WINELIB_NAME_AW(NMTVDISPINFOEX) +#define LPNMTVDISPINFOEX WINELIB_NAME_AW(LPNMTVDISPINFOEX) #define TV_DISPINFOA NMTVDISPINFOA #define TV_DISPINFOW NMTVDISPINFOW #define TV_DISPINFO NMTVDISPINFO @@ -3283,10 +3317,15 @@ typedef struct tagLVITEMA INT cchTextMax; INT iImage; LPARAM lParam; - INT iIndent; /* (_WIN32_IE >= 0x0300) */ - int iGroupId; /* (_WIN32_IE >= 0x560) */ - UINT cColumns; /* (_WIN32_IE >= 0x560) */ - PUINT puColumns; /* (_WIN32_IE >= 0x560) */ + /* (_WIN32_IE >= 0x0300) */ + INT iIndent; + /* (_WIN32_IE >= 0x0560) */ + INT iGroupId; + UINT cColumns; + PUINT puColumns; + /* (_WIN32_WINNT >= 0x0600) */ + PINT piColFmt; + INT iGroup; } LVITEMA, *LPLVITEMA; typedef struct tagLVITEMW @@ -3300,10 +3339,15 @@ typedef struct tagLVITEMW INT cchTextMax; INT iImage; LPARAM lParam; - INT iIndent; /* (_WIN32_IE >= 0x0300) */ - int iGroupId; /* (_WIN32_IE >= 0x560) */ - UINT cColumns; /* (_WIN32_IE >= 0x560) */ - PUINT puColumns; /* (_WIN32_IE >= 0x560) */ + /* (_WIN32_IE >= 0x0300) */ + INT iIndent; + /* (_WIN32_IE >= 0x0560) */ + INT iGroupId; + UINT cColumns; + PUINT puColumns; + /* (_WIN32_WINNT >= 0x0600) */ + PINT piColFmt; + INT iGroup; } LVITEMW, *LPLVITEMW; #define LVITEM WINELIB_NAME_AW(LVITEM) @@ -3313,6 +3357,10 @@ typedef struct tagLVITEMW #define LVITEM_V1_SIZEW CCSIZEOF_STRUCT(LVITEMW, lParam) #define LVITEM_V1_SIZE WINELIB_NAME_AW(LVITEM_V1_SIZE) +#define LVITEMA_V5_SIZE CCSIZEOF_STRUCT(LVITEMA, puColumns) +#define LVITEMW_V5_SIZE CCSIZEOF_STRUCT(LVITEMW, puColumns) +#define LVITEM_V5_SIZE WINELIB_NAME_AW(LVITEM_V5_SIZE) + #define LV_ITEM LVITEM #define LV_ITEMA LVITEMA #define LV_ITEMW LVITEMW @@ -3376,8 +3424,13 @@ typedef struct tagLVCOLUMNA LPSTR pszText; INT cchTextMax; INT iSubItem; - INT iImage; /* (_WIN32_IE >= 0x0300) */ - INT iOrder; /* (_WIN32_IE >= 0x0300) */ + /* (_WIN32_IE >= 0x0300) */ + INT iImage; + INT iOrder; + /* (_WIN32_WINNT >= 0x0600) */ + INT cxMin; + INT cxDefault; + INT cxIdeal; } LVCOLUMNA, *LPLVCOLUMNA; typedef struct tagLVCOLUMNW @@ -3388,8 +3441,13 @@ typedef struct tagLVCOLUMNW LPWSTR pszText; INT cchTextMax; INT iSubItem; - INT iImage; /* (_WIN32_IE >= 0x0300) */ - INT iOrder; /* (_WIN32_IE >= 0x0300) */ + /* (_WIN32_IE >= 0x0300) */ + INT iImage; + INT iOrder; + /* (_WIN32_WINNT >= 0x0600) */ + INT cxMin; + INT cxDefault; + INT cxIdeal; } LVCOLUMNW, *LPLVCOLUMNW; #define LVCOLUMN WINELIB_NAME_AW(LVCOLUMN) @@ -3495,6 +3553,8 @@ typedef struct tagLVHITTESTINFO UINT flags; INT iItem; INT iSubItem; + /* (_WIN32_WINNT >= 0x0600) */ + INT iGroup; } LVHITTESTINFO, *LPLVHITTESTINFO; #define LV_HITTESTINFO LVHITTESTINFO @@ -3533,15 +3593,32 @@ typedef struct LVGROUP UINT cbSize; UINT mask; LPWSTR pszHeader; - int cchHeader; + INT cchHeader; LPWSTR pszFooter; - int cchFooter; - int iGroupId; + INT cchFooter; + INT iGroupId; UINT stateMask; UINT state; UINT uAlign; + /* (_WIN32_WINNT >= 0x0600) */ + LPWSTR pszSubtitle; + UINT cchSubtitle; + LPWSTR pszTask; + UINT cchTask; + LPWSTR pszDescriptionTop; + UINT cchDescriptionTop; + LPWSTR pszDescriptionBottom; + UINT cchDescriptionBottom; + INT iTitleImage; + INT iExtendedImage; + INT iFirstItem; + UINT cItems; + LPWSTR pszSubsetTitle; + UINT cchSubsetTitle; } LVGROUP, *PLVGROUP; +#define LVGROUP_V5_SIZE CCSIZEOF_STRUCT(LVGROUP, uAlign) + typedef struct LVGROUPMETRICS { UINT cbSize; diff --git a/include/config.h.in b/include/config.h.in index a36d1fbc0db..c94523ed0ea 100644 --- a/include/config.h.in +++ b/include/config.h.in @@ -1191,6 +1191,9 @@ /* Define to a macro to generate an assembly function directive */ #undef __ASM_FUNC +/* Define to a macro to generate an assembly function */ +#undef __ASM_GLOBAL_FUNC + /* Define to a macro to generate an assembly name from a C symbol */ #undef __ASM_NAME diff --git a/include/wincodec.idl b/include/wincodec.idl new file mode 100644 index 00000000000..abb4d088100 --- /dev/null +++ b/include/wincodec.idl @@ -0,0 +1,304 @@ +/* + * Copyright 2009 Vincent Povirk for CodeWeavers + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +import "wtypes.idl"; +import "propidl.idl"; +import "objidl.idl"; +import "ocidl.idl"; + +#define CODEC_FORCE_DWORD 0x7fffffff + +typedef enum WICDecodeOptions { + WICDecodeMetadataCacheOnDemand = 0x00000000, + WICDecodeMetadataCacheOnLoad = 0x00000001, + WICMETADATACACHEOPTION_FORCE_DWORD = CODEC_FORCE_DWORD +} WICDecodeOptions; + +typedef enum WICBitmapCreateCacheOption { + WICBitmapNoCache = 0x00000000, + WICBitmapCacheOnDemand = 0x00000001, + WICBitmapCacheOnLoad = 0x00000002, + WICBITMAPCREATECACHEOPTION_FORCE_DWORD = CODEC_FORCE_DWORD +} WICBitmapCreateCacheOption; + +typedef enum WICBitmapAlphaChannelOption { + WICBitmapUseAlpha = 0x00000000, + WICBitmapUsePremultipliedAlpha = 0x00000001, + WICBitmapIgnoreAlpha = 0x00000002, + WICBITMAPALPHACHANNELOPTIONS_FORCE_DWORD = CODEC_FORCE_DWORD +} WICBitmapAlphaChannelOption; + +typedef GUID WICPixelFormatGUID; +typedef REFGUID REFWICPixelFormatGUID; + +typedef struct WICRect { + INT X; + INT Y; + INT Width; + INT Height; +} WICRect; + +interface IWICBitmap; +interface IWICComponentInfo; +interface IWICBitmapEncoder; +interface IWICPalette; +interface IWICFormatConverter; +interface IWICBitmapScaler; +interface IWICBitmapClipper; +interface IWICBitmapFlipRotator; +interface IWICStream; +interface IWICColorContext; +interface IWICColorTransform; +interface IWICFastMetadataEncoder; +interface IWICMetadataQueryReader; +interface IWICMetadataQueryWriter; +interface IWICBitmapDecoderInfo; + +[ + object, + uuid(00000120-a8f2-4877-ba0a-fd2b6645fb94) +] +interface IWICBitmapSource : IUnknown +{ + HRESULT GetSize( + [out] UINT *puiWidth, + [out] UINT *puiHeight); + + HRESULT GetPixelFormat( + [out] WICPixelFormatGUID *pPixelFormat); + + HRESULT GetResolution( + [out] double *pDpiX, + [out] double *pDpiY); + + HRESULT CopyPalette( + [in] IWICPalette *pIPalette); + + HRESULT CopyPixels( + [in] const WICRect *prc, + [in] UINT cbStride, + [in] UINT cbBufferSize, + [out, size_is(cbBufferSize)] BYTE *pbBuffer); +} + +[ + object, + uuid(3b16811b-6a43-4ec9-a813-3d930c13b940) +] +interface IWICBitmapFrameDecode : IWICBitmapSource +{ + HRESULT GetMetadataQueryReader( + [out] IWICMetadataQueryReader **ppIMetadataQueryReader); + + HRESULT GetColorContexts( + [in] UINT cCount, + [in, out, unique, size_is(cCount)] IWICColorContext **ppIColorContexts, + [out] UINT *pcActualCount); + + HRESULT GetThumbnail( + [out] IWICBitmapSource **ppIThumbnail); +} + +[ + object, + uuid(9edde9e7-8dee-47ea-99df-e6faf2ed44bf) +] +interface IWICBitmapDecoder : IUnknown +{ + HRESULT QueryCapability( + [in] IStream *pIStream, + [out] DWORD *pdwCapability); + + HRESULT Initialize( + [in] IStream *pIStream, + [in] WICDecodeOptions cacheOptions); + + HRESULT GetContainerFormat( + [out] GUID *pguidContainerFormat); + + HRESULT GetDecoderInfo( + [out] IWICBitmapDecoderInfo **ppIDecoderInfo); + + HRESULT CopyPalette( + [in] IWICPalette *pIPalette); + + HRESULT GetMetadataQueryReader( + [out] IWICMetadataQueryReader **ppIMetadataQueryReader); + + HRESULT GetPreview( + [out] IWICBitmapSource **ppIBitmapSource); + + HRESULT GetColorContexts( + [in] UINT cCount, + [in, out, unique, size_is(cCount)] IWICColorContext **ppIColorContexts, + [out] UINT *pcActualCount); + + HRESULT GetThumbnail( + [out] IWICBitmapSource **ppIThumbnail); + + HRESULT GetFrameCount( + [out] UINT *pCount); + + HRESULT GetFrame( + [in] UINT index, + [out] IWICBitmapFrameDecode **ppIBitmapFrame); +} + +cpp_quote("DEFINE_GUID(CLSID_WICImagingFactory, 0xcacaf262,0x9370,0x4615,0xa1,0x3b,0x9f,0x55,0x39,0xda,0x4c,0x0a);") + +[ + object, + uuid(ec5ec8a9-c395-4314-9c77-54d7a935ff70) +] +interface IWICImagingFactory : IUnknown +{ + HRESULT CreateDecoderFromFilename( + [in] LPCWSTR wzFilename, + [in, unique] const GUID *pguidVendor, + [in] DWORD dwDesiredAccess, + [in] WICDecodeOptions metadataOptions, + [out, retval] IWICBitmapDecoder **ppIDecoder); + + HRESULT CreateDecoderFromStream( + [in] IStream *pIStream, + [in, unique] const GUID *pguidVendor, + [in] WICDecodeOptions metadataOptions, + [out, retval] IWICBitmapDecoder **ppIDecoder); + + HRESULT CreateDecoderFromFileHandle( + [in] ULONG_PTR hFile, + [in, unique] const GUID *pguidVendor, + [in] WICDecodeOptions metadataOptions, + [out, retval] IWICBitmapDecoder **ppIDecoder); + + HRESULT CreateComponentInfo( + [in] REFCLSID clsidComponent, + [out] IWICComponentInfo **ppIInfo); + + HRESULT CreateDecoder( + [in] REFGUID guidContainerFormat, + [in, unique] const GUID *pguidVendor, + [out, retval] IWICBitmapDecoder **ppIDecoder); + + HRESULT CreateEncoder( + [in] REFGUID guidContainerFormat, + [in, unique] const GUID *pguidVendor, + [out, retval] IWICBitmapEncoder **ppIEncoder); + + HRESULT CreatePalette( + [out] IWICPalette **ppIPalette); + + HRESULT CreateFormatConverter( + [out] IWICFormatConverter **ppIFormatConverter); + + HRESULT CreateBitmapScaler( + [out] IWICBitmapScaler **ppIBitmapScaler); + + HRESULT CreateBitmapClipper( + [out] IWICBitmapClipper **ppIBitmapClipper); + + HRESULT CreateBitmapFlipRotator( + [out] IWICBitmapFlipRotator **ppIBitmapFlipRotator); + + HRESULT CreateStream( + [out] IWICStream **ppIWICStream); + + HRESULT CreateColorContext( + [out] IWICColorContext **ppIWICColorContext); + + HRESULT CreateColorTransformer( + [out] IWICColorTransform **ppIWICColorTransform); + + HRESULT CreateBitmap( + [in] UINT uiWidth, + [in] UINT uiHeight, + [in] REFWICPixelFormatGUID pixelFormat, + [in] WICBitmapCreateCacheOption option, + [out] IWICBitmap **ppIBitmap); + + HRESULT CreateBitmapFromSource( + [in] IWICBitmapSource *piBitmapSource, + [in] WICBitmapCreateCacheOption option, + [out] IWICBitmap **ppIBitmap); + + HRESULT CreateBitmapFromSourceRect( + [in] IWICBitmapSource *piBitmapSource, + [in] UINT x, + [in] UINT y, + [in] UINT width, + [in] UINT height, + [out] IWICBitmap **ppIBitmap); + + HRESULT CreateBitmapFromMemory( + [in] UINT uiWidth, + [in] UINT uiHeight, + [in] REFWICPixelFormatGUID pixelFormat, + [in] UINT cbStride, + [in] UINT cbBufferSize, + [in, size_is(cbBufferSize)] BYTE *pbBuffer, + [out] IWICBitmap **ppIBitmap); + + HRESULT CreateBitmapFromHBITMAP( + [in] HBITMAP hBitmap, + [in, unique] HPALETTE hPalette, + [in] WICBitmapAlphaChannelOption options, + [out] IWICBitmap **ppIBitmap); + + HRESULT CreateBitmapFromHICON( + [in] HICON hIcon, + [out] IWICBitmap **ppIBitmap); + + HRESULT CreateComponentEnumerator( + [in] DWORD componentTypes, + [in] DWORD options, + [out] IEnumUnknown **ppIEnumUnknown); + + HRESULT CreateFastMetadataEncoderFromDecoder( + [in] IWICBitmapDecoder *pIDecoder, + [out] IWICFastMetadataEncoder **ppIFastEncoder); + + HRESULT CreateFastMetadataEncoderFromFrameDecode( + [in] IWICBitmapFrameDecode *pIFrameDecoder, + [out] IWICFastMetadataEncoder **ppIFastEncoder); + + HRESULT CreateQueryWriter( + [in] REFGUID guidMetadataFormat, + [in, unique] const GUID *pguidVendor, + [out] IWICMetadataQueryWriter **ppIQueryWriter); + + HRESULT CreateQueryWriterFromReader( + [in] IWICMetadataQueryReader *pIQueryReader, + [in, unique] const GUID *pguidVendor, + [out] IWICMetadataQueryWriter **ppIQueryWriter); +} + +cpp_quote("DEFINE_GUID(CLSID_WICBmpDecoder, 0x6b462062,0x7cbf,0x400d,0x9f,0xdb,0x81,0x3d,0xd1,0x0f,0x27,0x78);") +cpp_quote("DEFINE_GUID(CLSID_WICPngDecoder, 0x389ea17b,0x5078,0x4cde,0xb6,0xef,0x25,0xc1,0x51,0x75,0xc7,0x51);") +cpp_quote("DEFINE_GUID(CLSID_WICIcoDecoder, 0xc61bfcdf,0x2e0f,0x4aad,0xa8,0xd7,0xe0,0x6b,0xaf,0xeb,0xcd,0xfe);") +cpp_quote("DEFINE_GUID(CLSID_WICJpegDecoder, 0x9456a480,0xe88b,0x43ea,0x9e,0x73,0x0b,0x2d,0x9b,0x71,0xb1,0xca);") +cpp_quote("DEFINE_GUID(CLSID_WICGifDecoder, 0x381dda3c,0x9ce9,0x4834,0xa2,0x3e,0x1f,0x98,0xf8,0xfc,0x52,0xbe);") +cpp_quote("DEFINE_GUID(CLSID_WICTiffDecoder, 0xb54e85d9,0xfe23,0x499f,0x8b,0x88,0x6a,0xce,0xa7,0x13,0x75,0x2b);") +cpp_quote("DEFINE_GUID(CLSID_WICWmpDecoder, 0xa26cec36,0x234c,0x4950,0xae,0x16,0xe3,0x4a,0xac,0xe7,0x1d,0x0d);") + +cpp_quote("DEFINE_GUID(GUID_ContainerFormatBmp, 0x0af1d87e,0xfcfe,0x4188,0xbd,0xeb,0xa7,0x90,0x64,0x71,0xcb,0xe3);") +cpp_quote("DEFINE_GUID(GUID_ContainerFormatPng, 0x1b7cfaf4,0x713f,0x473c,0xbb,0xcd,0x61,0x37,0x42,0x5f,0xae,0xaf);") +cpp_quote("DEFINE_GUID(GUID_ContainerFormatIco, 0xa3a860c4,0x338f,0x4c17,0x91,0x9a,0xfb,0xa4,0xb5,0x62,0x8f,0x21);") +cpp_quote("DEFINE_GUID(GUID_ContainerFormatJpeg, 0x19e4a5aa,0x5662,0x4fc5,0xa0,0xc0,0x17,0x58,0x02,0x8e,0x10,0x57);") +cpp_quote("DEFINE_GUID(GUID_ContainerFormatTiff, 0x163bcc30,0xe2e9,0x4f0b,0x96,0x1d,0xa3,0xe9,0xfd,0xb7,0x88,0xa3);") +cpp_quote("DEFINE_GUID(GUID_ContainerFormatGif, 0x1f8a5601,0x7d4d,0x4cbd,0x9c,0x82,0x1b,0xc8,0xd4,0xee,0xb9,0xa5);") +cpp_quote("DEFINE_GUID(GUID_ContainerFormatWmp, 0x57a37caa,0x367a,0x4540,0x91,0x6b,0xf1,0x83,0xc5,0x09,0x3a,0x4b);") diff --git a/include/wine/port.h b/include/wine/port.h index 6318374928b..0a631689e09 100644 --- a/include/wine/port.h +++ b/include/wine/port.h @@ -201,29 +201,6 @@ struct statvfs #endif -/* Macros to define assembler functions somewhat portably */ - -#if defined(__GNUC__) && !defined(__INTERIX) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(__APPLE__) -# define __ASM_GLOBAL_FUNC(name,code) \ - __asm__( ".text\n\t" \ - ".align 4\n\t" \ - ".globl " __ASM_NAME(#name) "\n\t" \ - __ASM_FUNC(#name) "\n" \ - __ASM_NAME(#name) ":\n\t" \ - code \ - "\n\t.previous" ); -#else /* defined(__GNUC__) && !defined(__MINGW32__) && !defined(__APPLE__) */ -# define __ASM_GLOBAL_FUNC(name,code) \ - void __asm_dummy_##name(void) { \ - asm( ".align 4\n\t" \ - ".globl " __ASM_NAME(#name) "\n\t" \ - __ASM_FUNC(#name) "\n" \ - __ASM_NAME(#name) ":\n\t" \ - code ); \ - } -#endif /* __GNUC__ */ - - /**************************************************************** * Function definitions (only when using libwine_port) */ diff --git a/include/wine/wined3d.idl b/include/wine/wined3d.idl index 51d886c85c6..58550822f2b 100644 --- a/include/wine/wined3d.idl +++ b/include/wine/wined3d.idl @@ -1737,14 +1737,14 @@ typedef struct _WINED3DSURFACE_DESC typedef struct _WINED3DVOLUME_DESC { - WINED3DFORMAT *Format; - WINED3DRESOURCETYPE *Type; - DWORD *Usage; - WINED3DPOOL *Pool; - UINT *Size; - UINT *Width; - UINT *Height; - UINT *Depth; + WINED3DFORMAT Format; + WINED3DRESOURCETYPE Type; + DWORD Usage; + WINED3DPOOL Pool; + UINT Size; + UINT Width; + UINT Height; + UINT Depth; } WINED3DVOLUME_DESC; typedef struct _WINED3DCLIPSTATUS @@ -2932,7 +2932,6 @@ interface IWineD3DDevice : IWineD3DBase [in] BOOL discard, [in] UINT level, [out] IWineD3DSurface **surface, - [in] WINED3DRESOURCETYPE resource_type, [in] DWORD usage, [in] WINED3DPOOL pool, [in] WINED3DMULTISAMPLE_TYPE multisample_type, diff --git a/programs/notepad/Fr.rc b/programs/notepad/Fr.rc index ee6d7e2b436..506fd523b41 100644 --- a/programs/notepad/Fr.rc +++ b/programs/notepad/Fr.rc @@ -4,6 +4,7 @@ * Copyright 1997,98 Marcel Baur * Translation by Laurent Buffler * Copyright 2002 Sylvain Petreolle + * Copytight 2009 Jonathan Ernst * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -53,6 +54,7 @@ POPUP " POPUP "&Rechercher" { MENUITEM "&Rechercher...\tCtrl+F", CMD_SEARCH MENUITEM "&Suivant\tF3", CMD_SEARCH_NEXT + MENUITEM "&Remplacer...\tCtrl+H", CMD_REPLACE } POPUP "Aid&e" { MENUITEM "&Sommaire", CMD_HELP_CONTENTS diff --git a/programs/reg/Fr.rc b/programs/reg/Fr.rc index 448f3da116c..671ebf69428 100644 --- a/programs/reg/Fr.rc +++ b/programs/reg/Fr.rc @@ -3,6 +3,7 @@ * French language support * * Copyright 2008 Francois Gouget + * Copyright 2009 Jonathan Ernst * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -27,4 +28,9 @@ STRINGTABLE STRING_ADD_USAGE, "REG ADD nom_de_clé [/v nom_de_valeur | /ve] [/t type] [/s séparateur] [/d donnée] [/f]\n" STRING_DELETE_USAGE, "REG DELETE nom_de_clé [/v nom_de_valeur | /ve | /va] [/f]\n" STRING_QUERY_USAGE, "REG QUERY nom_de_clé [/v nom_de_valeur | /ve] [/s]\n" + STRING_SUCCESS, "L'opération s'est terminée avec succès\n" + STRING_INVALID_KEY, "Erreur : Nom de clé non valable\n" + STRING_INVALID_CMDLINE, "Erreur : Paramètre de ligne de commande non valable\n" + STRING_NO_REMOTE, "Erreur : Impossible d'ajouter des clés à une machine distante\n" + STRING_CANNOT_FIND, "Erreur : Le système n'a pas été en mesure de trouver la clé ou la valeur de registre spécifiée\n" } diff --git a/programs/regedit/Fr.rc b/programs/regedit/Fr.rc index cc8b671c04b..9e197cf6a51 100644 --- a/programs/regedit/Fr.rc +++ b/programs/regedit/Fr.rc @@ -3,7 +3,7 @@ * * Copyright 2002 Robert Dickenson * Copyright 2003 Vincent Béron - * Copyright 2005-2007 Jonathan Ernst + * Copyright 2005-2009 Jonathan Ernst * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -283,6 +283,7 @@ BEGIN ID_EDIT_COPYKEYNAME "Copie le nom de la clé sélectionnée vers le presse-papier" ID_EDIT_FIND "Recherche du texte dans une clé, une valeur ou des données" ID_EDIT_FINDNEXT "Recherche l'occurence suivante du texte de la dernière recherche" + ID_EDIT_EXPORT "Exporte la branche du registre sélectionnée dans un fichier texte" END STRINGTABLE DISCARDABLE diff --git a/programs/start/Cs.rc b/programs/start/Cs.rc index b319f8d77b3..1693f8b4b4e 100644 --- a/programs/start/Cs.rc +++ b/programs/start/Cs.rc @@ -37,6 +37,7 @@ Volby:\n\ /MAX[imalizovanì] Spustí program maximalizovanì.\n\ /R Spustí program normálnì (ani minimalizovaný ani maximalizovaný).\n\ /W Èeká na dokonèení spuštìného programu, vrací návratový kód.\n\ +/ProgIDOpen Open a document using the following progID.\n\ /L Zobrazí licenci.\n\ \n\ start.exe verze 0.2 Copyright (C) 2003, Dan Kegel\n\ diff --git a/programs/start/De.rc b/programs/start/De.rc index 3ab7aa000d9..4f54a5389a1 100644 --- a/programs/start/De.rc +++ b/programs/start/De.rc @@ -34,6 +34,7 @@ Optionen:\n\ /MAX[imized] Starte das Programm maximiert.\n\ /R[estored] Starte das Programm normal (weder minimiert noch maximiert).\n\ /W[ait] Wartet bis das gestartete Programm sich beendet,\n\t dann beendet sich start mit dessen Exitcode des Programmes.\n\ +/ProgIDOpen Open a document using the following progID.\n\ /L Zeige die Endbenutzerlizenz an.\n\ \n\ start.exe Version 0.2 Copyright (C) 2003, Dan Kegel\n\ diff --git a/programs/start/En.rc b/programs/start/En.rc index f44ba1151f5..0429fe9b8b8 100644 --- a/programs/start/En.rc +++ b/programs/start/En.rc @@ -34,6 +34,7 @@ Options:\n\ /R[estored] Start the program normally (neither minimized nor maximized).\n\ /W[ait] Wait for started program to finish, then exit with its exit code.\n\ /Unix Use a Unix filename and start the file like windows explorer.\n\ +/ProgIDOpen Open a document using the following progID.\n\ /L Show end-user license.\n\ \n\ start.exe version 0.2 Copyright (C) 2003, Dan Kegel\n\ diff --git a/programs/start/Es.rc b/programs/start/Es.rc index fd74d8f810d..ac1c6d73ab9 100644 --- a/programs/start/Es.rc +++ b/programs/start/Es.rc @@ -34,6 +34,7 @@ Opciones:\n\ /R[estored] Inicia el programa normalmente (ni minimizado ni maximizado).\n\ /W[ait] Espera que termine el programa iniciado y después sale con su código de salida.\n\ /Unix Usa un nombre de archivo de Unix e inicia el archivo como en el explorador de windows.\n\ +/ProgIDOpen Open a document using the following progID.\n\ /L Muestra la licencia para el usuario final.\n\ \n\ start.exe versión 0.2 Copyright (C) 2003, Dan Kegel\n\ diff --git a/programs/start/Fr.rc b/programs/start/Fr.rc index 7373637c8ad..a2c8fd77149 100644 --- a/programs/start/Fr.rc +++ b/programs/start/Fr.rc @@ -37,6 +37,7 @@ Options :\n\ /MAX[imized] Lance le programme maximisé.\n\ /R[estored] Lance le programme normalement (ni minimisé ni maximisé).\n\ /W[ait] Attend que le programme lancé se termine, et termine ensuite avec son code de sortie.\n\ +/ProgIDOpen Open a document using the following progID.\n\ /L Montre la licence d'utilisation.\n\ \n\ start.exe version 0.2 Copyright (C) 2003, Dan Kegel\n\ diff --git a/programs/start/It.rc b/programs/start/It.rc index aa83497ed22..42f59ace794 100644 --- a/programs/start/It.rc +++ b/programs/start/It.rc @@ -35,6 +35,7 @@ Options:\n\ /MAX[imized] Avvia il programma massimizato.\n\ /R[estored] Avvia il programma normalmente (nè minimizzato nè massimizato).\n\ /W[ait] Attendi l'uscita del programma, poi esci con il suo codice di uscita.\n\ +/ProgIDOpen Open a document using the following progID.\n\ /L Mostra l'accordo di licenza con l'utente finale.\n\ \n\ start.exe versione 0.2 Copyright (C) 2003, Dan Kegel\n\ diff --git a/programs/start/Ko.rc b/programs/start/Ko.rc index 6c177feb31e..bc58ebcfab9 100644 --- a/programs/start/Ko.rc +++ b/programs/start/Ko.rc @@ -35,6 +35,7 @@ Options:\n\ /R[estored] Ç®±×¸²À» º¸Åë»óÅ·Π½ÃÀÛ½ÃÅ°±â (ÃÖ¼ÒÈ­µµ ¾Æ´Ï°í ÃÖ´ëÈ­µµ ¾Æ´Ô).\n\ /W[ait] ½ÃÀÛµÈ Ç®±×¸²ÀÌ ³¡³¯ ¶§±îÁö ±â´Ù¸², ³¡³¯ ¶§ Á¾·áÄڵ带 ³²±è.\n\ /Unix À©µµ¿ì ÀͽºÇ÷ξÀÌ À¯´Ð½º ÆÄÀÏÀ̸§À» »ç¿ëÇؼ­ ½ÃÀÛ.\n\ +/ProgIDOpen Open a document using the following progID.\n\ /L »ç¿ëÀÚ ¶óÀ̼¾½º º¸¿©ÁÜ\n\ \n\ start.exe version 0.2 Copyright (C) 2003, Dan Kegel\n\ diff --git a/programs/start/Nl.rc b/programs/start/Nl.rc index 725789a9871..69012a153c9 100644 --- a/programs/start/Nl.rc +++ b/programs/start/Nl.rc @@ -34,6 +34,7 @@ Options:\n\ /R[estored] Start het programma normaal (noch geminimaliseerd noch gemaximaliseerd).\n\ /W[ait] Wacht totdat het gestarte programma is beëindigd, eindig dan met de exit code van dat programma.\n\ /Unix Gebruik een Unix bestandsnaam en start het bestand als de windows verkenner.\n\ +/ProgIDOpen Open a document using the following progID.\n\ /L Laat de gebruikerslicentie zien.\n\ \n\ start.exe version 0.2 Copyright (C) 2003, Dan Kegel\n\ diff --git a/programs/start/Pl.rc b/programs/start/Pl.rc index 514c19236ee..09b9f51e338 100644 --- a/programs/start/Pl.rc +++ b/programs/start/Pl.rc @@ -35,6 +35,7 @@ Opcje:\n\ /R[estored] Uruchamia program normalnie (bez minimalizacji ani maksymalizacji).\n\ /W[ait] Zaczekaj a¿ program zakoñczy dzia³anie (i zakoñcz\n\ \t kodem wyjœcia programu).\n\ +/ProgIDOpen Open a document using the following progID.\n\ /L Poka¿ licencjê u¿ytkownika.\n\ \n\ start.exe wersja 0.2 Copyright (C) 2003, Dan Kegel\n\ diff --git a/programs/start/Pt.rc b/programs/start/Pt.rc index 90302384825..51ff53bec82 100644 --- a/programs/start/Pt.rc +++ b/programs/start/Pt.rc @@ -34,6 +34,7 @@ Options:\n\ /MAX[imized] Inicia o programa maximizado.\n\ /R[estored] Inicia o programa normalmente (sem minimizar nem maximizar).\n\ /W[ait] Aguarda que o programa iniciado termine e então retorno um código (exit code).\n\ +/ProgIDOpen Open a document using the following progID.\n\ /L Mostra a licença ao usuário.\n\ \n\ start.exe version 0.2 Copyright (C) 2003, Dan Kegel\n\ diff --git a/programs/start/Ru.rc b/programs/start/Ru.rc index 3e9cf629d6b..97e98540761 100644 --- a/programs/start/Ru.rc +++ b/programs/start/Ru.rc @@ -34,6 +34,7 @@ start [options] /R[estored] Çàïóñòèòü ïðîãðàììó íîðìàëüíî (íå ìàêñèìèçèðîâàííî è íå ìèíèìèçèðîâàííî).\n\ /W[ait] Îæèäàòü çàâåðøåíèÿ çàïóùåííîé ïðîãðàììû è âûéòè ñ êîäîì å¸ âûõîäà.\n\ /Unix Èñïîëüçîâàòü ïóòü Unix äëÿ çàïóñêà ïðîãðàìû êàê âèíäîâñ ïðîâîäíèê.\n\ +/ProgIDOpen Open a document using the following progID.\n\ /L Ïîêàçàòü ëèöåíçèþ êîíå÷íîãî ïîëüçîâàòåëÿ.\n\ \n\ start.exe âåðñèÿ 0.2 Copyright (C) 2003, Dan Kegel\n\ diff --git a/programs/start/Si.rc b/programs/start/Si.rc index b7ff270e0cd..e10ddf79d56 100644 --- a/programs/start/Si.rc +++ b/programs/start/Si.rc @@ -35,6 +35,7 @@ Možnosti:\n\ /MAX[imized] Zažene program z razširjenim oknom.\n\ /R[estored] Zažene program z običajno velikostjo okna.\n\ /W[ait] Počaka, da se zagnani program zaključi, nato se zaključi in vrne izhodno kodo programa.\n\ +/ProgIDOpen Open a document using the following progID.\n\ /L Prikaže licenčno pogodbo.\n\ \n\ start.exe različica 0.2 Copyright (C) 2003, Dan Kegel\n\ diff --git a/programs/start/Tr.rc b/programs/start/Tr.rc index 28f15a206e2..de7a69d9d41 100644 --- a/programs/start/Tr.rc +++ b/programs/start/Tr.rc @@ -33,6 +33,7 @@ Se /MAX[imized] Ekraný kaplayacak þekilde baþlat.\n\ /R[estored] Programý normal bir þekilde baþlat (simge halinde veya büyütülmüþ halde olabilir).\n\ /W[ait] Baþlatýlmýþ programýn bitmesini bekle, sonra çýkýþ koduyla çýk.\n\ +/ProgIDOpen Open a document using the following progID.\n\ /L Son-kullanýcý lisansýný göster.\n\ \n\ start.exe sürüm 0.2 Telif Hakký (C) 2003, Dan Kegel\n\ diff --git a/programs/start/start.c b/programs/start/start.c index ed7df03099f..e58d4c03905 100644 --- a/programs/start/start.c +++ b/programs/start/start.c @@ -176,12 +176,15 @@ int wmain (int argc, WCHAR *argv[]) WCHAR *args = NULL; int i; int unix_mode = 0; + int progid_open = 0; WCHAR *dos_filename = NULL; WCHAR *parent_directory = NULL; DWORD binary_type; static const WCHAR openW[] = { 'o', 'p', 'e', 'n', 0 }; static const WCHAR unixW[] = { 'u', 'n', 'i', 'x', 0 }; + static const WCHAR progIDOpenW[] = + { 'p', 'r', 'o', 'g', 'I', 'D', 'O', 'p', 'e', 'n', 0}; memset(&sei, 0, sizeof(sei)); sei.cbSize = sizeof(sei); @@ -203,7 +206,7 @@ int wmain (int argc, WCHAR *argv[]) break; /* Unix paths can start with / so we have to assume anything following /U is not a flag */ - if (unix_mode) + if (unix_mode || progid_open) break; /* Handle all options in this word */ @@ -235,6 +238,15 @@ int wmain (int argc, WCHAR *argv[]) usage(); } break; + case 'p': + case 'P': + if (strncmpiW(&argv[i][ci], progIDOpenW, 17) == 0) + progid_open = 1; + else { + WINE_ERR("Option '%s' not recognized\n", wine_dbgstr_w( argv[i]+ci-1)); + usage(); + } + break; case 'w': case 'W': sei.fMask |= SEE_MASK_NOCLOSEPROCESS; @@ -252,12 +264,17 @@ int wmain (int argc, WCHAR *argv[]) if (i == argc) usage(); + if (progid_open) { + sei.lpClass = argv[i++]; + sei.fMask |= SEE_MASK_CLASSNAME; + } + sei.lpFile = argv[i++]; args = build_args( argc - i, &argv[i] ); sei.lpParameters = args; - if (unix_mode) { + if (unix_mode || progid_open) { LPWSTR (*CDECL wine_get_dos_file_name_ptr)(LPCSTR); char* multibyte_unixpath; int multibyte_unixpath_len; diff --git a/programs/winecfg/Nl.rc b/programs/winecfg/Nl.rc index b23e919769f..62068db334f 100644 --- a/programs/winecfg/Nl.rc +++ b/programs/winecfg/Nl.rc @@ -83,11 +83,11 @@ BEGIN COMBOBOX IDC_D3D_VSHADER_MODE,120,108,125,70,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP CONTROL "Pixel Shader toestaan (indien ondersteund door de hardware)",IDC_D3D_PSHADER_MODE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,126,230,10 - GROUPBOX " Screen &Resolution ",IDC_STATIC,8,151,244,93 + GROUPBOX " Scherm &Resolutie ",IDC_STATIC,8,151,244,93 CONTROL "", IDC_RES_TRACKBAR, "msctls_trackbar32",WS_TABSTOP,12,161,187,15 EDITTEXT IDC_RES_DPIEDIT,204,161,23,13,ES_NUMBER|WS_TABSTOP LTEXT "dpi",IDC_STATIC,235,163,10,8 - LTEXT "This is a sample text using 10 point Tahoma",IDC_RES_FONT_PREVIEW,15,181,230,55 + LTEXT "Dit is een tekst voorbeeld in Tahoma met puntgrootte 10",IDC_RES_FONT_PREVIEW,15,181,230,55 END IDD_DLLCFG DIALOG DISCARDABLE 0, 0, 260, 250 @@ -190,11 +190,11 @@ BEGIN COMBOBOX IDC_THEME_COLORCOMBO,15,48,112,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP LTEXT "Tekstgrootte:",IDC_THEME_SIZETEXT,135,40,110,8 COMBOBOX IDC_THEME_SIZECOMBO,135,48,110,14,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - LTEXT "Item:",IDC_STATIC,15,64,112,8 + LTEXT "Onderdeel:",IDC_STATIC,15,64,112,8 COMBOBOX IDC_SYSPARAM_COMBO,15,74,112,120,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP | CBS_SORT - LTEXT "Color:",IDC_SYSPARAM_COLOR_TEXT,135,64,25,8,WS_DISABLED + LTEXT "Kleur:",IDC_SYSPARAM_COLOR_TEXT,135,64,25,8,WS_DISABLED PUSHBUTTON "",IDC_SYSPARAM_COLOR,135,74,25,13,WS_DISABLED | BS_OWNERDRAW - LTEXT "Size:",IDC_SYSPARAM_SIZE_TEXT,166,64,30,8,WS_DISABLED + LTEXT "Grootte:",IDC_SYSPARAM_SIZE_TEXT,166,64,30,8,WS_DISABLED EDITTEXT IDC_SYSPARAM_SIZE,166,74,23,13,ES_AUTOHSCROLL | WS_TABSTOP | WS_DISABLED CONTROL "",IDC_SYSPARAM_SIZE_UD,UPDOWN_CLASS,UDS_SETBUDDYINT | WS_DISABLED,187,74,15,13 PUSHBUTTON "Font",IDC_SYSPARAM_FONT,208,74,37,13,WS_DISABLED diff --git a/programs/winedbg/rsrc_De.rc b/programs/winedbg/rsrc_De.rc index 25ab2769b3a..da04942544f 100644 --- a/programs/winedbg/rsrc_De.rc +++ b/programs/winedbg/rsrc_De.rc @@ -1,5 +1,5 @@ /* - * English Language Support + * German Language Support * * Copyright 2009 André Hentschel * diff --git a/programs/winemenubuilder/winemenubuilder.c b/programs/winemenubuilder/winemenubuilder.c index eeded0e45a0..fcdc356a2e7 100644 --- a/programs/winemenubuilder/winemenubuilder.c +++ b/programs/winemenubuilder/winemenubuilder.c @@ -50,7 +50,18 @@ * shared location for an "All Users" entry then do so. As a suggestion the * shared menu Wine base could be writable to the wine group, or a wineadm * group. - * + * Clean up fd.o menus when they are deleted in Windows. + * Generate icons for file open handlers to go into the "Open with..." + * list. What does Windows use, the default icon for the .EXE file? It's + * not in the registry. + * Associate applications under HKCR\Applications to open any MIME type + * (by associating with application/octet-stream, or how?). + * Clean up fd.o MIME types when they are deleted in Windows, their icons + * too. Very hard - once we associate them with fd.o, we can't tell whether + * they are ours or not, and the extension <-> MIME type mapping isn't + * one-to-one either. + * Wine's HKCR is broken - it doesn't merge HKCU\Software\Classes, so apps + * that write associations there won't associate (#17019). */ #include "config.h" @@ -1287,6 +1298,25 @@ static char* wchars_to_utf8_chars(LPCWSTR string) return ret; } +static char *slashes_to_minuses(const char *string) +{ + int i; + char *ret = HeapAlloc(GetProcessHeap(), 0, lstrlenA(string) + 1); + if (ret) + { + for (i = 0; string[i]; i++) + { + if (string[i] == '/') + ret[i] = '-'; + else + ret[i] = string[i]; + } + ret[i] = 0; + return ret; + } + return NULL; +} + static BOOL next_line(FILE *file, char **line, int *size) { int pos = 0; @@ -1525,6 +1555,7 @@ static CHAR* reg_get_valA(HKEY key, LPCSTR subkey, LPCSTR name) if (RegGetValueA(key, subkey, name, RRF_RT_REG_SZ, NULL, ret, &size) == ERROR_SUCCESS) return ret; } + HeapFree(GetProcessHeap(), 0, ret); } return NULL; } @@ -1540,6 +1571,7 @@ static WCHAR* reg_get_valW(HKEY key, LPCWSTR subkey, LPCWSTR name) if (RegGetValueW(key, subkey, name, RRF_RT_REG_SZ, NULL, ret, &size) == ERROR_SUCCESS) return ret; } + HeapFree(GetProcessHeap(), 0, ret); } return NULL; } @@ -1812,6 +1844,8 @@ static BOOL generate_associations(const char *xdg_data_home, const char *package WCHAR *commandW = NULL; WCHAR *friendlyDocNameW = NULL; char *friendlyDocNameA = NULL; + WCHAR *iconW = NULL; + char *iconA = NULL; WCHAR *contentTypeW = NULL; char *mimeTypeA = NULL; WCHAR *friendlyAppNameW = NULL; @@ -1837,6 +1871,19 @@ static BOOL generate_associations(const char *xdg_data_home, const char *package } } + iconW = assoc_query(ASSOCSTR_DEFAULTICON, extensionW, NULL); + if (iconW) + { + WCHAR *comma = strrchrW(iconW, ','); + int index = 0; + if (comma) + { + *comma = 0; + index = atoiW(comma + 1); + } + iconA = extract_icon(iconW, index, FALSE); + } + contentTypeW = assoc_query(ASSOCSTR_CONTENTTYPE, extensionW, NULL); if (!freedesktop_mime_type_for_extension(nativeMimeTypes, extensionA, extensionW, &mimeTypeA)) @@ -1851,6 +1898,25 @@ static BOOL generate_associations(const char *xdg_data_home, const char *package if (mimeTypeA != NULL) { + /* Gnome seems to ignore the tag in MIME packages, + * and the default name is more intuitive anyway. + */ + if (iconA) + { + char *flattened_mime = slashes_to_minuses(mimeTypeA); + if (flattened_mime) + { + char *dstIconPath = heap_printf("%s/icons/%s%s", xdg_data_dir, + flattened_mime, strrchr(iconA, '.')); + if (dstIconPath) + { + rename(iconA, dstIconPath); + HeapFree(GetProcessHeap(), 0, dstIconPath); + } + HeapFree(GetProcessHeap(), 0, flattened_mime); + } + } + write_freedesktop_mime_type_entry(packages_dir, extensionA, mimeTypeA, friendlyDocNameA); hasChanged = TRUE; } @@ -1918,6 +1984,8 @@ static BOOL generate_associations(const char *xdg_data_home, const char *package HeapFree(GetProcessHeap(), 0, commandW); HeapFree(GetProcessHeap(), 0, friendlyDocNameW); HeapFree(GetProcessHeap(), 0, friendlyDocNameA); + HeapFree(GetProcessHeap(), 0, iconW); + HeapFree(GetProcessHeap(), 0, iconA); HeapFree(GetProcessHeap(), 0, contentTypeW); HeapFree(GetProcessHeap(), 0, mimeTypeA); HeapFree(GetProcessHeap(), 0, friendlyAppNameW); diff --git a/programs/winemine/Lt.rc b/programs/winemine/Lt.rc new file mode 100644 index 00000000000..692717df727 --- /dev/null +++ b/programs/winemine/Lt.rc @@ -0,0 +1,96 @@ +/* + * WineMine + * Lithuanian Language Support + * + * Copyright 2009 Aurimas Fišeras + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/* UTF-8 */ +#pragma code_page(65001) + +LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL + +STRINGTABLE { + IDS_APPNAME, "WineMine" + IDS_NOBODY, "Niekas" + IDS_ABOUT, "Autoriaus teisės 2000 Joshua Thielen" +} + +MENU_WINEMINE MENU DISCARDABLE +{ + POPUP "&Parinktys" { + MENUITEM "&Naujas\tF2", IDM_NEW + MENUITEM SEPARATOR + MENUITEM "&Žymėti klaustuku", IDM_MARKQ + MENUITEM SEPARATOR + MENUITEM "P&radedantis", IDM_BEGINNER + MENUITEM "&Pažengęs", IDM_ADVANCED + MENUITEM "Ek&spertas", IDM_EXPERT + MENUITEM "Pasirin&ktas", IDM_CUSTOM + MENUITEM SEPARATOR + MENUITEM "Iš&eiti\tAlt+X", IDM_EXIT + } + POPUP "&Informacija" { + MENUITEM "&Geriausi laikai", IDM_TIMES + MENUITEM "&Apie", IDM_ABOUT + } +} + +DLG_TIMES DIALOG DISCARDABLE 0, 0, 160, 80 +STYLE DS_MODALFRAME | DS_3DLOOK | + WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP +CAPTION "Geriausi laikai" +{ + GROUPBOX "Geriausi laikai", -1, 10, 10, 140, 45 + LTEXT "Pradedantis", -1, 20, 20, 40, 8 + LTEXT "Pažengęs", -1, 20, 30, 40, 8 + LTEXT "Ekspertas", -1, 20, 40, 40, 8 + LTEXT "999", IDC_TIME1, 70, 20, 15, 8 + LTEXT "999", IDC_TIME2, 70, 30, 15, 8 + LTEXT "999", IDC_TIME3, 70, 40, 15, 8 + LTEXT "", IDC_NAME1, 90, 20, 55, 8 + LTEXT "", IDC_NAME2, 90, 30, 55, 8 + LTEXT "", IDC_NAME3, 90, 40, 55, 8 + DEFPUSHBUTTON "Gerai", IDOK, 55, 60, 50, 15 +} + +DLG_CONGRATS DIALOG DISCARDABLE 0, 0, 160, 60 +STYLE DS_MODALFRAME | DS_3DLOOK | + WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP +CAPTION "Sveikiname!" +{ + LTEXT "Įveskite savo vardą", -1, 10, 10, 150, 10 + EDITTEXT IDC_EDITNAME, 25, 20, 110, 12 + DEFPUSHBUTTON "Gerai", IDOK, 60, 40, 40, 15 +} + +DLG_CUSTOM DIALOG DISCARDABLE 0, 0, 100, 100 +STYLE DS_MODALFRAME | DS_3DLOOK | + WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_POPUP +CAPTION "Pasirinktas žaidimas" +{ + LTEXT "Eilutės", -1, 5, 5, 30, 10 + LTEXT "Stulpeliai", -1, 5, 35, 30, 10 + LTEXT "Minos", -1, 5, 65, 30, 10 + EDITTEXT IDC_EDITROWS, 5, 15, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITCOLS, 5, 45, 20, 12, ES_NUMBER + EDITTEXT IDC_EDITMINES, 5, 75, 20, 12, ES_NUMBER + DEFPUSHBUTTON "Gerai", IDOK, 40, 30, 50, 15 + PUSHBUTTON "Atsisakyti", IDCANCEL, 40, 50, 50, 15 +} + +#pragma code_page(default) diff --git a/programs/winemine/rsrc.rc b/programs/winemine/rsrc.rc index 8387ad8a1bf..09f5cd38cbb 100644 --- a/programs/winemine/rsrc.rc +++ b/programs/winemine/rsrc.rc @@ -34,6 +34,7 @@ #include "It.rc" #include "Ja.rc" #include "Ko.rc" +#include "Lt.rc" #include "Nl.rc" #include "No.rc" #include "Pl.rc" diff --git a/programs/wordpad/De.rc b/programs/wordpad/De.rc index 5b4b176a905..a2fcceb61c4 100644 --- a/programs/wordpad/De.rc +++ b/programs/wordpad/De.rc @@ -242,6 +242,7 @@ BEGIN STRING_OPEN_FAILED, "Die Datei konnte nicht geöffnet werden." STRING_OPEN_ACCESS_DENIED, "Sie haben keine ausreichende Zugriffsberechtigung um die Datei zu öffnen." STRING_PRINTING_NOT_IMPLEMENTED, "Drucken ist nicht implementiert" + STRING_MAX_TAB_STOPS, "Es können nur maximal 32 Tabstopps definiert werden." END #pragma code_page(default) diff --git a/programs/wordpad/Fr.rc b/programs/wordpad/Fr.rc index 459dd0ed82b..72f7c70e845 100644 --- a/programs/wordpad/Fr.rc +++ b/programs/wordpad/Fr.rc @@ -1,5 +1,5 @@ /* - * Copyright 2006-2007 by Jonathan Ernst + * Copyright 2006-2009 by Jonathan Ernst * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -240,4 +240,5 @@ BEGIN STRING_OPEN_FAILED, "Impossible d'ouvrir le fichier." STRING_OPEN_ACCESS_DENIED, "Vous ne disposez pas des accès nécessaires à l'ouverture du fichier." STRING_PRINTING_NOT_IMPLEMENTED, "L'impression n'est pas implémentée" + STRING_MAX_TAB_STOPS, "Impossible d'ajouter plus de 32 taquets de tabulation." END diff --git a/server/fd.c b/server/fd.c index d9688e1e0d9..a57001a04c6 100644 --- a/server/fd.c +++ b/server/fd.c @@ -1710,6 +1710,12 @@ void set_fd_signaled( struct fd *fd, int signaled ) if (signaled) wake_up( fd->user, 0 ); } +/* set or clear the fd signaled state */ +int is_fd_signaled( struct fd *fd ) +{ + return fd->signaled; +} + /* handler for close_handle that refuses to close fd-associated handles in other processes */ int fd_close_handle( struct object *obj, struct process *process, obj_handle_t handle ) { diff --git a/server/file.h b/server/file.h index 1aaa2847f1b..aef40f7c1a0 100644 --- a/server/file.h +++ b/server/file.h @@ -70,6 +70,7 @@ extern void set_fd_events( struct fd *fd, int events ); extern obj_handle_t lock_fd( struct fd *fd, file_pos_t offset, file_pos_t count, int shared, int wait ); extern void unlock_fd( struct fd *fd, file_pos_t offset, file_pos_t count ); extern void set_fd_signaled( struct fd *fd, int signaled ); +extern int is_fd_signaled( struct fd *fd ); extern int default_fd_signaled( struct object *obj, struct thread *thread ); extern unsigned int default_fd_map_access( struct object *obj, unsigned int access ); diff --git a/server/named_pipe.c b/server/named_pipe.c index 539509e1c2a..54ce8230465 100644 --- a/server/named_pipe.c +++ b/server/named_pipe.c @@ -176,6 +176,7 @@ static const struct fd_ops pipe_server_fd_ops = /* client end functions */ static void pipe_client_dump( struct object *obj, int verbose ); +static int pipe_client_signaled( struct object *obj, struct thread *thread ); static struct fd *pipe_client_get_fd( struct object *obj ); static void pipe_client_destroy( struct object *obj ); static void pipe_client_flush( struct fd *fd, struct event **event ); @@ -188,7 +189,7 @@ static const struct object_ops pipe_client_ops = no_get_type, /* get_type */ add_queue, /* add_queue */ remove_queue, /* remove_queue */ - default_fd_signaled, /* signaled */ + pipe_client_signaled, /* signaled */ no_satisfied, /* satisfied */ no_signal, /* signal */ pipe_client_get_fd, /* get_fd */ @@ -289,6 +290,13 @@ static void pipe_client_dump( struct object *obj, int verbose ) fprintf( stderr, "Named pipe client server=%p\n", client->server ); } +static int pipe_client_signaled( struct object *obj, struct thread *thread ) +{ + struct pipe_client *client = (struct pipe_client *) obj; + + return client->fd && is_fd_signaled(client->fd); +} + static void named_pipe_destroy( struct object *obj) { struct named_pipe *pipe = (struct named_pipe *) obj; diff --git a/server/queue.c b/server/queue.c index e603b16972b..c5841c939be 100644 --- a/server/queue.c +++ b/server/queue.c @@ -648,6 +648,14 @@ static void reply_message( struct msg_queue *queue, lparam_t result, } } +static int match_window( user_handle_t win, user_handle_t msg_win ) +{ + if (!win) return 1; + if (win == (user_handle_t)-1) return !msg_win; + if (msg_win == win) return 1; + return is_child_window( win, msg_win ); +} + /* retrieve a posted message */ static int get_posted_message( struct msg_queue *queue, user_handle_t win, unsigned int first, unsigned int last, unsigned int flags, @@ -658,7 +666,7 @@ static int get_posted_message( struct msg_queue *queue, user_handle_t win, /* check against the filters */ LIST_FOR_EACH_ENTRY( msg, &queue->msg_list[POST_MESSAGE], struct message, entry ) { - if (win && msg->win && msg->win != win && !is_child_window( win, msg->win )) continue; + if (!match_window( win, msg->win )) continue; if (!check_msg_filter( msg->msg, first, last )) continue; goto found; /* found one */ } diff --git a/tools/c2man.pl b/tools/c2man.pl index b1fd0222f97..62d7e1759d2 100755 --- a/tools/c2man.pl +++ b/tools/c2man.pl @@ -44,7 +44,7 @@ my $opt_output_directory = "man3w"; # All default options are for nroff (man pag my $opt_manual_section = "3w"; my $opt_source_dir = ""; my $opt_wine_root_dir = ""; -my $opt_output_format = ""; # '' = nroff, 'h' = html, 's' = sgml +my $opt_output_format = ""; # '' = nroff, 'h' = html, 's' = sgml, 'x' = xml my $opt_output_empty = 0; # Non-zero = Create 'empty' comments (for every implemented function) my $opt_fussy = 1; # Non-zero = Create only if we have a RETURNS section my $opt_verbose = 0; # >0 = verbosity. Can be given multiple times (for debugging) @@ -80,7 +80,9 @@ sub output_html_index_files(); sub output_html_stylesheet(); sub output_open_api_file($); sub output_sgml_dll_file($); +sub output_xml_dll_file($); sub output_sgml_master_file($); +sub output_xml_master_file($); sub output_spec($); sub process_comment($); sub process_extra_comment($); @@ -1299,6 +1301,13 @@ sub output_spec($) output_sgml_dll_file($spec_details); return; } + + if ($opt_output_format eq "x") + { + output_xml_dll_file($spec_details); + return; + } + } # @@ -1322,6 +1331,10 @@ sub output_open_api_file($) { $output_name = $output_name.".sgml"; } + elsif ($opt_output_format eq "x") + { + $output_name = $output_name.".xml"; + } else { $output_name = $output_name.".".$opt_manual_section; @@ -1350,7 +1363,7 @@ sub output_api_header($) print OUTPUT "{COMMENT_NAME}\">\n"; print OUTPUT "Wine API: $comment->{COMMENT_NAME}\n\n\n"; } - elsif ($opt_output_format eq "s") + elsif ($opt_output_format eq "s" || $opt_output_format eq "x") { print OUTPUT "\n", "\n", @@ -1373,7 +1386,7 @@ sub output_api_footer($) " Visit WineHQ for license details.". " Generated $date.

\n\n\n"; } - elsif ($opt_output_format eq "s") + elsif ($opt_output_format eq "s" || $opt_output_format eq "x") { print OUTPUT "
\n"; return; @@ -1392,7 +1405,7 @@ sub output_api_section_start($$) { print OUTPUT "\n

",$section_name,"

\n"; } - elsif ($opt_output_format eq "s") + elsif ($opt_output_format eq "s" || $opt_output_format eq "x") { print OUTPUT "",$section_name,"\n"; } @@ -1427,7 +1440,7 @@ sub output_api_name($) "  ", ,$dll_ordinal,"

\n"; } - elsif ($opt_output_format eq "s") + elsif ($opt_output_format eq "s" || $opt_output_format eq "x") { print OUTPUT "\n ",$readable_name," ", $dll_ordinal,"\n\n"; @@ -1452,7 +1465,7 @@ sub output_api_synopsis($) print OUTPUT "
\n ", $comment->{RETURNS}," ",$comment->{COMMENT_NAME},"\n (\n";
     @fmt = ("", "\n", "", "");
   }
-  elsif ($opt_output_format eq "s")
+  elsif ($opt_output_format eq "s" || $opt_output_format eq "x")
   {
     print OUTPUT "\n ",$comment->{RETURNS}," ",$comment->{COMMENT_NAME},"\n (\n";
     @fmt = ("", "\n", "", "");
@@ -1506,7 +1519,7 @@ sub output_api_synopsis($)
   {
     print OUTPUT " )\n
\n"; } - elsif ($opt_output_format eq "s") + elsif ($opt_output_format eq "s" || $opt_output_format eq "x") { print OUTPUT " )\n\n"; } @@ -1534,7 +1547,7 @@ sub output_api_comment($) "\n", "
\n","","\n","",""); } - elsif ($opt_output_format eq "s") + elsif ($opt_output_format eq "s" || $opt_output_format eq "x") { @fmt = ("\n","\n\n","","","","", "","","","","","", @@ -1561,7 +1574,7 @@ sub output_api_comment($) for (@{$comment->{TEXT}}) { - if ($opt_output_format eq "h" || $opt_output_format eq "s") + if ($opt_output_format eq "h" || $opt_output_format eq "s" || $opt_output_format eq "x") { # Map special characters s/\&/\&/g; @@ -1609,7 +1622,7 @@ sub output_api_comment($) # Leading cases ("xxxx:","-") start new paragraphs & are emphasised # FIXME: Using bullet points for leading '-' would look nicer. - if ($open_paragraph == 1) + if ($open_paragraph == 1 && $param_docs == 0) { s/^(\-)/$fmt[1]$fmt[0]$fmt[4]$1$fmt[5]/; s/^([[A-Za-z\-]+\:)/$fmt[1]$fmt[0]$fmt[4]$1$fmt[5]/; @@ -1671,6 +1684,7 @@ sub output_api_comment($) if ($param_docs == 1) { print OUTPUT $fmt[17],$fmt[15]; + $param_docs = 0; } else { @@ -1687,7 +1701,7 @@ sub output_api_comment($) else { #print OUTPUT $fmt[15]; - $param_docs = 0; + #$param_docs = 0; } } elsif ( /^$/ ) @@ -1752,6 +1766,15 @@ sub output_api_comment($) { print OUTPUT $fmt[13]; } + if ($param_docs == 1 && $open_paragraph == 1) + { + print OUTPUT $fmt[17]; + $open_paragraph = 0; + } + if ($param_docs == 1) + { + print OUTPUT $fmt[15]; + } if ($open_paragraph == 1) { print OUTPUT $fmt[1]; @@ -1792,7 +1815,7 @@ sub output_master_index_files() TEXT => [], }; - if ($opt_output_format eq "s") + if ($opt_output_format eq "s" || $opt_output_format eq "x") { $comment->{COMMENT_NAME} = "Introduction"; $comment->{ALT_NAME} = "Introduction", @@ -1849,7 +1872,7 @@ sub output_master_index_files() } output_open_api_file("index"); } - elsif ($opt_output_format eq "s") + elsif ($opt_output_format eq "s" || $opt_output_format eq "x") { # Just write this as the initial blurb, with a chapter heading output_open_api_file("blurb"); @@ -1860,7 +1883,7 @@ sub output_master_index_files() output_api_header($comment); output_api_comment($comment); output_api_footer($comment); - if ($opt_output_format eq "s") + if ($opt_output_format eq "s" || $opt_output_format eq "x") { print OUTPUT "\n" # finish the chapter } @@ -1871,6 +1894,11 @@ sub output_master_index_files() output_sgml_master_file(\@dlls); return; } + if ($opt_output_format eq "x") + { + output_xml_master_file(\@dlls); + return; + } if ($opt_output_format eq "h") { output_html_index_files(); @@ -1879,6 +1907,37 @@ sub output_master_index_files() } } +# Write the master wine-api.xml, linking it to each dll. +sub output_xml_master_file($) +{ + my $dlls = shift; + + output_open_api_file("wine-api"); + print OUTPUT ""; + print OUTPUT "\n"; + print OUTPUT "\n"; + + # List the entities + for (@$dlls) + { + $_ =~ s/(\..*)?\n//; + print OUTPUT "\n" + } + + print OUTPUT "]>\n\n\nThe Wine Api Guide\n\n"; + print OUTPUT " &blurb;\n"; + + for (@$dlls) + { + print OUTPUT " &",$_,";\n" + } + print OUTPUT "\n\n\n"; + + output_close_api_file(); +} + # Write the master wine-api.sgml, linking it to each dll. sub output_sgml_master_file($) { @@ -1952,6 +2011,50 @@ sub output_sgml_dll_file($) `mv $tmp_name $opt_output_directory/$spec_details->{DLL_NAME}.sgml`; } +# Produce the xml for the dll chapter from the generated files +sub output_xml_dll_file($) +{ + my $spec_details = shift; + + # Make a list of all the documentation files to include + my $exports = $spec_details->{EXPORTS}; + my @source_files = (); + for (@$exports) + { + # @$_ => ordinal, call convention, exported name, implementation name, documented; + if (@$_[1] ne "forward" && @$_[1] ne "extern" && @$_[1] ne "stub" && @$_[1] ne "equate" && + @$_[1] ne "variable" && @$_[1] ne "fake" && @$_[4] & 1) + { + # A documented function + push (@source_files,@$_[3]); + } + } + + push (@source_files,@{$spec_details->{EXTRA_COMMENTS}}); + + @source_files = sort @source_files; + + # create a new chapter for this dll + my $tmp_name = $opt_output_directory."/".$spec_details->{DLL_NAME}.".tmp"; + open(OUTPUT,">$tmp_name") || die "Couldn't create $tmp_name\n"; + print OUTPUT "\n\n$spec_details->{DLL_NAME}\n"; + output_close_api_file(); + + # Add the sorted documentation, cleaning up as we go + `cat $opt_output_directory/$spec_details->{DLL_NAME}.xml >>$tmp_name`; + for (@source_files) + { + `cat $opt_output_directory/$_.xml >>$tmp_name`; + `rm -f $opt_output_directory/$_.xml`; + } + + # close the chapter, and overwite the dll source + open(OUTPUT,">>$tmp_name") || die "Couldn't create $tmp_name\n"; + print OUTPUT "\n"; + close OUTPUT; + `mv $tmp_name $opt_output_directory/$spec_details->{DLL_NAME}.xml`; +} + # Write the html index files containing the function names sub output_html_index_files() { @@ -2156,6 +2259,7 @@ while(defined($_ = shift @ARGV)) s/^S// && do { $opt_manual_section = $_; last; }; /^Th$/ && do { $opt_output_format = "h"; last; }; /^Ts$/ && do { $opt_output_format = "s"; last; }; + /^Tx$/ && do { $opt_output_format = "x"; last; }; /^v$/ && do { $opt_verbose++; last; }; /^e$/ && do { $opt_output_empty = 1; last; }; /^L$/ && do { last; }; diff --git a/tools/widl/hash.c b/tools/widl/hash.c index bd209955753..7900544680a 100644 --- a/tools/widl/hash.c +++ b/tools/widl/hash.c @@ -536,13 +536,38 @@ unsigned int lhash_val_of_name_sys( syskind_t skind, LCID lcid, LPCSTR lpStr) case LANG_SWEDISH: case LANG_SYRIAC: case LANG_TAMIL: case LANG_TATAR: case LANG_TELUGU: case LANG_THAI: case LANG_UKRAINIAN: case LANG_URDU: case LANG_UZBEK: - case LANG_VIETNAMESE: case LANG_GAELIC: case LANG_MALTESE: - case LANG_TAJIK: case LANG_ROMANSH: case LANG_IRISH: - case LANG_SAMI: case LANG_UPPER_SORBIAN: case LANG_SUTU: - case LANG_TSONGA: case LANG_TSWANA: case LANG_VENDA: - case LANG_XHOSA: case LANG_ZULU: case LANG_ESPERANTO: - case LANG_WALON: case LANG_CORNISH: case LANG_WELSH: + case LANG_VIETNAMESE: case LANG_MALTESE: case LANG_IRISH: + case LANG_SAMI: case LANG_UPPER_SORBIAN: case LANG_TSWANA: + case LANG_XHOSA: case LANG_ZULU: case LANG_WELSH: case LANG_BRETON: +/* some languages not in all windows versions or ReactOS */ +#ifdef LANG_GAELIC + case LANG_GAELIC: +#endif +#ifdef LANG_TAJIK + case LANG_TAJIK: +#endif +#ifdef LANG_ROMANSH + case LANG_ROMANSH: +#endif +#ifdef LANG_SUTU + case LANG_SUTU: +#endif +#ifdef LANG_TSONGA + case LANG_TSONGA: +#endif +#ifdef LANG_VENDA + case LANG_VENDA: +#endif +#ifdef LANG_ESPERANTO + case LANG_ESPERANTO: +#endif +#ifdef LANG_WALON + case LANG_WALON: +#endif +#ifdef LANG_CORNISH + case LANG_CORNISH: +#endif nOffset = 16; pnLookup = Lookup_16; break; diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 7fe373ceb53..c2f1abc2151 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -509,6 +509,7 @@ attribute: { $$ = NULL; } | tINPUTSYNC { $$ = make_attr(ATTR_INPUTSYNC); } | tLENGTHIS '(' m_exprs ')' { $$ = make_attrp(ATTR_LENGTHIS, $3); } | tLCID '(' expr_int_const ')' { $$ = make_attrp(ATTR_LIBLCID, $3); } + | tLCID { $$ = make_attr(ATTR_PARAMLCID); } | tLOCAL { $$ = make_attr(ATTR_LOCAL); } | tNONBROWSABLE { $$ = make_attr(ATTR_NONBROWSABLE); } | tNONCREATABLE { $$ = make_attr(ATTR_NONCREATABLE); } @@ -1919,6 +1920,7 @@ struct allowed_attr allowed_attr[] = /* ATTR_OLEAUTOMATION */ { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "oleautomation" }, /* ATTR_OPTIONAL */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "optional" }, /* ATTR_OUT */ { 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "out" }, + /* ATTR_PARAMLCID */ { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "lcid" }, /* ATTR_POINTERDEFAULT */ { 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "pointer_default" }, /* ATTR_POINTERTYPE */ { 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, "ref, unique or ptr" }, /* ATTR_PROPGET */ { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "propget" }, diff --git a/tools/widl/proxy.c b/tools/widl/proxy.c index b8ccdaccd08..cc753bbfcf2 100644 --- a/tools/widl/proxy.c +++ b/tools/widl/proxy.c @@ -624,7 +624,8 @@ static void write_proxy(type_t *iface, unsigned int *proc_offset) count = count_methods(iface); /* proxy vtable */ - print_proxy( "static const CINTERFACE_PROXY_VTABLE(%d) _%sProxyVtbl =\n", count, iface->name); + print_proxy( "static %sCINTERFACE_PROXY_VTABLE(%d) _%sProxyVtbl =\n", + need_delegation_indirect(iface) ? "" : "const ", count, iface->name); print_proxy( "{\n"); indent++; print_proxy( "{\n"); diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index f5466bfe323..c1c07ea252d 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -120,6 +120,7 @@ enum attr_type ATTR_OLEAUTOMATION, ATTR_OPTIONAL, ATTR_OUT, + ATTR_PARAMLCID, ATTR_POINTERDEFAULT, ATTR_POINTERTYPE, ATTR_PROPGET, diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c index bff61fdd0d2..7a709bc2d57 100644 --- a/tools/widl/write_msft.c +++ b/tools/widl/write_msft.c @@ -141,7 +141,7 @@ static void ctl2_init_header( typelib->typelib_header.magic1 = 0x5446534d; typelib->typelib_header.magic2 = 0x00010002; typelib->typelib_header.posguid = -1; - typelib->typelib_header.lcid = 0x0409; /* or do we use the current one? */ + typelib->typelib_header.lcid = 0x0409; typelib->typelib_header.lcid2 = 0x0; typelib->typelib_header.varflags = 0x40; typelib->typelib_header.version = 0; @@ -1267,6 +1267,7 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index) unsigned int funckind, invokekind = 1 /* INVOKE_FUNC */; int help_context = 0, help_string_context = 0, help_string_offset = -1; int entry = -1, entry_is_ord = 0; + int lcid_retval_count = 0; chat("add_func_desc(%p,%d)\n", typeinfo, index); @@ -1497,9 +1498,13 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index) case ATTR_OUT: paramflags |= 0x02; /* PARAMFLAG_FOUT */ break; + case ATTR_PARAMLCID: + paramflags |= 0x04; /* PARAMFLAG_LCID */ + lcid_retval_count++; + break; case ATTR_RETVAL: paramflags |= 0x08; /* PARAMFLAG_FRETVAL */ - typedata[4] |= 0x4000; + lcid_retval_count++; break; default: chat("unhandled param attr %d\n", attr->type); @@ -1509,6 +1514,12 @@ static HRESULT add_func_desc(msft_typeinfo_t* typeinfo, var_t *func, int index) paramdata[1] = -1; paramdata[2] = paramflags; typedata[3] += decoded_size << 16; + + if(lcid_retval_count == 1) + typedata[4] |= 0x4000; + else if(lcid_retval_count == 2) + typedata[4] |= 0x8000; + i++; } } @@ -2351,7 +2362,11 @@ static void set_help_string_context(msft_typelib_t *typelib) static void set_lcid(msft_typelib_t *typelib) { const expr_t *lcid_expr = get_attrp( typelib->typelib->attrs, ATTR_LIBLCID ); - typelib->typelib_header.lcid2 = lcid_expr ? lcid_expr->cval : 0x0; + if(lcid_expr) + { + typelib->typelib_header.lcid = lcid_expr->cval; + typelib->typelib_header.lcid2 = lcid_expr->cval; + } } static void set_lib_flags(msft_typelib_t *typelib) diff --git a/tools/wine.desktop b/tools/wine.desktop index 52f91c6d24c..db4254d1fa9 100644 --- a/tools/wine.desktop +++ b/tools/wine.desktop @@ -16,6 +16,6 @@ Name[da]=Wine, Programstarter til Windows-programmer Name[nb]=Wine Programlaster for Windowsapplikasjoner Name[nn]=Wine Programlaster for Windowsapplikasjoner Exec=wine start /unix %f -MimeType=application/x-ms-dos-executable;application/x-msi; +MimeType=application/x-ms-dos-executable;application/x-msi;application/x-win-lnk; NoDisplay=true StartupNotify=true diff --git a/tools/wine.inf.in b/tools/wine.inf.in index ccae9b9a113..8fe41618276 100644 --- a/tools/wine.inf.in +++ b/tools/wine.inf.in @@ -403,6 +403,7 @@ HKLM,%CurrentVersion%,"RegisteredOwner",2,"" HKLM,%CurrentVersion%\Controls Folder\PowerCfg,"DiskSpinDownMax",,"3600" HKLM,%CurrentVersion%\Controls Folder\PowerCfg,"DiskSpinDownMin",,"3" HKLM,%CurrentVersion%\Controls Folder\PowerCfg,"LastID",,"5" +HKLM,%CurrentVersion%\Run,"winemenubuilder",2,"winemenubuilder -a" HKLM,%CurrentVersion%\Setup,"BootDir",,"%30%" HKLM,%CurrentVersion%\Setup,"SharedDir",,"%25%" HKLM,%CurrentVersion%\Uninstall,,,"" @@ -415,7 +416,7 @@ HKLM,%CurrentVersionNT%\Q246009,"Installed",,"1" [Debugger] HKLM,%CurrentVersionNT%\AeDebug,"Debugger",2,"winedbg --auto %ld %ld" HKLM,%CurrentVersionNT%\AeDebug,"Auto",2,"1" -HKCU,Software\Wine\Debug,"RelayExclude",2,"ntdll.RtlEnterCriticalSection;ntdll.RtlLeaveCriticalSection;kernel32.94;kernel32.95;kernel32.96;kernel32.97;kernel32.98" +HKCU,Software\Wine\Debug,"RelayExclude",2,"ntdll.RtlEnterCriticalSection;ntdll.RtlLeaveCriticalSection;kernel32.48;kernel32.49;kernel32.94;kernel32.95;kernel32.96;kernel32.97;kernel32.98" HKCU,Software\Wine\Debug,"RelayFromExclude",2,"winex11.drv;user32;gdi32;advapi32;kernel32" [Desktop] diff --git a/tools/winebuild/relay.c b/tools/winebuild/relay.c index ddc80515510..f049c9ef59d 100644 --- a/tools/winebuild/relay.c +++ b/tools/winebuild/relay.c @@ -1121,6 +1121,8 @@ static void build_call_from_regs_x86_64(void) output( "\tmovq %%rax,0x18(%%rsp)\n" ); output( "\tmovw 0x42(%%rbx),%%ax\n" ); /* ss */ output( "\tmovq %%rax,0x20(%%rsp)\n" ); + output( "\tmovq 0x78(%%rbx),%%rax\n" ); + output( "\tmovq 0x90(%%rbx),%%rbx\n" ); output( "\tiretq\n" ); output_function_size( "__wine_call_from_regs" ); -- 2.11.4.GIT