From a1d7bd375c1385be8716f3e413ae4260cd5416f1 Mon Sep 17 00:00:00 2001 From: Jan Zerebecki Date: Sat, 29 Mar 2008 11:53:10 +0100 Subject: [PATCH] push 071493016fe1a315c0eb45bb83b2bbe9c1381c65 --- .gitignore | 5 + Makefile.in | 6 + configure | 9 + configure.ac | 3 + dlls/Makefile.in | 2 + dlls/advapi32/advapi32.spec | 4 +- dlls/advapi32/crypt.c | 52 + dlls/advapi32/service.c | 115 + dlls/advapi32/tests/crypt.c | 46 + dlls/advapi32/tests/service.c | 7 + dlls/comctl32/comctl32.h | 1 + dlls/comctl32/commctrl.c | 1 + dlls/comctl32/rebar.c | 2 +- dlls/comdlg32/cdlg_De.rc | 2 +- dlls/comdlg32/cdlg_Ro.rc | 480 ++++ dlls/comdlg32/cdlg_Ru.rc | 8 + dlls/comdlg32/filedlg.c | 25 +- dlls/comdlg32/printdlg.c | 2 - dlls/comdlg32/rsrc.rc | 1 + dlls/comdlg32/tests/printdlg.c | 1 + dlls/crypt32/msg.c | 83 +- dlls/crypt32/tests/msg.c | 17 + dlls/d3d8/d3d8_private.h | 111 +- dlls/d3d8/device.c | 23 +- dlls/d3d8/directx.c | 4 +- dlls/d3d8/stateblock.c | 2 +- dlls/d3d8/tests/device.c | 112 +- dlls/d3d8/tests/surface.c | 2 +- dlls/d3d8/tests/visual.c | 2 +- dlls/d3d8/vertexdeclaration.c | 2 +- dlls/d3d9/d3d9_private.h | 156 +- dlls/d3d9/device.c | 2 +- dlls/d3d9/directx.c | 2 +- dlls/d3d9/stateblock.c | 2 +- dlls/d3d9/tests/device.c | 6 +- dlls/d3d9/tests/surface.c | 2 +- dlls/d3d9/tests/visual.c | 479 +++- dlls/d3dx8/tests/math.c | 2 +- dlls/{fusion => d3dx9_37}/Makefile.in | 8 +- dlls/d3dx9_37/d3dx9_37.spec | 336 +++ .../mscms_main.c => d3dx9_37/d3dx9_37_main.c} | 39 +- dlls/dbghelp/stabs.c | 2 +- dlls/ddraw/direct3d.c | 199 +- dlls/ddraw/executebuffer.c | 15 +- dlls/ddraw/surface.c | 5 + dlls/ddraw/tests/d3d.c | 86 + dlls/ddraw/tests/dsurface.c | 40 +- dlls/ddraw/tests/visual.c | 198 ++ dlls/ddraw/utils.c | 51 +- dlls/ddraw/vertexbuffer.c | 6 - dlls/devenum/devenum.rc | 9 + dlls/dinput/keyboard.c | 2 +- dlls/dinput/mouse.c | 2 +- dlls/dmime/performance.c | 6 +- dlls/dmime/segment.c | 2 +- dlls/fusion/Makefile.in | 1 + dlls/fusion/asmcache.c | 346 +++ dlls/fusion/fusion.c | 9 - dlls/gdi32/dc.c | 2 +- dlls/gdi32/dib.c | 21 +- dlls/gdi32/enhmfdrv/bitblt.c | 2 +- dlls/gdi32/font.c | 2 +- dlls/gdi32/freetype.c | 10 +- dlls/gdi32/metafile.c | 6 +- dlls/gdi32/mfdrv/bitblt.c | 2 +- dlls/gdi32/pen.c | 2 +- dlls/gdi32/printdrv16.c | 2 +- dlls/gdi32/region.c | 4 +- dlls/gdi32/tests/pen.c | 6 +- dlls/gdiplus/image.c | 1 - dlls/hhctrl.ocx/Ru.rc | 58 + dlls/hhctrl.ocx/chm.c | 33 +- dlls/hhctrl.ocx/hhctrl.c | 1 + dlls/hhctrl.ocx/hhctrl.h | 25 +- dlls/hhctrl.ocx/hhctrl.rc | 1 + dlls/imm32/Makefile.in | 2 +- dlls/imm32/imm.c | 81 +- dlls/inetcomm/internettransport.c | 4 +- dlls/jscript/jscript.c | 6 +- dlls/jscript/jscript.h | 12 + dlls/jscript/jscript_main.c | 13 +- dlls/{mshtml => jscript}/tests/Makefile.in | 10 +- dlls/jscript/tests/jscript.c | 62 + dlls/kernel32/locale_rc.rc | 2 + dlls/kernel32/nls/rmc.nls | 166 ++ dlls/kernel32/process.c | 60 +- dlls/kernel32/tests/codepage.c | 60 +- dlls/mscms/handle.c | 537 ++--- dlls/mscms/mscms_main.c | 5 + dlls/mscms/mscms_priv.h | 48 +- dlls/mscms/profile.c | 224 +- dlls/mscms/transform.c | 82 +- dlls/mscoree/mscoree.spec | 10 + dlls/mscoree/mscoree_main.c | 50 + dlls/mshtml/De.rc | 14 + dlls/mshtml/Makefile.in | 2 + dlls/mshtml/editor.c | 7 +- dlls/mshtml/htmldoc.c | 24 +- dlls/mshtml/htmllocation.c | 311 +++ dlls/mshtml/install.c | 7 +- dlls/mshtml/mshtml_private.h | 48 +- dlls/mshtml/navigate.c | 17 +- dlls/mshtml/nsevents.c | 30 + dlls/mshtml/nsio.c | 35 +- dlls/mshtml/persist.c | 2 +- dlls/mshtml/script.c | 314 +++ dlls/mshtml/tests/Makefile.in | 3 +- dlls/mshtml/tests/dom.c | 28 + dlls/mshtml/tests/script.c | 536 +++++ dlls/msi/action.c | 2 +- dlls/msxml3/Makefile.in | 1 + dlls/msxml3/cdata.c | 3 - dlls/msxml3/comment.c | 3 - dlls/msxml3/factory.c | 6 + dlls/msxml3/main.c | 15 +- dlls/msxml3/msxml_private.h | 14 + dlls/msxml3/saxreader.c | 381 +++ dlls/msxml3/text.c | 3 - dlls/netapi32/nbt.c | 18 +- dlls/ntdll/loader.c | 85 +- dlls/ntdll/misc.c | 17 + dlls/ntdll/ntdll.spec | 4 + dlls/ntdsapi/tests/ntdsapi.c | 2 + dlls/ole32/tests/marshal.c | 1 + dlls/qmgr/tests/file.c | 6 +- dlls/qmgr/tests/job.c | 6 +- dlls/quartz/acmwrapper.c | 4 +- dlls/quartz/control.c | 32 +- dlls/quartz/control_private.h | 8 +- dlls/quartz/filtergraph.c | 43 +- dlls/quartz/mpegsplit.c | 6 +- dlls/quartz/tests/filtergraph.c | 37 + dlls/quartz/tests/misc.c | 18 +- dlls/setupapi/devinst.c | 2 +- dlls/setupapi/install.c | 14 +- dlls/setupapi/tests/devinst.c | 15 +- dlls/setupapi/tests/install.c | 147 ++ dlls/setupapi/tests/parser.c | 124 +- dlls/shell32/shell32_De.rc | 18 + dlls/shell32/shell32_En.rc | 29 +- dlls/shell32/shell32_Ru.rc | 41 +- dlls/shell32/shell32_main.c | 67 +- dlls/shell32/shellpath.c | 70 +- dlls/shell32/shresdef.h | 5 + dlls/shlwapi/shlwapi.rc | 1 + dlls/shlwapi/shlwapi_Ru.rc | 43 + dlls/shlwapi/tests/Makefile.in | 1 + dlls/shlwapi/tests/istream.c | 575 +++++ dlls/urlmon/sec_mgr.c | 2 +- dlls/user32/combo.c | 29 +- dlls/user32/edit.c | 55 +- dlls/user32/listbox.c | 2 +- dlls/user32/menu.c | 5 +- dlls/user32/msgbox.c | 39 +- dlls/user32/nonclient.c | 2 +- dlls/user32/resources/user32.rc | 1 + dlls/user32/resources/user32_Bg.rc | 2 +- dlls/user32/resources/user32_Ca.rc | 2 +- dlls/user32/resources/user32_Cs.rc | 2 +- dlls/user32/resources/user32_Da.rc | 2 +- dlls/user32/resources/user32_De.rc | 2 +- dlls/user32/resources/user32_En.rc | 2 +- dlls/user32/resources/user32_Eo.rc | 2 +- dlls/user32/resources/user32_Es.rc | 2 +- dlls/user32/resources/user32_Fi.rc | 2 +- dlls/user32/resources/user32_Hu.rc | 2 +- dlls/user32/resources/user32_It.rc | 2 +- dlls/user32/resources/user32_Nl.rc | 2 +- dlls/user32/resources/user32_No.rc | 2 +- dlls/user32/resources/user32_Pl.rc | 2 +- dlls/user32/resources/user32_Pt.rc | 4 +- dlls/user32/resources/user32_Ro.rc | 90 + dlls/user32/resources/user32_Ru.rc | 19 +- dlls/user32/resources/user32_Si.rc | 2 +- dlls/user32/resources/user32_Sk.rc | 2 +- dlls/user32/resources/user32_Sv.rc | 2 +- dlls/user32/resources/user32_Tr.rc | 2 +- dlls/user32/resources/user32_Uk.rc | 2 +- dlls/user32/tests/edit.c | 176 ++ dlls/user32/tests/msg.c | 141 +- dlls/user32/tests/resource.c | 8 +- dlls/user32/tests/resource.rc | 20 + dlls/user32/tests/text.c | 17 + dlls/user32/winpos.c | 3 +- dlls/winealsa.drv/dscapture.c | 4 +- dlls/winealsa.drv/dsoutput.c | 6 +- dlls/winealsa.drv/midi.c | 8 +- dlls/winealsa.drv/wavein.c | 2 +- dlls/winealsa.drv/waveout.c | 2 +- dlls/wineaudioio.drv/audio.c | 4 +- dlls/winecoreaudio.drv/audio.c | 12 +- dlls/wined3d/Makefile.in | 1 + dlls/wined3d/arb_program_shader.c | 196 +- dlls/wined3d/ati_fragment_shader.c | 916 +++++++ dlls/wined3d/baseshader.c | 80 +- dlls/wined3d/context.c | 117 +- dlls/wined3d/device.c | 106 +- dlls/wined3d/directx.c | 947 ++++---- dlls/wined3d/drawprim.c | 2 + dlls/wined3d/glsl_shader.c | 227 +- dlls/wined3d/palette.c | 11 - dlls/wined3d/pixelshader.c | 171 +- dlls/wined3d/state.c | 20 +- dlls/wined3d/stateblock.c | 12 - dlls/wined3d/surface.c | 76 +- dlls/wined3d/surface_base.c | 20 +- dlls/wined3d/surface_gdi.c | 51 +- dlls/wined3d/utils.c | 275 ++- dlls/wined3d/vertexshader.c | 126 +- dlls/wined3d/wined3d_main.c | 5 + dlls/wined3d/wined3d_private.h | 85 +- dlls/wined3d/wined3d_private_types.h | 3 + dlls/wineesd.drv/audio.c | 6 +- dlls/winejack.drv/audio.c | 9 +- dlls/winenas.drv/audio.c | 2 +- dlls/wineoss.drv/audio.c | 4 +- dlls/wineoss.drv/dscapture.c | 4 +- dlls/wineoss.drv/dsrender.c | 6 +- dlls/winex11.drv/clipboard.c | 87 +- dlls/winex11.drv/window.c | 26 +- dlls/winex11.drv/winpos.c | 2 + dlls/wininet/ftp.c | 4 +- dlls/wininet/http.c | 129 +- dlls/wininet/tests/ftp.c | 1 - dlls/wininet/tests/http.c | 2 + dlls/wininet/wininet.spec | 4 +- dlls/winspool.drv/info.c | 262 +- dlls/ws2_32/protocol.c | 20 +- dlls/wsock32/socket.c | 2 +- fonts/courier.sfd | 70 +- fonts/courier.ttf | Bin 14060 -> 14288 bytes fonts/ms_sans_serif.sfd | 159 +- fonts/ms_sans_serif.ttf | Bin 27752 -> 28572 bytes fonts/small_fonts.sfd | 16 +- fonts/small_fonts.ttf | Bin 15956 -> 15956 bytes fonts/system.sfd | 139 +- fonts/system.ttf | Bin 23940 -> 24776 bytes fonts/tahoma.sfd | 2534 ++++++-------------- fonts/tahoma.ttf | Bin 86772 -> 84400 bytes fonts/tahomabd.sfd | 2296 +++++------------- fonts/tahomabd.ttf | Bin 64396 -> 62316 bytes include/fusion.idl | 89 + include/msxml2.idl | 915 +++++++ include/msxml2did.h | 127 + include/wine/library.h | 3 + include/wine/wined3d_gl.h | 98 +- include/wine/wined3d_types.h | 186 +- include/winsvc.h | 13 +- libs/.gitignore | 2 + libs/wine/Makefile.in | 10 +- libs/wine/config.c | 13 + libs/wine/port.c | 64 + libs/wine/wine.def | 5 +- libs/wine/wine.map | 3 + loader/.gitignore | 2 - loader/Makefile.in | 13 +- loader/main.c | 3 +- programs/Makefile.in | 2 + programs/notepad/Ru.rc | 7 +- programs/regedit/En.rc | 2 +- programs/regedit/Ja.rc | 2 +- programs/regedit/Makefile.in | 2 + programs/regedit/Ru.rc | 167 ++ programs/regedit/about.c | 7 +- programs/regedit/regedit.ico | Bin 22534 -> 15086 bytes programs/regedit/regedit.svg | 947 ++++++++ {dlls/fusion => programs/services}/Makefile.in | 11 +- programs/services/services.c | 204 ++ .../{winetest/resource.h => services/services.h} | 55 +- programs/services/utils.c | 147 ++ programs/winecfg/x11drvdlg.c | 57 +- programs/winefile/Cs.rc | 4 - programs/winefile/De.rc | 31 - programs/winefile/En.rc | 32 +- programs/winefile/Es.rc | 28 - programs/winefile/Fr.rc | 31 - programs/winefile/Hu.rc | 3 - programs/winefile/It.rc | 3 - programs/winefile/Ko.rc | 29 - programs/winefile/Makefile.in | 2 + programs/winefile/Nl.rc | 28 - programs/winefile/No.rc | 28 - programs/winefile/Pl.rc | 28 - programs/winefile/Pt.rc | 8 - programs/winefile/Ru.rc | 28 - programs/winefile/Si.rc | 3 - programs/winefile/Sv.rc | 4 - programs/winefile/Tr.rc | 4 - programs/winefile/Zh.rc | 3 - programs/winefile/resource.h | 11 +- programs/winefile/winefile.c | 36 +- programs/winefile/winefile.h | 4 - programs/winefile/winefile.ico | Bin 766 -> 15086 bytes programs/winefile/winefile.svg | 762 ++++++ programs/winetest/Makefile.in | 5 + programs/winetest/main.c | 8 +- programs/winetest/resource.h | 2 + programs/winetest/winetest.rc | 8 + programs/winhelp/De.rc | 14 +- programs/winhelp/{Va.rc => Rm.rc} | 46 +- programs/winhelp/rsrc.rc | 1 + programs/wordpad/De.rc | 2 + programs/wordpad/En.rc | 2 + programs/wordpad/Fr.rc | 2 + programs/wordpad/Hu.rc | 2 + programs/wordpad/Ko.rc | 2 + programs/wordpad/Nl.rc | 2 + programs/wordpad/No.rc | 2 + programs/wordpad/Pl.rc | 2 + programs/wordpad/Ru.rc | 5 +- programs/wordpad/Tr.rc | 2 + programs/wordpad/print.c | 201 +- programs/wordpad/wordpad.h | 12 +- server/security.h | 2 +- server/token.c | 25 +- tools/widl/client.c | 58 +- tools/widl/header.c | 75 +- tools/widl/header.h | 6 +- tools/widl/parser.y | 2 +- tools/widl/server.c | 6 +- tools/widl/typegen.c | 71 +- tools/widl/widl.c | 1 + tools/widl/widltypes.h | 2 +- tools/winapi/msvcmaker | 16 +- tools/wine.inf | 1 + tools/wrc/utils.c | 1 + 326 files changed, 16125 insertions(+), 6647 deletions(-) create mode 100644 dlls/comdlg32/cdlg_Ro.rc copy dlls/{fusion => d3dx9_37}/Makefile.in (69%) create mode 100644 dlls/d3dx9_37/d3dx9_37.spec copy dlls/{mscms/mscms_main.c => d3dx9_37/d3dx9_37_main.c} (57%) create mode 100644 dlls/fusion/asmcache.c create mode 100644 dlls/hhctrl.ocx/Ru.rc copy dlls/{mshtml => jscript}/tests/Makefile.in (57%) create mode 100644 dlls/jscript/tests/jscript.c create mode 100644 dlls/kernel32/nls/rmc.nls rewrite dlls/mscms/handle.c (67%) create mode 100644 dlls/mshtml/htmllocation.c create mode 100644 dlls/mshtml/script.c create mode 100644 dlls/mshtml/tests/script.c create mode 100644 dlls/msxml3/saxreader.c create mode 100644 dlls/shlwapi/shlwapi_Ru.rc create mode 100644 dlls/shlwapi/tests/istream.c create mode 100644 dlls/user32/resources/user32_Ro.rc create mode 100644 dlls/wined3d/ati_fragment_shader.c delete mode 100644 loader/.gitignore rewrite programs/regedit/regedit.ico (89%) create mode 100644 programs/regedit/regedit.svg copy {dlls/fusion => programs/services}/Makefile.in (62%) create mode 100644 programs/services/services.c copy programs/{winetest/resource.h => services/services.h} (51%) create mode 100644 programs/services/utils.c rewrite programs/winefile/winefile.ico (100%) create mode 100644 programs/winefile/winefile.svg rename programs/winhelp/{Va.rc => Rm.rc} (63%) diff --git a/.gitignore b/.gitignore index a11719f31c2..4003d886342 100644 --- a/.gitignore +++ b/.gitignore @@ -163,6 +163,9 @@ dlls/iphlpapi/tests/testlist.c dlls/itss/tests/*.ok dlls/itss/tests/itss_crosstest.exe dlls/itss/tests/testlist.c +dlls/jscript/tests/*.ok +dlls/jscript/tests/jscript_crosstest.exe +dlls/jscript/tests/testlist.c dlls/kernel32/libkernel32.def dlls/kernel32/nls/winerr_deu.mc.rc dlls/kernel32/nls/winerr_enu.mc.rc @@ -579,6 +582,7 @@ programs/rpcss/irot_s.c programs/rpcss/rpcss programs/rundll32/rundll32 programs/secedit/secedit +programs/services/services programs/spoolsv/spoolsv programs/start/start programs/svchost/svchost @@ -629,6 +633,7 @@ programs/winetest/inetcomm_test.exe programs/winetest/infosoft_test.exe programs/winetest/iphlpapi_test.exe programs/winetest/itss_test.exe +programs/winetest/jscript_test.exe programs/winetest/kernel32_test.exe programs/winetest/localspl_test.exe programs/winetest/localui_test.exe diff --git a/Makefile.in b/Makefile.in index 6c1653b3323..cfc8be9da50 100644 --- a/Makefile.in +++ b/Makefile.in @@ -227,6 +227,7 @@ ALL_MAKEFILES = \ dlls/d3dx9_35/Makefile \ dlls/d3dx9_36/Makefile \ dlls/d3dx9_36/tests/Makefile \ + dlls/d3dx9_37/Makefile \ dlls/d3dxof/Makefile \ dlls/dbghelp/Makefile \ dlls/dciman32/Makefile \ @@ -299,6 +300,7 @@ ALL_MAKEFILES = \ dlls/itss/Makefile \ dlls/itss/tests/Makefile \ dlls/jscript/Makefile \ + dlls/jscript/tests/Makefile \ dlls/kernel32/Makefile \ dlls/kernel32/tests/Makefile \ dlls/localspl/Makefile \ @@ -537,6 +539,7 @@ ALL_MAKEFILES = \ programs/rpcss/Makefile \ programs/rundll32/Makefile \ programs/secedit/Makefile \ + programs/services/Makefile \ programs/spoolsv/Makefile \ programs/start/Makefile \ programs/svchost/Makefile \ @@ -648,6 +651,7 @@ dlls/d3dx9_34/Makefile: dlls/d3dx9_34/Makefile.in dlls/Makedll.rules dlls/d3dx9_35/Makefile: dlls/d3dx9_35/Makefile.in dlls/Makedll.rules dlls/d3dx9_36/Makefile: dlls/d3dx9_36/Makefile.in dlls/Makedll.rules dlls/d3dx9_36/tests/Makefile: dlls/d3dx9_36/tests/Makefile.in dlls/Maketest.rules +dlls/d3dx9_37/Makefile: dlls/d3dx9_37/Makefile.in dlls/Makedll.rules dlls/d3dxof/Makefile: dlls/d3dxof/Makefile.in dlls/Makedll.rules dlls/dbghelp/Makefile: dlls/dbghelp/Makefile.in dlls/Makedll.rules dlls/dciman32/Makefile: dlls/dciman32/Makefile.in dlls/Makedll.rules @@ -720,6 +724,7 @@ dlls/itircl/Makefile: dlls/itircl/Makefile.in dlls/Makedll.rules dlls/itss/Makefile: dlls/itss/Makefile.in dlls/Makedll.rules dlls/itss/tests/Makefile: dlls/itss/tests/Makefile.in dlls/Maketest.rules dlls/jscript/Makefile: dlls/jscript/Makefile.in dlls/Makedll.rules +dlls/jscript/tests/Makefile: dlls/jscript/tests/Makefile.in dlls/Maketest.rules dlls/kernel32/Makefile: dlls/kernel32/Makefile.in dlls/Makedll.rules dlls/kernel32/tests/Makefile: dlls/kernel32/tests/Makefile.in dlls/Maketest.rules dlls/localspl/Makefile: dlls/localspl/Makefile.in dlls/Makedll.rules @@ -958,6 +963,7 @@ programs/regsvr32/Makefile: programs/regsvr32/Makefile.in programs/Makeprog.rule programs/rpcss/Makefile: programs/rpcss/Makefile.in programs/Makeprog.rules programs/rundll32/Makefile: programs/rundll32/Makefile.in programs/Makeprog.rules programs/secedit/Makefile: programs/secedit/Makefile.in programs/Makeprog.rules +programs/services/Makefile: programs/services/Makefile.in programs/Makeprog.rules programs/spoolsv/Makefile: programs/spoolsv/Makefile.in programs/Makeprog.rules programs/start/Makefile: programs/start/Makefile.in programs/Makeprog.rules programs/svchost/Makefile: programs/svchost/Makefile.in programs/Makeprog.rules diff --git a/configure b/configure index bde80163a65..6437c59dde6 100755 --- a/configure +++ b/configure @@ -21423,6 +21423,8 @@ ac_config_files="$ac_config_files dlls/d3dx9_36/Makefile" ac_config_files="$ac_config_files dlls/d3dx9_36/tests/Makefile" +ac_config_files="$ac_config_files dlls/d3dx9_37/Makefile" + ac_config_files="$ac_config_files dlls/d3dxof/Makefile" ac_config_files="$ac_config_files dlls/dbghelp/Makefile" @@ -21567,6 +21569,8 @@ ac_config_files="$ac_config_files dlls/itss/tests/Makefile" ac_config_files="$ac_config_files dlls/jscript/Makefile" +ac_config_files="$ac_config_files dlls/jscript/tests/Makefile" + ac_config_files="$ac_config_files dlls/kernel32/Makefile" ac_config_files="$ac_config_files dlls/kernel32/tests/Makefile" @@ -22043,6 +22047,8 @@ ac_config_files="$ac_config_files programs/rundll32/Makefile" ac_config_files="$ac_config_files programs/secedit/Makefile" +ac_config_files="$ac_config_files programs/services/Makefile" + ac_config_files="$ac_config_files programs/spoolsv/Makefile" ac_config_files="$ac_config_files programs/start/Makefile" @@ -22740,6 +22746,7 @@ do "dlls/d3dx9_35/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/d3dx9_35/Makefile" ;; "dlls/d3dx9_36/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/d3dx9_36/Makefile" ;; "dlls/d3dx9_36/tests/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/d3dx9_36/tests/Makefile" ;; + "dlls/d3dx9_37/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/d3dx9_37/Makefile" ;; "dlls/d3dxof/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/d3dxof/Makefile" ;; "dlls/dbghelp/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/dbghelp/Makefile" ;; "dlls/dciman32/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/dciman32/Makefile" ;; @@ -22812,6 +22819,7 @@ do "dlls/itss/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/itss/Makefile" ;; "dlls/itss/tests/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/itss/tests/Makefile" ;; "dlls/jscript/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/jscript/Makefile" ;; + "dlls/jscript/tests/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/jscript/tests/Makefile" ;; "dlls/kernel32/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/kernel32/Makefile" ;; "dlls/kernel32/tests/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/kernel32/tests/Makefile" ;; "dlls/localspl/Makefile") CONFIG_FILES="$CONFIG_FILES dlls/localspl/Makefile" ;; @@ -23050,6 +23058,7 @@ do "programs/rpcss/Makefile") CONFIG_FILES="$CONFIG_FILES programs/rpcss/Makefile" ;; "programs/rundll32/Makefile") CONFIG_FILES="$CONFIG_FILES programs/rundll32/Makefile" ;; "programs/secedit/Makefile") CONFIG_FILES="$CONFIG_FILES programs/secedit/Makefile" ;; + "programs/services/Makefile") CONFIG_FILES="$CONFIG_FILES programs/services/Makefile" ;; "programs/spoolsv/Makefile") CONFIG_FILES="$CONFIG_FILES programs/spoolsv/Makefile" ;; "programs/start/Makefile") CONFIG_FILES="$CONFIG_FILES programs/start/Makefile" ;; "programs/svchost/Makefile") CONFIG_FILES="$CONFIG_FILES programs/svchost/Makefile" ;; diff --git a/configure.ac b/configure.ac index 8be9bc015f6..82023bb1727 100644 --- a/configure.ac +++ b/configure.ac @@ -1741,6 +1741,7 @@ AC_CONFIG_FILES([dlls/d3dx9_34/Makefile]) AC_CONFIG_FILES([dlls/d3dx9_35/Makefile]) AC_CONFIG_FILES([dlls/d3dx9_36/Makefile]) AC_CONFIG_FILES([dlls/d3dx9_36/tests/Makefile]) +AC_CONFIG_FILES([dlls/d3dx9_37/Makefile]) AC_CONFIG_FILES([dlls/d3dxof/Makefile]) AC_CONFIG_FILES([dlls/dbghelp/Makefile]) AC_CONFIG_FILES([dlls/dciman32/Makefile]) @@ -1813,6 +1814,7 @@ AC_CONFIG_FILES([dlls/itircl/Makefile]) AC_CONFIG_FILES([dlls/itss/Makefile]) AC_CONFIG_FILES([dlls/itss/tests/Makefile]) AC_CONFIG_FILES([dlls/jscript/Makefile]) +AC_CONFIG_FILES([dlls/jscript/tests/Makefile]) AC_CONFIG_FILES([dlls/kernel32/Makefile]) AC_CONFIG_FILES([dlls/kernel32/tests/Makefile]) AC_CONFIG_FILES([dlls/localspl/Makefile]) @@ -2051,6 +2053,7 @@ AC_CONFIG_FILES([programs/regsvr32/Makefile]) AC_CONFIG_FILES([programs/rpcss/Makefile]) AC_CONFIG_FILES([programs/rundll32/Makefile]) AC_CONFIG_FILES([programs/secedit/Makefile]) +AC_CONFIG_FILES([programs/services/Makefile]) AC_CONFIG_FILES([programs/spoolsv/Makefile]) AC_CONFIG_FILES([programs/start/Makefile]) AC_CONFIG_FILES([programs/svchost/Makefile]) diff --git a/dlls/Makefile.in b/dlls/Makefile.in index 5892e639637..d44959e3fd1 100644 --- a/dlls/Makefile.in +++ b/dlls/Makefile.in @@ -64,6 +64,7 @@ BASEDIRS = \ d3dx9_34 \ d3dx9_35 \ d3dx9_36 \ + d3dx9_37 \ d3dxof \ dbghelp \ dciman32 \ @@ -310,6 +311,7 @@ TESTSUBDIRS = \ infosoft/tests \ iphlpapi/tests \ itss/tests \ + jscript/tests \ kernel32/tests \ localspl/tests \ localui/tests \ diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec index d066f5c99bd..e9a3ccc5516 100644 --- a/dlls/advapi32/advapi32.spec +++ b/dlls/advapi32/advapi32.spec @@ -448,8 +448,8 @@ # @ stub QueryAllTracesA # @ stub QueryAllTracesW # @ stub QueryRecoveryAgentsOnEncryptedFile -# @ stub QueryServiceConfig2A -# @ stub QueryServiceConfig2W +@ stdcall QueryServiceConfig2A(long long ptr long ptr) +@ stdcall QueryServiceConfig2W(long long ptr long ptr) @ stdcall QueryServiceConfigA(long ptr long ptr) @ stdcall QueryServiceConfigW(long ptr long ptr) @ stdcall QueryServiceLockStatusA(long ptr long ptr) diff --git a/dlls/advapi32/crypt.c b/dlls/advapi32/crypt.c index 601d095c9f9..0fadc78c9d3 100644 --- a/dlls/advapi32/crypt.c +++ b/dlls/advapi32/crypt.c @@ -44,6 +44,7 @@ #include "crypt.h" #include "winnls.h" #include "winreg.h" +#include "rpc.h" #include "wine/debug.h" #include "wine/unicode.h" #include "winternl.h" @@ -266,6 +267,54 @@ error: #undef CRYPT_GetProvFuncOpt +static void CRYPT_CreateMachineGuid(void) +{ + static const WCHAR cryptographyW[] = { + 'S','o','f','t','w','a','r','e','\\', + 'M','i','c','r','o','s','o','f','t','\\', + 'C','r','y','p','t','o','g','r','a','p','h','y',0 }; + static const WCHAR machineGuidW[] = { + 'M','a','c','h','i','n','e','G','u','i','d',0 }; + LONG r; + HKEY key; + + r = RegOpenKeyExW(HKEY_LOCAL_MACHINE, cryptographyW, 0, KEY_ALL_ACCESS, + &key); + if (!r) + { + DWORD size; + + r = RegQueryValueExW(key, machineGuidW, NULL, NULL, NULL, &size); + if (r == ERROR_FILE_NOT_FOUND) + { + static const WCHAR rpcrt4[] = { + 'r','p','c','r','t','4',0 }; + HMODULE lib = LoadLibraryW(rpcrt4); + + if (lib) + { + RPC_STATUS (RPC_ENTRY *pUuidCreate)(UUID *); + RPC_STATUS (RPC_ENTRY *pUuidToString)(UUID *, WCHAR **); + RPC_STATUS (RPC_ENTRY *pRpcStringFree)(WCHAR **); + UUID uuid; + WCHAR *uuidStr; + + pUuidCreate = GetProcAddress(lib, "UuidCreate"); + pUuidToString = GetProcAddress(lib, "UuidToStringW"); + pRpcStringFree = GetProcAddress(lib, "RpcStringFreeW"); + pUuidCreate(&uuid); + pUuidToString(&uuid, &uuidStr); + RegSetValueExW(key, machineGuidW, 0, REG_SZ, + (const BYTE *)uuidStr, + (lstrlenW(uuidStr)+1)*sizeof(WCHAR)); + pRpcStringFree(&uuidStr); + FreeLibrary(lib); + } + } + RegCloseKey(key); + } +} + /****************************************************************************** * CryptAcquireContextW (ADVAPI32.@) * @@ -309,6 +358,9 @@ BOOL WINAPI CryptAcquireContextW (HCRYPTPROV *phProv, LPCWSTR pszContainer, return FALSE; } + /* Make sure the MachineGuid value exists */ + CRYPT_CreateMachineGuid(); + if (!pszProvider || !*pszProvider) { /* No CSP name specified so try the user default CSP first diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c index ae565ab2095..82b5d1210ea 100644 --- a/dlls/advapi32/service.c +++ b/dlls/advapi32/service.c @@ -2053,6 +2053,121 @@ QueryServiceConfigW( SC_HANDLE hService, } /****************************************************************************** + * QueryServiceConfig2A [ADVAPI32.@] + * + * Note + * observed under win2k: + * The functions QueryServiceConfig2A and QueryServiceConfig2W return the same + * required buffer size (in byte) at least for dwLevel SERVICE_CONFIG_DESCRIPTION + */ +BOOL WINAPI QueryServiceConfig2A(SC_HANDLE hService, DWORD dwLevel, LPBYTE buffer, + DWORD size, LPDWORD needed) +{ + BOOL ret; + LPBYTE bufferW = NULL; + + if(buffer && size) + bufferW = HeapAlloc( GetProcessHeap(), 0, size); + + ret = QueryServiceConfig2W(hService, dwLevel, bufferW, size, needed); + if(!ret) goto cleanup; + + switch(dwLevel) { + case SERVICE_CONFIG_DESCRIPTION: + { LPSERVICE_DESCRIPTIONA configA = (LPSERVICE_DESCRIPTIONA) buffer; + LPSERVICE_DESCRIPTIONW configW = (LPSERVICE_DESCRIPTIONW) bufferW; + if (configW->lpDescription) { + DWORD sz; + configA->lpDescription = (LPSTR)(configA + 1); + sz = WideCharToMultiByte( CP_ACP, 0, configW->lpDescription, -1, + configA->lpDescription, size - sizeof(SERVICE_DESCRIPTIONA), NULL, NULL ); + if (!sz) { + FIXME("WideCharToMultiByte failed for configW->lpDescription\n"); + ret = FALSE; + configA->lpDescription = NULL; + } + } + else configA->lpDescription = NULL; + } + break; + default: + FIXME("conversation W->A not implemented for level %d\n", dwLevel); + ret = FALSE; + } + +cleanup: + HeapFree( GetProcessHeap(), 0, bufferW); + return ret; +} + +/****************************************************************************** + * QueryServiceConfig2W [ADVAPI32.@] + */ +BOOL WINAPI QueryServiceConfig2W(SC_HANDLE hService, DWORD dwLevel, LPBYTE buffer, + DWORD size, LPDWORD needed) +{ + DWORD sz, type; + HKEY hKey; + LONG r; + struct sc_service *hsvc; + + if(dwLevel != SERVICE_CONFIG_DESCRIPTION) { + if((dwLevel == SERVICE_CONFIG_DELAYED_AUTO_START_INFO) || + (dwLevel == SERVICE_CONFIG_FAILURE_ACTIONS) || + (dwLevel == SERVICE_CONFIG_FAILURE_ACTIONS_FLAG) || + (dwLevel == SERVICE_CONFIG_PRESHUTDOWN_INFO) || + (dwLevel == SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO) || + (dwLevel == SERVICE_CONFIG_SERVICE_SID_INFO)) + FIXME("Level %d not implemented\n", dwLevel); + SetLastError(ERROR_INVALID_LEVEL); + return FALSE; + } + if(!needed || (!buffer && size)) { + SetLastError(ERROR_INVALID_ADDRESS); + return FALSE; + } + + TRACE("%p 0x%d %p 0x%d %p\n", hService, dwLevel, buffer, size, needed); + + hsvc = sc_handle_get_handle_data(hService, SC_HTYPE_SERVICE); + if (!hsvc) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + hKey = hsvc->hkey; + + switch(dwLevel) { + case SERVICE_CONFIG_DESCRIPTION: { + static const WCHAR szDescription[] = {'D','e','s','c','r','i','p','t','i','o','n',0}; + LPSERVICE_DESCRIPTIONW config = (LPSERVICE_DESCRIPTIONW) buffer; + LPBYTE strbuf = NULL; + *needed = sizeof (SERVICE_DESCRIPTIONW); + sz = size - *needed; + if(config && (*needed <= size)) + strbuf = (LPBYTE) (config + 1); + r = RegQueryValueExW( hKey, szDescription, 0, &type, strbuf, &sz ); + if((r == ERROR_SUCCESS) && ( type != REG_SZ)) { + FIXME("SERVICE_CONFIG_DESCRIPTION: don't know how to handle type %d\n", type); + return FALSE; + } + *needed += sz; + if(config) { + if(r == ERROR_SUCCESS) + config->lpDescription = (LPWSTR) (config + 1); + else + config->lpDescription = NULL; + } + } + break; + } + if(*needed > size) + SetLastError(ERROR_INSUFFICIENT_BUFFER); + + return (*needed <= size); +} + +/****************************************************************************** * EnumServicesStatusA [ADVAPI32.@] */ BOOL WINAPI diff --git a/dlls/advapi32/tests/crypt.c b/dlls/advapi32/tests/crypt.c index d6453d4bb98..63163dd01c2 100644 --- a/dlls/advapi32/tests/crypt.c +++ b/dlls/advapi32/tests/crypt.c @@ -871,6 +871,51 @@ static void test_set_provider_ex(void) LocalFree(pszProvName); } +static void test_machine_guid(void) +{ + char originalGuid[40], guid[40]; + LONG r; + HKEY key; + DWORD size; + HCRYPTPROV hCryptProv; + BOOL restoreGuid = FALSE, ret; + + r = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography", + 0, KEY_ALL_ACCESS, &key); + if (r != ERROR_SUCCESS) + { + skip("couldn't open HKLM\\Software\\Microsoft\\Cryptography\n"); + return; + } + /* Cache existing MachineGuid, and delete it */ + size = sizeof(originalGuid); + r = RegQueryValueExA(key, "MachineGuid", NULL, NULL, (BYTE *)originalGuid, + &size); + if (r == ERROR_SUCCESS) + { + restoreGuid = TRUE; + r = RegDeleteValueA(key, "MachineGuid"); + ok(!r, "RegDeleteValueA failed: %d\n", r); + } + else + ok(r == ERROR_FILE_NOT_FOUND, "expected ERROR_FILE_NOT_FOUND, got %d\n", + r); + /* Create and release a provider */ + ret = pCryptAcquireContextA(&hCryptProv, szKeySet, NULL, PROV_RSA_FULL, 0); + ok(ret, "CryptAcquireContextA failed: %08x\n", GetLastError()); + CryptReleaseContext(hCryptProv, 0); + /* Check that MachineGuid was created */ + size = sizeof(guid); + r = RegQueryValueExA(key, "MachineGuid", NULL, NULL, (BYTE *)guid, &size); + ok(!r, "expected to find MachineGuid: %d\n", r); + r = RegDeleteValueA(key, "MachineGuid"); + ok(!r, "RegDeleteValueA failed: %d\n", r); + if (restoreGuid) + RegSetValueExA(key, "MachineGuid", 0, REG_SZ, (const BYTE *)originalGuid, + strlen(originalGuid)+1); + RegCloseKey(key); +} + START_TEST(crypt) { init_function_pointers(); @@ -879,6 +924,7 @@ START_TEST(crypt) test_acquire_context(); test_incorrect_api_usage(); test_verify_sig(); + test_machine_guid(); clean_up_environment(); } diff --git a/dlls/advapi32/tests/service.c b/dlls/advapi32/tests/service.c index 8c717157a79..9b4eb728fb8 100644 --- a/dlls/advapi32/tests/service.c +++ b/dlls/advapi32/tests/service.c @@ -947,6 +947,13 @@ static void test_queryconfig2(void) ok(ERROR_INVALID_ADDRESS == GetLastError(), "expected error ERROR_INVALID_ADDRESS, got %d\n", GetLastError()); needed = 0; + SetLastError(0xdeadbeef); + ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION,buffer,sizeof(SERVICE_DESCRIPTIONA)-1,&needed); + ok(!ret, "expected QueryServiceConfig2A to fail\n"); + ok(ERROR_INSUFFICIENT_BUFFER == GetLastError(), "expected error ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError()); + ok(needed == sizeof(SERVICE_DESCRIPTIONA), "got %d\n", needed); + + needed = 0; pConfig->lpDescription = (LPSTR)0xdeadbeef; ret = pQueryServiceConfig2A(svc_handle, SERVICE_CONFIG_DESCRIPTION,buffer,sizeof(SERVICE_DESCRIPTIONA),&needed); ok(ret, "expected QueryServiceConfig2A to succeed\n"); diff --git a/dlls/comctl32/comctl32.h b/dlls/comctl32/comctl32.h index 5e74a1600b6..51320e658cc 100644 --- a/dlls/comctl32/comctl32.h +++ b/dlls/comctl32/comctl32.h @@ -128,6 +128,7 @@ typedef struct COLORREF clrBtnFace; /* COLOR_BTNFACE */ COLORREF clrHighlight; /* COLOR_HIGHLIGHT */ COLORREF clrHighlightText; /* COLOR_HIGHLIGHTTEXT */ + COLORREF clrHotTrackingColor; /* COLOR_HOTLIGHT */ COLORREF clr3dHilight; /* COLOR_3DHILIGHT */ COLORREF clr3dShadow; /* COLOR_3DSHADOW */ COLORREF clr3dDkShadow; /* COLOR_3DDKSHADOW */ diff --git a/dlls/comctl32/commctrl.c b/dlls/comctl32/commctrl.c index 0e901977dfd..554eb4dde9f 100644 --- a/dlls/comctl32/commctrl.c +++ b/dlls/comctl32/commctrl.c @@ -1425,6 +1425,7 @@ COMCTL32_RefreshSysColors(void) comctl32_color.clrBtnFace = GetSysColor (COLOR_BTNFACE); comctl32_color.clrHighlight = GetSysColor (COLOR_HIGHLIGHT); comctl32_color.clrHighlightText = GetSysColor (COLOR_HIGHLIGHTTEXT); + comctl32_color.clrHotTrackingColor = GetSysColor (COLOR_HOTLIGHT); comctl32_color.clr3dHilight = GetSysColor (COLOR_3DHILIGHT); comctl32_color.clr3dShadow = GetSysColor (COLOR_3DSHADOW); comctl32_color.clr3dDkShadow = GetSysColor (COLOR_3DDKSHADOW); diff --git a/dlls/comctl32/rebar.c b/dlls/comctl32/rebar.c index 7b1f00842c9..033b47489bb 100644 --- a/dlls/comctl32/rebar.c +++ b/dlls/comctl32/rebar.c @@ -1153,7 +1153,7 @@ static int get_row_end_for_band(const REBAR_INFO *infoPtr, INT iBand) return iBand; } -/* Compute the rcBand.{left,right} from the cxEffective bands widths computed earier. +/* Compute the rcBand.{left,right} from the cxEffective bands widths computed earlier. * iBeginBand must be visible */ static void REBAR_SetRowRectsX(const REBAR_INFO *infoPtr, INT iBeginBand, INT iEndBand) { diff --git a/dlls/comdlg32/cdlg_De.rc b/dlls/comdlg32/cdlg_De.rc index ed4ba97556b..00715882b96 100644 --- a/dlls/comdlg32/cdlg_De.rc +++ b/dlls/comdlg32/cdlg_De.rc @@ -74,7 +74,7 @@ FONT 8, "MS Shell Dlg" { LTEXT "Drucker:", 1088, 6, 6, 40, 9 LTEXT "", 1089, 60, 6, 150, 9 - GROUPBOX "Druckbereicht", 1072, 6, 30, 160, 65, BS_GROUPBOX + GROUPBOX "Druckbereich", 1072, 6, 30, 160, 65, BS_GROUPBOX RADIOBUTTON "&Alles", rad1, 16, 45, 60, 12 RADIOBUTTON "A&uswahl", rad2, 16, 60, 60, 12 RADIOBUTTON "&Seiten", rad3, 16, 75, 60, 12 diff --git a/dlls/comdlg32/cdlg_Ro.rc b/dlls/comdlg32/cdlg_Ro.rc new file mode 100644 index 00000000000..e1cfc247da0 --- /dev/null +++ b/dlls/comdlg32/cdlg_Ro.rc @@ -0,0 +1,480 @@ +/* + * Copyright 1995 Alexandre Julliard + * Copyright 2008 Michael Stefaniuc + * + * 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 + */ + +/* + * WARNING: DO NOT CHANGE THE SIZE OF THE STANDARD DIALOG TEMPLATES. + */ + +LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL + +#pragma code_page(65001) + +OPEN_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Deschide" +FONT 8, "MS Shell Dlg" +{ + LTEXT "&Nume fișier:", 1090, 6, 6, 76, 9 + EDITTEXT edt1, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP + LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "&Dosare:", -1, 110, 6, 92, 9 + LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP + LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "&Tip de fișier:", 1089, 6, 104, 90, 9 + COMBOBOX cmb1, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "D&iscuri:", 1091, 110, 104, 92, 9 + COMBOBOX cmb2, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "Deschide", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Renunță", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Ajutor", pshHelp, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "&Numai-citire", chx1, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +} + + +SAVE_FILE DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 275, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Salvare ca ..." +FONT 8, "MS Shell Dlg" +{ + LTEXT "&Nume fișier:", 1090, 6, 6, 76, 9 + EDITTEXT edt1, 6, 16, 90, 12, ES_AUTOHSCROLL | ES_OEMCONVERT | WS_BORDER | WS_TABSTOP + LISTBOX 1120, 6, 32, 90, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "&Dosare:", -1, 110, 6, 92, 9 + LTEXT "", 1088, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP + LISTBOX 1121, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP + LTEXT "&Tip de fișier:", 1089, 6, 104, 90, 9 + COMBOBOX cmb1, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + LTEXT "D&iscuri:", 1091, 110, 104, 92, 9 + COMBOBOX cmb2, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "Salvează ca", 1, 208, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Renunță", 2, 208, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Ajutor", pshHelp, 208, 46, 56, 14, WS_GROUP | WS_TABSTOP + CHECKBOX "&Numai-citire", chx1, 208, 68, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +} + + +PRINT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Tipărire" +FONT 8, "MS Shell Dlg" +{ + LTEXT "Imprimantă:", 1088, 6, 6, 40, 9 + LTEXT "", 1089, 60, 6, 150, 9 + GROUPBOX "Interval tipărire", grp1, 6, 30, 160, 65, BS_GROUPBOX + RADIOBUTTON "&Toate", rad1, 16, 45, 60, 12 + RADIOBUTTON "S&elecție", rad2, 16, 60, 60, 12 + RADIOBUTTON "&Pagini", rad3, 16, 75, 60, 12 + DEFPUSHBUTTON "Tipăreşte", 1, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Renunță", 2, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Setează", psh1, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + LTEXT "&De la:", 1090, 60, 80, 30, 9 + LTEXT "&La:", 1091, 120, 80, 30, 9 + LTEXT "&Calitate tipărire:", 1092, 6, 100, 76, 9 + COMBOBOX cmb1, 80, 100, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + CHECKBOX "Tipăreşte în fişier", chx1, 20, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Comprimat", chx2, 160, 100, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP +} + + +PRINT_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 264, 134 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Setări tipărire" +FONT 8, "MS Shell Dlg" +{ + GROUPBOX "Imprimantă", grp1, 6, 10, 180, 65, BS_GROUPBOX + RADIOBUTTON "&Imprimantă implicită", rad1, 16, 20, 80, 12 + LTEXT "[nimic]", 1088, 35, 35, 120, 9 + RADIOBUTTON "I&mprimantă specifică", rad2, 16, 50, 80, 12 + COMBOBOX cmb1, 35, 65, 149, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + DEFPUSHBUTTON "OK", IDOK, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Renunță", IDCANCEL, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Setează", psh1, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP + GROUPBOX "Orientare", grp2, 6, 85, 100, 50, BS_GROUPBOX + RADIOBUTTON "P&ortret", rad3, 50, 100, 40, 12 + RADIOBUTTON "&Peisaj", rad4, 50, 115, 40, 12 + ICON "LANDSCAP", stc10, 10, 95, 32, 32 + ICON "PORTRAIT", stc11, 10, 95, 32, 32 + GROUPBOX "Hârtie", grp3, 120, 85, 180, 50, BS_GROUPBOX + LTEXT "&Mărime", 1089, 130, 95, 30, 9 + LTEXT "&Sursă", 1090, 130, 110, 30, 9 + COMBOBOX cmb2, 155, 95, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP + COMBOBOX cmb3, 155, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP +} + + +CHOOSE_FONT DIALOG DISCARDABLE 13, 54, 264, 147 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Font" +FONT 8, "MS Shell Dlg" +{ + LTEXT "&Font:",stc1 ,6,3,40,9 + COMBOBOX cmb1, 6,13,94,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE + LTEXT "&Stil font:",stc2 ,108,3,44,9 + COMBOBOX cmb2,108,13,64,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE + LTEXT "&Mărime:",stc3,179,3,30,9 + COMBOBOX cmb3,179,13,32,54, CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | CBS_DISABLENOSCROLL | + WS_VSCROLL | WS_TABSTOP | CBS_SIMPLE | CBS_SORT + DEFPUSHBUTTON "OK",IDOK,218,6,40,14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "Renunță",IDCANCEL,218,23,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "A&plică", psh3,218,40,40,14,WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Ajutor" , pshHelp,218,57,40,14,WS_GROUP | WS_TABSTOP + GROUPBOX "Efecte",grp1,6,72,84,34,WS_GROUP + CHECKBOX "&Linie mijloc", chx1, 10,82,50,10, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "&Subliniat", chx2, 10,94,50,10, BS_AUTOCHECKBOX + LTEXT "&Culoare:", stc4 ,6,110,30,9 + COMBOBOX cmb4,6,120,84,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | + CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Eșantion",grp2,98,72,120,36,WS_GROUP + CTEXT "AaBbYyZz",stc5,103,80,109,24,SS_NOPREFIX | NOT WS_VISIBLE + LTEXT "Scr&ipt:",stc7 ,98,114,40,9 + COMBOBOX cmb5,98,124,120,90,CBS_DROPDOWNLIST | CBS_HASSTRINGS | + CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP +} + + +CHOOSE_COLOR DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 300, 185 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Culoare" +FONT 8, "MS Shell Dlg" +{ + LTEXT "Culori de &basă:", 1088, 4, 4, 140, 10 + LTEXT "&Culori personalizate:", 1089, 4, 106, 140, 10 + LTEXT "Culoare | Sol&id", 1090, 150, 151, 48, 10 + LTEXT "&Roșu:", 726 /*1094*/,249,126,24,10 + EDITTEXT 706, 275,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&Verde:",727/*1095*/,249,140,24,10 + EDITTEXT 707, 275,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&Albastru:",728 /*1096*/,249,154,24,10 + EDITTEXT 708, 275,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&Nuanță:" ,723 /*1091*/,202,126,22,10 + EDITTEXT 703, 226,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&Sat:" ,724 /*1092*/,202,140,22,10 + EDITTEXT 704, 226,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "&Lum:" ,725 /*1093*/,202,154,22,10 + EDITTEXT 705, 226,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP + CONTROL "" ,720,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,14,140,86 + CONTROL "" ,721,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP,4,116,140,28 + CONTROL "" ,710,"STATIC",WS_BORDER|SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,4,118,116 + CONTROL "" ,702,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 278,4,8,116 + CONTROL "" ,709,"STATIC",SS_SIMPLE|WS_TABSTOP|WS_GROUP, 152,124,40,26 + DEFPUSHBUTTON "OK", 1, 4, 166, 44, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Renunță", 2, 52, 166, 44, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Ajutor", pshHelp,100,166, 44, 14 + PUSHBUTTON "&Adaugă culori personalizate", 712/*1024*/, 152, 166, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Definește colori personalizate >>", 719/*1025*/, 4, 150, 142, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&i",713,300,200,4,14 /* just a dummy: 'i' is like &i in "sol&id" */ +} + + +FINDDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 236, 62 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Caută" +FONT 8, "MS Shell Dlg" +{ + LTEXT "&Caută:", -1, 4, 8, 42, 8 + EDITTEXT edt1, 47, 7, 128, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&Numai cuvinte întregi", chx1, 4, 26, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Sensibil la registru", chx2, 4, 42, 100, 12, BS_AUTOCHECKBOX | WS_TABSTOP + GROUPBOX "Direcție", grp1, 107, 26, 68, 28 + CONTROL "&Sus", rad1, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 111, 38, 30, 12 + CONTROL "&Jos", rad2, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 138, 38, 30, 12 + + DEFPUSHBUTTON "Caută &înainte", IDOK, 182, 5, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "Renunță", IDCANCEL , 182, 23, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Ajutor", pshHelp , 182, 45, 50, 14, WS_GROUP | WS_TABSTOP +} + + +REPLACEDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 230, 94 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Înlocuire" +FONT 8, "MS Shell Dlg" +{ + LTEXT "Caută:", -1, 4, 9, 48, 8 + EDITTEXT edt1, 54, 7, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + LTEXT "În&locuieşte cu:", -1, 4, 26, 48, 8 + EDITTEXT edt2, 54, 24, 114, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + CHECKBOX "&Numai cuvinte întregi", chx1, 5, 46, 100, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Sensibil la registru", chx2, 5, 62, 100, 12, BS_AUTOCHECKBOX | WS_TABSTOP + + DEFPUSHBUTTON "Caută &înainte", IDOK, 174, 4, 50, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON + PUSHBUTTON "&Înlocuieşte", psh1 , 174, 21, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Înlocuieşte &tot", psh2 , 174, 38, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Renunță", IDCANCEL , 174, 55, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Ajutor", pshHelp , 174, 75, 50, 14, WS_GROUP | WS_TABSTOP +} + + +PRINT32 DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 186 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | + DS_CONTEXTHELP | DS_3DLOOK +CAPTION "Tipărire" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 180,164, 48,14, WS_GROUP | BS_DEFPUSHBUTTON + PUSHBUTTON "Renunță", IDCANCEL, 232,164, 48,14, WS_GROUP + PUSHBUTTON "&Ajutor", pshHelp, 50, 161, 48,14, WS_GROUP + + GROUPBOX "Imprimantă", grp4, 8, 4, 272,84, WS_GROUP + CONTROL "Tipăreşte în &fişier",chx1, "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,212,70,64,12 + PUSHBUTTON "&Proprietăți", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "&Nume:", stc6, 16, 20, 36,8 + COMBOBOX cmb4, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "Stare:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "Dummy State", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Tip:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "Dummy Type", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Loc:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "Dummy Location", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Comentariu:", stc9, 16, 72, 36,10, SS_NOPREFIX + LTEXT "Dummy Remark", stc13, 52, 72, 152,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + + GROUPBOX "Copii", grp2, 160, 92, 120,64, WS_GROUP + LTEXT "Număr de &copii:",stc5,168,108,68,8 + ICON "", ico3, 162,124, 76,24, WS_GROUP | SS_CENTERIMAGE + CONTROL "C&olaționate", chx2,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,240,130,36,12 + EDITTEXT edt3, 240,106, 32,12, WS_GROUP | ES_NUMBER + + GROUPBOX "Interval tipărire",grp1, 8,92, 144,64, WS_GROUP + CONTROL "&Toate", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,16,106,64,12 + CONTROL "Pa&ginile", rad3,"Button",BS_AUTORADIOBUTTON,16,122,36,12 + CONTROL "&Selecție", rad2,"Button",BS_AUTORADIOBUTTON,16,138,64,12 + EDITTEXT edt1, 74,122, 26,12, WS_GROUP | ES_NUMBER + EDITTEXT edt2, 118,122, 26,12, WS_GROUP | ES_NUMBER + RTEXT "&de la:", stc2, 52,124, 20,8 + RTEXT "&la:", stc3, 100,124, 16,8 +} + +PRINT32_SETUP DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 288, 178 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | + DS_CONTEXTHELP | DS_3DLOOK +CAPTION "Setări tipărire" +FONT 8, "MS Shell Dlg" +BEGIN + DEFPUSHBUTTON "OK",IDOK,180,156,48,14,WS_GROUP + PUSHBUTTON "Renunță",IDCANCEL,232,156,48,14 +/* PUSHBUTTON "Network...", psh5, 284,156,48,14 */ + + GROUPBOX "Imprimantă", grp4, 8, 4, 272,84, WS_GROUP + PUSHBUTTON "&Proprietăți", psh2, 212, 17, 60,14, WS_GROUP + LTEXT "&Nume:", stc6, 16, 20, 36,8 + COMBOBOX cmb1, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "Stare:", stc8, 16, 36, 36,10, SS_NOPREFIX + LTEXT "[nimic]", stc12, 52, 36, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Tip:", stc7, 16, 48, 36,10, SS_NOPREFIX + LTEXT "[nimic]", stc11, 52, 48, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Loc:", stc10, 16, 60, 36,10, SS_NOPREFIX + LTEXT "[nimic]", stc14, 52, 60, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + LTEXT "Comentariu:", stc9, 16, 72, 36,10, SS_NOPREFIX + LTEXT "[nimic]", stc13, 52, 72, 224,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP + + GROUPBOX "Hârtie", grp2, 8, 92, 164,56, WS_GROUP + LTEXT "&Mărime:", stc2, 16,108, 36, 8 + COMBOBOX cmb2, 52,106, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + LTEXT "&Sursă:", stc3, 16,128, 36, 8 + COMBOBOX cmb3, 52,126, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP + + GROUPBOX "Orientare", grp1, 180, 92, 100,56, WS_GROUP + ICON "", ico1, 195,112, 18,20, WS_GROUP + CONTROL "P&ortret", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP |WS_TABSTOP,224,106,52,12 + CONTROL "&Peisaj", rad2,"Button",BS_AUTORADIOBUTTON,224,126,52,12 +END + +PAGESETUPDLGORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 32, 32, 240, 240 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Setare Pagină" +FONT 8, "MS Shell Dlg" +BEGIN + CONTROL "", rct1, "Static", SS_WHITERECT, 80, 8, 80, 80 + CONTROL "", rct2, "Static", SS_GRAYRECT, 160, 12, 4, 80 + CONTROL "", rct3, "Static", SS_GRAYRECT, 84, 88, 80, 4 + GROUPBOX "Hârtie", grp2, 8, 96, 224, 56, BS_GROUPBOX + LTEXT "&Mărime:", stc2, 16, 112, 36, 8 + COMBOBOX cmb2, 64, 110, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL + LTEXT "S&ertar:", stc3, 16, 132, 36, 8 + COMBOBOX cmb3, 64, 130, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL + GROUPBOX "Orientare", grp1, 8, 156, 64, 56, BS_GROUPBOX + AUTORADIOBUTTON "P&ortret", rad1, 16, 170, 52, 12, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "&Peisaj", rad2, 16, 190, 52, 12, BS_AUTORADIOBUTTON + GROUPBOX "Margini", grp4, 80, 156, 152, 56, BS_GROUPBOX + LTEXT "S&tânga:", stc15, 84, 172, 27, 8 + EDITTEXT edt4, 111, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER + LTEXT "&Dreapta:", stc16, 159, 172, 27, 8 + EDITTEXT edt6, 187, 170, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER + LTEXT "&Sus:", stc17, 84, 192, 21, 8 + EDITTEXT edt5, 111, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER + LTEXT "&Jos:", stc18, 159, 192, 23, 8 + EDITTEXT edt7, 187, 190, 39, 12, WS_TABSTOP|WS_GROUP|WS_BORDER|ES_NUMBER + DEFPUSHBUTTON "OK", IDOK, 71, 220, 50, 14, BS_PUSHBUTTON + PUSHBUTTON "Renunță", IDCANCEL, 126, 220, 50, 14 + PUSHBUTTON "&Imprimantă...", psh3, 184, 220, 48, 14 +END + +NEWFILEOPENORD DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 280, 164 +STYLE DS_MODALFRAME | DS_CONTEXTHELP | WS_VISIBLE | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_CLIPCHILDREN +CAPTION "Deschide" +FONT 8, "MS Shell Dlg" +{ + LTEXT "Caută &în:",IDC_LOOKINSTATIC,4,6,43,8, SS_NOTIFY + COMBOBOX IDC_LOOKIN,49,3,132,100,CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_HASSTRINGS | WS_VSCROLL | WS_TABSTOP + + LTEXT "" , IDC_TOOLBARSTATIC, 181, 2, 102, 17, NOT WS_GROUP | NOT WS_VISIBLE + LISTBOX IDC_SHELLSTATIC,4,20,272,85, LBS_SORT | LBS_NOINTEGRALHEIGHT | LBS_MULTICOLUMN | WS_HSCROLL | NOT WS_VISIBLE + + LTEXT "&Nume fișier:",IDC_FILENAMESTATIC,5,112,46,8, SS_NOTIFY + EDITTEXT IDC_FILENAME,54,110,155,12,ES_AUTOHSCROLL + + LTEXT "&Tip de fișier:",IDC_FILETYPESTATIC,5,128,42,8, SS_NOTIFY + COMBOBOX IDC_FILETYPE,54,126,155,53,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + + CONTROL "Deschide pentru &numai-citire",IDC_OPENREADONLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,54,145,110,10 + + DEFPUSHBUTTON "&Deschide", IDOK,222,110,50,14 + PUSHBUTTON "Renunță", IDCANCEL,222,128,50,14 + PUSHBUTTON "&Ajutor", pshHelp,222,145,50,14 +} + +STRINGTABLE DISCARDABLE +{ + IDS_ABOUTBOX "&Despre testul FolderPicker" + IDS_DOCUMENTFOLDERS "Dosarele de documente" + IDS_PERSONAL "Documentele mele" + IDS_FAVORITES "Favoritele mele" + IDS_PATH "Calea de sistem" + IDS_DESKTOP "Birou" + IDS_FONTS "Fonturi" + IDS_MYCOMPUTER "Computerul meu" +} + +STRINGTABLE DISCARDABLE +{ + IDS_SYSTEMFOLDERS "Dosarele de sistem" + IDS_LOCALHARDRIVES "Discurile locale" + IDS_FILENOTFOUND "Fișierul nu a fost găsit" + IDS_VERIFYFILE "Verificați vă rog că numele de fișier este corect" + IDS_CREATEFILE "Fişierul nu există.\nDoriți să creați acest fișier?" + IDS_OVERWRITEFILE "Fișierul există deja.\nDoriți să îl înlocuiți?" + IDS_INVALID_FILENAME_TITLE "Caracter(e) invalid(e) în cale" + IDS_INVALID_FILENAME "Numele de fișier nu poate conține caracterele următoare: \n / : < > |" + IDS_PATHNOTEXISTING "Calea nu există" + IDS_FILENOTEXISTING "Fişierul nu există" +} + +STRINGTABLE DISCARDABLE +{ + IDS_UPFOLDER "Un nivel de dosare mai sus" + IDS_NEWFOLDER "Creează un dosar nou" + IDS_LISTVIEW "Listă" + IDS_REPORTVIEW "Detalii" + IDS_TODESKTOP "Navigează la birou" +} + +STRINGTABLE DISCARDABLE +{ + PD32_PRINT_TITLE "Tipărire" + + PD32_VALUE_UREADABLE "Înregistrare necitibilă" + PD32_INVALID_PAGE_RANGE "Această valoare nu este inclusă în intervalul de tipărire.\n Introduceți vă rog un număr între %d și %d." + PD32_FROM_NOT_ABOVE_TO "Numărul 'de la' nu poate fi mai mare decât numărul 'la'." + PD32_MARGINS_OVERLAP "Marginile se suprapun sau sunt in afara hârtiei.\nIntroduceți vă rog din nou marginile." + PD32_NR_OF_COPIES_EMPTY "Numărul de copii nu poate fi nul." + PD32_TOO_LARGE_COPIES "Imprimanta nu suportă un număr așa de mare de copii.\nIntroduceți vă rog un număr între 1 și %d." + PD32_PRINT_ERROR "S-a produs o eroare la tipărire." + PD32_NO_DEFAULT_PRINTER "Imprimanta implicită n-a fost definită." + PD32_CANT_FIND_PRINTER "Nu pot găsi imprimanta." + PD32_OUT_OF_MEMORY "Memorie insuficientă." + PD32_GENERIC_ERROR "S-a produs o eroare." + PD32_DRIVER_UNKNOWN "Driver de imprimantă necunoscut." + PD32_NO_DEVICES "Trebuie să instalați o imprimantă înainte de a executa activități în referință cu imprimanta ca spre exemplu setări pagină sau tipărirea unui document. Instalați va rog o imprimantă și reincercați." + + PD32_DEFAULT_PRINTER "Imprimantă implicită; " + PD32_NR_OF_DOCUMENTS_IN_QUEUE "%d documente sunt în coadă" + PD32_MARGINS_IN_INCHES "Margini [țoli]" + PD32_MARGINS_IN_MILIMETERS "Margini [mm]" + PD32_MILIMETERS "mm" + + PD32_PRINTER_STATUS_READY "Gata" + PD32_PRINTER_STATUS_PAUSED "Pauză; " + PD32_PRINTER_STATUS_ERROR "Eroare; " + PD32_PRINTER_STATUS_PENDING_DELETION "Aștept stergerea; " + PD32_PRINTER_STATUS_PAPER_JAM "Hârtie blocată în imprimantă; " + PD32_PRINTER_STATUS_PAPER_OUT "Fără hârtia; " + PD32_PRINTER_STATUS_MANUAL_FEED "Alimentați hârtia manual; " + PD32_PRINTER_STATUS_PAPER_PROBLEM "Problemă cu hârtia; " + PD32_PRINTER_STATUS_OFFLINE "Imprimantă deconectată; " + PD32_PRINTER_STATUS_IO_ACTIVE "I/O activ; " + PD32_PRINTER_STATUS_BUSY "Ocupat; " + PD32_PRINTER_STATUS_PRINTING "Tipăresc; " + PD32_PRINTER_STATUS_OUTPUT_BIN_FULL "Sertarul de ieșire este plin; " + PD32_PRINTER_STATUS_NOT_AVAILABLE "Indisponibil; " + PD32_PRINTER_STATUS_WAITING "Aștept; " + PD32_PRINTER_STATUS_PROCESSING "Procesez; " + PD32_PRINTER_STATUS_INITIALIZING "Initializez; " + PD32_PRINTER_STATUS_WARMING_UP "Încălzesc; " + PD32_PRINTER_STATUS_TONER_LOW "Toner puțin; " + PD32_PRINTER_STATUS_NO_TONER "Fără toner; " + PD32_PRINTER_STATUS_PAGE_PUNT "Page punt; " + PD32_PRINTER_STATUS_USER_INTERVENTION "Întrerupere utilizator; " + PD32_PRINTER_STATUS_OUT_OF_MEMORY "Memorie insuficientă; " + PD32_PRINTER_STATUS_DOOR_OPEN "Carcasa imprimantei este deschisă; " + PD32_PRINTER_STATUS_SERVER_UNKNOWN "Server de tipărire necunoscut; " + PD32_PRINTER_STATUS_POWER_SAVE "Economisire de energie; " +} + +STRINGTABLE DISCARDABLE /* Font styles */ +{ + IDS_FONT_REGULAR "Normal" + IDS_FONT_BOLD "Aldin" + IDS_FONT_ITALIC "Cursiv" + IDS_FONT_BOLD_ITALIC "Aldin cursiv" +} + +STRINGTABLE DISCARDABLE /* Color names */ +{ + IDS_COLOR_BLACK "Negru" + IDS_COLOR_MAROON "Maro" + IDS_COLOR_GREEN "Verde" + IDS_COLOR_OLIVE "Oliviu" + IDS_COLOR_NAVY "Ultramarin" + IDS_COLOR_PURPLE "Violet" + IDS_COLOR_TEAL "Verde-albastru" + IDS_COLOR_GRAY "Griu" + IDS_COLOR_SILVER "Argintiu" + IDS_COLOR_RED "Roșu" + IDS_COLOR_LIME "Verde deschis" + IDS_COLOR_YELLOW "Galben" + IDS_COLOR_BLUE "Albastru" + IDS_COLOR_FUCHSIA "Roz" + IDS_COLOR_AQUA "Azur" + IDS_COLOR_WHITE "Alb" +} + +STRINGTABLE DISCARDABLE +{ + IDS_FONT_SIZE "Alegeți o mărime de font între %d și %d puncte." + IDS_SAVE_BUTTON "&Salvează" + IDS_SAVE_IN "Salvează &în:" + IDS_SAVE "Salvează" + IDS_SAVE_AS "Salvează ca" + IDS_OPEN_FILE "Deschide fișier" +} + +#pragma code_page(default){ diff --git a/dlls/comdlg32/cdlg_Ru.rc b/dlls/comdlg32/cdlg_Ru.rc index 6e7adb8ccb0..16e02f10d4e 100644 --- a/dlls/comdlg32/cdlg_Ru.rc +++ b/dlls/comdlg32/cdlg_Ru.rc @@ -442,6 +442,14 @@ STRINGTABLE DISCARDABLE PD32_PRINTER_STATUS_POWER_SAVE "Ïèòàíèå â áåçîïàñíîì ðåæèìå; " } +STRINGTABLE DISCARDABLE /* Font styles */ +{ + IDS_FONT_REGULAR "Íîðìàëüíûé" + IDS_FONT_BOLD "Æèðíûé" + IDS_FONT_ITALIC "Êóðñèâ" + IDS_FONT_BOLD_ITALIC "Æèðíûé êóðñèâ" +} + STRINGTABLE DISCARDABLE /* Color names */ { IDS_COLOR_BLACK "׸ðíûé" diff --git a/dlls/comdlg32/filedlg.c b/dlls/comdlg32/filedlg.c index 13b4c79cbf5..3e662ec4619 100644 --- a/dlls/comdlg32/filedlg.c +++ b/dlls/comdlg32/filedlg.c @@ -889,7 +889,7 @@ static INT_PTR FILEDLG95_Handle_GetFilePath(HWND hwnd, DWORD size, LPVOID buffer { /* 'n' includes trailing \0 */ bufW[n-1] = '\\'; - memcpy( &bufW[n], lpstrFileList, (size-n)*sizeof(WCHAR) ); + lstrcpynW( &bufW[n], lpstrFileList, size - n ); } TRACE("returned -> %s\n",debugstr_wn(bufW, total)); } @@ -931,16 +931,15 @@ static INT_PTR FILEDLG95_Handle_GetFileSpec(HWND hwnd, DWORD size, LPVOID buffer FILEDLG95_FILENAME_GetFileNames(hwnd, &lpstrFileList, &sizeUsed, ' '); if( fodInfos->unicode ) { - LPWSTR bufW = buffer; - memcpy( bufW, lpstrFileList, sizeof(WCHAR)*sizeUsed ); + lstrcpynW( buffer, lpstrFileList, size ); } else { LPSTR bufA = buffer; - sizeUsed = WideCharToMultiByte( CP_ACP, 0, lpstrFileList, sizeUsed, - NULL, 0, NULL, NULL); - WideCharToMultiByte(CP_ACP, 0, lpstrFileList, sizeUsed, - bufA, size, NULL, NULL); + DWORD sizeA = WideCharToMultiByte( CP_ACP, 0, lpstrFileList, sizeUsed, NULL, 0, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, lpstrFileList, sizeUsed, bufA, size, NULL, NULL); + if (size && size < sizeA) bufA[size - 1] = 0; + sizeUsed = sizeA; } MemFree(lpstrFileList); @@ -3237,29 +3236,27 @@ static int FILEDLG95_FILENAME_GetFileNames (HWND hwnd, LPWSTR * lpstrFileList, U while ((lpstrEdit[nStrCharCount]!='"') && (nStrCharCount <= nStrLen)) { (*lpstrFileList)[nFileIndex++] = lpstrEdit[nStrCharCount]; - (*sizeUsed)++; nStrCharCount++; } (*lpstrFileList)[nFileIndex++] = separator; - (*sizeUsed)++; nFileCount++; } nStrCharCount++; } /* single, unquoted string */ - if ((nStrLen > 0) && (*sizeUsed == 0) ) + if ((nStrLen > 0) && (nFileIndex == 0) ) { lstrcpyW(*lpstrFileList, lpstrEdit); nFileIndex = lstrlenW(lpstrEdit) + 1; - (*sizeUsed) = nFileIndex; nFileCount = 1; } - /* trailing \0 */ - (*lpstrFileList)[nFileIndex] = '\0'; - (*sizeUsed)++; + /* trailing \0 */ + if (nFileIndex && separator) nFileIndex--; /* remove trailing separator */ + (*lpstrFileList)[nFileIndex++] = '\0'; + *sizeUsed = nFileIndex; MemFree(lpstrEdit); return nFileCount; } diff --git a/dlls/comdlg32/printdlg.c b/dlls/comdlg32/printdlg.c index f2d67b505eb..5169d1b891c 100644 --- a/dlls/comdlg32/printdlg.c +++ b/dlls/comdlg32/printdlg.c @@ -497,7 +497,6 @@ static BOOL PRINTDLG_PaperSizeA( for (i=0;ibase.streamed) + if (msg->base.state == MsgStateFinalized) + SetLastError(CRYPT_E_MSG_ERROR); + else if (msg->base.streamed) { __TRY { @@ -225,11 +228,15 @@ static BOOL CDataEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, } } if (!fFinal) + { ret = msg->base.stream_info.pfnStreamOutput( msg->base.stream_info.pvArg, (BYTE *)pbData, cbData, FALSE); + msg->base.state = MsgStateUpdated; + } else { + msg->base.state = MsgStateFinalized; if (msg->base.stream_info.cbContent == 0xffffffff) { BYTE indefinite_trailer[6] = { 0 }; @@ -265,6 +272,7 @@ static BOOL CDataEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, } else { + msg->base.state = MsgStateFinalized; if (!cbData) SetLastError(E_INVALIDARG); else @@ -504,12 +512,15 @@ static BOOL CHashEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, TRACE("(%p, %p, %d, %d)\n", hCryptMsg, pbData, cbData, fFinal); - if (msg->base.streamed || (msg->base.open_flags & CMSG_DETACHED_FLAG)) + if (msg->base.state == MsgStateFinalized) + SetLastError(CRYPT_E_MSG_ERROR); + else if (msg->base.streamed || (msg->base.open_flags & CMSG_DETACHED_FLAG)) { /* Doesn't do much, as stream output is never called, and you * can't get the content. */ ret = CryptHashData(msg->hash, pbData, cbData, 0); + msg->base.state = fFinal ? MsgStateFinalized : MsgStateUpdated; } else { @@ -529,6 +540,7 @@ static BOOL CHashEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, else ret = FALSE; } + msg->base.state = MsgStateFinalized; } } return ret; @@ -1183,12 +1195,15 @@ static BOOL CSignedEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, CSignedEncodeMsg *msg = (CSignedEncodeMsg *)hCryptMsg; BOOL ret = FALSE; - if (msg->base.streamed || (msg->base.open_flags & CMSG_DETACHED_FLAG)) + if (msg->base.state == MsgStateFinalized) + SetLastError(CRYPT_E_MSG_ERROR); + else if (msg->base.streamed || (msg->base.open_flags & CMSG_DETACHED_FLAG)) { ret = CSignedMsgData_Update(&msg->msg_data, pbData, cbData, fFinal, Sign); if (msg->base.streamed) FIXME("streamed partial stub\n"); + msg->base.state = fFinal ? MsgStateFinalized : MsgStateUpdated; } else { @@ -1211,6 +1226,7 @@ static BOOL CSignedEncodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, if (ret) ret = CSignedMsgData_Update(&msg->msg_data, pbData, cbData, fFinal, Sign); + msg->base.state = MsgStateFinalized; } } return ret; @@ -1644,11 +1660,34 @@ static BOOL CDecodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, TRACE("(%p, %p, %d, %d)\n", hCryptMsg, pbData, cbData, fFinal); - if (msg->base.streamed) + if (msg->base.state == MsgStateFinalized) + SetLastError(CRYPT_E_MSG_ERROR); + else if (msg->base.streamed) { - ret = CDecodeMsg_CopyData(msg, pbData, cbData); FIXME("(%p, %p, %d, %d): streamed update stub\n", hCryptMsg, pbData, cbData, fFinal); + if (fFinal) + { + if (msg->base.open_flags & CMSG_DETACHED_FLAG && + msg->base.state != MsgStateDataFinalized) + { + ret = CDecodeMsg_CopyData(msg, pbData, cbData); + msg->base.state = MsgStateDataFinalized; + } + else + { + FIXME("(%p, %p, %d, %d): detached update stub\n", hCryptMsg, + pbData, cbData, fFinal); + ret = TRUE; + msg->base.state = MsgStateFinalized; + } + } + else + { + ret = CDecodeMsg_CopyData(msg, pbData, cbData); + if (msg->base.state == MsgStateInit) + msg->base.state = MsgStateUpdated; + } } else { @@ -1656,10 +1695,24 @@ static BOOL CDecodeMsg_Update(HCRYPTMSG hCryptMsg, const BYTE *pbData, SetLastError(CRYPT_E_MSG_ERROR); else { - ret = CDecodeMsg_CopyData(msg, pbData, cbData); - if (ret) - ret = CDecodeMsg_DecodeContent(msg, &msg->msg_data, msg->type); - + if (msg->base.state == MsgStateInit) + { + ret = CDecodeMsg_CopyData(msg, pbData, cbData); + if (ret) + ret = CDecodeMsg_DecodeContent(msg, &msg->msg_data, + msg->type); + if (msg->base.open_flags & CMSG_DETACHED_FLAG) + msg->base.state = MsgStateDataFinalized; + else + msg->base.state = MsgStateFinalized; + } + else if (msg->base.state == MsgStateDataFinalized) + { + FIXME("(%p, %p, %d, %d): detached update stub\n", hCryptMsg, + pbData, cbData, fFinal); + ret = TRUE; + msg->base.state = MsgStateFinalized; + } } } return ret; @@ -2360,20 +2413,10 @@ BOOL WINAPI CryptMsgUpdate(HCRYPTMSG hCryptMsg, const BYTE *pbData, DWORD cbData, BOOL fFinal) { CryptMsgBase *msg = (CryptMsgBase *)hCryptMsg; - BOOL ret = FALSE; TRACE("(%p, %p, %d, %d)\n", hCryptMsg, pbData, cbData, fFinal); - if (msg->state == MsgStateFinalized) - SetLastError(CRYPT_E_MSG_ERROR); - else - { - ret = msg->update(hCryptMsg, pbData, cbData, fFinal); - msg->state = MsgStateUpdated; - if (fFinal) - msg->state = MsgStateFinalized; - } - return ret; + return msg->update(hCryptMsg, pbData, cbData, fFinal); } BOOL WINAPI CryptMsgGetParam(HCRYPTMSG hCryptMsg, DWORD dwParamType, diff --git a/dlls/crypt32/tests/msg.c b/dlls/crypt32/tests/msg.c index ab35b3a19e5..e88d382e389 100644 --- a/dlls/crypt32/tests/msg.c +++ b/dlls/crypt32/tests/msg.c @@ -2052,6 +2052,23 @@ static void test_decode_msg_update(void) sizeof(signedWithCertAndCrlBareContent), TRUE); ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); CryptMsgClose(msg); + + msg = CryptMsgOpenToDecode(PKCS_7_ASN_ENCODING, CMSG_DETACHED_FLAG, 0, 0, + NULL, NULL); + /* The first update succeeds.. */ + ret = CryptMsgUpdate(msg, detachedSignedContent, + sizeof(detachedSignedContent), TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + /* as does a second (probably to update the detached portion).. */ + ret = CryptMsgUpdate(msg, detachedSignedContent, + sizeof(detachedSignedContent), TRUE); + ok(ret, "CryptMsgUpdate failed: %08x\n", GetLastError()); + /* while a third fails. */ + ret = CryptMsgUpdate(msg, detachedSignedContent, + sizeof(detachedSignedContent), TRUE); + ok(!ret && GetLastError() == CRYPT_E_MSG_ERROR, + "expected CRYPT_E_MSG_ERROR, got %08x\n", GetLastError()); + CryptMsgClose(msg); } static const BYTE hashParam[] = { 0x08,0xd6,0xc0,0x5a,0x21,0x51,0x2a,0x79,0xa1, diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h index 29983511909..0da18ca2f3b 100644 --- a/dlls/d3d8/d3d8_private.h +++ b/dlls/d3d8/d3d8_private.h @@ -45,60 +45,60 @@ Macros =========================================================================== */ /* Not nice, but it lets wined3d support different versions of directx */ -#define D3D8CAPSTOWINECAPS(_pD3D8Caps, _pWineCaps) \ - _pWineCaps->DeviceType = (WINED3DDEVTYPE *) &_pD3D8Caps->DeviceType; \ - _pWineCaps->AdapterOrdinal = &_pD3D8Caps->AdapterOrdinal; \ - _pWineCaps->Caps = &_pD3D8Caps->Caps; \ - _pWineCaps->Caps2 = &_pD3D8Caps->Caps2; \ - _pWineCaps->Caps3 = &_pD3D8Caps->Caps3; \ - _pWineCaps->PresentationIntervals = &_pD3D8Caps->PresentationIntervals; \ - _pWineCaps->CursorCaps = &_pD3D8Caps->CursorCaps; \ - _pWineCaps->DevCaps = &_pD3D8Caps->DevCaps; \ - _pWineCaps->PrimitiveMiscCaps = &_pD3D8Caps->PrimitiveMiscCaps; \ - _pWineCaps->RasterCaps = &_pD3D8Caps->RasterCaps; \ - _pWineCaps->ZCmpCaps = &_pD3D8Caps->ZCmpCaps; \ - _pWineCaps->SrcBlendCaps = &_pD3D8Caps->SrcBlendCaps; \ - _pWineCaps->DestBlendCaps = &_pD3D8Caps->DestBlendCaps; \ - _pWineCaps->AlphaCmpCaps = &_pD3D8Caps->AlphaCmpCaps; \ - _pWineCaps->ShadeCaps = &_pD3D8Caps->ShadeCaps; \ - _pWineCaps->TextureCaps = &_pD3D8Caps->TextureCaps; \ - _pWineCaps->TextureFilterCaps = &_pD3D8Caps->TextureFilterCaps; \ - _pWineCaps->CubeTextureFilterCaps = &_pD3D8Caps->CubeTextureFilterCaps; \ - _pWineCaps->VolumeTextureFilterCaps = &_pD3D8Caps->VolumeTextureFilterCaps; \ - _pWineCaps->TextureAddressCaps = &_pD3D8Caps->TextureAddressCaps; \ - _pWineCaps->VolumeTextureAddressCaps = &_pD3D8Caps->VolumeTextureAddressCaps; \ - _pWineCaps->LineCaps = &_pD3D8Caps->LineCaps; \ - _pWineCaps->MaxTextureWidth = &_pD3D8Caps->MaxTextureWidth; \ - _pWineCaps->MaxTextureHeight = &_pD3D8Caps->MaxTextureHeight; \ - _pWineCaps->MaxVolumeExtent = &_pD3D8Caps->MaxVolumeExtent; \ - _pWineCaps->MaxTextureRepeat = &_pD3D8Caps->MaxTextureRepeat; \ - _pWineCaps->MaxTextureAspectRatio = &_pD3D8Caps->MaxTextureAspectRatio; \ - _pWineCaps->MaxAnisotropy = &_pD3D8Caps->MaxAnisotropy; \ - _pWineCaps->MaxVertexW = &_pD3D8Caps->MaxVertexW; \ - _pWineCaps->GuardBandLeft = &_pD3D8Caps->GuardBandLeft; \ - _pWineCaps->GuardBandTop = &_pD3D8Caps->GuardBandTop; \ - _pWineCaps->GuardBandRight = &_pD3D8Caps->GuardBandRight; \ - _pWineCaps->GuardBandBottom = &_pD3D8Caps->GuardBandBottom; \ - _pWineCaps->ExtentsAdjust = &_pD3D8Caps->ExtentsAdjust; \ - _pWineCaps->StencilCaps = &_pD3D8Caps->StencilCaps; \ - _pWineCaps->FVFCaps = &_pD3D8Caps->FVFCaps; \ - _pWineCaps->TextureOpCaps = &_pD3D8Caps->TextureOpCaps; \ - _pWineCaps->MaxTextureBlendStages = &_pD3D8Caps->MaxTextureBlendStages; \ - _pWineCaps->MaxSimultaneousTextures = &_pD3D8Caps->MaxSimultaneousTextures; \ - _pWineCaps->VertexProcessingCaps = &_pD3D8Caps->VertexProcessingCaps; \ - _pWineCaps->MaxActiveLights = &_pD3D8Caps->MaxActiveLights; \ - _pWineCaps->MaxUserClipPlanes = &_pD3D8Caps->MaxUserClipPlanes; \ - _pWineCaps->MaxVertexBlendMatrices = &_pD3D8Caps->MaxVertexBlendMatrices; \ - _pWineCaps->MaxVertexBlendMatrixIndex = &_pD3D8Caps->MaxVertexBlendMatrixIndex; \ - _pWineCaps->MaxPointSize = &_pD3D8Caps->MaxPointSize; \ - _pWineCaps->MaxPrimitiveCount = &_pD3D8Caps->MaxPrimitiveCount; \ - _pWineCaps->MaxVertexIndex = &_pD3D8Caps->MaxVertexIndex; \ - _pWineCaps->MaxStreams = &_pD3D8Caps->MaxStreams; \ - _pWineCaps->MaxStreamStride = &_pD3D8Caps->MaxStreamStride; \ - _pWineCaps->VertexShaderVersion = &_pD3D8Caps->VertexShaderVersion; \ - _pWineCaps->MaxVertexShaderConst = &_pD3D8Caps->MaxVertexShaderConst; \ - _pWineCaps->PixelShaderVersion = &_pD3D8Caps->PixelShaderVersion; \ - _pWineCaps->PixelShader1xMaxValue = &_pD3D8Caps->MaxPixelShaderValue; +#define WINECAPSTOD3D8CAPS(_pD3D8Caps, _pWineCaps) \ + _pD3D8Caps->DeviceType = (D3DDEVTYPE) _pWineCaps->DeviceType; \ + _pD3D8Caps->AdapterOrdinal = _pWineCaps->AdapterOrdinal; \ + _pD3D8Caps->Caps = _pWineCaps->Caps; \ + _pD3D8Caps->Caps2 = _pWineCaps->Caps2; \ + _pD3D8Caps->Caps3 = _pWineCaps->Caps3; \ + _pD3D8Caps->PresentationIntervals = _pWineCaps->PresentationIntervals; \ + _pD3D8Caps->CursorCaps = _pWineCaps->CursorCaps; \ + _pD3D8Caps->DevCaps = _pWineCaps->DevCaps; \ + _pD3D8Caps->PrimitiveMiscCaps = _pWineCaps->PrimitiveMiscCaps; \ + _pD3D8Caps->RasterCaps = _pWineCaps->RasterCaps; \ + _pD3D8Caps->ZCmpCaps = _pWineCaps->ZCmpCaps; \ + _pD3D8Caps->SrcBlendCaps = _pWineCaps->SrcBlendCaps; \ + _pD3D8Caps->DestBlendCaps = _pWineCaps->DestBlendCaps; \ + _pD3D8Caps->AlphaCmpCaps = _pWineCaps->AlphaCmpCaps; \ + _pD3D8Caps->ShadeCaps = _pWineCaps->ShadeCaps; \ + _pD3D8Caps->TextureCaps = _pWineCaps->TextureCaps; \ + _pD3D8Caps->TextureFilterCaps = _pWineCaps->TextureFilterCaps; \ + _pD3D8Caps->CubeTextureFilterCaps = _pWineCaps->CubeTextureFilterCaps; \ + _pD3D8Caps->VolumeTextureFilterCaps = _pWineCaps->VolumeTextureFilterCaps; \ + _pD3D8Caps->TextureAddressCaps = _pWineCaps->TextureAddressCaps; \ + _pD3D8Caps->VolumeTextureAddressCaps = _pWineCaps->VolumeTextureAddressCaps; \ + _pD3D8Caps->LineCaps = _pWineCaps->LineCaps; \ + _pD3D8Caps->MaxTextureWidth = _pWineCaps->MaxTextureWidth; \ + _pD3D8Caps->MaxTextureHeight = _pWineCaps->MaxTextureHeight; \ + _pD3D8Caps->MaxVolumeExtent = _pWineCaps->MaxVolumeExtent; \ + _pD3D8Caps->MaxTextureRepeat = _pWineCaps->MaxTextureRepeat; \ + _pD3D8Caps->MaxTextureAspectRatio = _pWineCaps->MaxTextureAspectRatio; \ + _pD3D8Caps->MaxAnisotropy = _pWineCaps->MaxAnisotropy; \ + _pD3D8Caps->MaxVertexW = _pWineCaps->MaxVertexW; \ + _pD3D8Caps->GuardBandLeft = _pWineCaps->GuardBandLeft; \ + _pD3D8Caps->GuardBandTop = _pWineCaps->GuardBandTop; \ + _pD3D8Caps->GuardBandRight = _pWineCaps->GuardBandRight; \ + _pD3D8Caps->GuardBandBottom = _pWineCaps->GuardBandBottom; \ + _pD3D8Caps->ExtentsAdjust = _pWineCaps->ExtentsAdjust; \ + _pD3D8Caps->StencilCaps = _pWineCaps->StencilCaps; \ + _pD3D8Caps->FVFCaps = _pWineCaps->FVFCaps; \ + _pD3D8Caps->TextureOpCaps = _pWineCaps->TextureOpCaps; \ + _pD3D8Caps->MaxTextureBlendStages = _pWineCaps->MaxTextureBlendStages; \ + _pD3D8Caps->MaxSimultaneousTextures = _pWineCaps->MaxSimultaneousTextures; \ + _pD3D8Caps->VertexProcessingCaps = _pWineCaps->VertexProcessingCaps; \ + _pD3D8Caps->MaxActiveLights = _pWineCaps->MaxActiveLights; \ + _pD3D8Caps->MaxUserClipPlanes = _pWineCaps->MaxUserClipPlanes; \ + _pD3D8Caps->MaxVertexBlendMatrices = _pWineCaps->MaxVertexBlendMatrices; \ + _pD3D8Caps->MaxVertexBlendMatrixIndex = _pWineCaps->MaxVertexBlendMatrixIndex; \ + _pD3D8Caps->MaxPointSize = _pWineCaps->MaxPointSize; \ + _pD3D8Caps->MaxPrimitiveCount = _pWineCaps->MaxPrimitiveCount; \ + _pD3D8Caps->MaxVertexIndex = _pWineCaps->MaxVertexIndex; \ + _pD3D8Caps->MaxStreams = _pWineCaps->MaxStreams; \ + _pD3D8Caps->MaxStreamStride = _pWineCaps->MaxStreamStride; \ + _pD3D8Caps->VertexShaderVersion = _pWineCaps->VertexShaderVersion; \ + _pD3D8Caps->MaxVertexShaderConst = _pWineCaps->MaxVertexShaderConst; \ + _pD3D8Caps->PixelShaderVersion = _pWineCaps->PixelShaderVersion; \ + _pD3D8Caps->MaxPixelShaderValue = _pWineCaps->PixelShader1xMaxValue; /* Direct3D8 Interfaces: */ typedef struct IDirect3DBaseTexture8Impl IDirect3DBaseTexture8Impl; @@ -127,7 +127,7 @@ typedef struct IDirect3DVertexShader8Impl IDirect3DVertexShader8Impl; extern CRITICAL_SECTION d3d8_cs; /* =========================================================================== - The interfactes themselves + The interfaces themselves =========================================================================== */ /* ---------- */ @@ -635,6 +635,7 @@ typedef struct IDirect3DPixelShader8Impl { */ void load_local_constants(const DWORD *d3d8_elements, IWineD3DVertexShader *wined3d_vertex_shader); UINT convert_to_wined3d_declaration(const DWORD *d3d8_elements, DWORD *d3d8_elements_size, WINED3DVERTEXELEMENT **wined3d_elements); +size_t parse_token(const DWORD* pToken); /* Callbacks */ extern HRESULT WINAPI D3D8CB_CreateSurface(IUnknown *device, IUnknown *pSuperior, UINT Width, UINT Height, diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 01abc28184b..a846bf66e2f 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -192,10 +192,10 @@ static HRESULT WINAPI IDirect3DDevice8Impl_GetDeviceCaps(LPDIRECT3DDEVICE8 iface return D3DERR_INVALIDCALL; /* well this is what MSDN says to return */ } - D3D8CAPSTOWINECAPS(pCaps, pWineCaps) EnterCriticalSection(&d3d8_cs); hrc = IWineD3DDevice_GetDeviceCaps(This->WineD3DDevice, pWineCaps); LeaveCriticalSection(&d3d8_cs); + WINECAPSTOD3D8CAPS(pCaps, pWineCaps) HeapFree(GetProcessHeap(), 0, pWineCaps); /* D3D8 doesn't support SM 2.0 or higher, so clamp to 1.x */ @@ -1090,7 +1090,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_EndStateBlock(LPDIRECT3DDEVICE8 iface TRACE("(%p) Relay\n", This); - /* Tell wineD3D to endstatablock before anything else (in case we run out + /* Tell wineD3D to endstateblock before anything else (in case we run out * of memory later and cause locking problems) */ EnterCriticalSection(&d3d8_cs); @@ -1522,6 +1522,23 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(LPDIRECT3DDEVICE8 HRESULT hrc = D3D_OK; IDirect3DVertexShader8Impl *object; IWineD3DVertexDeclaration *wined3d_vertex_declaration; + const DWORD *token = pDeclaration; + + /* Test if the vertex declaration is valid */ + while (D3DVSD_END() != *token) { + D3DVSD_TOKENTYPE token_type = ((*token & D3DVSD_TOKENTYPEMASK) >> D3DVSD_TOKENTYPESHIFT); + + if (token_type == D3DVSD_TOKEN_STREAMDATA && !(token_type & 0x10000000)) { + DWORD type = ((*token & D3DVSD_DATATYPEMASK) >> D3DVSD_DATATYPESHIFT); + DWORD reg = ((*token & D3DVSD_VERTEXREGMASK) >> D3DVSD_VERTEXREGSHIFT); + + if(reg == D3DVSDE_NORMAL && type != D3DVSDT_FLOAT3 && !pFunction) { + WARN("Attempt to use a non-FLOAT3 normal with the fixed function function\n"); + return D3DERR_INVALIDCALL; + } + } + token += parse_token(token); + } /* Setup a stub object for now */ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object)); @@ -1555,7 +1572,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(LPDIRECT3DDEVICE8 HeapFree(GetProcessHeap(), 0, object); *ppShader = 0; } else { - /* TODO: Store the VS declarations locally so that they can be derefferenced with a value higher than VS_HIGHESTFIXEDFXF */ + /* TODO: Store the VS declarations locally so that they can be dereferenced with a value higher than VS_HIGHESTFIXEDFXF */ shader_handle *handle = alloc_shader_handle(This); if (!handle) { ERR("Failed to allocate shader handle\n"); diff --git a/dlls/d3d8/directx.c b/dlls/d3d8/directx.c index 54c87e68484..6bffcb14226 100644 --- a/dlls/d3d8/directx.c +++ b/dlls/d3d8/directx.c @@ -231,10 +231,10 @@ static HRESULT WINAPI IDirect3D8Impl_GetDeviceCaps(LPDIRECT3D8 iface, UINT Ada if(pWineCaps == NULL){ return D3DERR_INVALIDCALL; /*well this is what MSDN says to return*/ } - D3D8CAPSTOWINECAPS(pCaps, pWineCaps) EnterCriticalSection(&d3d8_cs); hrc = IWineD3D_GetDeviceCaps(This->WineD3D, Adapter, DeviceType, pWineCaps); LeaveCriticalSection(&d3d8_cs); + WINECAPSTOD3D8CAPS(pCaps, pWineCaps) HeapFree(GetProcessHeap(), 0, pWineCaps); /* D3D8 doesn't support SM 2.0 or higher, so clamp to 1.x */ @@ -295,7 +295,7 @@ ULONG WINAPI D3D8CB_DestroyRenderTarget(IWineD3DSurface *pSurface) { return IDirect3DSurface8_Release((IDirect3DSurface8*) surfaceParent); } -/* Callback for creating the inplicite swapchain when the device is created */ +/* Callback for creating the implicit swapchain when the device is created */ static HRESULT WINAPI D3D8CB_CreateAdditionalSwapChain(IUnknown *device, WINED3DPRESENT_PARAMETERS* pPresentationParameters, IWineD3DSwapChain ** ppSwapChain){ diff --git a/dlls/d3d8/stateblock.c b/dlls/d3d8/stateblock.c index d42fb79f889..ac2cdbe9982 100644 --- a/dlls/d3d8/stateblock.c +++ b/dlls/d3d8/stateblock.c @@ -25,7 +25,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d8); -/* NOTE: DirectX8 doesn't export a IDirect3DStateBlock8, the interface is used internally to keep d3d8 and d3d9 as simila as possible */ +/* NOTE: DirectX8 doesn't export an IDirect3DStateBlock8, the interface is used internally to keep d3d8 and d3d9 as similar as possible */ /* IDirect3DStateBlock8 IUnknown parts follow: */ static HRESULT WINAPI IDirect3DStateBlock8Impl_QueryInterface(IDirect3DStateBlock8 *iface, REFIID riid, LPVOID *ppobj) { IDirect3DStateBlock8Impl *This = (IDirect3DStateBlock8Impl *)iface; diff --git a/dlls/d3d8/tests/device.c b/dlls/d3d8/tests/device.c index d3efb42d0c1..8de4ec762af 100644 --- a/dlls/d3d8/tests/device.c +++ b/dlls/d3d8/tests/device.c @@ -337,8 +337,8 @@ static void test_refcount(void) /** * Check refcount of implicit surfaces. Findings: * - the container is the device - * - they hold a refernce to the device - * - they are created with a refcount of 0 (Get/Release returns orignial refcount) + * - they hold a reference to the device + * - they are created with a refcount of 0 (Get/Release returns original refcount) * - they are not freed if refcount reaches 0. * - the refcount is not forwarded to the container. */ @@ -880,6 +880,27 @@ static void test_shader(void) D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3), D3DVSD_END() }; + DWORD decl_normal_float2[] = + { + D3DVSD_STREAM(0), + D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3), /* D3DVSDE_POSITION, Register v0 */ + D3DVSD_REG(D3DVSDE_NORMAL, D3DVSDT_FLOAT2), /* D3DVSDE_NORMAL, Register v1 */ + D3DVSD_END() + }; + DWORD decl_normal_float4[] = + { + D3DVSD_STREAM(0), + D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3), /* D3DVSDE_POSITION, Register v0 */ + D3DVSD_REG(D3DVSDE_NORMAL, D3DVSDT_FLOAT4), /* D3DVSDE_NORMAL, Register v1 */ + D3DVSD_END() + }; + DWORD decl_normal_d3dcolor[] = + { + D3DVSD_STREAM(0), + D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3), /* D3DVSDE_POSITION, Register v0 */ + D3DVSD_REG(D3DVSDE_NORMAL, D3DVSDT_D3DCOLOR),/* D3DVSDE_NORMAL, Register v1 */ + D3DVSD_END() + }; const DWORD vertex_decl_size = sizeof(dwVertexDecl); const DWORD simple_vs_size = sizeof(simple_vs); const DWORD simple_ps_size = sizeof(simple_ps); @@ -962,6 +983,23 @@ static void test_shader(void) ok(hr == D3D_OK, "IDirect3DDevice8_GetVertexShader returned %#08x\n", hr); ok(hTempHandle == 0, "Vertex Shader %d is set, expected shader %d\n", hTempHandle, 0); + /* Test a broken declaration. 3DMark2001 tries to use normals with 2 components + * First try the fixed function shader function, then a custom one + */ + hr = IDirect3DDevice8_CreateVertexShader(pDevice, decl_normal_float2, 0, &hVertexShader, 0); + ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice8_CreateVertexShader returned %#08x\n", hr); + if(SUCCEEDED(hr)) IDirect3DDevice8_DeleteVertexShader(pDevice, hVertexShader); + hr = IDirect3DDevice8_CreateVertexShader(pDevice, decl_normal_float4, 0, &hVertexShader, 0); + ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice8_CreateVertexShader returned %#08x\n", hr); + if(SUCCEEDED(hr)) IDirect3DDevice8_DeleteVertexShader(pDevice, hVertexShader); + hr = IDirect3DDevice8_CreateVertexShader(pDevice, decl_normal_d3dcolor, 0, &hVertexShader, 0); + ok(hr == D3DERR_INVALIDCALL, "IDirect3DDevice8_CreateVertexShader returned %#08x\n", hr); + if(SUCCEEDED(hr)) IDirect3DDevice8_DeleteVertexShader(pDevice, hVertexShader); + + hr = IDirect3DDevice8_CreateVertexShader(pDevice, decl_normal_float2, simple_vs, &hVertexShader, 0); + ok(hr == D3D_OK, "IDirect3DDevice8_CreateVertexShader returned %#08x\n", hr); + if(SUCCEEDED(hr)) IDirect3DDevice8_DeleteVertexShader(pDevice, hVertexShader); + if (caps.PixelShaderVersion >= D3DPS_VERSION(1, 0)) { /* The same with a pixel shader */ @@ -1174,6 +1212,75 @@ static void test_lights(void) if(d3d8) IDirect3D8_Release(d3d8); } +static void test_render_zero_triangles(void) +{ + D3DPRESENT_PARAMETERS d3dpp; + IDirect3DDevice8 *device = NULL; + IDirect3D8 *d3d8; + HWND hwnd; + HRESULT hr; + D3DDISPLAYMODE d3ddm; + + struct nvertex + { + float x, y, z; + float nx, ny, nz; + DWORD diffuse; + } quad[] = + { + { 0.0f, -1.0f, 0.1f, 1.0f, 1.0f, 1.0f, 0xff0000ff}, + { 0.0f, 0.0f, 0.1f, 1.0f, 1.0f, 1.0f, 0xff0000ff}, + { 1.0f, 0.0f, 0.1f, 1.0f, 1.0f, 1.0f, 0xff0000ff}, + { 1.0f, -1.0f, 0.1f, 1.0f, 1.0f, 1.0f, 0xff0000ff}, + }; + + d3d8 = pDirect3DCreate8( D3D_SDK_VERSION ); + ok(d3d8 != NULL, "Failed to create IDirect3D8 object\n"); + hwnd = CreateWindow( "static", "d3d8_test", WS_OVERLAPPEDWINDOW, 100, 100, 160, 160, NULL, NULL, NULL, NULL ); + ok(hwnd != NULL, "Failed to create window\n"); + if (!d3d8 || !hwnd) goto cleanup; + + IDirect3D8_GetAdapterDisplayMode( d3d8, D3DADAPTER_DEFAULT, &d3ddm ); + ZeroMemory( &d3dpp, sizeof(d3dpp) ); + d3dpp.Windowed = TRUE; + d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; + d3dpp.BackBufferWidth = 800; + d3dpp.BackBufferHeight = 600; + d3dpp.BackBufferFormat = d3ddm.Format; + d3dpp.EnableAutoDepthStencil = TRUE; + d3dpp.AutoDepthStencilFormat = D3DFMT_D16; + + hr = IDirect3D8_CreateDevice( d3d8, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL /* no NULLREF here */, hwnd, + D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE, &d3dpp, &device ); + ok(hr == D3D_OK || hr == D3DERR_NOTAVAILABLE, "IDirect3D8_CreateDevice failed with %s\n", DXGetErrorString8(hr)); + if(!device) + { + skip("Failed to create a d3d device\n"); + goto cleanup; + } + + hr = IDirect3DDevice8_SetVertexShader(device, D3DFVF_XYZ | D3DFVF_DIFFUSE); + ok(hr == D3D_OK, "IDirect3DDevice8_SetVertexShader returned %#08x\n", hr); + + hr = IDirect3DDevice8_BeginScene(device); + ok(hr == D3D_OK, "IDirect3DDevice8_BeginScene failed with %#08x\n", hr); + if(hr == D3D_OK) + { + hr = IDirect3DDevice8_DrawIndexedPrimitiveUP(device, D3DPT_TRIANGLELIST, 0 /* MinIndex */, 0 /* NumVerts */, + 0 /*PrimCount */, NULL, D3DFMT_INDEX16, quad, sizeof(quad[0])); + ok(hr == D3D_OK, "IDirect3DDevice8_DrawIndexedPrimitiveUP failed with %#08x\n", hr); + + IDirect3DDevice8_EndScene(device); + ok(hr == D3D_OK, "IDirect3DDevice8_EndScene failed with %#08x\n", hr); + } + + IDirect3DDevice8_Present(device, NULL, NULL, NULL, NULL); + + cleanup: + if(device) IDirect3DDevice8_Release(device); + if(d3d8) IDirect3D8_Release(d3d8); +} + START_TEST(device) { HMODULE d3d8_handle = LoadLibraryA( "d3d8.dll" ); @@ -1198,5 +1305,6 @@ START_TEST(device) test_shader(); test_limits(); test_lights(); + test_render_zero_triangles(); } } diff --git a/dlls/d3d8/tests/surface.c b/dlls/d3d8/tests/surface.c index 2225960ec99..da1f4d7e848 100644 --- a/dlls/d3d8/tests/surface.c +++ b/dlls/d3d8/tests/surface.c @@ -268,7 +268,7 @@ static void test_private_data(IDirect3DDevice8 *device) hr = IDirect3DSurface8_GetPrivateData(surface, &IID_IDirect3DSurface8, &ptr, &size); ok(hr == D3D_OK, "IDirect3DSurface8_GetPrivateData failed with %08x\n", hr); ref2 = getref((IUnknown *) device); - /* Object is NOT beein addrefed */ + /* Object is NOT being addrefed */ ok(ptr == (IUnknown *) device, "Returned interface pointer is %p, expected %p\n", ptr, device); ok(ref2 == ref + 2, "Object reference is %d, expected %d. ptr at %p, orig at %p\n", ref2, ref + 2, ptr, device); IUnknown_Release(ptr); diff --git a/dlls/d3d8/tests/visual.c b/dlls/d3d8/tests/visual.c index f997bc9f3f5..013e818942c 100644 --- a/dlls/d3d8/tests/visual.c +++ b/dlls/d3d8/tests/visual.c @@ -674,7 +674,7 @@ static void offscreen_test(IDirect3DDevice8 *device) hr = IDirect3DDevice8_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffff00ff, 0.0, 0); ok(hr == D3D_OK, "Clear failed, hr = %#08x\n", hr); - /* Draw without textures - Should resut in a white quad */ + /* Draw without textures - Should result in a white quad */ hr = IDirect3DDevice8_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(quad[0])); ok(hr == D3D_OK, "DrawPrimitiveUP failed, hr = %#08x\n", hr); diff --git a/dlls/d3d8/vertexdeclaration.c b/dlls/d3d8/vertexdeclaration.c index 57d0337d0df..debeca0c52a 100644 --- a/dlls/d3d8/vertexdeclaration.c +++ b/dlls/d3d8/vertexdeclaration.c @@ -118,7 +118,7 @@ static const char *debug_d3dvsde_register(D3DVSDE_REGISTER d3dvsde_register) } } -static size_t parse_token(const DWORD* pToken) +size_t parse_token(const DWORD* pToken) { const DWORD token = *pToken; size_t tokenlen = 1; diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h index 497e8067b8f..03c4d47fd94 100644 --- a/dlls/d3d9/d3d9_private.h +++ b/dlls/d3d9/d3d9_private.h @@ -50,86 +50,86 @@ extern CRITICAL_SECTION d3d9_cs; Macros =========================================================================== */ /* Not nice, but it lets wined3d support different versions of directx */ -#define D3D9CAPSTOWINECAPS(_pD3D9Caps, _pWineCaps) \ - _pWineCaps->DeviceType = (WINED3DDEVTYPE *) &_pD3D9Caps->DeviceType; \ - _pWineCaps->AdapterOrdinal = &_pD3D9Caps->AdapterOrdinal; \ - _pWineCaps->Caps = &_pD3D9Caps->Caps; \ - _pWineCaps->Caps2 = &_pD3D9Caps->Caps2; \ - _pWineCaps->Caps3 = &_pD3D9Caps->Caps3; \ - _pWineCaps->PresentationIntervals = &_pD3D9Caps->PresentationIntervals; \ - _pWineCaps->CursorCaps = &_pD3D9Caps->CursorCaps; \ - _pWineCaps->DevCaps = &_pD3D9Caps->DevCaps; \ - _pWineCaps->PrimitiveMiscCaps = &_pD3D9Caps->PrimitiveMiscCaps; \ - _pWineCaps->RasterCaps = &_pD3D9Caps->RasterCaps; \ - _pWineCaps->ZCmpCaps = &_pD3D9Caps->ZCmpCaps; \ - _pWineCaps->SrcBlendCaps = &_pD3D9Caps->SrcBlendCaps; \ - _pWineCaps->DestBlendCaps = &_pD3D9Caps->DestBlendCaps; \ - _pWineCaps->AlphaCmpCaps = &_pD3D9Caps->AlphaCmpCaps; \ - _pWineCaps->ShadeCaps = &_pD3D9Caps->ShadeCaps; \ - _pWineCaps->TextureCaps = &_pD3D9Caps->TextureCaps; \ - _pWineCaps->TextureFilterCaps = &_pD3D9Caps->TextureFilterCaps; \ - _pWineCaps->CubeTextureFilterCaps = &_pD3D9Caps->CubeTextureFilterCaps; \ - _pWineCaps->VolumeTextureFilterCaps = &_pD3D9Caps->VolumeTextureFilterCaps; \ - _pWineCaps->TextureAddressCaps = &_pD3D9Caps->TextureAddressCaps; \ - _pWineCaps->VolumeTextureAddressCaps = &_pD3D9Caps->VolumeTextureAddressCaps; \ - _pWineCaps->LineCaps = &_pD3D9Caps->LineCaps; \ - _pWineCaps->MaxTextureWidth = &_pD3D9Caps->MaxTextureWidth; \ - _pWineCaps->MaxTextureHeight = &_pD3D9Caps->MaxTextureHeight; \ - _pWineCaps->MaxVolumeExtent = &_pD3D9Caps->MaxVolumeExtent; \ - _pWineCaps->MaxTextureRepeat = &_pD3D9Caps->MaxTextureRepeat; \ - _pWineCaps->MaxTextureAspectRatio = &_pD3D9Caps->MaxTextureAspectRatio; \ - _pWineCaps->MaxAnisotropy = &_pD3D9Caps->MaxAnisotropy; \ - _pWineCaps->MaxVertexW = &_pD3D9Caps->MaxVertexW; \ - _pWineCaps->GuardBandLeft = &_pD3D9Caps->GuardBandLeft; \ - _pWineCaps->GuardBandTop = &_pD3D9Caps->GuardBandTop; \ - _pWineCaps->GuardBandRight = &_pD3D9Caps->GuardBandRight; \ - _pWineCaps->GuardBandBottom = &_pD3D9Caps->GuardBandBottom; \ - _pWineCaps->ExtentsAdjust = &_pD3D9Caps->ExtentsAdjust; \ - _pWineCaps->StencilCaps = &_pD3D9Caps->StencilCaps; \ - _pWineCaps->FVFCaps = &_pD3D9Caps->FVFCaps; \ - _pWineCaps->TextureOpCaps = &_pD3D9Caps->TextureOpCaps; \ - _pWineCaps->MaxTextureBlendStages = &_pD3D9Caps->MaxTextureBlendStages; \ - _pWineCaps->MaxSimultaneousTextures = &_pD3D9Caps->MaxSimultaneousTextures; \ - _pWineCaps->VertexProcessingCaps = &_pD3D9Caps->VertexProcessingCaps; \ - _pWineCaps->MaxActiveLights = &_pD3D9Caps->MaxActiveLights; \ - _pWineCaps->MaxUserClipPlanes = &_pD3D9Caps->MaxUserClipPlanes; \ - _pWineCaps->MaxVertexBlendMatrices = &_pD3D9Caps->MaxVertexBlendMatrices; \ - _pWineCaps->MaxVertexBlendMatrixIndex = &_pD3D9Caps->MaxVertexBlendMatrixIndex; \ - _pWineCaps->MaxPointSize = &_pD3D9Caps->MaxPointSize; \ - _pWineCaps->MaxPrimitiveCount = &_pD3D9Caps->MaxPrimitiveCount; \ - _pWineCaps->MaxVertexIndex = &_pD3D9Caps->MaxVertexIndex; \ - _pWineCaps->MaxStreams = &_pD3D9Caps->MaxStreams; \ - _pWineCaps->MaxStreamStride = &_pD3D9Caps->MaxStreamStride; \ - _pWineCaps->VertexShaderVersion = &_pD3D9Caps->VertexShaderVersion; \ - _pWineCaps->MaxVertexShaderConst = &_pD3D9Caps->MaxVertexShaderConst; \ - _pWineCaps->PixelShaderVersion = &_pD3D9Caps->PixelShaderVersion; \ - _pWineCaps->PixelShader1xMaxValue = &_pD3D9Caps->PixelShader1xMaxValue; \ - _pWineCaps->DevCaps2 = &_pD3D9Caps->DevCaps2; \ - _pWineCaps->MaxNpatchTessellationLevel = &_pD3D9Caps->MaxNpatchTessellationLevel; \ - _pWineCaps->MasterAdapterOrdinal = &_pD3D9Caps->MasterAdapterOrdinal; \ - _pWineCaps->AdapterOrdinalInGroup = &_pD3D9Caps->AdapterOrdinalInGroup; \ - _pWineCaps->NumberOfAdaptersInGroup = &_pD3D9Caps->NumberOfAdaptersInGroup; \ - _pWineCaps->DeclTypes = &_pD3D9Caps->DeclTypes; \ - _pWineCaps->NumSimultaneousRTs = &_pD3D9Caps->NumSimultaneousRTs; \ - _pWineCaps->StretchRectFilterCaps = &_pD3D9Caps->StretchRectFilterCaps; \ - _pWineCaps->VS20Caps.Caps = &_pD3D9Caps->VS20Caps.Caps; \ - _pWineCaps->VS20Caps.DynamicFlowControlDepth = &_pD3D9Caps->VS20Caps.DynamicFlowControlDepth; \ - _pWineCaps->VS20Caps.NumTemps = &_pD3D9Caps->VS20Caps.NumTemps; \ - _pWineCaps->VS20Caps.NumTemps = &_pD3D9Caps->VS20Caps.NumTemps; \ - _pWineCaps->VS20Caps.StaticFlowControlDepth = &_pD3D9Caps->VS20Caps.StaticFlowControlDepth; \ - _pWineCaps->PS20Caps.Caps = &_pD3D9Caps->PS20Caps.Caps; \ - _pWineCaps->PS20Caps.DynamicFlowControlDepth = &_pD3D9Caps->PS20Caps.DynamicFlowControlDepth; \ - _pWineCaps->PS20Caps.NumTemps = &_pD3D9Caps->PS20Caps.NumTemps; \ - _pWineCaps->PS20Caps.StaticFlowControlDepth = &_pD3D9Caps->PS20Caps.StaticFlowControlDepth; \ - _pWineCaps->PS20Caps.NumInstructionSlots = &_pD3D9Caps->PS20Caps.NumInstructionSlots; \ - _pWineCaps->VertexTextureFilterCaps = &_pD3D9Caps->VertexTextureFilterCaps; \ - _pWineCaps->MaxVShaderInstructionsExecuted = &_pD3D9Caps->MaxVShaderInstructionsExecuted; \ - _pWineCaps->MaxPShaderInstructionsExecuted = &_pD3D9Caps->MaxPShaderInstructionsExecuted; \ - _pWineCaps->MaxVertexShader30InstructionSlots = &_pD3D9Caps->MaxVertexShader30InstructionSlots; \ - _pWineCaps->MaxPixelShader30InstructionSlots = &_pD3D9Caps->MaxPixelShader30InstructionSlots; +#define WINECAPSTOD3D9CAPS(_pD3D9Caps, _pWineCaps) \ + _pD3D9Caps->DeviceType = (D3DDEVTYPE) _pWineCaps->DeviceType; \ + _pD3D9Caps->AdapterOrdinal = _pWineCaps->AdapterOrdinal; \ + _pD3D9Caps->Caps = _pWineCaps->Caps; \ + _pD3D9Caps->Caps2 = _pWineCaps->Caps2; \ + _pD3D9Caps->Caps3 = _pWineCaps->Caps3; \ + _pD3D9Caps->PresentationIntervals = _pWineCaps->PresentationIntervals; \ + _pD3D9Caps->CursorCaps = _pWineCaps->CursorCaps; \ + _pD3D9Caps->DevCaps = _pWineCaps->DevCaps; \ + _pD3D9Caps->PrimitiveMiscCaps = _pWineCaps->PrimitiveMiscCaps; \ + _pD3D9Caps->RasterCaps = _pWineCaps->RasterCaps; \ + _pD3D9Caps->ZCmpCaps = _pWineCaps->ZCmpCaps; \ + _pD3D9Caps->SrcBlendCaps = _pWineCaps->SrcBlendCaps; \ + _pD3D9Caps->DestBlendCaps = _pWineCaps->DestBlendCaps; \ + _pD3D9Caps->AlphaCmpCaps = _pWineCaps->AlphaCmpCaps; \ + _pD3D9Caps->ShadeCaps = _pWineCaps->ShadeCaps; \ + _pD3D9Caps->TextureCaps = _pWineCaps->TextureCaps; \ + _pD3D9Caps->TextureFilterCaps = _pWineCaps->TextureFilterCaps; \ + _pD3D9Caps->CubeTextureFilterCaps = _pWineCaps->CubeTextureFilterCaps; \ + _pD3D9Caps->VolumeTextureFilterCaps = _pWineCaps->VolumeTextureFilterCaps; \ + _pD3D9Caps->TextureAddressCaps = _pWineCaps->TextureAddressCaps; \ + _pD3D9Caps->VolumeTextureAddressCaps = _pWineCaps->VolumeTextureAddressCaps; \ + _pD3D9Caps->LineCaps = _pWineCaps->LineCaps; \ + _pD3D9Caps->MaxTextureWidth = _pWineCaps->MaxTextureWidth; \ + _pD3D9Caps->MaxTextureHeight = _pWineCaps->MaxTextureHeight; \ + _pD3D9Caps->MaxVolumeExtent = _pWineCaps->MaxVolumeExtent; \ + _pD3D9Caps->MaxTextureRepeat = _pWineCaps->MaxTextureRepeat; \ + _pD3D9Caps->MaxTextureAspectRatio = _pWineCaps->MaxTextureAspectRatio; \ + _pD3D9Caps->MaxAnisotropy = _pWineCaps->MaxAnisotropy; \ + _pD3D9Caps->MaxVertexW = _pWineCaps->MaxVertexW; \ + _pD3D9Caps->GuardBandLeft = _pWineCaps->GuardBandLeft; \ + _pD3D9Caps->GuardBandTop = _pWineCaps->GuardBandTop; \ + _pD3D9Caps->GuardBandRight = _pWineCaps->GuardBandRight; \ + _pD3D9Caps->GuardBandBottom = _pWineCaps->GuardBandBottom; \ + _pD3D9Caps->ExtentsAdjust = _pWineCaps->ExtentsAdjust; \ + _pD3D9Caps->StencilCaps = _pWineCaps->StencilCaps; \ + _pD3D9Caps->FVFCaps = _pWineCaps->FVFCaps; \ + _pD3D9Caps->TextureOpCaps = _pWineCaps->TextureOpCaps; \ + _pD3D9Caps->MaxTextureBlendStages = _pWineCaps->MaxTextureBlendStages; \ + _pD3D9Caps->MaxSimultaneousTextures = _pWineCaps->MaxSimultaneousTextures; \ + _pD3D9Caps->VertexProcessingCaps = _pWineCaps->VertexProcessingCaps; \ + _pD3D9Caps->MaxActiveLights = _pWineCaps->MaxActiveLights; \ + _pD3D9Caps->MaxUserClipPlanes = _pWineCaps->MaxUserClipPlanes; \ + _pD3D9Caps->MaxVertexBlendMatrices = _pWineCaps->MaxVertexBlendMatrices; \ + _pD3D9Caps->MaxVertexBlendMatrixIndex = _pWineCaps->MaxVertexBlendMatrixIndex; \ + _pD3D9Caps->MaxPointSize = _pWineCaps->MaxPointSize; \ + _pD3D9Caps->MaxPrimitiveCount = _pWineCaps->MaxPrimitiveCount; \ + _pD3D9Caps->MaxVertexIndex = _pWineCaps->MaxVertexIndex; \ + _pD3D9Caps->MaxStreams = _pWineCaps->MaxStreams; \ + _pD3D9Caps->MaxStreamStride = _pWineCaps->MaxStreamStride; \ + _pD3D9Caps->VertexShaderVersion = _pWineCaps->VertexShaderVersion; \ + _pD3D9Caps->MaxVertexShaderConst = _pWineCaps->MaxVertexShaderConst; \ + _pD3D9Caps->PixelShaderVersion = _pWineCaps->PixelShaderVersion; \ + _pD3D9Caps->PixelShader1xMaxValue = _pWineCaps->PixelShader1xMaxValue; \ + _pD3D9Caps->DevCaps2 = _pWineCaps->DevCaps2; \ + _pD3D9Caps->MaxNpatchTessellationLevel = _pWineCaps->MaxNpatchTessellationLevel; \ + _pD3D9Caps->MasterAdapterOrdinal = _pWineCaps->MasterAdapterOrdinal; \ + _pD3D9Caps->AdapterOrdinalInGroup = _pWineCaps->AdapterOrdinalInGroup; \ + _pD3D9Caps->NumberOfAdaptersInGroup = _pWineCaps->NumberOfAdaptersInGroup; \ + _pD3D9Caps->DeclTypes = _pWineCaps->DeclTypes; \ + _pD3D9Caps->NumSimultaneousRTs = _pWineCaps->NumSimultaneousRTs; \ + _pD3D9Caps->StretchRectFilterCaps = _pWineCaps->StretchRectFilterCaps; \ + _pD3D9Caps->VS20Caps.Caps = _pWineCaps->VS20Caps.Caps; \ + _pD3D9Caps->VS20Caps.DynamicFlowControlDepth = _pWineCaps->VS20Caps.DynamicFlowControlDepth; \ + _pD3D9Caps->VS20Caps.NumTemps = _pWineCaps->VS20Caps.NumTemps; \ + _pD3D9Caps->VS20Caps.NumTemps = _pWineCaps->VS20Caps.NumTemps; \ + _pD3D9Caps->VS20Caps.StaticFlowControlDepth = _pWineCaps->VS20Caps.StaticFlowControlDepth; \ + _pD3D9Caps->PS20Caps.Caps = _pWineCaps->PS20Caps.Caps; \ + _pD3D9Caps->PS20Caps.DynamicFlowControlDepth = _pWineCaps->PS20Caps.DynamicFlowControlDepth; \ + _pD3D9Caps->PS20Caps.NumTemps = _pWineCaps->PS20Caps.NumTemps; \ + _pD3D9Caps->PS20Caps.StaticFlowControlDepth = _pWineCaps->PS20Caps.StaticFlowControlDepth; \ + _pD3D9Caps->PS20Caps.NumInstructionSlots = _pWineCaps->PS20Caps.NumInstructionSlots; \ + _pD3D9Caps->VertexTextureFilterCaps = _pWineCaps->VertexTextureFilterCaps; \ + _pD3D9Caps->MaxVShaderInstructionsExecuted = _pWineCaps->MaxVShaderInstructionsExecuted; \ + _pD3D9Caps->MaxPShaderInstructionsExecuted = _pWineCaps->MaxPShaderInstructionsExecuted; \ + _pD3D9Caps->MaxVertexShader30InstructionSlots = _pWineCaps->MaxVertexShader30InstructionSlots; \ + _pD3D9Caps->MaxPixelShader30InstructionSlots = _pWineCaps->MaxPixelShader30InstructionSlots; /* =========================================================================== - D3D9 interfactes + D3D9 interfaces =========================================================================== */ /* ---------- */ diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c index a5f8b4b51fd..5f9ef00d3ca 100644 --- a/dlls/d3d9/device.c +++ b/dlls/d3d9/device.c @@ -183,10 +183,10 @@ static HRESULT WINAPI IDirect3DDevice9Impl_GetDeviceCaps(LPDIRECT3DDEVICE9EX i } memset(pCaps, 0, sizeof(*pCaps)); - D3D9CAPSTOWINECAPS(pCaps, pWineCaps) EnterCriticalSection(&d3d9_cs); hrc = IWineD3DDevice_GetDeviceCaps(This->WineD3DDevice, pWineCaps); LeaveCriticalSection(&d3d9_cs); + WINECAPSTOD3D9CAPS(pCaps, pWineCaps) HeapFree(GetProcessHeap(), 0, pWineCaps); /* Some functionality is implemented in d3d9.dll, not wined3d.dll. Add the needed caps */ diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c index 8b1db3a020b..78244ec1751 100644 --- a/dlls/d3d9/directx.c +++ b/dlls/d3d9/directx.c @@ -303,10 +303,10 @@ static HRESULT WINAPI IDirect3D9Impl_GetDeviceCaps(LPDIRECT3D9EX iface, UINT Ada return D3DERR_INVALIDCALL; /*well this is what MSDN says to return*/ } memset(pCaps, 0, sizeof(*pCaps)); - D3D9CAPSTOWINECAPS(pCaps, pWineCaps) EnterCriticalSection(&d3d9_cs); hrc = IWineD3D_GetDeviceCaps(This->WineD3D, Adapter, DeviceType, pWineCaps); LeaveCriticalSection(&d3d9_cs); + WINECAPSTOD3D9CAPS(pCaps, pWineCaps) HeapFree(GetProcessHeap(), 0, pWineCaps); /* Some functionality is implemented in d3d9.dll, not wined3d.dll. Add the needed caps */ diff --git a/dlls/d3d9/stateblock.c b/dlls/d3d9/stateblock.c index 8a82d6318eb..89e992c2698 100644 --- a/dlls/d3d9/stateblock.c +++ b/dlls/d3d9/stateblock.c @@ -168,7 +168,7 @@ HRESULT WINAPI IDirect3DDevice9Impl_EndStateBlock(LPDIRECT3DDEVICE9EX iface, I TRACE("(%p) Relay\n", This); - /* Tell wineD3D to endstatablock before anything else (in case we run out + /* Tell wineD3D to endstateblock before anything else (in case we run out * of memory later and cause locking problems) */ EnterCriticalSection(&d3d9_cs); diff --git a/dlls/d3d9/tests/device.c b/dlls/d3d9/tests/device.c index 6e44581005b..80eb240766b 100644 --- a/dlls/d3d9/tests/device.c +++ b/dlls/d3d9/tests/device.c @@ -356,8 +356,8 @@ static void test_refcount(void) /** * Check refcount of implicit surfaces and implicit swapchain. Findings: * - the container is the device OR swapchain - * - they hold a refernce to the device - * - they are created with a refcount of 0 (Get/Release returns orignial refcount) + * - they hold a reference to the device + * - they are created with a refcount of 0 (Get/Release returns original refcount) * - they are not freed if refcount reaches 0. * - the refcount is not forwarded to the container. */ @@ -1921,7 +1921,7 @@ static void test_display_formats() { /* Direct3D9 offers 4 display formats R5G6B5, X1R5G5B5, X8R8G8B8 and A2R10G10B10. * Next to these there are 6 different backbuffer formats. Only a fixed number of - * mixings are possible in FULLSCREEN mode. In windowed mode more combinations are + * combinations are possible in FULLSCREEN mode. In windowed mode more combinations are * allowed due to depth conversion and this is likely driver dependent. * This test checks which combinations are possible in fullscreen mode and this should not be driver dependent. * TODO: handle A2R10G10B10 but what hardware supports it? Parhelia? It is very rare. */ diff --git a/dlls/d3d9/tests/surface.c b/dlls/d3d9/tests/surface.c index a7fef001e2e..d4c9c188f6e 100644 --- a/dlls/d3d9/tests/surface.c +++ b/dlls/d3d9/tests/surface.c @@ -363,7 +363,7 @@ static void test_private_data(IDirect3DDevice9 *device) hr = IDirect3DSurface9_GetPrivateData(surface, &IID_IDirect3DSurface9, &ptr, &size); ok(hr == D3D_OK, "IDirect3DSurface9_GetPrivateData failed with %08x\n", hr); ref2 = getref((IUnknown *) device); - /* Object is NOT beein addrefed */ + /* Object is NOT being addrefed */ ok(ptr == (IUnknown *) device, "Returned interface pointer is %p, expected %p\n", ptr, device); ok(ref2 == ref + 2, "Object reference is %d, expected %d. ptr at %p, orig at %p\n", ref2, ref + 2, ptr, device); IUnknown_Release(ptr); diff --git a/dlls/d3d9/tests/visual.c b/dlls/d3d9/tests/visual.c index ac74879841d..8916649bc56 100644 --- a/dlls/d3d9/tests/visual.c +++ b/dlls/d3d9/tests/visual.c @@ -1040,7 +1040,7 @@ static void test_cube_wrap(IDirect3DDevice9 *device) /* Due to the nature of this test, we sample essentially at the edge * between two faces. Because of this it's undefined from which face - * the driver will sample. Furtunately that's not important for this + * the driver will sample. Fortunately that's not important for this * test, since all we care about is that it doesn't sample from the * other side of the surface or from the border. */ color = getPixelColor(device, 320, 240); @@ -1121,7 +1121,7 @@ static void offscreen_test(IDirect3DDevice9 *device) hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffff00ff, 0.0, 0); ok(hr == D3D_OK, "Clear failed, hr = %s\n", DXGetErrorString9(hr)); - /* Draw without textures - Should resut in a white quad */ + /* Draw without textures - Should result in a white quad */ hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(quad[0])); ok(hr == D3D_OK, "DrawPrimitiveUP failed, hr = %s\n", DXGetErrorString9(hr)); @@ -1542,7 +1542,7 @@ static void texbem_test(IDirect3DDevice9 *device) D3DDECL_END() } }; - /* use assymetric matrix to test loading */ + /* use asymmetric matrix to test loading */ float bumpenvmat[4] = {0.0,0.5,-0.5,0.0}; IDirect3DVertexDeclaration9 *vertex_declaration = NULL; @@ -2383,7 +2383,7 @@ static void texture_transform_flags_test(IDirect3DDevice9 *device) D3DLOCKED_RECT lr; D3DLOCKED_BOX lb; DWORD color; - IDirect3DVertexDeclaration9 *decl, *decl2; + IDirect3DVertexDeclaration9 *decl, *decl2, *decl3; float identity[16] = {1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, @@ -2398,6 +2398,15 @@ static void texture_transform_flags_test(IDirect3DDevice9 *device) {0, 12, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0}, D3DDECL_END() }; + static const D3DVERTEXELEMENT9 decl_elements3[] = { + {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, + {0, 12, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0}, + D3DDECL_END() + }; + static const unsigned char proj_texdata[] = {0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}; memset(&lr, 0, sizeof(lr)); memset(&lb, 0, sizeof(lb)); @@ -2412,6 +2421,8 @@ static void texture_transform_flags_test(IDirect3DDevice9 *device) ok(hr == D3D_OK, "IDirect3DDevice9_CreateVertexDeclaration returned %s\n", DXGetErrorString9(hr)); hr = IDirect3DDevice9_CreateVertexDeclaration(device, decl_elements2, &decl2); ok(hr == D3D_OK, "IDirect3DDevice9_CreateVertexDeclaration returned %s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_CreateVertexDeclaration(device, decl_elements3, &decl3); + ok(hr == D3D_OK, "IDirect3DDevice9_CreateVertexDeclaration returned %s\n", DXGetErrorString9(hr)); hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_SRGBTEXTURE, FALSE); ok(hr == D3D_OK, "IDirect3DDevice9_SetSamplerState(D3DSAMP_SRGBTEXTURE) returned %s\n", DXGetErrorString9(hr)); hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); @@ -2652,6 +2663,133 @@ static void texture_transform_flags_test(IDirect3DDevice9 *device) IDirect3DTexture9_Release(texture); + /* Test projected textures, without any fancy matrices */ + hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xff203040, 0.0, 0); + ok(hr == D3D_OK, "IDirect3DDevice9_Clear returned %s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_CreateTexture(device, 4, 4, 1, 0, D3DFMT_L8, D3DPOOL_MANAGED, &texture, NULL); + ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture returned %s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_SetTransform(device, D3DTS_TEXTURE0, (D3DMATRIX *) &identity); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTransform failed with %s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_SetVertexDeclaration(device, decl3); + ok(hr == D3D_OK, "IDirect3DDevice9_SetVertexDeclaration failed with %s\n", DXGetErrorString9(hr)); + + hr = IDirect3DTexture9_LockRect(texture, 0, &lr, NULL, 0); + ok(hr == D3D_OK, "IDirect3DTexture9_LockRect failed with %s\n", DXGetErrorString9(hr)); + for(x = 0; x < 4; x++) { + memcpy(((BYTE *) lr.pBits) + lr.Pitch * x, proj_texdata + 4 * x, 4 * sizeof(proj_texdata[0])); + } + hr = IDirect3DTexture9_UnlockRect(texture, 0); + ok(hr == D3D_OK, "IDirect3DTexture9_UnlockRect failed with %s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *) texture); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture failed with %s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_BeginScene(device); + ok(hr == D3D_OK, "IDirect3DDevice9_BeginScene failed with %s\n", DXGetErrorString9(hr)); + if(SUCCEEDED(hr)) + { + const float proj_quads[] = { + -1.0, -1.0, 0.1, 0.0, 0.0, 4.0, 6.0, + 1.0, -1.0, 0.1, 4.0, 0.0, 4.0, 6.0, + -1.0, 0.0, 0.1, 0.0, 4.0, 4.0, 6.0, + 1.0, 0.0, 0.1, 4.0, 4.0, 4.0, 6.0, + -1.0, 0.0, 0.1, 0.0, 0.0, 4.0, 6.0, + 1.0, 0.0, 0.1, 4.0, 0.0, 4.0, 6.0, + -1.0, 1.0, 0.1, 0.0, 4.0, 4.0, 6.0, + 1.0, 1.0, 0.1, 4.0, 4.0, 4.0, 6.0, + }; + + IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT4 | D3DTTFF_PROJECTED); + ok(SUCCEEDED(hr), "IDirect3DDevice9_SetTextureStageState failed (%08x)\n", hr); + hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, &proj_quads[0*7], 7 * sizeof(float)); + ok(SUCCEEDED(hr), "DrawPrimitiveUP failed (%08x)\n", hr); + + IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT3 | D3DTTFF_PROJECTED); + ok(SUCCEEDED(hr), "IDirect3DDevice9_SetTextureStageState failed (%08x)\n", hr); + hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, &proj_quads[4*7], 7 * sizeof(float)); + ok(SUCCEEDED(hr), "DrawPrimitiveUP failed (%08x)\n", hr); + + hr = IDirect3DDevice9_EndScene(device); + ok(hr == D3D_OK, "IDirect3DDevice9_EndScene failed with %s\n", DXGetErrorString9(hr)); + } + + hr = IDirect3DDevice9_SetTexture(device, 0, NULL); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture failed with %s\n", DXGetErrorString9(hr)); + IDirect3DTexture9_Release(texture); + + hr = IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); + ok(hr == D3D_OK, "IDirect3DDevice9_Present failed with %s\n", DXGetErrorString9(hr)); + color = getPixelColor(device, 158, 118); + ok(color == 0x00000000, "proj: Pixel 158/118 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 162, 118); + ok(color == 0x00000000, "proj: Pixel 162/118 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 158, 122); + ok(color == 0x00000000, "proj: Pixel 158/122 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 162, 122); + ok(color == 0x00FFFFFF, "proj: Pixel 162/122 has color 0x%08x, expected 0x00FFFFFF\n", color); + + color = getPixelColor(device, 158, 178); + ok(color == 0x00000000, "proj: Pixel 158/178 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 162, 178); + ok(color == 0x00FFFFFF, "proj: Pixel 158/178 has color 0x%08x, expected 0x00FFFFFF\n", color); + color = getPixelColor(device, 158, 182); + ok(color == 0x00000000, "proj: Pixel 158/182 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 162, 182); + ok(color == 0x00000000, "proj: Pixel 158/182 has color 0x%08x, expected 0x00000000\n", color); + + color = getPixelColor(device, 318, 118); + ok(color == 0x00000000, "proj: Pixel 318/118 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 322, 118); + ok(color == 0x00000000, "proj: Pixel 322/118 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 318, 122); + ok(color == 0x00FFFFFF, "proj: Pixel 318/122 has color 0x%08x, expected 0x00FFFFFF\n", color); + color = getPixelColor(device, 322, 122); + ok(color == 0x00000000, "proj: Pixel 322/122 has color 0x%08x, expected 0x00000000\n", color); + + color = getPixelColor(device, 318, 178); + ok(color == 0x00FFFFFF, "proj: Pixel 318/178 has color 0x%08x, expected 0x00FFFFFF\n", color); + color = getPixelColor(device, 322, 178); + ok(color == 0x00000000, "proj: Pixel 322/178 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 318, 182); + ok(color == 0x00000000, "proj: Pixel 318/182 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 322, 182); + ok(color == 0x00000000, "proj: Pixel 322/182 has color 0x%08x, expected 0x00000000\n", color); + + color = getPixelColor(device, 238, 298); + ok(color == 0x00000000, "proj: Pixel 238/298 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 242, 298); + ok(color == 0x00000000, "proj: Pixel 242/298 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 238, 302); + ok(color == 0x00000000, "proj: Pixel 238/302 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 242, 302); + ok(color == 0x00FFFFFF, "proj: Pixel 242/302 has color 0x%08x, expected 0x00FFFFFF\n", color); + + color = getPixelColor(device, 238, 388); + ok(color == 0x00000000, "proj: Pixel 238/388 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 242, 388); + ok(color == 0x00FFFFFF, "proj: Pixel 242/388 has color 0x%08x, expected 0x00FFFFFF\n", color); + color = getPixelColor(device, 238, 392); + ok(color == 0x00000000, "proj: Pixel 238/392 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 242, 392); + ok(color == 0x00000000, "proj: Pixel 242/392 has color 0x%08x, expected 0x00000000\n", color); + + color = getPixelColor(device, 478, 298); + ok(color == 0x00000000, "proj: Pixel 478/298 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 482, 298); + ok(color == 0x00000000, "proj: Pixel 482/298 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 478, 302); + ok(color == 0x00FFFFFF, "proj: Pixel 478/302 has color 0x%08x, expected 0x00FFFFFF\n", color); + color = getPixelColor(device, 482, 302); + ok(color == 0x00000000, "proj: Pixel 482/302 has color 0x%08x, expected 0x00000000\n", color); + + color = getPixelColor(device, 478, 388); + ok(color == 0x00FFFFFF, "proj: Pixel 478/388 has color 0x%08x, expected 0x00FFFFFF\n", color); + color = getPixelColor(device, 482, 388); + ok(color == 0x00000000, "proj: Pixel 482/388 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 478, 392); + ok(color == 0x00000000, "proj: Pixel 478/392 has color 0x%08x, expected 0x00000000\n", color); + color = getPixelColor(device, 482, 392); + ok(color == 0x00000000, "proj: Pixel 482/392 has color 0x%08x, expected 0x00000000\n", color); + hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xff203040, 0.0, 0); ok(hr == D3D_OK, "IDirect3DDevice9_Clear returned %s\n", DXGetErrorString9(hr)); /* Use a smaller volume texture than the biggest possible size for memory and performance reasons @@ -2879,6 +3017,7 @@ static void texture_transform_flags_test(IDirect3DDevice9 *device) ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture returned %s\n", DXGetErrorString9(hr)); IDirect3DVertexDeclaration9_Release(decl); IDirect3DVertexDeclaration9_Release(decl2); + IDirect3DVertexDeclaration9_Release(decl3); } static void texdepth_test(IDirect3DDevice9 *device) @@ -5503,6 +5642,8 @@ static void shademode_test(IDirect3DDevice9 *device) /* Render a quad and try all of the different fixed function shading models. */ HRESULT hr; DWORD color0, color1; + DWORD color0_gouraud = 0, color1_gouraud = 0; + BYTE r, g, b; DWORD shademode = D3DSHADE_FLAT; DWORD primtype = D3DPT_TRIANGLESTRIP; LPVOID data = NULL; @@ -5597,14 +5738,40 @@ static void shademode_test(IDirect3DDevice9 *device) break; case D3DSHADE_GOURAUD: /* Should be an interpolated blend */ - ok(color0 == 0x000dca28, "GOURAUD shading has color0 %08x, expected 0x000dca28\n", color0); - ok(color1 == 0x000d45c7, "GOURAUD shading has color1 %08x, expected 0x000d45c7\n", color1); + + r = (color0 & 0x00ff0000) >> 16; + g = (color0 & 0x0000ff00) >> 8; + b = (color0 & 0x000000ff); + ok(r >= 0x0d && r <= 0x0e && g == 0xca && b >= 0x27 && b <= 0x28, + "GOURAUD shading has color0 %08x, expected 0x000dca28\n", color0); + r = (color1 & 0x00ff0000) >> 16; + g = (color1 & 0x0000ff00) >> 8; + b = (color1 & 0x000000ff); + ok(r == 0x0d && g >= 0x44 && g <= 0x45 && b >= 0xc7 && b <= 0xc8, + "GOURAUD shading has color1 %08x, expected 0x000d45c7\n", color1); + + color0_gouraud = color0; + color1_gouraud = color1; + shademode = D3DSHADE_PHONG; break; case D3DSHADE_PHONG: /* Should be the same as GOURAUD, since no hardware implements this */ - ok(color0 == 0x000dca28, "PHONG shading has color0 %08x, expected 0x000dca28\n", color0); - ok(color1 == 0x000d45c7, "PHONG shading has color1 %08x, expected 0x000d45c7\n", color1); + r = (color0 & 0x00ff0000) >> 16; + g = (color0 & 0x0000ff00) >> 8; + b = (color0 & 0x000000ff); + ok(r >= 0x0d && r <= 0x0e && g == 0xca && b >= 0x27 && b <= 0x28, + "PHONG shading has color0 %08x, expected 0x000dca28\n", color0); + r = (color1 & 0x00ff0000) >> 16; + g = (color1 & 0x0000ff00) >> 8; + b = (color1 & 0x000000ff); + ok(r == 0x0d && g >= 0x44 && g <= 0x45 && b >= 0xc7 && b <= 0xc8, + "PHONG shading has color1 %08x, expected 0x000d45c7\n", color1); + + ok(color0 == color0_gouraud, "difference between GOURAUD and PHONG shading detected: %08x %08x\n", + color0_gouraud, color0); + ok(color1 == color1_gouraud, "difference between GOURAUD and PHONG shading detected: %08x %08x\n", + color1_gouraud, color1); break; } } @@ -6749,7 +6916,7 @@ static void vFace_register_test(IDirect3DDevice9 *device) hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLELIST, 4, quad, sizeof(float) * 3); ok(hr == D3D_OK, "IDirect3DDevice9_DrawPrimitiveUP failed, hr=%s\n", DXGetErrorString9(hr)); - /* Blit the texture ontp the back buffer to make it visible */ + /* Blit the texture onto the back buffer to make it visible */ hr = IDirect3DDevice9_SetPixelShader(device, NULL); ok(hr == D3D_OK, "IDirect3DDevice9_SetPixelShader failed, hr=%s\n", DXGetErrorString9(hr)); hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *) texture); @@ -6807,7 +6974,7 @@ static void fixed_function_bumpmap_test(IDirect3DDevice9 *device) D3DDECL_END() }; - /* use assymetric matrix to test loading */ + /* use asymmetric matrix to test loading */ float bumpenvmat[4] = {0.0,0.5,-0.5,0.0}; IDirect3DVertexDeclaration9 *vertex_declaration = NULL; @@ -7420,6 +7587,296 @@ static void pointsize_test(IDirect3DDevice9 *device) ok(hr == D3D_OK, "IDirect3DDevice9_SetTransform failed, hr=%s\n", DXGetErrorString9(hr)); } +static void multiple_rendertargets_test(IDirect3DDevice9 *device) +{ + HRESULT hr; + IDirect3DPixelShader9 *ps; + IDirect3DTexture9 *tex1, *tex2; + IDirect3DSurface9 *surf1, *surf2, *backbuf; + D3DCAPS9 caps; + DWORD color; + DWORD shader_code[] = { + 0xffff0300, /* ps_3_0 */ + 0x05000051, 0xa00f0000, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, /* def c0, 0, 1, 0, 0 */ + 0x05000051, 0xa00f0001, 0x00000000, 0x00000000, 0x3f800000, 0x00000000, /* def c1, 0, 0, 1, 0 */ + 0x02000001, 0x800f0800, 0xa0e40000, /* mov oC0, c0 */ + 0x02000001, 0x800f0801, 0xa0e40001, /* mov oC1, c1 */ + 0x0000ffff /* END */ + }; + float quad[] = { + -1.0, -1.0, 0.1, + 1.0, -1.0, 0.1, + -1.0, 1.0, 0.1, + 1.0, 1.0, 0.1, + }; + float texquad[] = { + -1.0, -1.0, 0.1, 0.0, 0.0, + 0.0, -1.0, 0.1, 1.0, 0.0, + -1.0, 1.0, 0.1, 0.0, 1.0, + 0.0, 1.0, 0.1, 1.0, 1.0, + + 0.0, -1.0, 0.1, 0.0, 0.0, + 1.0, -1.0, 0.1, 1.0, 0.0, + 0.0, 1.0, 0.1, 0.0, 1.0, + 1.0, 1.0, 0.1, 1.0, 1.0, + }; + + memset(&caps, 0, sizeof(caps)); + hr = IDirect3DDevice9_GetDeviceCaps(device, &caps); + ok(hr == D3D_OK, "IDirect3DDevice9_GetCaps failed, hr=%s\n", DXGetErrorString9(hr)); + if(caps.NumSimultaneousRTs < 2) { + skip("Only 1 simultaneous render target supported, skipping MRT test\n"); + return; + } + + hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffff0000, 0.0, 0); + ok(hr == D3D_OK, "IDirect3DDevice9_Clear failed, hr=%s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_CreateTexture(device, 16, 16, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &tex1, NULL); + ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture failed, hr=%s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_CreateTexture(device, 16, 16, 1, D3DUSAGE_RENDERTARGET, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &tex2, NULL); + ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture failed, hr=%s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_CreatePixelShader(device, shader_code, &ps); + ok(hr == D3D_OK, "IDirect3DDevice9_CreatePixelShader failed, hr=%s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_GetRenderTarget(device, 0, &backbuf); + ok(hr == D3D_OK, "IDirect3DDevice9_GetRenderTarget failed, hr=%s\n", DXGetErrorString9(hr)); + hr = IDirect3DTexture9_GetSurfaceLevel(tex1, 0, &surf1); + ok(hr == D3D_OK, "IDirect3DTexture9_GetSurfaceLevel failed, hr=%s\n", DXGetErrorString9(hr)); + hr = IDirect3DTexture9_GetSurfaceLevel(tex2, 0, &surf2); + ok(hr == D3D_OK, "IDirect3DTexture9_GetSurfaceLevel failed, hr=%s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_SetPixelShader(device, ps); + ok(hr == D3D_OK, "IDirect3DDevice9_SetPixelShader failed, hr=%s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_SetRenderTarget(device, 0, surf1); + ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderTarget failed, hr=%s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_SetRenderTarget(device, 1, surf2); + ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderTarget failed, hr=%s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ); + ok(hr == D3D_OK, "IDirect3DDevice9_SetFVF failed, hr=%s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_BeginScene(device); + ok(hr == D3D_OK, "IDirect3DDevice9_BeginScene failed, hr=%s\n", DXGetErrorString9(hr)); + if(SUCCEEDED(hr)) { + hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, 3 * sizeof(float)); + ok(hr == D3D_OK, "IDirect3DDevice9_DrawPrimitiveUP failed, hr=%s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_SetPixelShader(device, NULL); + ok(hr == D3D_OK, "IDirect3DDevice9_SetPixelShader failed, hr=%s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_SetRenderTarget(device, 0, backbuf); + ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderTarget failed, hr=%s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_SetRenderTarget(device, 1, NULL); + ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderTarget failed, hr=%s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_TEX1); + ok(hr == D3D_OK, "IDirect3DDevice9_SetFVF failed, hr=%s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *) tex1); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture failed, hr=%s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, &texquad[0], 5 * sizeof(float)); + ok(hr == D3D_OK, "IDirect3DDevice9_DrawPrimitiveUP failed, hr=%s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *) tex2); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture failed, hr=%s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, &texquad[20], 5 * sizeof(float)); + ok(hr == D3D_OK, "IDirect3DDevice9_DrawPrimitiveUP failed, hr=%s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_SetTexture(device, 0, NULL); + ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture failed, hr=%s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_EndScene(device); + ok(hr == D3D_OK, "IDirect3DDevice9_EndScene failed, hr=%s\n", DXGetErrorString9(hr)); + } + + IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); + color = getPixelColor(device, 160, 240); + ok(color == 0x0000ff00, "Texture 1(output color 1) has color 0x%08x, expected 0x0000ff00\n", color); + color = getPixelColor(device, 480, 240); + ok(color == 0x000000ff, "Texture 2(output color 2) has color 0x%08x, expected 0x000000ff\n", color); + + IDirect3DPixelShader9_Release(ps); + IDirect3DTexture9_Release(tex1); + IDirect3DTexture9_Release(tex2); + IDirect3DSurface9_Release(surf1); + IDirect3DSurface9_Release(surf2); + IDirect3DSurface9_Release(backbuf); +} + +struct formats { + const char *fmtName; + D3DFORMAT textureFormat; + DWORD resultColorBlending; + DWORD resultColorNoBlending; +}; + +const struct formats test_formats[] = { + { "D3DFMT_G16R16", D3DFMT_G16R16, 0x00181800, 0x002010ff}, + { "D3DFMT_R16F", D3DFMT_R16F, 0x0018ffff, 0x0020ffff }, + { "D3DFMT_G16R16F", D3DFMT_G16R16F, 0x001818ff, 0x002010ff }, + { "D3DFMT_A16B16G16R16F", D3DFMT_A16B16G16R16F, 0x00181800, 0x00201000 }, + { "D3DFMT_R32F", D3DFMT_R32F, 0x0018ffff, 0x0020ffff }, + { "D3DFMT_G32R32F", D3DFMT_G32R32F, 0x001818ff, 0x002010ff }, + { "D3DFMT_A32B32G32R32F", D3DFMT_A32B32G32R32F, 0x00181800, 0x00201000 }, + { NULL, 0 } +}; + +static void pixelshader_blending_test(IDirect3DDevice9 *device) +{ + HRESULT hr; + IDirect3DTexture9 *offscreenTexture = NULL; + IDirect3DSurface9 *backbuffer = NULL, *offscreen = NULL; + IDirect3D9 *d3d = NULL; + DWORD color; + int fmt_index; + + static const float quad[][5] = { + {-0.5f, -0.5f, 0.1f, 0.0f, 0.0f}, + {-0.5f, 0.5f, 0.1f, 0.0f, 1.0f}, + { 0.5f, -0.5f, 0.1f, 1.0f, 0.0f}, + { 0.5f, 0.5f, 0.1f, 1.0f, 1.0f}, + }; + + /* Quad with R=0x10, G=0x20 */ + static const struct vertex quad1[] = { + {-1.0f, -1.0f, 0.1f, 0x80102000}, + {-1.0f, 1.0f, 0.1f, 0x80102000}, + { 1.0f, -1.0f, 0.1f, 0x80102000}, + { 1.0f, 1.0f, 0.1f, 0x80102000}, + }; + + /* Quad with R=0x20, G=0x10 */ + static const struct vertex quad2[] = { + {-1.0f, -1.0f, 0.1f, 0x80201000}, + {-1.0f, 1.0f, 0.1f, 0x80201000}, + { 1.0f, -1.0f, 0.1f, 0x80201000}, + { 1.0f, 1.0f, 0.1f, 0x80201000}, + }; + + IDirect3DDevice9_GetDirect3D(device, &d3d); + + hr = IDirect3DDevice9_GetBackBuffer(device, 0, 0, D3DBACKBUFFER_TYPE_MONO, &backbuffer); + ok(hr == D3D_OK, "Can't get back buffer, hr = %s\n", DXGetErrorString9(hr)); + if(!backbuffer) { + goto out; + } + + for(fmt_index=0; test_formats[fmt_index].textureFormat != 0; fmt_index++) + { + D3DFORMAT fmt = test_formats[fmt_index].textureFormat; + if(IDirect3D9_CheckDeviceFormat(d3d, 0, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, 0, D3DRTYPE_TEXTURE, fmt) != D3D_OK) { + skip("%s textures not supported\n", test_formats[fmt_index].fmtName); + continue; + } + + hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0, 0); + ok(hr == D3D_OK, "Clear failed, hr = %s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_CreateTexture(device, 128, 128, 1, D3DUSAGE_RENDERTARGET, fmt, D3DPOOL_DEFAULT, &offscreenTexture, NULL); + ok(hr == D3D_OK || hr == D3DERR_INVALIDCALL, "Creating the offscreen render target failed, hr = %s\n", DXGetErrorString9(hr)); + if(!offscreenTexture) { + continue; + } + + hr = IDirect3DTexture9_GetSurfaceLevel(offscreenTexture, 0, &offscreen); + ok(hr == D3D_OK, "Can't get offscreen surface, hr = %s\n", DXGetErrorString9(hr)); + if(!offscreen) { + continue; + } + + hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_DIFFUSE); + ok(hr == D3D_OK, "SetFVF failed, hr = %s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); + ok(hr == D3D_OK, "SetTextureStageState failed, hr = %s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_SetTextureStageState(device, 0, D3DTSS_COLORARG1, D3DTA_TEXTURE); + ok(hr == D3D_OK, "SetTextureStageState failed, hr = %s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MINFILTER, D3DTEXF_POINT); + ok(SUCCEEDED(hr), "SetSamplerState D3DSAMP_MINFILTER failed (0x%08x)\n", hr); + hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); + ok(SUCCEEDED(hr), "SetSamplerState D3DSAMP_MAGFILTER failed (0x%08x)\n", hr); + hr = IDirect3DDevice9_SetRenderState(device, D3DRS_LIGHTING, FALSE); + ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderState returned %s\n", DXGetErrorString9(hr)); + + /* Below we will draw two quads with different colors and try to blend them together. + * The result color is compared with the expected outcome. + */ + if(IDirect3DDevice9_BeginScene(device) == D3D_OK) { + hr = IDirect3DDevice9_SetRenderTarget(device, 0, offscreen); + ok(hr == D3D_OK, "SetRenderTarget failed, hr = %s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0x00ffffff, 0.0, 0); + ok(hr == D3D_OK, "Clear failed, hr = %s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_SetRenderState(device, D3DRS_ALPHABLENDENABLE, TRUE); + ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderState failed, hr = %08x\n", hr); + + /* Draw a quad using color 0x0010200 */ + hr = IDirect3DDevice9_SetRenderState(device, D3DRS_SRCBLEND, D3DBLEND_ONE); + ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderState failed, hr = %08x\n", hr); + hr = IDirect3DDevice9_SetRenderState(device, D3DRS_DESTBLEND, D3DBLEND_ZERO); + ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderState failed, hr = %08x\n", hr); + hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad1, sizeof(quad1[0])); + ok(hr == D3D_OK, "DrawPrimitiveUP failed, hr = %#08x\n", hr); + + /* Draw a quad using color 0x0020100 */ + hr = IDirect3DDevice9_SetRenderState(device, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderState failed, hr = %08x\n", hr); + hr = IDirect3DDevice9_SetRenderState(device, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderState failed, hr = %08x\n", hr); + hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad2, sizeof(quad2[0])); + ok(hr == D3D_OK, "DrawPrimitiveUP failed, hr = %#08x\n", hr); + + /* We don't want to blend the result on the backbuffer */ + hr = IDirect3DDevice9_SetRenderState(device, D3DRS_ALPHABLENDENABLE, FALSE); + ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderState failed, hr = %08x\n", hr); + + /* Prepare rendering the 'blended' texture quad to the backbuffer */ + hr = IDirect3DDevice9_SetRenderTarget(device, 0, backbuffer); + ok(hr == D3D_OK, "SetRenderTarget failed, hr = %s\n", DXGetErrorString9(hr)); + hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *) offscreenTexture); + ok(hr == D3D_OK, "SetTexture failed, %s\n", DXGetErrorString9(hr)); + + hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_TEX1); + ok(hr == D3D_OK, "SetFVF failed, hr = %s\n", DXGetErrorString9(hr)); + + /* This time with the texture */ + hr = IDirect3DDevice9_DrawPrimitiveUP(device, D3DPT_TRIANGLESTRIP, 2, quad, sizeof(quad[0])); + ok(hr == D3D_OK, "DrawPrimitiveUP failed, hr = %s\n", DXGetErrorString9(hr)); + + IDirect3DDevice9_EndScene(device); + } + IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL); + + + if(IDirect3D9_CheckDeviceFormat(d3d, 0, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, D3DRTYPE_TEXTURE, fmt) == D3D_OK) { + /* Compare the color of the center quad with our expectation */ + color = getPixelColor(device, 320, 240); + trace("[Blending] %s: expected=%x, result=%x\n", test_formats[fmt_index].fmtName, test_formats[fmt_index].resultColorBlending, color); + ok(color == test_formats[fmt_index].resultColorBlending, "Offscreen failed for %s: Got color %#08x, expected %#08x.\n", test_formats[fmt_index].fmtName, color, test_formats[fmt_index].resultColorBlending); + } else { + /* No pixel shader blending is supported so expected garbage.The type of 'garbage' depends on the driver version and OS. + * E.g. on G16R16 ati reports (on old r9600 drivers) 0x00ffffff and on modern ones 0x002010ff which is also what Nvidia + * reports. On Vista Nvidia seems to report 0x00ffffff on Geforce7 cards. */ + color = getPixelColor(device, 320, 240); + trace("[No blending] %s: expected %x or 0x00ffffff, result=%x\n", test_formats[fmt_index].fmtName, test_formats[fmt_index].resultColorNoBlending, color); + todo_wine ok((color == 0x00ffffff) || (color == test_formats[fmt_index].resultColorNoBlending), "Offscreen failed for %s: expected garbage but color %#08x, matches the result we would have with blending. (todo)\n", test_formats[fmt_index].fmtName, color); + } + + IDirect3DDevice9_SetTexture(device, 0, NULL); + if(offscreenTexture) { + IDirect3DTexture9_Release(offscreenTexture); + } + if(offscreen) { + IDirect3DSurface9_Release(offscreen); + } + } + +out: + /* restore things */ + if(backbuffer) { + IDirect3DDevice9_SetRenderTarget(device, 0, backbuffer); + IDirect3DSurface9_Release(backbuffer); + } +} + START_TEST(visual) { IDirect3DDevice9 *device_ptr; @@ -7500,6 +7957,7 @@ START_TEST(visual) release_buffer_test(device_ptr); float_texture_test(device_ptr); g16r16_texture_test(device_ptr); + pixelshader_blending_test(device_ptr); texture_transform_flags_test(device_ptr); autogen_mipmap_test(device_ptr); fixed_function_decl_test(device_ptr); @@ -7552,6 +8010,7 @@ START_TEST(visual) fixed_function_varying_test(device_ptr); vFace_register_test(device_ptr); vpos_register_test(device_ptr); + multiple_rendertargets_test(device_ptr); if(caps.VertexShaderVersion >= D3DVS_VERSION(3, 0)) { vshader_version_varying_test(device_ptr); pshader_version_varying_test(device_ptr); diff --git a/dlls/d3dx8/tests/math.c b/dlls/d3dx8/tests/math.c index a8471b3a9ed..6bec5e5a943 100644 --- a/dlls/d3dx8/tests/math.c +++ b/dlls/d3dx8/tests/math.c @@ -536,7 +536,7 @@ static void D3DXPlaneTest(void) expectedvec.x = 20.0f/3.0f; expectedvec.y = 17.0f/3.0f; expectedvec.z = 14.0f/3.0f; D3DXPlaneIntersectLine(&gotvec,&plane,&vec1,&vec2); expect_vec3(expectedvec, gotvec); - /* Test a parallele line */ + /* Test a parallel line */ vec1.x = 11.0f; vec1.y = 13.0f; vec1.z = 15.0f; vec2.x = 17.0f; vec2.y = 31.0f; vec2.z = 24.0f; expectedvec.x = 20.0f/3.0f; expectedvec.y = 17.0f/3.0f; expectedvec.z = 14.0f/3.0f; diff --git a/dlls/fusion/Makefile.in b/dlls/d3dx9_37/Makefile.in similarity index 69% copy from dlls/fusion/Makefile.in copy to dlls/d3dx9_37/Makefile.in index f7c47f8cc5c..6de5cb4d9b8 100644 --- a/dlls/fusion/Makefile.in +++ b/dlls/d3dx9_37/Makefile.in @@ -2,13 +2,11 @@ TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ -MODULE = fusion.dll -IMPORTS = kernel32 +MODULE = d3dx9_37.dll +IMPORTS = d3d9 kernel32 C_SRCS = \ - asmname.c \ - fusion.c \ - fusion_main.c + d3dx9_37_main.c @MAKE_DLL_RULES@ diff --git a/dlls/d3dx9_37/d3dx9_37.spec b/dlls/d3dx9_37/d3dx9_37.spec new file mode 100644 index 00000000000..bdd1c73fdcc --- /dev/null +++ b/dlls/d3dx9_37/d3dx9_37.spec @@ -0,0 +1,336 @@ +@ stdcall D3DXAssembleShader(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShader +@ stdcall D3DXAssembleShaderFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileA +@ stdcall D3DXAssembleShaderFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromFileW +@ stdcall D3DXAssembleShaderFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceA +@ stdcall D3DXAssembleShaderFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXAssembleShaderFromResourceW +@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr) d3dx9_36.D3DXBoxBoundProbe +@ stdcall D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckCubeTextureRequirements +@ stdcall D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckTextureRequirements +@ stdcall D3DXCheckVersion(long long) +@ stdcall D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long) d3dx9_36.D3DXCheckVolumeTextureRequirements +@ stdcall D3DXCleanMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCleanMesh +@ stdcall D3DXColorAdjustContrast(ptr ptr long) d3dx9_36.D3DXColorAdjustContrast +@ stdcall D3DXColorAdjustSaturation(ptr ptr long) d3dx9_36.D3DXColorAdjustSaturation +@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShader +@ stdcall D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileA +@ stdcall D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromFileW +@ stdcall D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceA +@ stdcall D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCompileShaderFromResourceW +@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingBox +@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr) d3dx9_36.D3DXComputeBoundingSphere +@ stdcall D3DXComputeIMTFromPerVertexSignal(ptr ptr long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerVertexSignal +@ stdcall D3DXComputeIMTFromPerTexelSignal(ptr long ptr long long long long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromPerTexelSignal +@ stdcall D3DXComputeIMTFromSignal(ptr long long long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromSignal +@ stdcall D3DXComputeIMTFromTexture(ptr ptr long long ptr ptr ptr) d3dx9_36.D3DXComputeIMTFromTexture +@ stdcall D3DXComputeNormalMap(ptr ptr ptr long long long) d3dx9_36.D3DXComputeNormalMap +@ stdcall D3DXComputeNormals(ptr ptr) d3dx9_36.D3DXComputeNormals +@ stdcall D3DXComputeTangent(ptr long long long long ptr) d3dx9_36.D3DXComputeTangent +@ stdcall D3DXComputeTangentFrame(ptr long) d3dx9_36.D3DXComputeTangentFrame +@ stdcall D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr) d3dx9_36.D3DXComputeTangentFrameEx +@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes +@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip +@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips +@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController +@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox +@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer +@ stdcall D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr) d3dx9_36.D3DXCreateCompressedAnimationSet +@ stdcall D3DXCreateCubeTexture(ptr long long long long long ptr) d3dx9_36.D3DXCreateCubeTexture +@ stdcall D3DXCreateCubeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileA +@ stdcall D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExA +@ stdcall D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileExW +@ stdcall D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemory +@ stdcall D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileInMemoryEx +@ stdcall D3DXCreateCubeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromFileW +@ stdcall D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA +@ stdcall D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExA +@ stdcall D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceExW +@ stdcall D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceW +@ stdcall D3DXCreateCylinder(ptr long long long long long ptr ptr) d3dx9_36.D3DXCreateCylinder +@ stdcall D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffect +@ stdcall D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompiler +@ stdcall D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileA +@ stdcall D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromFileW +@ stdcall D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceA +@ stdcall D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXCreateEffectCompilerFromResourceW +@ stdcall D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectEx +@ stdcall D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileA +@ stdcall D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExA +@ stdcall D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileExW +@ stdcall D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromFileW +@ stdcall D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceA +@ stdcall D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExA +@ stdcall D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceExW +@ stdcall D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr) d3dx9_36.D3DXCreateEffectFromResourceW +@ stdcall D3DXCreateEffectPool(ptr) d3dx9_36.D3DXCreateEffectPool +@ stdcall D3DXCreateFontA(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontA +@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectA +@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr) d3dx9_36.D3DXCreateFontIndirectW +@ stdcall D3DXCreateFontW(ptr long long long long long long long long long ptr ptr) d3dx9_36.D3DXCreateFontW +@ stdcall D3DXCreateFragmentLinker(ptr long ptr) d3dx9_36.D3DXCreateFragmentLinker +@ stdcall D3DXCreateFragmentLinkerEx(ptr long long ptr) d3dx9_36.D3DXCreateFragmentLinkerEx +@ stdcall D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateKeyframedAnimationSet +@ stdcall D3DXCreateLine(ptr ptr) d3dx9_36.D3DXCreateLine +@ stdcall D3DXCreateMatrixStack(long ptr) d3dx9_36.D3DXCreateMatrixStack +@ stdcall D3DXCreateMesh(long long long ptr ptr ptr) d3dx9_36.D3DXCreateMesh +@ stdcall D3DXCreateMeshFVF(long long long long ptr ptr) d3dx9_36.D3DXCreateMeshFVF +@ stdcall D3DXCreateNPatchMesh(ptr ptr) d3dx9_36.D3DXCreateNPatchMesh +@ stdcall D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreatePMeshFromStream +@ stdcall D3DXCreatePatchMesh(ptr long long long ptr ptr ptr) d3dx9_36.D3DXCreatePatchMesh +@ stdcall D3DXCreatePolygon(ptr long long ptr ptr) d3dx9_36.D3DXCreatePolygon +@ stdcall D3DXCreatePRTBuffer(long long long ptr) d3dx9_36.D3DXCreatePRTBuffer +@ stdcall D3DXCreatePRTBufferTex(long long long long ptr) d3dx9_36.D3DXCreatePRTBufferTex +@ stdcall D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr) d3dx9_36.D3DXCreatePRTCompBuffer +@ stdcall D3DXCreatePRTEngine(ptr ptr long ptr ptr) d3dx9_36.D3DXCreatePRTEngine +@ stdcall D3DXCreateRenderToEnvMap(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToEnvMap +@ stdcall D3DXCreateRenderToSurface(ptr long long long long long ptr) d3dx9_36.D3DXCreateRenderToSurface +@ stdcall D3DXCreateSPMesh(ptr ptr ptr ptr ptr) d3dx9_36.D3DXCreateSPMesh +@ stdcall D3DXCreateSkinInfo(long ptr long ptr) d3dx9_36.D3DXCreateSkinInfo +@ stdcall D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr) d3dx9_36.D3DXCreateSkinInfoFromBlendedMesh +@ stdcall D3DXCreateSkinInfoFVF(long long long ptr) d3dx9_36.D3DXCreateSkinInfoFVF +@ stdcall D3DXCreateSphere(ptr long long long ptr ptr) d3dx9_36.D3DXCreateSphere +@ stdcall D3DXCreateSprite(ptr ptr) d3dx9_36.D3DXCreateSprite +@ stdcall D3DXCreateTeapot(ptr ptr ptr) d3dx9_36.D3DXCreateTeapot +@ stdcall D3DXCreateTextA(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextA +@ stdcall D3DXCreateTextW(ptr long ptr long long ptr ptr ptr) d3dx9_36.D3DXCreateTextW +@ stdcall D3DXCreateTexture(ptr long long long long long long ptr) d3dx9_36.D3DXCreateTexture +@ stdcall D3DXCreateTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileA +@ stdcall D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExA +@ stdcall D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileExW +@ stdcall D3DXCreateTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateTextureFromFileInMemory +@ stdcall D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileInMemoryEx +@ stdcall D3DXCreateTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromFileW +@ stdcall D3DXCreateTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceA +@ stdcall D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExA +@ stdcall D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceExW +@ stdcall D3DXCreateTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateTextureFromResourceW +@ stdcall D3DXCreateTextureGutterHelper(long long ptr long ptr) d3dx9_36.D3DXCreateTextureGutterHelper +@ stdcall D3DXCreateTextureShader(ptr ptr) d3dx9_36.D3DXCreateTextureShader +@ stdcall D3DXCreateTorus(ptr long long long long ptr ptr) d3dx9_36.D3DXCreateTorus +@ stdcall D3DXCreateVolumeTexture(ptr long long long long long long long ptr) d3dx9_36.D3DXCreateVolumeTexture +@ stdcall D3DXCreateVolumeTextureFromFileA(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileA +@ stdcall D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExA +@ stdcall D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileExW +@ stdcall D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemory +@ stdcall D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileInMemoryEx +@ stdcall D3DXCreateVolumeTextureFromFileW(ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromFileW +@ stdcall D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceA +@ stdcall D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExA +@ stdcall D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceExW +@ stdcall D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr) d3dx9_36.D3DXCreateVolumeTextureFromResourceW +@ stdcall D3DXDebugMute(long) d3dx9_36.D3DXDebugMute +@ stdcall D3DXDeclaratorFromFVF(long ptr) d3dx9_36.D3DXDeclaratorFromFVF +@ stdcall D3DXDisassembleEffect(ptr long ptr) d3dx9_36.D3DXDisassembleEffect +@ stdcall D3DXDisassembleShader(ptr long ptr ptr) d3dx9_36.D3DXDisassembleShader +@ stdcall D3DXFileCreate(ptr) d3dx9_36.D3DXFileCreate +@ stdcall D3DXFillCubeTexture(ptr ptr ptr) d3dx9_36.D3DXFillCubeTexture +@ stdcall D3DXFillCubeTextureTX(ptr ptr) d3dx9_36.D3DXFillCubeTextureTX +@ stdcall D3DXFillTexture(ptr ptr ptr) d3dx9_36.D3DXFillTexture +@ stdcall D3DXFillTextureTX(ptr ptr) d3dx9_36.D3DXFillTextureTX +@ stdcall D3DXFillVolumeTexture(ptr ptr ptr) d3dx9_36.D3DXFillVolumeTexture +@ stdcall D3DXFillVolumeTextureTX(ptr ptr) d3dx9_36.D3DXFillVolumeTextureTX +@ stdcall D3DXFilterTexture(ptr ptr long long) d3dx9_36.D3DXFilterTexture +@ stdcall D3DXFindShaderComment(ptr long ptr ptr) d3dx9_36.D3DXFindShaderComment +@ stdcall D3DXFloat16To32Array(ptr ptr long) d3dx9_36.D3DXFloat16To32Array +@ stdcall D3DXFloat32To16Array(ptr ptr long) d3dx9_36.D3DXFloat32To16Array +@ stdcall D3DXFrameAppendChild(ptr ptr) d3dx9_36.D3DXFrameAppendChild +@ stdcall D3DXFrameCalculateBoundingSphere(ptr ptr ptr) d3dx9_36.D3DXFrameCalculateBoundingSphere +@ stdcall D3DXFrameDestroy(ptr ptr) d3dx9_36.D3DXFrameDestroy +@ stdcall D3DXFrameFind(ptr ptr) d3dx9_36.D3DXFrameFind +@ stdcall D3DXFrameNumNamedMatrices(ptr) d3dx9_36.D3DXFrameNumNamedMatrices +@ stdcall D3DXFrameRegisterNamedMatrices(ptr ptr) d3dx9_36.D3DXFrameRegisterNamedMatrices +@ stdcall D3DXFresnelTerm(long long) d3dx9_36.D3DXFresnelTerm +@ stdcall D3DXFVFFromDeclarator(ptr ptr) d3dx9_36.D3DXFVFFromDeclarator +@ stdcall D3DXGatherFragments(ptr long ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragments +@ stdcall D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileA +@ stdcall D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromFileW +@ stdcall D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceA +@ stdcall D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr) d3dx9_36.D3DXGatherFragmentsFromResourceW +@ stdcall D3DXGenerateOutputDecl(ptr ptr) d3dx9_36.D3DXGenerateOutputDecl +@ stdcall D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXGeneratePMesh +@ stdcall D3DXGetDeclLength(ptr) d3dx9_36.D3DXGetDeclLength +@ stdcall D3DXGetDeclVertexSize(ptr long) d3dx9_36.D3DXGetDeclVertexSize +@ stdcall D3DXGetDriverLevel(ptr) d3dx9_36.D3DXGetDriverLevel +@ stdcall D3DXGetFVFVertexSize(long) d3dx9_36.D3DXGetFVFVertexSize +@ stdcall D3DXGetImageInfoFromFileA(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileA +@ stdcall D3DXGetImageInfoFromFileInMemory(ptr long ptr) d3dx9_36.D3DXGetImageInfoFromFileInMemory +@ stdcall D3DXGetImageInfoFromFileW(ptr ptr) d3dx9_36.D3DXGetImageInfoFromFileW +@ stdcall D3DXGetImageInfoFromResourceA(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceA +@ stdcall D3DXGetImageInfoFromResourceW(long ptr ptr) d3dx9_36.D3DXGetImageInfoFromResourceW +@ stdcall D3DXGetPixelShaderProfile(ptr) d3dx9_36.D3DXGetPixelShaderProfile +@ stdcall D3DXGetShaderConstantTable(ptr ptr) d3dx9_36.D3DXGetShaderConstantTable +@ stdcall D3DXGetShaderConstantTableEx(ptr long ptr) d3dx9_36.D3DXGetShaderConstantTableEx +@ stdcall D3DXGetShaderInputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderInputSemantics +@ stdcall D3DXGetShaderOutputSemantics(ptr ptr ptr) d3dx9_36.D3DXGetShaderOutputSemantics +@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers +@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize +@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion +@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile +@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect +@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset +@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectTri +@ stdcall D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXA +@ stdcall D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXInMemory +@ stdcall D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXResource +@ stdcall D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXW +@ stdcall D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshFromXof +@ stdcall D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXA +@ stdcall D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXInMemory +@ stdcall D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadMeshHierarchyFromXW +@ stdcall D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr) d3dx9_36.D3DXLoadPatchMeshFromXof +@ stdcall D3DXLoadPRTBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileA +@ stdcall D3DXLoadPRTBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTBufferFromFileW +@ stdcall D3DXLoadPRTCompBufferFromFileA(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileA +@ stdcall D3DXLoadPRTCompBufferFromFileW(ptr ptr) d3dx9_36.D3DXLoadPRTCompBufferFromFileW +@ stdcall D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXLoadSkinMeshFromXof +@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileA +@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileInMemory +@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromFileW +@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory +@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA +@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW +@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface +@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA +@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory +@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW +@ stdcall D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromMemory +@ stdcall D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceA +@ stdcall D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromResourceW +@ stdcall D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadVolumeFromVolume +@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr) d3dx9_36.D3DXMatrixAffineTransformation +@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr) d3dx9_36.D3DXMatrixAffineTransformation2D +@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixDecompose +@ stdcall D3DXMatrixDeterminant(ptr) d3dx9_36.D3DXMatrixDeterminant +@ stdcall D3DXMatrixInverse(ptr ptr ptr) d3dx9_36.D3DXMatrixInverse +@ stdcall D3DXMatrixLookAtLH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtLH +@ stdcall D3DXMatrixLookAtRH(ptr ptr ptr ptr) d3dx9_36.D3DXMatrixLookAtRH +@ stdcall D3DXMatrixMultiply(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiply +@ stdcall D3DXMatrixMultiplyTranspose(ptr ptr ptr) d3dx9_36.D3DXMatrixMultiplyTranspose +@ stdcall D3DXMatrixOrthoLH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoLH +@ stdcall D3DXMatrixOrthoOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterLH +@ stdcall D3DXMatrixOrthoOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixOrthoOffCenterRH +@ stdcall D3DXMatrixOrthoRH(ptr long long long long) d3dx9_36.D3DXMatrixOrthoRH +@ stdcall D3DXMatrixPerspectiveFovLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovLH +@ stdcall D3DXMatrixPerspectiveFovRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveFovRH +@ stdcall D3DXMatrixPerspectiveLH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveLH +@ stdcall D3DXMatrixPerspectiveOffCenterLH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterLH +@ stdcall D3DXMatrixPerspectiveOffCenterRH(ptr long long long long long long) d3dx9_36.D3DXMatrixPerspectiveOffCenterRH +@ stdcall D3DXMatrixPerspectiveRH(ptr long long long long) d3dx9_36.D3DXMatrixPerspectiveRH +@ stdcall D3DXMatrixReflect(ptr ptr) d3dx9_36.D3DXMatrixReflect +@ stdcall D3DXMatrixRotationAxis(ptr ptr long) d3dx9_36.D3DXMatrixRotationAxis +@ stdcall D3DXMatrixRotationQuaternion(ptr ptr) d3dx9_36.D3DXMatrixRotationQuaternion +@ stdcall D3DXMatrixRotationX(ptr long) d3dx9_36.D3DXMatrixRotationX +@ stdcall D3DXMatrixRotationY(ptr long) d3dx9_36.D3DXMatrixRotationY +@ stdcall D3DXMatrixRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXMatrixRotationYawPitchRoll +@ stdcall D3DXMatrixRotationZ(ptr long) d3dx9_36.D3DXMatrixRotationZ +@ stdcall D3DXMatrixScaling(ptr long long long) d3dx9_36.D3DXMatrixScaling +@ stdcall D3DXMatrixShadow(ptr ptr ptr) d3dx9_36.D3DXMatrixShadow +@ stdcall D3DXMatrixTransformation(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXMatrixTransformation +@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr) d3dx9_36.D3DXMatrixTransformation2D +@ stdcall D3DXMatrixTranslation(ptr long long long) d3dx9_36.D3DXMatrixTranslation +@ stdcall D3DXMatrixTranspose(ptr ptr) d3dx9_36.D3DXMatrixTranspose +@ stdcall D3DXOptimizeFaces(ptr long long long ptr) d3dx9_36.D3DXOptimizeFaces +@ stdcall D3DXOptimizeVertices(ptr long long long ptr) d3dx9_36.D3DXOptimizeVertices +@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr) d3dx9_36.D3DXPlaneFromPointNormal +@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneFromPoints +@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr) d3dx9_36.D3DXPlaneIntersectLine +@ stdcall D3DXPlaneNormalize(ptr ptr) d3dx9_36.D3DXPlaneNormalize +@ stdcall D3DXPlaneTransform(ptr ptr ptr) d3dx9_36.D3DXPlaneTransform +@ stdcall D3DXPlaneTransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXPlaneTransformArray +@ stdcall D3DXPreprocessShader(ptr long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShader +@ stdcall D3DXPreprocessShaderFromFileA(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileA +@ stdcall D3DXPreprocessShaderFromFileW(ptr ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromFileW +@ stdcall D3DXPreprocessShaderFromResourceA(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceA +@ stdcall D3DXPreprocessShaderFromResourceW(long long ptr ptr ptr ptr) d3dx9_36.D3DXPreprocessShaderFromResourceW +@ stdcall D3DXQuaternionBaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXQuaternionBaryCentric +@ stdcall D3DXQuaternionExp(ptr ptr) d3dx9_36.D3DXQuaternionExp +@ stdcall D3DXQuaternionInverse(ptr ptr) d3dx9_36.D3DXQuaternionInverse +@ stdcall D3DXQuaternionLn(ptr ptr) d3dx9_36.D3DXQuaternionLn +@ stdcall D3DXQuaternionMultiply(ptr ptr ptr) d3dx9_36.D3DXQuaternionMultiply +@ stdcall D3DXQuaternionNormalize(ptr ptr) d3dx9_36.D3DXQuaternionNormalize +@ stdcall D3DXQuaternionRotationAxis(ptr ptr long) d3dx9_36.D3DXQuaternionRotationAxis +@ stdcall D3DXQuaternionRotationMatrix(ptr ptr) d3dx9_36.D3DXQuaternionRotationMatrix +@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long) d3dx9_36.D3DXQuaternionRotationYawPitchRoll +@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long) d3dx9_36.D3DXQuaternionSlerp +@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXQuaternionSquad +@ stdcall D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXQuaternionSquadSetup +@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr) d3dx9_36.D3DXQuaternionToAxisAngle +@ stdcall D3DXRectPatchSize(ptr ptr ptr) d3dx9_36.D3DXRectPatchSize +@ stdcall D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileA +@ stdcall D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveMeshHierarchyToFileW +@ stdcall D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXA +@ stdcall D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXSaveMeshToXW +@ stdcall D3DXSavePRTBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileA +@ stdcall D3DXSavePRTBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTBufferToFileW +@ stdcall D3DXSavePRTCompBufferToFileA(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileA +@ stdcall D3DXSavePRTCompBufferToFileW(ptr ptr) d3dx9_36.D3DXSavePRTCompBufferToFileW +@ stdcall D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileA +@ stdcall D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileInMemory +@ stdcall D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveSurfaceToFileW +@ stdcall D3DXSaveTextureToFileA(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileA +@ stdcall D3DXSaveTextureToFileInMemory(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileInMemory +@ stdcall D3DXSaveTextureToFileW(ptr long ptr ptr) d3dx9_36.D3DXSaveTextureToFileW +@ stdcall D3DXSaveVolumeToFileA(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileA +@ stdcall D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileInMemory +@ stdcall D3DXSaveVolumeToFileW(ptr long ptr ptr ptr) d3dx9_36.D3DXSaveVolumeToFileW +@ stdcall D3DXSHAdd(ptr long ptr ptr) d3dx9_36.D3DXSHAdd +@ stdcall D3DXSHDot(long ptr ptr) d3dx9_36.D3DXSHDot +@ stdcall D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalConeLight +@ stdcall D3DXSHEvalDirection(ptr long ptr) d3dx9_36.D3DXSHEvalDirection +@ stdcall D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalDirectionalLight +@ stdcall D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr) d3dx9_36.D3DXSHEvalHemisphereLight +@ stdcall D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr) d3dx9_36.D3DXSHEvalSphericalLight +@ stdcall D3DXSHMultiply2(ptr ptr ptr) d3dx9_36.D3DXSHMultiply2 +@ stdcall D3DXSHMultiply3(ptr ptr ptr) d3dx9_36.D3DXSHMultiply3 +@ stdcall D3DXSHMultiply4(ptr ptr ptr) d3dx9_36.D3DXSHMultiply4 +@ stdcall D3DXSHMultiply5(ptr ptr ptr) d3dx9_36.D3DXSHMultiply5 +@ stdcall D3DXSHMultiply6(ptr ptr ptr) d3dx9_36.D3DXSHMultiply6 +@ stdcall D3DXSHProjectCubeMap(long ptr ptr ptr ptr) d3dx9_36.D3DXSHProjectCubeMap +@ stdcall D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSHPRTCompSplitMeshSC +@ stdcall D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr) d3dx9_36.D3DXSHPRTCompSuperCluster +@ stdcall D3DXSHRotate(ptr long ptr ptr) d3dx9_36.D3DXSHRotate +@ stdcall D3DXSHRotateZ(ptr long long ptr) d3dx9_36.D3DXSHRotateZ +@ stdcall D3DXSHScale(ptr long ptr ptr) d3dx9_36.D3DXSHScale +@ stdcall D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXSimplifyMesh +@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr) d3dx9_36.D3DXSphereBoundProbe +@ stdcall D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXSplitMesh +@ stdcall D3DXTessellateNPatches(ptr ptr long long ptr ptr) d3dx9_36.D3DXTessellateNPatches +@ stdcall D3DXTessellateRectPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateRectPatch +@ stdcall D3DXTessellateTriPatch(ptr ptr ptr ptr ptr) d3dx9_36.D3DXTessellateTriPatch +@ stdcall D3DXTriPatchSize(ptr ptr ptr) d3dx9_36.D3DXTriPatchSize +@ stdcall D3DXUVAtlasCreate(ptr long long long long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasCreate +@ stdcall D3DXUVAtlasPack(ptr long long long long ptr ptr long ptr long ptr) d3dx9_36.D3DXUVAtlasPack +@ stdcall D3DXUVAtlasPartition(ptr long long long ptr ptr ptr ptr long ptr long ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXUVAtlasPartition +@ stdcall D3DXValidMesh(ptr ptr ptr) d3dx9_36.D3DXValidMesh +@ stdcall D3DXValidPatchMesh(ptr ptr ptr ptr) d3dx9_36.D3DXValidPatchMesh +@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec2BaryCentric +@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2CatmullRom +@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec2Hermite +@ stdcall D3DXVec2Normalize(ptr ptr) d3dx9_36.D3DXVec2Normalize +@ stdcall D3DXVec2Transform(ptr ptr ptr) d3dx9_36.D3DXVec2Transform +@ stdcall D3DXVec2TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformArray +@ stdcall D3DXVec2TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec2TransformCoord +@ stdcall D3DXVec2TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformCoordArray +@ stdcall D3DXVec2TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec2TransformNormal +@ stdcall D3DXVec2TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec2TransformNormalArray +@ stdcall D3DXVec3BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec3BaryCentric +@ stdcall D3DXVec3CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3CatmullRom +@ stdcall D3DXVec3Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec3Hermite +@ stdcall D3DXVec3Normalize(ptr ptr) d3dx9_36.D3DXVec3Normalize +@ stdcall D3DXVec3Project(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Project +@ stdcall D3DXVec3ProjectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3ProjectArray +@ stdcall D3DXVec3Transform(ptr ptr ptr) d3dx9_36.D3DXVec3Transform +@ stdcall D3DXVec3TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformArray +@ stdcall D3DXVec3TransformCoord(ptr ptr ptr) d3dx9_36.D3DXVec3TransformCoord +@ stdcall D3DXVec3TransformCoordArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformCoordArray +@ stdcall D3DXVec3TransformNormal(ptr ptr ptr) d3dx9_36.D3DXVec3TransformNormal +@ stdcall D3DXVec3TransformNormalArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec3TransformNormalArray +@ stdcall D3DXVec3Unproject(ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXVec3Unproject +@ stdcall D3DXVec3UnprojectArray(ptr long ptr long ptr ptr ptr ptr long) d3dx9_36.D3DXVec3UnprojectArray +@ stdcall D3DXVec4BaryCentric(ptr ptr ptr ptr long long) d3dx9_36.D3DXVec4BaryCentric +@ stdcall D3DXVec4CatmullRom(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4CatmullRom +@ stdcall D3DXVec4Cross(ptr ptr ptr ptr) d3dx9_36.D3DXVec4Cross +@ stdcall D3DXVec4Hermite(ptr ptr ptr ptr ptr long) d3dx9_36.D3DXVec4Hermite +@ stdcall D3DXVec4Normalize(ptr ptr) d3dx9_36.D3DXVec4Normalize +@ stdcall D3DXVec4Transform(ptr ptr ptr) d3dx9_36.D3DXVec4Transform +@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long) d3dx9_36.D3DXVec4TransformArray +@ stdcall D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr) d3dx9_36.D3DXWeldVertices diff --git a/dlls/mscms/mscms_main.c b/dlls/d3dx9_37/d3dx9_37_main.c similarity index 57% copy from dlls/mscms/mscms_main.c copy to dlls/d3dx9_37/d3dx9_37_main.c index df449b1d935..b0d6b729f57 100644 --- a/dlls/mscms/mscms_main.c +++ b/dlls/d3dx9_37/d3dx9_37_main.c @@ -1,7 +1,7 @@ /* - * MSCMS - Color Management System for Wine + * Direct3D X 9 main file * - * Copyright 2004, 2005 Hans Leidekker + * Copyright (C) 2007 David Adam * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -16,13 +16,11 @@ * 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 "wine/port.h" -#include "wine/debug.h" -#include "wine/library.h" #include @@ -30,21 +28,38 @@ #include "winbase.h" #include "wingdi.h" #include "winuser.h" -#include "icm.h" +#include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(mscms); +#include "d3dx9.h" -BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) -{ - TRACE( "(%p, %d, %p)\n", hinst, reason, reserved ); +WINE_DEFAULT_DEBUG_CHANNEL(d3dx); - switch (reason) +/*********************************************************************** + * DllMain. + */ +BOOL WINAPI DllMain(HINSTANCE inst, DWORD reason, LPVOID reserved) +{ + switch(reason) { + case DLL_WINE_PREATTACH: + return FALSE; /* prefer native version */ case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls( hinst ); + DisableThreadLibraryCalls(inst); break; case DLL_PROCESS_DETACH: break; } return TRUE; } + +/*********************************************************************** + * D3DXCheckVersion + * Checks whether we are compiling against the correct d3d and d3dx library. + */ +BOOL WINAPI D3DXCheckVersion(UINT d3dsdkvers, UINT d3dxsdkvers) +{ + if(d3dsdkvers==D3D_SDK_VERSION && d3dxsdkvers==37) + return TRUE; + else + return FALSE; +} diff --git a/dlls/dbghelp/stabs.c b/dlls/dbghelp/stabs.c index cc750c6dddf..d5978482ea4 100644 --- a/dlls/dbghelp/stabs.c +++ b/dlls/dbghelp/stabs.c @@ -1147,7 +1147,7 @@ static void pending_flush(struct pending_block* pending, struct module* module, * Ends function creation: mainly: * - cleans up line number information * - tries to set up a debug-start tag (FIXME: heuristic to be enhanced) - * - for stabs which have abolute address in them, initializes the size of the + * - for stabs which have absolute address in them, initializes the size of the * function (assuming that current function ends where next function starts) */ static void stabs_finalize_function(struct module* module, struct symt_function* func, diff --git a/dlls/ddraw/direct3d.c b/dlls/ddraw/direct3d.c index 00c9d68b3a5..730fcf63058 100644 --- a/dlls/ddraw/direct3d.c +++ b/dlls/ddraw/direct3d.c @@ -1132,6 +1132,7 @@ IDirect3DImpl_7_EnumZBufferFormats(IDirect3D7 *iface, HRESULT hr; int i; WINED3DDISPLAYMODE d3ddm; + WINED3DDEVTYPE type; /* Order matters. Specifically, BattleZone II (full version) expects the * 16-bit depth formats to be listed before the 24 and 32 ones. */ @@ -1146,23 +1147,56 @@ IDirect3DImpl_7_EnumZBufferFormats(IDirect3D7 *iface, TRACE("(%p)->(%s,%p,%p): Relay\n", iface, debugstr_guid(refiidDevice), Callback, Context); - if(IWineD3D_GetAdapterDisplayMode(This->wineD3D, WINED3DADAPTER_DEFAULT, &d3ddm ) != WINED3D_OK) { - ERR("Unable to retrieve a default display mode for quering the z-buffer formats!\n"); - return DDERR_INVALIDPARAMS; - } - if(!Callback) return DDERR_INVALIDPARAMS; + if(IsEqualGUID(refiidDevice, &IID_IDirect3DHALDevice) || + IsEqualGUID(refiidDevice, &IID_IDirect3DTnLHalDevice) || + IsEqualGUID(refiidDevice, &IID_D3DDEVICE_WineD3D)) + { + TRACE("Asked for HAL device\n"); + type = WINED3DDEVTYPE_HAL; + } + else if(IsEqualGUID(refiidDevice, &IID_IDirect3DRGBDevice) || + IsEqualGUID(refiidDevice, &IID_IDirect3DMMXDevice)) + { + TRACE("Asked for SW device\n"); + type = WINED3DDEVTYPE_SW; + } + else if(IsEqualGUID(refiidDevice, &IID_IDirect3DRefDevice)) + { + TRACE("Asked for REF device\n"); + type = WINED3DDEVTYPE_REF; + } + else if(IsEqualGUID(refiidDevice, &IID_IDirect3DNullDevice)) + { + TRACE("Asked for NULLREF device\n"); + type = WINED3DDEVTYPE_NULLREF; + } + else + { + FIXME("Unexpected device GUID %s\n", debugstr_guid(refiidDevice)); + type = WINED3DDEVTYPE_HAL; + } + EnterCriticalSection(&ddraw_cs); - for(i = 0; i < sizeof(FormatList) / sizeof(WINED3DFORMAT); i++) + /* We need an adapter format from somewhere to please wined3d and WGL. Use the current display mode. + * So far all cards offer the same depth stencil format for all modes, but if some do not and apps + * do not like that we'll have to find some workaround, like iterating over all imaginable formats + * and collecting all the depth stencil formats we can get + */ + hr = IWineD3DDevice_GetDisplayMode(This->wineD3DDevice, + 0 /* swapchain 0 */, + &d3ddm); + + for(i = 0; i < (sizeof(FormatList) / sizeof(FormatList[0])); i++) { hr = IWineD3D_CheckDeviceFormat(This->wineD3D, - 0 /* Adapter */, - 0 /* DeviceType */, + WINED3DADAPTER_DEFAULT /* Adapter */, + type /* DeviceType */, d3ddm.Format /* AdapterFormat */, WINED3DUSAGE_DEPTHSTENCIL /* Usage */, - WINED3DRTYPE_SURFACE /* ResourceType */, + WINED3DRTYPE_SURFACE, FormatList[i]); if(hr == D3D_OK) { @@ -1260,102 +1294,9 @@ IDirect3DImpl_GetCaps(IWineD3D *WineD3D, HRESULT hr; /* Some Variables to asign to the pointers in WCaps */ - WINED3DDEVTYPE DevType; - UINT dummy_uint; - float dummy_float; - DWORD dummy_dword, MaxTextureBlendStages, MaxSimultaneousTextures; - DWORD MaxUserClipPlanes, MaxVertexBlendMatrices; - TRACE("()->(%p,%p,%p\n", WineD3D, Desc123, Desc7); - /* Asign the pointers in WCaps */ - WCaps.DeviceType = &DevType; - WCaps.AdapterOrdinal = &dummy_uint; - - WCaps.Caps = &dummy_dword; - WCaps.Caps2 = &dummy_dword; - WCaps.Caps3 = &dummy_dword; - WCaps.PresentationIntervals = &dummy_dword; - - WCaps.CursorCaps = &dummy_dword; - - WCaps.DevCaps = &Desc7->dwDevCaps; - WCaps.PrimitiveMiscCaps = &dummy_dword; - WCaps.RasterCaps = &Desc7->dpcLineCaps.dwRasterCaps; - WCaps.ZCmpCaps = &Desc7->dpcLineCaps.dwZCmpCaps; - WCaps.SrcBlendCaps = &Desc7->dpcLineCaps.dwSrcBlendCaps; - WCaps.DestBlendCaps = &Desc7->dpcLineCaps.dwDestBlendCaps; - WCaps.AlphaCmpCaps = &Desc7->dpcLineCaps.dwAlphaCmpCaps; - WCaps.ShadeCaps = &Desc7->dpcLineCaps.dwShadeCaps; - WCaps.TextureCaps = &Desc7->dpcLineCaps.dwTextureCaps; - WCaps.TextureFilterCaps = &Desc7->dpcLineCaps.dwTextureFilterCaps; - WCaps.CubeTextureFilterCaps = &dummy_dword; - WCaps.VolumeTextureFilterCaps = &dummy_dword; - WCaps.TextureAddressCaps = &Desc7->dpcLineCaps.dwTextureAddressCaps; - WCaps.VolumeTextureAddressCaps = &dummy_dword; - - WCaps.LineCaps = &dummy_dword; - WCaps.MaxTextureWidth = &Desc7->dwMaxTextureWidth; - WCaps.MaxTextureHeight = &Desc7->dwMaxTextureHeight; - WCaps.MaxVolumeExtent = &dummy_dword; - - WCaps.MaxTextureRepeat = &Desc7->dwMaxTextureRepeat; - WCaps.MaxTextureAspectRatio = &Desc7->dwMaxTextureAspectRatio; - WCaps.MaxAnisotropy = &Desc7->dwMaxAnisotropy; - WCaps.MaxVertexW = &Desc7->dvMaxVertexW; - - WCaps.GuardBandLeft = &Desc7->dvGuardBandLeft; - WCaps.GuardBandTop = &Desc7->dvGuardBandTop; - WCaps.GuardBandRight = &Desc7->dvGuardBandRight; - WCaps.GuardBandBottom = &Desc7->dvGuardBandBottom; - - WCaps.ExtentsAdjust = &Desc7->dvExtentsAdjust; - WCaps.StencilCaps = &Desc7->dwStencilCaps; - - WCaps.FVFCaps = &Desc7->dwFVFCaps; - WCaps.TextureOpCaps = &Desc7->dwTextureOpCaps; - WCaps.MaxTextureBlendStages = &MaxTextureBlendStages; - WCaps.MaxSimultaneousTextures = &MaxSimultaneousTextures; - - WCaps.VertexProcessingCaps = &Desc7->dwVertexProcessingCaps; - WCaps.MaxActiveLights = &Desc7->dwMaxActiveLights; - WCaps.MaxUserClipPlanes = &MaxUserClipPlanes; - WCaps.MaxVertexBlendMatrices = &MaxVertexBlendMatrices; - WCaps.MaxVertexBlendMatrixIndex = &dummy_dword; - - WCaps.MaxPointSize = &dummy_float; - WCaps.MaxPrimitiveCount = &dummy_dword; - WCaps.MaxVertexIndex = &dummy_dword; - WCaps.MaxStreams = &dummy_dword; - WCaps.MaxStreamStride = &dummy_dword; - - WCaps.VertexShaderVersion = &dummy_dword; - WCaps.MaxVertexShaderConst = &dummy_dword; - - WCaps.PixelShaderVersion = &dummy_dword; - WCaps.PixelShader1xMaxValue = &dummy_float; - - /* These are dx9 only, set them to NULL */ - WCaps.DevCaps2 = NULL; - WCaps.MaxNpatchTessellationLevel = NULL; - WCaps.Reserved5 = NULL; - WCaps.MasterAdapterOrdinal = NULL; - WCaps.AdapterOrdinalInGroup = NULL; - WCaps.NumberOfAdaptersInGroup = NULL; - WCaps.DeclTypes = NULL; - WCaps.NumSimultaneousRTs = NULL; - WCaps.StretchRectFilterCaps = NULL; - /* WCaps.VS20Caps = NULL; */ - /* WCaps.PS20Caps = NULL; */ - WCaps.VertexTextureFilterCaps = NULL; - WCaps.MaxVShaderInstructionsExecuted = NULL; - WCaps.MaxPShaderInstructionsExecuted = NULL; - WCaps.MaxVertexShader30InstructionSlots = NULL; - WCaps.MaxPixelShader30InstructionSlots = NULL; - WCaps.Reserved2 = NULL; - WCaps.Reserved3 = NULL; - - /* Now get the caps */ + memset(&WCaps, 0, sizeof(WCaps)); EnterCriticalSection(&ddraw_cs); hr = IWineD3D_GetDeviceCaps(WineD3D, 0, WINED3DDEVTYPE_HAL, &WCaps); LeaveCriticalSection(&ddraw_cs); @@ -1364,6 +1305,40 @@ IDirect3DImpl_GetCaps(IWineD3D *WineD3D, return hr; } + /* Copy the results into the d3d7 and d3d3 structures */ + Desc7->dwDevCaps = WCaps.DevCaps; + Desc7->dpcLineCaps.dwRasterCaps = WCaps.RasterCaps; + Desc7->dpcLineCaps.dwZCmpCaps = WCaps.ZCmpCaps; + Desc7->dpcLineCaps.dwSrcBlendCaps = WCaps.SrcBlendCaps; + Desc7->dpcLineCaps.dwDestBlendCaps = WCaps.DestBlendCaps; + Desc7->dpcLineCaps.dwAlphaCmpCaps = WCaps.AlphaCmpCaps; + Desc7->dpcLineCaps.dwShadeCaps = WCaps.ShadeCaps; + Desc7->dpcLineCaps.dwTextureCaps = WCaps.TextureCaps; + Desc7->dpcLineCaps.dwTextureFilterCaps = WCaps.TextureFilterCaps; + Desc7->dpcLineCaps.dwTextureAddressCaps = WCaps.TextureAddressCaps; + + Desc7->dwMaxTextureWidth = WCaps.MaxTextureWidth; + Desc7->dwMaxTextureHeight = WCaps.MaxTextureHeight; + + Desc7->dwMaxTextureRepeat = WCaps.MaxTextureRepeat; + Desc7->dwMaxTextureAspectRatio = WCaps.MaxTextureAspectRatio; + Desc7->dwMaxAnisotropy = WCaps.MaxAnisotropy; + Desc7->dvMaxVertexW = WCaps.MaxVertexW; + + Desc7->dvGuardBandLeft = WCaps.GuardBandLeft; + Desc7->dvGuardBandTop = WCaps.GuardBandTop; + Desc7->dvGuardBandRight = WCaps.GuardBandRight; + Desc7->dvGuardBandBottom = WCaps.GuardBandBottom; + + Desc7->dvExtentsAdjust = WCaps.ExtentsAdjust; + Desc7->dwStencilCaps = WCaps.StencilCaps; + + Desc7->dwFVFCaps = WCaps.FVFCaps; + Desc7->dwTextureOpCaps = WCaps.TextureOpCaps; + + Desc7->dwVertexProcessingCaps = WCaps.VertexProcessingCaps; + Desc7->dwMaxActiveLights = WCaps.MaxActiveLights; + /* Remove all non-d3d7 caps */ Desc7->dwDevCaps &= ( D3DDEVCAPS_FLOATTLVERTEX | D3DDEVCAPS_SORTINCREASINGZ | D3DDEVCAPS_SORTDECREASINGZ | @@ -1489,15 +1464,15 @@ IDirect3DImpl_GetCaps(IWineD3D *WineD3D, Desc7->dwMinTextureHeight = 1; /* Convert DWORDs safely to WORDs */ - if(MaxTextureBlendStages > 65535) Desc7->wMaxTextureBlendStages = 65535; - else Desc7->wMaxTextureBlendStages = (WORD) MaxTextureBlendStages; - if(MaxSimultaneousTextures > 65535) Desc7->wMaxSimultaneousTextures = 65535; - else Desc7->wMaxSimultaneousTextures = (WORD) MaxSimultaneousTextures; - - if(MaxUserClipPlanes > 65535) Desc7->wMaxUserClipPlanes = 65535; - else Desc7->wMaxUserClipPlanes = (WORD) MaxUserClipPlanes; - if(MaxVertexBlendMatrices > 65535) Desc7->wMaxVertexBlendMatrices = 65535; - else Desc7->wMaxVertexBlendMatrices = (WORD) MaxVertexBlendMatrices; + if(WCaps.MaxTextureBlendStages > 65535) Desc7->wMaxTextureBlendStages = 65535; + else Desc7->wMaxTextureBlendStages = (WORD) WCaps.MaxTextureBlendStages; + if(WCaps.MaxSimultaneousTextures > 65535) Desc7->wMaxSimultaneousTextures = 65535; + else Desc7->wMaxSimultaneousTextures = (WORD) WCaps.MaxSimultaneousTextures; + + if(WCaps.MaxUserClipPlanes > 65535) Desc7->wMaxUserClipPlanes = 65535; + else Desc7->wMaxUserClipPlanes = (WORD) WCaps.MaxUserClipPlanes; + if(WCaps.MaxVertexBlendMatrices > 65535) Desc7->wMaxVertexBlendMatrices = 65535; + else Desc7->wMaxVertexBlendMatrices = (WORD) WCaps.MaxVertexBlendMatrices; Desc7->deviceGUID = IID_IDirect3DTnLHalDevice; diff --git a/dlls/ddraw/executebuffer.c b/dlls/ddraw/executebuffer.c index fce3c4fac58..fe24fe3e0d3 100644 --- a/dlls/ddraw/executebuffer.c +++ b/dlls/ddraw/executebuffer.c @@ -437,9 +437,9 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, dst->u3.sz = (src->u1.x * mat._13) + (src->u2.y * mat._23) + (src->u3.z * mat._33) + (1.0 * mat._43); dst->u4.rhw = (src->u1.x * mat._14) + (src->u2.y * mat._24) + (src->u3.z * mat._34) + (1.0 * mat._44); - dst->u1.sx = dst->u1.sx / dst->u4.rhw * Viewport->dwWidth / 2 + dst->u1.sx = dst->u1.sx / dst->u4.rhw * Viewport->dvScaleX + Viewport->dwX + Viewport->dwWidth / 2; - dst->u2.sy = (-dst->u2.sy) / dst->u4.rhw * Viewport->dwHeight / 2 + dst->u2.sy = (-dst->u2.sy) / dst->u4.rhw * Viewport->dvScaleY + Viewport->dwY + Viewport->dwHeight / 2; dst->u3.sz /= dst->u4.rhw; dst->u4.rhw = 1 / dst->u4.rhw; @@ -460,8 +460,8 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, dump_D3DMATRIX(&proj_mat); TRACE(" View Matrix : (%p)\n",&view_mat); dump_D3DMATRIX(&view_mat); - TRACE(" World Matrix : (%p)\n", &mat); - dump_D3DMATRIX(&mat); + TRACE(" World Matrix : (%p)\n", &world_mat); + dump_D3DMATRIX(&world_mat); } multiply_matrix(&mat,&view_mat,&world_mat); @@ -479,8 +479,11 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This, dst->u3.sz = (src->u1.x * mat._13) + (src->u2.y * mat._23) + (src->u3.z * mat._33) + (1.0 * mat._43); dst->u4.rhw = (src->u1.x * mat._14) + (src->u2.y * mat._24) + (src->u3.z * mat._34) + (1.0 * mat._44); - dst->u1.sx /= dst->u4.rhw * Viewport->dvScaleX * Viewport->dwWidth / 2 + Viewport->dwX; - dst->u2.sy /= dst->u4.rhw * Viewport->dvScaleY * Viewport->dwHeight / 2 + Viewport->dwY; + dst->u1.sx = dst->u1.sx / dst->u4.rhw * Viewport->dvScaleX + + Viewport->dwX + Viewport->dwWidth / 2; + dst->u2.sy = (-dst->u2.sy) / dst->u4.rhw * Viewport->dvScaleY + + Viewport->dwY + Viewport->dwHeight / 2; + dst->u3.sz /= dst->u4.rhw; dst->u4.rhw = 1 / dst->u4.rhw; diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c index ae57bb4532d..c48e07ee2a7 100644 --- a/dlls/ddraw/surface.c +++ b/dlls/ddraw/surface.c @@ -2501,6 +2501,11 @@ IDirectDrawSurfaceImpl_SetPalette(IDirectDrawSurface7 *iface, HRESULT hr; TRACE("(%p)->(%p)\n", This, Pal); + if (!(This->surface_desc.u4.ddpfPixelFormat.dwFlags & (DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2 | + DDPF_PALETTEINDEXED4 | DDPF_PALETTEINDEXED8 | DDPF_PALETTEINDEXEDTO8))) { + return DDERR_INVALIDPIXELFORMAT; + } + /* Find the old palette */ EnterCriticalSection(&ddraw_cs); hr = IDirectDrawSurface_GetPalette(iface, &oldPal); diff --git a/dlls/ddraw/tests/d3d.c b/dlls/ddraw/tests/d3d.c index d5177a554e7..f8c1a9be347 100644 --- a/dlls/ddraw/tests/d3d.c +++ b/dlls/ddraw/tests/d3d.c @@ -1088,6 +1088,30 @@ static void Direct3D1Test(void) hr = IDirect3DDevice_Execute(Direct3DDevice1, ExecuteBuffer, Viewport, D3DEXECUTE_CLIPPED); ok(hr == D3D_OK, "IDirect3DDevice_Execute returned %08x\n", hr); + /* Test rendering 0 triangles */ + memset(&desc, 0, sizeof(desc)); + desc.dwSize = sizeof(desc); + + hr = IDirect3DExecuteBuffer_Lock(ExecuteBuffer, &desc); + ok(hr == D3D_OK, "IDirect3DExecuteBuffer_Lock failed: %08x\n", hr); + + memset(desc.lpData, 0, 128); + instr = desc.lpData; + idx = 0; + + instr->bOpcode = D3DOP_TRIANGLE; + instr->bSize = sizeof(D3DOP_TRIANGLE); + instr->wCount = 0; + instr = ((D3DINSTRUCTION*)(instr))+1; + instr->bOpcode = D3DOP_EXIT; + instr->bSize = 0; + instr->wCount = 0; + hr = IDirect3DExecuteBuffer_Unlock(ExecuteBuffer); + ok(hr == D3D_OK, "IDirect3DExecuteBuffer_Unlock failed: %08x\n", hr); + + hr = IDirect3DDevice_Execute(Direct3DDevice1, ExecuteBuffer, Viewport, D3DEXECUTE_CLIPPED); + ok(hr == D3D_OK, "IDirect3DDevice_Execute returned %08x\n", hr); + memset(&transformdata, 0, sizeof(transformdata)); transformdata.dwSize = sizeof(transformdata); transformdata.lpIn = (void *) testverts; @@ -1506,6 +1530,67 @@ static void TextureLoadTest(void) if (Texture2) IDirect3DTexture_Release(Texture2); } +static void VertexBufferDescTest(void) +{ + HRESULT rc; + D3DVERTEXBUFFERDESC desc; + union mem_t + { + D3DVERTEXBUFFERDESC desc2; + unsigned char buffer[512]; + } mem; + + memset(&desc, 0, sizeof(desc)); + desc.dwSize = sizeof(desc); + desc.dwCaps = 0; + desc.dwFVF = D3DFVF_XYZ; + desc.dwNumVertices = 1; + rc = IDirect3D7_CreateVertexBuffer(lpD3D, &desc, &lpVBufSrc, 0); + ok(rc==D3D_OK || rc==E_OUTOFMEMORY, "CreateVertexBuffer returned: %x\n", rc); + if (!lpVBufSrc) + { + trace("IDirect3D7::CreateVertexBuffer() failed with an error %x\n", rc); + goto out; + } + + memset(mem.buffer, 0x12, sizeof(mem.buffer)); + mem.desc2.dwSize = sizeof(D3DVERTEXBUFFERDESC)*2; + rc = IDirect3DVertexBuffer7_GetVertexBufferDesc(lpVBufSrc, &mem.desc2); + if(rc != D3D_OK) + skip("GetVertexBuffer Failed!\n"); + ok( mem.desc2.dwSize == sizeof(D3DVERTEXBUFFERDESC)*2, "Size returned from GetVertexBufferDesc does not match the value put in\n" ); + ok( mem.buffer[sizeof(D3DVERTEXBUFFERDESC)] == 0x12, "GetVertexBufferDesc cleared outside of the struct! (dwSize was double the size of the struct)\n"); + ok( mem.desc2.dwCaps == desc.dwCaps, "dwCaps returned differs. Got %x, expected %x\n", mem.desc2.dwCaps, desc.dwCaps); + ok( mem.desc2.dwFVF == desc.dwFVF, "dwFVF returned differs. Got %x, expected %x\n", mem.desc2.dwFVF, desc.dwFVF); + ok (mem.desc2.dwNumVertices == desc.dwNumVertices, "dwNumVertices returned differs. Got %x, expected %x\n", mem.desc2.dwNumVertices, desc.dwNumVertices); + + memset(mem.buffer, 0x12, sizeof(mem.buffer)); + mem.desc2.dwSize = 0; + rc = IDirect3DVertexBuffer7_GetVertexBufferDesc(lpVBufSrc, &mem.desc2); + if(rc != D3D_OK) + skip("GetVertexBuffer Failed!\n"); + ok( mem.desc2.dwSize == 0, "Size returned from GetVertexBufferDesc does not match the value put in\n" ); + ok( mem.buffer[sizeof(D3DVERTEXBUFFERDESC)] == 0x12, "GetVertexBufferDesc cleared outside of the struct! (dwSize was 0)\n"); + ok( mem.desc2.dwCaps == desc.dwCaps, "dwCaps returned differs. Got %x, expected %x\n", mem.desc2.dwCaps, desc.dwCaps); + ok( mem.desc2.dwFVF == desc.dwFVF, "dwFVF returned differs. Got %x, expected %x\n", mem.desc2.dwFVF, desc.dwFVF); + ok (mem.desc2.dwNumVertices == desc.dwNumVertices, "dwNumVertices returned differs. Got %x, expected %x\n", mem.desc2.dwNumVertices, desc.dwNumVertices); + + memset(mem.buffer, 0x12, sizeof(mem.buffer)); + mem.desc2.dwSize = sizeof(D3DVERTEXBUFFERDESC); + rc = IDirect3DVertexBuffer7_GetVertexBufferDesc(lpVBufSrc, &mem.desc2); + if(rc != D3D_OK) + skip("GetVertexBuffer Failed!\n"); + ok( mem.desc2.dwSize == sizeof(D3DVERTEXBUFFERDESC), "Size returned from GetVertexBufferDesc does not match the value put in\n" ); + ok( mem.buffer[sizeof(D3DVERTEXBUFFERDESC)] == 0x12, "GetVertexBufferDesc cleared outside of the struct! (dwSize was the size of the struct)\n"); + ok( mem.desc2.dwCaps == desc.dwCaps, "dwCaps returned differs. Got %x, expected %x\n", mem.desc2.dwCaps, desc.dwCaps); + ok( mem.desc2.dwFVF == desc.dwFVF, "dwFVF returned differs. Got %x, expected %x\n", mem.desc2.dwFVF, desc.dwFVF); + ok (mem.desc2.dwNumVertices == desc.dwNumVertices, "dwNumVertices returned differs. Got %x, expected %x\n", mem.desc2.dwNumVertices, desc.dwNumVertices); + +out: + IDirect3DVertexBuffer7_Release(lpVBufSrc); +} + + START_TEST(d3d) { init_function_pointers(); @@ -1524,6 +1609,7 @@ START_TEST(d3d) LimitTest(); D3D7EnumTest(); CapsTest(); + VertexBufferDescTest(); ReleaseDirect3D(); } diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c index cf3ae6f28b8..99c45fd1186 100644 --- a/dlls/ddraw/tests/dsurface.c +++ b/dlls/ddraw/tests/dsurface.c @@ -2371,7 +2371,9 @@ static void BltParamTest(void) static void PaletteTest(void) { HRESULT hr; - IDirectDrawPalette *palette; + LPDIRECTDRAWSURFACE lpSurf = NULL; + DDSURFACEDESC ddsd; + IDirectDrawPalette *palette = NULL; PALETTEENTRY Table[256]; PALETTEENTRY palEntries[256]; int i; @@ -2387,7 +2389,7 @@ static void PaletteTest(void) /* Create a 8bit palette without DDPCAPS_ALLOW256 set */ hr = IDirectDraw_CreatePalette(lpDD, DDPCAPS_8BIT, Table, &palette, NULL); ok(hr == DD_OK, "CreatePalette failed with %08x\n", hr); - + if (FAILED(hr)) goto err; /* Read back the palette and verify the entries. Without DDPCAPS_ALLOW256 set / entry 0 and 255 should have been overwritten with black and white */ IDirectDrawPalette_GetEntries(palette , 0, 0, 256, &palEntries[0]); @@ -2428,6 +2430,8 @@ static void PaletteTest(void) /* Create a 8bit palette with DDPCAPS_ALLOW256 set */ hr = IDirectDraw_CreatePalette(lpDD, DDPCAPS_ALLOW256 | DDPCAPS_8BIT, Table, &palette, NULL); ok(hr == DD_OK, "CreatePalette failed with %08x\n", hr); + if (FAILED(hr)) goto err; + IDirectDrawPalette_GetEntries(palette , 0, 0, 256, &palEntries[0]); ok(hr == DD_OK, "GetEntries failed with %08x\n", hr); if(hr == DD_OK) @@ -2438,7 +2442,39 @@ static void PaletteTest(void) "Palette entry %d should have contained (255,0,0) but was set to %d,%d,%d)\n", i, palEntries[i].peRed, palEntries[i].peGreen, palEntries[i].peBlue); } + + /* Try to set palette to a non-palettized surface */ + ddsd.dwSize = sizeof(ddsd); + ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); + ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT; + ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + ddsd.dwWidth = 800; + ddsd.dwHeight = 600; + ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; + U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 32; + U2(ddsd.ddpfPixelFormat).dwRBitMask = 0xFF0000; + U3(ddsd.ddpfPixelFormat).dwGBitMask = 0x00FF00; + U4(ddsd.ddpfPixelFormat).dwBBitMask = 0x0000FF; + hr = IDirectDraw_CreateSurface(lpDD, &ddsd, &lpSurf, NULL); + ok(hr==DD_OK, "CreateSurface returned: %x\n",hr); + if (FAILED(hr)) { + skip("failed to create surface\n"); + goto err; + } + + hr = IDirectDrawSurface_SetPalette(lpSurf, palette); + ok(hr == DDERR_INVALIDPIXELFORMAT, "CreateSurface returned: %x\n",hr); + IDirectDrawPalette_Release(palette); + palette = NULL; + + hr = IDirectDrawSurface_GetPalette(lpSurf, &palette); + ok(hr == DDERR_NOPALETTEATTACHED, "CreateSurface returned: %x\n",hr); + + err: + + if (lpSurf) IDirectDrawSurface_Release(lpSurf); + if (palette) IDirectDrawPalette_Release(palette); } static void StructSizeTest(void) diff --git a/dlls/ddraw/tests/visual.c b/dlls/ddraw/tests/visual.c index 3d8fecbc0b8..580bf88ec52 100644 --- a/dlls/ddraw/tests/visual.c +++ b/dlls/ddraw/tests/visual.c @@ -1720,6 +1720,201 @@ static void D3D1_TextureMapBlendTest(void) if (Texture) IDirect3DTexture_Release(Texture); } +static void p8_surface_fill_rect(IDirectDrawSurface *dest, UINT x, UINT y, UINT w, UINT h, BYTE colorindex) +{ + DDSURFACEDESC ddsd; + HRESULT hr; + UINT i, i1; + BYTE *p; + + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + + hr = IDirectDrawSurface_Lock(dest, NULL, &ddsd, DDLOCK_WRITEONLY | DDLOCK_WAIT, NULL); + ok(hr==DD_OK, "IDirectDrawSurface_Lock returned: %x\n", hr); + + p = (BYTE *)ddsd.lpSurface + ddsd.lPitch * y; + + for (i = 0; i < h; i++) { + for (i1 = 0; i1 < w; i1++) { + p[i1] = colorindex; + } + p += ddsd.lPitch; + } + + hr = IDirectDrawSurface_Unlock(dest, NULL); + ok(hr==DD_OK, "IDirectDrawSurface_UnLock returned: %x\n", hr); +} + +static COLORREF getPixelColor_GDI(IDirectDrawSurface *Surface, UINT x, UINT y) +{ + COLORREF clr = CLR_INVALID; + HDC hdc; + HRESULT hr; + + hr = IDirectDrawSurface_GetDC(Surface, &hdc); + ok(hr==DD_OK, "IDirectDrawSurface_GetDC returned: %x\n", hr); + + if (SUCCEEDED(hr)) { + clr = GetPixel(hdc, x, y); + + hr = IDirectDrawSurface_ReleaseDC(Surface, hdc); + ok(hr==DD_OK, "IDirectDrawSurface_ReleaseDC returned: %x\n", hr); + } + + return clr; +} + +static BOOL colortables_check_equality(PALETTEENTRY table1[256], RGBQUAD table2[256]) +{ + int i; + + for (i = 0; i < 256; i++) { + if (table1[i].peRed != table2[i].rgbRed || table1[i].peGreen != table2[i].rgbGreen || + table1[i].peBlue != table2[i].rgbBlue) return FALSE; + } + + return TRUE; +} + +static void p8_primary_test() +{ + /* Test 8bit mode used by games like StarCraft, C&C Red Alert I etc */ + DDSURFACEDESC ddsd; + HDC hdc; + HRESULT hr; + PALETTEENTRY entries[256]; + RGBQUAD coltable[256]; + UINT i; + IDirectDrawPalette *ddprimpal = NULL; + IDirectDrawSurface *offscreen = NULL; + WNDCLASS wc = {0}; + DDBLTFX ddbltfx; + COLORREF color; + + /* An IDirect3DDevice cannot be queryInterfaced from an IDirect3DDevice7 on windows */ + hr = DirectDrawCreate(NULL, &DirectDraw1, NULL); + + ok(hr==DD_OK || hr==DDERR_NODIRECTDRAWSUPPORT, "DirectDrawCreate returned: %x\n", hr); + if (FAILED(hr)) { + goto out; + } + + wc.lpfnWndProc = &DefWindowProc; + wc.lpszClassName = "p8_primary_test_wc"; + RegisterClass(&wc); + window = CreateWindow("p8_primary_test_wc", "p8_primary_test", WS_MAXIMIZE | WS_VISIBLE | WS_CAPTION , 0, 0, 640, 480, 0, 0, 0, 0); + + hr = IDirectDraw_SetCooperativeLevel(DirectDraw1, window, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); + ok(hr==DD_OK, "SetCooperativeLevel returned: %x\n", hr); + if(FAILED(hr)) { + goto out; + } + + hr = IDirectDraw_SetDisplayMode(DirectDraw1, 640, 480, 8); + ok(hr==DD_OK || hr == DDERR_UNSUPPORTED, "SetDisplayMode returned: %x\n", hr); + if (FAILED(hr)) { + goto out; + } + + memset(&ddsd, 0, sizeof(ddsd)); + ddsd.dwSize = sizeof(ddsd); + ddsd.dwFlags = DDSD_CAPS; + ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; + hr = IDirectDraw_CreateSurface(DirectDraw1, &ddsd, &Surface1, NULL); + ok(hr==DD_OK, "CreateSurface returned: %x\n", hr); + if (FAILED(hr)) { + goto out; + } + + memset(entries, 0, sizeof(entries)); + entries[0].peRed = 0xff; + entries[1].peGreen = 0xff; + entries[2].peBlue = 0xff; + + hr = IDirectDraw_CreatePalette(DirectDraw1, DDPCAPS_ALLOW256 | DDPCAPS_8BIT, entries, &ddprimpal, NULL); + ok(hr == DD_OK, "CreatePalette returned %08x\n", hr); + if (FAILED(hr)) { + skip("IDirectDraw_CreatePalette failed; skipping further tests\n"); + goto out; + } + + hr = IDirectDrawSurface_SetPalette(Surface1, ddprimpal); + ok(hr==DD_OK, "IDirectDrawSurface_SetPalette returned: %x\n", hr); + + p8_surface_fill_rect(Surface1, 0, 0, 640, 480, 2); + + color = getPixelColor_GDI(Surface1, 10, 10); + ok(GetRValue(color) == 0 && GetGValue(color) == 0 && GetBValue(color) == 0xFF, + "got R %02X G %02X B %02X, expected R 00 G 00 B FF\n", + GetRValue(color), GetGValue(color), GetBValue(color)); + + memset(&ddbltfx, 0, sizeof(ddbltfx)); + ddbltfx.dwSize = sizeof(ddbltfx); + U5(ddbltfx).dwFillColor = 0; + hr = IDirectDrawSurface_Blt(Surface1, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx); + ok(hr == DD_OK, "IDirectDrawSurface_Blt failed with %08x\n", hr); + + color = getPixelColor_GDI(Surface1, 10, 10); + ok(GetRValue(color) == 0xFF && GetGValue(color) == 0 && GetBValue(color) == 0, + "got R %02X G %02X B %02X, expected R FF G 00 B 00\n", + GetRValue(color), GetGValue(color), GetBValue(color)); + + memset (&ddsd, 0, sizeof (ddsd)); + ddsd.dwSize = sizeof (ddsd); + ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT; + ddsd.dwWidth = 16; + ddsd.dwHeight = 16; + ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; + ddsd.ddpfPixelFormat.dwSize = sizeof(ddsd.ddpfPixelFormat); + ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB | DDPF_PALETTEINDEXED8; + U1(ddsd.ddpfPixelFormat).dwRGBBitCount = 8; + hr = IDirectDraw_CreateSurface(DirectDraw1, &ddsd, &offscreen, NULL); + ok(hr == DD_OK, "IDirectDraw_CreateSurface returned %08x\n", hr); + if (FAILED(hr)) goto out; + + memset(entries, 0, sizeof(entries)); + for (i = 0; i < 256; i++) { + entries[i].peBlue = i; + } + hr = IDirectDrawPalette_SetEntries(ddprimpal, 0, 0, 256, entries); + ok(hr == DD_OK, "IDirectDrawPalette_SetEntries failed with %08x\n", hr); + + hr = IDirectDrawSurface_GetDC(offscreen, &hdc); + ok(hr==DD_OK, "IDirectDrawSurface_GetDC returned: %x\n", hr); + i = GetDIBColorTable(hdc, 0, 256, coltable); + ok(i == 256, "GetDIBColorTable returned %u, last error: %x\n", i, GetLastError()); + hr = IDirectDrawSurface_ReleaseDC(offscreen, hdc); + ok(hr==DD_OK, "IDirectDrawSurface_ReleaseDC returned: %x\n", hr); + + ok(colortables_check_equality(entries, coltable), "unexpected colortable on offscreen surface\n"); + + p8_surface_fill_rect(offscreen, 0, 0, 16, 16, 1); + + memset(entries, 0, sizeof(entries)); + entries[0].peRed = 0xff; + entries[1].peGreen = 0xff; + entries[2].peBlue = 0xff; + hr = IDirectDrawPalette_SetEntries(ddprimpal, 0, 0, 256, entries); + ok(hr == DD_OK, "IDirectDrawPalette_SetEntries failed with %08x\n", hr); + + hr = IDirectDrawSurface_BltFast(Surface1, 0, 0, offscreen, NULL, 0); + ok(hr==DD_OK, "IDirectDrawSurface_BltFast returned: %x\n", hr); + + color = getPixelColor_GDI(Surface1, 1, 1); + ok(GetRValue(color) == 0 && GetGValue(color) == 0xFF && GetBValue(color) == 0, + "got R %02X G %02X B %02X, expected R 00 G FF B 00\n", + GetRValue(color), GetGValue(color), GetBValue(color)); + + out: + + if(ddprimpal) IDirectDrawPalette_Release(ddprimpal); + if(offscreen) IDirectDrawSurface_Release(offscreen); + if(Surface1) IDirectDrawSurface_Release(Surface1); + if(DirectDraw1) IDirectDraw_Release(DirectDraw1); + if(window) DestroyWindow(window); +} + START_TEST(visual) { HRESULT hr; @@ -1776,6 +1971,9 @@ START_TEST(visual) D3D1_TextureMapBlendTest(); } D3D1_releaseObjects(); + + p8_primary_test(); + return ; cleanup: diff --git a/dlls/ddraw/utils.c b/dlls/ddraw/utils.c index eada7a54f07..2c08328595f 100644 --- a/dlls/ddraw/utils.c +++ b/dlls/ddraw/utils.c @@ -192,7 +192,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u2.dwStencilBitDepth = 0; DDPixelFormat->u3.dwZBitMask = 0x0000FFFF; DDPixelFormat->u4.dwStencilBitMask = 0x0; - DDPixelFormat->u5.dwRGBZBitMask = 0x0000FFFF; + DDPixelFormat->u5.dwRGBZBitMask = 0x00000000; break; case WINED3DFMT_D32: @@ -202,17 +202,17 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->u2.dwStencilBitDepth = 0; DDPixelFormat->u3.dwZBitMask = 0xFFFFFFFF; DDPixelFormat->u4.dwStencilBitMask = 0x0; - DDPixelFormat->u5.dwRGBZBitMask = 0xFFFFFFFF; + DDPixelFormat->u5.dwRGBZBitMask = 0x00000000; break; case WINED3DFMT_D24X4S4: DDPixelFormat->dwFlags = DDPF_ZBUFFER | DDPF_STENCILBUFFER; DDPixelFormat->dwFourCC = 0; /* Should I set dwZBufferBitDepth to 32 here? */ - DDPixelFormat->u1.dwZBufferBitDepth = 24; + DDPixelFormat->u1.dwZBufferBitDepth = 32; DDPixelFormat->u2.dwStencilBitDepth = 4; - DDPixelFormat->u3.dwZBitMask = 0x0; - DDPixelFormat->u4.dwStencilBitMask = 0x0; + DDPixelFormat->u3.dwZBitMask = 0x00FFFFFF; + DDPixelFormat->u4.dwStencilBitMask = 0x0F000000; DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0; break; @@ -220,31 +220,30 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat, DDPixelFormat->dwFlags = DDPF_ZBUFFER | DDPF_STENCILBUFFER; DDPixelFormat->dwFourCC = 0; /* Should I set dwZBufferBitDepth to 32 here? */ - DDPixelFormat->u1.dwZBufferBitDepth = 24; + DDPixelFormat->u1.dwZBufferBitDepth = 32; DDPixelFormat->u2.dwStencilBitDepth = 8; - DDPixelFormat->u3.dwZBitMask = 0x0; - DDPixelFormat->u4.dwStencilBitMask = 0x0; + DDPixelFormat->u3.dwZBitMask = 0x00FFFFFFFF; + DDPixelFormat->u4.dwStencilBitMask = 0xFF000000; DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0; break; case WINED3DFMT_D24X8: DDPixelFormat->dwFlags = DDPF_ZBUFFER; DDPixelFormat->dwFourCC = 0; - DDPixelFormat->u1.dwZBufferBitDepth = 24; - DDPixelFormat->u2.dwStencilBitDepth = 8; - DDPixelFormat->u3.dwZBitMask = 0x0; - DDPixelFormat->u4.dwStencilBitMask = 0x0; + DDPixelFormat->u1.dwZBufferBitDepth = 32; + DDPixelFormat->u2.dwStencilBitDepth = 0; + DDPixelFormat->u3.dwZBitMask = 0x00FFFFFFFF; + DDPixelFormat->u4.dwStencilBitMask = 0x00000000; DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0; break; case WINED3DFMT_D15S1: DDPixelFormat->dwFlags = DDPF_ZBUFFER | DDPF_STENCILBUFFER; DDPixelFormat->dwFourCC = 0; - /* Should I set dwZBufferBitDepth to 16 here? */ - DDPixelFormat->u1.dwZBufferBitDepth = 15; + DDPixelFormat->u1.dwZBufferBitDepth = 16; DDPixelFormat->u2.dwStencilBitDepth = 1; - DDPixelFormat->u3.dwZBitMask = 0x0; - DDPixelFormat->u4.dwStencilBitMask = 0x0; + DDPixelFormat->u3.dwZBitMask = 0x7fff; + DDPixelFormat->u4.dwStencilBitMask = 0x8000; DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0; break; @@ -495,19 +494,20 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) switch(DDPixelFormat->u1.dwZBufferBitDepth) { case 8: - ERR("8 Bits Z+Stencil buffer pixelformat is not supported. Returning WINED3DFMT_UNKNOWN\n"); + FIXME("8 Bits Z+Stencil buffer pixelformat is not supported. Returning WINED3DFMT_UNKNOWN\n"); return WINED3DFMT_UNKNOWN; case 15: + FIXME("15 bit depth buffer not handled yet, assuming 16 bit\n"); case 16: if(DDPixelFormat->u2.dwStencilBitDepth == 1) return WINED3DFMT_D15S1; - ERR("Don't know how to handle a 16 bit Z buffer with %d bit stencil buffer pixelformat\n", DDPixelFormat->u2.dwStencilBitDepth); + FIXME("Don't know how to handle a 16 bit Z buffer with %d bit stencil buffer pixelformat\n", DDPixelFormat->u2.dwStencilBitDepth); return WINED3DFMT_UNKNOWN; case 24: - ERR("Don't know how to handle a 24 bit depth buffer with stencil bits\n"); + FIXME("Don't know how to handle a 24 bit depth buffer with stencil bits\n"); return WINED3DFMT_D24S8; case 32: @@ -533,10 +533,15 @@ PixelFormat_DD2WineD3D(const DDPIXELFORMAT *DDPixelFormat) return WINED3DFMT_D16; case 24: - return WINED3DFMT_D24X8; - + FIXME("24 Bit depth buffer, treating like a 32 bit one\n"); case 32: - return WINED3DFMT_D32; + if(DDPixelFormat->u3.dwZBitMask == 0x00FFFFFF) { + return WINED3DFMT_D24X8; + } else if(DDPixelFormat->u3.dwZBitMask == 0xFFFFFFFF) { + return WINED3DFMT_D32; + } + FIXME("Unhandled 32 bit depth buffer bitmasks, returning WINED3DFMT_D24X8\n"); + return WINED3DFMT_D24X8; /* That's most likely to make games happy */ default: ERR("Unsupported Z buffer depth %d\n", DDPixelFormat->u1.dwZBufferBitDepth); @@ -640,7 +645,7 @@ static void DDRAW_dump_flags_nolf(DWORD flags, const flag_info* names, for (i=0; i < num_names; i++) if ((flags & names[i].val) || /* standard flag value */ ((!flags) && (!names[i].val))) /* zero value only */ - TRACE("%s\n", names[i].name); + TRACE("%s ", names[i].name); } static void DDRAW_dump_flags(DWORD flags, const flag_info* names, size_t num_names) diff --git a/dlls/ddraw/vertexbuffer.c b/dlls/ddraw/vertexbuffer.c index 209411b22de..2469644c2b1 100644 --- a/dlls/ddraw/vertexbuffer.c +++ b/dlls/ddraw/vertexbuffer.c @@ -454,7 +454,6 @@ IDirect3DVertexBufferImpl_GetVertexBufferDesc(IDirect3DVertexBuffer7 *iface, ICOM_THIS_FROM(IDirect3DVertexBufferImpl, IDirect3DVertexBuffer7, iface); WINED3DVERTEXBUFFER_DESC WDesc; HRESULT hr; - DWORD size; TRACE("(%p)->(%p)\n", This, Desc); if(!Desc) return DDERR_INVALIDPARAMS; @@ -469,12 +468,7 @@ IDirect3DVertexBufferImpl_GetVertexBufferDesc(IDirect3DVertexBuffer7 *iface, return hr; } - /* Clear the return value of garbage */ - size = Desc->dwSize; - memset(Desc, 0, size); - /* Now fill the Desc structure */ - Desc->dwSize = size; Desc->dwCaps = This->Caps; Desc->dwFVF = WDesc.FVF; Desc->dwNumVertices = WDesc.Size / get_flexible_vertex_size(WDesc.FVF); diff --git a/dlls/devenum/devenum.rc b/dlls/devenum/devenum.rc index af2fed0be41..916d63ef512 100644 --- a/dlls/devenum/devenum.rc +++ b/dlls/devenum/devenum.rc @@ -133,3 +133,12 @@ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL 9 "Dispozitiv WaveOut implicit" 10 "Dispozitiv MidiOut implicit" } + +STRINGTABLE DISCARDABLE +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +{ + 7 "Стандартный DirectSound" + 8 "DirectSound: %s" + 9 "Звуковое устройство вывода по умолчанию" + 10 "Устройство вывода MIDI по умолчанию" +} diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c index 82e50c3593d..87837ff0433 100644 --- a/dlls/dinput/keyboard.c +++ b/dlls/dinput/keyboard.c @@ -288,7 +288,7 @@ static HRESULT WINAPI SysKeyboardAImpl_GetDeviceState( } /****************************************************************************** - * GetCapabilities : get the device capablitites + * GetCapabilities : get the device capabilities */ static HRESULT WINAPI SysKeyboardAImpl_GetCapabilities( LPDIRECTINPUTDEVICE8A iface, diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c index 3c3b3c3d8b5..1dc6a0331ff 100644 --- a/dlls/dinput/mouse.c +++ b/dlls/dinput/mouse.c @@ -590,7 +590,7 @@ static HRESULT WINAPI SysMouseAImpl_GetProperty(LPDIRECTINPUTDEVICE8A iface, } /****************************************************************************** - * GetCapabilities : get the device capablitites + * GetCapabilities : get the device capabilities */ static HRESULT WINAPI SysMouseAImpl_GetCapabilities( LPDIRECTINPUTDEVICE8A iface, diff --git a/dlls/dmime/performance.c b/dlls/dmime/performance.c index 9c518efde54..973010422db 100644 --- a/dlls/dmime/performance.c +++ b/dlls/dmime/performance.c @@ -239,7 +239,7 @@ static HRESULT WINAPI IDirectMusicPerformance8Impl_Init (LPDIRECTMUSICPERFORMANC This->pDirectMusic = (IDirectMusic8*) *ppDirectMusic; IDirectMusic8_AddRef(This->pDirectMusic); } else { - /* app allows the performance to initialise itfself and needs a pointer to object*/ + /* app allows the performance to initialise itself and needs a pointer to object*/ CoCreateInstance (&CLSID_DirectMusic, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectMusic8, (void**)&This->pDirectMusic); if (ppDirectMusic) { *ppDirectMusic = (LPDIRECTMUSIC) This->pDirectMusic; @@ -758,7 +758,7 @@ static HRESULT WINAPI IDirectMusicPerformance8Impl_InitAudio (LPDIRECTMUSICPERFO IDirectMusicPerformance8Impl_Init(iface, ppDirectMusic, dsound, hWnd); - /* Init increases the ref count of the dsound object. Decremente it if the app don't want a pointer to the object. */ + /* Init increases the ref count of the dsound object. Decrement it if the app doesn't want a pointer to the object. */ if (NULL == ppDirectSound) { IDirectSound_Release(This->pDirectSound); } @@ -872,7 +872,7 @@ static HRESULT WINAPI IDirectMusicPerformance8Impl_CreateStandardAudioPath (LPDI desc.dwFlags |= DSBCAPS_CTRLFREQUENCY; break; case DMUS_APATH_SHARED_STEREOPLUSREVERB: - /* normally we havet to create 2 buffers (one for music other for reverb) + /* normally we have to create 2 buffers (one for music other for reverb) * in this case. See msdn */ case DMUS_APATH_DYNAMIC_STEREO: diff --git a/dlls/dmime/segment.c b/dlls/dmime/segment.c index 1daee42d3c7..a90bd4c8c5b 100644 --- a/dlls/dmime/segment.c +++ b/dlls/dmime/segment.c @@ -175,7 +175,7 @@ static HRESULT WINAPI IDirectMusicSegment8Impl_IDirectMusicSegment8_GetTrack (LP if (FALSE == IsEqualGUID(&GUID_NULL, rguidType)) { /** * it rguidType is not null we must check if CLSID are equals - * and the unqiue way to get it its using IPersistStream Interface + * and the unique way to get it is using IPersistStream Interface */ hr = IDirectMusicTrack_QueryInterface(pIt->pTrack, &IID_IPersistStream, (void**) &pCLSIDStream); if (FAILED(hr)) { diff --git a/dlls/fusion/Makefile.in b/dlls/fusion/Makefile.in index f7c47f8cc5c..21792c8aa65 100644 --- a/dlls/fusion/Makefile.in +++ b/dlls/fusion/Makefile.in @@ -6,6 +6,7 @@ MODULE = fusion.dll IMPORTS = kernel32 C_SRCS = \ + asmcache.c \ asmname.c \ fusion.c \ fusion_main.c diff --git a/dlls/fusion/asmcache.c b/dlls/fusion/asmcache.c new file mode 100644 index 00000000000..68a8240684b --- /dev/null +++ b/dlls/fusion/asmcache.c @@ -0,0 +1,346 @@ +/* + * IAssemblyCache implementation + * + * Copyright 2008 James Hawkins + * + * 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 + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" +#include "fusion.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(fusion); + +/* IAssemblyCache */ + +typedef struct { + const IAssemblyCacheVtbl *lpIAssemblyCacheVtbl; + + LONG ref; +} IAssemblyCacheImpl; + +static HRESULT WINAPI IAssemblyCacheImpl_QueryInterface(IAssemblyCache *iface, + REFIID riid, LPVOID *ppobj) +{ + IAssemblyCacheImpl *This = (IAssemblyCacheImpl *)iface; + + TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppobj); + + *ppobj = NULL; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAssemblyCache)) + { + IUnknown_AddRef(iface); + *ppobj = This; + return S_OK; + } + + WARN("(%p, %s, %p): not found\n", This, debugstr_guid(riid), ppobj); + return E_NOINTERFACE; +} + +static ULONG WINAPI IAssemblyCacheImpl_AddRef(IAssemblyCache *iface) +{ + IAssemblyCacheImpl *This = (IAssemblyCacheImpl *)iface; + ULONG refCount = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(ref before = %u)\n", This, refCount - 1); + + return refCount; +} + +static ULONG WINAPI IAssemblyCacheImpl_Release(IAssemblyCache *iface) +{ + IAssemblyCacheImpl *This = (IAssemblyCacheImpl *)iface; + ULONG refCount = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(ref before = %u)\n", This, refCount + 1); + + if (!refCount) + HeapFree(GetProcessHeap(), 0, This); + + return refCount; +} + +static HRESULT WINAPI IAssemblyCacheImpl_UninstallAssembly(IAssemblyCache *iface, + DWORD dwFlags, + LPCWSTR pszAssemblyName, + LPCFUSION_INSTALL_REFERENCE pRefData, + ULONG *pulDisposition) +{ + FIXME("(%p, %d, %s, %p, %p) stub!\n", iface, dwFlags, + debugstr_w(pszAssemblyName), pRefData, pulDisposition); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IAssemblyCacheImpl_QueryAssemblyInfo(IAssemblyCache *iface, + DWORD dwFlags, + LPCWSTR pszAssemblyName, + ASSEMBLY_INFO *pAsmInfo) +{ + FIXME("(%p, %d, %s, %p) stub!\n", iface, dwFlags, + debugstr_w(pszAssemblyName), pAsmInfo); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IAssemblyCacheImpl_CreateAssemblyCacheItem(IAssemblyCache *iface, + DWORD dwFlags, + PVOID pvReserved, + IAssemblyCacheItem **ppAsmItem, + LPCWSTR pszAssemblyName) +{ + FIXME("(%p, %d, %p, %p, %s) stub!\n", iface, dwFlags, pvReserved, + ppAsmItem, debugstr_w(pszAssemblyName)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IAssemblyCacheImpl_CreateAssemblyScavenger(IAssemblyCache *iface, + IUnknown **ppUnkReserved) +{ + FIXME("(%p, %p) stub!\n", iface, ppUnkReserved); + return E_NOTIMPL; +} + +static HRESULT WINAPI IAssemblyCacheImpl_InstallAssembly(IAssemblyCache *iface, + DWORD dwFlags, + LPCWSTR pszManifestFilePath, + LPCFUSION_INSTALL_REFERENCE pRefData) +{ + FIXME("(%p, %d, %s, %p) stub!\n", iface, dwFlags, + debugstr_w(pszManifestFilePath), pRefData); + + return E_NOTIMPL; +} + +static const IAssemblyCacheVtbl AssemblyCacheVtbl = { + IAssemblyCacheImpl_QueryInterface, + IAssemblyCacheImpl_AddRef, + IAssemblyCacheImpl_Release, + IAssemblyCacheImpl_UninstallAssembly, + IAssemblyCacheImpl_QueryAssemblyInfo, + IAssemblyCacheImpl_CreateAssemblyCacheItem, + IAssemblyCacheImpl_CreateAssemblyScavenger, + IAssemblyCacheImpl_InstallAssembly +}; + +/****************************************************************** + * CreateAssemblyCache (FUSION.@) + */ +HRESULT WINAPI CreateAssemblyCache(IAssemblyCache **ppAsmCache, DWORD dwReserved) +{ + IAssemblyCacheImpl *cache; + + TRACE("(%p, %d)\n", ppAsmCache, dwReserved); + + if (!ppAsmCache) + return E_INVALIDARG; + + *ppAsmCache = NULL; + + cache = HeapAlloc(GetProcessHeap(), 0, sizeof(IAssemblyCacheImpl)); + if (!cache) + return E_OUTOFMEMORY; + + cache->lpIAssemblyCacheVtbl = &AssemblyCacheVtbl; + cache->ref = 1; + + *ppAsmCache = (IAssemblyCache *)cache; + + return S_OK; +} + +/* IAssemblyCacheItem */ + +typedef struct { + const IAssemblyCacheItemVtbl *lpIAssemblyCacheItemVtbl; + + LONG ref; +} IAssemblyCacheItemImpl; + +static HRESULT WINAPI IAssemblyCacheItemImpl_QueryInterface(IAssemblyCacheItem *iface, + REFIID riid, LPVOID *ppobj) +{ + IAssemblyCacheItemImpl *This = (IAssemblyCacheItemImpl *)iface; + + TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppobj); + + *ppobj = NULL; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAssemblyCacheItem)) + { + IUnknown_AddRef(iface); + *ppobj = This; + return S_OK; + } + + WARN("(%p, %s, %p): not found\n", This, debugstr_guid(riid), ppobj); + return E_NOINTERFACE; +} + +static ULONG WINAPI IAssemblyCacheItemImpl_AddRef(IAssemblyCacheItem *iface) +{ + IAssemblyCacheItemImpl *This = (IAssemblyCacheItemImpl *)iface; + ULONG refCount = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(ref before = %u)\n", This, refCount - 1); + + return refCount; +} + +static ULONG WINAPI IAssemblyCacheItemImpl_Release(IAssemblyCacheItem *iface) +{ + IAssemblyCacheItemImpl *This = (IAssemblyCacheItemImpl *)iface; + ULONG refCount = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(ref before = %u)\n", This, refCount + 1); + + if (!refCount) + HeapFree(GetProcessHeap(), 0, This); + + return refCount; +} + +static HRESULT WINAPI IAssemblyCacheItemImpl_CreateStream(IAssemblyCacheItem *iface, + DWORD dwFlags, + LPCWSTR pszStreamName, + DWORD dwFormat, + DWORD dwFormatFlags, + IStream **ppIStream, + ULARGE_INTEGER *puliMaxSize) +{ + FIXME("(%p, %d, %s, %d, %d, %p, %p) stub!\n", iface, dwFlags, + debugstr_w(pszStreamName), dwFormat, dwFormatFlags, ppIStream, puliMaxSize); + + return E_NOTIMPL; +} + +static HRESULT WINAPI IAssemblyCacheItemImpl_Commit(IAssemblyCacheItem *iface, + DWORD dwFlags, + ULONG *pulDisposition) +{ + FIXME("(%p, %d, %p) stub!\n", iface, dwFlags, pulDisposition); + return E_NOTIMPL; +} + +static HRESULT WINAPI IAssemblyCacheItemImpl_AbortItem(IAssemblyCacheItem *iface) +{ + FIXME("(%p) stub!\n", iface); + return E_NOTIMPL; +} + +static const IAssemblyCacheItemVtbl AssemblyCacheItemVtbl = { + IAssemblyCacheItemImpl_QueryInterface, + IAssemblyCacheItemImpl_AddRef, + IAssemblyCacheItemImpl_Release, + IAssemblyCacheItemImpl_CreateStream, + IAssemblyCacheItemImpl_Commit, + IAssemblyCacheItemImpl_AbortItem +}; + +/* IAssemblyEnum */ + +typedef struct { + const IAssemblyEnumVtbl *lpIAssemblyEnumVtbl; + + LONG ref; +} IAssemblyEnumImpl; + +static HRESULT WINAPI IAssemblyEnumImpl_QueryInterface(IAssemblyEnum *iface, + REFIID riid, LPVOID *ppobj) +{ + IAssemblyEnumImpl *This = (IAssemblyEnumImpl *)iface; + + TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppobj); + + *ppobj = NULL; + + if (IsEqualIID(riid, &IID_IUnknown) || + IsEqualIID(riid, &IID_IAssemblyEnum)) + { + IUnknown_AddRef(iface); + *ppobj = This; + return S_OK; + } + + WARN("(%p, %s, %p): not found\n", This, debugstr_guid(riid), ppobj); + return E_NOINTERFACE; +} + +static ULONG WINAPI IAssemblyEnumImpl_AddRef(IAssemblyEnum *iface) +{ + IAssemblyEnumImpl *This = (IAssemblyEnumImpl *)iface; + ULONG refCount = InterlockedIncrement(&This->ref); + + TRACE("(%p)->(ref before = %u)\n", This, refCount - 1); + + return refCount; +} + +static ULONG WINAPI IAssemblyEnumImpl_Release(IAssemblyEnum *iface) +{ + IAssemblyEnumImpl *This = (IAssemblyEnumImpl *)iface; + ULONG refCount = InterlockedDecrement(&This->ref); + + TRACE("(%p)->(ref before = %u)\n", This, refCount + 1); + + if (!refCount) + HeapFree(GetProcessHeap(), 0, This); + + return refCount; +} + +static HRESULT WINAPI IAssemblyEnumImpl_GetNextAssembly(IAssemblyEnum *iface, + LPVOID pvReserved, + IAssemblyName **ppName, + DWORD dwFlags) +{ + FIXME("(%p, %p, %p, %d) stub!\n", iface, pvReserved, ppName, dwFlags); + return E_NOTIMPL; +} + +static HRESULT WINAPI IAssemblyEnumImpl_Reset(IAssemblyEnum *iface) +{ + FIXME("(%p) stub!\n", iface); + return E_NOTIMPL; +} + +static HRESULT WINAPI IAssemblyEnumImpl_Clone(IAssemblyEnum *iface, + IAssemblyEnum **ppEnum) +{ + FIXME("(%p, %p) stub!\n", iface, ppEnum); + return E_NOTIMPL; +} + +static const IAssemblyEnumVtbl AssemblyEnumVtbl = { + IAssemblyEnumImpl_QueryInterface, + IAssemblyEnumImpl_AddRef, + IAssemblyEnumImpl_Release, + IAssemblyEnumImpl_GetNextAssembly, + IAssemblyEnumImpl_Reset, + IAssemblyEnumImpl_Clone +}; diff --git a/dlls/fusion/fusion.c b/dlls/fusion/fusion.c index 43f0d152b3d..999cb9200b0 100644 --- a/dlls/fusion/fusion.c +++ b/dlls/fusion/fusion.c @@ -54,15 +54,6 @@ HRESULT WINAPI CompareAssemblyIdentity(LPCWSTR pwzAssemblyIdentity1, BOOL fUnifi } /****************************************************************** - * CreateAssemblyCache (FUSION.@) - */ -HRESULT WINAPI CreateAssemblyCache(IAssemblyCache **ppAsmCache, DWORD dwReserved) -{ - FIXME("(%p, %d) stub!\n", ppAsmCache, dwReserved); - return E_NOTIMPL; -} - -/****************************************************************** * CreateAssemblyEnum (FUSION.@) */ HRESULT WINAPI CreateAssemblyEnum(IAssemblyEnum **pEnum, IUnknown *pUnkReserved, diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index 3c3f4cebc73..ffd6a1b0659 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -1500,7 +1500,7 @@ WORD WINAPI SetHookFlags( HDC hdc, WORD flags ) */ INT WINAPI SetICMMode(HDC hdc, INT iEnableICM) { -/*FIXME Asuming that ICM is always off, and cannot be turned on */ +/*FIXME: Assume that ICM is always off, and cannot be turned on */ if (iEnableICM == ICM_OFF) return ICM_OFF; if (iEnableICM == ICM_ON) return 0; if (iEnableICM == ICM_QUERY) return ICM_OFF; diff --git a/dlls/gdi32/dib.c b/dlls/gdi32/dib.c index 3205d0d0498..2b5ae374d44 100644 --- a/dlls/gdi32/dib.c +++ b/dlls/gdi32/dib.c @@ -188,18 +188,19 @@ INT WINAPI StretchDIBits(HDC hdc, INT xDst, INT yDst, INT widthDst, const BITMAPINFO *info, UINT wUsage, DWORD dwRop ) { DC *dc; + INT ret; if (!bits || !info) return 0; - if (!(dc = get_dc_ptr( hdc ))) return FALSE; + if (!(dc = get_dc_ptr( hdc ))) return 0; if(dc->funcs->pStretchDIBits) { update_dc( dc ); - heightSrc = dc->funcs->pStretchDIBits(dc->physDev, xDst, yDst, widthDst, - heightDst, xSrc, ySrc, widthSrc, - heightSrc, bits, info, wUsage, dwRop); + ret = dc->funcs->pStretchDIBits(dc->physDev, xDst, yDst, widthDst, + heightDst, xSrc, ySrc, widthSrc, + heightSrc, bits, info, wUsage, dwRop); release_dc_ptr( dc ); } else /* use StretchBlt */ @@ -248,7 +249,7 @@ INT WINAPI StretchDIBits(HDC hdc, INT xDst, INT yDst, INT widthDst, { /* fast path */ TRACE("using fast path\n"); - heightSrc = SetDIBits( hdc, hBitmap, 0, height, bits, info, wUsage); + ret = SetDIBits( hdc, hBitmap, 0, height, bits, info, wUsage); } else { @@ -290,13 +291,13 @@ INT WINAPI StretchDIBits(HDC hdc, INT xDst, INT yDst, INT widthDst, dwRop ); } - heightSrc = SetDIBits(hdcMem, hBitmap, 0, height, bits, info, wUsage); + ret = SetDIBits(hdcMem, hBitmap, 0, height, bits, info, wUsage); /* Origin for DIBitmap may be bottom left (positive biHeight) or top left (negative biHeight) */ - if (heightSrc) StretchBlt( hdc, xDst, yDst, widthDst, heightDst, - hdcMem, xSrc, abs(height) - heightSrc - ySrc, - widthSrc, heightSrc, dwRop ); + if (ret) StretchBlt( hdc, xDst, yDst, widthDst, heightDst, + hdcMem, xSrc, abs(height) - heightSrc - ySrc, + widthSrc, heightSrc, dwRop ); if(hpal) SelectPalette(hdcMem, hpal, FALSE); SelectObject( hdcMem, hOldBitmap ); @@ -304,7 +305,7 @@ INT WINAPI StretchDIBits(HDC hdc, INT xDst, INT yDst, INT widthDst, DeleteObject( hBitmap ); } } - return heightSrc; + return ret; } diff --git a/dlls/gdi32/enhmfdrv/bitblt.c b/dlls/gdi32/enhmfdrv/bitblt.c index c118da5703c..0be09489fb5 100644 --- a/dlls/gdi32/enhmfdrv/bitblt.c +++ b/dlls/gdi32/enhmfdrv/bitblt.c @@ -158,7 +158,7 @@ static BOOL EMFDRV_BitBlockTransfer( device colors are important. */ lpBmiH->biClrImportant = 0; - /* Initiliaze bitmap bits */ + /* Initialize bitmap bits */ if (GetDIBits(physDevSrc->hdc, hBitmap, 0, (UINT)lpBmiH->biHeight, (BYTE*)pEMR + pEMR->offBitsSrc, (LPBITMAPINFO)lpBmiH, DIB_RGB_COLORS)) diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c index de82e70cd36..952e72039cc 100644 --- a/dlls/gdi32/font.c +++ b/dlls/gdi32/font.c @@ -2751,7 +2751,7 @@ GetCharacterPlacementA(HDC hdc, LPCSTR lpString, INT uCount, * BUGS * * All flags except GCP_REORDER are not yet implemented. - * Reordering is not 100% complient to the Windows BiDi method. + * Reordering is not 100% compliant to the Windows BiDi method. * Caret positioning is not yet implemented for BiDi. * Classes are not yet implemented. * diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c index 820da77013b..04db3ae8118 100644 --- a/dlls/gdi32/freetype.c +++ b/dlls/gdi32/freetype.c @@ -224,7 +224,7 @@ MAKE_FUNCPTR(FcPatternGetString); #define GET_BE_WORD(x) RtlUshortByteSwap(x) #endif -/* This is bascially a copy of FT_Bitmap_Size with an extra element added */ +/* This is basically a copy of FT_Bitmap_Size with an extra element added */ typedef struct { FT_Short height; FT_Short width; @@ -483,7 +483,7 @@ static BOOL get_glyph_index_linked(GdiFont *font, UINT c, GdiFont **linked_font, * FONTS.FON System * OEMFONT.FON Terminal * LogPixels Current dpi set by the display control panel applet - * (HKLM\\Software\\Microsft\\Windows NT\\CurrentVersion\\FontDPI + * (HKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\FontDPI * also has a LogPixels value that appears to mirror this) * * On my system these values have data: vgafix.fon, vgasys.fon, vga850.fon and 96 respectively @@ -2216,7 +2216,7 @@ static void update_font_info(void) (WCHAR *)&oem_cp, sizeof(oem_cp)/sizeof(WCHAR)); sprintf( cpbuf, "%u,%u", ansi_cp, oem_cp ); - /* Setup DefaultFallback usage */ + /* Setup Default_Fallback usage */ if (ansi_cp == 932) use_default_fallback = TRUE; @@ -3188,7 +3188,7 @@ GdiFont *WineEngCreateFontInstance(DC *dc, HFONT hfont) /* * Check for a leading '@' this signals that the font is being - * requested in tategaki mode (vertical writing subtitution) but + * requested in tategaki mode (vertical writing substitution) but * does not affect the fontface that is to be selected. */ if (lf.lfFaceName[0]=='@') @@ -5264,7 +5264,7 @@ DWORD WineEngGetFontData(GdiFont *font, DWORD table, DWORD offset, LPVOID buf, else len = cbData; - if(table) { /* MS tags differ in endidness from FT ones */ + if(table) { /* MS tags differ in endianness from FT ones */ table = table >> 24 | table << 24 | (table >> 8 & 0xff00) | (table << 8 & 0xff0000); } diff --git a/dlls/gdi32/metafile.c b/dlls/gdi32/metafile.c index 57add724be7..57ace68cc21 100644 --- a/dlls/gdi32/metafile.c +++ b/dlls/gdi32/metafile.c @@ -31,7 +31,7 @@ * * Memory-based metafiles are just stored as a continuous block of memory with * a METAHEADER at the head with METARECORDs appended to it. mtType is - * METAFILE_MEMORY (1). Note this is indentical to the disk image of a + * METAFILE_MEMORY (1). Note this is identical to the disk image of a * disk-based metafile - even mtType is METAFILE_MEMORY. * 16bit HMETAFILE16s are global handles to this block * 32bit HMETAFILEs are GDI handles METAFILEOBJs, which contains a ptr to @@ -1270,7 +1270,7 @@ static BOOL MF_Play_MetaExtTextOut(HDC hdc, METARECORD *mr) } if (mr->rdSize == len / 2) - dxx = NULL; /* determine if array present */ + dxx = NULL; /* determine if array is present */ else if (mr->rdSize == (len + s1 * sizeof(INT16)) / 2) { @@ -1282,7 +1282,7 @@ static BOOL MF_Play_MetaExtTextOut(HDC hdc, METARECORD *mr) TRACE("%s len: %d\n", sot, mr->rdSize); WARN("Please report: ExtTextOut len=%d slen=%d rdSize=%d opt=%04x\n", len, s1, mr->rdSize, mr->rdParm[3]); - dxx = NULL; /* should't happen -- but if, we continue with NULL */ + dxx = NULL; /* shouldn't happen -- but if, we continue with NULL */ } ExtTextOutA( hdc, (SHORT)mr->rdParm[1], /* X position */ diff --git a/dlls/gdi32/mfdrv/bitblt.c b/dlls/gdi32/mfdrv/bitblt.c index 578366d9fe4..c1b443eb110 100644 --- a/dlls/gdi32/mfdrv/bitblt.c +++ b/dlls/gdi32/mfdrv/bitblt.c @@ -49,7 +49,7 @@ BOOL MFDRV_BitBlt( PHYSDEV devDst, INT xDst, INT yDst, INT width, INT height, /*********************************************************************** * MFDRV_StretchBlt - * this function contains TWO ways for procesing StretchBlt in metafiles, + * this function contains TWO ways for processing StretchBlt in metafiles, * decide between rdFunction values META_STRETCHBLT or META_DIBSTRETCHBLT * via #define STRETCH_VIA_DIB */ diff --git a/dlls/gdi32/pen.c b/dlls/gdi32/pen.c index a047c658817..6fe39afb7e4 100644 --- a/dlls/gdi32/pen.c +++ b/dlls/gdi32/pen.c @@ -182,7 +182,7 @@ HPEN WINAPI ExtCreatePen( DWORD style, DWORD width, } else { - /* PS_INSIDEFRAME is applicable only for gemetric pens */ + /* PS_INSIDEFRAME is applicable only for geometric pens */ if ((style & PS_STYLE_MASK) == PS_INSIDEFRAME || width != 1) { SetLastError(ERROR_INVALID_PARAMETER); diff --git a/dlls/gdi32/printdrv16.c b/dlls/gdi32/printdrv16.c index d97261fe1ea..bcf2065dbbd 100644 --- a/dlls/gdi32/printdrv16.c +++ b/dlls/gdi32/printdrv16.c @@ -375,7 +375,7 @@ static int CreateSpoolFile(LPCSTR pszOutput) /** * The file name can be dos based, we have to find its - * Unix correspondant file name + * corresponding Unix file name. */ MultiByteToWideChar(CP_ACP, 0, psCmdP, -1, psCmdPW, MAX_PATH); if ((buffer = wine_get_unix_file_name(psCmdPW))) diff --git a/dlls/gdi32/region.c b/dlls/gdi32/region.c index 64948400fa3..d0d8580f452 100644 --- a/dlls/gdi32/region.c +++ b/dlls/gdi32/region.c @@ -993,7 +993,7 @@ DWORD WINAPI GetRegionData(HRGN hrgn, DWORD count, LPRGNDATA rgndata) * PARAMS * lpXform [I] World-space to logical-space transformation data. * dwCount [I] Size of the data pointed to by rgndata, in bytes. - * rgndata [I] Data that specifes the region. + * rgndata [I] Data that specifies the region. * * RETURNS * Success: Handle to region. @@ -1239,7 +1239,7 @@ BOOL REGION_FrameRgn( HRGN hDest, HRGN hSrc, INT x, INT y ) /*********************************************************************** * CombineRgn (GDI32.@) * - * Combines two regions with the specifed operation and stores the result + * Combines two regions with the specified operation and stores the result * in the specified destination region. * * PARAMS diff --git a/dlls/gdi32/tests/pen.c b/dlls/gdi32/tests/pen.c index ada892b2ae8..fcd79e636d3 100644 --- a/dlls/gdi32/tests/pen.c +++ b/dlls/gdi32/tests/pen.c @@ -195,7 +195,7 @@ static void test_logpen(void) } if (pen[i].style == PS_INSIDEFRAME) { - /* This style is applicable only for gemetric pens */ + /* This style is applicable only for geometric pens */ ok(hpen == 0, "ExtCreatePen should fail\n"); goto test_geometric_pens; } @@ -347,7 +347,7 @@ test_geometric_pens: memset(&lp, 0xb0, sizeof(lp)); SetLastError(0xdeadbeef); size = GetObject(hpen, sizeof(lp), &lp); - /* for some reason XP differenciates PS_NULL here */ + /* for some reason XP differentiates PS_NULL here */ if (pen[i].style == PS_NULL) { ok(size == sizeof(LOGPEN), "GetObject returned %d, error %d\n", size, GetLastError()); @@ -404,7 +404,7 @@ test_geometric_pens: break; } - /* for some reason XP differenciates PS_NULL here */ + /* for some reason XP differentiates PS_NULL here */ if (pen[i].style == PS_NULL) ok(ext_pen.elp.elpPenStyle == pen[i].ret_style, "expected %x, got %x\n", pen[i].ret_style, ext_pen.elp.elpPenStyle); else diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index 2e5ef565db3..b1ec2c7bcc8 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -1089,7 +1089,6 @@ GpStatus WINGDIPAPI GdipCreateBitmapFromHBITMAP(HBITMAP hbm, HPALETTE hpal, GpBi default: FIXME("don't know how to handle %d bpp\n", bm.bmBitsPixel); return InvalidParameter; - break; } retval = GdipCreateBitmapFromScan0(bm.bmWidth, bm.bmHeight, bm.bmWidthBytes, diff --git a/dlls/hhctrl.ocx/Ru.rc b/dlls/hhctrl.ocx/Ru.rc new file mode 100644 index 00000000000..43330336d2e --- /dev/null +++ b/dlls/hhctrl.ocx/Ru.rc @@ -0,0 +1,58 @@ +/* + * HTML Help resources + * Russia Language Support + * + * Copyright 2008 Vitaliy Margolen + * + * 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_RUSSIAN, SUBLANG_DEFAULT + +STRINGTABLE +BEGIN + IDS_CONTENTS "&Ñîäåðæàíèå" + IDS_INDEX "&Îãëàâëåíèå" + IDS_SEARCH "&Ïîèñê" + IDS_FAVORITES "&Èçáðàííîå" +END + +STRINGTABLE +BEGIN + IDTB_EXPAND "Ïîêàçàòü" + IDTB_CONTRACT "Ñïðÿòàòü" + IDTB_STOP "Îñòàíîâèòü" + IDTB_REFRESH "Îáíîâèòü" + IDTB_BACK "Íàçàä" + IDTB_HOME " íà÷àëî" + IDTB_SYNC "Ñèíõðîíèçèðîâàòü" + IDTB_PRINT "Ïå÷ÿòü" + IDTB_OPTIONS "Íàñòðîéêè" + IDTB_FORWARD " ïåð¸ä" + IDTB_NOTES "Çàïèñêè" + IDTB_BROWSE_FWD "Ïðîñìîòð â ïåð¸ä" + IDTB_BROWSE_BACK "Ïðîñìîòð íàçàä" + IDTB_CONTENTS "Ñîäåðæàíèå" + IDTB_INDEX "Îãëàâëåíèå" + IDTB_SEARCH "Ïîèñê" + IDTB_HISTORY "Èñòîðèÿ" + IDTB_FAVORITES "Èçáðàííîå" + IDTB_JUMP1 "Ïåðåõîä 1" + IDTB_JUMP2 "Ïåðåõîä 2" + IDTB_CUSTOMIZE "Ïåðñîíàëèçîâàòü" + IDTB_ZOOM "Ìàñøòàá" + IDTB_TOC_NEXT "Ñëåäóþùàÿ ãëàâà" + IDTB_TOC_PREV "Ïðåäûäóùàÿ ãëàâà" +END diff --git a/dlls/hhctrl.ocx/chm.c b/dlls/hhctrl.ocx/chm.c index 710013e5913..ece05f06202 100644 --- a/dlls/hhctrl.ocx/chm.c +++ b/dlls/hhctrl.ocx/chm.c @@ -113,11 +113,20 @@ static BOOL ReadChmSystem(CHMInfo *chm) break; switch(entry.code) { + case 0x0: + TRACE("TOC is %s\n", debugstr_an(buf, entry.len)); + heap_free(chm->defToc); + chm->defToc = strdupnAtoW(buf, entry.len); + break; case 0x2: TRACE("Default topic is %s\n", debugstr_an(buf, entry.len)); + heap_free(chm->defTopic); + chm->defTopic = strdupnAtoW(buf, entry.len); break; case 0x3: TRACE("Title is %s\n", debugstr_an(buf, entry.len)); + heap_free(chm->defTitle); + chm->defTitle = strdupnAtoW(buf, entry.len); break; case 0x5: TRACE("Default window is %s\n", debugstr_an(buf, entry.len)); @@ -212,7 +221,26 @@ BOOL LoadWinTypeFromCHM(HHInfo *info) hr = IStorage_OpenStream(pStorage, windowsW, NULL, STGM_READ, 0, &pStream); if (FAILED(hr)) - return FALSE; + { + /* no defined window types so use (hopefully) sane defaults */ + static const WCHAR defaultwinW[] = {'d','e','f','a','u','l','t','w','i','n','\0'}; + static const WCHAR null[] = {0}; + memset((void*)&(info->WinType), 0, sizeof(info->WinType)); + info->WinType.cbStruct=sizeof(info->WinType); + info->WinType.fUniCodeStrings=TRUE; + info->WinType.pszType=strdupW(defaultwinW); + info->WinType.pszToc = strdupW(info->pCHMInfo->defToc); + info->WinType.pszIndex = strdupW(null); + info->WinType.fsValidMembers=0; + info->WinType.fsWinProperties=HHWIN_PROP_TRI_PANE; + info->WinType.pszCaption=strdupW(info->pCHMInfo->defTitle); + info->WinType.dwStyles=WS_POPUP; + info->WinType.dwExStyles=0; + info->WinType.nShowState=SW_SHOW; + info->WinType.pszFile=strdupW(info->pCHMInfo->defTopic); + info->WinType.curNavType=HHWIN_NAVTYPE_TOC; + return TRUE; + } /* jump past the #WINDOWS header */ liOffset.QuadPart = sizeof(DWORD) * 2; @@ -393,6 +421,9 @@ CHMInfo *CloseCHM(CHMInfo *chm) } heap_free(chm->strings); + heap_free(chm->defTitle); + heap_free(chm->defTopic); + heap_free(chm->defToc); heap_free(chm); return NULL; diff --git a/dlls/hhctrl.ocx/hhctrl.c b/dlls/hhctrl.ocx/hhctrl.c index f8b5c99dc6a..472b7cfc310 100644 --- a/dlls/hhctrl.ocx/hhctrl.c +++ b/dlls/hhctrl.ocx/hhctrl.c @@ -114,6 +114,7 @@ HWND WINAPI HtmlHelpW(HWND caller, LPCWSTR filename, UINT command, DWORD_PTR dat memcpy(chm_file, filename, (index-filename)*sizeof(WCHAR)); chm_file[index-filename] = 0; filename = chm_file; + index += 2; /* advance beyond "::" for calling NavigateToChm() later */ } else { diff --git a/dlls/hhctrl.ocx/hhctrl.h b/dlls/hhctrl.ocx/hhctrl.h index 26c9d4da7eb..6f7c96b63c4 100644 --- a/dlls/hhctrl.ocx/hhctrl.h +++ b/dlls/hhctrl.ocx/hhctrl.h @@ -74,6 +74,10 @@ typedef struct CHMInfo IStream *strings_stream; char **strings; DWORD strings_size; + + WCHAR *defTopic; + WCHAR *defTitle; + WCHAR *defToc; } CHMInfo; #define TAB_CONTENTS 0 @@ -177,7 +181,7 @@ static inline LPWSTR strdupW(LPCWSTR str) return ret; } -static inline LPWSTR strdupAtoW(LPCSTR str) +static inline LPWSTR strdupnAtoW(LPCSTR str, LONG lenA) { LPWSTR ret; DWORD len; @@ -185,13 +189,28 @@ static inline LPWSTR strdupAtoW(LPCSTR str) if(!str) return NULL; - len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); + if (lenA > 0) + { + /* find length of string */ + LPCSTR eos = memchr(str, 0, lenA); + if (eos) lenA = eos - str; + } + + len = MultiByteToWideChar(CP_ACP, 0, str, lenA, NULL, 0)+1; /* +1 for null pad */ ret = heap_alloc(len*sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len); + MultiByteToWideChar(CP_ACP, 0, str, lenA, ret, len); + ret[len-1] = 0; return ret; } +static inline LPWSTR strdupAtoW(LPCSTR str) +{ + return strdupnAtoW(str, -1); +} + + + extern HINSTANCE hhctrl_hinstance; extern BOOL hh_process; diff --git a/dlls/hhctrl.ocx/hhctrl.rc b/dlls/hhctrl.ocx/hhctrl.rc index 1b64557a21f..5fca97befa5 100644 --- a/dlls/hhctrl.ocx/hhctrl.rc +++ b/dlls/hhctrl.ocx/hhctrl.rc @@ -39,5 +39,6 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #include "Nl.rc" #include "No.rc" #include "Pl.rc" +#include "Ru.rc" #include "Sv.rc" #include "Tr.rc" diff --git a/dlls/imm32/Makefile.in b/dlls/imm32/Makefile.in index 4118422f26a..909f29bb1b2 100644 --- a/dlls/imm32/Makefile.in +++ b/dlls/imm32/Makefile.in @@ -4,7 +4,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = imm32.dll IMPORTLIB = imm32 -IMPORTS = user32 gdi32 kernel32 +IMPORTS = user32 gdi32 advapi32 kernel32 C_SRCS = \ imm.c diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index de217d13c3d..89f7c479316 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -30,6 +30,7 @@ #include "imm.h" #include "ddk/imm.h" #include "winnls.h" +#include "winreg.h" WINE_DEFAULT_DEBUG_CHANNEL(imm); @@ -1178,23 +1179,83 @@ DWORD WINAPI ImmGetGuideLineW(HIMC hIMC, DWORD dwIndex, LPWSTR lpBuf, DWORD dwBu /*********************************************************************** * ImmGetIMEFileNameA (IMM32.@) */ -UINT WINAPI ImmGetIMEFileNameA( - HKL hKL, LPSTR lpszFileName, UINT uBufLen) +UINT WINAPI ImmGetIMEFileNameA( HKL hKL, LPSTR lpszFileName, UINT uBufLen) { - FIXME("(%p, %p, %d): stub\n", hKL, lpszFileName, uBufLen); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + LPWSTR bufW = NULL; + UINT wBufLen = uBufLen; + UINT rc; + + if (uBufLen && lpszFileName) + bufW = HeapAlloc(GetProcessHeap(),0,uBufLen * sizeof(WCHAR)); + else /* We need this to get the number of byte required */ + { + bufW = HeapAlloc(GetProcessHeap(),0,MAX_PATH * sizeof(WCHAR)); + wBufLen = MAX_PATH; + } + + rc = ImmGetIMEFileNameW(hKL,bufW,wBufLen); + + if (rc > 0) + { + if (uBufLen && lpszFileName) + rc = WideCharToMultiByte(CP_ACP, 0, bufW, -1, lpszFileName, + uBufLen, NULL, NULL); + else /* get the length */ + rc = WideCharToMultiByte(CP_ACP, 0, bufW, -1, NULL, 0, NULL, + NULL); + } + + HeapFree(GetProcessHeap(),0,bufW); + return rc; } /*********************************************************************** * ImmGetIMEFileNameW (IMM32.@) */ -UINT WINAPI ImmGetIMEFileNameW( - HKL hKL, LPWSTR lpszFileName, UINT uBufLen) +UINT WINAPI ImmGetIMEFileNameW(HKL hKL, LPWSTR lpszFileName, UINT uBufLen) { - FIXME("(%p, %p, %d): stub\n", hKL, lpszFileName, uBufLen); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; + static const WCHAR szImeFileW[] = {'I','m','e',' ','F','i','l','e',0}; + static const WCHAR fmt[] = {'S','y','s','t','e','m','\\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\','C','o','n','t','r','o','l','\\','K','e','y','b','o','a','r','d',' ','L','a','y','o','u','t','s','\\','%','0','8','x',0}; + + HKEY hkey; + DWORD length; + DWORD rc; + WCHAR regKey[sizeof(fmt)/sizeof(WCHAR)+8]; + + wsprintfW( regKey, fmt, (unsigned)hKL ); + rc = RegOpenKeyW( HKEY_LOCAL_MACHINE, regKey, &hkey); + if (rc != ERROR_SUCCESS) + { + SetLastError(rc); + return 0; + } + + length = 0; + rc = RegGetValueW(hkey, NULL, szImeFileW, RRF_RT_REG_SZ, NULL, NULL, &length); + + if (rc != ERROR_SUCCESS) + { + RegCloseKey(hkey); + SetLastError(rc); + return 0; + } + if (length > uBufLen * sizeof(WCHAR) || !lpszFileName) + { + RegCloseKey(hkey); + if (lpszFileName) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + return 0; + } + else + return length / sizeof(WCHAR); + } + + RegGetValueW(hkey, NULL, szImeFileW, RRF_RT_REG_SZ, NULL, lpszFileName, &length); + + RegCloseKey(hkey); + + return length / sizeof(WCHAR); } /*********************************************************************** diff --git a/dlls/inetcomm/internettransport.c b/dlls/inetcomm/internettransport.c index 19fed54aad9..2dab22ffc77 100644 --- a/dlls/inetcomm/internettransport.c +++ b/dlls/inetcomm/internettransport.c @@ -57,7 +57,7 @@ HRESULT InternetTransport_GetServerInfo(InternetTransport *This, LPINETSERVER pI if (This->Status == IXP_DISCONNECTED) return IXP_E_NOT_CONNECTED; - memcpy(pInetServer, &This->ServerInfo, sizeof(*pInetServer)); + *pInetServer = This->ServerInfo; return S_OK; } @@ -80,7 +80,7 @@ HRESULT InternetTransport_Connect(InternetTransport *This, if (This->Status != IXP_DISCONNECTED) return IXP_E_ALREADY_CONNECTED; - memcpy(&This->ServerInfo, pInetServer, sizeof(This->ServerInfo)); + This->ServerInfo = *pInetServer; This->fCommandLogging = fCommandLogging; This->hwnd = CreateWindowW(wszClassName, wszClassName, 0, 0, 0, 0, 0, NULL, NULL, NULL, 0); diff --git a/dlls/jscript/jscript.c b/dlls/jscript/jscript.c index 79b55c8e0fb..7d7385a0b1a 100644 --- a/dlls/jscript/jscript.c +++ b/dlls/jscript/jscript.c @@ -97,8 +97,10 @@ static ULONG WINAPI JScript_Release(IActiveScript *iface) TRACE("(%p) ref=%d\n", iface, ref); - if(!ref) + if(!ref) { heap_free(This); + unlock_module(); + } return ref; } @@ -427,6 +429,8 @@ HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory *iface, IUnknown *pUn TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppv); + lock_module(); + ret = heap_alloc(sizeof(*ret)); ret->lpIActiveScriptVtbl = &JScriptVtbl; diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 6a7ec760955..afdd0c74319 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -28,6 +28,18 @@ HRESULT WINAPI JScriptFactory_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**); +extern LONG module_ref; + +static inline void lock_module(void) +{ + InterlockedIncrement(&module_ref); +} + +static inline void unlock_module(void) +{ + InterlockedDecrement(&module_ref); +} + static inline void *heap_alloc(size_t len) { return HeapAlloc(GetProcessHeap(), 0, len); diff --git a/dlls/jscript/jscript_main.c b/dlls/jscript/jscript_main.c index f4c4bf18a53..92999fbc680 100644 --- a/dlls/jscript/jscript_main.c +++ b/dlls/jscript/jscript_main.c @@ -30,6 +30,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(jscript); +LONG module_ref = 0; + static const CLSID CLSID_JScript = {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}}; static const CLSID CLSID_JScriptAuthor = @@ -75,6 +77,12 @@ static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL fLock) { TRACE("(%p)->(%x)\n", iface, fLock); + + if(fLock) + lock_module(); + else + unlock_module(); + return S_OK; } @@ -127,8 +135,9 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) */ HRESULT WINAPI DllCanUnloadNow(void) { - FIXME("()\n"); - return S_FALSE; + TRACE("() ref=%d\n", module_ref); + + return module_ref ? S_FALSE : S_OK; } /*********************************************************************** diff --git a/dlls/mshtml/tests/Makefile.in b/dlls/jscript/tests/Makefile.in similarity index 57% copy from dlls/mshtml/tests/Makefile.in copy to dlls/jscript/tests/Makefile.in index 0aa464515f1..2201a4a0d49 100644 --- a/dlls/mshtml/tests/Makefile.in +++ b/dlls/jscript/tests/Makefile.in @@ -2,15 +2,11 @@ TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../../.. SRCDIR = @srcdir@ VPATH = @srcdir@ -TESTDLL = mshtml.dll -IMPORTS = ole32 oleaut32 user32 urlmon advapi32 kernel32 -EXTRALIBS = -luuid +TESTDLL = jscript.dll +IMPORTS = ole32 kernel32 CTESTS = \ - dom.c \ - htmldoc.c \ - misc.c \ - protocol.c + jscript.c @MAKE_TEST_RULES@ diff --git a/dlls/jscript/tests/jscript.c b/dlls/jscript/tests/jscript.c new file mode 100644 index 00000000000..a811ef29ec4 --- /dev/null +++ b/dlls/jscript/tests/jscript.c @@ -0,0 +1,62 @@ +/* + * Copyright 2008 Jacek Caban 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 + */ + +#define COBJMACROS + +#include + +#include +#include + +#include "wine/test.h" + +static const CLSID CLSID_JScript = + {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}}; + +static void test_jscript(void) +{ + IActiveScriptParse *parse; + IActiveScript *script; + IUnknown *unk; + HRESULT hres; + + hres = CoCreateInstance(&CLSID_JScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IUnknown, (void**)&unk); + ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres); + if(FAILED(hres)) + return; + + hres = IUnknown_QueryInterface(unk, &IID_IActiveScript, (void**)&script); + ok(hres == S_OK, "Could not get IActiveScript: %08x\n", hres); + + hres = IUnknown_QueryInterface(unk, &IID_IActiveScriptParse, (void**)&parse); + ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres); + + IActiveScriptParse_Release(parse); + IActiveScript_Release(script); + IUnknown_Release(unk); +} + +START_TEST(jscript) +{ + CoInitialize(NULL); + + test_jscript(); + + CoUninitialize(); +} diff --git a/dlls/kernel32/locale_rc.rc b/dlls/kernel32/locale_rc.rc index 56421899200..01b24c62724 100644 --- a/dlls/kernel32/locale_rc.rc +++ b/dlls/kernel32/locale_rc.rc @@ -134,6 +134,8 @@ #include "nls/ptb.nls" /* 0x0416 LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN */ #include "nls/ptg.nls" /* 0x0816 LANG_PORTUGUESE, SUBLANG_PORTUGUESE */ +#include "nls/rmc.nls" /* 0x0417 LANG_ROMANSH, SUBLANG_ROMANSH_SWITZERLAND */ + #include "nls/rom.nls" /* 0x0418 LANG_ROMANIAN, SUBLANG_DEFAULT */ #include "nls/rus.nls" /* 0x0419 LANG_RUSSIAN, SUBLANG_DEFAULT */ diff --git a/dlls/kernel32/nls/rmc.nls b/dlls/kernel32/nls/rmc.nls new file mode 100644 index 00000000000..fb09800f324 --- /dev/null +++ b/dlls/kernel32/nls/rmc.nls @@ -0,0 +1,166 @@ +/* + * Locale definitions for Romansh (Switzerland) + * + * Copyright 2002 Alexandre Julliard for CodeWeavers + * Copyright 2008 Michael Stefaniuc + * + * 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 + */ + +/* +- Windows Vista (at least the NLS informations about it on www.microsoft.com) + has the wrong short date format dd/MM/yyyy e.g. 01/08/1996 instead of the + correct d-M-yyyy e.g 1-8-1996. This file uses the right short date format as + seen on http://www.liarumantscha.ch/ and in the glibc-morelocales.patch for + glibc-2.6. +- As decimal separator this file uses the "," like http://www.liarumantscha.ch/ + does and not the "." used by Windows Vista and the Swiss German language. +*/ + +#pragma code_page(1252) + +STRINGTABLE LANGUAGE LANG_ROMANSH, SUBLANG_ROMANSH_SWITZERLAND +{ + LOCALE_FONTSIGNATURE L"\x002f\x8000\x3808\x0000\x0000\x0000\x0000\x0000\x0001\x0000\x0000\x4000\x0093\x0000\x0000\xcdd4" + LOCALE_ICALENDARTYPE "1" + LOCALE_ICENTURY "1" + LOCALE_ICOUNTRY "41" + LOCALE_ICURRDIGITS "2" + LOCALE_ICURRENCY "2" + LOCALE_IDATE "1" + LOCALE_IDAYLZERO "0" + LOCALE_IDEFAULTANSICODEPAGE "1252" + LOCALE_IDEFAULTCODEPAGE "850" + LOCALE_IDEFAULTCOUNTRY "41" + LOCALE_IDEFAULTEBCDICCODEPAGE "20273" + LOCALE_IDEFAULTLANGUAGE "0417" + LOCALE_IDEFAULTMACCODEPAGE "10000" + LOCALE_IDEFAULTUNIXCODEPAGE "28605" + LOCALE_IDIGITS "2" + LOCALE_IDIGITSUBSTITUTION "1" + LOCALE_IFIRSTDAYOFWEEK "0" + LOCALE_IFIRSTWEEKOFYEAR "2" + LOCALE_IINTLCURRDIGITS "2" + LOCALE_ILANGUAGE "0417" + LOCALE_ILDATE "1" + LOCALE_ILZERO "1" + LOCALE_IMEASURE "0" + LOCALE_IMONLZERO "0" + LOCALE_INEGCURR "2" + LOCALE_INEGNUMBER "1" + LOCALE_INEGSEPBYSPACE "0" + LOCALE_INEGSIGNPOSN "4" + LOCALE_INEGSYMPRECEDES "1" + LOCALE_IOPTIONALCALENDAR "0" + LOCALE_IPAPERSIZE "9" + LOCALE_IPOSSEPBYSPACE "1" + LOCALE_IPOSSIGNPOSN "4" + LOCALE_IPOSSYMPRECEDES "1" + LOCALE_ITIME "1" + LOCALE_ITIMEMARKPOSN "0" + LOCALE_ITLZERO "1" + LOCALE_S1159 "" + LOCALE_S2359 "" + LOCALE_SABBREVCTRYNAME "CHE" + LOCALE_SABBREVDAYNAME1 "gli" + LOCALE_SABBREVDAYNAME2 "ma" + LOCALE_SABBREVDAYNAME3 "me" + LOCALE_SABBREVDAYNAME4 "gie" + LOCALE_SABBREVDAYNAME5 "ve" + LOCALE_SABBREVDAYNAME6 "so" + LOCALE_SABBREVDAYNAME7 "du" + LOCALE_SABBREVLANGNAME "RMC" + LOCALE_SABBREVMONTHNAME1 "schan" + LOCALE_SABBREVMONTHNAME2 "favr" + LOCALE_SABBREVMONTHNAME3 "mars" + LOCALE_SABBREVMONTHNAME4 "avr" + LOCALE_SABBREVMONTHNAME5 "matg" + LOCALE_SABBREVMONTHNAME6 "zercl" + LOCALE_SABBREVMONTHNAME7 "fan" + LOCALE_SABBREVMONTHNAME8 "avust" + LOCALE_SABBREVMONTHNAME9 "sett" + LOCALE_SABBREVMONTHNAME10 "oct" + LOCALE_SABBREVMONTHNAME11 "nov" + LOCALE_SABBREVMONTHNAME12 "dec" + LOCALE_SABBREVMONTHNAME13 "" + LOCALE_SCOUNTRY "Switzerland" + LOCALE_SCURRENCY "fr." + LOCALE_SDATE "-" + LOCALE_SDAYNAME1 "glindesdi" + LOCALE_SDAYNAME2 "mardi" + LOCALE_SDAYNAME3 "mesemna" + LOCALE_SDAYNAME4 "gievgia" + LOCALE_SDAYNAME5 "venderdi" + LOCALE_SDAYNAME6 "sonda" + LOCALE_SDAYNAME7 "dumengia" + LOCALE_SDECIMAL "," + LOCALE_SENGCOUNTRY "Switzerland" + LOCALE_SENGCURRNAME "Swiss Franc" + LOCALE_SENGLANGUAGE "Romansh" + LOCALE_SGROUPING "3;0" + LOCALE_SINTLSYMBOL "CHF" + LOCALE_SISO3166CTRYNAME "CH" + LOCALE_SISO639LANGNAME "rm" + LOCALE_SLANGUAGE "Romansh (Switzerland)" + LOCALE_SLIST ";" + LOCALE_SLONGDATE "dddd, d MMMM yyyy" + LOCALE_SMONDECIMALSEP "," + LOCALE_SMONGROUPING "3;0" + LOCALE_SMONTHNAME1 "schaner" + LOCALE_SMONTHNAME2 "favrer" + LOCALE_SMONTHNAME3 "mars" + LOCALE_SMONTHNAME4 "avrigl" + LOCALE_SMONTHNAME5 "matg" + LOCALE_SMONTHNAME6 "zercladur" + LOCALE_SMONTHNAME7 "fanadur" + LOCALE_SMONTHNAME8 "avust" + LOCALE_SMONTHNAME9 "settember" + LOCALE_SMONTHNAME10 "october" + LOCALE_SMONTHNAME11 "november" + LOCALE_SMONTHNAME12 "december" + LOCALE_SMONTHNAME13 "" + LOCALE_SMONTHOUSANDSEP "'" + LOCALE_SNAME "rm-CH" + LOCALE_SNATIVECTRYNAME "Svizra" + LOCALE_SNATIVECURRNAME "Franc svizzer" + LOCALE_SNATIVEDIGITS "0123456789" + LOCALE_SNATIVELANGNAME "Rumantsch (Svizra)" + LOCALE_SNEGATIVESIGN "-" + LOCALE_SPOSITIVESIGN "" + LOCALE_SSHORTDATE "dd-MM-yyyy" + LOCALE_SSORTNAME "Default" + LOCALE_STHOUSAND "'" + LOCALE_STIME ":" + LOCALE_STIMEFORMAT "HH:mm:ss" + LOCALE_SYEARMONTH "MMMM yyyy" + + LGRPID_WESTERN_EUROPE+LGRPID_RES_BASE "Western Europe and United States" + LGRPID_CENTRAL_EUROPE+LGRPID_RES_BASE "Central Europe" + LGRPID_BALTIC+LGRPID_RES_BASE "Baltic" + LGRPID_GREEK+LGRPID_RES_BASE "Greek" + LGRPID_CYRILLIC+LGRPID_RES_BASE "Cyrillic" + LGRPID_TURKISH+LGRPID_RES_BASE "Turkic" + LGRPID_JAPANESE+LGRPID_RES_BASE "Japanese" + LGRPID_KOREAN+LGRPID_RES_BASE "Korean" + LGRPID_TRADITIONAL_CHINESE+LGRPID_RES_BASE "Traditional Chinese" + LGRPID_SIMPLIFIED_CHINESE+LGRPID_RES_BASE "Simplified Chinese" + LGRPID_THAI+LGRPID_RES_BASE "Thai" + LGRPID_HEBREW+LGRPID_RES_BASE "Hebrew" + LGRPID_ARABIC+LGRPID_RES_BASE "Arabic" + LGRPID_VIETNAMESE+LGRPID_RES_BASE "Vietnamese" + LGRPID_INDIC+LGRPID_RES_BASE "Indic" + LGRPID_GEORGIAN+LGRPID_RES_BASE "Georgian" + LGRPID_ARMENIAN+LGRPID_RES_BASE "Armenian" +} diff --git a/dlls/kernel32/process.c b/dlls/kernel32/process.c index b3bf535d6f7..8d040bdf111 100644 --- a/dlls/kernel32/process.c +++ b/dlls/kernel32/process.c @@ -52,10 +52,6 @@ #include "wine/unicode.h" #include "wine/debug.h" -#ifdef HAVE_VALGRIND_MEMCHECK_H -#include -#endif - WINE_DEFAULT_DEBUG_CHANNEL(process); WINE_DECLARE_DEBUG_CHANNEL(file); WINE_DECLARE_DEBUG_CHANNEL(relay); @@ -818,44 +814,6 @@ static HANDLE start_wineboot(void) /*********************************************************************** - * init_stack - * - * Allocate the stack of new process. - */ -static void *init_stack(void) -{ - void *base; - SIZE_T stack_size, page_size = getpagesize(); - IMAGE_NT_HEADERS *nt = RtlImageNtHeader( NtCurrentTeb()->Peb->ImageBaseAddress ); - - stack_size = max( nt->OptionalHeader.SizeOfStackReserve, nt->OptionalHeader.SizeOfStackCommit ); - stack_size += page_size; /* for the guard page */ - stack_size = (stack_size + 0xffff) & ~0xffff; /* round to 64K boundary */ - if (stack_size < 1024 * 1024) stack_size = 1024 * 1024; /* Xlib needs a large stack */ - - if (!(base = VirtualAlloc( NULL, stack_size, MEM_COMMIT, PAGE_READWRITE ))) - { - ERR( "failed to allocate main process stack\n" ); - ExitProcess( 1 ); - } - - /* note: limit is lower than base since the stack grows down */ - NtCurrentTeb()->DeallocationStack = base; - NtCurrentTeb()->Tib.StackBase = (char *)base + stack_size; - NtCurrentTeb()->Tib.StackLimit = (char *)base + page_size; - -#ifdef VALGRIND_STACK_REGISTER - /* no need to de-register the stack as it's the one of the main thread */ - VALGRIND_STACK_REGISTER(NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase); -#endif - - /* setup guard page */ - VirtualProtect( base, page_size, PAGE_NOACCESS, NULL ); - return NtCurrentTeb()->Tib.StackBase; -} - - -/*********************************************************************** * start_process * * Startup routine of a new process. Runs on the new process stack. @@ -868,8 +826,6 @@ static void start_process( void *arg ) IMAGE_NT_HEADERS *nt; LPTHREAD_START_ROUTINE entry; - LdrInitializeThunk( 0, 0, 0, 0 ); - nt = RtlImageNtHeader( peb->ImageBaseAddress ); entry = (LPTHREAD_START_ROUTINE)((char *)peb->ImageBaseAddress + nt->OptionalHeader.AddressOfEntryPoint); @@ -1000,8 +956,9 @@ void __wine_kernel_init(void) CloseHandle( boot_event ); } + LdrInitializeThunk( 0, 0, 0, 0 ); /* switch to the new stack */ - wine_switch_to_stack( start_process, NULL, init_stack() ); + wine_switch_to_stack( start_process, NULL, NtCurrentTeb()->Tib.StackBase ); error: ExitProcess( GetLastError() ); @@ -2928,8 +2885,17 @@ DWORD WINAPI RegisterServiceProcess(DWORD dwProcessId, DWORD dwType) */ BOOL WINAPI IsWow64Process(HANDLE hProcess, PBOOL Wow64Process) { - FIXME("(%p %p) stub!\n", hProcess, Wow64Process); - *Wow64Process = FALSE; + ULONG pbi; + NTSTATUS status; + + status = NtQueryInformationProcess( hProcess, ProcessWow64Information, &pbi, sizeof(pbi), NULL ); + + if (status != STATUS_SUCCESS) + { + SetLastError( RtlNtStatusToDosError( status ) ); + return FALSE; + } + *Wow64Process = (pbi != 0); return TRUE; } diff --git a/dlls/kernel32/tests/codepage.c b/dlls/kernel32/tests/codepage.c index 201603fa849..e8908f75c45 100644 --- a/dlls/kernel32/tests/codepage.c +++ b/dlls/kernel32/tests/codepage.c @@ -19,6 +19,7 @@ */ #include +#include #include "wine/test.h" #include "windef.h" @@ -145,6 +146,56 @@ static void test_negative_source_length(void) "MultiByteToWideChar(-1): len=%d error=%u\n", len, GetLastError()); } +#define LONGBUFLEN 100000 +static void test_negative_dest_length(void) +{ + int len, i; + static char buf[LONGBUFLEN]; + static WCHAR originalW[LONGBUFLEN]; + static char originalA[LONGBUFLEN]; + DWORD theError; + + /* Test return on -1 dest length */ + SetLastError( 0xdeadbeef ); + memset(buf,'x',sizeof(buf)); + len = WideCharToMultiByte(CP_ACP, 0, foobarW, -1, buf, -1, NULL, NULL); + todo_wine { + ok(len == 0 && GetLastError() == ERROR_INVALID_PARAMETER, + "WideCharToMultiByte(destlen -1): len=%d error=%x\n", len, GetLastError()); + } + + /* Test return on -1000 dest length */ + SetLastError( 0xdeadbeef ); + memset(buf,'x',sizeof(buf)); + len = WideCharToMultiByte(CP_ACP, 0, foobarW, -1, buf, -1000, NULL, NULL); + todo_wine { + ok(len == 0 && GetLastError() == ERROR_INVALID_PARAMETER, + "WideCharToMultiByte(destlen -1000): len=%d error=%x\n", len, GetLastError()); + } + + /* Test return on INT_MAX dest length */ + SetLastError( 0xdeadbeef ); + memset(buf,'x',sizeof(buf)); + len = WideCharToMultiByte(CP_ACP, 0, foobarW, -1, buf, INT_MAX, NULL, NULL); + ok(len == 7 && !lstrcmpA(buf, "foobar") && GetLastError() == 0xdeadbeef, + "WideCharToMultiByte(destlen INT_MAX): len=%d error=%x\n", len, GetLastError()); + + /* Test return on INT_MAX dest length and very long input */ + SetLastError( 0xdeadbeef ); + memset(buf,'x',sizeof(buf)); + for (i=0; i < LONGBUFLEN - 1; i++) { + originalW[i] = 'Q'; + originalA[i] = 'Q'; + } + originalW[LONGBUFLEN-1] = 0; + originalA[LONGBUFLEN-1] = 0; + len = WideCharToMultiByte(CP_ACP, 0, originalW, -1, buf, INT_MAX, NULL, NULL); + theError = GetLastError(); + ok(len == LONGBUFLEN && !lstrcmpA(buf, originalA) && theError == 0xdeadbeef, + "WideCharToMultiByte(srclen %d, destlen INT_MAX): len %d error=%x\n", LONGBUFLEN, len, theError); + +} + static void test_overlapped_buffers(void) { static const WCHAR strW[] = {'j','u','s','t',' ','a',' ','t','e','s','t',0}; @@ -152,13 +203,7 @@ static void test_overlapped_buffers(void) char buf[256]; int ret; - SetLastError(0xdeadbeef); - lstrcpyW((WCHAR *)(buf + 1), strW); - if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) - { - skip("lstrcypW is not implemented\n"); - return; - } + memcpy((WCHAR *)(buf + 1), strW, sizeof(strW)); ret = WideCharToMultiByte(CP_ACP, 0, (WCHAR *)(buf + 1), -1, buf, sizeof(buf), NULL, NULL); ok(ret == sizeof(strA), "unexpected ret %d\n", ret); ok(!memcmp(buf, strA, sizeof(strA)), "conversion failed: %s\n", buf); @@ -169,5 +214,6 @@ START_TEST(codepage) test_destination_buffer(); test_null_source(); test_negative_source_length(); + test_negative_dest_length(); test_overlapped_buffers(); } diff --git a/dlls/mscms/handle.c b/dlls/mscms/handle.c dissimilarity index 67% index 09c2cc659b0..84f1d8ba30f 100644 --- a/dlls/mscms/handle.c +++ b/dlls/mscms/handle.c @@ -1,287 +1,250 @@ -/* - * MSCMS - Color Management System for Wine - * - * Copyright 2004, 2005 Hans Leidekker - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include - -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "winuser.h" -#include "icm.h" - -#include "mscms_priv.h" - -#ifdef HAVE_LCMS - -static CRITICAL_SECTION MSCMS_handle_cs; -static CRITICAL_SECTION_DEBUG MSCMS_handle_cs_debug = -{ - 0, 0, &MSCMS_handle_cs, - { &MSCMS_handle_cs_debug.ProcessLocksList, - &MSCMS_handle_cs_debug.ProcessLocksList }, - 0, 0, { (DWORD_PTR)(__FILE__ ": MSCMS_handle_cs") } -}; -static CRITICAL_SECTION MSCMS_handle_cs = { &MSCMS_handle_cs_debug, -1, 0, 0, 0, 0 }; - -/* A simple structure to tie together a pointer to an icc profile, an lcms - * color profile handle and a Windows file handle. Windows color profile - * handles are built from indexes into an array of these structures. If - * the profile is memory based the file handle field is set to - * INVALID_HANDLE_VALUE. The 'access' field records the access parameter - * supplied to an OpenColorProfile() call, i.e. PROFILE_READ or PROFILE_READWRITE. - */ - -struct profile -{ - HANDLE file; - DWORD access; - icProfile *iccprofile; - cmsHPROFILE cmsprofile; -}; - -struct transform -{ - cmsHTRANSFORM cmstransform; -}; - -#define CMSMAXHANDLES 0x80 - -static struct profile profiletable[CMSMAXHANDLES]; -static struct transform transformtable[CMSMAXHANDLES]; - -HPROFILE MSCMS_handle2hprofile( HANDLE file ) -{ - HPROFILE profile = NULL; - DWORD_PTR i; - - if (!file) return NULL; - - EnterCriticalSection( &MSCMS_handle_cs ); - - for (i = 0; i <= CMSMAXHANDLES; i++) - { - if (profiletable[i].file == file) - { - profile = (HPROFILE)(i + 1); goto out; - } - } - -out: - LeaveCriticalSection( &MSCMS_handle_cs ); - return profile; -} - -HANDLE MSCMS_hprofile2handle( HPROFILE profile ) -{ - HANDLE file; - DWORD_PTR i; - - EnterCriticalSection( &MSCMS_handle_cs ); - - i = (DWORD_PTR)profile - 1; - file = profiletable[i].file; - - LeaveCriticalSection( &MSCMS_handle_cs ); - return file; -} - -DWORD MSCMS_hprofile2access( HPROFILE profile ) -{ - DWORD access; - DWORD_PTR i; - - EnterCriticalSection( &MSCMS_handle_cs ); - - i = (DWORD_PTR)profile - 1; - access = profiletable[i].access; - - LeaveCriticalSection( &MSCMS_handle_cs ); - return access; -} - -HPROFILE MSCMS_cmsprofile2hprofile( cmsHPROFILE cmsprofile ) -{ - HPROFILE profile = NULL; - DWORD_PTR i; - - if (!cmsprofile) return NULL; - - EnterCriticalSection( &MSCMS_handle_cs ); - - for (i = 0; i <= CMSMAXHANDLES; i++) - { - if (profiletable[i].cmsprofile == cmsprofile) - { - profile = (HPROFILE)(i + 1); goto out; - } - } - -out: - LeaveCriticalSection( &MSCMS_handle_cs ); - return profile; -} - -cmsHPROFILE MSCMS_hprofile2cmsprofile( HPROFILE profile ) -{ - cmsHPROFILE cmsprofile; - DWORD_PTR i; - - EnterCriticalSection( &MSCMS_handle_cs ); - - i = (DWORD_PTR)profile - 1; - cmsprofile = profiletable[i].cmsprofile; - - LeaveCriticalSection( &MSCMS_handle_cs ); - return cmsprofile; -} - -HPROFILE MSCMS_iccprofile2hprofile( const icProfile *iccprofile ) -{ - HPROFILE profile = NULL; - DWORD_PTR i; - - if (!iccprofile) return NULL; - - EnterCriticalSection( &MSCMS_handle_cs ); - - for (i = 0; i <= CMSMAXHANDLES; i++) - { - if (profiletable[i].iccprofile == iccprofile) - { - profile = (HPROFILE)(i + 1); goto out; - } - } - -out: - LeaveCriticalSection( &MSCMS_handle_cs ); - return profile; -} - -icProfile *MSCMS_hprofile2iccprofile( HPROFILE profile ) -{ - icProfile *iccprofile; - DWORD_PTR i; - - EnterCriticalSection( &MSCMS_handle_cs ); - - i = (DWORD_PTR)profile - 1; - iccprofile = profiletable[i].iccprofile; - - LeaveCriticalSection( &MSCMS_handle_cs ); - return iccprofile; -} - -HPROFILE MSCMS_create_hprofile_handle( HANDLE file, icProfile *iccprofile, - cmsHPROFILE cmsprofile, DWORD access ) -{ - HPROFILE profile = NULL; - DWORD_PTR i; - - if (!cmsprofile || !iccprofile) return NULL; - - EnterCriticalSection( &MSCMS_handle_cs ); - - for (i = 0; i <= CMSMAXHANDLES; i++) - { - if (profiletable[i].iccprofile == 0) - { - profiletable[i].file = file; - profiletable[i].access = access; - profiletable[i].iccprofile = iccprofile; - profiletable[i].cmsprofile = cmsprofile; - - profile = (HPROFILE)(i + 1); goto out; - } - } - -out: - LeaveCriticalSection( &MSCMS_handle_cs ); - return profile; -} - -void MSCMS_destroy_hprofile_handle( HPROFILE profile ) -{ - DWORD_PTR i; - - if (profile) - { - EnterCriticalSection( &MSCMS_handle_cs ); - - i = (DWORD_PTR)profile - 1; - memset( &profiletable[i], 0, sizeof(struct profile) ); - - LeaveCriticalSection( &MSCMS_handle_cs ); - } -} - -cmsHTRANSFORM MSCMS_htransform2cmstransform( HTRANSFORM transform ) -{ - cmsHTRANSFORM cmstransform; - DWORD_PTR i; - - EnterCriticalSection( &MSCMS_handle_cs ); - - i = (DWORD_PTR)transform - 1; - cmstransform = transformtable[i].cmstransform; - - LeaveCriticalSection( &MSCMS_handle_cs ); - return cmstransform; -} - -HTRANSFORM MSCMS_create_htransform_handle( cmsHTRANSFORM cmstransform ) -{ - HTRANSFORM transform = NULL; - DWORD_PTR i; - - if (!cmstransform) return NULL; - - EnterCriticalSection( &MSCMS_handle_cs ); - - for (i = 0; i <= CMSMAXHANDLES; i++) - { - if (transformtable[i].cmstransform == 0) - { - transformtable[i].cmstransform = cmstransform; - transform = (HTRANSFORM)(i + 1); goto out; - } - } - -out: - LeaveCriticalSection( &MSCMS_handle_cs ); - return transform; -} - -void MSCMS_destroy_htransform_handle( HTRANSFORM transform ) -{ - DWORD_PTR i; - - if (transform) - { - EnterCriticalSection( &MSCMS_handle_cs ); - - i = (DWORD_PTR)transform - 1; - memset( &transformtable[i], 0, sizeof(struct transform) ); - - LeaveCriticalSection( &MSCMS_handle_cs ); - } -} - -#endif /* HAVE_LCMS */ +/* + * MSCMS - Color Management System for Wine + * + * Copyright 2004, 2005, 2008 Hans Leidekker + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "config.h" +#include "wine/debug.h" + +#include + +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "icm.h" + +#include "mscms_priv.h" + +#ifdef HAVE_LCMS + +static CRITICAL_SECTION MSCMS_handle_cs; +static CRITICAL_SECTION_DEBUG MSCMS_handle_cs_debug = +{ + 0, 0, &MSCMS_handle_cs, + { &MSCMS_handle_cs_debug.ProcessLocksList, + &MSCMS_handle_cs_debug.ProcessLocksList }, + 0, 0, { (DWORD_PTR)(__FILE__ ": MSCMS_handle_cs") } +}; +static CRITICAL_SECTION MSCMS_handle_cs = { &MSCMS_handle_cs_debug, -1, 0, 0, 0, 0 }; + +static struct profile *profiletable; +static struct transform *transformtable; + +static unsigned int num_profile_handles; +static unsigned int num_transform_handles; + +WINE_DEFAULT_DEBUG_CHANNEL(mscms); + +void free_handle_tables( void ) +{ + HeapFree( GetProcessHeap(), 0, profiletable ); + profiletable = NULL; + num_profile_handles = 0; + + HeapFree( GetProcessHeap(), 0, transformtable ); + transformtable = NULL; + num_transform_handles = 0; +} + +struct profile *grab_profile( HPROFILE handle ) +{ + DWORD_PTR index; + + EnterCriticalSection( &MSCMS_handle_cs ); + + index = (DWORD_PTR)handle - 1; + if (index > num_profile_handles) + { + LeaveCriticalSection( &MSCMS_handle_cs ); + return NULL; + } + return &profiletable[index]; +} + +void release_profile( struct profile *profile ) +{ + LeaveCriticalSection( &MSCMS_handle_cs ); +} + +struct transform *grab_transform( HTRANSFORM handle ) +{ + DWORD_PTR index; + + EnterCriticalSection( &MSCMS_handle_cs ); + + index = (DWORD_PTR)handle - 1; + if (index > num_transform_handles) + { + LeaveCriticalSection( &MSCMS_handle_cs ); + return NULL; + } + return &transformtable[index]; +} + +void release_transform( struct transform *transform ) +{ + LeaveCriticalSection( &MSCMS_handle_cs ); +} + +static HPROFILE alloc_profile_handle( void ) +{ + DWORD_PTR index; + struct profile *p; + unsigned int count = 128; + + for (index = 0; index < num_profile_handles; index++) + { + if (!profiletable[index].iccprofile) return (HPROFILE)(index + 1); + } + if (!profiletable) + { + p = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, count * sizeof(struct profile) ); + } + else + { + count = num_profile_handles * 2; + p = HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, profiletable, count * sizeof(struct profile) ); + } + if (!p) return NULL; + + profiletable = p; + num_profile_handles = count; + + return (HPROFILE)(index + 1); +} + +HPROFILE create_profile( struct profile *profile ) +{ + HPROFILE handle; + + EnterCriticalSection( &MSCMS_handle_cs ); + + if ((handle = alloc_profile_handle())) + { + DWORD_PTR index = (DWORD_PTR)handle - 1; + memcpy( &profiletable[index], profile, sizeof(struct profile) ); + } + LeaveCriticalSection( &MSCMS_handle_cs ); + return handle; +} + +BOOL close_profile( HPROFILE handle ) +{ + DWORD_PTR index; + struct profile *profile; + + EnterCriticalSection( &MSCMS_handle_cs ); + + index = (DWORD_PTR)handle - 1; + if (index > num_profile_handles) + { + LeaveCriticalSection( &MSCMS_handle_cs ); + return FALSE; + } + profile = &profiletable[index]; + + if (profile->file != INVALID_HANDLE_VALUE) + { + if (profile->access & PROFILE_READWRITE) + { + DWORD written, size = MSCMS_get_profile_size( profile->iccprofile ); + + if (SetFilePointer( profile->file, 0, NULL, FILE_BEGIN ) || + !WriteFile( profile->file, profile->iccprofile, size, &written, NULL ) || + written != size) + { + ERR( "Unable to write color profile\n" ); + } + } + CloseHandle( profile->file ); + } + cmsCloseProfile( profile->cmsprofile ); + HeapFree( GetProcessHeap(), 0, profile->iccprofile ); + + memset( profile, 0, sizeof(struct profile) ); + + LeaveCriticalSection( &MSCMS_handle_cs ); + return TRUE; +} + +static HTRANSFORM alloc_transform_handle( void ) +{ + DWORD_PTR index; + struct transform *p; + unsigned int count = 128; + + for (index = 0; index < num_transform_handles; index++) + { + if (!transformtable[index].cmstransform) return (HTRANSFORM)(index + 1); + } + if (!transformtable) + { + p = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, count * sizeof(struct transform) ); + } + else + { + count = num_transform_handles * 2; + p = HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, transformtable, count * sizeof(struct transform) ); + } + if (!p) return NULL; + + transformtable = p; + num_transform_handles = count; + + return (HTRANSFORM)(index + 1); +} + +HTRANSFORM create_transform( struct transform *transform ) +{ + HTRANSFORM handle; + + EnterCriticalSection( &MSCMS_handle_cs ); + + if ((handle = alloc_transform_handle())) + { + DWORD_PTR index = (DWORD_PTR)handle - 1; + memcpy( &transformtable[index], transform, sizeof(struct transform) ); + } + LeaveCriticalSection( &MSCMS_handle_cs ); + return handle; +} + +BOOL close_transform( HTRANSFORM handle ) +{ + DWORD_PTR index; + struct transform *transform; + + EnterCriticalSection( &MSCMS_handle_cs ); + + index = (DWORD_PTR)handle - 1; + if (index > num_transform_handles) + { + LeaveCriticalSection( &MSCMS_handle_cs ); + return FALSE; + } + transform = &transformtable[index]; + + cmsDeleteTransform( transform->cmstransform ); + memset( transform, 0, sizeof(struct transform) ); + + LeaveCriticalSection( &MSCMS_handle_cs ); + return TRUE; +} + +#endif /* HAVE_LCMS */ diff --git a/dlls/mscms/mscms_main.c b/dlls/mscms/mscms_main.c index df449b1d935..00e2a753e87 100644 --- a/dlls/mscms/mscms_main.c +++ b/dlls/mscms/mscms_main.c @@ -32,6 +32,8 @@ #include "winuser.h" #include "icm.h" +#include "mscms_priv.h" + WINE_DEFAULT_DEBUG_CHANNEL(mscms); BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) @@ -44,6 +46,9 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) DisableThreadLibraryCalls( hinst ); break; case DLL_PROCESS_DETACH: +#ifdef HAVE_LCMS + free_handle_tables(); +#endif break; } return TRUE; diff --git a/dlls/mscms/mscms_priv.h b/dlls/mscms/mscms_priv.h index 2f9be8bc750..c979ea85fef 100644 --- a/dlls/mscms/mscms_priv.h +++ b/dlls/mscms/mscms_priv.h @@ -66,21 +66,39 @@ #define DWORD DWORD #define LPDWORD LPDWORD -extern DWORD MSCMS_hprofile2access( HPROFILE ); -extern HPROFILE MSCMS_handle2hprofile( HANDLE file ); -extern HPROFILE MSCMS_cmsprofile2hprofile( cmsHPROFILE cmsprofile ); -extern HPROFILE MSCMS_iccprofile2hprofile( const icProfile *iccprofile ); -extern HANDLE MSCMS_hprofile2handle( HPROFILE profile ); -extern cmsHPROFILE MSCMS_hprofile2cmsprofile( HPROFILE profile ); -extern icProfile *MSCMS_hprofile2iccprofile( HPROFILE profile ); - -extern HPROFILE MSCMS_create_hprofile_handle( HANDLE file, icProfile *iccprofile, - cmsHPROFILE cmsprofile, DWORD access ); -extern void MSCMS_destroy_hprofile_handle( HPROFILE profile ); - -extern cmsHTRANSFORM MSCMS_htransform2cmstransform( HTRANSFORM transform ); -extern HTRANSFORM MSCMS_create_htransform_handle( cmsHTRANSFORM cmstransform ); -extern void MSCMS_destroy_htransform_handle( HTRANSFORM transform ); +/* A simple structure to tie together a pointer to an icc profile, an lcms + * color profile handle and a Windows file handle. If the profile is memory + * based the file handle field is set to INVALID_HANDLE_VALUE. The 'access' + * field records the access parameter supplied to an OpenColorProfile() + * call, i.e. PROFILE_READ or PROFILE_READWRITE. + */ + +struct profile +{ + HANDLE file; + DWORD access; + icProfile *iccprofile; + cmsHPROFILE cmsprofile; +}; + +struct transform +{ + cmsHTRANSFORM cmstransform; +}; + +extern HPROFILE create_profile( struct profile * ); +extern BOOL close_profile( HPROFILE ); + +extern HTRANSFORM create_transform( struct transform * ); +extern BOOL close_transform( HTRANSFORM ); + +struct profile *grab_profile( HPROFILE ); +struct transform *grab_transform( HTRANSFORM ); + +void release_profile( struct profile * ); +void release_transform( struct transform * ); + +extern void free_handle_tables( void ); extern DWORD MSCMS_get_tag_count( const icProfile *iccprofile ); extern void MSCMS_get_tag_by_index( icProfile *iccprofile, DWORD index, icTag *tag ); diff --git a/dlls/mscms/profile.c b/dlls/mscms/profile.c index 2fd3e138295..2f9970c3d7c 100644 --- a/dlls/mscms/profile.c +++ b/dlls/mscms/profile.c @@ -333,38 +333,46 @@ BOOL WINAPI GetColorDirectoryW( PCWSTR machine, PWSTR buffer, PDWORD size ) * Success: TRUE * Failure: FALSE */ -BOOL WINAPI GetColorProfileElement( HPROFILE profile, TAGTYPE type, DWORD offset, PDWORD size, +BOOL WINAPI GetColorProfileElement( HPROFILE handle, TAGTYPE type, DWORD offset, PDWORD size, PVOID buffer, PBOOL ref ) { BOOL ret = FALSE; #ifdef HAVE_LCMS - icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile ); + struct profile *profile = grab_profile( handle ); DWORD i, count; icTag tag; - TRACE( "( %p, 0x%08x, %d, %p, %p, %p )\n", profile, type, offset, size, buffer, ref ); + TRACE( "( %p, 0x%08x, %d, %p, %p, %p )\n", handle, type, offset, size, buffer, ref ); - if (!iccprofile || !size || !ref) return FALSE; - count = MSCMS_get_tag_count( iccprofile ); + if (!profile) return FALSE; + + if (!size || !ref) + { + release_profile( profile ); + return FALSE; + } + count = MSCMS_get_tag_count( profile->iccprofile ); for (i = 0; i < count; i++) { - MSCMS_get_tag_by_index( iccprofile, i, &tag ); + MSCMS_get_tag_by_index( profile->iccprofile, i, &tag ); if (tag.sig == type) { if ((tag.size - offset) > *size || !buffer) { *size = (tag.size - offset); + release_profile( profile ); return FALSE; } - - MSCMS_get_tag_data( iccprofile, &tag, offset, buffer ); + MSCMS_get_tag_data( profile->iccprofile, &tag, offset, buffer ); *ref = FALSE; /* FIXME: calculate properly */ + release_profile( profile ); return TRUE; } } + release_profile( profile ); #endif /* HAVE_LCMS */ return ret; @@ -388,24 +396,33 @@ BOOL WINAPI GetColorProfileElement( HPROFILE profile, TAGTYPE type, DWORD offset * The tag table index starts at 1. * Use GetCountColorProfileElements to retrieve a count of tagged elements. */ -BOOL WINAPI GetColorProfileElementTag( HPROFILE profile, DWORD index, PTAGTYPE type ) +BOOL WINAPI GetColorProfileElementTag( HPROFILE handle, DWORD index, PTAGTYPE type ) { BOOL ret = FALSE; #ifdef HAVE_LCMS - icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile ); + struct profile *profile = grab_profile( handle ); DWORD count; icTag tag; - TRACE( "( %p, %d, %p )\n", profile, index, type ); - - if (!iccprofile || !type) return FALSE; + TRACE( "( %p, %d, %p )\n", handle, index, type ); - count = MSCMS_get_tag_count( iccprofile ); - if (index > count || index < 1) return FALSE; + if (!profile) return FALSE; - MSCMS_get_tag_by_index( iccprofile, index - 1, &tag ); + if (!type) + { + release_profile( profile ); + return FALSE; + } + count = MSCMS_get_tag_count( profile->iccprofile ); + if (index > count || index < 1) + { + release_profile( profile ); + return FALSE; + } + MSCMS_get_tag_by_index( profile->iccprofile, index - 1, &tag ); *type = tag.sig; + release_profile( profile ); ret = TRUE; #endif /* HAVE_LCMS */ @@ -430,28 +447,36 @@ BOOL WINAPI GetColorProfileElementTag( HPROFILE profile, DWORD index, PTAGTYPE t * NOTES * The profile returned will be in big-endian format. */ -BOOL WINAPI GetColorProfileFromHandle( HPROFILE profile, PBYTE buffer, PDWORD size ) +BOOL WINAPI GetColorProfileFromHandle( HPROFILE handle, PBYTE buffer, PDWORD size ) { BOOL ret = FALSE; #ifdef HAVE_LCMS - icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile ); + struct profile *profile = grab_profile( handle ); PROFILEHEADER header; - TRACE( "( %p, %p, %p )\n", profile, buffer, size ); + TRACE( "( %p, %p, %p )\n", handle, buffer, size ); - if (!iccprofile || !size) return FALSE; - MSCMS_get_profile_header( iccprofile, &header ); + if (!profile) return FALSE; + + if (!size) + { + release_profile( profile ); + return FALSE; + } + MSCMS_get_profile_header( profile->iccprofile, &header ); if (!buffer || header.phSize > *size) { *size = header.phSize; + release_profile( profile ); return FALSE; } /* No endian conversion needed */ - memcpy( buffer, iccprofile, header.phSize ); - + memcpy( buffer, profile->iccprofile, header.phSize ); *size = header.phSize; + + release_profile( profile ); ret = TRUE; #endif /* HAVE_LCMS */ @@ -474,16 +499,23 @@ BOOL WINAPI GetColorProfileFromHandle( HPROFILE profile, PBYTE buffer, PDWORD si * NOTES * The profile header returned will be adjusted for endianess. */ -BOOL WINAPI GetColorProfileHeader( HPROFILE profile, PPROFILEHEADER header ) +BOOL WINAPI GetColorProfileHeader( HPROFILE handle, PPROFILEHEADER header ) { #ifdef HAVE_LCMS - icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile ); + struct profile *profile = grab_profile( handle ); + + TRACE( "( %p, %p )\n", handle, header ); - TRACE( "( %p, %p )\n", profile, header ); + if (!profile) return FALSE; - if (!iccprofile || !header) return FALSE; + if (!header) + { + release_profile( profile ); + return FALSE; + } + MSCMS_get_profile_header( profile->iccprofile, header ); - MSCMS_get_profile_header( iccprofile, header ); + release_profile( profile ); return TRUE; #else @@ -505,16 +537,24 @@ BOOL WINAPI GetColorProfileHeader( HPROFILE profile, PPROFILEHEADER header ) * Success: TRUE * Failure: FALSE */ -BOOL WINAPI GetCountColorProfileElements( HPROFILE profile, PDWORD count ) +BOOL WINAPI GetCountColorProfileElements( HPROFILE handle, PDWORD count ) { BOOL ret = FALSE; #ifdef HAVE_LCMS - icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile ); + struct profile *profile = grab_profile( handle ); - TRACE( "( %p, %p )\n", profile, count ); + TRACE( "( %p, %p )\n", handle, count ); - if (!iccprofile || !count) return FALSE; - *count = MSCMS_get_tag_count( iccprofile ); + if (!profile) return FALSE; + + if (!count) + { + release_profile( profile ); + return FALSE; + } + *count = MSCMS_get_tag_count( profile->iccprofile ); + + release_profile( profile ); ret = TRUE; #endif /* HAVE_LCMS */ @@ -1113,23 +1153,28 @@ BOOL WINAPI InstallColorProfileW( PCWSTR machine, PCWSTR profile ) * Success: TRUE * Failure: FALSE */ -BOOL WINAPI IsColorProfileTagPresent( HPROFILE profile, TAGTYPE type, PBOOL present ) +BOOL WINAPI IsColorProfileTagPresent( HPROFILE handle, TAGTYPE type, PBOOL present ) { BOOL ret = FALSE; #ifdef HAVE_LCMS - icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile ); + struct profile *profile = grab_profile( handle ); DWORD i, count; icTag tag; - TRACE( "( %p, 0x%08x, %p )\n", profile, type, present ); + TRACE( "( %p, 0x%08x, %p )\n", handle, type, present ); - if (!iccprofile || !present) return FALSE; + if (!profile) return FALSE; - count = MSCMS_get_tag_count( iccprofile ); + if (!present) + { + release_profile( profile ); + return FALSE; + } + count = MSCMS_get_tag_count( profile->iccprofile ); for (i = 0; i < count; i++) { - MSCMS_get_tag_by_index( iccprofile, i, &tag ); + MSCMS_get_tag_by_index( profile->iccprofile, i, &tag ); if (tag.sig == type) { @@ -1137,6 +1182,7 @@ BOOL WINAPI IsColorProfileTagPresent( HPROFILE profile, TAGTYPE type, PBOOL pres break; } } + release_profile( profile ); #endif /* HAVE_LCMS */ return ret; @@ -1156,16 +1202,23 @@ BOOL WINAPI IsColorProfileTagPresent( HPROFILE profile, TAGTYPE type, PBOOL pres * Success: TRUE * Failure: FALSE */ -BOOL WINAPI IsColorProfileValid( HPROFILE profile, PBOOL valid ) +BOOL WINAPI IsColorProfileValid( HPROFILE handle, PBOOL valid ) { BOOL ret = FALSE; #ifdef HAVE_LCMS - icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile ); + struct profile *profile = grab_profile( handle ); + + TRACE( "( %p, %p )\n", handle, valid ); - TRACE( "( %p, %p )\n", profile, valid ); + if (!profile) return FALSE; - if (!valid) return FALSE; - if (iccprofile) return *valid = TRUE; + if (!valid) + { + release_profile( profile ); + return FALSE; + } + if (profile->iccprofile) ret = *valid = TRUE; + release_profile( profile ); #endif /* HAVE_LCMS */ return ret; @@ -1188,34 +1241,44 @@ BOOL WINAPI IsColorProfileValid( HPROFILE profile, PBOOL valid ) * Success: TRUE * Failure: FALSE */ -BOOL WINAPI SetColorProfileElement( HPROFILE profile, TAGTYPE type, DWORD offset, PDWORD size, +BOOL WINAPI SetColorProfileElement( HPROFILE handle, TAGTYPE type, DWORD offset, PDWORD size, PVOID buffer ) { BOOL ret = FALSE; #ifdef HAVE_LCMS - icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile ); - DWORD i, count, access = MSCMS_hprofile2access( profile ); + struct profile *profile = grab_profile( handle ); + DWORD i, count; icTag tag; - TRACE( "( %p, 0x%08x, %d, %p, %p )\n", profile, type, offset, size, buffer ); + TRACE( "( %p, 0x%08x, %d, %p, %p )\n", handle, type, offset, size, buffer ); - if (!iccprofile || !size || !buffer) return FALSE; - if (!(access & PROFILE_READWRITE)) return FALSE; + if (!profile) return FALSE; - count = MSCMS_get_tag_count( iccprofile ); + if (!size || !buffer || !(profile->access & PROFILE_READWRITE)) + { + release_profile( profile ); + return FALSE; + } + count = MSCMS_get_tag_count( profile->iccprofile ); for (i = 0; i < count; i++) { - MSCMS_get_tag_by_index( iccprofile, i, &tag ); + MSCMS_get_tag_by_index( profile->iccprofile, i, &tag ); if (tag.sig == type) { - if (offset > tag.size) return FALSE; + if (offset > tag.size) + { + release_profile( profile ); + return FALSE; + } + MSCMS_set_tag_data( profile->iccprofile, &tag, offset, buffer ); - MSCMS_set_tag_data( iccprofile, &tag, offset, buffer ); + release_profile( profile ); return TRUE; } } + release_profile( profile ); #endif /* HAVE_LCMS */ return ret; @@ -1234,18 +1297,23 @@ BOOL WINAPI SetColorProfileElement( HPROFILE profile, TAGTYPE type, DWORD offset * Success: TRUE * Failure: FALSE */ -BOOL WINAPI SetColorProfileHeader( HPROFILE profile, PPROFILEHEADER header ) +BOOL WINAPI SetColorProfileHeader( HPROFILE handle, PPROFILEHEADER header ) { #ifdef HAVE_LCMS - icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile ); - DWORD access = MSCMS_hprofile2access( profile ); + struct profile *profile = grab_profile( handle ); - TRACE( "( %p, %p )\n", profile, header ); + TRACE( "( %p, %p )\n", handle, header ); - if (!iccprofile || !header) return FALSE; - if (!(access & PROFILE_READWRITE)) return FALSE; + if (!profile) return FALSE; - MSCMS_set_profile_header( iccprofile, header ); + if (!header || !(profile->access & PROFILE_READWRITE)) + { + release_profile( profile ); + return FALSE; + } + MSCMS_set_profile_header( profile->iccprofile, header ); + + release_profile( profile ); return TRUE; #else @@ -1441,7 +1509,16 @@ HPROFILE WINAPI OpenColorProfileW( PPROFILE profile, DWORD access, DWORD sharing } if (cmsprofile) - return MSCMS_create_hprofile_handle( handle, iccprofile, cmsprofile, access ); + { + struct profile profile; + + profile.file = handle; + profile.access = access; + profile.iccprofile = iccprofile; + profile.cmsprofile = cmsprofile; + + return create_profile( &profile ); + } #endif /* HAVE_LCMS */ return NULL; @@ -1463,30 +1540,9 @@ BOOL WINAPI CloseColorProfile( HPROFILE profile ) { BOOL ret = FALSE; #ifdef HAVE_LCMS - icProfile *iccprofile = MSCMS_hprofile2iccprofile( profile ); - HANDLE file = MSCMS_hprofile2handle( profile ); - DWORD access = MSCMS_hprofile2access( profile ); TRACE( "( %p )\n", profile ); - - if (file != INVALID_HANDLE_VALUE) - { - if (access & PROFILE_READWRITE) - { - DWORD written, size = MSCMS_get_profile_size( iccprofile ); - - if (SetFilePointer( file, 0, NULL, FILE_BEGIN ) || - !WriteFile( file, iccprofile, size, &written, NULL ) || written != size) - { - ERR( "Unable to write color profile\n" ); - } - } - CloseHandle( file ); - } - ret = cmsCloseProfile( MSCMS_hprofile2cmsprofile( profile ) ); - HeapFree( GetProcessHeap(), 0, iccprofile ); - - MSCMS_destroy_hprofile_handle( profile ); + ret = close_profile( profile ); #endif /* HAVE_LCMS */ return ret; diff --git a/dlls/mscms/transform.c b/dlls/mscms/transform.c index ec33a1086bb..2ed65d13d7a 100644 --- a/dlls/mscms/transform.c +++ b/dlls/mscms/transform.c @@ -135,15 +135,21 @@ HTRANSFORM WINAPI CreateColorTransformW( LPLOGCOLORSPACEW space, HPROFILE dest, { HTRANSFORM ret = NULL; #ifdef HAVE_LCMS - cmsHTRANSFORM cmstransform; + struct transform transform; + struct profile *dst, *tgt = NULL; cmsHPROFILE cmsinput, cmsoutput, cmstarget = NULL; DWORD in_format, out_format, proofing = 0; int intent; TRACE( "( %p, %p, %p, 0x%08x )\n", space, dest, target, flags ); - if (!space || !dest) return FALSE; + if (!space || !(dst = grab_profile( dest ))) return FALSE; + if (target && !(tgt = grab_profile( target ))) + { + release_profile( dst ); + return FALSE; + } intent = space->lcsIntent > 3 ? INTENT_PERCEPTUAL : space->lcsIntent; TRACE( "lcsIntent: %x\n", space->lcsIntent ); @@ -157,13 +163,16 @@ HTRANSFORM WINAPI CreateColorTransformW( LPLOGCOLORSPACEW space, HPROFILE dest, if (target) { proofing = cmsFLAGS_SOFTPROOFING; - cmstarget = MSCMS_hprofile2cmsprofile( target ); + cmstarget = tgt->cmsprofile; } - cmsoutput = MSCMS_hprofile2cmsprofile( dest ); - cmstransform = cmsCreateProofingTransform(cmsinput, in_format, cmsoutput, out_format, cmstarget, - intent, INTENT_ABSOLUTE_COLORIMETRIC, proofing); + cmsoutput = dst->cmsprofile; + transform.cmstransform = cmsCreateProofingTransform(cmsinput, in_format, cmsoutput, out_format, cmstarget, + intent, INTENT_ABSOLUTE_COLORIMETRIC, proofing); - ret = MSCMS_create_htransform_handle( cmstransform ); + ret = create_transform( &transform ); + + if (tgt) release_profile( tgt ); + release_profile( dst ); #endif /* HAVE_LCMS */ return ret; @@ -191,7 +200,8 @@ HTRANSFORM WINAPI CreateMultiProfileTransform( PHPROFILE profiles, DWORD nprofil HTRANSFORM ret = NULL; #ifdef HAVE_LCMS cmsHPROFILE *cmsprofiles, cmsconvert = NULL; - cmsHTRANSFORM cmstransform; + struct transform transform; + struct profile *profile0, *profile1; DWORD in_format, out_format; TRACE( "( %p, 0x%08x, %p, 0x%08x, 0x%08x, 0x%08x )\n", @@ -205,6 +215,14 @@ HTRANSFORM WINAPI CreateMultiProfileTransform( PHPROFILE profiles, DWORD nprofil return NULL; } + profile0 = grab_profile( profiles[0] ); + if (!profile0) return NULL; + profile1 = grab_profile( profiles[1] ); + if (!profile1) + { + release_profile( profile0 ); + return NULL; + } in_format = from_profile( profiles[0] ); out_format = from_profile( profiles[nprofiles - 1] ); @@ -218,23 +236,26 @@ HTRANSFORM WINAPI CreateMultiProfileTransform( PHPROFILE profiles, DWORD nprofil cmsprofiles = HeapAlloc( GetProcessHeap(), 0, (nprofiles + 1) * sizeof(cmsHPROFILE *) ); if (cmsprofiles) { - cmsprofiles[0] = MSCMS_hprofile2cmsprofile( profiles[0] ); + cmsprofiles[0] = profile0->cmsprofile; if (cmsconvert) { cmsprofiles[1] = cmsconvert; - cmsprofiles[2] = MSCMS_hprofile2cmsprofile( profiles[1] ); + cmsprofiles[2] = profile1->cmsprofile; nprofiles++; } else { - cmsprofiles[1] = MSCMS_hprofile2cmsprofile( profiles[1] ); + cmsprofiles[1] = profile1->cmsprofile; } - cmstransform = cmsCreateMultiprofileTransform( cmsprofiles, nprofiles, in_format, out_format, *intents, 0 ); + transform.cmstransform = cmsCreateMultiprofileTransform( cmsprofiles, nprofiles, in_format, out_format, *intents, 0 ); HeapFree( GetProcessHeap(), 0, cmsprofiles ); - ret = MSCMS_create_htransform_handle( cmstransform ); + ret = create_transform( &transform ); } + release_profile( profile0 ); + release_profile( profile1 ); + #endif /* HAVE_LCMS */ return ret; } @@ -251,19 +272,14 @@ HTRANSFORM WINAPI CreateMultiProfileTransform( PHPROFILE profiles, DWORD nprofil * Success: TRUE * Failure: FALSE */ -BOOL WINAPI DeleteColorTransform( HTRANSFORM transform ) +BOOL WINAPI DeleteColorTransform( HTRANSFORM handle ) { BOOL ret = FALSE; #ifdef HAVE_LCMS - cmsHTRANSFORM cmstransform; - TRACE( "( %p )\n", transform ); + TRACE( "( %p )\n", handle ); - cmstransform = MSCMS_htransform2cmstransform( transform ); - cmsDeleteTransform( cmstransform ); - - MSCMS_destroy_htransform_handle( transform ); - ret = TRUE; + ret = close_transform( handle ); #endif /* HAVE_LCMS */ return ret; @@ -291,22 +307,23 @@ BOOL WINAPI DeleteColorTransform( HTRANSFORM transform ) * Success: TRUE * Failure: FALSE */ -BOOL WINAPI TranslateBitmapBits( HTRANSFORM transform, PVOID srcbits, BMFORMAT input, +BOOL WINAPI TranslateBitmapBits( HTRANSFORM handle, PVOID srcbits, BMFORMAT input, DWORD width, DWORD height, DWORD inputstride, PVOID destbits, BMFORMAT output, DWORD outputstride, PBMCALLBACKFN callback, ULONG data ) { BOOL ret = FALSE; #ifdef HAVE_LCMS - cmsHTRANSFORM cmstransform; + struct transform *transform = grab_transform( handle ); TRACE( "( %p, %p, 0x%08x, 0x%08x, 0x%08x, 0x%08x, %p, 0x%08x, 0x%08x, %p, 0x%08x )\n", - transform, srcbits, input, width, height, inputstride, destbits, output, + handle, srcbits, input, width, height, inputstride, destbits, output, outputstride, callback, data ); - cmstransform = MSCMS_htransform2cmstransform( transform ); - cmsChangeBuffersFormat( cmstransform, from_bmformat(input), from_bmformat(output) ); + if (!transform) return FALSE; + cmsChangeBuffersFormat( transform->cmstransform, from_bmformat(input), from_bmformat(output) ); - cmsDoTransform( cmstransform, srcbits, destbits, width * height ); + cmsDoTransform( transform->cmstransform, srcbits, destbits, width * height ); + release_transform( transform ); ret = TRUE; #endif /* HAVE_LCMS */ @@ -330,16 +347,20 @@ BOOL WINAPI TranslateBitmapBits( HTRANSFORM transform, PVOID srcbits, BMFORMAT i * Success: TRUE * Failure: FALSE */ -BOOL WINAPI TranslateColors( HTRANSFORM transform, PCOLOR in, DWORD count, +BOOL WINAPI TranslateColors( HTRANSFORM handle, PCOLOR in, DWORD count, COLORTYPE input_type, PCOLOR out, COLORTYPE output_type ) { BOOL ret = FALSE; #ifdef HAVE_LCMS - cmsHTRANSFORM xfrm = MSCMS_htransform2cmstransform( transform ); + struct transform *transform = grab_transform( handle ); + cmsHTRANSFORM xfrm; unsigned int i; - TRACE( "( %p, %p, %d, %d, %p, %d )\n", transform, in, count, input_type, out, output_type ); + TRACE( "( %p, %p, %d, %d, %p, %d )\n", handle, in, count, input_type, out, output_type ); + + if (!transform) return FALSE; + xfrm = transform->cmstransform; cmsChangeBuffersFormat( xfrm, from_type(input_type), from_type(output_type) ); switch (input_type) @@ -418,6 +439,7 @@ BOOL WINAPI TranslateColors( HTRANSFORM transform, PCOLOR in, DWORD count, FIXME("unhandled input/output pair: %d/%d\n", input_type, output_type); break; } + release_transform( transform ); #endif /* HAVE_LCMS */ return ret; diff --git a/dlls/mscoree/mscoree.spec b/dlls/mscoree/mscoree.spec index 8a1e1f827ab..34defdcac4c 100644 --- a/dlls/mscoree/mscoree.spec +++ b/dlls/mscoree/mscoree.spec @@ -72,6 +72,16 @@ @ stdcall LoadStringRCEx(long long ptr long long ptr) @ stub LockClrVersion @ stub MetaDataGetDispenser +@ stdcall ND_CopyObjDst(ptr ptr long long) +@ stdcall ND_CopyObjSrc(ptr long ptr long) +@ stdcall ND_RI2(ptr long) +@ stdcall ND_RI4(ptr long) +@ stdcall -ret64 ND_RI8(ptr long) +@ stdcall ND_RU1(ptr long) +@ stdcall ND_WI2(ptr long long) +@ stdcall ND_WI4(ptr long long) +@ stdcall ND_WI8(ptr long long long) +@ stdcall ND_WU1(ptr long long) @ stub OpenCtrs @ stub ReOpenMetaDataWithMemoryEx @ stub RunDll@ShimW diff --git a/dlls/mscoree/mscoree_main.c b/dlls/mscoree/mscoree_main.c index 709359099bd..6f850f28c70 100644 --- a/dlls/mscoree/mscoree_main.c +++ b/dlls/mscoree/mscoree_main.c @@ -320,3 +320,53 @@ HRESULT WINAPI DllCanUnloadNow(VOID) FIXME("stub\n"); return S_OK; } + +INT WINAPI ND_RU1( const void *ptr, INT offset ) +{ + return *((const BYTE *)ptr + offset); +} + +INT WINAPI ND_RI2( const void *ptr, INT offset ) +{ + return *(const SHORT *)((const BYTE *)ptr + offset); +} + +INT WINAPI ND_RI4( const void *ptr, INT offset ) +{ + return *(const INT *)((const BYTE *)ptr + offset); +} + +INT64 WINAPI ND_RI8( const void *ptr, INT offset ) +{ + return *(const INT64 *)((const BYTE *)ptr + offset); +} + +void WINAPI ND_WU1( void *ptr, INT offset, BYTE val ) +{ + *((BYTE *)ptr + offset) = val; +} + +void WINAPI ND_WI2( void *ptr, INT offset, SHORT val ) +{ + *(SHORT *)((BYTE *)ptr + offset) = val; +} + +void WINAPI ND_WI4( void *ptr, INT offset, INT val ) +{ + *(INT *)((BYTE *)ptr + offset) = val; +} + +void WINAPI ND_WI8( void *ptr, INT offset, INT64 val ) +{ + *(INT64 *)((BYTE *)ptr + offset) = val; +} + +void WINAPI ND_CopyObjDst( const void *src, void *dst, INT offset, INT size ) +{ + memcpy( (BYTE *)dst + offset, src, size ); +} + +void WINAPI ND_CopyObjSrc( const void *src, INT offset, void *dst, INT size ) +{ + memcpy( dst, (const BYTE *)src + offset, size ); +} diff --git a/dlls/mshtml/De.rc b/dlls/mshtml/De.rc index 5c15b9002c3..f9b55140c6a 100644 --- a/dlls/mshtml/De.rc +++ b/dlls/mshtml/De.rc @@ -42,3 +42,17 @@ FONT 8, "MS Shell Dlg" DEFPUSHBUTTON "&Installieren", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP PUSHBUTTON "&Abbrechen", IDCANCEL, 140, 70, 50, 15, WS_GROUP | WS_TABSTOP } + +IDD_HYPERLINK DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 250, 65 +STYLE DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Hyperlink" +FONT 8, "MS Shell Dlg" +{ + GROUPBOX "Hyperlink Informationen", IDC_STATIC, 5, 5, 190, 55 + LTEXT "&Typ:", IDC_STATIC, 10, 22, 20, 10 + COMBOBOX IDC_TYPE, 35, 20, 45, 100, WS_TABSTOP | WS_GROUP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS + LTEXT "&URL:", IDC_STATIC, 10, 42, 20, 10 + EDITTEXT IDC_URL, 35, 40, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP + PUSHBUTTON "OK", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Abbrechen", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP +} diff --git a/dlls/mshtml/Makefile.in b/dlls/mshtml/Makefile.in index 8cf0b8723bd..0eee1897053 100644 --- a/dlls/mshtml/Makefile.in +++ b/dlls/mshtml/Makefile.in @@ -20,6 +20,7 @@ C_SRCS = \ htmlelem.c \ htmlelem2.c \ htmlinput.c \ + htmllocation.c \ htmlnode.c \ htmloption.c \ htmlscript.c \ @@ -43,6 +44,7 @@ C_SRCS = \ olewnd.c \ persist.c \ protocol.c \ + script.c \ selection.c \ service.c \ task.c \ diff --git a/dlls/mshtml/editor.c b/dlls/mshtml/editor.c index 057ac2493f9..12f2c35107c 100644 --- a/dlls/mshtml/editor.c +++ b/dlls/mshtml/editor.c @@ -559,7 +559,6 @@ static HRESULT exec_fontname(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, if(in) { char *stra; - DWORD len; if(V_VT(in) != VT_BSTR) { FIXME("Unsupported vt=%d\n", V_VT(out)); @@ -568,12 +567,8 @@ static HRESULT exec_fontname(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in, TRACE("%s\n", debugstr_w(V_BSTR(in))); - len = WideCharToMultiByte(CP_ACP, 0, V_BSTR(in), -1, NULL, 0, NULL, NULL); - stra = heap_alloc(len); - WideCharToMultiByte(CP_ACP, 0, V_BSTR(in), -1, stra, -1, NULL, NULL); - + stra = heap_strdupWtoA(V_BSTR(in)); set_ns_fontname(This->nscontainer, stra); - heap_free(stra); update_doc(This, UPDATE_UI); diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index b93fe95b63d..92a7f9aab78 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -159,6 +159,7 @@ static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface) if(!ref) { remove_doc_tasks(This); + release_script_hosts(This); if(This->client) IOleObject_SetClientSite(OLEOBJ(This), NULL); @@ -182,6 +183,9 @@ static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface) IHTMLOptionElementFactory_Release(HTMLOPTFACTORY(This->option_factory)); } + if(This->location) + This->location->doc = NULL; + if(This->window) IHTMLWindow2_Release(HTMLWINDOW2(This->window)); @@ -536,8 +540,17 @@ static HRESULT WINAPI HTMLDocument_get_referrer(IHTMLDocument2 *iface, BSTR *p) static HRESULT WINAPI HTMLDocument_get_location(IHTMLDocument2 *iface, IHTMLLocation **p) { - FIXME("(%p)->(%p)\n", iface, p); - return E_NOTIMPL; + HTMLDocument *This = HTMLDOC_THIS(iface); + + TRACE("(%p)->(%p)\n", This, p); + + if(This->location) + IHTMLLocation_AddRef(HTMLLOCATION(This->location)); + else + This->location = HTMLLocation_Create(This); + + *p = HTMLLOCATION(This->location); + return S_OK; } static HRESULT WINAPI HTMLDocument_get_lastModified(IHTMLDocument2 *iface, BSTR *p) @@ -1246,16 +1259,13 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject) TRACE("(%p %s %p)\n", pUnkOuter, debugstr_guid(riid), ppvObject); - ret = heap_alloc(sizeof(HTMLDocument)); + ret = heap_alloc_zero(sizeof(HTMLDocument)); ret->lpHTMLDocument2Vtbl = &HTMLDocumentVtbl; ret->ref = 0; - ret->nscontainer = NULL; - ret->nodes = NULL; ret->readystate = READYSTATE_UNINITIALIZED; - ret->window = NULL; - ret->option_factory = NULL; list_init(&ret->bindings); + list_init(&ret->script_hosts); list_init(&ret->selection_list); list_init(&ret->range_list); diff --git a/dlls/mshtml/htmllocation.c b/dlls/mshtml/htmllocation.c new file mode 100644 index 00000000000..b05a2a9c83c --- /dev/null +++ b/dlls/mshtml/htmllocation.c @@ -0,0 +1,311 @@ +/* + * Copyright 2008 Jacek Caban 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 + */ + +#include "config.h" + +#include +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winnls.h" +#include "ole2.h" + +#include "wine/debug.h" + +#include "mshtml_private.h" +#include "resource.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mshtml); + +#define HTMLLOCATION_THIS(iface) DEFINE_THIS(HTMLLocation, HTMLLocation, iface) + +static struct list window_list = LIST_INIT(window_list); + +static HRESULT WINAPI HTMLLocation_QueryInterface(IHTMLLocation *iface, REFIID riid, void **ppv) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = HTMLLOCATION(This); + }else if(IsEqualGUID(&IID_IDispatch, riid)) { + TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); + *ppv = HTMLLOCATION(This); + }else if(IsEqualGUID(&IID_IHTMLLocation, riid)) { + TRACE("(%p)->(IID_IHTMLLocation %p)\n", This, ppv); + *ppv = HTMLLOCATION(This); + } + + if(*ppv) { + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; + } + + WARN("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + return E_NOINTERFACE; +} + +static ULONG WINAPI HTMLLocation_AddRef(IHTMLLocation *iface) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; +} + +static ULONG WINAPI HTMLLocation_Release(IHTMLLocation *iface) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) { + if(This->doc && This->doc->location == This) + This->doc->location = NULL; + heap_free(This); + } + + return ref; +} + +static HRESULT WINAPI HTMLLocation_GetTypeInfoCount(IHTMLLocation *iface, UINT *pctinfo) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%p)\n", This, pctinfo); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_GetTypeInfo(IHTMLLocation *iface, UINT iTInfo, + LCID lcid, ITypeInfo **ppTInfo) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_GetIDsOfNames(IHTMLLocation *iface, REFIID riid, + LPOLESTR *rgszNames, UINT cNames, + LCID lcid, DISPID *rgDispId) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, + lcid, rgDispId); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_Invoke(IHTMLLocation *iface, DISPID dispIdMember, + REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, + VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), + lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_put_href(IHTMLLocation *iface, BSTR v) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_get_href(IHTMLLocation *iface, BSTR *p) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_put_protocol(IHTMLLocation *iface, BSTR v) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_get_protocol(IHTMLLocation *iface, BSTR *p) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_put_host(IHTMLLocation *iface, BSTR v) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_get_host(IHTMLLocation *iface, BSTR *p) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_put_hostname(IHTMLLocation *iface, BSTR v) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_get_hostname(IHTMLLocation *iface, BSTR *p) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_put_port(IHTMLLocation *iface, BSTR v) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_get_port(IHTMLLocation *iface, BSTR *p) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_put_pathname(IHTMLLocation *iface, BSTR v) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_get_pathname(IHTMLLocation *iface, BSTR *p) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_put_search(IHTMLLocation *iface, BSTR v) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_get_search(IHTMLLocation *iface, BSTR *p) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_put_hash(IHTMLLocation *iface, BSTR v) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(v)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_get_hash(IHTMLLocation *iface, BSTR *p) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%p)\n", This, p); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_reload(IHTMLLocation *iface, VARIANT_BOOL flag) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%x)\n", This, flag); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_replace(IHTMLLocation *iface, BSTR bstr) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(bstr)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_assign(IHTMLLocation *iface, BSTR bstr) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%s)\n", This, debugstr_w(bstr)); + return E_NOTIMPL; +} + +static HRESULT WINAPI HTMLLocation_toString(IHTMLLocation *iface, BSTR *String) +{ + HTMLLocation *This = HTMLLOCATION_THIS(iface); + FIXME("(%p)->(%p)\n", This, String); + return E_NOTIMPL; +} + +#undef HTMLLOCATION_THIS + +static const IHTMLLocationVtbl HTMLLocationVtbl = { + HTMLLocation_QueryInterface, + HTMLLocation_AddRef, + HTMLLocation_Release, + HTMLLocation_GetTypeInfoCount, + HTMLLocation_GetTypeInfo, + HTMLLocation_GetIDsOfNames, + HTMLLocation_Invoke, + HTMLLocation_put_href, + HTMLLocation_get_href, + HTMLLocation_put_protocol, + HTMLLocation_get_protocol, + HTMLLocation_put_host, + HTMLLocation_get_host, + HTMLLocation_put_hostname, + HTMLLocation_get_hostname, + HTMLLocation_put_port, + HTMLLocation_get_port, + HTMLLocation_put_pathname, + HTMLLocation_get_pathname, + HTMLLocation_put_search, + HTMLLocation_get_search, + HTMLLocation_put_hash, + HTMLLocation_get_hash, + HTMLLocation_reload, + HTMLLocation_replace, + HTMLLocation_assign, + HTMLLocation_toString +}; + +HTMLLocation *HTMLLocation_Create(HTMLDocument *doc) +{ + HTMLLocation *ret = heap_alloc(sizeof(*ret)); + + ret->lpHTMLLocationVtbl = &HTMLLocationVtbl; + ret->ref = 1; + ret->doc = doc; + + return ret; +} diff --git a/dlls/mshtml/install.c b/dlls/mshtml/install.c index fd362907297..edb5f58e75c 100644 --- a/dlls/mshtml/install.c +++ b/dlls/mshtml/install.c @@ -135,7 +135,7 @@ static BOOL install_cab(LPCWSTR file_name) char install_dir[MAX_PATH]; HRESULT (WINAPI *pExtractFilesA)(LPCSTR,LPCSTR,DWORD,LPCSTR,LPVOID,DWORD); LPSTR file_name_a; - DWORD res, len; + DWORD res; HRESULT hres; static const WCHAR wszAdvpack[] = {'a','d','v','p','a','c','k','.','d','l','l',0}; @@ -160,11 +160,8 @@ static BOOL install_cab(LPCWSTR file_name) advpack = LoadLibraryW(wszAdvpack); pExtractFilesA = (void *)GetProcAddress(advpack, "ExtractFiles"); - len = WideCharToMultiByte(CP_ACP, 0, file_name, -1, NULL, 0, NULL, NULL); - file_name_a = heap_alloc(len); - WideCharToMultiByte(CP_ACP, 0, file_name, -1, file_name_a, -1, NULL, NULL); - /* FIXME: Use unicode version (not yet implemented) */ + file_name_a = heap_strdupWtoA(file_name); hres = pExtractFilesA(file_name_a, install_dir, 0, NULL, NULL, 0); FreeLibrary(advpack); heap_free(file_name_a); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index fa6798a0c2b..6d44f32d7b5 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -98,6 +98,14 @@ struct ConnectionPoint { }; typedef struct { + const IHTMLLocationVtbl *lpHTMLLocationVtbl; + + LONG ref; + + HTMLDocument *doc; +} HTMLLocation; + +typedef struct { const IHTMLOptionElementFactoryVtbl *lpHTMLOptionElementFactoryVtbl; LONG ref; @@ -144,6 +152,8 @@ struct HTMLDocument { LPOLESTR url; struct list bindings; + struct list script_hosts; + HWND hwnd; HWND tooltips_hwnd; @@ -167,6 +177,7 @@ struct HTMLDocument { ConnectionPoint cp_propnotif; HTMLOptionElementFactory *option_factory; + HTMLLocation *location; struct list selection_list; struct list range_list; @@ -230,7 +241,7 @@ typedef struct { nsIInterfaceRequestor *notif_callback; nsLoadFlags load_flags; nsIURI *original_uri; - char *content; + char *content_type; char *charset; } nsChannel; @@ -321,6 +332,7 @@ typedef struct { #define HTMLTEXTCONT(x) ((IHTMLTextContainer*) &(x)->lpHTMLTextContainerVtbl) #define HTMLOPTFACTORY(x) ((IHTMLOptionElementFactory*) &(x)->lpHTMLOptionElementFactoryVtbl) +#define HTMLLOCATION(x) ((IHTMLLocation*) &(x)->lpHTMLLocationVtbl) #define DEFINE_THIS2(cls,ifc,iface) ((cls*)((BYTE*)(iface)-offsetof(cls,ifc))) #define DEFINE_THIS(cls,ifc,iface) DEFINE_THIS2(cls,lp ## ifc ## Vtbl,iface) @@ -331,6 +343,7 @@ HRESULT HTMLLoadOptions_Create(IUnknown*,REFIID,void**); HTMLWindow *HTMLWindow_Create(HTMLDocument*); HTMLWindow *nswindow_to_window(const nsIDOMWindow*); HTMLOptionElementFactory *HTMLOptionElementFactory_Create(HTMLDocument*); +HTMLLocation *HTMLLocation_Create(HTMLDocument*); void setup_nswindow(HTMLWindow*); void HTMLDocument_HTMLDocument3_Init(HTMLDocument*); @@ -436,6 +449,9 @@ void HTMLElement_destructor(HTMLDOMNode*); HTMLDOMNode *get_node(HTMLDocument*,nsIDOMNode*); void release_nodes(HTMLDocument*); +void release_script_hosts(HTMLDocument*); +void doc_insert_script(HTMLDocument*,nsIDOMHTMLScriptElement*); + IHTMLElementCollection *create_all_collection(HTMLDOMNode*); /* commands */ @@ -552,6 +568,21 @@ static inline LPWSTR heap_strdupW(LPCWSTR str) return ret; } +static inline char *heap_strdupA(const char *str) +{ + char *ret = NULL; + + if(str) { + DWORD size; + + size = strlen(str)+1; + ret = heap_alloc(size); + memcpy(ret, str, size); + } + + return ret; +} + static inline WCHAR *heap_strdupAtoW(const char *str) { LPWSTR ret = NULL; @@ -561,7 +592,20 @@ static inline WCHAR *heap_strdupAtoW(const char *str) len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); ret = heap_alloc(len*sizeof(WCHAR)); - MultiByteToWideChar(CP_ACP, 0, str, -1, ret, -1); + MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len); + } + + return ret; +} + +static inline char *heap_strdupWtoA(LPCWSTR str) +{ + char *ret = NULL; + + if(str) { + DWORD size = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL); + ret = heap_alloc(size); + WideCharToMultiByte(CP_ACP, 0, str, -1, ret, size, NULL, NULL); } return ret; diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index a0dc67f0682..8ae064c5d06 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -884,17 +884,12 @@ static HRESULT nsChannelBSC_on_progress(BSCallback *bsc, ULONG status_code, LPCW nsChannelBSC *This = NSCHANNELBSC_THIS(bsc); switch(status_code) { - case BINDSTATUS_MIMETYPEAVAILABLE: { - int len; - + case BINDSTATUS_MIMETYPEAVAILABLE: if(!This->nschannel) return S_OK; - heap_free(This->nschannel->content); - len = WideCharToMultiByte(CP_ACP, 0, status_text, -1, NULL, 0, NULL, NULL); - This->nschannel->content = heap_alloc(len*sizeof(WCHAR)); - WideCharToMultiByte(CP_ACP, 0, status_text, -1, This->nschannel->content, -1, NULL, NULL); - } + heap_free(This->nschannel->content_type); + This->nschannel->content_type = heap_strdupWtoA(status_text); } return S_OK; @@ -958,10 +953,8 @@ HRESULT channelbsc_load_stream(nsChannelBSC *bscallback, IStream *stream) add_nsrequest(bscallback); - if(bscallback->nschannel) { - bscallback->nschannel->content = heap_alloc(sizeof(text_html)); - memcpy(bscallback->nschannel->content, text_html, sizeof(text_html)); - } + if(bscallback->nschannel) + bscallback->nschannel->content_type = heap_strdupA(text_html); hres = read_stream_data(bscallback, stream); IBindStatusCallback_OnStopBinding(STATUSCLB(&bscallback->bsc), hres, ERROR_SUCCESS); diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c index ccec4242aa1..2fb5ab0bd08 100644 --- a/dlls/mshtml/nsevents.c +++ b/dlls/mshtml/nsevents.c @@ -161,6 +161,31 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event return NS_OK; } +static nsresult NSAPI handle_node_insert(nsIDOMEventListener *iface, nsIDOMEvent *event) +{ + NSContainer *This = NSEVENTLIST_THIS(iface)->This; + nsIDOMHTMLScriptElement *script; + nsIDOMEventTarget *target; + nsresult nsres; + + TRACE("(%p %p)\n", This, event); + + nsres = nsIDOMEvent_GetTarget(event, &target); + if(NS_FAILED(nsres)) { + ERR("GetTarget failed: %08x\n", nsres); + return nsres; + } + + nsres = nsISupports_QueryInterface(target, &IID_nsIDOMHTMLScriptElement, (void**)&script); + if(SUCCEEDED(nsres)) { + doc_insert_script(This->doc, script); + nsIDOMHTMLScriptElement_Release(script); + } + + nsIDOMEventTarget_Release(target); + return NS_OK; +} + #undef NSEVENTLIST_THIS #define EVENTLISTENER_VTBL(handler) \ @@ -175,6 +200,7 @@ static const nsIDOMEventListenerVtbl blur_vtbl = EVENTLISTENER_VTBL(handle_ static const nsIDOMEventListenerVtbl focus_vtbl = EVENTLISTENER_VTBL(handle_focus); static const nsIDOMEventListenerVtbl keypress_vtbl = EVENTLISTENER_VTBL(handle_keypress); static const nsIDOMEventListenerVtbl load_vtbl = EVENTLISTENER_VTBL(handle_load); +static const nsIDOMEventListenerVtbl node_insert_vtbl = EVENTLISTENER_VTBL(handle_node_insert); static void init_event(nsIDOMEventTarget *target, const PRUnichar *type, nsIDOMEventListener *listener, BOOL capture) @@ -207,11 +233,14 @@ void init_nsevents(NSContainer *This) static const PRUnichar wsz_focus[] = {'f','o','c','u','s',0}; static const PRUnichar wsz_keypress[] = {'k','e','y','p','r','e','s','s',0}; static const PRUnichar wsz_load[] = {'l','o','a','d',0}; + static const PRUnichar DOMNodeInsertedW[] = + {'D','O','M','N','o','d','e','I','n','s','e','r','t','e','d',0}; init_listener(&This->blur_listener, This, &blur_vtbl); init_listener(&This->focus_listener, This, &focus_vtbl); init_listener(&This->keypress_listener, This, &keypress_vtbl); init_listener(&This->load_listener, This, &load_vtbl); + init_listener(&This->node_insert_listener, This, &node_insert_vtbl); nsres = nsIWebBrowser_GetContentDOMWindow(This->webbrowser, &dom_window); if(NS_FAILED(nsres)) { @@ -230,6 +259,7 @@ void init_nsevents(NSContainer *This) init_event(target, wsz_focus, NSEVENTLIST(&This->focus_listener), TRUE); init_event(target, wsz_keypress, NSEVENTLIST(&This->keypress_listener), FALSE); init_event(target, wsz_load, NSEVENTLIST(&This->load_listener), TRUE); + init_event(target, DOMNodeInsertedW,NSEVENTLIST(&This->node_insert_listener),TRUE); nsIDOMEventTarget_Release(target); } diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c index b45bb082db9..0331882c1b9 100644 --- a/dlls/mshtml/nsio.c +++ b/dlls/mshtml/nsio.c @@ -209,7 +209,7 @@ static nsrefcnt NSAPI nsChannel_Release(nsIHttpChannel *iface) nsIInterfaceRequestor_Release(This->notif_callback); if(This->original_uri) nsIURI_Release(This->original_uri); - heap_free(This->content); + heap_free(This->content_type); heap_free(This->charset); heap_free(This); } @@ -468,8 +468,8 @@ static nsresult NSAPI nsChannel_GetContentType(nsIHttpChannel *iface, nsACString TRACE("(%p)->(%p)\n", This, aContentType); - if(This->content) { - nsACString_SetData(aContentType, This->content); + if(This->content_type) { + nsACString_SetData(aContentType, This->content_type); return S_OK; } @@ -485,14 +485,21 @@ static nsresult NSAPI nsChannel_SetContentType(nsIHttpChannel *iface, const nsACString *aContentType) { nsChannel *This = NSCHANNEL_THIS(iface); + const char *content_type; TRACE("(%p)->(%p)\n", This, aContentType); + nsACString_GetData(aContentType, &content_type); + + TRACE("content_type %s\n", content_type); + + heap_free(This->content_type); + This->content_type = heap_strdupA(content_type); + if(This->channel) return nsIChannel_SetContentType(This->channel, aContentType); - FIXME("default action not implemented\n"); - return NS_ERROR_NOT_IMPLEMENTED; + return NS_OK; } static nsresult NSAPI nsChannel_GetContentCharset(nsIHttpChannel *iface, @@ -688,13 +695,8 @@ static nsresult async_open_doc_uri(nsChannel *This, NSContainer *container, channelbsc_set_channel(container->bscallback, This, listener, context); if(container->doc && container->doc->mime) { - DWORD len; - - heap_free(This->content); - - len = WideCharToMultiByte(CP_ACP, 0, container->doc->mime, -1, NULL, 0, NULL, NULL); - This->content = heap_alloc(len); - WideCharToMultiByte(CP_ACP, 0, container->doc->mime, -1, This->content, -1, NULL, NULL); + heap_free(This->content_type); + This->content_type = heap_strdupWtoA(container->doc->mime); } if(do_load_from_moniker_hack(This)) @@ -2155,20 +2157,13 @@ static nsresult NSAPI nsIOService_NewChannelFromURI(nsIIOService *iface, nsIURI return channel ? NS_OK : NS_ERROR_UNEXPECTED; } - ret = heap_alloc(sizeof(nsChannel)); + ret = heap_alloc_zero(sizeof(nsChannel)); ret->lpHttpChannelVtbl = &nsChannelVtbl; ret->lpUploadChannelVtbl = &nsUploadChannelVtbl; ret->ref = 1; ret->channel = channel; - ret->http_channel = NULL; ret->uri = wine_uri; - ret->post_data_stream = NULL; - ret->load_group = NULL; - ret->notif_callback = NULL; - ret->load_flags = 0; - ret->content = NULL; - ret->charset = NULL; nsIURI_AddRef(aURI); ret->original_uri = aURI; diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c index a094dc1f58b..78a5d6b4190 100644 --- a/dlls/mshtml/persist.c +++ b/dlls/mshtml/persist.c @@ -134,7 +134,7 @@ static nsIInputStream *get_post_data_stream(IBindCtx *bctx) data = heap_alloc(headers_len+post_len+sizeof(content_length)+8); if(headers_len) { - WideCharToMultiByte(CP_ACP, 0, headers, -1, data, -1, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, headers, -1, data, headers_len, NULL, NULL); len = fix_headers(data, post_len); } diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c new file mode 100644 index 00000000000..40509f38aa7 --- /dev/null +++ b/dlls/mshtml/script.c @@ -0,0 +1,314 @@ +/* + * Copyright 2008 Jacek Caban 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 + */ + +#include "config.h" + +#include + +#define COBJMACROS + +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "ole2.h" +#include "activscp.h" + +#include "wine/debug.h" + +#include "mshtml_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(mshtml); + +static const CLSID CLSID_JScript = + {0xf414c260,0x6ac0,0x11cf,{0xb6,0xd1,0x00,0xaa,0x00,0xbb,0xbb,0x58}}; + +typedef struct { + const IActiveScriptSiteVtbl *lpActiveScriptSiteVtbl; + + LONG ref; + + IActiveScript *script; + HTMLDocument *doc; + + GUID guid; + struct list entry; +} ScriptHost; + +#define ACTSCPSITE(x) ((IActiveScriptSite*) &(x)->lpActiveScriptSiteVtbl) + +#define ACTSCPSITE_THIS(iface) DEFINE_THIS(ScriptHost, ActiveScriptSite, iface) + +static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv) +{ + ScriptHost *This = ACTSCPSITE_THIS(iface); + + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid)) { + TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); + *ppv = ACTSCPSITE(This); + }else if(IsEqualGUID(&IID_IActiveScriptSite, riid)) { + TRACE("(%p)->(IID_IActiveScriptSite %p)\n", This, ppv); + *ppv = ACTSCPSITE(This); + }else { + FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv); + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface) +{ + ScriptHost *This = ACTSCPSITE_THIS(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + return ref; +} + +static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface) +{ + ScriptHost *This = ACTSCPSITE_THIS(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%d\n", This, ref); + + if(!ref) { + if(This->doc) + list_remove(&This->entry); + heap_free(This); + } + + return ref; +} + +static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid) +{ + ScriptHost *This = ACTSCPSITE_THIS(iface); + FIXME("(%p)->(%p)\n", This, plcid); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName, + DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti) +{ + ScriptHost *This = ACTSCPSITE_THIS(iface); + FIXME("(%p)->(%s %x %p %p)\n", This, debugstr_w(pstrName), dwReturnMask, ppiunkItem, ppti); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion) +{ + ScriptHost *This = ACTSCPSITE_THIS(iface); + FIXME("(%p)->(%p)\n", This, pbstrVersion); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface, + const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo) +{ + ScriptHost *This = ACTSCPSITE_THIS(iface); + FIXME("(%p)->(%p %p)\n", This, pvarResult, pexcepinfo); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState) +{ + ScriptHost *This = ACTSCPSITE_THIS(iface); + FIXME("(%p)->(%x)\n", This, ssScriptState); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror) +{ + ScriptHost *This = ACTSCPSITE_THIS(iface); + FIXME("(%p)->(%p)\n", This, pscripterror); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface) +{ + ScriptHost *This = ACTSCPSITE_THIS(iface); + FIXME("(%p)->()\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface) +{ + ScriptHost *This = ACTSCPSITE_THIS(iface); + FIXME("(%p)->()\n", This); + return E_NOTIMPL; +} + +#undef ACTSCPSITE_THIS + +static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = { + ActiveScriptSite_QueryInterface, + ActiveScriptSite_AddRef, + ActiveScriptSite_Release, + ActiveScriptSite_GetLCID, + ActiveScriptSite_GetItemInfo, + ActiveScriptSite_GetDocVersionString, + ActiveScriptSite_OnScriptTerminate, + ActiveScriptSite_OnStateChange, + ActiveScriptSite_OnScriptError, + ActiveScriptSite_OnEnterScript, + ActiveScriptSite_OnLeaveScript +}; + +static ScriptHost *create_script_host(HTMLDocument *doc, GUID *guid) +{ + ScriptHost *ret; + HRESULT hres; + + ret = heap_alloc_zero(sizeof(*ret)); + ret->lpActiveScriptSiteVtbl = &ActiveScriptSiteVtbl; + ret->ref = 1; + ret->doc = doc; + + ret->guid = *guid; + list_add_tail(&doc->script_hosts, &ret->entry); + + hres = CoCreateInstance(&ret->guid, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IActiveScript, (void**)&ret->script); + if(FAILED(hres)) + WARN("Could not load script engine: %08x\n", hres); + + return ret; +} + +static BOOL get_guid_from_type(LPCWSTR type, GUID *guid) +{ + const WCHAR text_javascriptW[] = + {'t','e','x','t','/','j','a','v','a','s','c','r','i','p','t',0}; + + /* FIXME: Handle more types */ + if(!strcmpW(type, text_javascriptW)) { + *guid = CLSID_JScript; + }else { + FIXME("Unknown type %s\n", debugstr_w(type)); + return FALSE; + } + + return TRUE; +} + +static BOOL get_guid_from_language(LPCWSTR type, GUID *guid) +{ + HRESULT hres; + + hres = CLSIDFromProgID(type, guid); + if(FAILED(hres)) + return FALSE; + + /* FIXME: Check CATID_ActiveScriptParse */ + + return TRUE; +} + +static BOOL get_script_guid(nsIDOMHTMLScriptElement *nsscript, GUID *guid) +{ + nsAString attr_str, val_str; + BOOL ret = FALSE; + nsresult nsres; + + static const PRUnichar languageW[] = {'l','a','n','g','u','a','g','e',0}; + + nsAString_Init(&val_str, NULL); + + nsres = nsIDOMHTMLScriptElement_GetType(nsscript, &val_str); + if(NS_SUCCEEDED(nsres)) { + const PRUnichar *type; + + nsAString_GetData(&val_str, &type); + if(*type) { + ret = get_guid_from_type(type, guid); + nsAString_Finish(&val_str); + return ret; + } + }else { + ERR("GetType failed: %08x\n", nsres); + } + + nsAString_Init(&attr_str, languageW); + + nsres = nsIDOMHTMLScriptElement_GetAttribute(nsscript, &attr_str, &val_str); + if(NS_SUCCEEDED(nsres)) { + const PRUnichar *language; + + nsAString_GetData(&val_str, &language); + + if(*language) { + ret = get_guid_from_language(language, guid); + }else { + *guid = CLSID_JScript; + ret = TRUE; + } + }else { + ERR("GetAttribute(language) failed: %08x\n", nsres); + } + + nsAString_Finish(&attr_str); + nsAString_Finish(&val_str); + + return ret; +} + +static ScriptHost *get_script_host(HTMLDocument *doc, nsIDOMHTMLScriptElement *nsscript) +{ + ScriptHost *iter; + GUID guid; + + if(!get_script_guid(nsscript, &guid)) { + WARN("Could not find script GUID\n"); + return NULL; + } + + if(IsEqualGUID(&CLSID_JScript, &guid)) { + FIXME("Ignoring JScript\n"); + return NULL; + } + + LIST_FOR_EACH_ENTRY(iter, &doc->script_hosts, ScriptHost, entry) { + if(IsEqualGUID(&guid, &iter->guid)) + return iter; + } + + return create_script_host(doc, &guid); +} + +void doc_insert_script(HTMLDocument *doc, nsIDOMHTMLScriptElement *nsscript) +{ + get_script_host(doc, nsscript); +} + +void release_script_hosts(HTMLDocument *doc) +{ + ScriptHost *iter; + + while(!list_empty(&doc->script_hosts)) { + iter = LIST_ENTRY(list_head(&doc->script_hosts), ScriptHost, entry); + + list_remove(&iter->entry); + iter->doc = NULL; + IActiveScript_Release(ACTSCPSITE(iter)); + } +} diff --git a/dlls/mshtml/tests/Makefile.in b/dlls/mshtml/tests/Makefile.in index 0aa464515f1..88cf740506b 100644 --- a/dlls/mshtml/tests/Makefile.in +++ b/dlls/mshtml/tests/Makefile.in @@ -10,7 +10,8 @@ CTESTS = \ dom.c \ htmldoc.c \ misc.c \ - protocol.c + protocol.c \ + script.c @MAKE_TEST_RULES@ diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 68a213013b4..53e0a1f411d 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -163,6 +163,12 @@ static REFIID const script_iids[] = { NULL }; +static REFIID const location_iids[] = { + &IID_IDispatch, + &IID_IHTMLLocation, + NULL +}; + typedef struct { const char *tag; REFIID *iids; @@ -1002,6 +1008,27 @@ static void test_compatmode(IHTMLDocument2 *doc) SysFreeString(mode); } +static void test_location(IHTMLDocument2 *doc) +{ + IHTMLLocation *location, *location2; + ULONG ref; + HRESULT hres; + + hres = IHTMLDocument2_get_location(doc, &location); + ok(hres == S_OK, "get_location failed: %08x\n", hres); + + hres = IHTMLDocument2_get_location(doc, &location2); + ok(hres == S_OK, "get_location failed: %08x\n", hres); + + ok(location == location2, "location != location2\n"); + + test_ifaces((IUnknown*)location, location_iids); + + IHTMLLocation_Release(location2); + ref = IHTMLLocation_Release(location); + ok(!ref, "location chould be destroyed here\n"); +} + static void test_default_style(IHTMLStyle *style) { VARIANT_BOOL b; @@ -1114,6 +1141,7 @@ static void test_defaults(IHTMLDocument2 *doc) test_default_style(style); test_compatmode(doc); + test_location(doc); IHTMLStyle_Release(style); diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c new file mode 100644 index 00000000000..ac604cce06d --- /dev/null +++ b/dlls/mshtml/tests/script.c @@ -0,0 +1,536 @@ +/* + * Copyright 2008 Jacek Caban 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 + */ + +#define COBJMACROS +#define CONST_VTABLE + +#include +#include +#include + +#include "windef.h" +#include "winbase.h" +#include "ole2.h" +#include "mshtml.h" +#include "activscp.h" + +#define DEFINE_EXPECT(func) \ + static BOOL expect_ ## func = FALSE, called_ ## func = FALSE + +#define SET_EXPECT(func) \ + do { called_ ## func = FALSE; expect_ ## func = TRUE; } while(0) + +#define CHECK_EXPECT2(func) \ + do { \ + ok(expect_ ##func, "unexpected call " #func "\n"); \ + called_ ## func = TRUE; \ + }while(0) + +#define CHECK_EXPECT(func) \ + do { \ + CHECK_EXPECT2(func); \ + expect_ ## func = FALSE; \ + }while(0) + +#define CHECK_CALLED(func) \ + do { \ + ok(called_ ## func, "expected " #func "\n"); \ + expect_ ## func = called_ ## func = FALSE; \ + }while(0) + +#define CHECK_NOT_CALLED(func) \ + do { \ + ok(!called_ ## func, "unexpected " #func "\n"); \ + expect_ ## func = called_ ## func = FALSE; \ + }while(0) + +#define CLEAR_CALLED(func) \ + expect_ ## func = called_ ## func = FALSE + + +DEFINE_EXPECT(CreateInstance); + + +#define TESTSCRIPT_CLSID "{178fc163-f585-4e24-9c13-4bb7faf80746}" + +static const GUID CLSID_TestScript = + {0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x07,0x46}}; + +static IHTMLDocument2 *notif_doc; +static BOOL doc_complete; + +static const char *debugstr_guid(REFIID riid) +{ + static char buf[50]; + + sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}", + riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], + riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], + riid->Data4[5], riid->Data4[6], riid->Data4[7]); + + return buf; +} + +static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface, + REFIID riid, void**ppv) +{ + if(IsEqualGUID(&IID_IPropertyNotifySink, riid)) { + *ppv = iface; + return S_OK; + } + + return E_NOINTERFACE; +} + +static ULONG WINAPI PropertyNotifySink_AddRef(IPropertyNotifySink *iface) +{ + return 2; +} + +static ULONG WINAPI PropertyNotifySink_Release(IPropertyNotifySink *iface) +{ + return 1; +} + +static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, DISPID dispID) +{ + if(dispID == DISPID_READYSTATE){ + 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)) + doc_complete = TRUE; + + SysFreeString(state); + } + + return S_OK; +} + +static HRESULT WINAPI PropertyNotifySink_OnRequestEdit(IPropertyNotifySink *iface, DISPID dispID) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static IPropertyNotifySinkVtbl PropertyNotifySinkVtbl = { + PropertyNotifySink_QueryInterface, + PropertyNotifySink_AddRef, + PropertyNotifySink_Release, + PropertyNotifySink_OnChanged, + PropertyNotifySink_OnRequestEdit +}; + +static IPropertyNotifySink PropertyNotifySink = { &PropertyNotifySinkVtbl }; + +static IHTMLDocument2 *create_document(void) +{ + IHTMLDocument2 *doc; + HRESULT hres; + + hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IHTMLDocument2, (void**)&doc); + ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres); + + return doc; +} + +static IHTMLDocument2 *create_doc_with_string(const char *str) +{ + IPersistStreamInit *init; + IStream *stream; + IHTMLDocument2 *doc; + HGLOBAL mem; + SIZE_T len; + + notif_doc = doc = create_document(); + if(!doc) + return NULL; + + doc_complete = FALSE; + len = strlen(str); + mem = GlobalAlloc(0, len); + memcpy(mem, str, len); + CreateStreamOnHGlobal(mem, TRUE, &stream); + + IHTMLDocument2_QueryInterface(doc, &IID_IPersistStreamInit, (void**)&init); + + IPersistStreamInit_Load(init, stream); + IPersistStreamInit_Release(init); + IStream_Release(stream); + + return doc; +} + +static void do_advise(IUnknown *unk, REFIID riid, IUnknown *unk_advise) +{ + IConnectionPointContainer *container; + IConnectionPoint *cp; + DWORD cookie; + HRESULT hres; + + hres = IUnknown_QueryInterface(unk, &IID_IConnectionPointContainer, (void**)&container); + ok(hres == S_OK, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres); + + hres = IConnectionPointContainer_FindConnectionPoint(container, riid, &cp); + IConnectionPointContainer_Release(container); + ok(hres == S_OK, "FindConnectionPoint failed: %08x\n", hres); + + hres = IConnectionPoint_Advise(cp, unk_advise, &cookie); + IConnectionPoint_Release(cp); + ok(hres == S_OK, "Advise failed: %08x\n", hres); +} + +typedef void (*domtest_t)(IHTMLDocument2*); + +static IHTMLDocument2 *create_and_load_doc(const char *str) +{ + IHTMLDocument2 *doc; + IHTMLElement *body = NULL; + ULONG ref; + MSG msg; + HRESULT hres; + + doc = create_doc_with_string(str); + do_advise((IUnknown*)doc, &IID_IPropertyNotifySink, (IUnknown*)&PropertyNotifySink); + + while(!doc_complete && GetMessage(&msg, NULL, 0, 0)) { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + hres = IHTMLDocument2_get_body(doc, &body); + ok(hres == S_OK, "get_body failed: %08x\n", hres); + + if(!body) { + skip("Could not get document body. Assuming no Gecko installed.\n"); + ref = IHTMLDocument2_Release(doc); + ok(!ref, "ref = %d\n", ref); + return NULL; + } + + IHTMLElement_Release(body); + return doc; +} + +static HRESULT WINAPI ActiveScript_QueryInterface(IActiveScript *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IActiveScript, riid)) { + *ppv = iface; + return S_OK; + } + + if(IsEqualGUID(&IID_IActiveScriptParse, riid)) { + /* TODO */ + return E_NOINTERFACE; + } + + ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI ActiveScript_AddRef(IActiveScript *iface) +{ + return 2; +} + +static ULONG WINAPI ActiveScript_Release(IActiveScript *iface) +{ + return 1; +} + +static HRESULT WINAPI ActiveScript_SetScriptSite(IActiveScript *iface, IActiveScriptSite *pass) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScript_GetScriptSite(IActiveScript *iface, REFIID riid, + void **ppvObject) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScript_SetScriptState(IActiveScript *iface, SCRIPTSTATE ss) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScript_GetScriptState(IActiveScript *iface, SCRIPTSTATE *pssState) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScript_Close(IActiveScript *iface) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScript_AddNamedItem(IActiveScript *iface, + LPCOLESTR pstrName, DWORD dwFlags) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScript_AddTypeLib(IActiveScript *iface, REFGUID rguidTypeLib, + DWORD dwMajor, DWORD dwMinor, DWORD dwFlags) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScript_GetScriptDispatch(IActiveScript *iface, LPCOLESTR pstrItemName, + IDispatch **ppdisp) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScript_GetCurrentScriptThreadID(IActiveScript *iface, + SCRIPTTHREADID *pstridThread) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScript_GetScriptThreadID(IActiveScript *iface, + DWORD dwWin32ThreadId, SCRIPTTHREADID *pstidThread) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScript_GetScriptThreadState(IActiveScript *iface, + SCRIPTTHREADID stidThread, SCRIPTTHREADSTATE *pstsState) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScript_InterruptScriptThread(IActiveScript *iface, + SCRIPTTHREADID stidThread, const EXCEPINFO *pexcepinfo, DWORD dwFlags) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static HRESULT WINAPI ActiveScript_Clone(IActiveScript *iface, IActiveScript **ppscript) +{ + ok(0, "unexpected call\n"); + return E_NOTIMPL; +} + +static const IActiveScriptVtbl ActiveScriptVtbl = { + ActiveScript_QueryInterface, + ActiveScript_AddRef, + ActiveScript_Release, + ActiveScript_SetScriptSite, + ActiveScript_GetScriptSite, + ActiveScript_SetScriptState, + ActiveScript_GetScriptState, + ActiveScript_Close, + ActiveScript_AddNamedItem, + ActiveScript_AddTypeLib, + ActiveScript_GetScriptDispatch, + ActiveScript_GetCurrentScriptThreadID, + ActiveScript_GetScriptThreadID, + ActiveScript_GetScriptThreadState, + ActiveScript_InterruptScriptThread, + ActiveScript_Clone +}; + +static IActiveScript ActiveScript = { &ActiveScriptVtbl }; + +static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv) +{ + *ppv = NULL; + + if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_IClassFactory, riid)) { + *ppv = iface; + return S_OK; + } + + if(IsEqualGUID(&IID_IMarshal, riid)) + return E_NOINTERFACE; + if(IsEqualGUID(&CLSID_IdentityUnmarshal, riid)) + return E_NOINTERFACE; + + ok(0, "unexpected riid %s\n", debugstr_guid(riid)); + return E_NOTIMPL; +} + +static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface) +{ + return 2; +} + +static ULONG WINAPI ClassFactory_Release(IClassFactory *iface) +{ + return 1; +} + +static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv) +{ + CHECK_EXPECT(CreateInstance); + + ok(!outer, "outer = %p\n", outer); + ok(IsEqualGUID(&IID_IActiveScript, riid), "unexpected riid %s\n", debugstr_guid(riid)); + *ppv = &ActiveScript; + return S_OK; +} + +static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock) +{ + ok(0, "unexpected call\n"); + return S_OK; +} + +static const IClassFactoryVtbl ClassFactoryVtbl = { + ClassFactory_QueryInterface, + ClassFactory_AddRef, + ClassFactory_Release, + ClassFactory_CreateInstance, + ClassFactory_LockServer +}; + +static IClassFactory script_cf = { &ClassFactoryVtbl }; + +static const char simple_script_str[] = + "" + "" + ""; + +static void test_simple_script(void) +{ + IHTMLDocument2 *doc; + + SET_EXPECT(CreateInstance); + + doc = create_and_load_doc(simple_script_str); + if(!doc) return; + + CHECK_CALLED(CreateInstance); + + IHTMLDocument2_Release(doc); +} + +static BOOL init_key(const char *key_name, const char *def_value, BOOL init) +{ + HKEY hkey; + DWORD res; + + if(!init) { + RegDeleteKey(HKEY_CLASSES_ROOT, key_name); + return TRUE; + } + + res = RegCreateKeyA(HKEY_CLASSES_ROOT, key_name, &hkey); + if(res != ERROR_SUCCESS) + return FALSE; + + if(def_value) + res = RegSetValueA(hkey, NULL, REG_SZ, def_value, strlen(def_value)); + + RegCloseKey(hkey); + + return res == ERROR_SUCCESS; +} + +static BOOL init_registry(BOOL init) +{ + return init_key("TestScript\\CLSID", TESTSCRIPT_CLSID, init) + && init_key("CLSID\\"TESTSCRIPT_CLSID"\\Implemented Categories\\{F0B7A1A1-9847-11CF-8F20-00805F2CD064}", + NULL, init) + && init_key("CLSID\\"TESTSCRIPT_CLSID"\\Implemented Categories\\{F0B7A1A2-9847-11CF-8F20-00805F2CD064}", + NULL, init); +} + +static BOOL register_script_engine(void) +{ + DWORD regid; + HRESULT hres; + + if(!init_registry(TRUE)) { + init_registry(FALSE); + return FALSE; + } + + hres = CoRegisterClassObject(&CLSID_TestScript, (IUnknown *)&script_cf, + CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, ®id); + ok(hres == S_OK, "Could not register screipt engine: %08x\n", hres); + + return TRUE; +} + +static void gecko_installer_workaround(BOOL disable) +{ + HKEY hkey; + DWORD res; + + static BOOL has_url = FALSE; + static char url[2048]; + + if(!disable && !has_url) + return; + + res = RegOpenKey(HKEY_CURRENT_USER, "Software\\Wine\\MSHTML", &hkey); + if(res != ERROR_SUCCESS) + return; + + if(disable) { + DWORD type, size = sizeof(url); + + res = RegQueryValueEx(hkey, "GeckoUrl", NULL, &type, (PVOID)url, &size); + if(res == ERROR_SUCCESS && type == REG_SZ) + has_url = TRUE; + + RegDeleteValue(hkey, "GeckoUrl"); + }else { + RegSetValueEx(hkey, "GeckoUrl", 0, REG_SZ, (PVOID)url, lstrlenA(url)+1); + } + + RegCloseKey(hkey); +} + +START_TEST(script) +{ + gecko_installer_workaround(TRUE); + CoInitialize(NULL); + + if(register_script_engine()) { + test_simple_script(); + init_registry(FALSE); + }else { + skip("Could not register TestScript engine\n"); + } + + CoUninitialize(); + gecko_installer_workaround(FALSE); +} diff --git a/dlls/msi/action.c b/dlls/msi/action.c index 1be4598038f..982c9f09fa0 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -4771,7 +4771,7 @@ static UINT ITERATE_StopService(MSIRECORD *rec, LPVOID param) stop_service_dependents(scm, service); - if (!ControlService(service, SERVICE_STOP, &status)) + if (!ControlService(service, SERVICE_CONTROL_STOP, &status)) WARN("Failed to stop service (%s): %d\n", debugstr_w(name), GetLastError()); done: diff --git a/dlls/msxml3/Makefile.in b/dlls/msxml3/Makefile.in index a75cd014d06..5b6703044e9 100644 --- a/dlls/msxml3/Makefile.in +++ b/dlls/msxml3/Makefile.in @@ -26,6 +26,7 @@ C_SRCS = \ pi.c \ queryresult.c \ regsvr.c \ + saxreader.c \ schema.c \ text.c \ uuid.c \ diff --git a/dlls/msxml3/cdata.c b/dlls/msxml3/cdata.c index 1d646e25768..06d8bb1cb35 100644 --- a/dlls/msxml3/cdata.c +++ b/dlls/msxml3/cdata.c @@ -601,10 +601,7 @@ static HRESULT WINAPI domcdata_appendData( if(xmlTextConcat(pDOMNode->node, pContent, SysStringLen(p) ) == 0) hr = S_OK; else - { hr = E_FAIL; - xmlFree(pContent); - } } else hr = E_FAIL; diff --git a/dlls/msxml3/comment.c b/dlls/msxml3/comment.c index 322946591ca..c4d37f2ddcb 100644 --- a/dlls/msxml3/comment.c +++ b/dlls/msxml3/comment.c @@ -600,10 +600,7 @@ static HRESULT WINAPI domcomment_appendData( if(xmlTextConcat(pDOMNode->node, pContent, SysStringLen(p) ) == 0) hr = S_OK; else - { hr = E_FAIL; - xmlFree(pContent); - } } else hr = E_FAIL; diff --git a/dlls/msxml3/factory.c b/dlls/msxml3/factory.c index a973b04c96d..cd0d1088b9f 100644 --- a/dlls/msxml3/factory.c +++ b/dlls/msxml3/factory.c @@ -133,6 +133,7 @@ static const struct IClassFactoryVtbl xmlcf_vtbl = static xmlcf domdoccf = { &xmlcf_vtbl, DOMDocument_create }; static xmlcf schemacf = { &xmlcf_vtbl, SchemaCache_create }; static xmlcf xmldoccf = { &xmlcf_vtbl, XMLDocument_create }; +static xmlcf saxreadcf = { &xmlcf_vtbl, SAXXMLReader_create }; /****************************************************************** * DllGetClassObject (MSXML3.@) @@ -162,6 +163,11 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID iid, LPVOID *ppv ) { cf = (IClassFactory*) &domdoccf.lpVtbl; } + else if( IsEqualCLSID( rclsid, &CLSID_SAXXMLReader) || + IsEqualCLSID( rclsid, &CLSID_SAXXMLReader30 )) + { + cf = (IClassFactory*) &saxreadcf.lpVtbl; + } if ( !cf ) return CLASS_E_CLASSNOTAVAILABLE; diff --git a/dlls/msxml3/main.c b/dlls/msxml3/main.c index abbe040ea3e..7f03948d444 100644 --- a/dlls/msxml3/main.c +++ b/dlls/msxml3/main.c @@ -57,7 +57,20 @@ static REFIID tid_ids[] = { &IID_IXMLDOMSchemaCollection, &IID_IXMLDOMText, &IID_IXMLElement, - &IID_IXMLDOMDocument + &IID_IXMLDOMDocument, + &IID_IVBSAXAttributes, + &IID_IVBSAXContentHandler, + &IID_IVBSAXDeclHandler, + &IID_IVBSAXDTDHandler, + &IID_IVBSAXEntityResolver, + &IID_IVBSAXErrorHandler, + &IID_IVBSAXLexicalHandler, + &IID_IVBSAXLocator, + &IID_IVBSAXXMLFilter, + &IID_IVBSAXXMLReader, + &IID_IMXAttributes, + &IID_IMXReaderControl, + &IID_IMXWriter, }; HRESULT get_typeinfo(enum tid_t tid, ITypeInfo **typeinfo) diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h index 3767686ef62..5484d66e66b 100644 --- a/dlls/msxml3/msxml_private.h +++ b/dlls/msxml3/msxml_private.h @@ -89,6 +89,7 @@ extern IXMLDOMParseError *create_parseError( LONG code, BSTR url, BSTR reason, B extern HRESULT DOMDocument_create( IUnknown *pUnkOuter, LPVOID *ppObj ); extern HRESULT SchemaCache_create( IUnknown *pUnkOuter, LPVOID *ppObj ); extern HRESULT XMLDocument_create( IUnknown *pUnkOuter, LPVOID *ppObj ); +extern HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj ); /* typelibs */ enum tid_t { @@ -108,6 +109,19 @@ enum tid_t { IXMLDOMText_tid, IXMLElement_tid, IXMLDocument_tid, + IVBSAXAttributes_tid, + IVBSAXContentHandler_tid, + IVBSAXDeclHandler_tid, + IVBSAXDTDHandler_tid, + IVBSAXEntityResolver_tid, + IVBSAXErrorHandler_tid, + IVBSAXLexicalHandler_tid, + IVBSAXLocator_tid, + IVBSAXXMLFilter_tid, + IVBSAXXMLReader_tid, + IMXAttributes_tid, + IMXReaderControl_tid, + IMXWriter_tid, LAST_tid }; diff --git a/dlls/msxml3/saxreader.c b/dlls/msxml3/saxreader.c new file mode 100644 index 00000000000..4bece7f2f80 --- /dev/null +++ b/dlls/msxml3/saxreader.c @@ -0,0 +1,381 @@ +/* + * SAX Reader implementation + * + * Copyright 2008 Alistair Leslie-Hughes + * + * 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 + */ +#define COBJMACROS + +#include "config.h" + +#include +#include +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "winnls.h" +#include "ole2.h" +#include "msxml2.h" +#include "wininet.h" +#include "urlmon.h" +#include "winreg.h" +#include "shlwapi.h" + +#include "wine/debug.h" + +#include "msxml_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(msxml); + +#ifdef HAVE_LIBXML2 + +#include + +typedef struct _saxreader +{ + const struct IVBSAXXMLReaderVtbl *lpVtbl; + LONG ref; + xmlSAXHandler sax; +} saxreader; + +static inline saxreader *impl_from_IVBSAXXMLReader( IVBSAXXMLReader *iface ) +{ + return (saxreader *)((char*)iface - FIELD_OFFSET(saxreader, lpVtbl)); +}; + +/*** IUnknown methods ***/ +static HRESULT WINAPI saxxmlreader_QueryInterface(IVBSAXXMLReader* iface, REFIID riid, void **ppvObject) +{ + saxreader *This = impl_from_IVBSAXXMLReader( iface ); + + TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppvObject ); + + *ppvObject = NULL; + + if ( IsEqualGUID( riid, &IID_IUnknown ) || + IsEqualGUID( riid, &IID_IDispatch ) || + IsEqualGUID( riid, &IID_IVBSAXXMLReader )) + { + *ppvObject = iface; + } + else + { + FIXME("interface %s not implemented\n", debugstr_guid(riid)); + return E_NOINTERFACE; + } + + IVBSAXXMLReader_AddRef( iface ); + + return S_OK; +} + +static ULONG WINAPI saxxmlreader_AddRef(IVBSAXXMLReader* iface) +{ + saxreader *This = impl_from_IVBSAXXMLReader( iface ); + TRACE("%p\n", This ); + return InterlockedIncrement( &This->ref ); +} + +static ULONG WINAPI saxxmlreader_Release( + IVBSAXXMLReader* iface) +{ + saxreader *This = impl_from_IVBSAXXMLReader( iface ); + LONG ref; + + TRACE("%p\n", This ); + + ref = InterlockedDecrement( &This->ref ); + if ( ref == 0 ) + { + HeapFree( GetProcessHeap(), 0, This ); + } + + return ref; +} +/*** IDispatch ***/ +static HRESULT WINAPI saxxmlreader_GetTypeInfoCount( IVBSAXXMLReader *iface, UINT* pctinfo ) +{ + saxreader *This = impl_from_IVBSAXXMLReader( iface ); + + TRACE("(%p)->(%p)\n", This, pctinfo); + + *pctinfo = 1; + + return S_OK; +} + +static HRESULT WINAPI saxxmlreader_GetTypeInfo( + IVBSAXXMLReader *iface, + UINT iTInfo, LCID lcid, ITypeInfo** ppTInfo ) +{ + saxreader *This = impl_from_IVBSAXXMLReader( iface ); + HRESULT hr; + + TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo); + + hr = get_typeinfo(IVBSAXXMLReader_tid, ppTInfo); + + return hr; +} + +static HRESULT WINAPI saxxmlreader_GetIDsOfNames( + IVBSAXXMLReader *iface, + REFIID riid, + LPOLESTR* rgszNames, + UINT cNames, + LCID lcid, + DISPID* rgDispId) +{ + saxreader *This = impl_from_IVBSAXXMLReader( iface ); + ITypeInfo *typeinfo; + HRESULT hr; + + TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, + lcid, rgDispId); + + if(!rgszNames || cNames == 0 || !rgDispId) + return E_INVALIDARG; + + hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo); + if(SUCCEEDED(hr)) + { + hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId); + ITypeInfo_Release(typeinfo); + } + + return hr; +} + +static HRESULT WINAPI saxxmlreader_Invoke( + IVBSAXXMLReader *iface, + DISPID dispIdMember, + REFIID riid, + LCID lcid, + WORD wFlags, + DISPPARAMS* pDispParams, + VARIANT* pVarResult, + EXCEPINFO* pExcepInfo, + UINT* puArgErr) +{ + saxreader *This = impl_from_IVBSAXXMLReader( iface ); + ITypeInfo *typeinfo; + HRESULT hr; + + TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), + lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); + + hr = get_typeinfo(IVBSAXXMLReader_tid, &typeinfo); + if(SUCCEEDED(hr)) + { + hr = ITypeInfo_Invoke(typeinfo, &(This->lpVtbl), dispIdMember, wFlags, pDispParams, + pVarResult, pExcepInfo, puArgErr); + ITypeInfo_Release(typeinfo); + } + + return hr; +} + +/*** IVBSAXXMLReader methods ***/ +static HRESULT WINAPI saxxmlreader_getFeature( + IVBSAXXMLReader* iface, + const WCHAR *pFeature, + VARIANT_BOOL *pValue) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_putFeature( + IVBSAXXMLReader* iface, + const WCHAR *pFeature, + VARIANT_BOOL vfValue) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_getProperty( + IVBSAXXMLReader* iface, + const WCHAR *pProp, + VARIANT *pValue) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_putProperty( + IVBSAXXMLReader* iface, + const WCHAR *pProp, + VARIANT value) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_getEntityResolver( + IVBSAXXMLReader* iface, + IVBSAXEntityResolver **pEntityResolver) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_putEntityResolver( + IVBSAXXMLReader* iface, + IVBSAXEntityResolver *pEntityResolver) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_getContentHandler( + IVBSAXXMLReader* iface, + IVBSAXContentHandler **ppContentHandler) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_putContentHandler( + IVBSAXXMLReader* iface, + IVBSAXContentHandler *contentHandler) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_getDTDHandler( + IVBSAXXMLReader* iface, + IVBSAXDTDHandler **pDTDHandler) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_putDTDHandler( + IVBSAXXMLReader* iface, + IVBSAXDTDHandler *pDTDHandler) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_getErrorHandler( + IVBSAXXMLReader* iface, + IVBSAXErrorHandler **pErrorHandler) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_putErrorHandler( + IVBSAXXMLReader* iface, + IVBSAXErrorHandler *errorHandler) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_getBaseURL( + IVBSAXXMLReader* iface, + const WCHAR **pBaseUrl) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_putBaseURL( + IVBSAXXMLReader* iface, + const WCHAR *pBaseUrl) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_getSecureBaseURL( + IVBSAXXMLReader* iface, + const WCHAR **pSecureBaseUrl) +{ + return E_NOTIMPL; +} + + +static HRESULT WINAPI saxxmlreader_putSecureBaseURL( + IVBSAXXMLReader* iface, + const WCHAR *secureBaseUrl) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_parse( + IVBSAXXMLReader* iface, + VARIANT varInput) +{ + return E_NOTIMPL; +} + +static HRESULT WINAPI saxxmlreader_parseURL( + IVBSAXXMLReader* iface, + const WCHAR *url) +{ + return E_NOTIMPL; +} + +static const struct IVBSAXXMLReaderVtbl saxreader_vtbl = +{ + saxxmlreader_QueryInterface, + saxxmlreader_AddRef, + saxxmlreader_Release, + saxxmlreader_GetTypeInfoCount, + saxxmlreader_GetTypeInfo, + saxxmlreader_GetIDsOfNames, + saxxmlreader_Invoke, + saxxmlreader_getFeature, + saxxmlreader_putFeature, + saxxmlreader_getProperty, + saxxmlreader_putProperty, + saxxmlreader_getEntityResolver, + saxxmlreader_putEntityResolver, + saxxmlreader_getContentHandler, + saxxmlreader_putContentHandler, + saxxmlreader_getDTDHandler, + saxxmlreader_putDTDHandler, + saxxmlreader_getErrorHandler, + saxxmlreader_putErrorHandler, + saxxmlreader_getBaseURL, + saxxmlreader_putBaseURL, + saxxmlreader_getSecureBaseURL, + saxxmlreader_putSecureBaseURL, + saxxmlreader_parse, + saxxmlreader_parseURL +}; + +HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj) +{ + saxreader *reader; + + TRACE("(%p,%p)\n", pUnkOuter, ppObj); + + reader = HeapAlloc( GetProcessHeap(), 0, sizeof (*reader) ); + if( !reader ) + return E_OUTOFMEMORY; + + reader->lpVtbl = &saxreader_vtbl; + reader->ref = 1; + + *ppObj = &reader->lpVtbl; + + TRACE("returning iface %p\n", *ppObj); + + return S_OK; +} + +#else + +HRESULT SAXXMLReader_create(IUnknown *pUnkOuter, LPVOID *ppObj) +{ + MESSAGE("This program tried to use a SAX XML Reader object, but\n" + "libxml2 support was not present at compile time.\n"); + return E_NOTIMPL; +} + +#endif diff --git a/dlls/msxml3/text.c b/dlls/msxml3/text.c index 52163a2c604..4b32ac9ce1e 100644 --- a/dlls/msxml3/text.c +++ b/dlls/msxml3/text.c @@ -603,10 +603,7 @@ static HRESULT WINAPI domtext_appendData( if(xmlTextConcat(pDOMNode->node, pContent, SysStringLen(p) ) == 0) hr = S_OK; else - { hr = E_FAIL; - xmlFree(pContent); - } } else hr = E_FAIL; diff --git a/dlls/netapi32/nbt.c b/dlls/netapi32/nbt.c index 96309e40376..1186572dab7 100644 --- a/dlls/netapi32/nbt.c +++ b/dlls/netapi32/nbt.c @@ -67,15 +67,6 @@ #include "config.h" #include -#ifdef HAVE_POLL_H -#include -#endif -#ifdef HAVE_SYS_POLL_H -# include -#endif -#ifdef HAVE_SYS_TIME_H -# include -#endif #include "winsock2.h" #include "windef.h" @@ -311,12 +302,13 @@ static UCHAR NetBTWaitForNameResponse(const NetBTAdapter *adapter, SOCKET fd, while (!found && ret == NRC_GOODRET && (now = GetTickCount()) < waitUntil) { DWORD msToWait = waitUntil - now; - struct pollfd pfd; + struct fd_set fds; + struct timeval timeout = { msToWait / 1000, msToWait % 1000 }; int r; - pfd.fd = fd; - pfd.events = POLLIN; - r = poll(&pfd, 1, msToWait); + FD_ZERO(&fds); + FD_SET(fd, &fds); + r = select(fd + 1, &fds, NULL, NULL, &timeout); if (r < 0) ret = NRC_SYSTEM; else if (r == 1) diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index 811540befdb..3b60d604f10 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -24,6 +24,12 @@ #include #include +#ifdef HAVE_SYS_MMAN_H +# include +#endif +#ifdef HAVE_VALGRIND_MEMCHECK_H +# include +#endif #define NONAMELESSUNION #define NONAMELESSSTRUCT @@ -2313,6 +2319,65 @@ PIMAGE_NT_HEADERS WINAPI RtlImageNtHeader(HMODULE hModule) } +/*********************************************************************** + * alloc_process_stack + * + * Allocate the stack of new process. + */ +static NTSTATUS alloc_process_stack( IMAGE_NT_HEADERS *nt ) +{ + NTSTATUS status; + void *base = NULL; + SIZE_T stack_size, page_size = getpagesize(); + + stack_size = max( nt->OptionalHeader.SizeOfStackReserve, nt->OptionalHeader.SizeOfStackCommit ); + stack_size += page_size; /* for the guard page */ + stack_size = (stack_size + 0xffff) & ~0xffff; /* round to 64K boundary */ + if (stack_size < 1024 * 1024) stack_size = 1024 * 1024; /* Xlib needs a large stack */ + + if ((status = NtAllocateVirtualMemory( GetCurrentProcess(), &base, 16, &stack_size, + MEM_COMMIT, PAGE_READWRITE ))) + return status; + + /* note: limit is lower than base since the stack grows down */ + NtCurrentTeb()->DeallocationStack = base; + NtCurrentTeb()->Tib.StackBase = (char *)base + stack_size; + NtCurrentTeb()->Tib.StackLimit = (char *)base + page_size; + +#ifdef VALGRIND_STACK_REGISTER + /* no need to de-register the stack as it's the one of the main thread */ + VALGRIND_STACK_REGISTER(NtCurrentTeb()->Tib.StackLimit, NtCurrentTeb()->Tib.StackBase); +#endif + + /* setup guard page */ + NtProtectVirtualMemory( GetCurrentProcess(), &base, &page_size, PAGE_NOACCESS, NULL ); + return STATUS_SUCCESS; +} + + +/*********************************************************************** + * attach_process_dlls + * + * Initial attach to all the dlls loaded by the process. + */ +static NTSTATUS attach_process_dlls( void *wm ) +{ + NTSTATUS status; + + RtlEnterCriticalSection( &loader_section ); + if ((status = process_attach( wm, (LPVOID)1 )) != STATUS_SUCCESS) + { + if (last_failed_modref) + ERR( "%s failed to initialize, aborting\n", + debugstr_w(last_failed_modref->ldr.BaseDllName.Buffer) + 1 ); + return status; + } + attach_implicitly_loaded_dlls( (LPVOID)1 ); + RtlLeaveCriticalSection( &loader_section ); + return status; +} + + /****************************************************************** * LdrInitializeThunk (NTDLL.@) * @@ -2344,8 +2409,8 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3, RemoveEntryList( &wm->ldr.InLoadOrderModuleList ); InsertHeadList( &peb->LdrData->InLoadOrderModuleList, &wm->ldr.InLoadOrderModuleList ); - status = server_init_process_done(); - if (status != STATUS_SUCCESS) goto error; + if ((status = alloc_process_stack( nt )) != STATUS_SUCCESS) goto error; + if ((status = server_init_process_done()) != STATUS_SUCCESS) goto error; actctx_init(); load_path = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer; @@ -2355,17 +2420,13 @@ void WINAPI LdrInitializeThunk( ULONG unknown1, ULONG unknown2, ULONG unknown3, pthread_functions.sigprocmask( SIG_UNBLOCK, &server_block_set, NULL ); - RtlEnterCriticalSection( &loader_section ); - - if ((status = process_attach( wm, (LPVOID)1 )) != STATUS_SUCCESS) - { - if (last_failed_modref) - ERR( "%s failed to initialize, aborting\n", debugstr_w(last_failed_modref->ldr.BaseDllName.Buffer) + 1 ); - goto error; - } - attach_implicitly_loaded_dlls( (LPVOID)1 ); + status = wine_call_on_stack( attach_process_dlls, wm, NtCurrentTeb()->Tib.StackBase ); + if (status != STATUS_SUCCESS) goto error; - RtlLeaveCriticalSection( &loader_section ); + /* clear the stack contents before calling the main entry point, some broken apps need that */ + wine_anon_mmap( NtCurrentTeb()->Tib.StackLimit, + (char *)NtCurrentTeb()->Tib.StackBase - (char *)NtCurrentTeb()->Tib.StackLimit, + PROT_READ | PROT_WRITE, MAP_FIXED ); if (nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE) VIRTUAL_UseLargeAddressSpace(); return; diff --git a/dlls/ntdll/misc.c b/dlls/ntdll/misc.c index d5e8c1d99fb..218c2897bd3 100644 --- a/dlls/ntdll/misc.c +++ b/dlls/ntdll/misc.c @@ -23,6 +23,7 @@ #include #include +#include "wine/library.h" #include "wine/debug.h" #include "ntdll_misc.h" @@ -139,6 +140,22 @@ double CDECL NTDLL__CIpow(double x,double y) /********************************************************************* + * wine_get_version (NTDLL.@) + */ +const char * CDECL NTDLL_wine_get_version(void) +{ + return wine_get_version(); +} + +/********************************************************************* + * wine_get_build_id (NTDLL.@) + */ +const char * CDECL NTDLL_wine_get_build_id(void) +{ + return wine_get_build_id(); +} + +/********************************************************************* * abs (NTDLL.@) */ int CDECL NTDLL_abs( int i ) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 0c9bfd4a5ca..2d27d61ae6d 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -1382,6 +1382,10 @@ @ cdecl wine_server_send_fd(long) @ cdecl __wine_make_process_system() +# Version +@ cdecl wine_get_version() NTDLL_wine_get_version +@ cdecl wine_get_build_id() NTDLL_wine_get_build_id + # Codepages @ cdecl __wine_init_codepages(ptr ptr ptr) diff --git a/dlls/ntdsapi/tests/ntdsapi.c b/dlls/ntdsapi/tests/ntdsapi.c index ac5dd197bad..08436ae8e85 100644 --- a/dlls/ntdsapi/tests/ntdsapi.c +++ b/dlls/ntdsapi/tests/ntdsapi.c @@ -22,6 +22,8 @@ #include "winbase.h" #include "winerror.h" #include "winnls.h" +#include "rpc.h" +#include "rpcdce.h" #include "ntdsapi.h" #include "wine/test.h" diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c index c7f79961bcf..acea8545ed4 100644 --- a/dlls/ole32/tests/marshal.c +++ b/dlls/ole32/tests/marshal.c @@ -29,6 +29,7 @@ #include "winbase.h" #include "objbase.h" #include "shlguid.h" +#include "shobjidl.h" #include "wine/test.h" diff --git a/dlls/qmgr/tests/file.c b/dlls/qmgr/tests/file.c index 05aec1c8b40..033b2c500f0 100644 --- a/dlls/qmgr/tests/file.c +++ b/dlls/qmgr/tests/file.c @@ -158,8 +158,10 @@ static void test_GetProgress_PreTransfer(void) skip("Unable to get progress of test_file.\n"); return; } - ok(progress.BytesTotal == BG_SIZE_UNKNOWN, "Got incorrect total size: %llu\n", progress.BytesTotal); - ok(progress.BytesTransferred == 0, "Got incorrect number of transferred bytes: %llu\n", progress.BytesTransferred); + ok(progress.BytesTotal == BG_SIZE_UNKNOWN, "Got incorrect total size: %x%08x\n", + (DWORD)(progress.BytesTotal >> 32), (DWORD)progress.BytesTotal); + ok(progress.BytesTransferred == 0, "Got incorrect number of transferred bytes: %x%08x\n", + (DWORD)(progress.BytesTransferred >> 32), (DWORD)progress.BytesTransferred); ok(progress.Completed == FALSE, "Got incorret completion status\n"); } diff --git a/dlls/qmgr/tests/job.c b/dlls/qmgr/tests/job.c index e504b862b74..52d4e8296d0 100644 --- a/dlls/qmgr/tests/job.c +++ b/dlls/qmgr/tests/job.c @@ -246,8 +246,10 @@ static void test_GetProgress_preTransfer(void) return; } - ok(progress.BytesTotal == 0, "Incorrect BytesTotal: %llu\n", progress.BytesTotal); - ok(progress.BytesTransferred == 0, "Incorrect BytesTransferred: %llu\n", progress.BytesTransferred); + ok(progress.BytesTotal == 0, "Incorrect BytesTotal: %x%08x\n", + (DWORD)(progress.BytesTotal >> 32), (DWORD)progress.BytesTotal); + ok(progress.BytesTransferred == 0, "Incorrect BytesTransferred: %x%08x\n", + (DWORD)(progress.BytesTransferred >> 32), (DWORD)progress.BytesTransferred); ok(progress.FilesTotal == 0, "Incorrect FilesTotal: %u\n", progress.FilesTotal); ok(progress.FilesTransferred == 0, "Incorrect FilesTransferred %u\n", progress.FilesTransferred); } diff --git a/dlls/quartz/acmwrapper.c b/dlls/quartz/acmwrapper.c index 4d5fbc93d3e..d34fcc642db 100644 --- a/dlls/quartz/acmwrapper.c +++ b/dlls/quartz/acmwrapper.c @@ -128,7 +128,7 @@ static HRESULT ACMWrapper_ProcessSampleData(TransformFilterImpl* pTransformFilte assert(hr == S_OK); assert(ash.cbSrcLengthUsed); - TRACE("Sample start time: %lld.%03lld\n", (tStart/10000000), (tStart/10000)%1000); + TRACE("Sample start time: %u.%03u\n", (DWORD)(tStart/10000000), (DWORD)((tStart/10000)%1000)); if (ash.cbSrcLengthUsed == cbSrcStream) { IMediaSample_SetTime(pOutSample, &tStart, &tStop); @@ -146,7 +146,7 @@ static HRESULT ACMWrapper_ProcessSampleData(TransformFilterImpl* pTransformFilte ERR("No valid timestamp found\n"); IMediaSample_SetTime(pOutSample, NULL, NULL); } - TRACE("Sample stop time: %lld.%03lld\n", (tStart/10000000), (tStart/10000)%1000); + TRACE("Sample stop time: %u.%03u\n", (DWORD)(tStart/10000000), (DWORD)((tStart/10000)%1000)); hr = OutputPin_SendSample((OutputPin*)This->tf.ppPins[1], pOutSample); if (hr != S_OK && hr != VFW_E_NOT_CONNECTED) { diff --git a/dlls/quartz/control.c b/dlls/quartz/control.c index d32d054ba92..6e5cb0d0b78 100644 --- a/dlls/quartz/control.c +++ b/dlls/quartz/control.c @@ -95,23 +95,23 @@ out: } -HRESULT MediaSeekingImpl_Init(IBaseFilter *pUserData, CHANGEPROC fnChangeStop, CHANGEPROC fnChangeStart, CHANGEPROC fnChangeRate, MediaSeekingImpl * pSeeking, PCRITICAL_SECTION crit_sect) +HRESULT MediaSeekingImpl_Init(IBaseFilter *pUserData, CHANGEPROC fnChangeStop, CHANGEPROC fnChangeCurrent, CHANGEPROC fnChangeRate, MediaSeekingImpl * pSeeking, PCRITICAL_SECTION crit_sect) { - assert(fnChangeStop && fnChangeStart && fnChangeRate); + assert(fnChangeStop && fnChangeCurrent && fnChangeRate); pSeeking->refCount = 1; pSeeking->pUserData = pUserData; pSeeking->fnChangeRate = fnChangeRate; pSeeking->fnChangeStop = fnChangeStop; - pSeeking->fnChangeStart = fnChangeStart; + pSeeking->fnChangeCurrent = fnChangeCurrent; pSeeking->dwCapabilities = AM_SEEKING_CanSeekForwards | AM_SEEKING_CanSeekBackwards | AM_SEEKING_CanSeekAbsolute | AM_SEEKING_CanGetStopPos | AM_SEEKING_CanGetDuration; - pSeeking->llStart = 0; + pSeeking->llCurrent = 0; pSeeking->llStop = ((ULONGLONG)0x80000000) << 32; - pSeeking->llDuration = pSeeking->llStop - pSeeking->llStart; + pSeeking->llDuration = pSeeking->llStop; pSeeking->dRate = 1.0; pSeeking->timeformat = TIME_FORMAT_MEDIA_TIME; pSeeking->crst = crit_sect; @@ -306,7 +306,7 @@ HRESULT WINAPI MediaSeekingImpl_GetCurrentPosition(IMediaSeeking * iface, LONGLO TRACE("(%p)\n", pCurrent); EnterCriticalSection(This->crst); - *pCurrent = This->llStart; + *pCurrent = This->llCurrent; ForwardCmdSeek(This->pUserData, fwd_getcurposition, pCurrent); LeaveCriticalSection(This->crst); @@ -344,31 +344,31 @@ static inline LONGLONG Adjust(LONGLONG value, const LONGLONG * pModifier, DWORD HRESULT WINAPI MediaSeekingImpl_SetPositions(IMediaSeeking * iface, LONGLONG * pCurrent, DWORD dwCurrentFlags, LONGLONG * pStop, DWORD dwStopFlags) { MediaSeekingImpl *This = (MediaSeekingImpl *)iface; - BOOL bChangeStart = FALSE, bChangeStop = FALSE; - LONGLONG llNewStart, llNewStop; + BOOL bChangeCurrent = FALSE, bChangeStop = FALSE; + LONGLONG llNewCurrent, llNewStop; TRACE("(%p, %x, %p, %x)\n", pCurrent, dwCurrentFlags, pStop, dwStopFlags); EnterCriticalSection(This->crst); - llNewStart = Adjust(This->llStart, pCurrent, dwCurrentFlags); + llNewCurrent = Adjust(This->llCurrent, pCurrent, dwCurrentFlags); llNewStop = Adjust(This->llStop, pStop, dwStopFlags); - if (llNewStart != This->llStart) - bChangeStart = TRUE; + if (llNewCurrent != This->llCurrent) + bChangeCurrent = TRUE; if (llNewStop != This->llStop) bChangeStop = TRUE; - This->llStart = llNewStart; + This->llCurrent = llNewCurrent; This->llStop = llNewStop; if (dwCurrentFlags & AM_SEEKING_ReturnTime) - *pCurrent = llNewStart; + *pCurrent = llNewCurrent; if (dwStopFlags & AM_SEEKING_ReturnTime) *pStop = llNewStop; - if (bChangeStart) - This->fnChangeStart(This->pUserData); + if (bChangeCurrent) + This->fnChangeCurrent(This->pUserData); if (bChangeStop) This->fnChangeStop(This->pUserData); @@ -384,7 +384,7 @@ HRESULT WINAPI MediaSeekingImpl_GetPositions(IMediaSeeking * iface, LONGLONG * p TRACE("(%p, %p)\n", pCurrent, pStop); EnterCriticalSection(This->crst); - *pCurrent = This->llStart; + *pCurrent = This->llCurrent; *pStop = This->llStop; LeaveCriticalSection(This->crst); diff --git a/dlls/quartz/control_private.h b/dlls/quartz/control_private.h index 80e550dab43..15855d65f9c 100644 --- a/dlls/quartz/control_private.h +++ b/dlls/quartz/control_private.h @@ -27,18 +27,16 @@ typedef struct MediaSeekingImpl ULONG refCount; IBaseFilter *pUserData; CHANGEPROC fnChangeStop; - CHANGEPROC fnChangeStart; + CHANGEPROC fnChangeCurrent; CHANGEPROC fnChangeRate; DWORD dwCapabilities; double dRate; - LONGLONG llStart; - LONGLONG llStop; - LONGLONG llDuration; /* FIXME: needed? */ + LONGLONG llCurrent, llStop, llDuration; GUID timeformat; PCRITICAL_SECTION crst; } MediaSeekingImpl; -HRESULT MediaSeekingImpl_Init(IBaseFilter *pUserData, CHANGEPROC fnChangeStop, CHANGEPROC fnChangeStart, CHANGEPROC fnChangeRate, MediaSeekingImpl * pSeeking, PCRITICAL_SECTION crit_sect); +HRESULT MediaSeekingImpl_Init(IBaseFilter *pUserData, CHANGEPROC fnChangeStop, CHANGEPROC fnChangeCurrent, CHANGEPROC fnChangeRate, MediaSeekingImpl * pSeeking, PCRITICAL_SECTION crit_sect); HRESULT WINAPI MediaSeekingImpl_GetCapabilities(IMediaSeeking * iface, DWORD * pCapabilities); HRESULT WINAPI MediaSeekingImpl_CheckCapabilities(IMediaSeeking * iface, DWORD * pCapabilities); diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c index 9b375949c90..4371a36b581 100644 --- a/dlls/quartz/filtergraph.c +++ b/dlls/quartz/filtergraph.c @@ -199,6 +199,8 @@ typedef struct _IFilterGraphImpl { BOOL bUnkOuterValid; BOOL bAggregatable; GUID timeformatseek; + LONGLONG start_time; + LONGLONG position; } IFilterGraphImpl; static HRESULT WINAPI Filtergraph_QueryInterface(IFilterGraphImpl *This, @@ -1517,7 +1519,7 @@ static HRESULT SendFilterMessage(IMediaControl *iface, fnFoundFilter FoundFilter /* Explorer the graph from source filters to renderers, determine renderers * number and run filters from renderers to source filters */ - This->nRenderers = 0; + This->nRenderers = 0; ResetEvent(This->hEventCompletion); for(i = 0; i < This->nFilters; i++) @@ -1567,6 +1569,13 @@ static HRESULT WINAPI MediaControl_Run(IMediaControl *iface) { if (This->state == State_Running) return S_OK; EnterCriticalSection(&This->cs); + if (This->refClock) + { + IReferenceClock_GetTime(This->refClock, &This->start_time); + This->start_time += 500000; + } + else This->position = This->start_time = 0; + SendFilterMessage(iface, SendRun); This->state = State_Running; LeaveCriticalSection(&This->cs); @@ -1580,6 +1589,13 @@ static HRESULT WINAPI MediaControl_Pause(IMediaControl *iface) { if (This->state == State_Paused) return S_OK; EnterCriticalSection(&This->cs); + if (This->state == State_Running && This->refClock) + { + LONGLONG time = This->start_time; + IReferenceClock_GetTime(This->refClock, &time); + This->position += time - This->start_time; + } + SendFilterMessage(iface, SendPause); This->state = State_Paused; LeaveCriticalSection(&This->cs); @@ -1593,6 +1609,13 @@ static HRESULT WINAPI MediaControl_Stop(IMediaControl *iface) { if (This->state == State_Stopped) return S_OK; EnterCriticalSection(&This->cs); + if (This->state == State_Running && This->refClock) + { + LONGLONG time = This->start_time; + IReferenceClock_GetTime(This->refClock, &time); + This->position += time - This->start_time; + } + if (This->state == State_Running) SendFilterMessage(iface, SendPause); SendFilterMessage(iface, SendStop); This->state = State_Stopped; @@ -1952,8 +1975,23 @@ static HRESULT WINAPI MediaSeeking_GetStopPosition(IMediaSeeking *iface, static HRESULT WINAPI MediaSeeking_GetCurrentPosition(IMediaSeeking *iface, LONGLONG *pCurrent) { ICOM_THIS_MULTI(IFilterGraphImpl, IMediaSeeking_vtbl, iface); + LONGLONG time = 0; + + if (!pCurrent) + return E_POINTER; - FIXME("(%p/%p)->(%p): stub !!!\n", This, iface, pCurrent); + if (This->state == State_Running && This->refClock) + { + IReferenceClock_GetTime(This->refClock, &time); + if (time) + time += This->position - This->start_time; + if (time < This->position) + time = This->position; + *pCurrent = time; + } + else + *pCurrent = This->position; + TRACE("Time: %lld.%03lld\n", *pCurrent / 10000000, (*pCurrent / 10000)%1000); return S_OK; } @@ -4933,6 +4971,7 @@ HRESULT FilterGraph_create(IUnknown *pUnkOuter, LPVOID *ppObj) fimpl->cs.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": IFilterGraphImpl.cs"); fimpl->nItfCacheEntries = 0; memcpy(&fimpl->timeformatseek, &TIME_FORMAT_MEDIA_TIME, sizeof(GUID)); + fimpl->start_time = fimpl->position = 0; hr = CoCreateInstance(&CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterMapper2, (LPVOID*)&fimpl->pFilterMapper2); if (FAILED(hr)) { diff --git a/dlls/quartz/mpegsplit.c b/dlls/quartz/mpegsplit.c index 0314462ae11..ab4d371fa52 100644 --- a/dlls/quartz/mpegsplit.c +++ b/dlls/quartz/mpegsplit.c @@ -291,7 +291,7 @@ static HRESULT FillBuffer(MPEGSplitterImpl *This, BYTE** fbuf, DWORD *flen) hr = copy_data(This->pCurrentSample, fbuf, flen, length); if (FAILED(hr)) { - WARN("Couldn't set data size to %lld\n", length); + WARN("Couldn't set data size to %x%08x\n", (DWORD)(length >> 32), (DWORD)length); This->skipbytes = length; return hr; } @@ -313,7 +313,7 @@ out_append: sampleduration = 0; IMediaSample_SetTime(This->pCurrentSample, &time, &This->position); } - TRACE("Media time: %lld.%03lld\n", (This->position/10000000), (This->position/10000)%1000); + TRACE("Media time: %u.%03u\n", (DWORD)(This->position/10000000), (DWORD)((This->position/10000)%1000)); hr = OutputPin_SendSample(&pOutputPin->pin, This->pCurrentSample); if (FAILED(hr)) @@ -662,7 +662,7 @@ static HRESULT MPEGSplitter_pre_connect(IPin *iface, IPin *pConnectPin) } } hr = S_OK; - TRACE("Duration: %lld seconds\n", duration / 10000000); + TRACE("Duration: %d seconds\n", (DWORD)(duration / 10000000)); TRACE("Parsing took %u ms\n", GetTickCount() - ticks); break; } diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c index 2a2a806169a..efe12fce41c 100644 --- a/dlls/quartz/tests/filtergraph.c +++ b/dlls/quartz/tests/filtergraph.c @@ -172,6 +172,42 @@ static void test_graph_builder_addfilter(void) hr = IGraphBuilder_AddFilter(pgraph, pF, NULL); ok(hr == S_OK, "IGraphBuilder_AddFilter returned: %x\n", hr); + IMediaFilter_Release(pF); +} + +static void test_mediacontrol(void) +{ + HRESULT hr; + LONGLONG pos = 0xdeadbeef; + IMediaSeeking *seeking = NULL; + IMediaFilter *filter = NULL; + + IFilterGraph2_SetDefaultSyncSource(pgraph); + hr = IFilterGraph2_QueryInterface(pgraph, &IID_IMediaSeeking, (void**) &seeking); + ok(hr == S_OK, "QueryInterface IMediaControl failed: %08x\n", hr); + if (FAILED(hr)) + return; + + hr = IFilterGraph2_QueryInterface(pgraph, &IID_IMediaFilter, (void**) &filter); + ok(hr == S_OK, "QueryInterface IMediaFilter failed: %08x\n", hr); + if (FAILED(hr)) + { + IUnknown_Release(seeking); + return; + } + + hr = IMediaSeeking_GetCurrentPosition(seeking, &pos); + ok(hr == S_OK, "GetCurrentPosition failed: %08x\n", hr); + ok(pos == 0, "Position != 0 (%x%08x)\n", (DWORD)(pos >> 32), (DWORD)pos); + + IMediaFilter_SetSyncSource(filter, NULL); + pos = 0xdeadbeef; + hr = IMediaSeeking_GetCurrentPosition(seeking, &pos); + ok(hr == S_OK, "GetCurrentPosition failed: %08x\n", hr); + ok(pos == 0, "Position != 0 (%x%08x)\n", (DWORD)(pos >> 32), (DWORD)pos); + + IUnknown_Release(seeking); + IUnknown_Release(filter); releasefiltergraph(); } @@ -195,5 +231,6 @@ START_TEST(filtergraph) test_render_run(); test_graph_builder(); test_graph_builder_addfilter(); + test_mediacontrol(); test_filter_graph2(); } diff --git a/dlls/quartz/tests/misc.c b/dlls/quartz/tests/misc.c index 3be5757f3a8..720781438db 100644 --- a/dlls/quartz/tests/misc.c +++ b/dlls/quartz/tests/misc.c @@ -138,32 +138,32 @@ static void test_aggregation(const CLSID clsidOuter, const CLSID clsidInner, static void test_video_renderer_aggregations(void) { - IID iids[] = { - IID_IMediaFilter, IID_IBaseFilter, IID_IBasicVideo, IID_IVideoWindow + const IID * iids[] = { + &IID_IMediaFilter, &IID_IBaseFilter, &IID_IBasicVideo, &IID_IVideoWindow }; int i; for (i = 0; i < sizeof(iids) / sizeof(iids[0]); i++) { test_aggregation(CLSID_SystemClock, CLSID_VideoRenderer, - IID_IReferenceClock, iids[i]); + IID_IReferenceClock, *iids[i]); } } static void test_filter_graph_aggregations(void) { - IID iids[] = { - IID_IFilterGraph2, IID_IMediaControl, IID_IGraphBuilder, - IID_IFilterGraph, IID_IMediaSeeking, IID_IBasicAudio, IID_IBasicVideo, - IID_IVideoWindow, IID_IMediaEventEx, IID_IMediaFilter, - IID_IMediaEventSink, IID_IGraphConfig, IID_IMediaPosition + const IID * iids[] = { + &IID_IFilterGraph2, &IID_IMediaControl, &IID_IGraphBuilder, + &IID_IFilterGraph, &IID_IMediaSeeking, &IID_IBasicAudio, &IID_IBasicVideo, + &IID_IVideoWindow, &IID_IMediaEventEx, &IID_IMediaFilter, + &IID_IMediaEventSink, &IID_IGraphConfig, &IID_IMediaPosition }; int i; for (i = 0; i < sizeof(iids) / sizeof(iids[0]); i++) { test_aggregation(CLSID_SystemClock, CLSID_FilterGraph, - IID_IReferenceClock, iids[i]); + IID_IReferenceClock, *iids[i]); } } diff --git a/dlls/setupapi/devinst.c b/dlls/setupapi/devinst.c index f7c38394bc8..936f6a7f6ca 100644 --- a/dlls/setupapi/devinst.c +++ b/dlls/setupapi/devinst.c @@ -2971,7 +2971,7 @@ BOOL WINAPI SetupDiGetDeviceInterfaceDetailW( } info = (struct InterfaceInfo *)DeviceInterfaceData->Reserved; if (info->symbolicLink) - bytesNeeded += lstrlenW(info->symbolicLink); + bytesNeeded += sizeof(WCHAR)*lstrlenW(info->symbolicLink); if (DeviceInterfaceDetailDataSize >= bytesNeeded) { if (info->symbolicLink) diff --git a/dlls/setupapi/install.c b/dlls/setupapi/install.c index ad4464052c7..3c5534732fd 100644 --- a/dlls/setupapi/install.c +++ b/dlls/setupapi/install.c @@ -1080,6 +1080,16 @@ BOOL WINAPI SetupInstallServicesFromInfSectionW( HINF Inf, PCWSTR SectionName, D */ BOOL WINAPI SetupInstallServicesFromInfSectionA( HINF Inf, PCSTR SectionName, DWORD Flags) { - FIXME("(%p, %s, %d) stub!\n", Inf, debugstr_a(SectionName), Flags); - return FALSE; + UNICODE_STRING SectionNameW; + BOOL ret = FALSE; + + if (RtlCreateUnicodeStringFromAsciiz( &SectionNameW, SectionName )) + { + ret = SetupInstallServicesFromInfSectionW( Inf, SectionNameW.Buffer, Flags ); + RtlFreeUnicodeString( &SectionNameW ); + } + else + SetLastError( ERROR_NOT_ENOUGH_MEMORY ); + + return ret; } diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c index dc6d9f70e60..2704d31ee5e 100644 --- a/dlls/setupapi/tests/devinst.c +++ b/dlls/setupapi/tests/devinst.c @@ -47,6 +47,7 @@ static HKEY (WINAPI *pSetupDiCreateDevRegKeyW)(HDEVINFO, PSP_DEVINFO_DATA, D static BOOL (WINAPI *pSetupDiCreateDeviceInfoA)(HDEVINFO, PCSTR, GUID *, PCSTR, HWND, DWORD, PSP_DEVINFO_DATA); static BOOL (WINAPI *pSetupDiGetDeviceInstanceIdA)(HDEVINFO, PSP_DEVINFO_DATA, PSTR, DWORD, PDWORD); static BOOL (WINAPI *pSetupDiGetDeviceInterfaceDetailA)(HDEVINFO, PSP_DEVICE_INTERFACE_DATA, PSP_DEVICE_INTERFACE_DETAIL_DATA_A, DWORD, PDWORD, PSP_DEVINFO_DATA); +static BOOL (WINAPI *pSetupDiGetDeviceInterfaceDetailW)(HDEVINFO, PSP_DEVICE_INTERFACE_DATA, PSP_DEVICE_INTERFACE_DETAIL_DATA_W, DWORD, PDWORD, PSP_DEVINFO_DATA); static BOOL (WINAPI *pSetupDiRegisterDeviceInfo)(HDEVINFO, PSP_DEVINFO_DATA, DWORD, PSP_DETSIG_CMPPROC, PVOID, PSP_DEVINFO_DATA); static void init_function_pointers(void) @@ -63,6 +64,7 @@ static void init_function_pointers(void) pSetupDiEnumDeviceInterfaces = (void *)GetProcAddress(hSetupAPI, "SetupDiEnumDeviceInterfaces"); pSetupDiGetDeviceInstanceIdA = (void *)GetProcAddress(hSetupAPI, "SetupDiGetDeviceInstanceIdA"); pSetupDiGetDeviceInterfaceDetailA = (void *)GetProcAddress(hSetupAPI, "SetupDiGetDeviceInterfaceDetailA"); + pSetupDiGetDeviceInterfaceDetailW = (void *)GetProcAddress(hSetupAPI, "SetupDiGetDeviceInterfaceDetailW"); pSetupDiInstallClassA = (void *)GetProcAddress(hSetupAPI, "SetupDiInstallClassA"); pSetupDiOpenClassRegKeyExA = (void *)GetProcAddress(hSetupAPI, "SetupDiOpenClassRegKeyExA"); pSetupDiOpenDevRegKey = (void *)GetProcAddress(hSetupAPI, "SetupDiOpenDevRegKey"); @@ -627,6 +629,7 @@ static void testGetDeviceInterfaceDetail(void) LPBYTE buf = HeapAlloc(GetProcessHeap(), 0, size); SP_DEVICE_INTERFACE_DETAIL_DATA_A *detail = (SP_DEVICE_INTERFACE_DETAIL_DATA_A *)buf; + DWORD expectedsize = offsetof(SP_DEVICE_INTERFACE_DETAIL_DATA_W, DevicePath) + sizeof(WCHAR)*(1 + strlen(path)); detail->cbSize = 0; SetLastError(0xdeadbeef); @@ -649,13 +652,23 @@ static void testGetDeviceInterfaceDetail(void) /* Windows 2000 and up check for the exact size. Win9x returns ERROR_INVALID_PARAMETER * on every call (so doesn't get here) and NT4 doesn't have this function. */ - detail->cbSize = offsetof(SP_DEVICE_INTERFACE_DETAIL_DATA_A, DevicePath) + sizeof(char); + detail->cbSize = FIELD_OFFSET(SP_DEVICE_INTERFACE_DETAIL_DATA_A, DevicePath[1]); ret = pSetupDiGetDeviceInterfaceDetailA(set, &interfaceData, detail, size, &size, NULL); ok(ret, "SetupDiGetDeviceInterfaceDetailA failed: %d\n", GetLastError()); ok(!lstrcmpiA(path, detail->DevicePath), "Unexpected path %s\n", detail->DevicePath); + /* Check SetupDiGetDeviceInterfaceDetailW */ + if (pSetupDiGetDeviceInterfaceDetailW) + { + ret = pSetupDiGetDeviceInterfaceDetailW(set, &interfaceData, NULL, 0, &size, NULL); + ok(!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Expected ERROR_INSUFFICIENT_BUFFER, got error code: %d\n", GetLastError()); + ok(expectedsize == size, "SetupDiGetDeviceInterfaceDetailW returned wrong reqsize: expected %d, got %d\n", expectedsize, size); + } + else + skip("SetupDiGetDeviceInterfaceDetailW is not available\n"); + HeapFree(GetProcessHeap(), 0, buf); } pSetupDiDestroyDeviceInfoList(set); diff --git a/dlls/setupapi/tests/install.c b/dlls/setupapi/tests/install.c index 77c74f80344..5a99eaa876b 100644 --- a/dlls/setupapi/tests/install.c +++ b/dlls/setupapi/tests/install.c @@ -137,6 +137,152 @@ static void test_cmdline(void) ok(DeleteFile(infwithspaces), "Expected source inf to exist, last error was %d\n", GetLastError()); } +static void test_install_svc_from(void) +{ + char inf[2048]; + char path[MAX_PATH]; + HINF infhandle; + BOOL ret; + SC_HANDLE scm_handle, svc_handle; + + /* Bail out if we are on win98 */ + SetLastError(0xdeadbeef); + scm_handle = OpenSCManagerA(NULL, NULL, GENERIC_ALL); + + if (!scm_handle && (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)) + { + skip("OpenSCManagerA is not implemented, we are most likely on win9x\n"); + return; + } + CloseServiceHandle(scm_handle); + + /* Basic inf file to satisfy SetupOpenInfFileA */ + strcpy(inf, "[Version]\nSignature=\"$Chicago$\"\n"); + create_inf_file(inffile, inf); + sprintf(path, "%s\\%s", CURR_DIR, inffile); + infhandle = SetupOpenInfFileA(path, NULL, INF_STYLE_WIN4, NULL); + + /* Nothing but the Version section */ + SetLastError(0xdeadbeef); + ret = SetupInstallServicesFromInfSectionA(infhandle, "Winetest.Services", 0); + ok(!ret, "Expected failure\n"); + todo_wine + ok(GetLastError() == ERROR_SECTION_NOT_FOUND, + "Expected ERROR_SECTION_NOT_FOUND, got %08x\n", GetLastError()); + SetupCloseInfFile(infhandle); + DeleteFile(inffile); + + /* Add the section */ + strcat(inf, "[Winetest.Services]\n"); + create_inf_file(inffile, inf); + infhandle = SetupOpenInfFileA(path, NULL, INF_STYLE_WIN4, NULL); + SetLastError(0xdeadbeef); + ret = SetupInstallServicesFromInfSectionA(infhandle, "Winetest.Services", 0); + ok(!ret, "Expected failure\n"); + todo_wine + ok(GetLastError() == ERROR_SECTION_NOT_FOUND, + "Expected ERROR_SECTION_NOT_FOUND, got %08x\n", GetLastError()); + SetupCloseInfFile(infhandle); + DeleteFile(inffile); + + /* Add a reference */ + strcat(inf, "AddService=Winetest,,Winetest.Service\n"); + create_inf_file(inffile, inf); + infhandle = SetupOpenInfFileA(path, NULL, INF_STYLE_WIN4, NULL); + SetLastError(0xdeadbeef); + ret = SetupInstallServicesFromInfSectionA(infhandle, "Winetest.Services", 0); + ok(!ret, "Expected failure\n"); + todo_wine + ok(GetLastError() == ERROR_BAD_SERVICE_INSTALLSECT, + "Expected ERROR_BAD_SERVICE_INSTALLSECT, got %08x\n", GetLastError()); + SetupCloseInfFile(infhandle); + DeleteFile(inffile); + + /* Add the section */ + strcat(inf, "[Winetest.Service]\n"); + create_inf_file(inffile, inf); + infhandle = SetupOpenInfFileA(path, NULL, INF_STYLE_WIN4, NULL); + SetLastError(0xdeadbeef); + ret = SetupInstallServicesFromInfSectionA(infhandle, "Winetest.Services", 0); + ok(!ret, "Expected failure\n"); + todo_wine + ok(GetLastError() == ERROR_BAD_SERVICE_INSTALLSECT, + "Expected ERROR_BAD_SERVICE_INSTALLSECT, got %08x\n", GetLastError()); + SetupCloseInfFile(infhandle); + DeleteFile(inffile); + + /* Just the ServiceBinary */ + strcat(inf, "ServiceBinary=%12%\\winetest.sys\n"); + create_inf_file(inffile, inf); + infhandle = SetupOpenInfFileA(path, NULL, INF_STYLE_WIN4, NULL); + SetLastError(0xdeadbeef); + ret = SetupInstallServicesFromInfSectionA(infhandle, "Winetest.Services", 0); + ok(!ret, "Expected failure\n"); + todo_wine + ok(GetLastError() == ERROR_BAD_SERVICE_INSTALLSECT, + "Expected ERROR_BAD_SERVICE_INSTALLSECT, got %08x\n", GetLastError()); + SetupCloseInfFile(infhandle); + DeleteFile(inffile); + + /* Add the ServiceType */ + strcat(inf, "ServiceType=1\n"); + create_inf_file(inffile, inf); + infhandle = SetupOpenInfFileA(path, NULL, INF_STYLE_WIN4, NULL); + SetLastError(0xdeadbeef); + ret = SetupInstallServicesFromInfSectionA(infhandle, "Winetest.Services", 0); + ok(!ret, "Expected failure\n"); + todo_wine + ok(GetLastError() == ERROR_BAD_SERVICE_INSTALLSECT, + "Expected ERROR_BAD_SERVICE_INSTALLSECT, got %08x\n", GetLastError()); + SetupCloseInfFile(infhandle); + DeleteFile(inffile); + + /* Add the StartType */ + strcat(inf, "StartType=4\n"); + create_inf_file(inffile, inf); + infhandle = SetupOpenInfFileA(path, NULL, INF_STYLE_WIN4, NULL); + SetLastError(0xdeadbeef); + ret = SetupInstallServicesFromInfSectionA(infhandle, "Winetest.Services", 0); + ok(!ret, "Expected failure\n"); + todo_wine + ok(GetLastError() == ERROR_BAD_SERVICE_INSTALLSECT, + "Expected ERROR_BAD_SERVICE_INSTALLSECT, got %08x\n", GetLastError()); + SetupCloseInfFile(infhandle); + DeleteFile(inffile); + + /* This should be it, the minimal entries to install a service */ + strcat(inf, "ErrorControl=1"); + create_inf_file(inffile, inf); + infhandle = SetupOpenInfFileA(path, NULL, INF_STYLE_WIN4, NULL); + SetLastError(0xdeadbeef); + ret = SetupInstallServicesFromInfSectionA(infhandle, "Winetest.Services", 0); + todo_wine + { + ok(ret, "Expected success\n"); + ok(GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %08x\n", GetLastError()); + } + SetupCloseInfFile(infhandle); + DeleteFile(inffile); + + scm_handle = OpenSCManagerA(NULL, NULL, GENERIC_ALL); + + /* Open the service to see if it's really there */ + svc_handle = OpenServiceA(scm_handle, "Winetest", DELETE); + todo_wine + ok(svc_handle != NULL, "Service was not created\n"); + + SetLastError(0xdeadbeef); + ret = DeleteService(svc_handle); + todo_wine + ok(ret, "Service could not be deleted : %d\n", GetLastError()); + + CloseServiceHandle(svc_handle); + CloseServiceHandle(scm_handle); + + /* TODO: Test the Flags */ +} + static void test_driver_install(void) { HANDLE handle; @@ -254,6 +400,7 @@ START_TEST(install) assert(hhook != 0); test_cmdline(); + test_install_svc_from(); test_driver_install(); UnhookWindowsHookEx(hhook); diff --git a/dlls/setupapi/tests/parser.c b/dlls/setupapi/tests/parser.c index 1c3ca49bd4c..d36a729634e 100644 --- a/dlls/setupapi/tests/parser.c +++ b/dlls/setupapi/tests/parser.c @@ -461,11 +461,6 @@ static void test_pSetupGetField(void) field = pSetupGetField( &context, i ); ok( field != NULL, "Failed to get field %i\n", i ); ok( !lstrcmpW( getfield_res[i], field ), "Wrong string returned\n" ); - - ret = HeapFree( GetProcessHeap(), 0, (LPVOID)field ); - ok( !ret, "Expected HeapFree to fail\n" ); - ok( GetLastError() == ERROR_INVALID_PARAMETER, - "Expected ERROR_INVALID_PARAMETER, got %u\n", GetLastError() ); } field = pSetupGetField( &context, 3 ); @@ -480,6 +475,124 @@ static void test_pSetupGetField(void) SetupCloseInfFile( hinf ); } +static void test_GLE(void) +{ + static const char *inf = + "[Version]\n" + "Signature=\"$Windows NT$\"\n" + "[Sectionname]\n" + "Keyname1=Field1,Field2,Field3\n" + "\n" + "Keyname2=Field4,Field5\n"; + HINF hinf; + UINT err; + INFCONTEXT context; + BOOL retb; + LONG retl; + char buf[MAX_INF_STRING_LENGTH]; + int bufsize = MAX_INF_STRING_LENGTH; + DWORD retsize; + + hinf = test_file_contents( inf, &err ); + ok( hinf != NULL, "Expected valid INF file\n" ); + + SetLastError(0xdeadbeef); + retb = SetupFindFirstLineA( hinf, "ImNotThere", NULL, &context ); + ok(!retb, "Expected failure\n"); + todo_wine + ok(GetLastError() == ERROR_LINE_NOT_FOUND, + "Expected ERROR_LINE_NOT_FOUND, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retb = SetupFindFirstLineA( hinf, "ImNotThere", "ImNotThere", &context ); + ok(!retb, "Expected failure\n"); + todo_wine + ok(GetLastError() == ERROR_LINE_NOT_FOUND, + "Expected ERROR_LINE_NOT_FOUND, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retb = SetupFindFirstLineA( hinf, "Sectionname", NULL, &context ); + ok(retb, "Expected success\n"); + ok(GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retb = SetupFindFirstLineA( hinf, "Sectionname", "ImNotThere", &context ); + ok(!retb, "Expected failure\n"); + ok(GetLastError() == ERROR_LINE_NOT_FOUND, + "Expected ERROR_LINE_NOT_FOUND, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retb = SetupFindFirstLineA( hinf, "Sectionname", "Keyname1", &context ); + ok(retb, "Expected success\n"); + ok(GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retb = SetupFindNextMatchLineA( &context, "ImNotThere", &context ); + ok(!retb, "Expected failure\n"); + ok(GetLastError() == ERROR_LINE_NOT_FOUND, + "Expected ERROR_LINE_NOT_FOUND, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retb = SetupFindNextMatchLineA( &context, "Keyname2", &context ); + ok(retb, "Expected success\n"); + ok(GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retl = SetupGetLineCountA( hinf, "ImNotThere"); + ok(retl == -1, "Expected -1, got %d\n", retl); + ok(GetLastError() == ERROR_SECTION_NOT_FOUND, + "Expected ERROR_SECTION_NOT_FOUND, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retl = SetupGetLineCountA( hinf, "Sectionname"); + ok(retl == 2, "Expected 2, got %d\n", retl); + ok(GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retb = SetupGetLineTextA( NULL, hinf, "ImNotThere", "ImNotThere", buf, bufsize, &retsize); + ok(!retb, "Expected failure\n"); + todo_wine + ok(GetLastError() == ERROR_LINE_NOT_FOUND, + "Expected ERROR_LINE_NOT_FOUND, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retb = SetupGetLineTextA( NULL, hinf, "Sectionname", "ImNotThere", buf, bufsize, &retsize); + ok(!retb, "Expected failure\n"); + ok(GetLastError() == ERROR_LINE_NOT_FOUND, + "Expected ERROR_LINE_NOT_FOUND, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retb = SetupGetLineTextA( NULL, hinf, "Sectionname", "Keyname1", buf, bufsize, &retsize); + ok(retb, "Expected success\n"); + ok(GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retb = SetupGetLineByIndexA( hinf, "ImNotThere", 1, &context ); + ok(!retb, "Expected failure\n"); + todo_wine + ok(GetLastError() == ERROR_LINE_NOT_FOUND, + "Expected ERROR_LINE_NOT_FOUND, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retb = SetupGetLineByIndexA( hinf, "Sectionname", 1, &context ); + ok(retb, "Expected success\n"); + ok(GetLastError() == ERROR_SUCCESS, + "Expected ERROR_SUCCESS, got %08x\n", GetLastError()); + + SetLastError(0xdeadbeef); + retb = SetupGetLineByIndexA( hinf, "Sectionname", 3, &context ); + ok(!retb, "Expected failure\n"); + ok(GetLastError() == ERROR_LINE_NOT_FOUND, + "Expected ERROR_LINE_NOT_FOUND, got %08x\n", GetLastError()); + + SetupCloseInfFile( hinf ); +} + START_TEST(parser) { init_function_pointers(); @@ -488,5 +601,6 @@ START_TEST(parser) test_key_names(); test_close_inf_file(); test_pSetupGetField(); + test_GLE(); DeleteFileA( tmpfilename ); } diff --git a/dlls/shell32/shell32_De.rc b/dlls/shell32/shell32_De.rc index 1368d5e12a9..de1e1911d79 100644 --- a/dlls/shell32/shell32_De.rc +++ b/dlls/shell32/shell32_De.rc @@ -106,6 +106,24 @@ FONT 8, "MS Shell Dlg" 4, 40, 180, 120 } +SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 218, 196 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Verzeichnis auswählen" +FONT 8, "MS Shell Dlg" +{ + LTEXT "", IDD_TITLE, 10, 8, 198, 24 + LTEXT "", IDD_STATUS, 10, 25, 198, 12 + LTEXT "Verzeichnis:", IDD_FOLDER, 10, 156, 40, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 12, 38, 194, 105 + EDITTEXT IDD_FOLDERTEXT, 46, 150, 160, 14, WS_BORDER | WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Neues Verzeichnis erstellen", IDD_MAKENEWFOLDER, 12, 174, 95, 14, WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "OK", IDOK, 112, 174, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Abbrechen", IDCANCEL, 161, 174, 45, 14, WS_GROUP | WS_TABSTOP +} + SHELL_YESTOALL_MSGBOX DIALOG 200, 100, 280, 90 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Meldung" diff --git a/dlls/shell32/shell32_En.rc b/dlls/shell32/shell32_En.rc index e4fdea97a0f..68263ce9c7f 100644 --- a/dlls/shell32/shell32_En.rc +++ b/dlls/shell32/shell32_En.rc @@ -136,17 +136,19 @@ FONT 8, "MS Shell Dlg" LTEXT "", IDD_MESSAGE, 40, 10, 238, 52, 0 } -SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 220, 152 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "About %s" FONT 10, "MS Shell Dlg" { - DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + DEFPUSHBUTTON "OK", IDOK, 153, 133, 60, 12, WS_TABSTOP + PUSHBUTTON "Wine &license...", IDC_ABOUT_LICENSE, 153, 113, 60, 12, WS_TABSTOP LISTBOX IDC_ABOUT_LISTBOX, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER ICON "", stc1, 10, 10, 30, 30 - LTEXT "", IDC_ABOUT_STATIC_TEXT1, 40, 10, 137, 10 - LTEXT "", IDC_ABOUT_STATIC_TEXT2, 40, 22, 137, 10 - LTEXT "Wine was brought to you by:", IDC_ABOUT_WINE_TEXT, 8, 55, 137, 10 + LTEXT "", IDC_ABOUT_STATIC_TEXT1, 42, 10, 170, 10 + LTEXT "", IDC_ABOUT_STATIC_TEXT2, 42, 22, 170, 10 + LTEXT "Running on %s", IDC_ABOUT_STATIC_TEXT3, 42, 34, 170, 10 + LTEXT "Wine was brought to you by:", IDC_ABOUT_WINE_TEXT, 8, 54, 204, 10 } SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 @@ -248,3 +250,20 @@ STRINGTABLE IDS_NEWFOLDER "New Folder" } + +STRINGTABLE +{ +IDS_LICENSE_CAPTION, "Wine License" +IDS_LICENSE, +"Wine 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.\n\n\ +Wine 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.\n\n\ +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." +} diff --git a/dlls/shell32/shell32_Ru.rc b/dlls/shell32/shell32_Ru.rc index 886fdc67b08..4efd62a6239 100644 --- a/dlls/shell32/shell32_Ru.rc +++ b/dlls/shell32/shell32_Ru.rc @@ -106,6 +106,37 @@ FONT 8, "MS Shell Dlg" 4, 40, 180, 120 } +SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 218, 196 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Îáçîð" +FONT 8, "MS Shell Dlg" +{ + LTEXT "", IDD_TITLE, 10, 8, 198, 24 + LTEXT "", IDD_STATUS, 10, 25, 198, 12 + LTEXT "Ïàïêà:", IDD_FOLDER, 10, 156, 40, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 12, 38, 194, 105 + EDITTEXT IDD_FOLDERTEXT, 46, 150, 160, 14, WS_BORDER | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Ñîçäàòü &íîâóþ ïàïêó", IDD_MAKENEWFOLDER, 12, 174, 70, 14, WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "Äà", IDOK, 102, 174, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Îòìåíèòü", IDCANCEL, 156, 174, 50, 14, WS_GROUP | WS_TABSTOP +} + +SHELL_YESTOALL_MSGBOX DIALOG 200, 100, 280, 90 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Ñîîáùåíèå" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "&Äà", IDYES, 34, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Äà äëÿ &âñåõ", IDD_YESTOALL, 92, 69, 65, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Íåò", IDNO, 162, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Îòìåíèòü", IDCANCEL, 220, 69, 53, 14, WS_GROUP | WS_TABSTOP + ICON "", IDD_ICON, 10, 10, 16, 16 + LTEXT "", IDD_MESSAGE, 40, 10, 238, 52, 0 +} + SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Î %s" @@ -147,10 +178,13 @@ STRINGTABLE IDS_SHV_COLUMN9 "Êîììåíòàðèé" IDS_SHV_COLUMN10 "Âëàäåëåö" IDS_SHV_COLUMN11 "Ãðóïïà" + IDS_SHV_COLUMN_DELFROM "Èñõîäíîå ìåñòîíàõîäåíèå" + IDS_SHV_COLUMN_DELDATE "Âðåìÿ óäàëåíèÿ" /* special folders */ IDS_DESKTOP "Ðàáî÷èé ñòîë" IDS_MYCOMPUTER "Ìîé êîìïüþòåð" + IDS_RECYCLEBIN_FOLDER_NAME "Êîðçèíà" /* context menus */ IDS_VIEW_LARGE "&Áîëüøèå çíà÷êè" @@ -166,7 +200,12 @@ STRINGTABLE IDS_DELETEFOLDER_CAPTION "Ïîäòâåðæäåíèå óäàëåíèÿ ïàïêè" IDS_DELETEITEM_TEXT "Óäàëèòü '%1'?" IDS_DELETEMULTIPLE_TEXT "Óäàëèòü ýòè îáüåêòû (%1)?" - IDS_OVERWRITEFILE_TEXT "Ïàïêà óæå ñîäåðæèò ôàéë '%1'.\n\nÂû õîòèòå çàìåíèòü åãî?" + IDS_DELETESELECTED_TEXT "Óäàëèòü âûáðàííûå îáüåêòû?" + IDS_TRASHITEM_TEXT "Ïåðåìåñòèòü '%1' â êîðçèíó?" + IDS_TRASHFOLDER_TEXT "Ïåðåìåñòèòü ïàïêó '%1' è âñå åå ñîäåðæèìîå êîðçèíó?" + IDS_TRASHMULTIPLE_TEXT "Ïåðåìåñòèòü îáüåêòû %1 â êîðçèíó?" + IDS_CANTTRASH_TEXT "Îáüåêò '%1' íå ìîæåò áûòü ïîñëàí â êîðçèíó. Âû õîòèòå åãî óäàèòü?" + IDS_OVERWRITEFILE_TEXT "Ïàïêà óæå ñîäåðæèò ôàéë '%1'.\n\nÂû õîòèòå çàìåíèòü åãî?" IDS_OVERWRITEFILE_CAPTION "Ïîäòâåðæäåíèå çàìåíû ôàéëà" IDS_OVERWRITEFOLDER_TEXT "Ýòà ïàïêà óæå ñîäåðæèò ïàïêó '%1'.\n\n"\ "Åñëè ôàéëû â êîíå÷íîé ïàïêå èìåþò òå æå èìåíà, ÷òî è ôàéëû â âûáðàííîé\n"\ diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c index 4163168ed56..30265824b7b 100644 --- a/dlls/shell32/shell32_main.c +++ b/dlls/shell32/shell32_main.c @@ -851,21 +851,19 @@ typedef struct HFONT hFont; } ABOUT_INFO; -#define DROP_FIELD_TOP (-15) -#define DROP_FIELD_HEIGHT 15 +#define DROP_FIELD_TOP (-12) -static BOOL __get_dropline( HWND hWnd, LPRECT lprect ) +static void paint_dropline( HDC hdc, HWND hWnd ) { HWND hWndCtl = GetDlgItem(hWnd, IDC_ABOUT_WINE_TEXT); - - if( hWndCtl ) - { - GetWindowRect( hWndCtl, lprect ); - MapWindowPoints( 0, hWnd, (LPPOINT)lprect, 2 ); - lprect->bottom = (lprect->top += DROP_FIELD_TOP); - return TRUE; - } - return FALSE; + RECT rect; + + if (!hWndCtl) return; + GetWindowRect( hWndCtl, &rect ); + MapWindowPoints( 0, hWnd, (LPPOINT)&rect, 2 ); + rect.top += DROP_FIELD_TOP; + rect.bottom = rect.top + 2; + DrawEdge( hdc, &rect, BDR_SUNKENOUTER, BF_RECT ); } /************************************************************************* @@ -979,26 +977,32 @@ INT_PTR CALLBACK AboutDlgProc( HWND hWnd, UINT msg, WPARAM wParam, case WM_INITDIALOG: { ABOUT_INFO *info = (ABOUT_INFO *)lParam; - WCHAR Template[512], AppTitle[512]; + WCHAR template[512], buffer[512], version[64]; + extern const char *wine_get_build_id(void); if (info) { const char* const *pstr = SHELL_Authors; SendDlgItemMessageW(hWnd, stc1, STM_SETICON,(WPARAM)info->hIcon, 0); - GetWindowTextW( hWnd, Template, sizeof(Template)/sizeof(WCHAR) ); - sprintfW( AppTitle, Template, info->szApp ); - SetWindowTextW( hWnd, AppTitle ); + GetWindowTextW( hWnd, template, sizeof(template)/sizeof(WCHAR) ); + sprintfW( buffer, template, info->szApp ); + SetWindowTextW( hWnd, buffer ); SetWindowTextW( GetDlgItem(hWnd, IDC_ABOUT_STATIC_TEXT1), info->szApp ); SetWindowTextW( GetDlgItem(hWnd, IDC_ABOUT_STATIC_TEXT2), info->szOtherStuff ); + GetWindowTextW( GetDlgItem(hWnd, IDC_ABOUT_STATIC_TEXT3), + template, sizeof(template)/sizeof(WCHAR) ); + MultiByteToWideChar( CP_UTF8, 0, wine_get_build_id(), -1, + version, sizeof(version)/sizeof(WCHAR) ); + sprintfW( buffer, template, version ); + SetWindowTextW( GetDlgItem(hWnd, IDC_ABOUT_STATIC_TEXT3), buffer ); hWndCtl = GetDlgItem(hWnd, IDC_ABOUT_LISTBOX); SendMessageW( hWndCtl, WM_SETREDRAW, 0, 0 ); SendMessageW( hWndCtl, WM_SETFONT, (WPARAM)info->hFont, 0 ); while (*pstr) { - WCHAR name[64]; /* authors list is in utf-8 format */ - MultiByteToWideChar( CP_UTF8, 0, *pstr, -1, name, sizeof(name)/sizeof(WCHAR) ); - SendMessageW( hWndCtl, LB_ADDSTRING, (WPARAM)-1, (LPARAM)name ); + MultiByteToWideChar( CP_UTF8, 0, *pstr, -1, buffer, sizeof(buffer)/sizeof(WCHAR) ); + SendMessageW( hWndCtl, LB_ADDSTRING, (WPARAM)-1, (LPARAM)buffer ); pstr++; } SendMessageW( hWndCtl, WM_SETREDRAW, 1, 0 ); @@ -1008,16 +1012,9 @@ INT_PTR CALLBACK AboutDlgProc( HWND hWnd, UINT msg, WPARAM wParam, case WM_PAINT: { - RECT rect; PAINTSTRUCT ps; HDC hDC = BeginPaint( hWnd, &ps ); - - if (__get_dropline( hWnd, &rect )) - { - SelectObject( hDC, GetStockObject( BLACK_PEN ) ); - MoveToEx( hDC, rect.left, rect.top, NULL ); - LineTo( hDC, rect.right, rect.bottom ); - } + paint_dropline( hDC, hWnd ); EndPaint( hWnd, &ps ); } break; @@ -1028,6 +1025,22 @@ INT_PTR CALLBACK AboutDlgProc( HWND hWnd, UINT msg, WPARAM wParam, EndDialog(hWnd, TRUE); return TRUE; } + if (wParam == IDC_ABOUT_LICENSE) + { + MSGBOXPARAMSW params; + + params.cbSize = sizeof(params); + params.hwndOwner = hWnd; + params.hInstance = shell32_hInstance; + params.lpszText = MAKEINTRESOURCEW(IDS_LICENSE); + params.lpszCaption = MAKEINTRESOURCEW(IDS_LICENSE_CAPTION); + params.dwStyle = MB_ICONINFORMATION | MB_OK; + params.lpszIcon = 0; + params.dwContextHelpId = 0; + params.lpfnMsgBoxCallback = NULL; + params.dwLanguageId = LANG_NEUTRAL; + MessageBoxIndirectW( ¶ms ); + } break; case WM_CLOSE: EndDialog(hWnd, TRUE); diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c index 738e9e39875..c4ae6886898 100644 --- a/dlls/shell32/shellpath.c +++ b/dlls/shell32/shellpath.c @@ -47,6 +47,7 @@ #include "wine/unicode.h" #include "shlwapi.h" #include "xdg.h" +#include "sddl.h" WINE_DEFAULT_DEBUG_CHANNEL(shell); @@ -1356,6 +1357,39 @@ static HRESULT _SHGetCurrentVersionPath(DWORD dwFlags, BYTE folder, return hr; } +static LPWSTR _GetUserSidStringFromToken(HANDLE Token) +{ + char InfoBuffer[64]; + PTOKEN_USER UserInfo; + DWORD InfoSize; + LPWSTR SidStr; + + UserInfo = (PTOKEN_USER) InfoBuffer; + if (! GetTokenInformation(Token, TokenUser, InfoBuffer, sizeof(InfoBuffer), + &InfoSize)) + { + if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) + return NULL; + UserInfo = HeapAlloc(GetProcessHeap(), 0, InfoSize); + if (UserInfo == NULL) + return NULL; + if (! GetTokenInformation(Token, TokenUser, UserInfo, InfoSize, + &InfoSize)) + { + HeapFree(GetProcessHeap(), 0, UserInfo); + return NULL; + } + } + + if (! ConvertSidToStringSidW(UserInfo->User.Sid, &SidStr)) + SidStr = NULL; + + if (UserInfo != (PTOKEN_USER) InfoBuffer) + HeapFree(GetProcessHeap(), 0, UserInfo); + + return SidStr; +} + /* Gets the user's path (unexpanded) for the CSIDL with index folder: * If SHGFP_TYPE_DEFAULT is set, calls _SHGetDefaultValue for it. Otherwise * calls _SHGetUserShellFolderPath for it. Where it looks depends on hToken: @@ -1378,22 +1412,15 @@ static HRESULT _SHGetUserProfilePath(HANDLE hToken, DWORD dwFlags, BYTE folder, if (!pszPath) return E_INVALIDARG; - /* Only the current user and the default user are supported right now - * I'm afraid. - * FIXME: should be able to call GetTokenInformation on the token, - * then call ConvertSidToStringSidW on it to get the user prefix. - * But Wine's registry doesn't store user info by sid, it stores it - * by user name (and I don't know how to convert from a token to a - * user name). - */ - if (hToken != NULL && hToken != (HANDLE)-1) - { - FIXME("unsupported for user other than current or default\n"); - return E_FAIL; - } - if (dwFlags & SHGFP_TYPE_DEFAULT) + { + if (hToken != NULL && hToken != (HANDLE)-1) + { + FIXME("unsupported for user other than current or default\n"); + return E_FAIL; + } hr = _SHGetDefaultValue(folder, pszPath); + } else { LPCWSTR userPrefix = NULL; @@ -1404,8 +1431,18 @@ static HRESULT _SHGetUserProfilePath(HANDLE hToken, DWORD dwFlags, BYTE folder, hRootKey = HKEY_USERS; userPrefix = DefaultW; } - else /* hToken == NULL, other values disallowed above */ + else if (hToken == NULL) hRootKey = HKEY_CURRENT_USER; + else + { + hRootKey = HKEY_USERS; + userPrefix = _GetUserSidStringFromToken(hToken); + if (userPrefix == NULL) + { + hr = E_FAIL; + goto error; + } + } hr = _SHGetUserShellFolderPath(hRootKey, userPrefix, CSIDL_Data[folder].szValueName, pszPath); if (FAILED(hr) && hRootKey != HKEY_LOCAL_MACHINE) @@ -1413,7 +1450,10 @@ static HRESULT _SHGetUserProfilePath(HANDLE hToken, DWORD dwFlags, BYTE folder, CSIDL_Data[folder].szValueName, pszPath); if (FAILED(hr)) hr = _SHGetDefaultValue(folder, pszPath); + if (userPrefix != NULL && userPrefix != DefaultW) + LocalFree((HLOCAL) userPrefix); } +error: TRACE("returning 0x%08x (output path is %s)\n", hr, debugstr_w(pszPath)); return hr; } diff --git a/dlls/shell32/shresdef.h b/dlls/shell32/shresdef.h index 211bcfe8c71..24373b719ba 100644 --- a/dlls/shell32/shresdef.h +++ b/dlls/shell32/shresdef.h @@ -96,6 +96,9 @@ #define IDS_NEWFOLDER 142 +#define IDS_LICENSE 256 +#define IDS_LICENSE_CAPTION 257 + #define MENU_SHV_FILE 144 /* Note: this string is referenced from the registry*/ @@ -161,9 +164,11 @@ FIXME: Need to add them, but for now just let them use the same: searching.avi #define IDR_AVI_FILEDELETE 164 /* about box */ +#define IDC_ABOUT_LICENSE 97 #define IDC_ABOUT_WINE_TEXT 98 #define IDC_ABOUT_LISTBOX 99 #define IDC_ABOUT_STATIC_TEXT1 100 #define IDC_ABOUT_STATIC_TEXT2 101 +#define IDC_ABOUT_STATIC_TEXT3 102 #endif diff --git a/dlls/shlwapi/shlwapi.rc b/dlls/shlwapi/shlwapi.rc index 3018685d607..2609035545d 100644 --- a/dlls/shlwapi/shlwapi.rc +++ b/dlls/shlwapi/shlwapi.rc @@ -40,5 +40,6 @@ #include "shlwapi_Pl.rc" #include "shlwapi_Pt.rc" #include "shlwapi_Ro.rc" +#include "shlwapi_Ru.rc" #include "shlwapi_Sv.rc" #include "shlwapi_Tr.rc" diff --git a/dlls/shlwapi/shlwapi_Ru.rc b/dlls/shlwapi/shlwapi_Ru.rc new file mode 100644 index 00000000000..87aee4acb8a --- /dev/null +++ b/dlls/shlwapi/shlwapi_Ru.rc @@ -0,0 +1,43 @@ +/* + * Russian resources for shlwapi + * + * Copyright 2008 Vitaliy Margolen + * + * 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_RUSSIAN, SUBLANG_DEFAULT + +IDD_ERR_DIALOG DIALOG MOVEABLE DISCARDABLE 0, 0, 220, 60 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Îøèáêà!" +FONT 8, "MS Shell Dlg" +{ + LTEXT "", IDS_ERR_USER_MSG2, 15, 5, 28, 20 + LTEXT "", IDS_ERR_USER_MSG, 15, 5, 210, 8 + CHECKBOX "Áîëüøå íå &ïîêàçûâàòü ýòî ñîîáùåíèå", IDC_ERR_DONT_SHOW, 5, 20, 210, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + PUSHBUTTON L"&OK" IDOK, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"Î&òìåíèòü" IDCANCEL, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"&Äà" IDYES, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON L"&Íåò" IDNO, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ + IDS_BYTES_FORMAT "%ld áàéò" + IDS_TIME_INTERVAL_HOURS " ÷àñ" + IDS_TIME_INTERVAL_MINUTES " ìèí" + IDS_TIME_INTERVAL_SECONDS " ñåê" +} diff --git a/dlls/shlwapi/tests/Makefile.in b/dlls/shlwapi/tests/Makefile.in index 42382761e4e..f4c81f236ed 100644 --- a/dlls/shlwapi/tests/Makefile.in +++ b/dlls/shlwapi/tests/Makefile.in @@ -10,6 +10,7 @@ CTESTS = \ clist.c \ clsid.c \ generated.c \ + istream.c \ ordinal.c \ path.c \ shreg.c \ diff --git a/dlls/shlwapi/tests/istream.c b/dlls/shlwapi/tests/istream.c new file mode 100644 index 00000000000..5a508388e29 --- /dev/null +++ b/dlls/shlwapi/tests/istream.c @@ -0,0 +1,575 @@ +/* Unit test suite for SHLWAPI ShCreateStreamOnFile functions. + * + * Copyright 2008 Reece H. Dunn + * + * 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 + */ + +#define COBJMACROS + +#include +#include + +#include "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "objbase.h" +#include "shlwapi.h" + + +/* Function pointers for the SHCreateStreamOnFile functions */ +static HMODULE hShlwapi; +static HRESULT (WINAPI *pSHCreateStreamOnFileA)(LPCSTR file, DWORD mode, IStream **stream); +static HRESULT (WINAPI *pSHCreateStreamOnFileW)(LPCWSTR file, DWORD mode, IStream **stream); +static HRESULT (WINAPI *pSHCreateStreamOnFileEx)(LPCWSTR file, DWORD mode, DWORD attributes, BOOL create, IStream *template, IStream **stream); + + +static void test_IStream_invalid_operations(IStream * stream, DWORD mode) +{ + HRESULT ret; + IStream * clone; + ULONG refcount; + ULARGE_INTEGER uzero; + ULARGE_INTEGER uret; + LARGE_INTEGER zero; + ULONG count; + char data[256]; + + U(uzero).HighPart = 0; + U(uzero).LowPart = 0; + U(uret).HighPart = 0; + U(uret).LowPart = 0; + U(zero).HighPart = 0; + U(zero).LowPart = 0; + + /* IStream::Read */ + + /* IStream_Read from the COBJMACROS is undefined by shlwapi.h, replaced by the IStream_Read helper function. */ + + ret = stream->lpVtbl->Read(stream, NULL, 0, &count); + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + ret = stream->lpVtbl->Read(stream, data, 5, NULL); + ok(ret == S_FALSE || ret == S_OK, "expected S_FALSE or S_OK, got 0x%08x\n", ret); + + ret = stream->lpVtbl->Read(stream, data, 0, NULL); + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + ret = stream->lpVtbl->Read(stream, data, 3, &count); + ok(ret == S_FALSE || ret == S_OK, "expected S_FALSE or S_OK, got 0x%08x\n", ret); + + /* IStream::Write */ + + /* IStream_Write from the COBJMACROS is undefined by shlwapi.h, replaced by the IStream_Write helper function. */ + + ret = stream->lpVtbl->Write(stream, NULL, 0, &count); + if (mode == STGM_READ) + ok(ret == STG_E_ACCESSDENIED, "expected STG_E_ACCESSDENIED, got 0x%08x\n", ret); + else + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + strcpy(data, "Hello"); + ret = stream->lpVtbl->Write(stream, data, 5, NULL); + if (mode == STGM_READ) + ok(ret == STG_E_ACCESSDENIED, "expected STG_E_ACCESSDENIED, got 0x%08x\n", ret); + else + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + strcpy(data, "Hello"); + ret = stream->lpVtbl->Write(stream, data, 0, NULL); + if (mode == STGM_READ) + ok(ret == STG_E_ACCESSDENIED, "expected STG_E_ACCESSDENIED, got 0x%08x\n", ret); + else + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + strcpy(data, "Hello"); + ret = stream->lpVtbl->Write(stream, data, 0, &count); + if (mode == STGM_READ) + ok(ret == STG_E_ACCESSDENIED, "expected STG_E_ACCESSDENIED, got 0x%08x\n", ret); + else + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + strcpy(data, "Hello"); + ret = stream->lpVtbl->Write(stream, data, 3, &count); + if (mode == STGM_READ) + ok(ret == STG_E_ACCESSDENIED, "expected STG_E_ACCESSDENIED, got 0x%08x\n", ret); + else + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + /* IStream::Seek */ + + ret = IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL); + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + ret = IStream_Seek(stream, zero, 20, NULL); + ok(ret == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", ret); + + /* IStream::CopyTo */ + + ret = IStream_CopyTo(stream, NULL, uzero, &uret, &uret); + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + clone = NULL; + ret = IStream_CopyTo(stream, clone, uzero, &uret, &uret); + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + ret = IStream_CopyTo(stream, stream, uzero, &uret, &uret); + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + ret = IStream_CopyTo(stream, stream, uzero, &uret, NULL); + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + ret = IStream_CopyTo(stream, stream, uzero, NULL, &uret); + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + /* IStream::Commit */ + + ret = IStream_Commit(stream, STGC_DEFAULT); + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + /* IStream::Revert */ + + ret = IStream_Revert(stream); + ok(ret == E_NOTIMPL, "expected E_NOTIMPL, got 0x%08x\n", ret); + + /* IStream::LockRegion */ + + ret = IStream_LockRegion(stream, uzero, uzero, 0); + ok(ret == E_NOTIMPL /* XP */ || ret == S_OK /* Vista */, + "expected E_NOTIMPL or S_OK, got 0x%08x\n", ret); + + /* IStream::UnlockRegion */ + + if (ret == E_NOTIMPL) /* XP */ { + ret = IStream_UnlockRegion(stream, uzero, uzero, 0); + ok(ret == E_NOTIMPL, "expected E_NOTIMPL, got 0x%08x\n", ret); + } else /* Vista */ { + ret = IStream_UnlockRegion(stream, uzero, uzero, 0); + ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); + + ret = IStream_UnlockRegion(stream, uzero, uzero, 0); + ok(ret == STG_E_LOCKVIOLATION, "expected STG_E_LOCKVIOLATION, got 0x%08x\n", ret); + } + + /* IStream::Stat */ + + ret = IStream_Stat(stream, NULL, 0); + ok(ret == STG_E_INVALIDPOINTER, "expected STG_E_INVALIDPOINTER, got 0x%08x\n", ret); + + /* IStream::Clone */ + + ret = IStream_Clone(stream, NULL); + ok(ret == E_NOTIMPL, "expected E_NOTIMPL, got 0x%08x\n", ret); + + clone = NULL; + ret = IStream_Clone(stream, &clone); + ok(ret == E_NOTIMPL, "expected E_NOTIMPL, got 0x%08x\n", ret); + ok(clone == NULL, "expected a NULL IStream object, got %p\n", stream); + + if (clone) { + refcount = IStream_Release(clone); + ok(refcount == 0, "expected 0, got %d\n", refcount); + } +} + + +static void test_SHCreateStreamOnFileA(DWORD mode) +{ + IStream * stream; + HRESULT ret; + ULONG refcount; + static const char * test_file = "c:\\test.txt"; + + printf("SHCreateStreamOnFileA: testing mode %d\n", mode); + + /* invalid arguments */ + + stream = NULL; + ret = (*pSHCreateStreamOnFileA)(NULL, mode, &stream); + todo_wine + ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "SHCreateStreamOnFileA: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileA: expected a NULL IStream object, got %p\n", stream); + +#if 0 /* This test crashes on WinXP SP2 */ + ret = (*pSHCreateStreamOnFileA)(test_file, mode, NULL); + ok(ret == E_INVALIDARG, "SHCreateStreamOnFileA: expected E_INVALIDARG, got 0x%08x\n", ret); +#endif + + stream = NULL; + ret = (*pSHCreateStreamOnFileA)(test_file, mode | STGM_CONVERT, &stream); + ok(ret == E_INVALIDARG, "SHCreateStreamOnFileA: expected E_INVALIDARG, got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileA: expected a NULL IStream object, got %p\n", stream); + + stream = NULL; + ret = (*pSHCreateStreamOnFileA)(test_file, mode | STGM_DELETEONRELEASE, &stream); + ok(ret == E_INVALIDARG, "SHCreateStreamOnFileA: expected E_INVALIDARG, got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileA: expected a NULL IStream object, got %p\n", stream); + + stream = NULL; + ret = (*pSHCreateStreamOnFileA)(test_file, mode | STGM_TRANSACTED, &stream); + ok(ret == E_INVALIDARG, "SHCreateStreamOnFileA: expected E_INVALIDARG, got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileA: expected a NULL IStream object, got %p\n", stream); + + /* file does not exist */ + + stream = NULL; + ret = (*pSHCreateStreamOnFileA)(test_file, mode | STGM_FAILIFTHERE, &stream); + todo_wine + ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "SHCreateStreamOnFileA: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileA: expected a NULL IStream object, got %p\n", stream); + + stream = NULL; + ret = (*pSHCreateStreamOnFileA)(test_file, mode | STGM_CREATE, &stream); + todo_wine + ok(ret == S_OK, "SHCreateStreamOnFileA: expected S_OK, got 0x%08x\n", ret); + todo_wine + ok(stream != NULL, "SHCreateStreamOnFileA: expected a valid IStream object, got NULL\n"); + + if (stream) { + test_IStream_invalid_operations(stream, mode); + + refcount = IStream_Release(stream); + ok(refcount == 0, "SHCreateStreamOnFileA: expected 0, got %d\n", refcount); + } + + /* NOTE: don't delete the file, as it will be used for the file exists tests. */ + + /* file exists */ + + stream = NULL; + ret = (*pSHCreateStreamOnFileA)(test_file, mode | STGM_FAILIFTHERE, &stream); + todo_wine + ok(ret == S_OK, "SHCreateStreamOnFileA: expected S_OK, got 0x%08x\n", ret); + todo_wine + ok(stream != NULL, "SHCreateStreamOnFileA: expected a valid IStream object, got NULL\n"); + + if (stream) { + test_IStream_invalid_operations(stream, mode); + + refcount = IStream_Release(stream); + ok(refcount == 0, "SHCreateStreamOnFileA: expected 0, got %d\n", refcount); + } + + stream = NULL; + ret = (*pSHCreateStreamOnFileA)(test_file, mode | STGM_CREATE, &stream); + todo_wine + ok(ret == S_OK, "SHCreateStreamOnFileA: expected S_OK, got 0x%08x\n", ret); + todo_wine + ok(stream != NULL, "SHCreateStreamOnFileA: expected a valid IStream object, got NULL\n"); + + if (stream) { + test_IStream_invalid_operations(stream, mode); + + refcount = IStream_Release(stream); + ok(refcount == 0, "SHCreateStreamOnFileA: expected 0, got %d\n", refcount); + + ok(DeleteFileA(test_file), "SHCreateStreamOnFileA: could not delete file '%s', got error %d\n", test_file, GetLastError()); + } +} + + +static void test_SHCreateStreamOnFileW(DWORD mode) +{ + IStream * stream; + HRESULT ret; + ULONG refcount; + static const WCHAR test_file[] = { 'c', ':', '\\', 't', 'e', 's', 't', '.', 't', 'x', 't' }; + + printf("SHCreateStreamOnFileW: testing mode %d\n", mode); + + /* invalid arguments */ + + stream = NULL; + ret = (*pSHCreateStreamOnFileW)(NULL, mode, &stream); + ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) || /* XP */ + ret == E_INVALIDARG /* Vista */, + "SHCreateStreamOnFileW: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) or E_INVALIDARG, got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileW: expected a NULL IStream object, got %p\n", stream); + +#if 0 /* This test crashes on WinXP SP2 */ + ret = (*pSHCreateStreamOnFileW)(test_file, mode, NULL); + ok(ret == E_INVALIDARG, "SHCreateStreamOnFileW: expected E_INVALIDARG, got 0x%08x\n", ret); +#endif + + stream = NULL; + ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_CONVERT, &stream); + ok(ret == E_INVALIDARG, "SHCreateStreamOnFileW: expected E_INVALIDARG, got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileW: expected a NULL IStream object, got %p\n", stream); + + stream = NULL; + ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_DELETEONRELEASE, &stream); + ok(ret == E_INVALIDARG, "SHCreateStreamOnFileW: expected E_INVALIDARG, got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileW: expected a NULL IStream object, got %p\n", stream); + + stream = NULL; + ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_TRANSACTED, &stream); + ok(ret == E_INVALIDARG, "SHCreateStreamOnFileW: expected E_INVALIDARG, got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileW: expected a NULL IStream object, got %p\n", stream); + + /* file does not exist */ + + stream = NULL; + ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_FAILIFTHERE, &stream); + todo_wine + ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "SHCreateStreamOnFileW: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileW: expected a NULL IStream object, got %p\n", stream); + + stream = NULL; + ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_CREATE, &stream); + todo_wine + ok(ret == S_OK, "SHCreateStreamOnFileW: expected S_OK, got 0x%08x\n", ret); + todo_wine + ok(stream != NULL, "SHCreateStreamOnFileW: expected a valid IStream object, got NULL\n"); + + if (stream) { + test_IStream_invalid_operations(stream, mode); + + refcount = IStream_Release(stream); + ok(refcount == 0, "SHCreateStreamOnFileW: expected 0, got %d\n", refcount); + } + + /* NOTE: don't delete the file, as it will be used for the file exists tests. */ + + /* file exists */ + + stream = NULL; + ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_FAILIFTHERE, &stream); + todo_wine + ok(ret == S_OK, "SHCreateStreamOnFileW: expected S_OK, got 0x%08x\n", ret); + todo_wine + ok(stream != NULL, "SHCreateStreamOnFileW: expected a valid IStream object, got NULL\n"); + + if (stream) { + test_IStream_invalid_operations(stream, mode); + + refcount = IStream_Release(stream); + ok(refcount == 0, "SHCreateStreamOnFileW: expected 0, got %d\n", refcount); + } + + stream = NULL; + ret = (*pSHCreateStreamOnFileW)(test_file, mode | STGM_CREATE, &stream); + todo_wine + ok(ret == S_OK, "SHCreateStreamOnFileW: expected S_OK, got 0x%08x\n", ret); + todo_wine + ok(stream != NULL, "SHCreateStreamOnFileW: expected a valid IStream object, got NULL\n"); + + if (stream) { + test_IStream_invalid_operations(stream, mode); + + refcount = IStream_Release(stream); + ok(refcount == 0, "SHCreateStreamOnFileW: expected 0, got %d\n", refcount); + + ok(DeleteFileW(test_file), "SHCreateStreamOnFileW: could not delete the test file, got error %d\n", GetLastError()); + } +} + + +static void test_SHCreateStreamOnFileEx(DWORD mode, DWORD stgm) +{ + IStream * stream; + IStream * template = NULL; + HRESULT ret; + ULONG refcount; + static const WCHAR test_file[] = { 'c', ':', '\\', 't', 'e', 's', 't', '.', 't', 'x', 't' }; + + printf("SHCreateStreamOnFileEx: testing mode %d, STGM flags %08x\n", mode, stgm); + + /* invalid arguments */ + + stream = NULL; + ret = (*pSHCreateStreamOnFileEx)(NULL, mode, 0, FALSE, NULL, &stream); + ok(ret == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) || /* XP */ + ret == E_INVALIDARG /* Vista */, + "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) or E_INVALIDARG, got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileEx: expected a NULL IStream object, got %p\n", stream); + + stream = NULL; + ret = (*pSHCreateStreamOnFileEx)(test_file, mode, 0, FALSE, template, &stream); + todo_wine + ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileEx: expected a NULL IStream object, got %p\n", stream); + +#if 0 /* This test crashes on WinXP SP2 */ + ret = (*pSHCreateStreamOnFileEx)(test_file, mode, 0, FALSE, NULL, NULL); + ok(ret == E_INVALIDARG, "SHCreateStreamOnFileEx: expected E_INVALIDARG, got 0x%08x\n", ret); +#endif + + /* file does not exist */ + + stream = NULL; + ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_FAILIFTHERE | stgm, 0, FALSE, NULL, &stream); + if ((stgm & STGM_TRANSACTED) == STGM_TRANSACTED && mode == STGM_READ) { + ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND) /* XP */ || ret == E_INVALIDARG /* Vista */, + "SHCreateStreamOnFileEx: expected E_INVALIDARG or HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got 0x%08x\n", ret); + + if (ret == E_INVALIDARG) { + printf("SHCreateStreamOnFileEx: STGM_TRANSACTED not supported in this configuration... skipping.\n"); + return; + } + } else { + todo_wine + ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got 0x%08x\n", ret); + } + ok(stream == NULL, "SHCreateStreamOnFileEx: expected a NULL IStream object, got %p\n", stream); + + stream = NULL; + ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_FAILIFTHERE | stgm, 0, TRUE, NULL, &stream); + todo_wine + ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret); + todo_wine + ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n"); + + if (stream) { + test_IStream_invalid_operations(stream, mode); + + refcount = IStream_Release(stream); + ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount); + + ok(DeleteFileW(test_file), "SHCreateStreamOnFileEx: could not delete the test file, got error %d\n", GetLastError()); + } + + stream = NULL; + ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, FALSE, NULL, &stream); + todo_wine + ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret); + todo_wine + ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n"); + + if (stream) { + test_IStream_invalid_operations(stream, mode); + + refcount = IStream_Release(stream); + ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount); + + ok(DeleteFileW(test_file), "SHCreateStreamOnFileEx: could not delete the test file, got error %d\n", GetLastError()); + } + + stream = NULL; + ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, TRUE, NULL, &stream); + todo_wine + ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret); + todo_wine + ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n"); + + if (stream) { + test_IStream_invalid_operations(stream, mode); + + refcount = IStream_Release(stream); + ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount); + } + + /* NOTE: don't delete the file, as it will be used for the file exists tests. */ + + /* file exists */ + + stream = NULL; + ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_FAILIFTHERE | stgm, 0, FALSE, NULL, &stream); + todo_wine + ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret); + todo_wine + ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n"); + + if (stream) { + test_IStream_invalid_operations(stream, mode); + + refcount = IStream_Release(stream); + ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount); + } + + stream = NULL; + ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_FAILIFTHERE | stgm, 0, TRUE, NULL, &stream); + todo_wine + ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_EXISTS), "SHCreateStreamOnFileEx: expected HRESULT_FROM_WIN32(ERROR_FILE_EXISTS), got 0x%08x\n", ret); + ok(stream == NULL, "SHCreateStreamOnFileEx: expected a NULL IStream object, got %p\n", stream); + + stream = NULL; + ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, FALSE, NULL, &stream); + todo_wine + ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret); + todo_wine + ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n"); + + if (stream) { + test_IStream_invalid_operations(stream, mode); + + refcount = IStream_Release(stream); + ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount); + } + + stream = NULL; + ret = (*pSHCreateStreamOnFileEx)(test_file, mode | STGM_CREATE | stgm, 0, TRUE, NULL, &stream); + todo_wine + ok(ret == S_OK, "SHCreateStreamOnFileEx: expected S_OK, got 0x%08x\n", ret); + todo_wine + ok(stream != NULL, "SHCreateStreamOnFileEx: expected a valid IStream object, got NULL\n"); + + if (stream) { + test_IStream_invalid_operations(stream, mode); + + refcount = IStream_Release(stream); + ok(refcount == 0, "SHCreateStreamOnFileEx: expected 0, got %d\n", refcount); + } + + todo_wine + ok(DeleteFileW(test_file), "SHCreateStreamOnFileEx: could not delete the test file, got error %d\n", GetLastError()); +} + + +START_TEST(istream) +{ + static const DWORD stgm_flags[] = { + 0, + STGM_CONVERT, + STGM_DELETEONRELEASE, + STGM_CONVERT | STGM_DELETEONRELEASE, + STGM_TRANSACTED | STGM_CONVERT, + STGM_TRANSACTED | STGM_DELETEONRELEASE, + STGM_TRANSACTED | STGM_CONVERT | STGM_DELETEONRELEASE + }; + + hShlwapi = GetModuleHandleA("shlwapi.dll"); + + pSHCreateStreamOnFileA = (void*)GetProcAddress(hShlwapi, "SHCreateStreamOnFileA"); + pSHCreateStreamOnFileW = (void*)GetProcAddress(hShlwapi, "SHCreateStreamOnFileW"); + pSHCreateStreamOnFileEx = (void*)GetProcAddress(hShlwapi, "SHCreateStreamOnFileEx"); + + if (!pSHCreateStreamOnFileA) + printf("SHCreateStreamOnFileA not found... skipping tests.\n"); + else { + test_SHCreateStreamOnFileA(STGM_READ); + test_SHCreateStreamOnFileA(STGM_WRITE); + test_SHCreateStreamOnFileA(STGM_READWRITE); + } + + if (!pSHCreateStreamOnFileW) + printf("SHCreateStreamOnFileW not found... skipping tests.\n"); + else { + test_SHCreateStreamOnFileW(STGM_READ); + test_SHCreateStreamOnFileW(STGM_WRITE); + test_SHCreateStreamOnFileW(STGM_READWRITE); + } + + if (!pSHCreateStreamOnFileEx) + printf("SHCreateStreamOnFileEx not found... skipping tests.\n"); + else { + int i; + + for (i = 0; i != sizeof(stgm_flags)/sizeof(stgm_flags[0]); i++) { + test_SHCreateStreamOnFileEx(STGM_READ, stgm_flags[i]); + test_SHCreateStreamOnFileEx(STGM_WRITE, stgm_flags[i]); + test_SHCreateStreamOnFileEx(STGM_READWRITE, stgm_flags[i]); + } + } +} diff --git a/dlls/urlmon/sec_mgr.c b/dlls/urlmon/sec_mgr.c index 049ed2acbee..943b6dd7678 100644 --- a/dlls/urlmon/sec_mgr.c +++ b/dlls/urlmon/sec_mgr.c @@ -445,7 +445,7 @@ static HRESULT WINAPI SecManagerImpl_GetSecurityId(IInternetSecurityManager *ifa return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); } - WideCharToMultiByte(CP_ACP, 0, url, -1, (LPSTR)pbSecurityId, -1, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, url, -1, (LPSTR)pbSecurityId, len, NULL, NULL); heap_free(url); *(DWORD*)(pbSecurityId+len) = zone; diff --git a/dlls/user32/combo.c b/dlls/user32/combo.c index 549600e7ede..14eebe8e831 100644 --- a/dlls/user32/combo.c +++ b/dlls/user32/combo.c @@ -884,16 +884,9 @@ static HBRUSH COMBO_PrepareColors( } else { - if (lphc->wState & CBF_EDIT) - { + /* FIXME: In which cases WM_CTLCOLORLISTBOX should be sent? */ hBkgBrush = (HBRUSH)SendMessageW(lphc->owner, WM_CTLCOLOREDIT, (WPARAM)hDC, (LPARAM)lphc->self ); - } - else - { - hBkgBrush = (HBRUSH)SendMessageW(lphc->owner, WM_CTLCOLORLISTBOX, - (WPARAM)hDC, (LPARAM)lphc->self ); - } } /* @@ -1350,6 +1343,14 @@ static LRESULT COMBO_Command( LPHEADCOMBO lphc, WPARAM wParam, HWND hWnd ) TRACE("[%p]: lbox selection change [%x]\n", lphc->self, lphc->wState ); + /* do not roll up if selection is being tracked + * by arrowkeys in the dropdown listbox */ + if (!(lphc->wState & CBF_NOROLLUP)) + { + CBRollUp( lphc, (HIWORD(wParam) == LBN_SELCHANGE), TRUE ); + } + else lphc->wState &= ~CBF_NOROLLUP; + CB_NOTIFY( lphc, CBN_SELCHANGE ); if( HIWORD(wParam) == LBN_SELCHANGE) @@ -1363,17 +1364,11 @@ static LRESULT COMBO_Command( LPHEADCOMBO lphc, WPARAM wParam, HWND hWnd ) SendMessageW(lphc->hWndEdit, EM_SETSEL, 0, (LPARAM)(-1)); } else + { InvalidateRect(lphc->self, &lphc->textRect, TRUE); + UpdateWindow(lphc->self); + } } - - /* do not roll up if selection is being tracked - * by arrowkeys in the dropdown listbox */ - if( ((lphc->wState & CBF_DROPPED) && !(lphc->wState & CBF_NOROLLUP)) ) - { - CBRollUp( lphc, (HIWORD(wParam) == LBN_SELCHANGE), TRUE ); - } - else lphc->wState &= ~CBF_NOROLLUP; - break; case LBN_SETFOCUS: diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c index b1a0007598f..dd5ba0a8679 100644 --- a/dlls/user32/edit.c +++ b/dlls/user32/edit.c @@ -795,21 +795,36 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, result = DLGC_HASSETSEL | DLGC_WANTCHARS | DLGC_WANTARROWS; if (es->style & ES_MULTILINE) - { result |= DLGC_WANTALLKEYS; - break; - } if (lParam && (((LPMSG)lParam)->message == WM_KEYDOWN)) { int vk = (int)((LPMSG)lParam)->wParam; - if (es->hwndListBox && (vk == VK_RETURN || vk == VK_ESCAPE)) - { - if (SendMessageW(GetParent(hwnd), CB_GETDROPPEDSTATE, 0, 0)) - result |= DLGC_WANTMESSAGE; - } - } + if (es->hwndListBox) + { + if (vk == VK_RETURN || vk == VK_ESCAPE) + if (SendMessageW(GetParent(hwnd), CB_GETDROPPEDSTATE, 0, 0)) + result |= DLGC_WANTMESSAGE; + } + else + { + switch (vk) + { + case VK_RETURN: + SendMessageW(GetParent(hwnd), WM_COMMAND, IDOK, (LPARAM)GetDlgItem(GetParent(hwnd), IDOK)); + break; + case VK_ESCAPE: + SendMessageW(GetParent(hwnd), WM_CLOSE, 0, 0); + break; + case VK_TAB: + SendMessageW(GetParent(hwnd), WM_NEXTDLGCTL, (GetKeyState(VK_SHIFT) & 0x8000), 0); + break; + default: + break; + } + } + } break; case WM_IME_CHAR: @@ -838,12 +853,22 @@ static LRESULT WINAPI EditWndProc_common( HWND hwnd, UINT msg, MultiByteToWideChar(CP_ACP, 0, &charA, 1, &charW, 1); } - if ((charW == VK_RETURN || charW == VK_ESCAPE) && es->hwndListBox) - { - if (SendMessageW(GetParent(hwnd), CB_GETDROPPEDSTATE, 0, 0)) - SendMessageW(GetParent(hwnd), WM_KEYDOWN, charW, 0); - break; - } + if (es->hwndListBox) + { + if (charW == VK_RETURN || charW == VK_ESCAPE) + { + if (SendMessageW(GetParent(hwnd), CB_GETDROPPEDSTATE, 0, 0)) + { + SendMessageW(GetParent(hwnd), WM_KEYDOWN, charW, 0); + break; + } + } + } + else + { + if (charW == VK_TAB || charW == VK_RETURN) + break; + } EDIT_WM_Char(es, charW); break; } diff --git a/dlls/user32/listbox.c b/dlls/user32/listbox.c index 72326442bf1..0b318fa7dfb 100644 --- a/dlls/user32/listbox.c +++ b/dlls/user32/listbox.c @@ -2442,7 +2442,7 @@ static LRESULT LISTBOX_HandleKeyDown( LB_DESCR *descr, DWORD key ) LISTBOX_SetSelection( descr, caret, TRUE, FALSE); if (descr->style & LBS_NOTIFY) { - if( descr->lphc ) + if (descr->lphc && IsWindowVisible( descr->self )) { /* make sure that combo parent doesn't hide us */ descr->lphc->wState |= CBF_NOROLLUP; diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c index 17b2179c034..2efc415bb45 100644 --- a/dlls/user32/menu.c +++ b/dlls/user32/menu.c @@ -2963,6 +2963,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y, INT executedMenuId = -1; MTRACKER mt; BOOL enterIdleSent = FALSE; + HWND capture_win; mt.trackFlags = 0; mt.hCurrentMenu = hmenu; @@ -2991,7 +2992,9 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y, if (wFlags & TF_ENDMENU) fEndMenu = TRUE; - set_capture_window( mt.hOwnerWnd, GUI_INMENUMODE, NULL ); + /* owner may not be visible when tracking a popup, so use the menu itself */ + capture_win = (wFlags & TPM_POPUPMENU) ? menu->hWnd : mt.hOwnerWnd; + set_capture_window( capture_win, GUI_INMENUMODE, NULL ); while (!fEndMenu) { diff --git a/dlls/user32/msgbox.c b/dlls/user32/msgbox.c index 1d344492e04..d9cec530a41 100644 --- a/dlls/user32/msgbox.c +++ b/dlls/user32/msgbox.c @@ -74,7 +74,9 @@ static HFONT MSGBOX_OnInit(HWND hwnd, LPMSGBOXPARAMSW lpmb) HMONITOR monitor = 0; MONITORINFO mon_info; LPCWSTR lpszText; - WCHAR buf[256]; + WCHAR *buffer = NULL; + const WCHAR *ptr; + /* Index the order the buttons need to appear to an ID* constant */ static const int buttonOrder[10] = { 6, 7, 1, 3, 4, 2, 5, 10, 11, 9 }; @@ -93,26 +95,30 @@ static HFONT MSGBOX_OnInit(HWND hwnd, LPMSGBOXPARAMSW lpmb) if (HIWORD(lpmb->lpszCaption)) { SetWindowTextW(hwnd, lpmb->lpszCaption); } else { - UINT res_id = LOWORD(lpmb->lpszCaption); - if (res_id) - { - if (LoadStringW(lpmb->hInstance, res_id, buf, 256)) - SetWindowTextW(hwnd, buf); - } - else - { - if (LoadStringW(user32_module, IDS_ERROR, buf, 256)) - SetWindowTextW(hwnd, buf); - } + UINT len = LoadStringW( lpmb->hInstance, LOWORD(lpmb->lpszCaption), (LPWSTR)&ptr, 0 ); + if (!len) len = LoadStringW( user32_module, IDS_ERROR, (LPWSTR)&ptr, 0 ); + buffer = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) ); + if (buffer) + { + memcpy( buffer, ptr, len * sizeof(WCHAR) ); + buffer[len] = 0; + SetWindowTextW( hwnd, buffer ); + HeapFree( GetProcessHeap(), 0, buffer ); + buffer = NULL; + } } if (HIWORD(lpmb->lpszText)) { lpszText = lpmb->lpszText; } else { - lpszText = buf; - if (!LoadStringW(lpmb->hInstance, LOWORD(lpmb->lpszText), buf, 256)) - *buf = 0; /* FIXME ?? */ + UINT len = LoadStringW( lpmb->hInstance, LOWORD(lpmb->lpszText), (LPWSTR)&ptr, 0 ); + lpszText = buffer = HeapAlloc( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) ); + if (buffer) + { + memcpy( buffer, ptr, len * sizeof(WCHAR) ); + buffer[len] = 0; + } } - + TRACE_(msgbox)("%s\n", debugstr_w(lpszText)); SetWindowTextW(GetDlgItem(hwnd, MSGBOX_IDTEXT), lpszText); @@ -310,6 +316,7 @@ static HFONT MSGBOX_OnInit(HWND hwnd, LPMSGBOXPARAMSW lpmb) if (((lpmb->dwStyle & MB_TASKMODAL) && (lpmb->hwndOwner==NULL)) || (lpmb->dwStyle & MB_SYSTEMMODAL)) SetWindowPos(hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); + HeapFree( GetProcessHeap(), 0, buffer ); return hFont; } diff --git a/dlls/user32/nonclient.c b/dlls/user32/nonclient.c index 8deb698dd5d..b16dd2206b1 100644 --- a/dlls/user32/nonclient.c +++ b/dlls/user32/nonclient.c @@ -1596,7 +1596,7 @@ LRESULT NC_HandleSysCommand( HWND hwnd, WPARAM wParam, LPARAM lParam ) if (hmodule) { FARPROC aboutproc = GetProcAddress( hmodule, "ShellAboutA" ); - if (aboutproc) aboutproc( hwnd, PACKAGE_NAME, PACKAGE_STRING, 0 ); + if (aboutproc) aboutproc( hwnd, PACKAGE_STRING, NULL, 0 ); FreeLibrary( hmodule ); } } diff --git a/dlls/user32/resources/user32.rc b/dlls/user32/resources/user32.rc index 2880f2cb57f..67f7a13efcc 100644 --- a/dlls/user32/resources/user32.rc +++ b/dlls/user32/resources/user32.rc @@ -61,6 +61,7 @@ #include "resources/user32_No.rc" #include "resources/user32_Pl.rc" #include "resources/user32_Pt.rc" +#include "resources/user32_Ro.rc" #include "resources/user32_Ru.rc" #include "resources/user32_Si.rc" #include "resources/user32_Sk.rc" diff --git a/dlls/user32/resources/user32_Bg.rc b/dlls/user32/resources/user32_Bg.rc index e51a7f9075c..0eebde47275 100644 --- a/dlls/user32/resources/user32_Bg.rc +++ b/dlls/user32/resources/user32_Bg.rc @@ -30,7 +30,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "Ïðåâ&êëþ÷è íà ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Îòíîñíî WINE ...", 61761 + MENUITEM "&Îòíîñíî Wine ...", 61761 MENUITEM SEPARATOR MENUITEM "Îò&áåëåæè â äíåâíèêà çà îòñòðàíÿâàíå íà ãðåøêè", 61762 } diff --git a/dlls/user32/resources/user32_Ca.rc b/dlls/user32/resources/user32_Ca.rc index 5e593239440..325f0f0f64f 100644 --- a/dlls/user32/resources/user32_Ca.rc +++ b/dlls/user32/resources/user32_Ca.rc @@ -30,7 +30,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "C&anvi de tasca...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Quant a WINE...", 61761 + MENUITEM "&Quant a Wine...", 61761 MENUITEM SEPARATOR MENUITEM "&Afegir marca 'Debug mark' en l'historial de depurament", 61762 } diff --git a/dlls/user32/resources/user32_Cs.rc b/dlls/user32/resources/user32_Cs.rc index a934029138c..ce3a1e060c8 100644 --- a/dlls/user32/resources/user32_Cs.rc +++ b/dlls/user32/resources/user32_Cs.rc @@ -33,7 +33,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Pøepni do jiné úlohy...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&O programu WINE", 61761 + MENUITEM "&O programu Wine", 61761 } EDITMENU MENU LOADONCALL MOVEABLE DISCARDABLE diff --git a/dlls/user32/resources/user32_Da.rc b/dlls/user32/resources/user32_Da.rc index fe8ccc84de8..280fa2ce7dd 100644 --- a/dlls/user32/resources/user32_Da.rc +++ b/dlls/user32/resources/user32_Da.rc @@ -30,7 +30,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Skift til ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Om WINE ...", 61761 + MENUITEM "&Om Wine ...", 61761 MENUITEM SEPARATOR MENUITEM "Sæt &mærke i debug loggen", 61762 } diff --git a/dlls/user32/resources/user32_De.rc b/dlls/user32/resources/user32_De.rc index ef175ad539b..19f8b26b6b4 100644 --- a/dlls/user32/resources/user32_De.rc +++ b/dlls/user32/resources/user32_De.rc @@ -31,7 +31,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Wechseln zu ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Über WINE ...", 61761 + MENUITEM "&Über Wine ...", 61761 MENUITEM SEPARATOR MENUITEM "Setze &Marke 'Debug mark' in die Debug-Ausgabe", 61762 } diff --git a/dlls/user32/resources/user32_En.rc b/dlls/user32/resources/user32_En.rc index 0ba8287f7d7..1bbfe52ec92 100644 --- a/dlls/user32/resources/user32_En.rc +++ b/dlls/user32/resources/user32_En.rc @@ -30,7 +30,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Switch to ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&About WINE ...", 61761 + MENUITEM "&About Wine ...", 61761 MENUITEM SEPARATOR MENUITEM "&Put 'Debug mark' in debug log", 61762 } diff --git a/dlls/user32/resources/user32_Eo.rc b/dlls/user32/resources/user32_Eo.rc index 0b2a2c86778..356dc7961a1 100644 --- a/dlls/user32/resources/user32_Eo.rc +++ b/dlls/user32/resources/user32_Eo.rc @@ -31,7 +31,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Alia tasko ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Pri WINE ...", 61761 + MENUITEM "&Pri Wine ...", 61761 MENUITEM "E&nmetu 'Debug mark' en 'debug log'", 61762 } diff --git a/dlls/user32/resources/user32_Es.rc b/dlls/user32/resources/user32_Es.rc index a17d67aec7e..054fee9f4ea 100644 --- a/dlls/user32/resources/user32_Es.rc +++ b/dlls/user32/resources/user32_Es.rc @@ -31,7 +31,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "Cam&biar a ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Acerca de WINE...", 61761 + MENUITEM "&Acerca de Wine...", 61761 MENUITEM SEPARATOR MENUITEM "Añadir marca en el &historial de depuración", 61762 } diff --git a/dlls/user32/resources/user32_Fi.rc b/dlls/user32/resources/user32_Fi.rc index 49971b37d56..681eaf561ce 100644 --- a/dlls/user32/resources/user32_Fi.rc +++ b/dlls/user32/resources/user32_Fi.rc @@ -31,7 +31,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Vaihda...\tCtrl+Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Tietoja WINE:sta...", 61761 + MENUITEM "&Tietoja Wine:sta...", 61761 MENUITEM SEPARATOR MENUITEM "&Lisää merkki 'Debug mark' debug lokiin", 61762 } diff --git a/dlls/user32/resources/user32_Hu.rc b/dlls/user32/resources/user32_Hu.rc index c272d38d318..bfb728106d1 100644 --- a/dlls/user32/resources/user32_Hu.rc +++ b/dlls/user32/resources/user32_Hu.rc @@ -31,7 +31,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Ta&szkváltás...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "A &WINE-ról ...", 61761 + MENUITEM "A &Wine-ról ...", 61761 MENUITEM SEPARATOR MENUITEM "&Jelzés hibakereséshez", 61762 END diff --git a/dlls/user32/resources/user32_It.rc b/dlls/user32/resources/user32_It.rc index 67298b859d7..64d4d97a900 100644 --- a/dlls/user32/resources/user32_It.rc +++ b/dlls/user32/resources/user32_It.rc @@ -31,7 +31,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "C&ambia a ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Informazioni su WINE ...", 61761 + MENUITEM "&Informazioni su Wine ...", 61761 MENUITEM SEPARATOR MENUITEM "Aggiungi mark nel log di debug", 61762 } diff --git a/dlls/user32/resources/user32_Nl.rc b/dlls/user32/resources/user32_Nl.rc index 4186a1c3b49..5386e20bdaa 100644 --- a/dlls/user32/resources/user32_Nl.rc +++ b/dlls/user32/resources/user32_Nl.rc @@ -30,7 +30,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Overschakelen naar ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Info over WINE ...", 61761 + MENUITEM "&Info over Wine ...", 61761 MENUITEM SEPARATOR MENUITEM "&Put 'Debug mark' in debug log", 61762 } diff --git a/dlls/user32/resources/user32_No.rc b/dlls/user32/resources/user32_No.rc index d4896957499..22dc1ed2000 100644 --- a/dlls/user32/resources/user32_No.rc +++ b/dlls/user32/resources/user32_No.rc @@ -30,7 +30,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Bytt til . . .\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Om WINE . . .", 61761 + MENUITEM "&Om Wine . . .", 61761 MENUITEM SEPARATOR MENUITEM "&Putt feilsøkingsmerke i feilsøkingslogg", 61762 } diff --git a/dlls/user32/resources/user32_Pl.rc b/dlls/user32/resources/user32_Pl.rc index a48a2cd8613..9234c823618 100644 --- a/dlls/user32/resources/user32_Pl.rc +++ b/dlls/user32/resources/user32_Pl.rc @@ -30,7 +30,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "Prze³¹&cz na...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&O programie WINE...", 61761 + MENUITEM "&O programie Wine...", 61761 MENUITEM SEPARATOR MENUITEM "Dopisz \"znacznik debugowania\" ", 61762 } diff --git a/dlls/user32/resources/user32_Pt.rc b/dlls/user32/resources/user32_Pt.rc index eb36ddad784..9d8af24e8f3 100644 --- a/dlls/user32/resources/user32_Pt.rc +++ b/dlls/user32/resources/user32_Pt.rc @@ -31,7 +31,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Alternar Para ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Sobre o WINE ...", 61761 + MENUITEM "&Sobre o Wine ...", 61761 MENUITEM SEPARATOR MENUITEM "&Put 'Debug mark' in debug log", 61762 } @@ -50,7 +50,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Alternar Para ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Acerca do WINE ...", 61761 + MENUITEM "&Acerca do Wine ...", 61761 MENUITEM SEPARATOR MENUITEM "&Colocar 'Marca de Depuração' no registo de depuração", 61762 } diff --git a/dlls/user32/resources/user32_Ro.rc b/dlls/user32/resources/user32_Ro.rc new file mode 100644 index 00000000000..91aa5573961 --- /dev/null +++ b/dlls/user32/resources/user32_Ro.rc @@ -0,0 +1,90 @@ +/* + * Copyright 1995 Alexandre Julliard + * Copyright 2008 Michael Stefaniuc + * + * 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_ROMANIAN, SUBLANG_NEUTRAL + +#pragma code_page(65001) + +SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE +{ + MENUITEM "&Restabilește", 61728 + MENUITEM "&Mută", 61456 + MENUITEM "M&ărime", 61440 + MENUITEM "Mi&nimizează", 61472 + MENUITEM "Ma&ximizează", 61488 + MENUITEM SEPARATOR + MENUITEM "&Închide\tAlt-F4", 61536 + MENUITEM SEPARATOR + MENUITEM "&Comută la ...\tCtrl-Esc", 61744 + MENUITEM SEPARATOR + MENUITEM "&Despre Wine ...", 61761 + MENUITEM SEPARATOR + MENUITEM "&Pune 'Debug mark' în jurnalul de depanare", 61762 +} + +EDITMENU MENU LOADONCALL MOVEABLE DISCARDABLE +{ + POPUP "" + BEGIN + MENUITEM "&Des-face", EM_UNDO + MENUITEM SEPARATOR + MENUITEM "&Taie", WM_CUT + MENUITEM "&Copiază", WM_COPY + MENUITEM "&Inserează", WM_PASTE + MENUITEM "&Șterge", WM_CLEAR + MENUITEM SEPARATOR + MENUITEM "&Selectează tot", EM_SETSEL + END +} + +MSGBOX DIALOG 100, 80, 216, 168 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +BEGIN + ICON "", 1088, 8, 20, 16, 16, WS_CHILD | WS_VISIBLE + LTEXT "", 100, 32, 4, 176, 48, WS_CHILD | WS_VISIBLE | WS_GROUP | SS_NOPREFIX + PUSHBUTTON "&OK", 1, 16, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Renunță", 2, 64, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Anulează", 3, 112, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "R&eîncearcă", 4, 160, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Ignoră", 5, 208, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Da", 6, 256, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Nu", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Încearcă din nou", 10, 352, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "&Continuă", 11, 400, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Ajutor", 9, 448, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP +END + +MDI_MOREWINDOWS DIALOG FIXED IMPURE 20, 20, 232, 122 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Selectare fereastră" +FONT 8, "MS Shell Dlg" +BEGIN + LISTBOX MDI_IDC_LISTBOX, 5, 7, 222, 90, WS_VSCROLL | WS_HSCROLL /* defined in mdi.h */ + DEFPUSHBUTTON "OK", IDOK, 75, 100, 35, 14 + PUSHBUTTON "Renunță", IDCANCEL, 120, 100, 35, 14 +END + + +STRINGTABLE DISCARDABLE +{ + IDS_ERROR "Eroare" + IDS_MDI_MOREWINDOWS "&Mai multe ferestre..." +} + +#pragma code_page(default) diff --git a/dlls/user32/resources/user32_Ru.rc b/dlls/user32/resources/user32_Ru.rc index 85c27a7a4a5..5d654d4e492 100644 --- a/dlls/user32/resources/user32_Ru.rc +++ b/dlls/user32/resources/user32_Ru.rc @@ -30,7 +30,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "Ï&åðåêëþ÷èòüñÿ íà ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Î ïðîåêòå WINE ...", 61761 + MENUITEM "&Î ïðîåêòå Wine ...", 61761 MENUITEM SEPARATOR MENUITEM "Ïîìåñòèòü îòìåòêó â îò&ëàäî÷íûé ôàéë", 61762 } @@ -62,11 +62,22 @@ BEGIN PUSHBUTTON "&Ïðîïóñòèòü", 5, 208, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP PUSHBUTTON "&Äà", 6, 256, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP PUSHBUTTON "&Íåò", 7, 304, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "&Try Again", 10, 352, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "&Continue", 11, 400, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP - PUSHBUTTON "Help", 9, 448, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Ïî&âòîðèòü", 10, 352, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Ï&ðîëîæèòü", 11, 400, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Ïîìîùü", 9, 448, 56, 40, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP END +MDI_MOREWINDOWS DIALOG FIXED IMPURE 20, 20, 232, 122 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Select Window" +FONT 8, "MS Shell Dlg" +BEGIN + LISTBOX MDI_IDC_LISTBOX, 5, 7, 222, 90, WS_VSCROLL | WS_HSCROLL /* defined in mdi.h */ + DEFPUSHBUTTON "OK", IDOK, 75, 100, 35, 14 + PUSHBUTTON "Îòìåíèòü", IDCANCEL, 120, 100, 35, 14 +END + + STRINGTABLE DISCARDABLE { IDS_ERROR "ÎØÈÁÊÀ" diff --git a/dlls/user32/resources/user32_Si.rc b/dlls/user32/resources/user32_Si.rc index 392eac89722..23d3898c7b6 100644 --- a/dlls/user32/resources/user32_Si.rc +++ b/dlls/user32/resources/user32_Si.rc @@ -30,7 +30,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Preklopi na ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&O WINE ...", 61761 + MENUITEM "&O Wine ...", 61761 MENUITEM SEPARATOR MENUITEM "&Naredi zaznamek v dnevnik", 61762 } diff --git a/dlls/user32/resources/user32_Sk.rc b/dlls/user32/resources/user32_Sk.rc index 78e07f562ff..7fef0495b15 100644 --- a/dlls/user32/resources/user32_Sk.rc +++ b/dlls/user32/resources/user32_Sk.rc @@ -30,7 +30,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Prepnú� do inej úlohy...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "O programe &WINE", 61761 + MENUITEM "O programe &Wine", 61761 MENUITEM SEPARATOR MENUITEM "&Vloži� znaèku do ladiaceho logu", 61762 } diff --git a/dlls/user32/resources/user32_Sv.rc b/dlls/user32/resources/user32_Sv.rc index 5f18a16b2f0..36992ac8b57 100644 --- a/dlls/user32/resources/user32_Sv.rc +++ b/dlls/user32/resources/user32_Sv.rc @@ -30,7 +30,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Byt till ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&Om WINE ...", 61761 + MENUITEM "&Om Wine ...", 61761 } EDITMENU MENU LOADONCALL MOVEABLE DISCARDABLE diff --git a/dlls/user32/resources/user32_Tr.rc b/dlls/user32/resources/user32_Tr.rc index 631836e5475..086b911f4e1 100644 --- a/dlls/user32/resources/user32_Tr.rc +++ b/dlls/user32/resources/user32_Tr.rc @@ -30,7 +30,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "&Pencere Deðiþtir ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "&WINE Hakkýnda ...", 61761 + MENUITEM "&Wine Hakkýnda ...", 61761 MENUITEM SEPARATOR MENUITEM "&Hata ayýklama günlüðüne iþaret koy", 61762 } diff --git a/dlls/user32/resources/user32_Uk.rc b/dlls/user32/resources/user32_Uk.rc index ee714d49ae1..97089bc097e 100644 --- a/dlls/user32/resources/user32_Uk.rc +++ b/dlls/user32/resources/user32_Uk.rc @@ -30,7 +30,7 @@ SYSMENU MENU LOADONCALL MOVEABLE DISCARDABLE MENUITEM SEPARATOR MENUITEM "Ï&åðåìèêíóòèñÿ íà ...\tCtrl-Esc", 61744 MENUITEM SEPARATOR - MENUITEM "Ïð&î ïðîåêò WINE ...", 61761 + MENUITEM "Ïð&î ïðîåêò Wine ...", 61761 MENUITEM SEPARATOR MENUITEM "Ïîì³ñòèòè ïîçíà÷êó äî ôàéëó â³ä&ëàäæåííÿ", 61762 } diff --git a/dlls/user32/tests/edit.c b/dlls/user32/tests/edit.c index fae1bd121b5..74092beee56 100644 --- a/dlls/user32/tests/edit.c +++ b/dlls/user32/tests/edit.c @@ -37,6 +37,128 @@ struct edit_notify { static struct edit_notify notifications; +static INT_PTR CALLBACK edit_dialog_proc(HWND hdlg, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch (msg) + { + case WM_INITDIALOG: + { + HWND hedit = GetDlgItem(hdlg, 1000); + SetFocus(hedit); + switch (lparam) + { + /* from bug 11841 */ + case 0: + PostMessage(hedit, WM_KEYDOWN, VK_ESCAPE, 0x10001); + break; + case 1: + PostMessage(hedit, WM_KEYDOWN, VK_RETURN, 0x1c0001); + break; + case 2: + PostMessage(hedit, WM_KEYDOWN, VK_TAB, 0xf0001); + PostMessage(hdlg, WM_USER, 0xdeadbeef, 1); + break; + + /* more test cases for WM_CHAR */ + case 3: + PostMessage(hedit, WM_CHAR, VK_ESCAPE, 0x10001); + PostMessage(hdlg, WM_USER, 0xdeadbeef, 0); + break; + case 4: + PostMessage(hedit, WM_CHAR, VK_RETURN, 0x1c0001); + PostMessage(hdlg, WM_USER, 0xdeadbeef, 0); + break; + case 5: + PostMessage(hedit, WM_CHAR, VK_TAB, 0xf0001); + PostMessage(hdlg, WM_USER, 0xdeadbeef, 0); + break; + + /* more test cases for WM_KEYDOWN + WM_CHAR */ + case 6: + PostMessage(hedit, WM_KEYDOWN, VK_ESCAPE, 0x10001); + PostMessage(hedit, WM_CHAR, VK_ESCAPE, 0x10001); + PostMessage(hdlg, WM_USER, 0xdeadbeef, 0); + break; + case 7: + PostMessage(hedit, WM_KEYDOWN, VK_RETURN, 0x1c0001); + PostMessage(hedit, WM_CHAR, VK_RETURN, 0x1c0001); + PostMessage(hdlg, WM_USER, 0xdeadbeef, 1); + break; + case 8: + PostMessage(hedit, WM_KEYDOWN, VK_TAB, 0xf0001); + PostMessage(hedit, WM_CHAR, VK_TAB, 0xf0001); + PostMessage(hdlg, WM_USER, 0xdeadbeef, 1); + break; + + default: + break; + } + break; + } + + case WM_COMMAND: + if (HIWORD(wparam) != BN_CLICKED) + break; + + switch (LOWORD(wparam)) + { + case IDOK: + EndDialog(hdlg, 111); + break; + + case IDCANCEL: + EndDialog(hdlg, 222); + break; + + default: + break; + } + break; + + case WM_USER: + { + int len; + HWND hok = GetDlgItem(hdlg, IDOK); + HWND hedit = GetDlgItem(hdlg, 1000); + + if (wparam != 0xdeadbeef) + break; + + switch (lparam) + { + case 0: + len = SendMessage(hedit, WM_GETTEXTLENGTH, 0, 0); + if (len == 0) + EndDialog(hdlg, 444); + else + EndDialog(hdlg, 555); + break; + + case 1: + len = SendMessage(hedit, WM_GETTEXTLENGTH, 0, 0); + if ((GetFocus() == hok) && len == 0) + EndDialog(hdlg, 444); + else + EndDialog(hdlg, 555); + break; + + default: + EndDialog(hdlg, 555); + } + break; + } + + case WM_CLOSE: + EndDialog(hdlg, 333); + break; + + default: + break; + } + + return FALSE; +} + static HINSTANCE hinst; static HWND hwndET2; static const char szEditTest2Class[] = "EditTest2Class"; @@ -1134,6 +1256,59 @@ static void test_undo(void) DestroyWindow (hwEdit); } +static void test_edit_dialog(void) +{ + int r; + + /* from bug 11841 */ + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 0); + ok(333 == r, "Expected %d, got %d\n", 333, r); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 1); + ok(111 == r, "Expected %d, got %d\n", 111, r); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 2); + ok(444 == r, "Expected %d, got %d\n", 444, r); + + /* more tests for WM_CHAR */ + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 3); + ok(444 == r, "Expected %d, got %d\n", 444, r); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 4); + ok(444 == r, "Expected %d, got %d\n", 444, r); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 5); + ok(444 == r, "Expected %d, got %d\n", 444, r); + + /* more tests for WM_KEYDOWN + WM_CHAR */ + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 6); + todo_wine ok(444 == r, "Expected %d, got %d\n", 444, r); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 7); + todo_wine ok(444 == r, "Expected %d, got %d\n", 444, r); + r = DialogBoxParam(hinst, "EDIT_READONLY_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 8); + ok(444 == r, "Expected %d, got %d\n", 444, r); + + /* tests with an editable edit control */ + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 0); + ok(333 == r, "Expected %d, got %d\n", 333, r); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 1); + ok(111 == r, "Expected %d, got %d\n", 111, r); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 2); + ok(444 == r, "Expected %d, got %d\n", 444, r); + + /* tests for WM_CHAR */ + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 3); + ok(444 == r, "Expected %d, got %d\n", 444, r); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 4); + ok(444 == r, "Expected %d, got %d\n", 444, r); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 5); + ok(444 == r, "Expected %d, got %d\n", 444, r); + + /* tests for WM_KEYDOWN + WM_CHAR */ + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 6); + todo_wine ok(444 == r, "Expected %d, got %d\n", 444, r); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 7); + todo_wine ok(444 == r, "Expected %d, got %d\n", 444, r); + r = DialogBoxParam(hinst, "EDIT_DIALOG", NULL, (DLGPROC)edit_dialog_proc, 8); + ok(444 == r, "Expected %d, got %d\n", 444, r); +} + static BOOL RegisterWindowClasses (void) { WNDCLASSA test2; @@ -1202,6 +1377,7 @@ START_TEST(edit) test_text_position(); test_espassword(); test_undo(); + test_edit_dialog(); UnregisterWindowClasses(); } diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index 7aa99b4624a..6f37f48ff6a 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -43,6 +43,10 @@ #define SW_NORMALNA 0xCC /* undoc. flag in MinMaximize */ +#ifndef WM_KEYF1 +#define WM_KEYF1 0x004d +#endif + #ifndef WM_SYSTIMER #define WM_SYSTIMER 0x0118 #endif @@ -2740,7 +2744,6 @@ static LRESULT WINAPI mdi_client_hook_proc(HWND hwnd, UINT message, WPARAM wPara message != WM_NCPAINT && message != WM_SYNCPAINT && message != WM_ERASEBKGND && - message != WM_NCPAINT && message != WM_NCHITTEST && message != WM_GETTEXT && message != WM_MDIGETACTIVE && @@ -2793,7 +2796,6 @@ static LRESULT WINAPI mdi_child_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, message != WM_NCPAINT && message != WM_SYNCPAINT && message != WM_ERASEBKGND && - message != WM_NCPAINT && message != WM_NCHITTEST && message != WM_GETTEXT && message != WM_GETICON && @@ -2863,7 +2865,6 @@ static LRESULT WINAPI mdi_frame_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, message != WM_NCPAINT && message != WM_SYNCPAINT && message != WM_ERASEBKGND && - message != WM_NCPAINT && message != WM_NCHITTEST && message != WM_GETTEXT && message != WM_GETICON && @@ -4855,7 +4856,6 @@ static LRESULT CALLBACK static_hook_proc(HWND hwnd, UINT message, WPARAM wParam, msg.lParam = lParam; add_message(&msg); - defwndproc_counter++; ret = CallWindowProcA(old_static_proc, hwnd, message, wParam, lParam); defwndproc_counter--; @@ -4918,6 +4918,112 @@ static void test_static_messages(void) } } +/****************** ComboBox message test *************************/ +#define ID_COMBOBOX 0x000f + +static const struct message WmKeyDownComboSeq[] = +{ + { WM_KEYDOWN, sent|wparam|lparam, VK_DOWN, 0 }, + { WM_COMMAND, sent|wparam|defwinproc, MAKEWPARAM(1000, LBN_SELCHANGE) }, + { WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_COMBOBOX, CBN_SELENDOK) }, + { WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_COMBOBOX, CBN_SELCHANGE) }, + { WM_CTLCOLOREDIT, sent|parent }, + { WM_KEYUP, sent|wparam|lparam, VK_DOWN, 0 }, + { 0 } +}; + +static WNDPROC old_combobox_proc; + +static LRESULT CALLBACK combobox_hook_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + static long defwndproc_counter = 0; + LRESULT ret; + struct message msg; + + /* do not log painting messages */ + if (message != WM_PAINT && + message != WM_NCPAINT && + message != WM_SYNCPAINT && + message != WM_ERASEBKGND && + message != WM_NCHITTEST && + message != WM_GETTEXT && + message != WM_GETICON && + message != WM_DEVICECHANGE) + { + trace("combo: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam); + + msg.message = message; + msg.flags = sent|wparam|lparam; + if (defwndproc_counter) msg.flags |= defwinproc; + msg.wParam = wParam; + msg.lParam = lParam; + add_message(&msg); + } + + defwndproc_counter++; + ret = CallWindowProcA(old_combobox_proc, hwnd, message, wParam, lParam); + defwndproc_counter--; + + return ret; +} + +static void subclass_combobox(void) +{ + WNDCLASSA cls; + + if (!GetClassInfoA(0, "ComboBox", &cls)) assert(0); + + old_combobox_proc = cls.lpfnWndProc; + + cls.hInstance = GetModuleHandle(0); + cls.lpfnWndProc = combobox_hook_proc; + cls.lpszClassName = "my_combobox_class"; + UnregisterClass(cls.lpszClassName, cls.hInstance); + if (!RegisterClassA(&cls)) assert(0); +} + +static void test_combobox_messages(void) +{ + HWND parent, combo; + LRESULT ret; + + subclass_combobox(); + + parent = CreateWindowExA(0, "TestParentClass", "Test parent", WS_OVERLAPPEDWINDOW | WS_VISIBLE, + 100, 100, 200, 200, 0, 0, 0, NULL); + ok(parent != 0, "Failed to create parent window\n"); + flush_sequence(); + + combo = CreateWindowEx(0, "my_combobox_class", "test", WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS, + 0, 0, 100, 150, parent, (HMENU)ID_COMBOBOX, 0, NULL); + ok(combo != 0, "Failed to create combobox window\n"); + + UpdateWindow(combo); + + ret = SendMessage(combo, WM_GETDLGCODE, 0, 0); + ok(ret == (DLGC_WANTCHARS | DLGC_WANTARROWS), "wrong dlg_code %08lx\n", ret); + + ret = SendMessage(combo, CB_ADDSTRING, 0, (LPARAM)"item 0"); + ok(ret == 0, "expected 0, got %ld\n", ret); + ret = SendMessage(combo, CB_ADDSTRING, 0, (LPARAM)"item 1"); + ok(ret == 1, "expected 1, got %ld\n", ret); + ret = SendMessage(combo, CB_ADDSTRING, 0, (LPARAM)"item 2"); + ok(ret == 2, "expected 2, got %ld\n", ret); + + SendMessage(combo, CB_SETCURSEL, 0, 0); + SetFocus(combo); + flush_sequence(); + + log_all_parent_messages++; + SendMessage(combo, WM_KEYDOWN, VK_DOWN, 0); + SendMessage(combo, WM_KEYUP, VK_DOWN, 0); + log_all_parent_messages--; + ok_sequence(WmKeyDownComboSeq, "WM_KEYDOWN/VK_DOWN on a ComboBox", FALSE); + + DestroyWindow(combo); + DestroyWindow(parent); +} + /************* painting message test ********************/ void dump_region(HRGN hrgn) @@ -6733,6 +6839,7 @@ static LRESULT CALLBACK cbt_hook_proc(int nCode, WPARAM wParam, LPARAM lParam) !lstrcmpiA(buf, "my_edit_class") || !lstrcmpiA(buf, "static") || !lstrcmpiA(buf, "ListBox") || + !lstrcmpiA(buf, "ComboBox") || !lstrcmpiA(buf, "MyDialogClass") || !lstrcmpiA(buf, "#32770")) { @@ -6781,6 +6888,7 @@ static void CALLBACK win_event_proc(HWINEVENTHOOK hevent, !lstrcmpiA(buf, "my_edit_class") || !lstrcmpiA(buf, "static") || !lstrcmpiA(buf, "ListBox") || + !lstrcmpiA(buf, "ComboBox") || !lstrcmpiA(buf, "MyDialogClass") || !lstrcmpiA(buf, "#32770")) { @@ -7176,14 +7284,16 @@ static LRESULT CALLBACK cbt_global_hook_proc(int nCode, WPARAM wParam, LPARAM lP /* WH_MOUSE_LL hook */ if (nCode == HC_ACTION) { - struct message msg; MSLLHOOKSTRUCT *mhll = (MSLLHOOKSTRUCT *)lParam; /* we can't test for real mouse events */ if (mhll->flags & LLMHF_INJECTED) { + struct message msg; + + memset (&msg, 0, sizeof (msg)); msg.message = wParam; - msg.flags = hook; + msg.flags = hook; add_message(&msg); } return CallNextHookEx(hCBT_global_hook, nCode, wParam, lParam); @@ -10005,7 +10115,7 @@ static const struct message wm_lb_click_0[] = { WM_IME_SETCONTEXT, sent|wparam|optional|parent, 0 }, { WM_IME_SETCONTEXT, sent|wparam|optional, 1 }, { EVENT_OBJECT_FOCUS, winevent_hook|wparam|lparam, OBJID_CLIENT, 0 }, - { WM_SETFOCUS, sent }, + { WM_SETFOCUS, sent|defwinproc }, { WM_DRAWITEM, sent|wparam|lparam|parent, ID_LISTBOX, 0x001142f2 }, { WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_LISTBOX, LBN_SETFOCUS) }, @@ -10025,7 +10135,7 @@ static const struct message wm_lb_click_0[] = { WM_LBUTTONUP, sent|wparam|lparam, 0, 0 }, { EVENT_SYSTEM_CAPTUREEND, winevent_hook|wparam|lparam, 0, 0 }, - { WM_CAPTURECHANGED, sent|wparam|lparam, 0, 0 }, + { WM_CAPTURECHANGED, sent|wparam|lparam|defwinproc, 0, 0 }, { WM_COMMAND, sent|wparam|parent, MAKEWPARAM(ID_LISTBOX, LBN_SELCHANGE) }, { 0 } }; @@ -10036,6 +10146,8 @@ static LRESULT (WINAPI *listbox_orig_proc)(HWND, UINT, WPARAM, LPARAM); static LRESULT WINAPI listbox_hook_proc(HWND hwnd, UINT message, WPARAM wp, LPARAM lp) { + static long defwndproc_counter = 0; + LRESULT ret; struct message msg; /* do not log painting messages */ @@ -10052,12 +10164,17 @@ static LRESULT WINAPI listbox_hook_proc(HWND hwnd, UINT message, WPARAM wp, LPAR msg.message = message; msg.flags = sent|wparam|lparam; + if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wp; msg.lParam = lp; add_message(&msg); } - return CallWindowProcA(listbox_orig_proc, hwnd, message, wp, lp); + defwndproc_counter++; + ret = CallWindowProcA(listbox_orig_proc, hwnd, message, wp, lp); + defwndproc_counter--; + + return ret; } static void check_lb_state_dbg(HWND listbox, int count, int cur_sel, @@ -10076,7 +10193,7 @@ static void check_lb_state_dbg(HWND listbox, int count, int cur_sel, ok_(__FILE__, line)(ret == top_index, "expected top index %d, got %ld\n", top_index, ret); } -static void test_listbox(void) +static void test_listbox_messages(void) { HWND parent, listbox; LRESULT ret; @@ -10133,6 +10250,7 @@ static void test_listbox(void) log_all_parent_messages--; + DestroyWindow(listbox); DestroyWindow(parent); } @@ -10190,6 +10308,8 @@ START_TEST(msg) test_mdi_messages(); test_button_messages(); test_static_messages(); + test_listbox_messages(); + test_combobox_messages(); test_paint_messages(); test_interthread_messages(); test_message_conversion(); @@ -10214,7 +10334,6 @@ START_TEST(msg) test_nullCallback(); test_SetForegroundWindow(); test_dbcs_wm_char(); - test_listbox(); UnhookWindowsHookEx(hCBT_hook); if (pUnhookWinEvent) diff --git a/dlls/user32/tests/resource.c b/dlls/user32/tests/resource.c index 24ec9952539..a8b6c08f3f6 100644 --- a/dlls/user32/tests/resource.c +++ b/dlls/user32/tests/resource.c @@ -74,8 +74,8 @@ static void test_LoadStringA (void) static const char str[] = "String resource"; /* same in resource.rc */ char buf[128]; struct string_test { - int bufsiz; - int expected; + unsigned int bufsiz; + unsigned int expected; }; struct string_test tests[] = {{sizeof buf, sizeof str - 1}, {sizeof str, sizeof str - 1}, @@ -85,8 +85,8 @@ static void test_LoadStringA (void) assert (sizeof str < sizeof buf); for (i = 0; i < sizeof tests / sizeof tests[0]; i++) { - const int bufsiz = tests[i].bufsiz; - const int expected = tests[i].expected; + const unsigned int bufsiz = tests[i].bufsiz; + const unsigned int expected = tests[i].expected; const int len = LoadStringA (hInst, 0, buf, bufsiz); ok (len == expected, "bufsiz=%d: got %d, expected %d\n", diff --git a/dlls/user32/tests/resource.rc b/dlls/user32/tests/resource.rc index f01c6f5344c..b0c49676989 100644 --- a/dlls/user32/tests/resource.rc +++ b/dlls/user32/tests/resource.rc @@ -98,6 +98,26 @@ BEGIN PUSHBUTTON "Cancel",IDCANCEL,129,24,50,14 END +EDIT_DIALOG DIALOG DISCARDABLE 0, 0, 160, 80 +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_CENTER +CAPTION "Edit Test" +FONT 8, "MS Shell Dlg" +{ + PUSHBUTTON "Ok", IDOK, 20, 60, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 100, 60, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + EDITTEXT 1000, 5, 5, 150, 50, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_MULTILINE | WS_VSCROLL | ES_AUTOVSCROLL +} + +EDIT_READONLY_DIALOG DIALOG DISCARDABLE 0, 0, 160, 80 +STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | DS_CENTER +CAPTION "Edit Readonly Test" +FONT 8, "MS Shell Dlg" +{ + PUSHBUTTON "Ok", IDOK, 20, 60, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 100, 60, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP + EDITTEXT 1000, 5, 5, 150, 50, WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_MULTILINE | WS_VSCROLL | ES_AUTOVSCROLL | ES_READONLY +} + /* @makedep: test_mono.bmp */ 100 BITMAP test_mono.bmp diff --git a/dlls/user32/tests/text.c b/dlls/user32/tests/text.c index 01bd3066860..1e096501640 100644 --- a/dlls/user32/tests/text.c +++ b/dlls/user32/tests/text.c @@ -147,6 +147,23 @@ static void test_DrawTextCalcRect(void) "rectangle should NOT be empty.\n"); } + /* More test cases from bug 12226 */ + SetRect(&rect, 0, 0, 0, 0); + textheight = DrawTextA(hdc, emptystring, -1, &rect, DT_CALCRECT | DT_LEFT | DT_SINGLELINE); + todo_wine ok(textheight, "DrawTextA error %u\n", GetLastError()); + ok(0 == rect.left, "expected 0, got %d\n", rect.left); + ok(0 == rect.right, "expected 0, got %d\n", rect.right); + ok(0 == rect.top, "expected 0, got %d\n", rect.top); + todo_wine ok(rect.bottom, "rect.bottom should not be 0\n"); + + SetRect(&rect, 0, 0, 0, 0); + textheight = DrawTextW(hdc, emptystringW, -1, &rect, DT_CALCRECT | DT_LEFT | DT_SINGLELINE); + todo_wine ok(textheight, "DrawTextW error %u\n", GetLastError()); + ok(0 == rect.left, "expected 0, got %d\n", rect.left); + ok(0 == rect.right, "expected 0, got %d\n", rect.right); + ok(0 == rect.top, "expected 0, got %d\n", rect.top); + todo_wine ok(rect.bottom, "rect.bottom should not be 0\n"); + SelectObject(hdc, hOldFont); ret = DeleteObject(hFont); ok( ret, "DeleteObject error %u\n", GetLastError()); diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c index 35ac5b0adc8..04377b96e39 100644 --- a/dlls/user32/winpos.c +++ b/dlls/user32/winpos.c @@ -2300,7 +2300,8 @@ static LONG start_size_move( HWND hwnd, WPARAM wParam, POINT *capturePoint, LONG switch(msg.message) { case WM_MOUSEMOVE: - pt = msg.pt; + pt.x = min( max( msg.pt.x, rectWindow.left ), rectWindow.right - 1 ); + pt.y = min( max( msg.pt.y, rectWindow.top ), rectWindow.bottom - 1 ); hittest = SendMessageW( hwnd, WM_NCHITTEST, 0, MAKELONG( pt.x, pt.y ) ); if ((hittest < HTLEFT) || (hittest > HTBOTTOMRIGHT)) hittest = 0; break; diff --git a/dlls/winealsa.drv/dscapture.c b/dlls/winealsa.drv/dscapture.c index 168fc91c01f..98fe1956a4c 100644 --- a/dlls/winealsa.drv/dscapture.c +++ b/dlls/winealsa.drv/dscapture.c @@ -850,7 +850,7 @@ static HRESULT WINAPI IDsCaptureDriverImpl_GetDriverDesc(PIDSCDRIVER iface, PDSD { IDsCaptureDriverImpl *This = (IDsCaptureDriverImpl *)iface; TRACE("(%p,%p)\n",iface,pDesc); - memcpy(pDesc, &(WInDev[This->wDevID].ds_desc), sizeof(DSDRIVERDESC)); + *pDesc = WInDev[This->wDevID].ds_desc; pDesc->dwFlags = 0; pDesc->dnDevNode = WInDev[This->wDevID].waveDesc.dnDevNode; pDesc->wVxdId = 0; @@ -1026,7 +1026,7 @@ DWORD widDsCreate(UINT wDevID, PIDSCDRIVER* drv) */ DWORD widDsDesc(UINT wDevID, PDSDRIVERDESC desc) { - memcpy(desc, &(WInDev[wDevID].ds_desc), sizeof(DSDRIVERDESC)); + *desc = WInDev[wDevID].ds_desc; return MMSYSERR_NOERROR; } diff --git a/dlls/winealsa.drv/dsoutput.c b/dlls/winealsa.drv/dsoutput.c index 8d91abf2179..130e1813ec9 100644 --- a/dlls/winealsa.drv/dsoutput.c +++ b/dlls/winealsa.drv/dsoutput.c @@ -661,7 +661,7 @@ static HRESULT WINAPI IDsDriverImpl_GetDriverDesc(PIDSDRIVER iface, PDSDRIVERDES { IDsDriverImpl *This = (IDsDriverImpl *)iface; TRACE("(%p,%p)\n",iface,pDesc); - memcpy(pDesc, &(WOutDev[This->wDevID].ds_desc), sizeof(DSDRIVERDESC)); + *pDesc = WOutDev[This->wDevID].ds_desc; pDesc->dwFlags = DSDDESC_DONTNEEDSECONDARYLOCK | DSDDESC_DONTNEEDWRITELEAD; pDesc->dnDevNode = WOutDev[This->wDevID].waveDesc.dnDevNode; pDesc->wVxdId = 0; @@ -730,7 +730,7 @@ static HRESULT WINAPI IDsDriverImpl_GetCaps(PIDSDRIVER iface, PDSDRIVERCAPS pCap { IDsDriverImpl *This = (IDsDriverImpl *)iface; TRACE("(%p,%p)\n",iface,pCaps); - memcpy(pCaps, &(WOutDev[This->wDevID].ds_caps), sizeof(DSDRIVERCAPS)); + *pCaps = WOutDev[This->wDevID].ds_caps; return DS_OK; } @@ -844,7 +844,7 @@ DWORD wodDsCreate(UINT wDevID, PIDSDRIVER* drv) DWORD wodDsDesc(UINT wDevID, PDSDRIVERDESC desc) { - memcpy(desc, &(WOutDev[wDevID].ds_desc), sizeof(DSDRIVERDESC)); + *desc = WOutDev[wDevID].ds_desc; return MMSYSERR_NOERROR; } diff --git a/dlls/winealsa.drv/midi.c b/dlls/winealsa.drv/midi.c index 966773622c2..3e791d57899 100644 --- a/dlls/winealsa.drv/midi.c +++ b/dlls/winealsa.drv/midi.c @@ -1128,8 +1128,8 @@ static void ALSA_AddMidiPort(snd_seq_client_info_t* cinfo, snd_seq_port_info_t* if (!type) return; - memcpy(&MidiOutDev[MODM_NumDevs].addr, snd_seq_port_info_get_addr(pinfo), sizeof(snd_seq_addr_t)); - + MidiOutDev[MODM_NumDevs].addr = *snd_seq_port_info_get_addr(pinfo); + /* Manufac ID. We do not have access to this with soundcard.h * Does not seem to be a problem, because in mmsystem.h only * Microsoft's ID is listed. @@ -1184,8 +1184,8 @@ static void ALSA_AddMidiPort(snd_seq_client_info_t* cinfo, snd_seq_port_info_t* if (!type) return; - memcpy(&MidiInDev[MIDM_NumDevs].addr, snd_seq_port_info_get_addr(pinfo), sizeof(snd_seq_addr_t)); - + MidiInDev[MIDM_NumDevs].addr = *snd_seq_port_info_get_addr(pinfo); + /* Manufac ID. We do not have access to this with soundcard.h * Does not seem to be a problem, because in mmsystem.h only * Microsoft's ID is listed. diff --git a/dlls/winealsa.drv/wavein.c b/dlls/winealsa.drv/wavein.c index 2c574f1c782..9c89fde5a5f 100644 --- a/dlls/winealsa.drv/wavein.c +++ b/dlls/winealsa.drv/wavein.c @@ -385,7 +385,7 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) wwi->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); - memcpy(&wwi->waveDesc, lpDesc, sizeof(WAVEOPENDESC)); + wwi->waveDesc = *lpDesc; ALSA_copyFormat(lpDesc->lpFormat, &wwi->format); if (wwi->format.Format.wBitsPerSample == 0) { diff --git a/dlls/winealsa.drv/waveout.c b/dlls/winealsa.drv/waveout.c index 516aa3fb08b..f4452e5b101 100644 --- a/dlls/winealsa.drv/waveout.c +++ b/dlls/winealsa.drv/waveout.c @@ -640,7 +640,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) wwo->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); - memcpy(&wwo->waveDesc, lpDesc, sizeof(WAVEOPENDESC)); + wwo->waveDesc = *lpDesc; ALSA_copyFormat(lpDesc->lpFormat, &wwo->format); TRACE("Requested this format: %dx%dx%d %s\n", diff --git a/dlls/wineaudioio.drv/audio.c b/dlls/wineaudioio.drv/audio.c index 82255275270..7fda317eee2 100644 --- a/dlls/wineaudioio.drv/audio.c +++ b/dlls/wineaudioio.drv/audio.c @@ -839,7 +839,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) wwo->unixdev = audio; wwo->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); - memcpy(&wwo->waveDesc, lpDesc, sizeof(WAVEOPENDESC)); + wwo->waveDesc = *lpDesc; memcpy(&wwo->format, lpDesc->lpFormat, sizeof(PCMWAVEFORMAT)); if (wwo->format.wBitsPerSample == 0) { @@ -1954,7 +1954,7 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) wwi->dwTotalRecorded = 0; wwi->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); - memcpy(&wwi->waveDesc, lpDesc, sizeof(WAVEOPENDESC)); + wwi->waveDesc = *lpDesc; memcpy(&wwi->format, lpDesc->lpFormat, sizeof(PCMWAVEFORMAT)); if (wwi->format.wBitsPerSample == 0) { diff --git a/dlls/winecoreaudio.drv/audio.c b/dlls/winecoreaudio.drv/audio.c index 33a5c4f80b8..90d664f0ab3 100644 --- a/dlls/winecoreaudio.drv/audio.c +++ b/dlls/winecoreaudio.drv/audio.c @@ -855,12 +855,12 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) } wwo->state = WINE_WS_STOPPED; - + wwo->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); - - memcpy(&wwo->waveDesc, lpDesc, sizeof(WAVEOPENDESC)); + + wwo->waveDesc = *lpDesc; memcpy(&wwo->format, lpDesc->lpFormat, sizeof(PCMWAVEFORMAT)); - + if (wwo->format.wBitsPerSample == 0) { WARN("Resetting zeroed wBitsPerSample\n"); wwo->format.wBitsPerSample = 8 * @@ -1450,7 +1450,7 @@ static DWORD wodDsDesc(UINT wDevID, PDSDRIVERDESC desc) * DirectSound clients. However, it only does this if we respond * successfully to the DRV_QUERYDSOUNDDESC message. It's enough to fill in * the driver and device names of the description output parameter. */ - memcpy(desc, &(WOutDev[wDevID].cadev->ds_desc), sizeof(DSDRIVERDESC)); + *desc = WOutDev[wDevID].cadev->ds_desc; return MMSYSERR_NOERROR; } @@ -1837,7 +1837,7 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) wwi->state = WINE_WS_STOPPED; wwi->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); - memcpy(&wwi->waveDesc, lpDesc, sizeof(WAVEOPENDESC)); + wwi->waveDesc = *lpDesc; memcpy(&wwi->format, lpDesc->lpFormat, sizeof(PCMWAVEFORMAT)); if (wwi->format.wBitsPerSample == 0) diff --git a/dlls/wined3d/Makefile.in b/dlls/wined3d/Makefile.in index f6a49b9592b..e8bffa6f50c 100644 --- a/dlls/wined3d/Makefile.in +++ b/dlls/wined3d/Makefile.in @@ -9,6 +9,7 @@ EXTRALIBS = -luuid C_SRCS = \ arb_program_shader.c \ + ati_fragment_shader.c \ baseshader.c \ basetexture.c \ clipper.c \ diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 8ddab49c7d2..8868dac33b6 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -34,6 +34,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); WINE_DECLARE_DEBUG_CHANNEL(d3d_constants); +WINE_DECLARE_DEBUG_CHANNEL(d3d_caps); #define GLINFO_LOCATION (*gl_info) @@ -1873,6 +1874,193 @@ static BOOL shader_arb_dirty_const(IWineD3DDevice *iface) { return TRUE; } +static void shader_arb_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFFER *buffer) { + IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface; + shader_reg_maps* reg_maps = &This->baseShader.reg_maps; + CONST DWORD *function = This->baseShader.function; + const char *fragcolor; + WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info; + + /* Create the hw ARB shader */ + shader_addline(buffer, "!!ARBfp1.0\n"); + + shader_addline(buffer, "TEMP TMP;\n"); /* Used in matrix ops */ + shader_addline(buffer, "TEMP TMP2;\n"); /* Used in matrix ops */ + shader_addline(buffer, "TEMP TA;\n"); /* Used for modifiers */ + shader_addline(buffer, "TEMP TB;\n"); /* Used for modifiers */ + shader_addline(buffer, "TEMP TC;\n"); /* Used for modifiers */ + shader_addline(buffer, "PARAM coefdiv = { 0.5, 0.25, 0.125, 0.0625 };\n"); + shader_addline(buffer, "PARAM coefmul = { 2, 4, 8, 16 };\n"); + shader_addline(buffer, "PARAM one = { 1.0, 1.0, 1.0, 1.0 };\n"); + + /* Base Declarations */ + shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION); + + /* We need two variables for fog blending */ + shader_addline(buffer, "TEMP TMP_FOG;\n"); + if (This->baseShader.hex_version >= WINED3DPS_VERSION(2,0)) { + shader_addline(buffer, "TEMP TMP_COLOR;\n"); + } + + /* Base Shader Body */ + shader_generate_main( (IWineD3DBaseShader*) This, buffer, reg_maps, function); + + /* calculate fog and blend it + * NOTE: state.fog.params.y and state.fog.params.z don't hold fog start s and end e but + * -1/(e-s) and e/(e-s) respectively. + */ + shader_addline(buffer, "MAD_SAT TMP_FOG, fragment.fogcoord, state.fog.params.y, state.fog.params.z;\n"); + + if (This->baseShader.hex_version < WINED3DPS_VERSION(2,0)) { + fragcolor = "R0"; + } else { + fragcolor = "TMP_COLOR"; + } + if(This->srgb_enabled) { + /* Perform sRGB write correction. See GLX_EXT_framebuffer_sRGB */ + + /* Calculate the > 0.0031308 case */ + shader_addline(buffer, "POW TMP.x, %s.x, srgb_pow.x;\n", fragcolor); + shader_addline(buffer, "POW TMP.y, %s.y, srgb_pow.y;\n", fragcolor); + shader_addline(buffer, "POW TMP.z, %s.z, srgb_pow.z;\n", fragcolor); + shader_addline(buffer, "MUL TMP, TMP, srgb_mul_hi;\n"); + shader_addline(buffer, "SUB TMP, TMP, srgb_sub_hi;\n"); + /* Calculate the < case */ + shader_addline(buffer, "MUL TMP2, srgb_mul_low, %s;\n", fragcolor); + /* Get 1.0 / 0.0 masks for > 0.0031308 and < 0.0031308 */ + shader_addline(buffer, "SLT TA, srgb_comparison, %s;\n", fragcolor); + shader_addline(buffer, "SGE TB, srgb_comparison, %s;\n", fragcolor); + /* Store the components > 0.0031308 in the destination */ + shader_addline(buffer, "MUL %s, TMP, TA;\n", fragcolor); + /* Add the components that are < 0.0031308 */ + shader_addline(buffer, "MAD result.color.xyz, TMP2, TB, %s;\n", fragcolor); + /* [0.0;1.0] clamping. Not needed, this is done implicitly */ + } + if (This->baseShader.hex_version < WINED3DPS_VERSION(3,0)) { + shader_addline(buffer, "LRP result.color.rgb, TMP_FOG.x, %s, state.fog.color;\n", fragcolor); + shader_addline(buffer, "MOV result.color.a, %s.a;\n", fragcolor); + } + + shader_addline(buffer, "END\n"); + + /* TODO: change to resource.glObjectHandle or something like that */ + GL_EXTCALL(glGenProgramsARB(1, &This->baseShader.prgId)); + + TRACE("Creating a hw pixel shader, prg=%d\n", This->baseShader.prgId); + GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, This->baseShader.prgId)); + + TRACE("Created hw pixel shader, prg=%d\n", This->baseShader.prgId); + /* Create the program and check for errors */ + GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, + buffer->bsize, buffer->buffer)); + + if (glGetError() == GL_INVALID_OPERATION) { + GLint errPos; + glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos); + FIXME("HW PixelShader Error at position %d: %s\n", + errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + This->baseShader.prgId = -1; + } +} + +static void shader_arb_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFFER *buffer) { + IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *)iface; + shader_reg_maps* reg_maps = &This->baseShader.reg_maps; + CONST DWORD *function = This->baseShader.function; + WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info; + + /* Create the hw ARB shader */ + shader_addline(buffer, "!!ARBvp1.0\n"); + shader_addline(buffer, "PARAM helper_const = { 2.0, -1.0, %d.0, 0.0 };\n", This->rel_offset); + + /* Mesa supports only 95 constants */ + if (GL_VEND(MESA) || GL_VEND(WINE)) + This->baseShader.limits.constant_float = + min(95, This->baseShader.limits.constant_float); + + shader_addline(buffer, "TEMP TMP;\n"); + + /* Base Declarations */ + shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION); + + /* We need a constant to fixup the final position */ + shader_addline(buffer, "PARAM posFixup = program.env[%d];\n", ARB_SHADER_PRIVCONST_POS); + + if((GLINFO_LOCATION).set_texcoord_w) { + int i; + for(i = 0; i < min(8, MAX_REG_TEXCRD); i++) { + if(This->baseShader.reg_maps.texcoord_mask[i] != 0 && + This->baseShader.reg_maps.texcoord_mask[i] != WINED3DSP_WRITEMASK_ALL) { + shader_addline(buffer, "MOV result.texcoord[%u].w, -helper_const.y;\n", i); + } + } + } + + /* Base Shader Body */ + shader_generate_main( (IWineD3DBaseShader*) This, buffer, reg_maps, function); + + /* If this shader doesn't use fog copy the z coord to the fog coord so that we can use table fog */ + if (!reg_maps->fog) + shader_addline(buffer, "MOV result.fogcoord, TMP_OUT.z;\n"); + + /* Write the final position. + * + * OpenGL coordinates specify the center of the pixel while d3d coords specify + * the corner. The offsets are stored in z and w in posFixup. posFixup.y contains + * 1.0 or -1.0 to turn the rendering upside down for offscreen rendering. PosFixup.x + * contains 1.0 to allow a mad, but arb vs swizzles are too restricted for that. + */ + shader_addline(buffer, "MUL TMP, posFixup, TMP_OUT.w;\n"); + shader_addline(buffer, "ADD TMP_OUT.x, TMP_OUT.x, TMP.z;\n"); + shader_addline(buffer, "MAD TMP_OUT.y, TMP_OUT.y, posFixup.y, TMP.w;\n"); + + /* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c + * and the glsl equivalent + */ + shader_addline(buffer, "MAD TMP_OUT.z, TMP_OUT.z, helper_const.x, -TMP_OUT.w;\n"); + + shader_addline(buffer, "MOV result.position, TMP_OUT;\n"); + + shader_addline(buffer, "END\n"); + + /* TODO: change to resource.glObjectHandle or something like that */ + GL_EXTCALL(glGenProgramsARB(1, &This->baseShader.prgId)); + + TRACE("Creating a hw vertex shader, prg=%d\n", This->baseShader.prgId); + GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, This->baseShader.prgId)); + + TRACE("Created hw vertex shader, prg=%d\n", This->baseShader.prgId); + /* Create the program and check for errors */ + GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, + buffer->bsize, buffer->buffer)); + + if (glGetError() == GL_INVALID_OPERATION) { + GLint errPos; + glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos); + FIXME("HW VertexShader Error at position %d: %s\n", + errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); + This->baseShader.prgId = -1; + } +} + +static void shader_arb_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info, struct shader_caps *pCaps) { + /* We don't have an ARB fixed function pipeline yet, so let the none backend set its caps, + * then overwrite the shader specific ones + */ + none_shader_backend.shader_get_caps(devtype, gl_info, pCaps); + + pCaps->VertexShaderVersion = WINED3DVS_VERSION(1,1); + TRACE_(d3d_caps)("Hardware vertex shader version 1.1 enabled (ARB_PROGRAM)\n"); + pCaps->MaxVertexShaderConst = GL_LIMITS(vshader_constantsF); + + pCaps->PixelShaderVersion = WINED3DPS_VERSION(1,4); + pCaps->PixelShader1xMaxValue = 8.0; + TRACE_(d3d_caps)("Hardware pixel shader version 1.4 enabled (ARB_PROGRAM)\n"); +} + +static void shader_arb_load_init(void) { +} + const shader_backend_t arb_program_shader_backend = { &shader_arb_select, &shader_arb_select_depth_blt, @@ -1883,6 +2071,10 @@ const shader_backend_t arb_program_shader_backend = { &shader_arb_destroy, &shader_arb_alloc, &shader_arb_free, - &shader_arb_dirty_const - + &shader_arb_dirty_const, + &shader_arb_generate_pshader, + &shader_arb_generate_vshader, + &shader_arb_get_caps, + &shader_arb_load_init, + FFPStateTable }; diff --git a/dlls/wined3d/ati_fragment_shader.c b/dlls/wined3d/ati_fragment_shader.c new file mode 100644 index 00000000000..d4b95dbef1f --- /dev/null +++ b/dlls/wined3d/ati_fragment_shader.c @@ -0,0 +1,916 @@ +/* + * Fixed function pipeline replacement using GL_ATI_fragment_shader + * + * Copyright 2008 Stefan Dösinger(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 + */ + +#include "config.h" + +#include +#include + +#include "wined3d_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); + +/* Some private defines, Constant associations, etc + * Env bump matrix and per stage constant should be independent, + * a stage that bumpmaps can't read the per state constant + */ +#define ATI_FFP_CONST_BUMPMAT(i) (GL_CON_0_ATI + i) +#define ATI_FFP_CONST_CONSTANT0 GL_CON_0_ATI +#define ATI_FFP_CONST_CONSTANT1 GL_CON_1_ATI +#define ATI_FFP_CONST_CONSTANT2 GL_CON_2_ATI +#define ATI_FFP_CONST_CONSTANT3 GL_CON_3_ATI +#define ATI_FFP_CONST_CONSTANT4 GL_CON_4_ATI +#define ATI_FFP_CONST_CONSTANT5 GL_CON_5_ATI +#define ATI_FFP_CONST_TFACTOR GL_CON_6_ATI + +/* GL_ATI_fragment_shader specific fixed function pipeline description. "Inherits" from the common one */ +struct atifs_ffp_desc +{ + struct ffp_desc parent; + GLuint shader; +}; + +struct atifs_private_data +{ + struct shader_arb_priv parent; + struct list fragment_shaders; /* A linked list to track fragment pipeline replacement shaders */ + +}; + +static const char *debug_dstmod(GLuint mod) { + switch(mod) { + case GL_NONE: return "GL_NONE"; + case GL_2X_BIT_ATI: return "GL_2X_BIT_ATI"; + case GL_4X_BIT_ATI: return "GL_4X_BIT_ATI"; + case GL_8X_BIT_ATI: return "GL_8X_BIT_ATI"; + case GL_HALF_BIT_ATI: return "GL_HALF_BIT_ATI"; + case GL_QUARTER_BIT_ATI: return "GL_QUARTER_BIT_ATI"; + case GL_EIGHTH_BIT_ATI: return "GL_EIGHTH_BIT_ATI"; + case GL_SATURATE_BIT_ATI: return "GL_SATURATE_BIT_ATI"; + default: return "Unexpected modifier\n"; + } +} + +static const char *debug_argmod(GLuint mod) { + switch(mod) { + case GL_NONE: + return "GL_NONE"; + + case GL_2X_BIT_ATI: + return "GL_2X_BIT_ATI"; + case GL_COMP_BIT_ATI: + return "GL_COMP_BIT_ATI"; + case GL_NEGATE_BIT_ATI: + return "GL_NEGATE_BIT_ATI"; + case GL_BIAS_BIT_ATI: + return "GL_BIAS_BIT_ATI"; + + case GL_2X_BIT_ATI | GL_COMP_BIT_ATI: + return "GL_2X_BIT_ATI | GL_COMP_BIT_ATI"; + case GL_2X_BIT_ATI | GL_NEGATE_BIT_ATI: + return "GL_2X_BIT_ATI | GL_NEGATE_BIT_ATI"; + case GL_2X_BIT_ATI | GL_BIAS_BIT_ATI: + return "GL_2X_BIT_ATI | GL_BIAS_BIT_ATI"; + case GL_COMP_BIT_ATI | GL_NEGATE_BIT_ATI: + return "GL_COMP_BIT_ATI | GL_NEGATE_BIT_ATI"; + case GL_COMP_BIT_ATI | GL_BIAS_BIT_ATI: + return "GL_COMP_BIT_ATI | GL_BIAS_BIT_ATI"; + case GL_NEGATE_BIT_ATI | GL_BIAS_BIT_ATI: + return "GL_NEGATE_BIT_ATI | GL_BIAS_BIT_ATI"; + + case GL_COMP_BIT_ATI | GL_NEGATE_BIT_ATI | GL_BIAS_BIT_ATI: + return "GL_COMP_BIT_ATI | GL_NEGATE_BIT_ATI | GL_BIAS_BIT_ATI"; + case GL_2X_BIT_ATI | GL_NEGATE_BIT_ATI | GL_BIAS_BIT_ATI: + return "GL_2X_BIT_ATI | GL_NEGATE_BIT_ATI | GL_BIAS_BIT_ATI"; + case GL_2X_BIT_ATI | GL_COMP_BIT_ATI | GL_BIAS_BIT_ATI: + return "GL_2X_BIT_ATI | GL_COMP_BIT_ATI | GL_BIAS_BIT_ATI"; + case GL_2X_BIT_ATI | GL_COMP_BIT_ATI | GL_NEGATE_BIT_ATI: + return "GL_2X_BIT_ATI | GL_COMP_BIT_ATI | GL_NEGATE_BIT_ATI"; + + case GL_2X_BIT_ATI | GL_COMP_BIT_ATI | GL_NEGATE_BIT_ATI | GL_BIAS_BIT_ATI: + return "GL_2X_BIT_ATI | GL_COMP_BIT_ATI | GL_NEGATE_BIT_ATI | GL_BIAS_BIT_ATI"; + + default: + return "Unexpected argmod combination\n"; + } +} +static const char *debug_register(GLuint reg) { + switch(reg) { + case GL_REG_0_ATI: return "GL_REG_0_ATI"; + case GL_REG_1_ATI: return "GL_REG_1_ATI"; + case GL_REG_2_ATI: return "GL_REG_2_ATI"; + case GL_REG_3_ATI: return "GL_REG_3_ATI"; + case GL_REG_4_ATI: return "GL_REG_4_ATI"; + case GL_REG_5_ATI: return "GL_REG_5_ATI"; + + case GL_CON_0_ATI: return "GL_CON_0_ATI"; + case GL_CON_1_ATI: return "GL_CON_1_ATI"; + case GL_CON_2_ATI: return "GL_CON_2_ATI"; + case GL_CON_3_ATI: return "GL_CON_3_ATI"; + case GL_CON_4_ATI: return "GL_CON_4_ATI"; + case GL_CON_5_ATI: return "GL_CON_5_ATI"; + case GL_CON_6_ATI: return "GL_CON_6_ATI"; + case GL_CON_7_ATI: return "GL_CON_7_ATI"; + + case GL_ZERO: return "GL_ZERO"; + case GL_ONE: return "GL_ONE"; + case GL_PRIMARY_COLOR: return "GL_PRIMARY_COLOR"; + case GL_SECONDARY_INTERPOLATOR_ATI: return "GL_SECONDARY_INTERPOLATOR_ATI"; + + default: return "Unknown register\n"; + } +} + +static const char *debug_swizzle(GLuint swizzle) { + switch(swizzle) { + case GL_SWIZZLE_STR_ATI: return "GL_SWIZZLE_STR_ATI"; + case GL_SWIZZLE_STQ_ATI: return "GL_SWIZZLE_STQ_ATI"; + case GL_SWIZZLE_STR_DR_ATI: return "GL_SWIZZLE_STR_DR_ATI"; + case GL_SWIZZLE_STQ_DQ_ATI: return "GL_SWIZZLE_STQ_DQ_ATI"; + default: return "unknown swizzle"; + } +} + +#define GLINFO_LOCATION (*gl_info) +static GLuint register_for_arg(DWORD arg, WineD3D_GL_Info *gl_info, unsigned int stage, GLuint *mod) { + GLenum ret; + + if(mod) *mod = GL_NONE; + if(arg == 0xFFFFFFFF) return -1; /* This is the marker for unused registers */ + + switch(arg & WINED3DTA_SELECTMASK) { + case WINED3DTA_DIFFUSE: + ret = GL_PRIMARY_COLOR; + break; + + case WINED3DTA_CURRENT: + /* Note that using GL_REG_0_ATI for the passed on register is safe because + * texture0 is read at stage0, so in the worst case it is read in the + * instruction writing to reg0. Afterwards texture0 is not used any longer. + * If we're reading from current + */ + if(stage == 0) { + ret = GL_PRIMARY_COLOR; + } else { + ret = GL_REG_0_ATI; + } + break; + + case WINED3DTA_TEXTURE: + ret = GL_REG_0_ATI + stage; + break; + + case WINED3DTA_TFACTOR: + ret = ATI_FFP_CONST_TFACTOR; + break; + + case WINED3DTA_SPECULAR: + ret = GL_SECONDARY_INTERPOLATOR_ATI; + break; + + case WINED3DTA_TEMP: + FIXME("Unhandled source argument WINED3DTA_TEMP\n"); + ret = 0; + break; + + case WINED3DTA_CONSTANT: + FIXME("Unhandled source argument WINED3DTA_TEMP\n"); + ret = GL_CON_0_ATI; + break; + + default: + FIXME("Unknown source argument %d\n", arg); + ret = GL_ZERO; + } + + if(arg & WINED3DTA_COMPLEMENT) { + if(mod) *mod |= GL_COMP_BIT_ATI; + } + if(arg & WINED3DTA_ALPHAREPLICATE) { + FIXME("Unhandled read modifier WINED3DTA_ALPHAREPLICATE\n"); + } + return ret; +} + +static GLuint gen_ati_shader(struct texture_stage_op op[MAX_TEXTURES], WineD3D_GL_Info *gl_info) { + GLuint ret = GL_EXTCALL(glGenFragmentShadersATI(1)); + unsigned int stage; + GLuint arg0, arg1, arg2, extrarg; + GLuint dstmod, argmod0, argmod1, argmod2, argmodextra; + GLuint swizzle; + + if(!ret) { + ERR("Failed to generate a GL_ATI_fragment_shader shader id\n"); + return 0; + } + GL_EXTCALL(glBindFragmentShaderATI(ret)); + checkGLcall("GL_EXTCALL(glBindFragmentShaderATI(ret))"); + + TRACE("glBeginFragmentShaderATI()\n"); + GL_EXTCALL(glBeginFragmentShaderATI()); + checkGLcall("GL_EXTCALL(glBeginFragmentShaderATI())"); + + /* Pass 1: Generate sampling instructions for perturbation maps */ + for(stage = 0; stage < GL_LIMITS(textures); stage++) { + if(op[stage].cop == WINED3DTOP_DISABLE) break; + if(op[stage].cop != WINED3DTOP_BUMPENVMAP && + op[stage].cop != WINED3DTOP_BUMPENVMAPLUMINANCE) continue; + + TRACE("glSampleMapATI(GL_REG_%d_ATI, GL_TEXTURE_%d_ARB, GL_SWIZZLE_STR_ATI)\n", + stage, stage); + GL_EXTCALL(glSampleMapATI(GL_REG_0_ATI + stage, + GL_TEXTURE0_ARB + stage, + GL_SWIZZLE_STR_ATI)); + TRACE("glPassTexCoordATI(GL_REG_%d_ATI, GL_TEXTURE_%d_ARB, GL_SWIZZLE_STR_ATI)\n", + stage + 1, stage + 1); + GL_EXTCALL(glPassTexCoordATI(GL_REG_0_ATI + stage + 1, + GL_TEXTURE0_ARB + stage + 1, + GL_SWIZZLE_STR_ATI)); + + /* 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 */ + for(stage = 0; stage < GL_LIMITS(textures); stage++) { + if(op[stage].cop == WINED3DTOP_DISABLE) break; + if(op[stage].cop != WINED3DTOP_BUMPENVMAP && + op[stage].cop != WINED3DTOP_BUMPENVMAPLUMINANCE) continue; + + /* Nice thing, we get the color correction for free :-) */ + if(op[stage].color_correction == WINED3DFMT_V8U8) { + argmodextra = GL_2X_BIT_ATI | GL_BIAS_BIT_ATI; + } else { + argmodextra = 0; + } + + TRACE("glColorFragmentOp3ATI(GL_DOT2_ADD_ATI, GL_REG_%d_ATI, GL_RED_BIT_ATI, GL_NONE, GL_REG_%d_ATI, GL_NONE, %s, ATI_FFP_CONST_BUMPMAT(%d), GL_NONE, GL_NONE, GL_REG_%d_ATI, GL_RED, GL_NONE)\n", + stage + 1, stage, debug_argmod(argmodextra), stage, stage + 1); + GL_EXTCALL(glColorFragmentOp3ATI(GL_DOT2_ADD_ATI, GL_REG_0_ATI + stage + 1, GL_RED_BIT_ATI, GL_NONE, + GL_REG_0_ATI + stage, GL_NONE, argmodextra, + 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 :-( + * + * 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. + */ + TRACE("glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_5_ATI, GL_RED_BIT_ATI, GL_NONE, ATI_FFP_CONST_BUMPMAT(%d), GL_BLUE, GL_NONE)\n", stage); + GL_EXTCALL(glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_5_ATI, GL_RED_BIT_ATI, GL_NONE, + ATI_FFP_CONST_BUMPMAT(stage), GL_BLUE, GL_NONE)); + TRACE("glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_5_ATI, GL_GREEN_BIT_ATI, GL_NONE, ATI_FFP_CONST_BUMPMAT(%d), GL_ALPHA, GL_NONE)\n", stage); + GL_EXTCALL(glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_5_ATI, GL_GREEN_BIT_ATI, GL_NONE, + ATI_FFP_CONST_BUMPMAT(stage), GL_ALPHA, GL_NONE)); + TRACE("glColorFragmentOp3ATI(GL_DOT2_ADD_ATI, GL_REG_%d_ATI, GL_GREEN_BIT_ATI, GL_NONE, GL_REG_%d_ATI, GL_NONE, %s, GL_REG_5_ATI, GL_NONE, GL_NONE, GL_REG_%d_ATI, GL_GREEN, GL_NONE)\n", + stage + 1, stage, debug_argmod(argmodextra), stage + 1); + GL_EXTCALL(glColorFragmentOp3ATI(GL_DOT2_ADD_ATI, GL_REG_0_ATI + stage + 1, GL_GREEN_BIT_ATI, GL_NONE, + GL_REG_0_ATI + stage, GL_NONE, argmodextra, + GL_REG_5_ATI, GL_NONE, GL_2X_BIT_ATI | GL_BIAS_BIT_ATI, + GL_REG_0_ATI + stage + 1, GL_GREEN, GL_NONE)); + } + + /* Pass 3: Generate sampling instructions for regular textures */ + for(stage = 0; stage < GL_LIMITS(textures); stage++) { + if(op[stage].cop == WINED3DTOP_DISABLE) { + break; + } + + if(op[stage].projected == proj_none) { + swizzle = GL_SWIZZLE_STR_ATI; + } else if(op[stage].projected == proj_count3) { + /* TODO: D3DTTFF_COUNT3 | D3DTTFF_PROJECTED would be GL_SWIZZLE_STR_DR_ATI. + * However, the FFP vertex processing texture transform matrix handler does + * some transformations in the texture matrix which makes the 3rd coordinate + * arrive in Q, not R in that case. This is needed for opengl fixed function + * fragment processing which always divides by Q. In this backend we can + * handle that properly and be compatible with vertex shader output and avoid + * side effects of the texture matrix games + */ + swizzle = GL_SWIZZLE_STQ_DQ_ATI; + } else { + swizzle = GL_SWIZZLE_STQ_DQ_ATI; + } + + if((op[stage].carg0 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE || + (op[stage].carg1 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE || + (op[stage].carg2 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE || + (op[stage].aarg0 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE || + (op[stage].aarg1 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE || + (op[stage].aarg2 & WINED3DTA_SELECTMASK) == WINED3DTA_TEXTURE || + op[stage].cop == WINED3DTOP_BLENDTEXTUREALPHA) { + + if(stage > 0 && + (op[stage - 1].cop == WINED3DTOP_BUMPENVMAP || + op[stage - 1].cop == WINED3DTOP_BUMPENVMAPLUMINANCE)) { + TRACE("glSampleMapATI(GL_REG_%d_ATI, GL_REG_%d_ATI, GL_SWIZZLE_STR_ATI)\n", + stage, stage); + GL_EXTCALL(glSampleMapATI(GL_REG_0_ATI + stage, + GL_REG_0_ATI + stage, + GL_SWIZZLE_STR_ATI)); + } else { + TRACE("glSampleMapATI(GL_REG_%d_ATI, GL_TEXTURE_%d_ARB, %s)\n", + stage, stage, debug_swizzle(swizzle)); + GL_EXTCALL(glSampleMapATI(GL_REG_0_ATI + stage, + GL_TEXTURE0_ARB + stage, + swizzle)); + } + } + } + + /* Pass 4: Generate the arithmetic instructions */ + for(stage = 0; stage < MAX_TEXTURES; stage++) { + if(op[stage].cop == WINED3DTOP_DISABLE) { + if(stage == 0) { + /* Handle complete texture disabling gracefully */ + TRACE("glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, GL_PRIMARY_COLOR, GL_NONE, GL_NONE)\n"); + GL_EXTCALL(glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, + GL_PRIMARY_COLOR, GL_NONE, GL_NONE)); + TRACE("glAlphaFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_PRIMARY_COLOR, GL_NONE, GL_NONE)\n"); + GL_EXTCALL(glAlphaFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, + GL_PRIMARY_COLOR, GL_NONE, GL_NONE)); + } + break; + } + + arg0 = register_for_arg(op[stage].carg0, gl_info, stage, &argmod0); + arg1 = register_for_arg(op[stage].carg1, gl_info, stage, &argmod1); + arg2 = register_for_arg(op[stage].carg2, gl_info, stage, &argmod2); + dstmod = GL_NONE; + argmodextra = GL_NONE; + extrarg = GL_NONE; + + switch(op[stage].cop) { + case WINED3DTOP_SELECTARG2: + arg1 = arg2; + argmod1 = argmod2; + case WINED3DTOP_SELECTARG1: + TRACE("glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, %s, GL_NONE, %s)\n", + debug_register(arg1), debug_argmod(argmod1)); + GL_EXTCALL(glColorFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, + arg1, GL_NONE, argmod1)); + break; + + case WINED3DTOP_MODULATE4X: + if(dstmod == GL_NONE) dstmod = GL_4X_BIT_ATI; + case WINED3DTOP_MODULATE2X: + if(dstmod == GL_NONE) dstmod = GL_2X_BIT_ATI; + case WINED3DTOP_MODULATE: + TRACE("glColorFragmentOp2ATI(GL_MUL_ATI, GL_REG_0_ATI, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_dstmod(dstmod), debug_register(arg1), debug_argmod(argmod1), debug_register(arg2), debug_argmod(argmod2)); + GL_EXTCALL(glColorFragmentOp2ATI(GL_MUL_ATI, GL_REG_0_ATI, GL_NONE, dstmod, + arg1, GL_NONE, argmod1, + arg2, GL_NONE, argmod2)); + break; + + case WINED3DTOP_ADDSIGNED2X: + dstmod = GL_2X_BIT_ATI; + case WINED3DTOP_ADDSIGNED: + argmodextra = GL_BIAS_BIT_ATI; + case WINED3DTOP_ADD: + TRACE("glColorFragmentOp2ATI(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_dstmod(dstmod), debug_register(arg1), debug_argmod(argmod1), debug_register(arg2), debug_argmod(argmodextra | argmod2)); + GL_EXTCALL(glColorFragmentOp2ATI(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, dstmod, + arg1, GL_NONE, argmod1, + arg2, GL_NONE, argmodextra | argmod2)); + break; + + case WINED3DTOP_SUBTRACT: + TRACE("glColorFragmentOp2ATI(GL_SUB_ATI, GL_REG_0_ATI, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_dstmod(dstmod), debug_register(arg1), debug_argmod(argmod1), debug_register(arg2), debug_argmod(argmod2)); + GL_EXTCALL(glColorFragmentOp2ATI(GL_SUB_ATI, GL_REG_0_ATI, GL_NONE, dstmod, + arg1, GL_NONE, argmod1, + arg2, GL_NONE, argmod2)); + break; + + case WINED3DTOP_ADDSMOOTH: + argmodextra = argmod1 & GL_COMP_BIT_ATI ? argmod1 & ~GL_COMP_BIT_ATI : argmod1 | GL_COMP_BIT_ATI; + TRACE("glColorFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_register(arg2), debug_argmod(argmod2), debug_register(arg1), debug_argmod(argmodextra), debug_register(arg1), debug_argmod(argmod1)); + /* Dst = arg1 + * arg2(1 -arg 1) + * = arg2 * (1 - arg1) + arg1 + */ + GL_EXTCALL(glColorFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, + arg2, GL_NONE, argmod2, + arg1, GL_NONE, argmodextra, + arg1, GL_NONE, argmod1)); + break; + + case WINED3DTOP_BLENDCURRENTALPHA: + if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_CURRENT, gl_info, stage, NULL); + case WINED3DTOP_BLENDFACTORALPHA: + if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_TFACTOR, gl_info, stage, NULL); + case WINED3DTOP_BLENDTEXTUREALPHA: + if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_TEXTURE, gl_info, stage, NULL); + case WINED3DTOP_BLENDDIFFUSEALPHA: + if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_DIFFUSE, gl_info, stage, NULL); + TRACE("glColorFragmentOp3ATI(GL_LERP_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, %s, GL_ALPHA, GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_register(extrarg), debug_register(arg1), debug_argmod(argmod1), debug_register(arg2), debug_argmod(argmod2)); + GL_EXTCALL(glColorFragmentOp3ATI(GL_LERP_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, + extrarg, GL_ALPHA, GL_NONE, + arg1, GL_NONE, argmod1, + arg2, GL_NONE, argmod2)); + break; + + case WINED3DTOP_BLENDTEXTUREALPHAPM: + arg0 = register_for_arg(WINED3DTA_TEXTURE, gl_info, stage, NULL); + TRACE("glColorFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, %s, GL_NONE, %s, %s, GL_ALPHA, GL_COMP_BIT_ATI, %s, GL_NONE, %s)\n", + debug_register(arg2), debug_argmod(argmod2), debug_register(arg0), debug_register(arg1), debug_argmod(argmod1)); + GL_EXTCALL(glColorFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, + arg2, GL_NONE, argmod2, + arg0, GL_ALPHA, GL_COMP_BIT_ATI, + arg1, GL_NONE, argmod1)); + break; + + /* D3DTOP_PREMODULATE ???? */ + + case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR: + argmodextra = argmod1 & GL_COMP_BIT_ATI ? argmod1 & ~GL_COMP_BIT_ATI : argmod1 | GL_COMP_BIT_ATI; + case WINED3DTOP_MODULATEALPHA_ADDCOLOR: + if(!argmodextra) argmodextra = argmod1; + TRACE("glColorFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, %s, GL_NONE, %s, %s, GL_ALPHA, %s, %s, GL_NONE, %s)\n", + debug_register(arg2), debug_argmod(argmod2), debug_register(arg1), debug_argmod(argmodextra), debug_register(arg1), debug_argmod(arg1)); + GL_EXTCALL(glColorFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, + arg2, GL_NONE, argmod2, + arg1, GL_ALPHA, argmodextra, + arg1, GL_NONE, argmod1)); + break; + + case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA: + argmodextra = argmod1 & GL_COMP_BIT_ATI ? argmod1 & ~GL_COMP_BIT_ATI : argmod1 | GL_COMP_BIT_ATI; + case WINED3DTOP_MODULATECOLOR_ADDALPHA: + if(!argmodextra) argmodextra = argmod1; + TRACE("glColorFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_ALPHA, %s)\n", + debug_register(arg2), debug_argmod(argmod2), debug_register(arg1), debug_argmod(argmodextra), debug_register(arg1), debug_argmod(argmod1)); + GL_EXTCALL(glColorFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, + arg2, GL_NONE, argmod2, + arg1, GL_NONE, argmodextra, + arg1, GL_ALPHA, argmod1)); + break; + + case WINED3DTOP_DOTPRODUCT3: + TRACE("glColorFragmentOp2ATI(GL_DOT3_ATI, GL_REG_0_ATI, GL_NONE, GL_4X_BIT_ATI, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_register(arg1), debug_argmod(argmod1 | GL_BIAS_BIT_ATI), debug_register(arg2), debug_argmod(argmod2 | GL_BIAS_BIT_ATI)); + GL_EXTCALL(glColorFragmentOp2ATI(GL_DOT3_ATI, GL_REG_0_ATI, GL_NONE, GL_4X_BIT_ATI, + arg1, GL_NONE, argmod1 | GL_BIAS_BIT_ATI, + arg2, GL_NONE, argmod2 | GL_BIAS_BIT_ATI)); + break; + + case WINED3DTOP_MULTIPLYADD: + TRACE("glColorFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_register(arg0), debug_argmod(argmod0), debug_register(arg2), debug_argmod(argmod2), debug_register(arg1), debug_argmod(argmod1)); + GL_EXTCALL(glColorFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, + arg0, GL_NONE, argmod0, + arg2, GL_NONE, argmod2, + arg1, GL_NONE, argmod1)); + break; + + case WINED3DTOP_LERP: + TRACE("glColorFragmentOp3ATI(GL_LERP_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_register(arg1), debug_argmod(argmod1), debug_register(arg2), debug_argmod(argmod2), debug_register(arg0), debug_argmod(argmod0)); + GL_EXTCALL(glColorFragmentOp3ATI(GL_LERP_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE, + arg1, GL_NONE, argmod1, + arg2, GL_NONE, argmod2, + arg0, GL_NONE, argmod0)); + break; + + case WINED3DTOP_BUMPENVMAP: + case WINED3DTOP_BUMPENVMAPLUMINANCE: + /* Those are handled in the first pass of the shader(generation pass 1 and 2) alraedy */ + break; + + default: FIXME("Unhandled color operation %d on stage %d\n", op[stage].cop, stage); + } + + arg0 = register_for_arg(op[stage].aarg0, gl_info, stage, &argmod0); + arg1 = register_for_arg(op[stage].aarg1, gl_info, stage, &argmod1); + arg2 = register_for_arg(op[stage].aarg2, gl_info, stage, &argmod2); + dstmod = GL_NONE; + argmodextra = GL_NONE; + extrarg = GL_NONE; + + switch(op[stage].aop) { + case WINED3DTOP_DISABLE: + /* Get the primary color to the output if on stage 0, otherwise leave register 0 untouched */ + if(stage == 0) { + TRACE("glAlphaFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, GL_PRIMARY_COLOR, GL_NONE, GL_NONE)\n"); + GL_EXTCALL(glAlphaFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, + GL_PRIMARY_COLOR, GL_NONE, GL_NONE)); + } + break; + + case WINED3DTOP_SELECTARG2: + arg1 = arg2; + argmod1 = argmod2; + case WINED3DTOP_SELECTARG1: + TRACE("glAlphaFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, %s, GL_NONE, %s)\n", + debug_register(arg1), debug_argmod(argmod1)); + GL_EXTCALL(glAlphaFragmentOp1ATI(GL_MOV_ATI, GL_REG_0_ATI, GL_NONE, + arg1, GL_NONE, argmod1)); + break; + + case WINED3DTOP_MODULATE4X: + if(dstmod == GL_NONE) dstmod = GL_4X_BIT_ATI; + case WINED3DTOP_MODULATE2X: + if(dstmod == GL_NONE) dstmod = GL_2X_BIT_ATI; + case WINED3DTOP_MODULATE: + TRACE("glAlphaFragmentOp2ATI(GL_MUL_ATI, GL_REG_0_ATI, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_dstmod(dstmod), debug_register(arg1), debug_argmod(argmod1), debug_register(arg2), debug_argmod(argmod2)); + GL_EXTCALL(glAlphaFragmentOp2ATI(GL_MUL_ATI, GL_REG_0_ATI, dstmod, + arg1, GL_NONE, argmod1, + arg2, GL_NONE, argmod2)); + break; + + case WINED3DTOP_ADDSIGNED2X: + dstmod = GL_2X_BIT_ATI; + case WINED3DTOP_ADDSIGNED: + argmodextra = GL_BIAS_BIT_ATI; + case WINED3DTOP_ADD: + TRACE("glAlphaFragmentOp2ATI(GL_ADD_ATI, GL_REG_0_ATI, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_dstmod(dstmod), debug_register(arg1), debug_argmod(argmod1), debug_register(arg2), debug_argmod(argmodextra | argmod2)); + GL_EXTCALL(glAlphaFragmentOp2ATI(GL_ADD_ATI, GL_REG_0_ATI, dstmod, + arg1, GL_NONE, argmod1, + arg2, GL_NONE, argmodextra | argmod2)); + break; + + case WINED3DTOP_SUBTRACT: + TRACE("glAlphaFragmentOp2ATI(GL_SUB_ATI, GL_REG_0_ATI, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_dstmod(dstmod), debug_register(arg1), debug_argmod(argmod1), debug_register(arg2), debug_argmod(argmod2)); + GL_EXTCALL(glAlphaFragmentOp2ATI(GL_SUB_ATI, GL_REG_0_ATI, dstmod, + arg1, GL_NONE, argmod1, + arg2, GL_NONE, argmod2)); + break; + + case WINED3DTOP_ADDSMOOTH: + argmodextra = argmod1 & GL_COMP_BIT_ATI ? argmod1 & ~GL_COMP_BIT_ATI : argmod1 | GL_COMP_BIT_ATI; + TRACE("glAlphaFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_register(arg2), debug_argmod(argmod2), debug_register(arg1), debug_argmod(argmodextra), debug_register(arg1), debug_argmod(argmod1)); + /* Dst = arg1 + * arg2(1 -arg 1) + * = arg2 * (1 - arg1) + arg1 + */ + GL_EXTCALL(glAlphaFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, + arg2, GL_NONE, argmod2, + arg1, GL_NONE, argmodextra, + arg1, GL_NONE, argmod1)); + break; + + case WINED3DTOP_BLENDCURRENTALPHA: + if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_CURRENT, gl_info, stage, NULL); + case WINED3DTOP_BLENDFACTORALPHA: + if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_TFACTOR, gl_info, stage, NULL); + case WINED3DTOP_BLENDTEXTUREALPHA: + if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_TEXTURE, gl_info, stage, NULL); + case WINED3DTOP_BLENDDIFFUSEALPHA: + if(extrarg == GL_NONE) extrarg = register_for_arg(WINED3DTA_DIFFUSE, gl_info, stage, NULL); + TRACE("glAlphaFragmentOp3ATI(GL_LERP_ATI, GL_REG_0_ATI, GL_NONE, %s, GL_ALPHA, GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_register(extrarg), debug_register(arg1), debug_argmod(argmod1), debug_register(arg2), debug_argmod(argmod2)); + GL_EXTCALL(glAlphaFragmentOp3ATI(GL_LERP_ATI, GL_REG_0_ATI, GL_NONE, + extrarg, GL_ALPHA, GL_NONE, + arg1, GL_NONE, argmod1, + arg2, GL_NONE, argmod2)); + break; + + case WINED3DTOP_BLENDTEXTUREALPHAPM: + arg0 = register_for_arg(WINED3DTA_TEXTURE, gl_info, stage, NULL); + TRACE("glAlphaFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, %s, GL_NONE, %s, %s, GL_ALPHA, GL_COMP_BIT_ATI, %s, GL_NONE, %s)\n", + debug_register(arg2), debug_argmod(argmod2), debug_register(arg0), debug_register(arg1), debug_argmod(argmod1)); + GL_EXTCALL(glAlphaFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, + arg2, GL_NONE, argmod2, + arg0, GL_ALPHA, GL_COMP_BIT_ATI, + arg1, GL_NONE, argmod1)); + break; + + /* D3DTOP_PREMODULATE ???? */ + + case WINED3DTOP_DOTPRODUCT3: + TRACE("glAlphaFragmentOp2ATI(GL_DOT3_ATI, GL_REG_0_ATI, GL_NONE, GL_4X_BIT_ATI, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_register(arg1), debug_argmod(argmod1 | GL_BIAS_BIT_ATI), debug_register(arg2), debug_argmod(argmod2 | GL_BIAS_BIT_ATI)); + GL_EXTCALL(glAlphaFragmentOp2ATI(GL_DOT3_ATI, GL_REG_0_ATI, GL_4X_BIT_ATI, + arg1, GL_NONE, argmod1 | GL_BIAS_BIT_ATI, + arg2, GL_NONE, argmod2 | GL_BIAS_BIT_ATI)); + break; + + case WINED3DTOP_MULTIPLYADD: + TRACE("glAlphaFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_register(arg0), debug_argmod(argmod0), debug_register(arg2), debug_argmod(argmod2), debug_register(arg1), debug_argmod(argmod1)); + GL_EXTCALL(glAlphaFragmentOp3ATI(GL_MAD_ATI, GL_REG_0_ATI, GL_NONE, + arg0, GL_NONE, argmod0, + arg2, GL_NONE, argmod2, + arg1, GL_NONE, argmod1)); + break; + + case WINED3DTOP_LERP: + TRACE("glAlphaFragmentOp3ATI(GL_LERP_ATI, GL_REG_0_ATI, GL_NONE, %s, GL_NONE, %s, %s, GL_NONE, %s, %s, GL_NONE, %s)\n", + debug_register(arg1), debug_argmod(argmod1), debug_register(arg2), debug_argmod(argmod2), debug_register(arg0), debug_argmod(argmod0)); + GL_EXTCALL(glAlphaFragmentOp3ATI(GL_LERP_ATI, GL_REG_0_ATI, GL_NONE, + arg1, GL_NONE, argmod1, + arg2, GL_NONE, argmod2, + arg0, GL_NONE, argmod0)); + break; + + case WINED3DTOP_MODULATEINVALPHA_ADDCOLOR: + case WINED3DTOP_MODULATEALPHA_ADDCOLOR: + case WINED3DTOP_MODULATECOLOR_ADDALPHA: + case WINED3DTOP_MODULATEINVCOLOR_ADDALPHA: + case WINED3DTOP_BUMPENVMAP: + case WINED3DTOP_BUMPENVMAPLUMINANCE: + ERR("Application uses an invalid alpha operation\n"); + break; + + default: FIXME("Unhandled alpha operation %d on stage %d\n", op[stage].aop, stage); + } + } + + TRACE("glEndFragmentShaderATI()\n"); + GL_EXTCALL(glEndFragmentShaderATI()); + checkGLcall("GL_EXTCALL(glEndFragmentShaderATI())"); + return ret; +} +#undef GLINFO_LOCATION + +#define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info +static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { + IWineD3DDeviceImpl *This = stateblock->wineD3DDevice; + struct atifs_ffp_desc *desc; + struct texture_stage_op op[MAX_TEXTURES]; + struct atifs_private_data *priv = (struct atifs_private_data *) This->shader_priv; + + gen_ffp_op(stateblock, op); + desc = (struct atifs_ffp_desc *) find_ffp_shader(&priv->fragment_shaders, op); + if(!desc) { + desc = HeapAlloc(GetProcessHeap(), 0, sizeof(*desc)); + if(!desc) { + ERR("Out of memory\n"); + return; + } + memcpy(desc->parent.op, op, sizeof(op)); + desc->shader = gen_ati_shader(op, &GLINFO_LOCATION); + add_ffp_shader(&priv->fragment_shaders, &desc->parent); + TRACE("Allocated fixed function replacement shader descriptor %p\n", desc); + } + + GL_EXTCALL(glBindFragmentShaderATI(desc->shader)); +} + +static void state_texfactor_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { + float col[4]; + D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col); + + GL_EXTCALL(glSetFragmentShaderConstantATI(ATI_FFP_CONST_TFACTOR, col)); + checkGLcall("glSetFragmentShaderConstantATI(ATI_FFP_CONST_TFACTOR, col)"); +} + +static void set_bumpmat(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DContext *context) { + DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / WINED3D_HIGHEST_TEXTURE_STATE; + float mat[2][2]; + + mat[0][0] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT00]); + mat[1][0] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT01]); + mat[0][1] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT10]); + mat[1][1] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT11]); + /* GL_ATI_fragment_shader allows only constants from 0.0 to 1.0, but the bumpmat + * constants can be in any range. While they should stay between [-1.0 and 1.0] because + * Shader Model 1.x pixel shaders are clamped to that range negative values are used occasionally, + * for example by our d3d9 test. So to get negative values scale -1;1 to 0;1 and undo that in the + * shader(it is free). This might potentially reduce precision. However, if the hardware does + * support proper floats it shouldn't, and if it doesn't we can't get anything better anyway + */ + mat[0][0] = (mat[0][0] + 1.0) * 0.5; + mat[1][0] = (mat[1][0] + 1.0) * 0.5; + mat[0][1] = (mat[0][1] + 1.0) * 0.5; + mat[1][1] = (mat[1][1] + 1.0) * 0.5; + GL_EXTCALL(glSetFragmentShaderConstantATI(ATI_FFP_CONST_BUMPMAT(stage), (float *) mat)); + checkGLcall("glSetFragmentShaderConstantATI(ATI_FFP_CONST_BUMPMAT(stage), mat)"); + + /* FIXME: This should go away + * This is currently needed because atifs borrows a pixel shader implementation + * from somewhere else, but consumes bump map matrix change events. The other pixel + * shader implementation may need notification about the change to update the texbem + * constants. Once ATIFS supports real shaders on its own, and GLSL/ARB have a replacement + * pipeline this call can go away + * + * FIXME2: Even considering this workaround calling FFPStateTable directly isn't nice + * as well. Better would be to call the model's table we inherit from, but currently + * it is always the FFP table, and as soon as this changes we can remove the call anyway + */ + FFPStateTable[state].apply(state, stateblock, context); +} +#undef GLINFO_LOCATION + +/* our state table. Borrows lots of stuff from the base implementation */ +struct StateEntry ATIFSStateTable[STATE_HIGHEST + 1]; + +static void init_state_table() { + unsigned int i; + const DWORD rep = STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP); + memcpy(ATIFSStateTable, arb_program_shader_backend.StateTable, sizeof(ATIFSStateTable)); + + for(i = 0; i < MAX_TEXTURES; i++) { + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP)].apply = set_tex_op_atifs; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP)].representative = rep; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_COLORARG1)].apply = set_tex_op_atifs; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_COLORARG1)].representative = rep; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_COLORARG2)].apply = set_tex_op_atifs; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_COLORARG2)].representative = rep; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_COLORARG0)].apply = set_tex_op_atifs; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_COLORARG0)].representative = rep; + + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_ALPHAOP)].apply = set_tex_op_atifs; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_ALPHAOP)].representative = rep; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_ALPHAARG1)].apply = set_tex_op_atifs; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_ALPHAARG1)].representative = rep; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_ALPHAARG2)].apply = set_tex_op_atifs; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_ALPHAARG2)].representative = rep; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_ALPHAARG0)].apply = set_tex_op_atifs; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_ALPHAARG0)].representative = rep; + + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_BUMPENVMAT00)].apply = set_bumpmat; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_BUMPENVMAT01)].apply = set_bumpmat; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_BUMPENVMAT10)].apply = set_bumpmat; + ATIFSStateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_BUMPENVMAT11)].apply = set_bumpmat; + } + + ATIFSStateTable[STATE_RENDER(WINED3DRS_TEXTUREFACTOR)].apply = state_texfactor_atifs; + ATIFSStateTable[STATE_RENDER(WINED3DRS_TEXTUREFACTOR)].representative = STATE_RENDER(WINED3DRS_TEXTUREFACTOR); +} + +/* GL_ATI_fragment_shader backend.It borrows a lot from a the + * ARB shader backend, currently the whole vertex processing + * code. This code would also forward pixel shaders, but if + * GL_ARB_fragment_program is supported, the atifs shader backend + * is not used. + */ +static void shader_atifs_select(IWineD3DDevice *iface, BOOL usePS, BOOL useVS) { + arb_program_shader_backend.shader_select(iface, usePS, useVS); +} + +static void shader_atifs_select_depth_blt(IWineD3DDevice *iface) { + arb_program_shader_backend.shader_select_depth_blt(iface); +} + +static void shader_atifs_destroy_depth_blt(IWineD3DDevice *iface) { + arb_program_shader_backend.shader_destroy_depth_blt(iface); +} + +static void shader_atifs_load_constants(IWineD3DDevice *iface, char usePS, char useVS) { + arb_program_shader_backend.shader_load_constants(iface, usePS, useVS); +} + +static void shader_atifs_cleanup(IWineD3DDevice *iface) { + arb_program_shader_backend.shader_cleanup(iface); +} + +static void shader_atifs_color_correction(SHADER_OPCODE_ARG* arg) { + arb_program_shader_backend.shader_color_correction(arg); +} + +static void shader_atifs_destroy(IWineD3DBaseShader *iface) { + arb_program_shader_backend.shader_destroy(iface); +} + +static HRESULT shader_atifs_alloc(IWineD3DDevice *iface) { + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; + HRESULT hr; + struct atifs_private_data *priv; + hr = arb_program_shader_backend.shader_alloc_private(iface); + if(FAILED(hr)) return hr; + + This->shader_priv = HeapReAlloc(GetProcessHeap(), 0, This->shader_priv, + sizeof(struct atifs_private_data)); + priv = (struct atifs_private_data *) This->shader_priv; + list_init(&priv->fragment_shaders); + return WINED3D_OK; +} + +#define GLINFO_LOCATION This->adapter->gl_info +static void shader_atifs_free(IWineD3DDevice *iface) { + IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface; + struct atifs_private_data *priv = (struct atifs_private_data *) This->shader_priv; + struct ffp_desc *entry, *entry2; + struct atifs_ffp_desc *entry_ati; + + ENTER_GL(); + LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &priv->fragment_shaders, struct ffp_desc, entry) { + entry_ati = (struct atifs_ffp_desc *) entry; + GL_EXTCALL(glDeleteFragmentShaderATI(entry_ati->shader)); + checkGLcall("glDeleteFragmentShaderATI(entry->shader)"); + list_remove(&entry->entry); + HeapFree(GetProcessHeap(), 0, entry); + } + LEAVE_GL(); + + /* Not actually needed, but revert what we've done before */ + This->shader_priv = HeapReAlloc(GetProcessHeap(), 0, This->shader_priv, + sizeof(struct shader_arb_priv)); + arb_program_shader_backend.shader_free_private(iface); +} +#undef GLINFO_LOCATION + +static BOOL shader_atifs_dirty_const(IWineD3DDevice *iface) { + return arb_program_shader_backend.shader_dirtifyable_constants(iface); +} + +static void shader_atifs_load_init(void) { + arb_program_shader_backend.shader_dll_load_init(); + init_state_table(); +} + +static void shader_atifs_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info, struct shader_caps *caps) { + arb_program_shader_backend.shader_get_caps(devtype, gl_info, caps); + + caps->TextureOpCaps = WINED3DTEXOPCAPS_DISABLE | + WINED3DTEXOPCAPS_SELECTARG1 | + WINED3DTEXOPCAPS_SELECTARG2 | + WINED3DTEXOPCAPS_MODULATE4X | + WINED3DTEXOPCAPS_MODULATE2X | + WINED3DTEXOPCAPS_MODULATE | + WINED3DTEXOPCAPS_ADDSIGNED2X | + WINED3DTEXOPCAPS_ADDSIGNED | + WINED3DTEXOPCAPS_ADD | + WINED3DTEXOPCAPS_SUBTRACT | + WINED3DTEXOPCAPS_ADDSMOOTH | + WINED3DTEXOPCAPS_BLENDCURRENTALPHA | + WINED3DTEXOPCAPS_BLENDFACTORALPHA | + WINED3DTEXOPCAPS_BLENDTEXTUREALPHA | + WINED3DTEXOPCAPS_BLENDDIFFUSEALPHA | + WINED3DTEXOPCAPS_BLENDTEXTUREALPHAPM | + WINED3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR | + WINED3DTEXOPCAPS_MODULATECOLOR_ADDALPHA | + WINED3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA | + WINED3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR | + WINED3DTEXOPCAPS_DOTPRODUCT3 | + WINED3DTEXOPCAPS_MULTIPLYADD | + WINED3DTEXOPCAPS_LERP | + WINED3DTEXOPCAPS_BUMPENVMAP; + + /* TODO: Implement WINED3DTEXOPCAPS_BUMPENVMAPLUMINANCE + and WINED3DTEXOPCAPS_PREMODULATE */ + + /* GL_ATI_fragment_shader only supports up to 6 textures, which was the limit on r200 cards + * which this extension is exclusively focused on(later cards have GL_ARB_fragment_program). + * If the current card has more than 8 fixed function textures in OpenGL's regular fixed + * function pipeline then the ATI_fragment_shader backend imposes a stricter limit. This + * shouldn't be too hard since Nvidia cards have a limit of 4 textures with the default ffp + * pipeline, and almost all games are happy with that. We can however support up to 8 + * texture stages because we have a 2nd pass limit of 8 instructions, and per stage we use + * only 1 instruction. + * + * The proper fix for this is not to use GL_ATI_fragment_shader on cards newer than the + * r200 series and use an ARB or GLSL shader instead + */ + if(caps->MaxSimultaneousTextures > 6) { + WARN("OpenGL fixed function supports %d simultaneous textures,\n", caps->MaxSimultaneousTextures); + WARN("but GL_ATI_fragment_shader limits this to 6\n"); + caps->MaxSimultaneousTextures = 6; + } +} + +static void shader_atifs_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFFER *buffer) { + ERR("Should not get here\n"); +} + +static void shader_atifs_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFFER *buffer) { + arb_program_shader_backend.shader_generate_vshader(iface, buffer); +} + +const shader_backend_t atifs_shader_backend = { + shader_atifs_select, + shader_atifs_select_depth_blt, + shader_atifs_destroy_depth_blt, + shader_atifs_load_constants, + shader_atifs_cleanup, + shader_atifs_color_correction, + shader_atifs_destroy, + shader_atifs_alloc, + shader_atifs_free, + shader_atifs_dirty_const, + shader_atifs_generate_pshader, + shader_atifs_generate_vshader, + shader_atifs_get_caps, + shader_atifs_load_init, + ATIFSStateTable +}; diff --git a/dlls/wined3d/baseshader.c b/dlls/wined3d/baseshader.c index b5328b0af1d..678b11920f9 100644 --- a/dlls/wined3d/baseshader.c +++ b/dlls/wined3d/baseshader.c @@ -1098,6 +1098,79 @@ static void shader_none_destroy(IWineD3DBaseShader *iface) {} static HRESULT shader_none_alloc(IWineD3DDevice *iface) {return WINED3D_OK;} static void shader_none_free(IWineD3DDevice *iface) {} static BOOL shader_none_dirty_const(IWineD3DDevice *iface) {return FALSE;} +static void shader_none_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFFER *buffer) { + FIXME("NONE shader backend asked to generate a pixel shader\n"); +} +static void shader_none_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFFER *buffer) { + FIXME("NONE shader backend asked to generate a vertex shader\n"); +} +static void shader_none_load_init(void) {} + +#define GLINFO_LOCATION (*gl_info) +static void shader_none_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info, struct shader_caps *pCaps) { + pCaps->TextureOpCaps = WINED3DTEXOPCAPS_ADD | + WINED3DTEXOPCAPS_ADDSIGNED | + WINED3DTEXOPCAPS_ADDSIGNED2X | + WINED3DTEXOPCAPS_MODULATE | + WINED3DTEXOPCAPS_MODULATE2X | + WINED3DTEXOPCAPS_MODULATE4X | + WINED3DTEXOPCAPS_SELECTARG1 | + WINED3DTEXOPCAPS_SELECTARG2 | + WINED3DTEXOPCAPS_DISABLE; + + if (GL_SUPPORT(ARB_TEXTURE_ENV_COMBINE) || + GL_SUPPORT(EXT_TEXTURE_ENV_COMBINE) || + GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) { + pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_BLENDDIFFUSEALPHA | + WINED3DTEXOPCAPS_BLENDTEXTUREALPHA | + WINED3DTEXOPCAPS_BLENDFACTORALPHA | + WINED3DTEXOPCAPS_BLENDCURRENTALPHA | + WINED3DTEXOPCAPS_LERP | + WINED3DTEXOPCAPS_SUBTRACT; + } + if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3) || + GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) { + pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_ADDSMOOTH | + WINED3DTEXOPCAPS_MULTIPLYADD | + WINED3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR | + WINED3DTEXOPCAPS_MODULATECOLOR_ADDALPHA | + WINED3DTEXOPCAPS_BLENDTEXTUREALPHAPM; + } + if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) + pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_DOTPRODUCT3; + + if (GL_SUPPORT(NV_REGISTER_COMBINERS)) { + pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR | + WINED3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA; + } + + if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) { + pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_BUMPENVMAP; + } else if(GL_SUPPORT(NV_TEXTURE_SHADER2)) { + /* Bump mapping is supported already in NV_TEXTURE_SHADER, but that extension does + * not support 3D textures. This asks for trouble if an app uses both bump mapping + * and 3D textures. It also allows us to keep the code simpler by having texture + * shaders constantly enabled. + */ + pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_BUMPENVMAP; + /* TODO: Luminance bump map? */ + } + +#if 0 + /* FIXME: Add + pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_BUMPENVMAPLUMINANCE + WINED3DTEXOPCAPS_PREMODULATE */ +#endif + + pCaps->MaxTextureBlendStages = GL_LIMITS(texture_stages); + pCaps->MaxSimultaneousTextures = GL_LIMITS(textures); + + /* Set the shader caps to 0 for the none shader backend */ + pCaps->VertexShaderVersion = 0; + pCaps->PixelShaderVersion = 0; + pCaps->PixelShader1xMaxValue = 0.0; +} +#undef GLINFO_LOCATION const shader_backend_t none_shader_backend = { &shader_none_select, @@ -1109,7 +1182,12 @@ const shader_backend_t none_shader_backend = { &shader_none_destroy, &shader_none_alloc, &shader_none_free, - &shader_none_dirty_const + &shader_none_dirty_const, + &shader_none_generate_pshader, + &shader_none_generate_vshader, + &shader_none_get_caps, + &shader_none_load_init, + FFPStateTable }; /* ******************************************* diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c index 9a5ed78f702..90828d65442 100644 --- a/dlls/wined3d/context.c +++ b/dlls/wined3d/context.c @@ -39,9 +39,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d); * Params: * context: Context to mark the state dirty in * state: State to mark dirty + * StateTable: Pointer to the state table in use(for state grouping) * *****************************************************************************/ -static void Context_MarkStateDirty(WineD3DContext *context, DWORD state) { +static void Context_MarkStateDirty(WineD3DContext *context, DWORD state, const struct StateEntry *StateTable) { DWORD rep = StateTable[state].representative; DWORD idx; BYTE shift; @@ -101,7 +102,7 @@ static WineD3DContext *AddContextToArray(IWineD3DDeviceImpl *This, HWND win_hand /* Mark all states dirty to force a proper initialization of the states on the first use of the context */ for(state = 0; state <= STATE_HIGHEST; state++) { - Context_MarkStateDirty(This->contexts[This->numContexts], state); + Context_MarkStateDirty(This->contexts[This->numContexts], state, This->shader_backend->StateTable); } This->numContexts++; @@ -406,7 +407,11 @@ WineD3DContext *CreateContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *tar glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, GL_TEXTURE0_ARB + s - 1); checkGLcall("glTexEnvi(GL_TEXTURE_SHADER_NV, GL_PREVIOUS_TEXTURE_INPUT_NV, ...\n"); } + } else if(GL_SUPPORT(ATI_FRAGMENT_SHADER)) { + glEnable(GL_FRAGMENT_SHADER_ATI); + checkGLcall("glEnable(GL_FRAGMENT_SHADER_ATI)"); } + if(GL_SUPPORT(ARB_POINT_SPRITE)) { for(s = 0; s < GL_LIMITS(textures); s++) { GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + s)); @@ -514,6 +519,7 @@ void DestroyContext(IWineD3DDeviceImpl *This, WineD3DContext *context) { *****************************************************************************/ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *context, UINT width, UINT height) { int i; + const struct StateEntry *StateTable = This->shader_backend->StateTable; TRACE("Setting up context %p for blitting\n", context); if(context->last_was_blit) { @@ -526,8 +532,8 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex /* Disable shaders */ This->shader_backend->shader_cleanup((IWineD3DDevice *) This); - Context_MarkStateDirty(context, STATE_VSHADER); - Context_MarkStateDirty(context, STATE_PIXELSHADER); + Context_MarkStateDirty(context, STATE_VSHADER, StateTable); + Context_MarkStateDirty(context, STATE_PIXELSHADER, StateTable); /* Disable all textures. The caller can then bind a texture it wants to blit * from @@ -556,8 +562,8 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);"); - Context_MarkStateDirty(context, STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP)); - Context_MarkStateDirty(context, STATE_SAMPLER(i)); + Context_MarkStateDirty(context, STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP), StateTable); + Context_MarkStateDirty(context, STATE_SAMPLER(i), StateTable); } GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB)); checkGLcall("glActiveTextureARB"); @@ -577,7 +583,7 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex checkGLcall("glMatrixMode(GL_TEXTURE)"); glLoadIdentity(); checkGLcall("glLoadIdentity()"); - Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_TEXTURE0)); + Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_TEXTURE0), StateTable); if (GL_SUPPORT(EXT_TEXTURE_LOD_BIAS)) { glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, @@ -585,50 +591,50 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex 0.0); checkGLcall("glTexEnvi GL_TEXTURE_LOD_BIAS_EXT ..."); } - Context_MarkStateDirty(context, STATE_SAMPLER(0)); - Context_MarkStateDirty(context, STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP)); + Context_MarkStateDirty(context, STATE_SAMPLER(0), StateTable); + Context_MarkStateDirty(context, STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), StateTable); /* Other misc states */ glDisable(GL_ALPHA_TEST); checkGLcall("glDisable(GL_ALPHA_TEST)"); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHATESTENABLE)); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHATESTENABLE), StateTable); glDisable(GL_LIGHTING); checkGLcall("glDisable GL_LIGHTING"); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_LIGHTING)); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_LIGHTING), StateTable); glDisable(GL_DEPTH_TEST); checkGLcall("glDisable GL_DEPTH_TEST"); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ZENABLE)); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ZENABLE), StateTable); glDisable(GL_FOG); checkGLcall("glDisable GL_FOG"); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_FOGENABLE)); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_FOGENABLE), StateTable); glDisable(GL_BLEND); checkGLcall("glDisable GL_BLEND"); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE)); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable); glDisable(GL_CULL_FACE); checkGLcall("glDisable GL_CULL_FACE"); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_CULLMODE)); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_CULLMODE), StateTable); glDisable(GL_STENCIL_TEST); checkGLcall("glDisable GL_STENCIL_TEST"); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_STENCILENABLE)); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_STENCILENABLE), StateTable); glDisable(GL_SCISSOR_TEST); checkGLcall("glDisable GL_SCISSOR_TEST"); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE)); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), StateTable); if(GL_SUPPORT(ARB_POINT_SPRITE)) { glDisable(GL_POINT_SPRITE_ARB); checkGLcall("glDisable GL_POINT_SPRITE_ARB"); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_POINTSPRITEENABLE)); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), StateTable); } glColorMask(GL_TRUE, GL_TRUE,GL_TRUE,GL_TRUE); checkGLcall("glColorMask"); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_CLIPPING)); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_CLIPPING), StateTable); if (GL_SUPPORT(EXT_SECONDARY_COLOR)) { glDisable(GL_COLOR_SUM_EXT); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SPECULARENABLE)); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SPECULARENABLE), StateTable); checkGLcall("glDisable(GL_COLOR_SUM_EXT)"); } if (GL_SUPPORT(NV_REGISTER_COMBINERS)) { GL_EXTCALL(glFinalCombinerInputNV(GL_VARIABLE_B_NV, GL_SPARE0_NV, GL_UNSIGNED_IDENTITY_NV, GL_RGB)); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SPECULARENABLE)); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SPECULARENABLE), StateTable); checkGLcall("glFinalCombinerInputNV"); } @@ -637,7 +643,7 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex checkGLcall("glMatrixMode(GL_MODELVIEW)"); glLoadIdentity(); checkGLcall("glLoadIdentity()"); - Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0))); + Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(0)), StateTable); glMatrixMode(GL_PROJECTION); checkGLcall("glMatrixMode(GL_PROJECTION)"); @@ -645,10 +651,10 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex checkGLcall("glLoadIdentity()"); glOrtho(0, width, height, 0, 0.0, -1.0); checkGLcall("glOrtho"); - Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION)); + Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION), StateTable); context->last_was_rhw = TRUE; - Context_MarkStateDirty(context, STATE_VDECL); /* because of last_was_rhw = TRUE */ + Context_MarkStateDirty(context, STATE_VDECL, StateTable); /* because of last_was_rhw = TRUE */ glDisable(GL_CLIP_PLANE0); checkGLcall("glDisable(clip plane 0)"); glDisable(GL_CLIP_PLANE1); checkGLcall("glDisable(clip plane 1)"); @@ -656,15 +662,18 @@ static inline void SetupForBlit(IWineD3DDeviceImpl *This, WineD3DContext *contex glDisable(GL_CLIP_PLANE3); checkGLcall("glDisable(clip plane 3)"); glDisable(GL_CLIP_PLANE4); checkGLcall("glDisable(clip plane 4)"); glDisable(GL_CLIP_PLANE5); checkGLcall("glDisable(clip plane 5)"); - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_CLIPPING)); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_CLIPPING), StateTable); glViewport(0, 0, width, height); checkGLcall("glViewport"); - Context_MarkStateDirty(context, STATE_VIEWPORT); + Context_MarkStateDirty(context, STATE_VIEWPORT, StateTable); if(GL_SUPPORT(NV_TEXTURE_SHADER2)) { glDisable(GL_TEXTURE_SHADER_NV); checkGLcall("glDisable(GL_TEXTURE_SHADER_NV)"); + } else if(GL_SUPPORT(ATI_FRAGMENT_SHADER)) { + glDisable(GL_FRAGMENT_SHADER_ATI); + checkGLcall("glDisable(GL_FRAGMENT_SHADER_ATI)"); } } @@ -709,16 +718,19 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf BOOL oldRenderOffscreen = This->render_offscreen; const WINED3DFORMAT oldFmt = ((IWineD3DSurfaceImpl *) This->lastActiveRenderTarget)->resource.format; const WINED3DFORMAT newFmt = ((IWineD3DSurfaceImpl *) target)->resource.format; + const struct StateEntry *StateTable = This->shader_backend->StateTable; /* To compensate the lack of format switching with some offscreen rendering methods and on onscreen buffers * the alpha blend state changes with different render target formats */ if(oldFmt != newFmt) { + const GlPixelFormatDesc *glDesc; const StaticPixelFormatDesc *old = getFormatDescEntry(oldFmt, NULL, NULL); - const StaticPixelFormatDesc *new = getFormatDescEntry(newFmt, NULL, NULL); + const StaticPixelFormatDesc *new = getFormatDescEntry(newFmt, &GLINFO_LOCATION, &glDesc); - if((old->alphaMask && !new->alphaMask) || (!old->alphaMask && new->alphaMask)) { - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE)); + /* Disable blending when the alphaMask has changed and when a format doesn't support blending */ + if((old->alphaMask && !new->alphaMask) || (!old->alphaMask && new->alphaMask) || !(glDesc->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING)) { + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable); } } @@ -747,11 +759,11 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf IWineD3DSwapChain_Release(swapchain); if(oldRenderOffscreen) { - Context_MarkStateDirty(context, WINED3DTS_PROJECTION); - Context_MarkStateDirty(context, STATE_VDECL); - Context_MarkStateDirty(context, STATE_VIEWPORT); - Context_MarkStateDirty(context, STATE_SCISSORRECT); - Context_MarkStateDirty(context, STATE_FRONTFACE); + Context_MarkStateDirty(context, WINED3DTS_PROJECTION, StateTable); + Context_MarkStateDirty(context, STATE_VDECL, StateTable); + Context_MarkStateDirty(context, STATE_VIEWPORT, StateTable); + Context_MarkStateDirty(context, STATE_SCISSORRECT, StateTable); + Context_MarkStateDirty(context, STATE_FRONTFACE, StateTable); } } else { @@ -834,11 +846,11 @@ static inline WineD3DContext *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurf } if(!oldRenderOffscreen) { - Context_MarkStateDirty(context, WINED3DTS_PROJECTION); - Context_MarkStateDirty(context, STATE_VDECL); - Context_MarkStateDirty(context, STATE_VIEWPORT); - Context_MarkStateDirty(context, STATE_SCISSORRECT); - Context_MarkStateDirty(context, STATE_FRONTFACE); + Context_MarkStateDirty(context, WINED3DTS_PROJECTION, StateTable); + Context_MarkStateDirty(context, STATE_VDECL, StateTable); + Context_MarkStateDirty(context, STATE_VIEWPORT, StateTable); + Context_MarkStateDirty(context, STATE_SCISSORRECT, StateTable); + Context_MarkStateDirty(context, STATE_FRONTFACE, StateTable); } } if (readTexture) { @@ -887,6 +899,7 @@ void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextU BYTE shift; WineD3DContext *context; GLint drawBuffer=0; + const struct StateEntry *StateTable = This->shader_backend->StateTable; TRACE("(%p): Selecting context for render target %p, thread %d\n", This, target, tid); if(This->lastActiveRenderTarget != target || tid != This->lastThread) { @@ -941,23 +954,33 @@ void ActivateContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target, ContextU break; case CTXUSAGE_CLEAR: - if(context->last_was_blit && GL_SUPPORT(NV_TEXTURE_SHADER2)) { - glEnable(GL_TEXTURE_SHADER_NV); - checkGLcall("glEnable(GL_TEXTURE_SHADER_NV)"); + if(context->last_was_blit) { + if(GL_SUPPORT(NV_TEXTURE_SHADER2)) { + glEnable(GL_TEXTURE_SHADER_NV); + checkGLcall("glEnable(GL_TEXTURE_SHADER_NV)"); + } else if(GL_SUPPORT(ATI_FRAGMENT_SHADER)) { + glEnable(GL_FRAGMENT_SHADER_ATI); + checkGLcall("glEnable(GL_FRAGMENT_SHADER_ATI)"); + } } glEnable(GL_SCISSOR_TEST); checkGLcall("glEnable GL_SCISSOR_TEST"); context->last_was_blit = FALSE; - Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE)); - Context_MarkStateDirty(context, STATE_SCISSORRECT); + Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), StateTable); + Context_MarkStateDirty(context, STATE_SCISSORRECT, StateTable); break; case CTXUSAGE_DRAWPRIM: /* This needs all dirty states applied */ - if(context->last_was_blit && GL_SUPPORT(NV_TEXTURE_SHADER2)) { - glEnable(GL_TEXTURE_SHADER_NV); - checkGLcall("glEnable(GL_TEXTURE_SHADER_NV)"); + if(context->last_was_blit) { + if(GL_SUPPORT(NV_TEXTURE_SHADER2)) { + glEnable(GL_TEXTURE_SHADER_NV); + checkGLcall("glEnable(GL_TEXTURE_SHADER_NV)"); + } else if(GL_SUPPORT(ATI_FRAGMENT_SHADER)) { + glEnable(GL_FRAGMENT_SHADER_ATI); + checkGLcall("glEnable(GL_FRAGMENT_SHADER_ATI)"); + } } IWineD3DDeviceImpl_FindTexUnitMap(This); diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 196765b2b09..d8c728ae7eb 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -173,8 +173,6 @@ static ULONG WINAPI IWineD3DDeviceImpl_Release(IWineD3DDevice *iface) { GL_EXTCALL(glDeleteFramebuffersEXT(1, &This->dst_fbo)); } - This->shader_backend->shader_free_private(iface); - if (This->glsl_program_lookup) hash_table_destroy(This->glsl_program_lookup); /* TODO: Clean up all the surfaces and textures! */ @@ -2008,6 +2006,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, WINED3DPR IWineD3DSwapChainImpl *swapchain = NULL; HRESULT hr; DWORD state; + unsigned int i; TRACE("(%p)->(%p,%p)\n", This, pPresentationParameters, D3DCB_CreateAdditionalSwapChain); if(This->d3d_initialized) return WINED3DERR_INVALIDCALL; @@ -2037,6 +2036,25 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, WINED3DPR This->fbo_color_attachments = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DSurface *) * GL_LIMITS(buffers)); This->draw_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(GLenum) * GL_LIMITS(buffers)); + This->NumberOfPalettes = 1; + This->palettes = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(PALETTEENTRY*)); + if(!This->palettes || !This->render_targets || !This->fbo_color_attachments || !This->draw_buffers) { + ERR("Out of memory!\n"); + goto err_out; + } + This->palettes[0] = HeapAlloc(GetProcessHeap(), 0, sizeof(PALETTEENTRY) * 256); + if(!This->palettes[0]) { + ERR("Out of memory!\n"); + goto err_out; + } + for (i = 0; i < 256; ++i) { + This->palettes[0][i].peRed = 0xFF; + This->palettes[0][i].peGreen = 0xFF; + This->palettes[0][i].peBlue = 0xFF; + This->palettes[0][i].peFlags = 0xFF; + } + This->currentPalette = 0; + /* Initialize the texture unit mapping to a 1:1 mapping */ for (state = 0; state < MAX_COMBINED_SAMPLERS; ++state) { if (state < GL_LIMITS(fragment_samplers)) { @@ -2084,6 +2102,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, WINED3DPR IWineD3DSurface_AddRef(This->stencilBufferTarget); } + hr = This->shader_backend->shader_alloc_private(iface); + if(FAILED(hr)) { + TRACE("Shader private data couldn't be allocated\n"); + goto err_out; + } + /* Set up some starting GL setup */ ENTER_GL(); @@ -2147,11 +2171,17 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface, WINED3DPR return WINED3D_OK; err_out: + This->shader_backend->shader_free_private(iface); HeapFree(GetProcessHeap(), 0, This->render_targets); HeapFree(GetProcessHeap(), 0, This->fbo_color_attachments); HeapFree(GetProcessHeap(), 0, This->draw_buffers); HeapFree(GetProcessHeap(), 0, This->swapchains); This->NumberOfSwapChains = 0; + if(This->palettes) { + HeapFree(GetProcessHeap(), 0, This->palettes[0]); + HeapFree(GetProcessHeap(), 0, This->palettes); + } + This->NumberOfPalettes = 0; if(swapchain) { IWineD3DSwapChain_Release( (IWineD3DSwapChain *) swapchain); } @@ -2212,6 +2242,12 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, D3DCB_D IWineD3DDevice_SetTexture(iface, WINED3DVERTEXTEXTURESAMPLER0 + sampler, NULL); } + /* Destroy the depth blt resources, they will be invalid after the reset. Also free shader + * private data, it might contain opengl pointers + */ + This->shader_backend->shader_destroy_depth_blt(iface); + This->shader_backend->shader_free_private(iface); + /* Release the update stateblock */ if(IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->updateStateBlock) > 0){ if(This->updateStateBlock != This->stateBlock) @@ -2264,6 +2300,11 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, D3DCB_D This->swapchains = NULL; This->NumberOfSwapChains = 0; + for (i = 0; i < This->NumberOfPalettes; i++) HeapFree(GetProcessHeap(), 0, This->palettes[i]); + HeapFree(GetProcessHeap(), 0, This->palettes); + This->palettes = NULL; + This->NumberOfPalettes = 0; + HeapFree(GetProcessHeap(), 0, This->render_targets); HeapFree(GetProcessHeap(), 0, This->fbo_color_attachments); HeapFree(GetProcessHeap(), 0, This->draw_buffers); @@ -2271,7 +2312,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface, D3DCB_D This->fbo_color_attachments = NULL; This->draw_buffers = NULL; - This->d3d_initialized = FALSE; return WINED3D_OK; } @@ -4411,7 +4451,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetTextureStageState(IWineD3DDevice *if } if(Stage > This->stateBlock->lowest_disabled_stage && - StateTable[STATE_TEXTURESTAGE(0, Type)].representative == STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP)) { + This->shader_backend->StateTable[STATE_TEXTURESTAGE(0, Type)].representative == STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP)) { /* Colorop change above lowest disabled stage? That won't change anything in the gl setup * Changes in other states are important on disabled stages too */ @@ -5441,11 +5481,38 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ValidateDevice(IWineD3DDevice *iface, static HRESULT WINAPI IWineD3DDeviceImpl_SetPaletteEntries(IWineD3DDevice *iface, UINT PaletteNumber, CONST PALETTEENTRY* pEntries) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; int j; + UINT NewSize; + PALETTEENTRY **palettes; + TRACE("(%p) : PaletteNumber %u\n", This, PaletteNumber); + if (PaletteNumber >= MAX_PALETTES) { - WARN("(%p) : (%u) Out of range 0-%u, returning Invalid Call\n", This, PaletteNumber, MAX_PALETTES); + ERR("(%p) : (%u) Out of range 0-%u, returning Invalid Call\n", This, PaletteNumber, MAX_PALETTES); return WINED3DERR_INVALIDCALL; } + + if (PaletteNumber >= This->NumberOfPalettes) { + NewSize = This->NumberOfPalettes; + do { + NewSize *= 2; + } while(PaletteNumber >= NewSize); + palettes = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->palettes, sizeof(PALETTEENTRY*) * NewSize); + if (!palettes) { + ERR("Out of memory!\n"); + return E_OUTOFMEMORY; + } + This->palettes = palettes; + This->NumberOfPalettes = NewSize; + } + + if (!This->palettes[PaletteNumber]) { + This->palettes[PaletteNumber] = HeapAlloc(GetProcessHeap(), 0, sizeof(PALETTEENTRY) * 256); + if (!This->palettes[PaletteNumber]) { + ERR("Out of memory!\n"); + return E_OUTOFMEMORY; + } + } + for (j = 0; j < 256; ++j) { This->palettes[PaletteNumber][j].peRed = pEntries[j].peRed; This->palettes[PaletteNumber][j].peGreen = pEntries[j].peGreen; @@ -5460,8 +5527,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetPaletteEntries(IWineD3DDevice *ifa IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; int j; TRACE("(%p) : PaletteNumber %u\n", This, PaletteNumber); - if (PaletteNumber >= MAX_PALETTES) { - WARN("(%p) : (%u) Out of range 0-%u, returning Invalid Call\n", This, PaletteNumber, MAX_PALETTES); + if (PaletteNumber >= This->NumberOfPalettes || !This->palettes[PaletteNumber]) { + /* What happens in such situation isn't documented; Native seems to silently abort + on such conditions. Return Invalid Call. */ + ERR("(%p) : (%u) Non-existent palette. NumberOfPalettes %u\n", This, PaletteNumber, This->NumberOfPalettes); return WINED3DERR_INVALIDCALL; } for (j = 0; j < 256; ++j) { @@ -5477,8 +5546,10 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetPaletteEntries(IWineD3DDevice *ifa static HRESULT WINAPI IWineD3DDeviceImpl_SetCurrentTexturePalette(IWineD3DDevice *iface, UINT PaletteNumber) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; TRACE("(%p) : PaletteNumber %u\n", This, PaletteNumber); - if (PaletteNumber >= MAX_PALETTES) { - WARN("(%p) : (%u) Out of range 0-%u, returning Invalid Call\n", This, PaletteNumber, MAX_PALETTES); + /* Native appears to silently abort on attempt to make an uninitialized palette current and render. + (tested with reference rasterizer). Return Invalid Call. */ + if (PaletteNumber >= This->NumberOfPalettes || !This->palettes[PaletteNumber]) { + ERR("(%p) : (%u) Non-existent palette. NumberOfPalettes %u\n", This, PaletteNumber, This->NumberOfPalettes); return WINED3DERR_INVALIDCALL; } /*TODO: stateblocks */ @@ -6879,7 +6950,9 @@ static void updateSurfaceDesc(IWineD3DSurfaceImpl *surface, WINED3DPRESENT_PARAM } else { surface->Flags &= ~SFLAG_NONPOW2; } - HeapFree(GetProcessHeap(), 0, surface->resource.allocatedMemory); + HeapFree(GetProcessHeap(), 0, surface->resource.heapMemory); + surface->resource.allocatedMemory = NULL; + surface->resource.heapMemory = NULL; surface->resource.size = IWineD3DSurface_GetPitch((IWineD3DSurface *) surface) * surface->pow2Width; } @@ -7029,6 +7102,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE This->depth_blt_texture = 0; } This->shader_backend->shader_destroy_depth_blt(iface); + This->shader_backend->shader_free_private(iface); for (i = 0; i < GL_LIMITS(textures); i++) { /* Textures are recreated below */ @@ -7128,6 +7202,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE &swapchain->presentParms); swapchain->num_contexts = 1; This->activeContext = swapchain->context[0]; + IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); hr = IWineD3DStateBlock_InitStartupStateBlock((IWineD3DStateBlock *) This->stateBlock); if(FAILED(hr)) { @@ -7135,11 +7210,16 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE } create_dummy_textures(This); + + hr = This->shader_backend->shader_alloc_private(iface); + if(FAILED(hr)) { + ERR("Failed to recreate shader private data\n"); + return hr; + } + /* All done. There is no need to reload resources or shaders, this will happen automatically on the * first use */ - - IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain); return WINED3D_OK; } @@ -7783,7 +7863,7 @@ const DWORD SavedVertexStates_S[NUM_SAVEDVERTEXSTATES_S] = { }; void IWineD3DDeviceImpl_MarkStateDirty(IWineD3DDeviceImpl *This, DWORD state) { - DWORD rep = StateTable[state].representative; + DWORD rep = This->shader_backend->StateTable[state].representative; DWORD idx; BYTE shift; UINT i; diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index ef9f27e2c50..c8e93255d38 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -57,6 +57,7 @@ static const struct { {"GL_ATI_texture_env_combine3", ATI_TEXTURE_ENV_COMBINE3, 0 }, {"GL_ATI_texture_mirror_once", ATI_TEXTURE_MIRROR_ONCE, 0 }, {"GL_ATI_envmap_bumpmap", ATI_ENVMAP_BUMPMAP, 0 }, + {"GL_ATI_fragment_shader", ATI_FRAGMENT_SHADER, 0 }, /* ARB */ {"GL_ARB_draw_buffers", ARB_DRAW_BUFFERS, 0 }, @@ -348,7 +349,7 @@ static ULONG WINAPI IWineD3DImpl_Release(IWineD3D *iface) { /* Set the shader type for this device, depending on the given capabilities, * the device type, and the user preferences in wined3d_settings */ -static void select_shader_mode( +void select_shader_mode( WineD3D_GL_Info *gl_info, WINED3DDEVTYPE DeviceType, int* ps_selected, @@ -376,6 +377,8 @@ static void select_shader_mode( *ps_selected = SHADER_GLSL; } else if (gl_info->supported[ARB_FRAGMENT_PROGRAM]) { *ps_selected = SHADER_ARB; + } else if (gl_info->supported[ATI_FRAGMENT_SHADER]) { + *ps_selected = SHADER_ATI; } else { *ps_selected = SHADER_NONE; } @@ -820,6 +823,13 @@ BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info) { * Won't occur in any real world situation though */ gl_info->supported[ATI_ENVMAP_BUMPMAP] = FALSE; + if(gl_info->supported[NV_REGISTER_COMBINERS]) { + /* Also disable ATI_FRAGMENT_SHADER if register combienrs and texture_shader2 + * are supported. The nv extensions provide the same functionality as the + * ATI one, and a bit more(signed pixelformats) + */ + gl_info->supported[ATI_FRAGMENT_SHADER] = FALSE; + } } if (gl_info->supported[ARB_DRAW_BUFFERS]) { glGetIntegerv(GL_MAX_DRAW_BUFFERS_ARB, &gl_max); @@ -970,6 +980,19 @@ BOOL IWineD3DImpl_FillGLCaps(WineD3D_GL_Info *gl_info) { */ gl_info->supported[ARB_TEXTURE_RECTANGLE] = FALSE; } + if(gl_info->supported[ATI_FRAGMENT_SHADER]) { + /* Disable NV_register_combiners and fragment shader if this is supported. + * generally the NV extensions are prefered over the ATI one, and this + * extension is disabled if register_combiners and texture_shader2 are both + * supported. So we reach this place only if we have incomplete NV dxlevel 8 + * fragment processing support + */ + gl_info->supported[NV_REGISTER_COMBINERS] = FALSE; + gl_info->supported[NV_REGISTER_COMBINERS2] = FALSE; + gl_info->supported[NV_TEXTURE_SHADER] = FALSE; + gl_info->supported[NV_TEXTURE_SHADER2] = FALSE; + gl_info->supported[NV_TEXTURE_SHADER3] = FALSE; + } } checkGLcall("extension detection\n"); @@ -1656,6 +1679,7 @@ static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(const WineD3D_Pixe static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const WineD3D_PixelFormat *cfg, WINED3DFORMAT Format) { short depthSize, stencilSize; + BOOL lockable = FALSE; if(!cfg) return FALSE; @@ -1665,7 +1689,13 @@ static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const WineD3D_Pixel return FALSE; } - if(cfg->depthSize != depthSize) + if((Format == WINED3DFMT_D16_LOCKABLE) || (Format == WINED3DFMT_D32F_LOCKABLE)) + lockable = TRUE; + + /* On some modern cards like the Geforce8/9 GLX doesn't offer some dephthstencil formats which D3D9 reports. + * We can safely report 'compatible' formats (e.g. D24 can be used for D16) as long as we aren't dealing with + * a lockable format. This also helps D3D <= 7 as they expect D16 which isn't offered without this on Geforce8 cards. */ + if(!(cfg->depthSize == depthSize || (!lockable && cfg->depthSize > depthSize))) return FALSE; if(cfg->stencilSize != stencilSize) @@ -1842,7 +1872,7 @@ static BOOL CheckBumpMapCapability(UINT Adapter, WINED3DFORMAT CheckFormat) return FALSE; } } - if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) { + if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP) || GL_SUPPORT(ATI_FRAGMENT_SHADER)) { switch (CheckFormat) { case WINED3DFMT_V8U8: TRACE_(d3d_caps)("[OK]\n"); @@ -2009,7 +2039,7 @@ static BOOL CheckSrgbWriteCapability(UINT Adapter, WINED3DDEVTYPE DeviceType, WI /* Only offer SRGB writing on X8R8G8B8/A8R8G8B8 when we use ARB or GLSL shaders as we are * doing the color fixup in shaders. * Note Windows drivers (at least on the Geforce 8800) also offer this on R5G6B5. */ - if((CheckFormat == WINED3DFMT_X8R8G8B8) || (CheckFormat == WINED3DFMT_X8R8G8B8)) { + if((CheckFormat == WINED3DFMT_X8R8G8B8) || (CheckFormat == WINED3DFMT_A8R8G8B8)) { int vs_selected_mode; int ps_selected_mode; select_shader_mode(&GLINFO_LOCATION, DeviceType, &ps_selected_mode, &vs_selected_mode); @@ -2024,6 +2054,23 @@ static BOOL CheckSrgbWriteCapability(UINT Adapter, WINED3DDEVTYPE DeviceType, WI return FALSE; } +/* Check if a format support blending in combination with pixel shaders */ +static BOOL CheckPostPixelShaderBlendingCapability(UINT Adapter, WINED3DFORMAT CheckFormat) +{ + const GlPixelFormatDesc *glDesc; + const StaticPixelFormatDesc *desc = getFormatDescEntry(CheckFormat, &GLINFO_LOCATION, &glDesc); + + /* Fail if we weren't able to get a description of the format */ + if(!desc || !glDesc) + return FALSE; + + /* The flags entry of a format contains the post pixel shader blending capability */ + if(glDesc->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) + return TRUE; + + return FALSE; +} + /* Check if a texture format is supported on the given adapter */ static BOOL CheckTextureCapability(UINT Adapter, WINED3DFORMAT CheckFormat) { @@ -2089,7 +2136,8 @@ static BOOL CheckTextureCapability(UINT Adapter, WINED3DFORMAT CheckFormat) * and are still playable even without bump mapping */ case WINED3DFMT_V8U8: - if(GL_SUPPORT(NV_TEXTURE_SHADER) || GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) { + if(GL_SUPPORT(NV_TEXTURE_SHADER) || GL_SUPPORT(ATI_ENVMAP_BUMPMAP) || + GL_SUPPORT(ATI_FRAGMENT_SHADER)) { return TRUE; } TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n"); @@ -2311,6 +2359,16 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt } } + /* Check QUERY_POSTPIXELSHADER_BLENDING support */ + if(Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) { + if(CheckPostPixelShaderBlendingCapability(Adapter, CheckFormat)) { + UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING; + } else { + TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n"); + return WINED3DERR_NOTAVAILABLE; + } + } + /* Check QUERY_SRGBREAD support */ if(Usage & WINED3DUSAGE_QUERY_SRGBREAD) { if(CheckSrgbReadCapability(Adapter, CheckFormat)) { @@ -2433,6 +2491,16 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt } } + /* Check QUERY_POSTPIXELSHADER_BLENDING support */ + if(Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) { + if(CheckPostPixelShaderBlendingCapability(Adapter, CheckFormat)) { + UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING; + } else { + TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n"); + return WINED3DERR_NOTAVAILABLE; + } + } + /* Check QUERY_SRGBREAD support */ if(Usage & WINED3DUSAGE_QUERY_SRGBREAD) { if(CheckSrgbReadCapability(Adapter, CheckFormat)) { @@ -2504,6 +2572,16 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt } } + /* Check QUERY_POSTPIXELSHADER_BLENDING support */ + if(Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) { + if(CheckPostPixelShaderBlendingCapability(Adapter, CheckFormat)) { + UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING; + } else { + TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n"); + return WINED3DERR_NOTAVAILABLE; + } + } + /* Check QUERY_SRGBREAD support */ if(Usage & WINED3DUSAGE_QUERY_SRGBREAD) { if(CheckSrgbReadCapability(Adapter, CheckFormat)) { @@ -2613,7 +2691,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt } else if((UsageCaps == (Usage & ~WINED3DUSAGE_AUTOGENMIPMAP)) && (Usage & WINED3DUSAGE_AUTOGENMIPMAP)){ return WINED3DOK_NOAUTOGEN; } else { - TRACE_(d3d_caps)("[FAILED] - Usage=%#08x requested but only %#08x is available\n", Usage, UsageCaps); + TRACE_(d3d_caps)("[FAILED] - Usage=%#08x requested for CheckFormat=%s and RType=%d but only %#08x is available\n", Usage, debug_d3dformat(CheckFormat), RType, UsageCaps); return WINED3DERR_NOTAVAILABLE; } } @@ -2631,6 +2709,25 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormatConversion(IWineD3D *iface, return WINED3D_OK; } +static const shader_backend_t *select_shader_backend(UINT Adapter, WINED3DDEVTYPE DeviceType) { + const shader_backend_t *ret; + int vs_selected_mode; + int ps_selected_mode; + + select_shader_mode(&GLINFO_LOCATION, DeviceType, &ps_selected_mode, &vs_selected_mode); + if (vs_selected_mode == SHADER_GLSL || ps_selected_mode == SHADER_GLSL) { + ret = &glsl_shader_backend; + } else if (vs_selected_mode == SHADER_ARB && ps_selected_mode != SHADER_NONE && + !GL_SUPPORT(ARB_FRAGMENT_PROGRAM)) { + ret = &atifs_shader_backend; + } else if (vs_selected_mode == SHADER_ARB || ps_selected_mode == SHADER_ARB) { + ret = &arb_program_shader_backend; + } else { + ret = &none_shader_backend; + } + return ret; +} + /* Note: d3d8 passes in a pointer to a D3DCAPS8 structure, which is a true subset of a D3DCAPS9 structure. However, it has to come via a void * as the d3d8 interface cannot import the d3d9 header */ @@ -2639,6 +2736,8 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, IWineD3DImpl *This = (IWineD3DImpl *)iface; int vs_selected_mode; int ps_selected_mode; + struct shader_caps shader_caps; + const shader_backend_t *shader_backend; TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", This, Adapter, DeviceType, pCaps); @@ -2655,47 +2754,47 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, /* ------------------------------------------------ The following fields apply to both d3d8 and d3d9 ------------------------------------------------ */ - *pCaps->DeviceType = (DeviceType == WINED3DDEVTYPE_HAL) ? WINED3DDEVTYPE_HAL : WINED3DDEVTYPE_REF; /* Not quite true, but use h/w supported by opengl I suppose */ - *pCaps->AdapterOrdinal = Adapter; + pCaps->DeviceType = (DeviceType == WINED3DDEVTYPE_HAL) ? WINED3DDEVTYPE_HAL : WINED3DDEVTYPE_REF; /* Not quite true, but use h/w supported by opengl I suppose */ + pCaps->AdapterOrdinal = Adapter; - *pCaps->Caps = 0; - *pCaps->Caps2 = WINED3DCAPS2_CANRENDERWINDOWED | - WINED3DCAPS2_FULLSCREENGAMMA | - WINED3DCAPS2_DYNAMICTEXTURES; + pCaps->Caps = 0; + pCaps->Caps2 = WINED3DCAPS2_CANRENDERWINDOWED | + WINED3DCAPS2_FULLSCREENGAMMA | + WINED3DCAPS2_DYNAMICTEXTURES; if(GL_SUPPORT(SGIS_GENERATE_MIPMAP)) { - *pCaps->Caps2 |= WINED3DCAPS2_CANAUTOGENMIPMAP; - } - *pCaps->Caps3 = WINED3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD; - *pCaps->PresentationIntervals = WINED3DPRESENT_INTERVAL_IMMEDIATE | - WINED3DPRESENT_INTERVAL_ONE; - - *pCaps->CursorCaps = WINED3DCURSORCAPS_COLOR | - WINED3DCURSORCAPS_LOWRES; - - *pCaps->DevCaps = WINED3DDEVCAPS_FLOATTLVERTEX | - WINED3DDEVCAPS_EXECUTESYSTEMMEMORY | - WINED3DDEVCAPS_TLVERTEXSYSTEMMEMORY| - WINED3DDEVCAPS_TLVERTEXVIDEOMEMORY | - WINED3DDEVCAPS_DRAWPRIMTLVERTEX | - WINED3DDEVCAPS_HWTRANSFORMANDLIGHT | - WINED3DDEVCAPS_EXECUTEVIDEOMEMORY | - WINED3DDEVCAPS_PUREDEVICE | - WINED3DDEVCAPS_HWRASTERIZATION | - WINED3DDEVCAPS_TEXTUREVIDEOMEMORY | - WINED3DDEVCAPS_TEXTURESYSTEMMEMORY | - WINED3DDEVCAPS_CANRENDERAFTERFLIP | - WINED3DDEVCAPS_DRAWPRIMITIVES2 | - WINED3DDEVCAPS_DRAWPRIMITIVES2EX | - WINED3DDEVCAPS_RTPATCHES; - - *pCaps->PrimitiveMiscCaps = WINED3DPMISCCAPS_CULLNONE | - WINED3DPMISCCAPS_CULLCCW | - WINED3DPMISCCAPS_CULLCW | - WINED3DPMISCCAPS_COLORWRITEENABLE | - WINED3DPMISCCAPS_CLIPTLVERTS | - WINED3DPMISCCAPS_CLIPPLANESCALEDPOINTS | - WINED3DPMISCCAPS_MASKZ | - WINED3DPMISCCAPS_BLENDOP; + pCaps->Caps2 |= WINED3DCAPS2_CANAUTOGENMIPMAP; + } + pCaps->Caps3 = WINED3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD; + pCaps->PresentationIntervals = WINED3DPRESENT_INTERVAL_IMMEDIATE | + WINED3DPRESENT_INTERVAL_ONE; + + pCaps->CursorCaps = WINED3DCURSORCAPS_COLOR | + WINED3DCURSORCAPS_LOWRES; + + pCaps->DevCaps = WINED3DDEVCAPS_FLOATTLVERTEX | + WINED3DDEVCAPS_EXECUTESYSTEMMEMORY | + WINED3DDEVCAPS_TLVERTEXSYSTEMMEMORY| + WINED3DDEVCAPS_TLVERTEXVIDEOMEMORY | + WINED3DDEVCAPS_DRAWPRIMTLVERTEX | + WINED3DDEVCAPS_HWTRANSFORMANDLIGHT | + WINED3DDEVCAPS_EXECUTEVIDEOMEMORY | + WINED3DDEVCAPS_PUREDEVICE | + WINED3DDEVCAPS_HWRASTERIZATION | + WINED3DDEVCAPS_TEXTUREVIDEOMEMORY | + WINED3DDEVCAPS_TEXTURESYSTEMMEMORY | + WINED3DDEVCAPS_CANRENDERAFTERFLIP | + WINED3DDEVCAPS_DRAWPRIMITIVES2 | + WINED3DDEVCAPS_DRAWPRIMITIVES2EX | + WINED3DDEVCAPS_RTPATCHES; + + pCaps->PrimitiveMiscCaps = WINED3DPMISCCAPS_CULLNONE | + WINED3DPMISCCAPS_CULLCCW | + WINED3DPMISCCAPS_CULLCW | + WINED3DPMISCCAPS_COLORWRITEENABLE | + WINED3DPMISCCAPS_CLIPTLVERTS | + WINED3DPMISCCAPS_CLIPPLANESCALEDPOINTS | + WINED3DPMISCCAPS_MASKZ | + WINED3DPMISCCAPS_BLENDOP; /* TODO: WINED3DPMISCCAPS_NULLREFERENCE WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS @@ -2705,36 +2804,36 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, WINED3DPMISCCAPS_FOGVERTEXCLAMPED */ if(GL_SUPPORT(EXT_BLEND_EQUATION_SEPARATE) && GL_SUPPORT(EXT_BLEND_FUNC_SEPARATE)) - *pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_SEPARATEALPHABLEND; + pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_SEPARATEALPHABLEND; /* The caps below can be supported but aren't handled yet in utils.c 'd3dta_to_combiner_input', disable them until support is fixed */ #if 0 if (GL_SUPPORT(NV_REGISTER_COMBINERS)) - *pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_TSSARGTEMP; + pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_TSSARGTEMP; if (GL_SUPPORT(NV_REGISTER_COMBINERS2)) - *pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_PERSTAGECONSTANT; + pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_PERSTAGECONSTANT; #endif - *pCaps->RasterCaps = WINED3DPRASTERCAPS_DITHER | - WINED3DPRASTERCAPS_PAT | - WINED3DPRASTERCAPS_WFOG | - WINED3DPRASTERCAPS_ZFOG | - WINED3DPRASTERCAPS_FOGVERTEX | - WINED3DPRASTERCAPS_FOGTABLE | - WINED3DPRASTERCAPS_STIPPLE | - WINED3DPRASTERCAPS_SUBPIXEL | - WINED3DPRASTERCAPS_ZTEST | - WINED3DPRASTERCAPS_SCISSORTEST | - WINED3DPRASTERCAPS_SLOPESCALEDEPTHBIAS | - WINED3DPRASTERCAPS_DEPTHBIAS; + pCaps->RasterCaps = WINED3DPRASTERCAPS_DITHER | + WINED3DPRASTERCAPS_PAT | + WINED3DPRASTERCAPS_WFOG | + WINED3DPRASTERCAPS_ZFOG | + WINED3DPRASTERCAPS_FOGVERTEX | + WINED3DPRASTERCAPS_FOGTABLE | + WINED3DPRASTERCAPS_STIPPLE | + WINED3DPRASTERCAPS_SUBPIXEL | + WINED3DPRASTERCAPS_ZTEST | + WINED3DPRASTERCAPS_SCISSORTEST | + WINED3DPRASTERCAPS_SLOPESCALEDEPTHBIAS | + WINED3DPRASTERCAPS_DEPTHBIAS; if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC)) { - *pCaps->RasterCaps |= WINED3DPRASTERCAPS_ANISOTROPY | - WINED3DPRASTERCAPS_ZBIAS | - WINED3DPRASTERCAPS_MIPMAPLODBIAS; + pCaps->RasterCaps |= WINED3DPRASTERCAPS_ANISOTROPY | + WINED3DPRASTERCAPS_ZBIAS | + WINED3DPRASTERCAPS_MIPMAPLODBIAS; } if(GL_SUPPORT(NV_FOG_DISTANCE)) { - *pCaps->RasterCaps |= WINED3DPRASTERCAPS_FOGRANGE; + pCaps->RasterCaps |= WINED3DPRASTERCAPS_FOGRANGE; } /* FIXME Add: WINED3DPRASTERCAPS_COLORPERSPECTIVE @@ -2743,39 +2842,39 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, WINED3DPRASTERCAPS_ZBUFFERLESSHSR WINED3DPRASTERCAPS_WBUFFER */ - *pCaps->ZCmpCaps = WINED3DPCMPCAPS_ALWAYS | - WINED3DPCMPCAPS_EQUAL | - WINED3DPCMPCAPS_GREATER | - WINED3DPCMPCAPS_GREATEREQUAL | - WINED3DPCMPCAPS_LESS | - WINED3DPCMPCAPS_LESSEQUAL | - WINED3DPCMPCAPS_NEVER | - WINED3DPCMPCAPS_NOTEQUAL; - - *pCaps->SrcBlendCaps = WINED3DPBLENDCAPS_BOTHINVSRCALPHA | - WINED3DPBLENDCAPS_BOTHSRCALPHA | - WINED3DPBLENDCAPS_DESTALPHA | - WINED3DPBLENDCAPS_DESTCOLOR | - WINED3DPBLENDCAPS_INVDESTALPHA | - WINED3DPBLENDCAPS_INVDESTCOLOR | - WINED3DPBLENDCAPS_INVSRCALPHA | - WINED3DPBLENDCAPS_INVSRCCOLOR | - WINED3DPBLENDCAPS_ONE | - WINED3DPBLENDCAPS_SRCALPHA | - WINED3DPBLENDCAPS_SRCALPHASAT | - WINED3DPBLENDCAPS_SRCCOLOR | - WINED3DPBLENDCAPS_ZERO; - - *pCaps->DestBlendCaps = WINED3DPBLENDCAPS_DESTALPHA | - WINED3DPBLENDCAPS_DESTCOLOR | - WINED3DPBLENDCAPS_INVDESTALPHA | - WINED3DPBLENDCAPS_INVDESTCOLOR | - WINED3DPBLENDCAPS_INVSRCALPHA | - WINED3DPBLENDCAPS_INVSRCCOLOR | - WINED3DPBLENDCAPS_ONE | - WINED3DPBLENDCAPS_SRCALPHA | - WINED3DPBLENDCAPS_SRCCOLOR | - WINED3DPBLENDCAPS_ZERO; + pCaps->ZCmpCaps = WINED3DPCMPCAPS_ALWAYS | + WINED3DPCMPCAPS_EQUAL | + WINED3DPCMPCAPS_GREATER | + WINED3DPCMPCAPS_GREATEREQUAL | + WINED3DPCMPCAPS_LESS | + WINED3DPCMPCAPS_LESSEQUAL | + WINED3DPCMPCAPS_NEVER | + WINED3DPCMPCAPS_NOTEQUAL; + + pCaps->SrcBlendCaps = WINED3DPBLENDCAPS_BOTHINVSRCALPHA | + WINED3DPBLENDCAPS_BOTHSRCALPHA | + WINED3DPBLENDCAPS_DESTALPHA | + WINED3DPBLENDCAPS_DESTCOLOR | + WINED3DPBLENDCAPS_INVDESTALPHA | + WINED3DPBLENDCAPS_INVDESTCOLOR | + WINED3DPBLENDCAPS_INVSRCALPHA | + WINED3DPBLENDCAPS_INVSRCCOLOR | + WINED3DPBLENDCAPS_ONE | + WINED3DPBLENDCAPS_SRCALPHA | + WINED3DPBLENDCAPS_SRCALPHASAT | + WINED3DPBLENDCAPS_SRCCOLOR | + WINED3DPBLENDCAPS_ZERO; + + pCaps->DestBlendCaps = WINED3DPBLENDCAPS_DESTALPHA | + WINED3DPBLENDCAPS_DESTCOLOR | + WINED3DPBLENDCAPS_INVDESTALPHA | + WINED3DPBLENDCAPS_INVDESTCOLOR | + WINED3DPBLENDCAPS_INVSRCALPHA | + WINED3DPBLENDCAPS_INVSRCCOLOR | + WINED3DPBLENDCAPS_ONE | + WINED3DPBLENDCAPS_SRCALPHA | + WINED3DPBLENDCAPS_SRCCOLOR | + WINED3DPBLENDCAPS_ZERO; /* NOTE: WINED3DPBLENDCAPS_SRCALPHASAT is not supported as dest blend factor, * according to the glBlendFunc manpage * @@ -2784,457 +2883,350 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, */ if( GL_SUPPORT(EXT_BLEND_COLOR)) { - *pCaps->SrcBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR; - *pCaps->DestBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR; - } - - - *pCaps->AlphaCmpCaps = WINED3DPCMPCAPS_ALWAYS | - WINED3DPCMPCAPS_EQUAL | - WINED3DPCMPCAPS_GREATER | - WINED3DPCMPCAPS_GREATEREQUAL | - WINED3DPCMPCAPS_LESS | - WINED3DPCMPCAPS_LESSEQUAL | - WINED3DPCMPCAPS_NEVER | - WINED3DPCMPCAPS_NOTEQUAL; - - *pCaps->ShadeCaps = WINED3DPSHADECAPS_SPECULARGOURAUDRGB | - WINED3DPSHADECAPS_COLORGOURAUDRGB | - WINED3DPSHADECAPS_ALPHAFLATBLEND | - WINED3DPSHADECAPS_ALPHAGOURAUDBLEND | - WINED3DPSHADECAPS_COLORFLATRGB | - WINED3DPSHADECAPS_FOGFLAT | - WINED3DPSHADECAPS_FOGGOURAUD | - WINED3DPSHADECAPS_SPECULARFLATRGB; - - *pCaps->TextureCaps = WINED3DPTEXTURECAPS_ALPHA | - WINED3DPTEXTURECAPS_ALPHAPALETTE | - WINED3DPTEXTURECAPS_BORDER | - WINED3DPTEXTURECAPS_MIPMAP | - WINED3DPTEXTURECAPS_PROJECTED | - WINED3DPTEXTURECAPS_PERSPECTIVE; + pCaps->SrcBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR; + pCaps->DestBlendCaps |= WINED3DPBLENDCAPS_BLENDFACTOR; + } + + + pCaps->AlphaCmpCaps = WINED3DPCMPCAPS_ALWAYS | + WINED3DPCMPCAPS_EQUAL | + WINED3DPCMPCAPS_GREATER | + WINED3DPCMPCAPS_GREATEREQUAL | + WINED3DPCMPCAPS_LESS | + WINED3DPCMPCAPS_LESSEQUAL | + WINED3DPCMPCAPS_NEVER | + WINED3DPCMPCAPS_NOTEQUAL; + + pCaps->ShadeCaps = WINED3DPSHADECAPS_SPECULARGOURAUDRGB | + WINED3DPSHADECAPS_COLORGOURAUDRGB | + WINED3DPSHADECAPS_ALPHAFLATBLEND | + WINED3DPSHADECAPS_ALPHAGOURAUDBLEND | + WINED3DPSHADECAPS_COLORFLATRGB | + WINED3DPSHADECAPS_FOGFLAT | + WINED3DPSHADECAPS_FOGGOURAUD | + WINED3DPSHADECAPS_SPECULARFLATRGB; + + pCaps->TextureCaps = WINED3DPTEXTURECAPS_ALPHA | + WINED3DPTEXTURECAPS_ALPHAPALETTE | + WINED3DPTEXTURECAPS_BORDER | + WINED3DPTEXTURECAPS_MIPMAP | + WINED3DPTEXTURECAPS_PROJECTED | + WINED3DPTEXTURECAPS_PERSPECTIVE; if( !GL_SUPPORT(ARB_TEXTURE_NON_POWER_OF_TWO)) { - *pCaps->TextureCaps |= WINED3DPTEXTURECAPS_POW2 | - WINED3DPTEXTURECAPS_NONPOW2CONDITIONAL; + pCaps->TextureCaps |= WINED3DPTEXTURECAPS_POW2 | + WINED3DPTEXTURECAPS_NONPOW2CONDITIONAL; } if( GL_SUPPORT(EXT_TEXTURE3D)) { - *pCaps->TextureCaps |= WINED3DPTEXTURECAPS_VOLUMEMAP | - WINED3DPTEXTURECAPS_MIPVOLUMEMAP | - WINED3DPTEXTURECAPS_VOLUMEMAP_POW2; + pCaps->TextureCaps |= WINED3DPTEXTURECAPS_VOLUMEMAP | + WINED3DPTEXTURECAPS_MIPVOLUMEMAP | + WINED3DPTEXTURECAPS_VOLUMEMAP_POW2; } if (GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) { - *pCaps->TextureCaps |= WINED3DPTEXTURECAPS_CUBEMAP | - WINED3DPTEXTURECAPS_MIPCUBEMAP | - WINED3DPTEXTURECAPS_CUBEMAP_POW2; + pCaps->TextureCaps |= WINED3DPTEXTURECAPS_CUBEMAP | + WINED3DPTEXTURECAPS_MIPCUBEMAP | + WINED3DPTEXTURECAPS_CUBEMAP_POW2; } - *pCaps->TextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR | - WINED3DPTFILTERCAPS_MAGFPOINT | - WINED3DPTFILTERCAPS_MINFLINEAR | - WINED3DPTFILTERCAPS_MINFPOINT | - WINED3DPTFILTERCAPS_MIPFLINEAR | - WINED3DPTFILTERCAPS_MIPFPOINT | - WINED3DPTFILTERCAPS_LINEAR | - WINED3DPTFILTERCAPS_LINEARMIPLINEAR | - WINED3DPTFILTERCAPS_LINEARMIPNEAREST | - WINED3DPTFILTERCAPS_MIPLINEAR | - WINED3DPTFILTERCAPS_MIPNEAREST | - WINED3DPTFILTERCAPS_NEAREST; + pCaps->TextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR | + WINED3DPTFILTERCAPS_MAGFPOINT | + WINED3DPTFILTERCAPS_MINFLINEAR | + WINED3DPTFILTERCAPS_MINFPOINT | + WINED3DPTFILTERCAPS_MIPFLINEAR | + WINED3DPTFILTERCAPS_MIPFPOINT | + WINED3DPTFILTERCAPS_LINEAR | + WINED3DPTFILTERCAPS_LINEARMIPLINEAR | + WINED3DPTFILTERCAPS_LINEARMIPNEAREST | + WINED3DPTFILTERCAPS_MIPLINEAR | + WINED3DPTFILTERCAPS_MIPNEAREST | + WINED3DPTFILTERCAPS_NEAREST; if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC)) { - *pCaps->TextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFANISOTROPIC | - WINED3DPTFILTERCAPS_MINFANISOTROPIC; + pCaps->TextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFANISOTROPIC | + WINED3DPTFILTERCAPS_MINFANISOTROPIC; } if (GL_SUPPORT(ARB_TEXTURE_CUBE_MAP)) { - *pCaps->CubeTextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR | - WINED3DPTFILTERCAPS_MAGFPOINT | - WINED3DPTFILTERCAPS_MINFLINEAR | - WINED3DPTFILTERCAPS_MINFPOINT | - WINED3DPTFILTERCAPS_MIPFLINEAR | - WINED3DPTFILTERCAPS_MIPFPOINT | - WINED3DPTFILTERCAPS_LINEAR | - WINED3DPTFILTERCAPS_LINEARMIPLINEAR | - WINED3DPTFILTERCAPS_LINEARMIPNEAREST | - WINED3DPTFILTERCAPS_MIPLINEAR | - WINED3DPTFILTERCAPS_MIPNEAREST | - WINED3DPTFILTERCAPS_NEAREST; + pCaps->CubeTextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR | + WINED3DPTFILTERCAPS_MAGFPOINT | + WINED3DPTFILTERCAPS_MINFLINEAR | + WINED3DPTFILTERCAPS_MINFPOINT | + WINED3DPTFILTERCAPS_MIPFLINEAR | + WINED3DPTFILTERCAPS_MIPFPOINT | + WINED3DPTFILTERCAPS_LINEAR | + WINED3DPTFILTERCAPS_LINEARMIPLINEAR | + WINED3DPTFILTERCAPS_LINEARMIPNEAREST | + WINED3DPTFILTERCAPS_MIPLINEAR | + WINED3DPTFILTERCAPS_MIPNEAREST | + WINED3DPTFILTERCAPS_NEAREST; if (GL_SUPPORT(EXT_TEXTURE_FILTER_ANISOTROPIC)) { - *pCaps->CubeTextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFANISOTROPIC | + pCaps->CubeTextureFilterCaps |= WINED3DPTFILTERCAPS_MAGFANISOTROPIC | WINED3DPTFILTERCAPS_MINFANISOTROPIC; } } else - *pCaps->CubeTextureFilterCaps = 0; + pCaps->CubeTextureFilterCaps = 0; if (GL_SUPPORT(EXT_TEXTURE3D)) { - *pCaps->VolumeTextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR | - WINED3DPTFILTERCAPS_MAGFPOINT | - WINED3DPTFILTERCAPS_MINFLINEAR | - WINED3DPTFILTERCAPS_MINFPOINT | - WINED3DPTFILTERCAPS_MIPFLINEAR | - WINED3DPTFILTERCAPS_MIPFPOINT | - WINED3DPTFILTERCAPS_LINEAR | - WINED3DPTFILTERCAPS_LINEARMIPLINEAR | - WINED3DPTFILTERCAPS_LINEARMIPNEAREST | - WINED3DPTFILTERCAPS_MIPLINEAR | - WINED3DPTFILTERCAPS_MIPNEAREST | - WINED3DPTFILTERCAPS_NEAREST; + pCaps->VolumeTextureFilterCaps = WINED3DPTFILTERCAPS_MAGFLINEAR | + WINED3DPTFILTERCAPS_MAGFPOINT | + WINED3DPTFILTERCAPS_MINFLINEAR | + WINED3DPTFILTERCAPS_MINFPOINT | + WINED3DPTFILTERCAPS_MIPFLINEAR | + WINED3DPTFILTERCAPS_MIPFPOINT | + WINED3DPTFILTERCAPS_LINEAR | + WINED3DPTFILTERCAPS_LINEARMIPLINEAR | + WINED3DPTFILTERCAPS_LINEARMIPNEAREST | + WINED3DPTFILTERCAPS_MIPLINEAR | + WINED3DPTFILTERCAPS_MIPNEAREST | + WINED3DPTFILTERCAPS_NEAREST; } else - *pCaps->VolumeTextureFilterCaps = 0; + pCaps->VolumeTextureFilterCaps = 0; - *pCaps->TextureAddressCaps = WINED3DPTADDRESSCAPS_INDEPENDENTUV | - WINED3DPTADDRESSCAPS_CLAMP | - WINED3DPTADDRESSCAPS_WRAP; + pCaps->TextureAddressCaps = WINED3DPTADDRESSCAPS_INDEPENDENTUV | + WINED3DPTADDRESSCAPS_CLAMP | + WINED3DPTADDRESSCAPS_WRAP; if (GL_SUPPORT(ARB_TEXTURE_BORDER_CLAMP)) { - *pCaps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_BORDER; + pCaps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_BORDER; } if (GL_SUPPORT(ARB_TEXTURE_MIRRORED_REPEAT)) { - *pCaps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRROR; + pCaps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRROR; } if (GL_SUPPORT(ATI_TEXTURE_MIRROR_ONCE)) { - *pCaps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRRORONCE; + pCaps->TextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRRORONCE; } if (GL_SUPPORT(EXT_TEXTURE3D)) { - *pCaps->VolumeTextureAddressCaps = WINED3DPTADDRESSCAPS_INDEPENDENTUV | - WINED3DPTADDRESSCAPS_CLAMP | - WINED3DPTADDRESSCAPS_WRAP; + pCaps->VolumeTextureAddressCaps = WINED3DPTADDRESSCAPS_INDEPENDENTUV | + WINED3DPTADDRESSCAPS_CLAMP | + WINED3DPTADDRESSCAPS_WRAP; if (GL_SUPPORT(ARB_TEXTURE_BORDER_CLAMP)) { - *pCaps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_BORDER; + pCaps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_BORDER; } if (GL_SUPPORT(ARB_TEXTURE_MIRRORED_REPEAT)) { - *pCaps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRROR; + pCaps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRROR; } if (GL_SUPPORT(ATI_TEXTURE_MIRROR_ONCE)) { - *pCaps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRRORONCE; + pCaps->VolumeTextureAddressCaps |= WINED3DPTADDRESSCAPS_MIRRORONCE; } } else - *pCaps->VolumeTextureAddressCaps = 0; + pCaps->VolumeTextureAddressCaps = 0; - *pCaps->LineCaps = WINED3DLINECAPS_TEXTURE | - WINED3DLINECAPS_ZTEST; + pCaps->LineCaps = WINED3DLINECAPS_TEXTURE | + WINED3DLINECAPS_ZTEST; /* FIXME: Add WINED3DLINECAPS_BLEND WINED3DLINECAPS_ALPHACMP WINED3DLINECAPS_FOG */ - *pCaps->MaxTextureWidth = GL_LIMITS(texture_size); - *pCaps->MaxTextureHeight = GL_LIMITS(texture_size); + pCaps->MaxTextureWidth = GL_LIMITS(texture_size); + pCaps->MaxTextureHeight = GL_LIMITS(texture_size); if(GL_SUPPORT(EXT_TEXTURE3D)) - *pCaps->MaxVolumeExtent = GL_LIMITS(texture3d_size); + pCaps->MaxVolumeExtent = GL_LIMITS(texture3d_size); else - *pCaps->MaxVolumeExtent = 0; + pCaps->MaxVolumeExtent = 0; - *pCaps->MaxTextureRepeat = 32768; - *pCaps->MaxTextureAspectRatio = GL_LIMITS(texture_size); - *pCaps->MaxVertexW = 1.0; + pCaps->MaxTextureRepeat = 32768; + pCaps->MaxTextureAspectRatio = GL_LIMITS(texture_size); + pCaps->MaxVertexW = 1.0; - *pCaps->GuardBandLeft = 0; - *pCaps->GuardBandTop = 0; - *pCaps->GuardBandRight = 0; - *pCaps->GuardBandBottom = 0; + pCaps->GuardBandLeft = 0; + pCaps->GuardBandTop = 0; + pCaps->GuardBandRight = 0; + pCaps->GuardBandBottom = 0; - *pCaps->ExtentsAdjust = 0; + pCaps->ExtentsAdjust = 0; - *pCaps->StencilCaps = WINED3DSTENCILCAPS_DECRSAT | - WINED3DSTENCILCAPS_INCRSAT | - WINED3DSTENCILCAPS_INVERT | - WINED3DSTENCILCAPS_KEEP | - WINED3DSTENCILCAPS_REPLACE | - WINED3DSTENCILCAPS_ZERO; + pCaps->StencilCaps = WINED3DSTENCILCAPS_DECRSAT | + WINED3DSTENCILCAPS_INCRSAT | + WINED3DSTENCILCAPS_INVERT | + WINED3DSTENCILCAPS_KEEP | + WINED3DSTENCILCAPS_REPLACE | + WINED3DSTENCILCAPS_ZERO; if (GL_SUPPORT(EXT_STENCIL_WRAP)) { - *pCaps->StencilCaps |= WINED3DSTENCILCAPS_DECR | - WINED3DSTENCILCAPS_INCR; + pCaps->StencilCaps |= WINED3DSTENCILCAPS_DECR | + WINED3DSTENCILCAPS_INCR; } if ( This->dxVersion > 8 && ( GL_SUPPORT(EXT_STENCIL_TWO_SIDE) || GL_SUPPORT(ATI_SEPARATE_STENCIL) ) ) { - *pCaps->StencilCaps |= WINED3DSTENCILCAPS_TWOSIDED; - } - - *pCaps->FVFCaps = WINED3DFVFCAPS_PSIZE | 0x0008; /* 8 texture coords */ - - *pCaps->TextureOpCaps = WINED3DTEXOPCAPS_ADD | - WINED3DTEXOPCAPS_ADDSIGNED | - WINED3DTEXOPCAPS_ADDSIGNED2X | - WINED3DTEXOPCAPS_MODULATE | - WINED3DTEXOPCAPS_MODULATE2X | - WINED3DTEXOPCAPS_MODULATE4X | - WINED3DTEXOPCAPS_SELECTARG1 | - WINED3DTEXOPCAPS_SELECTARG2 | - WINED3DTEXOPCAPS_DISABLE; - - if (GL_SUPPORT(ARB_TEXTURE_ENV_COMBINE) || - GL_SUPPORT(EXT_TEXTURE_ENV_COMBINE) || - GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) { - *pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_BLENDDIFFUSEALPHA | - WINED3DTEXOPCAPS_BLENDTEXTUREALPHA | - WINED3DTEXOPCAPS_BLENDFACTORALPHA | - WINED3DTEXOPCAPS_BLENDCURRENTALPHA | - WINED3DTEXOPCAPS_LERP | - WINED3DTEXOPCAPS_SUBTRACT; - } - if (GL_SUPPORT(ATI_TEXTURE_ENV_COMBINE3) || - GL_SUPPORT(NV_TEXTURE_ENV_COMBINE4)) { - *pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_ADDSMOOTH | - WINED3DTEXOPCAPS_MULTIPLYADD | - WINED3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR | - WINED3DTEXOPCAPS_MODULATECOLOR_ADDALPHA | - WINED3DTEXOPCAPS_BLENDTEXTUREALPHAPM; - } - if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) - *pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_DOTPRODUCT3; - - if (GL_SUPPORT(NV_REGISTER_COMBINERS)) { - *pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR | - WINED3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA; - } - - if(GL_SUPPORT(ATI_ENVMAP_BUMPMAP)) { - *pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_BUMPENVMAP; - } else if(GL_SUPPORT(NV_TEXTURE_SHADER2)) { - /* Bump mapping is supported already in NV_TEXTURE_SHADER, but that extension does - * not support 3D textures. This asks for trouble if an app uses both bump mapping - * and 3D textures. It also allows us to keep the code simpler by having texture - * shaders constantly enabled. - */ - *pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_BUMPENVMAP; - /* TODO: Luminance bump map? */ + pCaps->StencilCaps |= WINED3DSTENCILCAPS_TWOSIDED; } -#if 0 - /* FIXME: Add - *pCaps->TextureOpCaps |= WINED3DTEXOPCAPS_BUMPENVMAPLUMINANCE - WINED3DTEXOPCAPS_PREMODULATE */ -#endif - *pCaps->MaxTextureBlendStages = GL_LIMITS(texture_stages); - *pCaps->MaxSimultaneousTextures = GL_LIMITS(textures); - *pCaps->MaxUserClipPlanes = GL_LIMITS(clipplanes); - *pCaps->MaxActiveLights = GL_LIMITS(lights); + pCaps->FVFCaps = WINED3DFVFCAPS_PSIZE | 0x0008; /* 8 texture coords */ + + pCaps->MaxUserClipPlanes = GL_LIMITS(clipplanes); + pCaps->MaxActiveLights = GL_LIMITS(lights); - *pCaps->MaxVertexBlendMatrices = GL_LIMITS(blends); - *pCaps->MaxVertexBlendMatrixIndex = 0; + pCaps->MaxVertexBlendMatrices = GL_LIMITS(blends); + pCaps->MaxVertexBlendMatrixIndex = 0; - *pCaps->MaxAnisotropy = GL_LIMITS(anisotropy); - *pCaps->MaxPointSize = GL_LIMITS(pointsize); + pCaps->MaxAnisotropy = GL_LIMITS(anisotropy); + pCaps->MaxPointSize = GL_LIMITS(pointsize); - *pCaps->VertexProcessingCaps = WINED3DVTXPCAPS_DIRECTIONALLIGHTS | - WINED3DVTXPCAPS_MATERIALSOURCE7 | - WINED3DVTXPCAPS_POSITIONALLIGHTS | - WINED3DVTXPCAPS_LOCALVIEWER | - WINED3DVTXPCAPS_VERTEXFOG | - WINED3DVTXPCAPS_TEXGEN; + pCaps->VertexProcessingCaps = WINED3DVTXPCAPS_DIRECTIONALLIGHTS | + WINED3DVTXPCAPS_MATERIALSOURCE7 | + WINED3DVTXPCAPS_POSITIONALLIGHTS | + WINED3DVTXPCAPS_LOCALVIEWER | + WINED3DVTXPCAPS_VERTEXFOG | + WINED3DVTXPCAPS_TEXGEN; /* FIXME: Add D3DVTXPCAPS_TWEENING, D3DVTXPCAPS_TEXGEN_SPHEREMAP */ - *pCaps->MaxPrimitiveCount = 0xFFFFF; /* For now set 2^20-1 which is used by most >=Geforce3/Radeon8500 cards */ - *pCaps->MaxVertexIndex = 0xFFFFF; - *pCaps->MaxStreams = MAX_STREAMS; - *pCaps->MaxStreamStride = 1024; - - if (vs_selected_mode == SHADER_GLSL) { - /* Nvidia Geforce6/7 or Ati R4xx/R5xx cards with GLSL support, support VS 3.0 but older Nvidia/Ati - * models with GLSL support only support 2.0. In case of nvidia we can detect VS 2.0 support using - * vs_nv_version which is based on NV_vertex_program. - * For Ati cards there's no way using glsl (it abstracts the lowlevel info away) and also not - * using ARB_vertex_program. It is safe to assume that when a card supports pixel shader 2.0 it - * supports vertex shader 2.0 too and the way around. We can detect ps2.0 using the maximum number - * of native instructions, so use that here. For more info see the pixel shader versioning code below. */ - if((GLINFO_LOCATION.vs_nv_version == VS_VERSION_20) || (GLINFO_LOCATION.ps_arb_max_instructions <= 512)) - *pCaps->VertexShaderVersion = WINED3DVS_VERSION(2,0); - else - *pCaps->VertexShaderVersion = WINED3DVS_VERSION(3,0); - TRACE_(d3d_caps)("Hardware vertex shader version %d.%d enabled (GLSL)\n", (*pCaps->VertexShaderVersion >> 8) & 0xff, *pCaps->VertexShaderVersion & 0xff); - } else if (vs_selected_mode == SHADER_ARB) { - *pCaps->VertexShaderVersion = WINED3DVS_VERSION(1,1); - TRACE_(d3d_caps)("Hardware vertex shader version 1.1 enabled (ARB_PROGRAM)\n"); + pCaps->MaxPrimitiveCount = 0xFFFFF; /* For now set 2^20-1 which is used by most >=Geforce3/Radeon8500 cards */ + pCaps->MaxVertexIndex = 0xFFFFF; + pCaps->MaxStreams = MAX_STREAMS; + pCaps->MaxStreamStride = 1024; + + /* d3d9.dll sets D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES here because StretchRects is implemented in d3d9 */ + pCaps->DevCaps2 = WINED3DDEVCAPS2_STREAMOFFSET; + /* TODO: VS3.0 needs at least D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET */ + pCaps->MaxNpatchTessellationLevel = 0; + pCaps->MasterAdapterOrdinal = 0; + pCaps->AdapterOrdinalInGroup = 0; + pCaps->NumberOfAdaptersInGroup = 1; + + pCaps->NumSimultaneousRTs = GL_LIMITS(buffers); + + pCaps->StretchRectFilterCaps = WINED3DPTFILTERCAPS_MINFPOINT | + WINED3DPTFILTERCAPS_MAGFPOINT | + WINED3DPTFILTERCAPS_MINFLINEAR | + WINED3DPTFILTERCAPS_MAGFLINEAR; + pCaps->VertexTextureFilterCaps = 0; + + memset(&shader_caps, 0, sizeof(shader_caps)); + shader_backend = select_shader_backend(Adapter, DeviceType); + shader_backend->shader_get_caps(DeviceType, &GLINFO_LOCATION, &shader_caps); + + /* This takes care for disabling vertex shader or pixel shader caps while leaving the other one enabled. + * Ignore shader model capabilities if disabled in config + */ + if(vs_selected_mode == SHADER_NONE) { + TRACE_(d3d_caps)("Vertex shader disabled in config, reporting version 0.0\n"); + pCaps->VertexShaderVersion = WINED3DVS_VERSION(0,0); + pCaps->MaxVertexShaderConst = 0; } else { - *pCaps->VertexShaderVersion = 0; - TRACE_(d3d_caps)("Vertex shader functionality not available\n"); + pCaps->VertexShaderVersion = shader_caps.VertexShaderVersion; + pCaps->MaxVertexShaderConst = shader_caps.MaxVertexShaderConst; } - *pCaps->MaxVertexShaderConst = GL_LIMITS(vshader_constantsF); - - if (ps_selected_mode == SHADER_GLSL) { - /* Older DX9-class videocards (GeforceFX / Radeon >9500/X*00) only support pixel shader 2.0/2.0a/2.0b. - * In OpenGL the extensions related to GLSL abstract lowlevel GL info away which is needed - * to distinguish between 2.0 and 3.0 (and 2.0a/2.0b). In case of Nvidia we use their fragment - * program extensions. On other hardware including ATI GL_ARB_fragment_program offers the info - * in max native instructions. Intel and others also offer the info in this extension but they - * don't support GLSL (at least on Windows). - * - * PS2.0 requires at least 96 instructions, 2.0a/2.0b go up to 512. Assume that if the number - * of instructions is 512 or less we have to do with ps2.0 hardware. - * NOTE: ps3.0 hardware requires 512 or more instructions but ati and nvidia offer 'enough' (1024 vs 4096) on their most basic ps3.0 hardware. - */ - if((GLINFO_LOCATION.ps_nv_version == PS_VERSION_20) || (GLINFO_LOCATION.ps_arb_max_instructions <= 512)) - *pCaps->PixelShaderVersion = WINED3DPS_VERSION(2,0); - else - *pCaps->PixelShaderVersion = WINED3DPS_VERSION(3,0); - /* FIXME: The following line is card dependent. -8.0 to 8.0 is the - * Direct3D minimum requirement. - * - * Both GL_ARB_fragment_program and GLSL require a "maximum representable magnitude" - * of colors to be 2^10, and 2^32 for other floats. Should we use 1024 here? - * - * The problem is that the refrast clamps temporary results in the shader to - * [-MaxValue;+MaxValue]. If the card's max value is bigger than the one we advertize here, - * then applications may miss the clamping behavior. On the other hand, if it is smaller, - * the shader will generate incorrect results too. Unfortunately, GL deliberately doesn't - * offer a way to query this. - */ - *pCaps->PixelShader1xMaxValue = 8.0; - TRACE_(d3d_caps)("Hardware pixel shader version %d.%d enabled (GLSL)\n", (*pCaps->PixelShaderVersion >> 8) & 0xff, *pCaps->PixelShaderVersion & 0xff); - } else if (ps_selected_mode == SHADER_ARB) { - *pCaps->PixelShaderVersion = WINED3DPS_VERSION(1,4); - *pCaps->PixelShader1xMaxValue = 8.0; - TRACE_(d3d_caps)("Hardware pixel shader version 1.4 enabled (ARB_PROGRAM)\n"); + if(ps_selected_mode == SHADER_NONE) { + TRACE_(d3d_caps)("Pixel shader disabled in config, reporting version 0.0\n"); + pCaps->PixelShaderVersion = WINED3DPS_VERSION(0,0); + pCaps->PixelShader1xMaxValue = 0.0; } else { - *pCaps->PixelShaderVersion = 0; - *pCaps->PixelShader1xMaxValue = 0.0; - TRACE_(d3d_caps)("Pixel shader functionality not available\n"); - } - - /* ------------------------------------------------ - The following fields apply to d3d9 only - ------------------------------------------------ */ - if (This->dxVersion > 8) { - /* d3d9.dll sets D3DDEVCAPS2_CAN_STRETCHRECT_FROM_TEXTURES here because StretchRects is implemented in d3d9 */ - *pCaps->DevCaps2 = WINED3DDEVCAPS2_STREAMOFFSET; - /* TODO: VS3.0 needs at least D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET */ - *pCaps->MaxNpatchTessellationLevel = 0; - *pCaps->MasterAdapterOrdinal = 0; - *pCaps->AdapterOrdinalInGroup = 0; - *pCaps->NumberOfAdaptersInGroup = 1; - - if(*pCaps->VertexShaderVersion >= WINED3DVS_VERSION(2,0)) { - /* OpenGL supports all the formats below, perhaps not always - * without conversion, but it supports them. - * Further GLSL doesn't seem to have an official unsigned type so - * don't advertise it yet as I'm not sure how we handle it. - * We might need to add some clamping in the shader engine to - * support it. - * TODO: WINED3DDTCAPS_USHORT2N, WINED3DDTCAPS_USHORT4N, WINED3DDTCAPS_UDEC3, WINED3DDTCAPS_DEC3N */ - *pCaps->DeclTypes = WINED3DDTCAPS_UBYTE4 | - WINED3DDTCAPS_UBYTE4N | - WINED3DDTCAPS_SHORT2N | - WINED3DDTCAPS_SHORT4N; - if (GL_SUPPORT(NV_HALF_FLOAT)) { - *pCaps->DeclTypes |= - WINED3DDTCAPS_FLOAT16_2 | + pCaps->PixelShaderVersion = shader_caps.PixelShaderVersion; + pCaps->PixelShader1xMaxValue = shader_caps.PixelShader1xMaxValue; + } + + pCaps->TextureOpCaps = shader_caps.TextureOpCaps; + pCaps->MaxTextureBlendStages = shader_caps.MaxTextureBlendStages; + pCaps->MaxSimultaneousTextures = shader_caps.MaxSimultaneousTextures; + pCaps->VS20Caps = shader_caps.VS20Caps; + pCaps->MaxVShaderInstructionsExecuted = shader_caps.MaxVShaderInstructionsExecuted; + pCaps->MaxVertexShader30InstructionSlots= shader_caps.MaxVertexShader30InstructionSlots; + pCaps->PS20Caps = shader_caps.PS20Caps; + pCaps->MaxPShaderInstructionsExecuted = shader_caps.MaxPShaderInstructionsExecuted; + pCaps->MaxPixelShader30InstructionSlots = shader_caps.MaxPixelShader30InstructionSlots; + + /* The following caps are shader specific, but they are things we cannot detect, or which + * are the same among all shader models. So to avoid code duplication set the shader version + * specific, but otherwise constant caps here + */ + if(pCaps->VertexShaderVersion == WINED3DVS_VERSION(3,0)) { + /* Where possible set the caps based on OpenGL extensions and if they aren't set (in case of software rendering) + use the VS 3.0 from MSDN or else if there's OpenGL spec use a hardcoded value minimum VS3.0 value. */ + pCaps->VS20Caps.Caps = WINED3DVS20CAPS_PREDICATION; + pCaps->VS20Caps.DynamicFlowControlDepth = WINED3DVS20_MAX_DYNAMICFLOWCONTROLDEPTH; /* VS 3.0 requires MAX_DYNAMICFLOWCONTROLDEPTH (24) */ + pCaps->VS20Caps.NumTemps = max(32, GLINFO_LOCATION.vs_arb_max_temps); + pCaps->VS20Caps.StaticFlowControlDepth = WINED3DVS20_MAX_STATICFLOWCONTROLDEPTH ; /* level of nesting in loops / if-statements; VS 3.0 requires MAX (4) */ + + pCaps->MaxVShaderInstructionsExecuted = 65535; /* VS 3.0 needs at least 65535, some cards even use 2^32-1 */ + pCaps->MaxVertexShader30InstructionSlots = max(512, GLINFO_LOCATION.vs_arb_max_instructions); + } else if(pCaps->VertexShaderVersion == WINED3DVS_VERSION(2,0)) { + pCaps->VS20Caps.Caps = 0; + pCaps->VS20Caps.DynamicFlowControlDepth = WINED3DVS20_MIN_DYNAMICFLOWCONTROLDEPTH; + pCaps->VS20Caps.NumTemps = max(12, GLINFO_LOCATION.vs_arb_max_temps); + pCaps->VS20Caps.StaticFlowControlDepth = 1; + + pCaps->MaxVShaderInstructionsExecuted = 65535; + pCaps->MaxVertexShader30InstructionSlots = 0; + } else { /* VS 1.x */ + pCaps->VS20Caps.Caps = 0; + pCaps->VS20Caps.DynamicFlowControlDepth = 0; + pCaps->VS20Caps.NumTemps = 0; + pCaps->VS20Caps.StaticFlowControlDepth = 0; + + pCaps->MaxVShaderInstructionsExecuted = 0; + pCaps->MaxVertexShader30InstructionSlots = 0; + } + + if(pCaps->PixelShaderVersion == WINED3DPS_VERSION(3,0)) { + /* Where possible set the caps based on OpenGL extensions and if they aren't set (in case of software rendering) + use the PS 3.0 from MSDN or else if there's OpenGL spec use a hardcoded value minimum PS 3.0 value. */ + + /* Caps is more or less undocumented on MSDN but it appears to be used for PS20Caps based on results from R9600/FX5900/Geforce6800 cards from Windows */ + pCaps->PS20Caps.Caps = WINED3DPS20CAPS_ARBITRARYSWIZZLE | + WINED3DPS20CAPS_GRADIENTINSTRUCTIONS | + WINED3DPS20CAPS_PREDICATION | + WINED3DPS20CAPS_NODEPENDENTREADLIMIT | + WINED3DPS20CAPS_NOTEXINSTRUCTIONLIMIT; + pCaps->PS20Caps.DynamicFlowControlDepth = WINED3DPS20_MAX_DYNAMICFLOWCONTROLDEPTH; /* PS 3.0 requires MAX_DYNAMICFLOWCONTROLDEPTH (24) */ + pCaps->PS20Caps.NumTemps = max(32, GLINFO_LOCATION.ps_arb_max_temps); + pCaps->PS20Caps.StaticFlowControlDepth = WINED3DPS20_MAX_STATICFLOWCONTROLDEPTH; /* PS 3.0 requires MAX_STATICFLOWCONTROLDEPTH (4) */ + pCaps->PS20Caps.NumInstructionSlots = WINED3DPS20_MAX_NUMINSTRUCTIONSLOTS; /* PS 3.0 requires MAX_NUMINSTRUCTIONSLOTS (512) */ + + pCaps->MaxPShaderInstructionsExecuted = 65535; + pCaps->MaxPixelShader30InstructionSlots = max(WINED3DMIN30SHADERINSTRUCTIONS, GLINFO_LOCATION.ps_arb_max_instructions); + } else if(pCaps->PixelShaderVersion == WINED3DPS_VERSION(2,0)) { + /* Below we assume PS2.0 specs, not extended 2.0a(GeforceFX)/2.0b(Radeon R3xx) ones */ + pCaps->PS20Caps.Caps = 0; + pCaps->PS20Caps.DynamicFlowControlDepth = 0; /* WINED3DVS20_MIN_DYNAMICFLOWCONTROLDEPTH = 0 */ + pCaps->PS20Caps.NumTemps = max(12, GLINFO_LOCATION.ps_arb_max_temps); + pCaps->PS20Caps.StaticFlowControlDepth = WINED3DPS20_MIN_STATICFLOWCONTROLDEPTH; /* Minimum: 1 */ + pCaps->PS20Caps.NumInstructionSlots = WINED3DPS20_MIN_NUMINSTRUCTIONSLOTS; /* Minimum number (64 ALU + 32 Texture), a GeforceFX uses 512 */ + + pCaps->MaxPShaderInstructionsExecuted = 512; /* Minimum value, a GeforceFX uses 1024 */ + pCaps->MaxPixelShader30InstructionSlots = 0; + } else { /* PS 1.x */ + pCaps->PS20Caps.Caps = 0; + pCaps->PS20Caps.DynamicFlowControlDepth = 0; + pCaps->PS20Caps.NumTemps = 0; + pCaps->PS20Caps.StaticFlowControlDepth = 0; + pCaps->PS20Caps.NumInstructionSlots = 0; + + pCaps->MaxPShaderInstructionsExecuted = 0; + pCaps->MaxPixelShader30InstructionSlots = 0; + } + + if(pCaps->VertexShaderVersion >= WINED3DVS_VERSION(2,0)) { + /* OpenGL supports all the formats below, perhaps not always + * without conversion, but it supports them. + * Further GLSL doesn't seem to have an official unsigned type so + * don't advertise it yet as I'm not sure how we handle it. + * We might need to add some clamping in the shader engine to + * support it. + * TODO: WINED3DDTCAPS_USHORT2N, WINED3DDTCAPS_USHORT4N, WINED3DDTCAPS_UDEC3, WINED3DDTCAPS_DEC3N */ + pCaps->DeclTypes = WINED3DDTCAPS_UBYTE4 | + WINED3DDTCAPS_UBYTE4N | + WINED3DDTCAPS_SHORT2N | + WINED3DDTCAPS_SHORT4N; + if (GL_SUPPORT(NV_HALF_FLOAT)) { + pCaps->DeclTypes |= WINED3DDTCAPS_FLOAT16_2 | WINED3DDTCAPS_FLOAT16_4; - } - } else - *pCaps->DeclTypes = 0; - - *pCaps->NumSimultaneousRTs = GL_LIMITS(buffers); - - - *pCaps->StretchRectFilterCaps = WINED3DPTFILTERCAPS_MINFPOINT | - WINED3DPTFILTERCAPS_MAGFPOINT | - WINED3DPTFILTERCAPS_MINFLINEAR | - WINED3DPTFILTERCAPS_MAGFLINEAR; - *pCaps->VertexTextureFilterCaps = 0; - - if(*pCaps->VertexShaderVersion == WINED3DVS_VERSION(3,0)) { - /* Where possible set the caps based on OpenGL extensions and if they aren't set (in case of software rendering) - use the VS 3.0 from MSDN or else if there's OpenGL spec use a hardcoded value minimum VS3.0 value. */ - *pCaps->VS20Caps.Caps = WINED3DVS20CAPS_PREDICATION; - *pCaps->VS20Caps.DynamicFlowControlDepth = WINED3DVS20_MAX_DYNAMICFLOWCONTROLDEPTH; /* VS 3.0 requires MAX_DYNAMICFLOWCONTROLDEPTH (24) */ - *pCaps->VS20Caps.NumTemps = max(32, GLINFO_LOCATION.vs_arb_max_temps); - *pCaps->VS20Caps.StaticFlowControlDepth = WINED3DVS20_MAX_STATICFLOWCONTROLDEPTH ; /* level of nesting in loops / if-statements; VS 3.0 requires MAX (4) */ - - *pCaps->MaxVShaderInstructionsExecuted = 65535; /* VS 3.0 needs at least 65535, some cards even use 2^32-1 */ - *pCaps->MaxVertexShader30InstructionSlots = max(512, GLINFO_LOCATION.vs_arb_max_instructions); - } else if(*pCaps->VertexShaderVersion == WINED3DVS_VERSION(2,0)) { - *pCaps->VS20Caps.Caps = 0; - *pCaps->VS20Caps.DynamicFlowControlDepth = WINED3DVS20_MIN_DYNAMICFLOWCONTROLDEPTH; - *pCaps->VS20Caps.NumTemps = max(12, GLINFO_LOCATION.vs_arb_max_temps); - *pCaps->VS20Caps.StaticFlowControlDepth = 1; - - *pCaps->MaxVShaderInstructionsExecuted = 65535; - *pCaps->MaxVertexShader30InstructionSlots = 0; - } else { /* VS 1.x */ - *pCaps->VS20Caps.Caps = 0; - *pCaps->VS20Caps.DynamicFlowControlDepth = 0; - *pCaps->VS20Caps.NumTemps = 0; - *pCaps->VS20Caps.StaticFlowControlDepth = 0; - - *pCaps->MaxVShaderInstructionsExecuted = 0; - *pCaps->MaxVertexShader30InstructionSlots = 0; - } - - if(*pCaps->PixelShaderVersion == WINED3DPS_VERSION(3,0)) { - /* Where possible set the caps based on OpenGL extensions and if they aren't set (in case of software rendering) - use the PS 3.0 from MSDN or else if there's OpenGL spec use a hardcoded value minimum PS 3.0 value. */ - - /* Caps is more or less undocumented on MSDN but it appears to be used for PS20Caps based on results from R9600/FX5900/Geforce6800 cards from Windows */ - *pCaps->PS20Caps.Caps = WINED3DPS20CAPS_ARBITRARYSWIZZLE | - WINED3DPS20CAPS_GRADIENTINSTRUCTIONS | - WINED3DPS20CAPS_PREDICATION | - WINED3DPS20CAPS_NODEPENDENTREADLIMIT | - WINED3DPS20CAPS_NOTEXINSTRUCTIONLIMIT; - *pCaps->PS20Caps.DynamicFlowControlDepth = WINED3DPS20_MAX_DYNAMICFLOWCONTROLDEPTH; /* PS 3.0 requires MAX_DYNAMICFLOWCONTROLDEPTH (24) */ - *pCaps->PS20Caps.NumTemps = max(32, GLINFO_LOCATION.ps_arb_max_temps); - *pCaps->PS20Caps.StaticFlowControlDepth = WINED3DPS20_MAX_STATICFLOWCONTROLDEPTH; /* PS 3.0 requires MAX_STATICFLOWCONTROLDEPTH (4) */ - *pCaps->PS20Caps.NumInstructionSlots = WINED3DPS20_MAX_NUMINSTRUCTIONSLOTS; /* PS 3.0 requires MAX_NUMINSTRUCTIONSLOTS (512) */ - - *pCaps->MaxPShaderInstructionsExecuted = 65535; - *pCaps->MaxPixelShader30InstructionSlots = max(WINED3DMIN30SHADERINSTRUCTIONS, GLINFO_LOCATION.ps_arb_max_instructions); - } else if(*pCaps->PixelShaderVersion == WINED3DPS_VERSION(2,0)) { - /* Below we assume PS2.0 specs, not extended 2.0a(GeforceFX)/2.0b(Radeon R3xx) ones */ - *pCaps->PS20Caps.Caps = 0; - *pCaps->PS20Caps.DynamicFlowControlDepth = 0; /* WINED3DVS20_MIN_DYNAMICFLOWCONTROLDEPTH = 0 */ - *pCaps->PS20Caps.NumTemps = max(12, GLINFO_LOCATION.ps_arb_max_temps); - *pCaps->PS20Caps.StaticFlowControlDepth = WINED3DPS20_MIN_STATICFLOWCONTROLDEPTH; /* Minimum: 1 */ - *pCaps->PS20Caps.NumInstructionSlots = WINED3DPS20_MIN_NUMINSTRUCTIONSLOTS; /* Minimum number (64 ALU + 32 Texture), a GeforceFX uses 512 */ - - *pCaps->MaxPShaderInstructionsExecuted = 512; /* Minimum value, a GeforceFX uses 1024 */ - *pCaps->MaxPixelShader30InstructionSlots = 0; - } else { /* PS 1.x */ - *pCaps->PS20Caps.Caps = 0; - *pCaps->PS20Caps.DynamicFlowControlDepth = 0; - *pCaps->PS20Caps.NumTemps = 0; - *pCaps->PS20Caps.StaticFlowControlDepth = 0; - *pCaps->PS20Caps.NumInstructionSlots = 0; - - *pCaps->MaxPShaderInstructionsExecuted = 0; - *pCaps->MaxPixelShader30InstructionSlots = 0; } - } + } else + pCaps->DeclTypes = 0; return WINED3D_OK; } -static unsigned int glsl_program_key_hash(void *key) { - glsl_program_key_t *k = (glsl_program_key_t *)key; - - unsigned int hash = k->vshader | k->pshader << 16; - hash += ~(hash << 15); - hash ^= (hash >> 10); - hash += (hash << 3); - hash ^= (hash >> 6); - hash += ~(hash << 11); - hash ^= (hash >> 16); - - return hash; -} - -static BOOL glsl_program_key_compare(void *keya, void *keyb) { - glsl_program_key_t *ka = (glsl_program_key_t *)keya; - glsl_program_key_t *kb = (glsl_program_key_t *)keyb; - - return ka->vshader == kb->vshader && ka->pshader == kb->pshader; -} - /* Note due to structure differences between dx8 and dx9 D3DPRESENT_PARAMETERS, and fields being inserted in the middle, a new structure is used in place */ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType, HWND hFocusWindow, @@ -3295,20 +3287,7 @@ static HRESULT WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter, object->devType = DeviceType; select_shader_mode(&GLINFO_LOCATION, DeviceType, &object->ps_selected_mode, &object->vs_selected_mode); - if (object->ps_selected_mode == SHADER_GLSL || object->vs_selected_mode == SHADER_GLSL) { - object->shader_backend = &glsl_shader_backend; - object->glsl_program_lookup = hash_table_create(&glsl_program_key_hash, &glsl_program_key_compare); - } else if (object->ps_selected_mode == SHADER_ARB || object->vs_selected_mode == SHADER_ARB) { - object->shader_backend = &arb_program_shader_backend; - } else { - object->shader_backend = &none_shader_backend; - } - if(FAILED(object->shader_backend->shader_alloc_private((IWineD3DDevice *) object))) { - IWineD3D_Release(object->wineD3D); - HeapFree(GetProcessHeap(), 0, object); - *ppReturnedDeviceInterface = NULL; - return E_OUTOFMEMORY; - } + object->shader_backend = select_shader_backend(Adapter, DeviceType); /* Prefer the vtable with functions optimized for single dirtifyable objects if the shader * model can deal with that. It is essentially the same, just with adjusted diff --git a/dlls/wined3d/drawprim.c b/dlls/wined3d/drawprim.c index eefc9144871..647b30ccd73 100644 --- a/dlls/wined3d/drawprim.c +++ b/dlls/wined3d/drawprim.c @@ -984,6 +984,8 @@ void drawPrimitive(IWineD3DDevice *iface, IWineD3DSurfaceImpl *target; int i; + if (NumPrimitives == 0) return; + /* Signals other modules that a drawing is in progress and the stateblock finalized */ This->isInDraw = TRUE; diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 7fe504a2fdf..1b476eddf42 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -33,6 +33,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader); WINE_DECLARE_DEBUG_CHANNEL(d3d_constants); +WINE_DECLARE_DEBUG_CHANNEL(d3d_caps); #define GLINFO_LOCATION (*gl_info) @@ -3346,15 +3347,38 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) { This->baseShader.is_compiled = FALSE; } +static unsigned int glsl_program_key_hash(void *key) { + glsl_program_key_t *k = (glsl_program_key_t *)key; + + unsigned int hash = k->vshader | k->pshader << 16; + hash += ~(hash << 15); + hash ^= (hash >> 10); + hash += (hash << 3); + hash ^= (hash >> 6); + hash += ~(hash << 11); + hash ^= (hash >> 16); + + return hash; +} + +static BOOL glsl_program_key_compare(void *keya, void *keyb) { + glsl_program_key_t *ka = (glsl_program_key_t *)keya; + glsl_program_key_t *kb = (glsl_program_key_t *)keyb; + + return ka->vshader == kb->vshader && ka->pshader == kb->pshader; +} + static HRESULT shader_glsl_alloc(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; This->shader_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct shader_glsl_priv)); + This->glsl_program_lookup = hash_table_create(&glsl_program_key_hash, &glsl_program_key_compare); return WINED3D_OK; } static void shader_glsl_free(IWineD3DDevice *iface) { IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface; HeapFree(GetProcessHeap(), 0, This->shader_priv); + This->shader_priv = NULL; } static BOOL shader_glsl_dirty_const(IWineD3DDevice *iface) { @@ -3362,6 +3386,202 @@ static BOOL shader_glsl_dirty_const(IWineD3DDevice *iface) { return FALSE; } +static void shader_glsl_generate_pshader(IWineD3DPixelShader *iface, SHADER_BUFFER *buffer) { + IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface; + shader_reg_maps* reg_maps = &This->baseShader.reg_maps; + CONST DWORD *function = This->baseShader.function; + const char *fragcolor; + WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info; + + /* Create the hw GLSL shader object and assign it as the baseShader.prgId */ + GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB)); + + if (GL_SUPPORT(ARB_DRAW_BUFFERS)) { + shader_addline(buffer, "#extension GL_ARB_draw_buffers : enable\n"); + } + if (GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) { + /* The spec says that it doesn't have to be explicitly enabled, but the nvidia + * drivers write a warning if we don't do so + */ + shader_addline(buffer, "#extension GL_ARB_texture_rectangle : enable\n"); + } + + /* Base Declarations */ + shader_generate_glsl_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION); + + /* Pack 3.0 inputs */ + if (This->baseShader.hex_version >= WINED3DPS_VERSION(3,0)) { + + if(((IWineD3DDeviceImpl *) This->baseShader.device)->strided_streams.u.s.position_transformed) { + This->vertexprocessing = pretransformed; + pshader_glsl_input_pack(buffer, This->semantics_in, iface); + } else if(!use_vs((IWineD3DDeviceImpl *) This->baseShader.device)) { + This->vertexprocessing = fixedfunction; + pshader_glsl_input_pack(buffer, This->semantics_in, iface); + } else { + This->vertexprocessing = vertexshader; + } + } + + /* Base Shader Body */ + shader_generate_main( (IWineD3DBaseShader*) This, buffer, reg_maps, function); + + /* Pixel shaders < 2.0 place the resulting color in R0 implicitly */ + if (This->baseShader.hex_version < WINED3DPS_VERSION(2,0)) { + /* Some older cards like GeforceFX ones don't support multiple buffers, so also not gl_FragData */ + if(GL_SUPPORT(ARB_DRAW_BUFFERS)) + shader_addline(buffer, "gl_FragData[0] = R0;\n"); + else + shader_addline(buffer, "gl_FragColor = R0;\n"); + } + + if(GL_SUPPORT(ARB_DRAW_BUFFERS)) { + fragcolor = "gl_FragData[0]"; + } else { + fragcolor = "gl_FragColor"; + } + if(This->srgb_enabled) { + shader_addline(buffer, "tmp0.xyz = pow(%s.xyz, vec3(%f, %f, %f)) * vec3(%f, %f, %f) - vec3(%f, %f, %f);\n", + fragcolor, srgb_pow, srgb_pow, srgb_pow, srgb_mul_high, srgb_mul_high, srgb_mul_high, + srgb_sub_high, srgb_sub_high, srgb_sub_high); + shader_addline(buffer, "tmp1.xyz = %s.xyz * srgb_mul_low.xyz;\n", fragcolor); + shader_addline(buffer, "%s.x = %s.x < srgb_comparison.x ? tmp1.x : tmp0.x;\n", fragcolor, fragcolor); + shader_addline(buffer, "%s.y = %s.y < srgb_comparison.y ? tmp1.y : tmp0.y;\n", fragcolor, fragcolor); + shader_addline(buffer, "%s.z = %s.z < srgb_comparison.z ? tmp1.z : tmp0.z;\n", fragcolor, fragcolor); + shader_addline(buffer, "%s = clamp(%s, 0.0, 1.0);\n", fragcolor, fragcolor); + } + /* Pixel shader < 3.0 do not replace the fog stage. + * This implements linear fog computation and blending. + * TODO: non linear fog + * NOTE: gl_Fog.start and gl_Fog.end don't hold fog start s and end e but + * -1/(e-s) and e/(e-s) respectively. + */ + if(This->baseShader.hex_version < WINED3DPS_VERSION(3,0)) { + shader_addline(buffer, "float Fog = clamp(gl_FogFragCoord * gl_Fog.start + gl_Fog.end, 0.0, 1.0);\n"); + shader_addline(buffer, "%s.xyz = mix(gl_Fog.color.xyz, %s.xyz, Fog);\n", fragcolor, fragcolor); + } + + shader_addline(buffer, "}\n"); + + TRACE("Compiling shader object %u\n", shader_obj); + GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer->buffer, NULL)); + GL_EXTCALL(glCompileShaderARB(shader_obj)); + print_glsl_info_log(&GLINFO_LOCATION, shader_obj); + + /* Store the shader object */ + This->baseShader.prgId = shader_obj; +} + +static void shader_glsl_generate_vshader(IWineD3DVertexShader *iface, SHADER_BUFFER *buffer) { + IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *)iface; + shader_reg_maps* reg_maps = &This->baseShader.reg_maps; + CONST DWORD *function = This->baseShader.function; + WineD3D_GL_Info *gl_info = &((IWineD3DDeviceImpl *)This->baseShader.device)->adapter->gl_info; + + /* Create the hw GLSL shader program and assign it as the baseShader.prgId */ + GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB)); + + /* Base Declarations */ + shader_generate_glsl_declarations( (IWineD3DBaseShader*) This, reg_maps, buffer, &GLINFO_LOCATION); + + /* Base Shader Body */ + shader_generate_main( (IWineD3DBaseShader*) This, buffer, reg_maps, function); + + /* Unpack 3.0 outputs */ + if (This->baseShader.hex_version >= WINED3DVS_VERSION(3,0)) { + shader_addline(buffer, "order_ps_input(OUT);\n"); + } else { + shader_addline(buffer, "order_ps_input();\n"); + } + + /* If this shader doesn't use fog copy the z coord to the fog coord so that we can use table fog */ + if (!reg_maps->fog) + shader_addline(buffer, "gl_FogFragCoord = gl_Position.z;\n"); + + /* Write the final position. + * + * OpenGL coordinates specify the center of the pixel while d3d coords specify + * the corner. The offsets are stored in z and w in posFixup. posFixup.y contains + * 1.0 or -1.0 to turn the rendering upside down for offscreen rendering. PosFixup.x + * contains 1.0 to allow a mad. + */ + shader_addline(buffer, "gl_Position.y = gl_Position.y * posFixup.y;\n"); + shader_addline(buffer, "gl_Position.xy += posFixup.zw * gl_Position.ww;\n"); + + /* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c + * + * Basically we want (in homogeneous coordinates) z = z * 2 - 1. However, shaders are run + * before the homogeneous divide, so we have to take the w into account: z = ((z / w) * 2 - 1) * w, + * which is the same as z = z / 2 - w. + */ + shader_addline(buffer, "gl_Position.z = gl_Position.z * 2.0 - gl_Position.w;\n"); + + shader_addline(buffer, "}\n"); + + TRACE("Compiling shader object %u\n", shader_obj); + GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer->buffer, NULL)); + GL_EXTCALL(glCompileShaderARB(shader_obj)); + print_glsl_info_log(&GLINFO_LOCATION, shader_obj); + + /* Store the shader object */ + This->baseShader.prgId = shader_obj; +} + +static void shader_glsl_get_caps(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info, struct shader_caps *pCaps) { + /* We don't have a GLSL fixed function pipeline yet, so let the none backend set its caps, + * then overwrite the shader specific ones + */ + none_shader_backend.shader_get_caps(devtype, gl_info, pCaps); + + /* Nvidia Geforce6/7 or Ati R4xx/R5xx cards with GLSL support, support VS 3.0 but older Nvidia/Ati + * models with GLSL support only support 2.0. In case of nvidia we can detect VS 2.0 support using + * vs_nv_version which is based on NV_vertex_program. + * For Ati cards there's no way using glsl (it abstracts the lowlevel info away) and also not + * using ARB_vertex_program. It is safe to assume that when a card supports pixel shader 2.0 it + * supports vertex shader 2.0 too and the way around. We can detect ps2.0 using the maximum number + * of native instructions, so use that here. For more info see the pixel shader versioning code below. + */ + if((GLINFO_LOCATION.vs_nv_version == VS_VERSION_20) || (GLINFO_LOCATION.ps_arb_max_instructions <= 512)) + pCaps->VertexShaderVersion = WINED3DVS_VERSION(2,0); + else + pCaps->VertexShaderVersion = WINED3DVS_VERSION(3,0); + TRACE_(d3d_caps)("Hardware vertex shader version %d.%d enabled (GLSL)\n", (pCaps->VertexShaderVersion >> 8) & 0xff, pCaps->VertexShaderVersion & 0xff); + pCaps->MaxVertexShaderConst = GL_LIMITS(vshader_constantsF); + + /* Older DX9-class videocards (GeforceFX / Radeon >9500/X*00) only support pixel shader 2.0/2.0a/2.0b. + * In OpenGL the extensions related to GLSL abstract lowlevel GL info away which is needed + * to distinguish between 2.0 and 3.0 (and 2.0a/2.0b). In case of Nvidia we use their fragment + * program extensions. On other hardware including ATI GL_ARB_fragment_program offers the info + * in max native instructions. Intel and others also offer the info in this extension but they + * don't support GLSL (at least on Windows). + * + * PS2.0 requires at least 96 instructions, 2.0a/2.0b go up to 512. Assume that if the number + * of instructions is 512 or less we have to do with ps2.0 hardware. + * NOTE: ps3.0 hardware requires 512 or more instructions but ati and nvidia offer 'enough' (1024 vs 4096) on their most basic ps3.0 hardware. + */ + if((GLINFO_LOCATION.ps_nv_version == PS_VERSION_20) || (GLINFO_LOCATION.ps_arb_max_instructions <= 512)) + pCaps->PixelShaderVersion = WINED3DPS_VERSION(2,0); + else + pCaps->PixelShaderVersion = WINED3DPS_VERSION(3,0); + + /* FIXME: The following line is card dependent. -8.0 to 8.0 is the + * Direct3D minimum requirement. + * + * Both GL_ARB_fragment_program and GLSL require a "maximum representable magnitude" + * of colors to be 2^10, and 2^32 for other floats. Should we use 1024 here? + * + * The problem is that the refrast clamps temporary results in the shader to + * [-MaxValue;+MaxValue]. If the card's max value is bigger than the one we advertize here, + * then applications may miss the clamping behavior. On the other hand, if it is smaller, + * the shader will generate incorrect results too. Unfortunately, GL deliberately doesn't + * offer a way to query this. + */ + pCaps->PixelShader1xMaxValue = 8.0; + TRACE_(d3d_caps)("Hardware pixel shader version %d.%d enabled (GLSL)\n", (pCaps->PixelShaderVersion >> 8) & 0xff, pCaps->PixelShaderVersion & 0xff); +} + +static void shader_glsl_load_init(void) {} + const shader_backend_t glsl_shader_backend = { &shader_glsl_select, &shader_glsl_select_depth_blt, @@ -3372,5 +3592,10 @@ const shader_backend_t glsl_shader_backend = { &shader_glsl_destroy, &shader_glsl_alloc, &shader_glsl_free, - &shader_glsl_dirty_const + &shader_glsl_dirty_const, + &shader_glsl_generate_pshader, + &shader_glsl_generate_vshader, + &shader_glsl_get_caps, + &shader_glsl_load_init, + FFPStateTable }; diff --git a/dlls/wined3d/palette.c b/dlls/wined3d/palette.c index df722469129..95b8da9e7fc 100644 --- a/dlls/wined3d/palette.c +++ b/dlls/wined3d/palette.c @@ -157,17 +157,6 @@ static HRESULT WINAPI IWineD3DPaletteImpl_SetEntries(IWineD3DPalette *iface, DW } } - /* If the palette is the primary palette, set the entries to the device */ - if(This->Flags & WINEDDPCAPS_PRIMARYSURFACE) { - unsigned int i; - IWineD3DDeviceImpl *device = This->wineD3DDevice; - PALETTEENTRY *entry = PalEnt; - - for(i = Start; i < Start+Count; i++) { - device->palettes[device->currentPalette][i] = *entry++; - } - } - return WINED3D_OK; } diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c index ec7167c48f7..ec05491f533 100644 --- a/dlls/wined3d/pixelshader.c +++ b/dlls/wined3d/pixelshader.c @@ -280,13 +280,9 @@ static void pshader_set_limits( /** Generate a pixel shader string using either GL_FRAGMENT_PROGRAM_ARB or GLSL and send it to the card */ static inline VOID IWineD3DPixelShaderImpl_GenerateShader( - IWineD3DPixelShader *iface, - shader_reg_maps* reg_maps, - CONST DWORD *pFunction) { - + IWineD3DPixelShader *iface) { IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *)iface; SHADER_BUFFER buffer; - const char *fragcolor; #if 0 /* FIXME: Use the buffer that is held by the device, this is ok since fixups will be skipped for software shaders it also requires entering a critical section but cuts down the runtime footprint of wined3d and any memory fragmentation that may occur... */ @@ -304,168 +300,7 @@ static inline VOID IWineD3DPixelShaderImpl_GenerateShader( buffer.lineNo = 0; buffer.newline = TRUE; - if (This->baseShader.shader_mode == SHADER_GLSL) { - - /* Create the hw GLSL shader object and assign it as the baseShader.prgId */ - GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB)); - - if (GL_SUPPORT(ARB_DRAW_BUFFERS)) { - shader_addline(&buffer, "#extension GL_ARB_draw_buffers : enable\n"); - } - if (GL_SUPPORT(ARB_TEXTURE_RECTANGLE)) { - /* The spec says that it doesn't have to be explicitly enabled, but the nvidia - * drivers write a warning if we don't do so - */ - shader_addline(&buffer, "#extension GL_ARB_texture_rectangle : enable\n"); - } - - /* Base Declarations */ - shader_generate_glsl_declarations( (IWineD3DBaseShader*) This, reg_maps, &buffer, &GLINFO_LOCATION); - - /* Pack 3.0 inputs */ - if (This->baseShader.hex_version >= WINED3DPS_VERSION(3,0)) { - - if(((IWineD3DDeviceImpl *) This->baseShader.device)->strided_streams.u.s.position_transformed) { - This->vertexprocessing = pretransformed; - pshader_glsl_input_pack(&buffer, This->semantics_in, iface); - } else if(!use_vs((IWineD3DDeviceImpl *) This->baseShader.device)) { - This->vertexprocessing = fixedfunction; - pshader_glsl_input_pack(&buffer, This->semantics_in, iface); - } else { - This->vertexprocessing = vertexshader; - } - } - - /* Base Shader Body */ - shader_generate_main( (IWineD3DBaseShader*) This, &buffer, reg_maps, pFunction); - - /* Pixel shaders < 2.0 place the resulting color in R0 implicitly */ - if (This->baseShader.hex_version < WINED3DPS_VERSION(2,0)) { - /* Some older cards like GeforceFX ones don't support multiple buffers, so also not gl_FragData */ - if(GL_SUPPORT(ARB_DRAW_BUFFERS)) - shader_addline(&buffer, "gl_FragData[0] = R0;\n"); - else - shader_addline(&buffer, "gl_FragColor = R0;\n"); - } - - if(GL_SUPPORT(ARB_DRAW_BUFFERS)) { - fragcolor = "gl_FragData[0]"; - } else { - fragcolor = "gl_FragColor"; - } - if(This->srgb_enabled) { - shader_addline(&buffer, "tmp0.xyz = pow(%s.xyz, vec3(%f, %f, %f)) * vec3(%f, %f, %f) - vec3(%f, %f, %f);\n", - fragcolor, srgb_pow, srgb_pow, srgb_pow, srgb_mul_high, srgb_mul_high, srgb_mul_high, - srgb_sub_high, srgb_sub_high, srgb_sub_high); - shader_addline(&buffer, "tmp1.xyz = %s.xyz * srgb_mul_low.xyz;\n", fragcolor); - shader_addline(&buffer, "%s.x = %s.x < srgb_comparison.x ? tmp1.x : tmp0.x;\n", fragcolor, fragcolor); - shader_addline(&buffer, "%s.y = %s.y < srgb_comparison.y ? tmp1.y : tmp0.y;\n", fragcolor, fragcolor); - shader_addline(&buffer, "%s.z = %s.z < srgb_comparison.z ? tmp1.z : tmp0.z;\n", fragcolor, fragcolor); - shader_addline(&buffer, "%s = clamp(%s, 0.0, 1.0);\n", fragcolor, fragcolor); - } - /* Pixel shader < 3.0 do not replace the fog stage. - * This implements linear fog computation and blending. - * TODO: non linear fog - * NOTE: gl_Fog.start and gl_Fog.end don't hold fog start s and end e but - * -1/(e-s) and e/(e-s) respectively. - */ - if(This->baseShader.hex_version < WINED3DPS_VERSION(3,0)) { - shader_addline(&buffer, "float Fog = clamp(gl_FogFragCoord * gl_Fog.start + gl_Fog.end, 0.0, 1.0);\n"); - shader_addline(&buffer, "%s.xyz = mix(gl_Fog.color.xyz, %s.xyz, Fog);\n", fragcolor, fragcolor); - } - - shader_addline(&buffer, "}\n"); - - TRACE("Compiling shader object %u\n", shader_obj); - GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer.buffer, NULL)); - GL_EXTCALL(glCompileShaderARB(shader_obj)); - print_glsl_info_log(&GLINFO_LOCATION, shader_obj); - - /* Store the shader object */ - This->baseShader.prgId = shader_obj; - - } else if (This->baseShader.shader_mode == SHADER_ARB) { - /* Create the hw ARB shader */ - shader_addline(&buffer, "!!ARBfp1.0\n"); - - shader_addline(&buffer, "TEMP TMP;\n"); /* Used in matrix ops */ - shader_addline(&buffer, "TEMP TMP2;\n"); /* Used in matrix ops */ - shader_addline(&buffer, "TEMP TA;\n"); /* Used for modifiers */ - shader_addline(&buffer, "TEMP TB;\n"); /* Used for modifiers */ - shader_addline(&buffer, "TEMP TC;\n"); /* Used for modifiers */ - shader_addline(&buffer, "PARAM coefdiv = { 0.5, 0.25, 0.125, 0.0625 };\n"); - shader_addline(&buffer, "PARAM coefmul = { 2, 4, 8, 16 };\n"); - shader_addline(&buffer, "PARAM one = { 1.0, 1.0, 1.0, 1.0 };\n"); - - /* Base Declarations */ - shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, &buffer, &GLINFO_LOCATION); - - /* We need two variables for fog blending */ - shader_addline(&buffer, "TEMP TMP_FOG;\n"); - if (This->baseShader.hex_version >= WINED3DPS_VERSION(2,0)) { - shader_addline(&buffer, "TEMP TMP_COLOR;\n"); - } - - /* Base Shader Body */ - shader_generate_main( (IWineD3DBaseShader*) This, &buffer, reg_maps, pFunction); - - /* calculate fog and blend it - * NOTE: state.fog.params.y and state.fog.params.z don't hold fog start s and end e but - * -1/(e-s) and e/(e-s) respectively. - */ - shader_addline(&buffer, "MAD_SAT TMP_FOG, fragment.fogcoord, state.fog.params.y, state.fog.params.z;\n"); - - if (This->baseShader.hex_version < WINED3DPS_VERSION(2,0)) { - fragcolor = "R0"; - } else { - fragcolor = "TMP_COLOR"; - } - if(This->srgb_enabled) { - /* Perform sRGB write correction. See GLX_EXT_framebuffer_sRGB */ - - /* Calculate the > 0.0031308 case */ - shader_addline(&buffer, "POW TMP.x, %s.x, srgb_pow.x;\n", fragcolor); - shader_addline(&buffer, "POW TMP.y, %s.y, srgb_pow.y;\n", fragcolor); - shader_addline(&buffer, "POW TMP.z, %s.z, srgb_pow.z;\n", fragcolor); - shader_addline(&buffer, "MUL TMP, TMP, srgb_mul_hi;\n"); - shader_addline(&buffer, "SUB TMP, TMP, srgb_sub_hi;\n"); - /* Calculate the < case */ - shader_addline(&buffer, "MUL TMP2, srgb_mul_low, %s;\n", fragcolor); - /* Get 1.0 / 0.0 masks for > 0.0031308 and < 0.0031308 */ - shader_addline(&buffer, "SLT TA, srgb_comparison, %s;\n", fragcolor); - shader_addline(&buffer, "SGE TB, srgb_comparison, %s;\n", fragcolor); - /* Store the components > 0.0031308 in the destination */ - shader_addline(&buffer, "MUL %s, TMP, TA;\n", fragcolor); - /* Add the components that are < 0.0031308 */ - shader_addline(&buffer, "MAD result.color.xyz, TMP2, TB, %s;\n", fragcolor); - /* [0.0;1.0] clamping. Not needed, this is done implicitly */ - } - if (This->baseShader.hex_version < WINED3DPS_VERSION(3,0)) { - shader_addline(&buffer, "LRP result.color.rgb, TMP_FOG.x, %s, state.fog.color;\n", fragcolor); - shader_addline(&buffer, "MOV result.color.a, %s.a;\n", fragcolor); - } - - shader_addline(&buffer, "END\n"); - - /* TODO: change to resource.glObjectHandle or something like that */ - GL_EXTCALL(glGenProgramsARB(1, &This->baseShader.prgId)); - - TRACE("Creating a hw pixel shader, prg=%d\n", This->baseShader.prgId); - GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, This->baseShader.prgId)); - - TRACE("Created hw pixel shader, prg=%d\n", This->baseShader.prgId); - /* Create the program and check for errors */ - GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, - buffer.bsize, buffer.buffer)); - - if (glGetError() == GL_INVALID_OPERATION) { - GLint errPos; - glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos); - FIXME("HW PixelShader Error at position %d: %s\n", - errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); - This->baseShader.prgId = -1; - } - } + ((IWineD3DDeviceImpl *)This->baseShader.device)->shader_backend->shader_generate_pshader(iface, &buffer); #if 1 /* if were using the data buffer of device then we don't need to free it */ HeapFree(GetProcessHeap(), 0, buffer.buffer); @@ -652,7 +487,7 @@ static HRESULT WINAPI IWineD3DPixelShaderImpl_CompileShader(IWineD3DPixelShader /* Generate the HW shader */ TRACE("(%p) : Generating hardware program\n", This); - IWineD3DPixelShaderImpl_GenerateShader(iface, &This->baseShader.reg_maps, function); + IWineD3DPixelShaderImpl_GenerateShader(iface); This->baseShader.is_compiled = TRUE; diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 355a5b6d965..171827371bc 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -243,8 +243,18 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D if (stateblock->renderState[WINED3DRS_ALPHABLENDENABLE] || stateblock->renderState[WINED3DRS_EDGEANTIALIAS] || stateblock->renderState[WINED3DRS_ANTIALIASEDLINEENABLE]) { - glEnable(GL_BLEND); - checkGLcall("glEnable GL_BLEND"); + const GlPixelFormatDesc *glDesc; + getFormatDescEntry(target->resource.format, &GLINFO_LOCATION, &glDesc); + + /* When pixel shaders are used on a format that doesn't offer blending, disable blending else we could face a big performance penalty. */ + if(!(glDesc->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) && use_ps(stateblock->wineD3DDevice)) { + glDisable(GL_BLEND); + checkGLcall("glDisable GL_BLEND"); + return; + } else { + glEnable(GL_BLEND); + checkGLcall("glEnable GL_BLEND"); + } } else { glDisable(GL_BLEND); checkGLcall("glDisable GL_BLEND"); @@ -435,6 +445,7 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D /* colorkey fixup for stage 0 alphaop depends on WINED3DRS_ALPHABLENDENABLE state, so it may need updating */ if (stateblock->renderState[WINED3DRS_COLORKEYENABLE]) { + const struct StateEntry *StateTable = stateblock->wineD3DDevice->shader_backend->StateTable; StateTable[STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP)].apply(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context); } } @@ -484,6 +495,7 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D } if(enable_ckey || context->last_was_ckey) { + const struct StateEntry *StateTable = stateblock->wineD3DDevice->shader_backend->StateTable; StateTable[STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP)].apply(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context); } context->last_was_ckey = enable_ckey; @@ -2605,7 +2617,7 @@ static void pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3D update_fog = TRUE; } - if(!isStateDirty(context, StateTable[STATE_VSHADER].representative)) { + if(!isStateDirty(context, FFPStateTable[STATE_VSHADER].representative)) { device->shader_backend->shader_select((IWineD3DDevice *)stateblock->wineD3DDevice, use_pshader, use_vshader); if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (use_vshader || use_pshader)) { @@ -3915,7 +3927,7 @@ static void frontface(DWORD state, IWineD3DStateBlockImpl *stateblock, WineD3DCo } } -const struct StateEntry StateTable[] = +const struct StateEntry FFPStateTable[] = { /* State name representative, apply function */ { /* 0, Undefined */ 0, state_undefined }, diff --git a/dlls/wined3d/stateblock.c b/dlls/wined3d/stateblock.c index e81a8edeec9..cdcf9698236 100644 --- a/dlls/wined3d/stateblock.c +++ b/dlls/wined3d/stateblock.c @@ -1239,18 +1239,6 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat This->textures[i] = NULL; } - /* Defaulting palettes - Note these are device wide but reinitialized here for convenience*/ - for (i = 0; i < MAX_PALETTES; ++i) { - int j; - for (j = 0; j < 256; ++j) { - This->wineD3DDevice->palettes[i][j].peRed = 0xFF; - This->wineD3DDevice->palettes[i][j].peGreen = 0xFF; - This->wineD3DDevice->palettes[i][j].peBlue = 0xFF; - This->wineD3DDevice->palettes[i][j].peFlags = 0xFF; - } - } - This->wineD3DDevice->currentPalette = 0; - /* Set default GLSL program to NULL. We won't actually create one * until the app sets a vertex or pixel shader */ This->glsl_program = NULL; diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index ed98a331a0a..8ed1513fec1 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -789,19 +789,24 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, CONST RECT *rect, v } } + LEAVE_GL(); + /* For P8 textures we need to perform an inverse palette lookup. This is done by searching for a palette * index which matches the RGB value. Note this isn't guaranteed to work when there are multiple entries for * the same color but we have no choice. * In case of P8 render targets, the index is stored in the alpha component so no conversion is needed. */ if((This->resource.format == WINED3DFMT_P8) && !primary_render_target_is_p8(myDevice)) { - PALETTEENTRY *pal; + PALETTEENTRY *pal = NULL; DWORD width = pitch / 3; int x, y, c; + if(This->palette) { pal = This->palette->palents; } else { - pal = This->resource.wineD3DDevice->palettes[This->resource.wineD3DDevice->currentPalette]; + ERR("Palette is missing, cannot perform inverse palette lookup\n"); + HeapFree(GetProcessHeap(), 0, mem); + return ; } for(y = local_rect.top; y < local_rect.bottom; y++) { @@ -824,7 +829,6 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, CONST RECT *rect, v } HeapFree(GetProcessHeap(), 0, mem); } - LEAVE_GL(); } /* Read the framebuffer contents into a texture */ @@ -1355,6 +1359,14 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHDC) { if (This->Flags & SFLAG_LOCKED) return WINED3DERR_INVALIDCALL; + /* According to Direct3D9 docs, only these formats are supported */ + if (((IWineD3DImpl *)This->resource.wineD3DDevice->wineD3D)->dxVersion > 7) { + if (This->resource.format != WINED3DFMT_R5G6B5 && + This->resource.format != WINED3DFMT_X1R5G5B5 && + This->resource.format != WINED3DFMT_R8G8B8 && + This->resource.format != WINED3DFMT_X8R8G8B8) return WINED3DERR_INVALIDCALL; + } + memset(&lock, 0, sizeof(lock)); /* To be sure */ /* Create a DIB section if there isn't a hdc yet */ @@ -1388,29 +1400,28 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHDC) { if(This->resource.format == WINED3DFMT_P8 || This->resource.format == WINED3DFMT_A8P8) { + /* GetDC on palettized formats is unsupported in D3D9, and the method is missing in + D3D8, so this should only be used for DX <=7 surfaces (with non-device palettes) */ unsigned int n; - if(This->palette) { - PALETTEENTRY ent[256]; + PALETTEENTRY *pal = NULL; - GetPaletteEntries(This->palette->hpal, 0, 256, ent); - for (n=0; n<256; n++) { - col[n].rgbRed = ent[n].peRed; - col[n].rgbGreen = ent[n].peGreen; - col[n].rgbBlue = ent[n].peBlue; - col[n].rgbReserved = 0; - } + if(This->palette) { + pal = This->palette->palents; } else { - IWineD3DDeviceImpl *device = This->resource.wineD3DDevice; + IWineD3DSurfaceImpl *dds_primary = (IWineD3DSurfaceImpl *)This->resource.wineD3DDevice->ddraw_primary; + if (dds_primary && dds_primary->palette) + pal = dds_primary->palette->palents; + } + if (pal) { for (n=0; n<256; n++) { - col[n].rgbRed = device->palettes[device->currentPalette][n].peRed; - col[n].rgbGreen = device->palettes[device->currentPalette][n].peGreen; - col[n].rgbBlue = device->palettes[device->currentPalette][n].peBlue; + col[n].rgbRed = pal[n].peRed; + col[n].rgbGreen = pal[n].peGreen; + col[n].rgbBlue = pal[n].peBlue; col[n].rgbReserved = 0; } - + SetDIBColorTable(This->hDC, 0, 256, col); } - SetDIBColorTable(This->hDC, 0, 256, col); } *pHDC = This->hDC; @@ -2031,15 +2042,13 @@ static void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4] return; } - /* Still no palette? Use the device's palette */ - /* can ddraw and d3d < 8 surfaces use device's palette (d3d >= 8 feature)? */ + /* Direct3D >= 8 palette usage style: P8 textures use device palettes, palette entry format is A8R8G8B8, + alpha is stored in peFlags and may be used by the app if D3DPTEXTURECAPS_ALPHAPALETTE device + capability flag is present (wine does advertise this capability) */ for (i = 0; i < 256; i++) { table[i][0] = device->palettes[device->currentPalette][i].peRed; table[i][1] = device->palettes[device->currentPalette][i].peGreen; table[i][2] = device->palettes[device->currentPalette][i].peBlue; - /* Direct3D >= 8 palette usage style: P8 textures use device palettes, palette entry format is A8R8G8B8, - alpha is stored in peFlags and may be used by the app if D3DPTEXTURECAPS_ALPHAPALETTE device - capability flag is present (wine does advertise this capability) */ table[i][3] = device->palettes[device->currentPalette][i].peFlags; } } else { @@ -3565,6 +3574,8 @@ HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface) { unsigned int n; TRACE("(%p)\n", This); + if (!pal) return WINED3D_OK; + if(This->resource.format == WINED3DFMT_P8 || This->resource.format == WINED3DFMT_A8P8) { @@ -3579,26 +3590,17 @@ HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface) { if(This->Flags & SFLAG_DIBSECTION) { TRACE("(%p): Updating the hdc's palette\n", This); for (n=0; n<256; n++) { - if(pal) { - col[n].rgbRed = pal->palents[n].peRed; - col[n].rgbGreen = pal->palents[n].peGreen; - col[n].rgbBlue = pal->palents[n].peBlue; - } else { - IWineD3DDeviceImpl *device = This->resource.wineD3DDevice; - /* Use the default device palette */ - col[n].rgbRed = device->palettes[device->currentPalette][n].peRed; - col[n].rgbGreen = device->palettes[device->currentPalette][n].peGreen; - col[n].rgbBlue = device->palettes[device->currentPalette][n].peBlue; - } + col[n].rgbRed = pal->palents[n].peRed; + col[n].rgbGreen = pal->palents[n].peGreen; + col[n].rgbBlue = pal->palents[n].peBlue; col[n].rgbReserved = 0; } SetDIBColorTable(This->hDC, 0, 256, col); } - /* Propagate the changes to the drawable when we have a palette. This function is also called - * when the palette is removed. + /* Propagate the changes to the drawable when we have a palette. * TODO: in case of hardware p8 palettes we should only upload the palette. */ - if(pal && (This->resource.usage & WINED3DUSAGE_RENDERTARGET)) + if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) IWineD3DSurface_LoadLocation(iface, SFLAG_INDRAWABLE, NULL); return WINED3D_OK; diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c index 00efa6cbda9..35d099a5ae2 100644 --- a/dlls/wined3d/surface_base.c +++ b/dlls/wined3d/surface_base.c @@ -206,26 +206,16 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetPalette(IWineD3DSurface *iface, IWineD if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) This->palette->Flags &= ~WINEDDPCAPS_PRIMARYSURFACE; + This->palette = PalImpl; + if(PalImpl != NULL) { if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) { - /* Set the device's main palette if the palette - * wasn't a primary palette before - */ - if(!(PalImpl->Flags & WINEDDPCAPS_PRIMARYSURFACE)) { - IWineD3DDeviceImpl *device = This->resource.wineD3DDevice; - unsigned int i; - - for(i=0; i < 256; i++) { - device->palettes[device->currentPalette][i] = PalImpl->palents[i]; - } - } - (PalImpl)->Flags |= WINEDDPCAPS_PRIMARYSURFACE; } - } - This->palette = PalImpl; - return IWineD3DSurface_RealizePalette(iface); + return IWineD3DSurface_RealizePalette(iface); + } + else return WINED3D_OK; } HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetColorKey(IWineD3DSurface *iface, DWORD Flags, WINEDDCOLORKEY *CKey) { diff --git a/dlls/wined3d/surface_gdi.c b/dlls/wined3d/surface_gdi.c index 183d552f746..1da1a6a48d7 100644 --- a/dlls/wined3d/surface_gdi.c +++ b/dlls/wined3d/surface_gdi.c @@ -579,28 +579,25 @@ HRESULT WINAPI IWineGDISurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHDC) { if(This->resource.format == WINED3DFMT_P8 || This->resource.format == WINED3DFMT_A8P8) { unsigned int n; - if(This->palette) { - PALETTEENTRY ent[256]; + PALETTEENTRY *pal = NULL; - GetPaletteEntries(This->palette->hpal, 0, 256, ent); - for (n=0; n<256; n++) { - col[n].rgbRed = ent[n].peRed; - col[n].rgbGreen = ent[n].peGreen; - col[n].rgbBlue = ent[n].peBlue; - col[n].rgbReserved = 0; - } + if(This->palette) { + pal = This->palette->palents; } else { - IWineD3DDeviceImpl *device = This->resource.wineD3DDevice; + IWineD3DSurfaceImpl *dds_primary = (IWineD3DSurfaceImpl *)This->resource.wineD3DDevice->ddraw_primary; + if (dds_primary && dds_primary->palette) + pal = dds_primary->palette->palents; + } + if (pal) { for (n=0; n<256; n++) { - col[n].rgbRed = device->palettes[device->currentPalette][n].peRed; - col[n].rgbGreen = device->palettes[device->currentPalette][n].peGreen; - col[n].rgbBlue = device->palettes[device->currentPalette][n].peBlue; + col[n].rgbRed = pal[n].peRed; + col[n].rgbGreen = pal[n].peGreen; + col[n].rgbBlue = pal[n].peBlue; col[n].rgbReserved = 0; } - + SetDIBColorTable(This->hDC, 0, 256, col); } - SetDIBColorTable(This->hDC, 0, 256, col); } *pHDC = This->hDC; @@ -638,30 +635,22 @@ HRESULT WINAPI IWineGDISurfaceImpl_RealizePalette(IWineD3DSurface *iface) { unsigned int n; TRACE("(%p)\n", This); + if (!pal) return WINED3D_OK; + if(This->Flags & SFLAG_DIBSECTION) { TRACE("(%p): Updating the hdc's palette\n", This); for (n=0; n<256; n++) { - if(pal) { - col[n].rgbRed = pal->palents[n].peRed; - col[n].rgbGreen = pal->palents[n].peGreen; - col[n].rgbBlue = pal->palents[n].peBlue; - } else { - IWineD3DDeviceImpl *device = This->resource.wineD3DDevice; - /* Use the default device palette */ - col[n].rgbRed = device->palettes[device->currentPalette][n].peRed; - col[n].rgbGreen = device->palettes[device->currentPalette][n].peGreen; - col[n].rgbBlue = device->palettes[device->currentPalette][n].peBlue; - } + col[n].rgbRed = pal->palents[n].peRed; + col[n].rgbGreen = pal->palents[n].peGreen; + col[n].rgbBlue = pal->palents[n].peBlue; col[n].rgbReserved = 0; } SetDIBColorTable(This->hDC, 0, 256, col); } - /* Update the image because of the palette change. Note that this function is also - * called on a palette removal. In such a case we don't have to update the screen. - * Some games like e.g Red Alert call SetEntries a lot to implement fading. - */ - if(pal && This->resource.usage & WINED3DUSAGE_RENDERTARGET) + /* Update the image because of the palette change. Some games like e.g Red Alert + call SetEntries a lot to implement fading. */ + if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) x11_copy_to_screen(This, NULL); return WINED3D_OK; diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index 8bcd0427bd3..35989978ea4 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -116,6 +116,7 @@ static const StaticPixelFormatDesc formats[] = { typedef struct { WINED3DFORMAT fmt; GLint glInternal, glGammaInternal, rtInternal, glFormat, glType; + unsigned int Flags; } GlPixelFormatDescTemplate; /***************************************************************************** @@ -125,78 +126,78 @@ typedef struct { * table. */ static const GlPixelFormatDescTemplate gl_formats_template[] = { - /*{ internal ,srgbInternal , rtInternal, format ,type }*/ - {WINED3DFMT_UNKNOWN ,0 ,0 , 0, 0 ,0 }, + /*{ internal ,srgbInternal , rtInternal, format ,type ,Flags }*/ + {WINED3DFMT_UNKNOWN ,0 ,0 , 0, 0 ,0 ,0 }, /* FourCC formats */ - {WINED3DFMT_UYVY ,0 ,0 , 0, 0 ,0 }, - {WINED3DFMT_YUY2 ,0 ,0 , 0, 0 ,0 }, - {WINED3DFMT_DXT1 ,GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ,GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT , 0, GL_RGBA ,GL_UNSIGNED_BYTE }, - {WINED3DFMT_DXT2 ,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT ,GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT , 0, GL_RGBA ,GL_UNSIGNED_BYTE }, - {WINED3DFMT_DXT3 ,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT ,GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT , 0, GL_RGBA ,GL_UNSIGNED_BYTE }, - {WINED3DFMT_DXT4 ,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT ,GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT , 0, GL_RGBA ,GL_UNSIGNED_BYTE }, - {WINED3DFMT_DXT5 ,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT ,GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT , 0, GL_RGBA ,GL_UNSIGNED_BYTE }, - {WINED3DFMT_MULTI2_ARGB8 ,0 ,0 , 0, 0 ,0 }, - {WINED3DFMT_G8R8_G8B8 ,0 ,0 , 0, 0 ,0 }, - {WINED3DFMT_R8G8_B8G8 ,0 ,0 , 0, 0 ,0 }, + {WINED3DFMT_UYVY ,0 ,0 , 0, 0 ,0 ,0 }, + {WINED3DFMT_YUY2 ,0 ,0 , 0, 0 ,0 ,0 }, + {WINED3DFMT_DXT1 ,GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ,GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT , 0, GL_RGBA ,GL_UNSIGNED_BYTE ,0 }, + {WINED3DFMT_DXT2 ,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT ,GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT , 0, GL_RGBA ,GL_UNSIGNED_BYTE ,0 }, + {WINED3DFMT_DXT3 ,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT ,GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT , 0, GL_RGBA ,GL_UNSIGNED_BYTE ,0 }, + {WINED3DFMT_DXT4 ,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT ,GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT , 0, GL_RGBA ,GL_UNSIGNED_BYTE ,0 }, + {WINED3DFMT_DXT5 ,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT ,GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT , 0, GL_RGBA ,GL_UNSIGNED_BYTE ,0 }, + {WINED3DFMT_MULTI2_ARGB8 ,0 ,0 , 0, 0 ,0 ,0 }, + {WINED3DFMT_G8R8_G8B8 ,0 ,0 , 0, 0 ,0 ,0 }, + {WINED3DFMT_R8G8_B8G8 ,0 ,0 , 0, 0 ,0 ,0 }, /* IEEE formats */ - {WINED3DFMT_R32F ,GL_RGB32F_ARB ,GL_RGB32F_ARB , 0, GL_RED ,GL_FLOAT }, - {WINED3DFMT_G32R32F ,0 ,0 , 0, 0 ,0 }, - {WINED3DFMT_A32B32G32R32F ,GL_RGBA32F_ARB ,GL_RGBA32F_ARB , 0, GL_RGBA ,GL_FLOAT }, + {WINED3DFMT_R32F ,GL_RGB32F_ARB ,GL_RGB32F_ARB , 0, GL_RED ,GL_FLOAT ,0 }, + {WINED3DFMT_G32R32F ,0 ,0 , 0, 0 ,0 ,0 }, + {WINED3DFMT_A32B32G32R32F ,GL_RGBA32F_ARB ,GL_RGBA32F_ARB , 0, GL_RGBA ,GL_FLOAT ,0 }, /* Hmm? */ - {WINED3DFMT_CxV8U8 ,0 ,0 , 0, 0 ,0 }, + {WINED3DFMT_CxV8U8 ,0 ,0 , 0, 0 ,0 ,0 }, /* Float */ - {WINED3DFMT_R16F ,GL_RGB16F_ARB ,GL_RGB16F_ARB , 0, GL_RED ,GL_HALF_FLOAT_ARB }, - {WINED3DFMT_G16R16F ,0 ,0 , 0, 0 ,0 }, - {WINED3DFMT_A16B16G16R16F ,GL_RGBA16F_ARB ,GL_RGBA16F_ARB , 0, GL_RGBA ,GL_HALF_FLOAT_ARB }, + {WINED3DFMT_R16F ,GL_RGB16F_ARB ,GL_RGB16F_ARB , 0, GL_RED ,GL_HALF_FLOAT_ARB ,0 }, + {WINED3DFMT_G16R16F ,0 ,0 , 0, 0 ,0 ,0 }, + {WINED3DFMT_A16B16G16R16F ,GL_RGBA16F_ARB ,GL_RGBA16F_ARB , 0, GL_RGBA ,GL_HALF_FLOAT_ARB ,0 }, /* Palettized formats */ - {WINED3DFMT_A8P8, 0 ,0 , 0, 0 ,0 }, - {WINED3DFMT_P8, GL_COLOR_INDEX8_EXT ,GL_COLOR_INDEX8_EXT , 0, GL_COLOR_INDEX ,GL_UNSIGNED_BYTE }, + {WINED3DFMT_A8P8, 0 ,0 , 0, 0 ,0 ,0 }, + {WINED3DFMT_P8, GL_COLOR_INDEX8_EXT ,GL_COLOR_INDEX8_EXT , 0, GL_COLOR_INDEX ,GL_UNSIGNED_BYTE ,0 }, /* Standard ARGB formats */ - {WINED3DFMT_R8G8B8 ,GL_RGB8 ,GL_RGB8 , 0, GL_BGR ,GL_UNSIGNED_BYTE }, - {WINED3DFMT_A8R8G8B8 ,GL_RGBA8 ,GL_SRGB8_ALPHA8_EXT , 0, GL_BGRA ,GL_UNSIGNED_INT_8_8_8_8_REV }, - {WINED3DFMT_X8R8G8B8 ,GL_RGB8 ,GL_SRGB8_EXT , 0, GL_BGRA ,GL_UNSIGNED_INT_8_8_8_8_REV }, - {WINED3DFMT_R5G6B5 ,GL_RGB5 ,GL_RGB5 , GL_RGB8, GL_RGB ,GL_UNSIGNED_SHORT_5_6_5 }, - {WINED3DFMT_X1R5G5B5 ,GL_RGB5 ,GL_RGB5_A1 , 0, GL_BGRA ,GL_UNSIGNED_SHORT_1_5_5_5_REV }, - {WINED3DFMT_A1R5G5B5 ,GL_RGB5_A1 ,GL_RGB5_A1 , 0, GL_BGRA ,GL_UNSIGNED_SHORT_1_5_5_5_REV }, - {WINED3DFMT_A4R4G4B4 ,GL_RGBA4 ,GL_SRGB8_ALPHA8_EXT , 0, GL_BGRA ,GL_UNSIGNED_SHORT_4_4_4_4_REV }, - {WINED3DFMT_R3G3B2 ,GL_R3_G3_B2 ,GL_R3_G3_B2 , 0, GL_RGB ,GL_UNSIGNED_BYTE_3_3_2 }, - {WINED3DFMT_A8 ,GL_ALPHA8 ,GL_ALPHA8 , 0, GL_ALPHA ,GL_UNSIGNED_BYTE }, - {WINED3DFMT_A8R3G3B2 ,0 ,0 , 0, 0 ,0 }, - {WINED3DFMT_X4R4G4B4 ,GL_RGB4 ,GL_RGB4 , 0, GL_BGRA ,GL_UNSIGNED_SHORT_4_4_4_4_REV }, - {WINED3DFMT_A2B10G10R10 ,GL_RGBA ,GL_RGBA , 0, GL_RGBA ,GL_UNSIGNED_INT_2_10_10_10_REV }, - {WINED3DFMT_A8B8G8R8 ,GL_RGBA8 ,GL_RGBA8 , 0, GL_RGBA ,GL_UNSIGNED_INT_8_8_8_8_REV }, - {WINED3DFMT_X8B8G8R8 ,GL_RGB8 ,GL_RGB8 , 0, GL_RGBA ,GL_UNSIGNED_INT_8_8_8_8_REV }, - {WINED3DFMT_G16R16 ,GL_RGB16_EXT ,GL_RGB16_EXT , 0, GL_RGB ,GL_UNSIGNED_SHORT }, - {WINED3DFMT_A2R10G10B10 ,GL_RGBA ,GL_RGBA , 0, GL_BGRA ,GL_UNSIGNED_INT_2_10_10_10_REV }, - {WINED3DFMT_A16B16G16R16 ,GL_RGBA16_EXT ,GL_RGBA16_EXT , 0, GL_RGBA ,GL_UNSIGNED_SHORT }, + {WINED3DFMT_R8G8B8 ,GL_RGB8 ,GL_RGB8 , 0, GL_BGR ,GL_UNSIGNED_BYTE ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_A8R8G8B8 ,GL_RGBA8 ,GL_SRGB8_ALPHA8_EXT , 0, GL_BGRA ,GL_UNSIGNED_INT_8_8_8_8_REV ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_X8R8G8B8 ,GL_RGB8 ,GL_SRGB8_EXT , 0, GL_BGRA ,GL_UNSIGNED_INT_8_8_8_8_REV ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_R5G6B5 ,GL_RGB5 ,GL_RGB5 , GL_RGB8, GL_RGB ,GL_UNSIGNED_SHORT_5_6_5 ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_X1R5G5B5 ,GL_RGB5 ,GL_RGB5_A1 , 0, GL_BGRA ,GL_UNSIGNED_SHORT_1_5_5_5_REV ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_A1R5G5B5 ,GL_RGB5_A1 ,GL_RGB5_A1 , 0, GL_BGRA ,GL_UNSIGNED_SHORT_1_5_5_5_REV ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_A4R4G4B4 ,GL_RGBA4 ,GL_SRGB8_ALPHA8_EXT , 0, GL_BGRA ,GL_UNSIGNED_SHORT_4_4_4_4_REV ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_R3G3B2 ,GL_R3_G3_B2 ,GL_R3_G3_B2 , 0, GL_RGB ,GL_UNSIGNED_BYTE_3_3_2 ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_A8 ,GL_ALPHA8 ,GL_ALPHA8 , 0, GL_ALPHA ,GL_UNSIGNED_BYTE ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_A8R3G3B2 ,0 ,0 , 0, 0 ,0 ,0 }, + {WINED3DFMT_X4R4G4B4 ,GL_RGB4 ,GL_RGB4 , 0, GL_BGRA ,GL_UNSIGNED_SHORT_4_4_4_4_REV ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_A2B10G10R10 ,GL_RGBA ,GL_RGBA , 0, GL_RGBA ,GL_UNSIGNED_INT_2_10_10_10_REV ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_A8B8G8R8 ,GL_RGBA8 ,GL_RGBA8 , 0, GL_RGBA ,GL_UNSIGNED_INT_8_8_8_8_REV ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_X8B8G8R8 ,GL_RGB8 ,GL_RGB8 , 0, GL_RGBA ,GL_UNSIGNED_INT_8_8_8_8_REV ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_G16R16 ,GL_RGB16_EXT ,GL_RGB16_EXT , 0, GL_RGB ,GL_UNSIGNED_SHORT ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_A2R10G10B10 ,GL_RGBA ,GL_RGBA , 0, GL_BGRA ,GL_UNSIGNED_INT_2_10_10_10_REV ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, + {WINED3DFMT_A16B16G16R16 ,GL_RGBA16_EXT ,GL_RGBA16_EXT , 0, GL_RGBA ,GL_UNSIGNED_SHORT ,WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING }, /* Luminance */ - {WINED3DFMT_L8 ,GL_LUMINANCE8 ,GL_SLUMINANCE8_EXT , 0, GL_LUMINANCE ,GL_UNSIGNED_BYTE }, - {WINED3DFMT_A8L8 ,GL_LUMINANCE8_ALPHA8 ,GL_SLUMINANCE8_ALPHA8_EXT , 0, GL_LUMINANCE_ALPHA ,GL_UNSIGNED_BYTE }, - {WINED3DFMT_A4L4 ,GL_LUMINANCE4_ALPHA4 ,GL_LUMINANCE4_ALPHA4 , 0, GL_LUMINANCE_ALPHA ,GL_UNSIGNED_BYTE }, + {WINED3DFMT_L8 ,GL_LUMINANCE8 ,GL_SLUMINANCE8_EXT , 0, GL_LUMINANCE ,GL_UNSIGNED_BYTE ,0 }, + {WINED3DFMT_A8L8 ,GL_LUMINANCE8_ALPHA8 ,GL_SLUMINANCE8_ALPHA8_EXT , 0, GL_LUMINANCE_ALPHA ,GL_UNSIGNED_BYTE ,0 }, + {WINED3DFMT_A4L4 ,GL_LUMINANCE4_ALPHA4 ,GL_LUMINANCE4_ALPHA4 , 0, GL_LUMINANCE_ALPHA ,GL_UNSIGNED_BYTE ,0 }, /* Bump mapping stuff */ - {WINED3DFMT_V8U8 ,GL_DSDT8_NV ,GL_DSDT8_NV , 0, GL_DSDT_NV ,GL_BYTE }, - {WINED3DFMT_L6V5U5 ,GL_DSDT8_MAG8_NV ,GL_DSDT8_MAG8_NV , 0, GL_DSDT_MAG_NV ,GL_BYTE }, - {WINED3DFMT_X8L8V8U8 ,GL_DSDT8_MAG8_INTENSITY8_NV ,GL_DSDT8_MAG8_INTENSITY8_NV , 0, GL_DSDT_MAG_VIB_NV ,GL_UNSIGNED_INT_8_8_S8_S8_REV_NV}, - {WINED3DFMT_Q8W8V8U8 ,GL_SIGNED_RGBA8_NV ,GL_SIGNED_RGBA8_NV , 0, GL_RGBA ,GL_BYTE }, - {WINED3DFMT_V16U16 ,GL_SIGNED_HILO16_NV ,GL_SIGNED_HILO16_NV , 0, GL_HILO_NV ,GL_SHORT }, - {WINED3DFMT_W11V11U10 ,0 ,0 , 0, 0 ,0 }, - {WINED3DFMT_A2W10V10U10 ,0 ,0 , 0, 0 ,0 }, + {WINED3DFMT_V8U8 ,GL_DSDT8_NV ,GL_DSDT8_NV , 0, GL_DSDT_NV ,GL_BYTE ,0 }, + {WINED3DFMT_L6V5U5 ,GL_DSDT8_MAG8_NV ,GL_DSDT8_MAG8_NV , 0, GL_DSDT_MAG_NV ,GL_BYTE ,0 }, + {WINED3DFMT_X8L8V8U8 ,GL_DSDT8_MAG8_INTENSITY8_NV ,GL_DSDT8_MAG8_INTENSITY8_NV , 0, GL_DSDT_MAG_VIB_NV ,GL_UNSIGNED_INT_8_8_S8_S8_REV_NV,0 }, + {WINED3DFMT_Q8W8V8U8 ,GL_SIGNED_RGBA8_NV ,GL_SIGNED_RGBA8_NV , 0, GL_RGBA ,GL_BYTE ,0 }, + {WINED3DFMT_V16U16 ,GL_SIGNED_HILO16_NV ,GL_SIGNED_HILO16_NV , 0, GL_HILO_NV ,GL_SHORT ,0 }, + {WINED3DFMT_W11V11U10 ,0 ,0 , 0, 0 ,0 ,0 }, + {WINED3DFMT_A2W10V10U10 ,0 ,0 , 0, 0 ,0 ,0 }, /* Depth stencil formats */ - {WINED3DFMT_D16_LOCKABLE ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_SHORT }, - {WINED3DFMT_D32 ,GL_DEPTH_COMPONENT32_ARB ,GL_DEPTH_COMPONENT32_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_INT }, - {WINED3DFMT_D15S1 ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_SHORT }, - {WINED3DFMT_D24S8 ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_INT }, - {WINED3DFMT_D24X8 ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_INT }, - {WINED3DFMT_D24X4S4 ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_INT }, - {WINED3DFMT_D16 ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_SHORT }, - {WINED3DFMT_L16 ,GL_LUMINANCE16_EXT ,GL_LUMINANCE16_EXT , 0, GL_LUMINANCE ,GL_UNSIGNED_SHORT }, - {WINED3DFMT_D32F_LOCKABLE ,GL_DEPTH_COMPONENT32_ARB ,GL_DEPTH_COMPONENT32_ARB , 0, GL_DEPTH_COMPONENT ,GL_FLOAT }, - {WINED3DFMT_D24FS8 ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_FLOAT }, + {WINED3DFMT_D16_LOCKABLE ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_SHORT ,0 }, + {WINED3DFMT_D32 ,GL_DEPTH_COMPONENT32_ARB ,GL_DEPTH_COMPONENT32_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_INT ,0 }, + {WINED3DFMT_D15S1 ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_SHORT ,0 }, + {WINED3DFMT_D24S8 ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_INT ,0 }, + {WINED3DFMT_D24X8 ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_INT ,0 }, + {WINED3DFMT_D24X4S4 ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_INT ,0 }, + {WINED3DFMT_D16 ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_UNSIGNED_SHORT ,0 }, + {WINED3DFMT_L16 ,GL_LUMINANCE16_EXT ,GL_LUMINANCE16_EXT , 0, GL_LUMINANCE ,GL_UNSIGNED_SHORT ,0 }, + {WINED3DFMT_D32F_LOCKABLE ,GL_DEPTH_COMPONENT32_ARB ,GL_DEPTH_COMPONENT32_ARB , 0, GL_DEPTH_COMPONENT ,GL_FLOAT ,0 }, + {WINED3DFMT_D24FS8 ,GL_DEPTH_COMPONENT24_ARB ,GL_DEPTH_COMPONENT24_ARB , 0, GL_DEPTH_COMPONENT ,GL_FLOAT ,0 }, /* Is this a vertex buffer? */ - {WINED3DFMT_VERTEXDATA ,0 ,0 , 0, 0 ,0 }, - {WINED3DFMT_INDEX16 ,0 ,0 , 0, 0 ,0 }, - {WINED3DFMT_INDEX32 ,0 ,0 , 0, 0 ,0 }, - {WINED3DFMT_Q16W16V16U16 ,GL_COLOR_INDEX ,GL_COLOR_INDEX , 0, GL_COLOR_INDEX ,GL_UNSIGNED_SHORT } + {WINED3DFMT_VERTEXDATA ,0 ,0 , 0, 0 ,0 ,0 }, + {WINED3DFMT_INDEX16 ,0 ,0 , 0, 0 ,0 ,0 }, + {WINED3DFMT_INDEX32 ,0 ,0 , 0, 0 ,0 ,0 }, + {WINED3DFMT_Q16W16V16U16 ,GL_COLOR_INDEX ,GL_COLOR_INDEX , 0, GL_COLOR_INDEX ,GL_UNSIGNED_SHORT ,0 } }; static inline int getFmtIdx(WINED3DFORMAT fmt) { @@ -236,6 +237,7 @@ BOOL initPixelFormats(WineD3D_GL_Info *gl_info) gl_info->gl_formats[dst].glFormat = gl_formats_template[src].glFormat; gl_info->gl_formats[dst].glType = gl_formats_template[src].glType; gl_info->gl_formats[dst].conversion_group= WINED3DFMT_UNKNOWN; + gl_info->gl_formats[dst].Flags = gl_formats_template[src].Flags; if(wined3d_settings.offscreen_rendering_mode == ORM_FBO && gl_formats_template[src].rtInternal != 0) { @@ -3156,3 +3158,152 @@ void *hash_table_get(hash_table_t *table, void *key) return entry ? entry->value : NULL; } + +#define GLINFO_LOCATION stateblock->wineD3DDevice->adapter->gl_info +void gen_ffp_op(IWineD3DStateBlockImpl *stateblock, struct texture_stage_op op[MAX_TEXTURES]) { +#define ARG1 0x01 +#define ARG2 0x02 +#define ARG0 0x04 + static const unsigned char args[WINED3DTOP_LERP + 1] = { + /* undefined */ 0, + /* D3DTOP_DISABLE */ 0, + /* D3DTOP_SELECTARG1 */ ARG1, + /* D3DTOP_SELECTARG2 */ ARG2, + /* D3DTOP_MODULATE */ ARG1 | ARG2, + /* D3DTOP_MODULATE2X */ ARG1 | ARG2, + /* D3DTOP_MODULATE4X */ ARG1 | ARG2, + /* D3DTOP_ADD */ ARG1 | ARG2, + /* D3DTOP_ADDSIGNED */ ARG1 | ARG2, + /* D3DTOP_ADDSIGNED2X */ ARG1 | ARG2, + /* D3DTOP_SUBTRACT */ ARG1 | ARG2, + /* D3DTOP_ADDSMOOTH */ ARG1 | ARG2, + /* D3DTOP_BLENDDIFFUSEALPHA */ ARG1 | ARG2, + /* D3DTOP_BLENDTEXTUREALPHA */ ARG1 | ARG2, + /* D3DTOP_BLENDFACTORALPHA */ ARG1 | ARG2, + /* D3DTOP_BLENDTEXTUREALPHAPM */ ARG1 | ARG2, + /* D3DTOP_BLENDCURRENTALPHA */ ARG1 | ARG2, + /* D3DTOP_PREMODULATE */ ARG1 | ARG2, + /* D3DTOP_MODULATEALPHA_ADDCOLOR */ ARG1 | ARG2, + /* D3DTOP_MODULATECOLOR_ADDALPHA */ ARG1 | ARG2, + /* D3DTOP_MODULATEINVALPHA_ADDCOLOR */ ARG1 | ARG2, + /* D3DTOP_MODULATEINVCOLOR_ADDALPHA */ ARG1 | ARG2, + /* D3DTOP_BUMPENVMAP */ ARG1 | ARG2, + /* D3DTOP_BUMPENVMAPLUMINANCE */ ARG1 | ARG2, + /* D3DTOP_DOTPRODUCT3 */ ARG1 | ARG2, + /* D3DTOP_MULTIPLYADD */ ARG1 | ARG2 | ARG0, + /* D3DTOP_LERP */ ARG1 | ARG2 | ARG0 + }; + unsigned int i; + DWORD ttff; + + for(i = 0; i < GL_LIMITS(texture_stages); i++) { + IWineD3DBaseTextureImpl *texture; + if(stateblock->textureState[i][WINED3DTSS_COLOROP] == WINED3DTOP_DISABLE) { + op[i].cop = WINED3DTOP_DISABLE; + op[i].aop = WINED3DTOP_DISABLE; + op[i].carg0 = op[i].carg1 = op[i].carg2 = 0xffffffff; + op[i].aarg0 = op[i].aarg1 = op[i].aarg2 = 0xffffffff; + op[i].color_correction = WINED3DFMT_UNKNOWN; + i++; + break; + } + + texture = (IWineD3DBaseTextureImpl *) stateblock->textures[i]; + op[i].color_correction = texture ? texture->baseTexture.shader_conversion_group : WINED3DFMT_UNKNOWN; + + op[i].cop = stateblock->textureState[i][WINED3DTSS_COLOROP]; + op[i].aop = stateblock->textureState[i][WINED3DTSS_ALPHAOP]; + + op[i].carg1 = (args[op[i].cop] & ARG1) ? stateblock->textureState[i][WINED3DTSS_COLORARG1] : 0xffffffff; + op[i].carg2 = (args[op[i].cop] & ARG2) ? stateblock->textureState[i][WINED3DTSS_COLORARG2] : 0xffffffff; + op[i].carg0 = (args[op[i].cop] & ARG0) ? stateblock->textureState[i][WINED3DTSS_COLORARG0] : 0xffffffff; + + if(is_invalid_op(stateblock->wineD3DDevice, i, op[i].cop, op[i].carg1, op[i].carg2, op[i].carg0)) { + op[i].carg0 = 0xffffffff; + op[i].carg2 = 0xffffffff; + op[i].carg1 = WINED3DTA_CURRENT; + op[i].cop = WINED3DTOP_SELECTARG1; + } + + op[i].aarg1 = (args[op[i].aop] & ARG1) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG1] : 0xffffffff; + op[i].aarg2 = (args[op[i].aop] & ARG2) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG2] : 0xffffffff; + op[i].aarg0 = (args[op[i].aop] & ARG0) ? stateblock->textureState[i][WINED3DTSS_ALPHAARG0] : 0xffffffff; + + if(is_invalid_op(stateblock->wineD3DDevice, i, op[i].aop, op[i].aarg1, op[i].aarg2, op[i].aarg0)) { + op[i].aarg0 = 0xffffffff; + op[i].aarg2 = 0xffffffff; + op[i].aarg1 = WINED3DTA_CURRENT; + op[i].aop = WINED3DTOP_SELECTARG1; + } else if(i == 0 && stateblock->textures[0] && + stateblock->renderState[WINED3DRS_COLORKEYENABLE] && + (stateblock->textureDimensions[0] == GL_TEXTURE_2D || + stateblock->textureDimensions[0] == GL_TEXTURE_RECTANGLE_ARB)) { + IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *) ((IWineD3DTextureImpl *) stateblock->textures[0])->surfaces[0]; + + if(surf->CKeyFlags & WINEDDSD_CKSRCBLT && + getFormatDescEntry(surf->resource.format, NULL, NULL)->alphaMask == 0x00000000) { + + if(op[0].aop == WINED3DTOP_DISABLE) { + op[0].aarg1 = WINED3DTA_TEXTURE; + op[0].aop = WINED3DTOP_SELECTARG1; + } + else if(op[0].aop == WINED3DTOP_SELECTARG1 && op[0].aarg1 != WINED3DTA_TEXTURE) { + if (stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) { + op[0].aarg2 = WINED3DTA_TEXTURE; + op[0].aop = WINED3DTOP_MODULATE; + } + else op[0].aarg1 = WINED3DTA_TEXTURE; + } + else if(op[0].aop == WINED3DTOP_SELECTARG2 && op[0].aarg2 != WINED3DTA_TEXTURE) { + if (stateblock->renderState[WINED3DRS_ALPHABLENDENABLE]) { + op[0].aarg1 = WINED3DTA_TEXTURE; + op[0].aop = WINED3DTOP_MODULATE; + } + else op[0].aarg2 = WINED3DTA_TEXTURE; + } + } + } + + if(op[i].carg1 == WINED3DTA_TEXTURE || op[i].carg2 == WINED3DTA_TEXTURE || op[i].carg0 == WINED3DTA_TEXTURE || + op[i].aarg1 == WINED3DTA_TEXTURE || op[i].aarg2 == WINED3DTA_TEXTURE || op[i].aarg0 == WINED3DTA_TEXTURE) { + ttff = stateblock->textureState[i][WINED3DTSS_TEXTURETRANSFORMFLAGS]; + if(ttff == (WINED3DTTFF_PROJECTED | WINED3DTTFF_COUNT3)) { + op[i].projected = proj_count3; + } else if(ttff == (WINED3DTTFF_PROJECTED | WINED3DTTFF_COUNT4)) { + op[i].projected = proj_count4; + } else { + op[i].projected = proj_none; + } + } else { + op[i].projected = proj_none; + } + } + + /* Clear unsupported stages */ + for(; i < MAX_TEXTURES; i++) { + memset(&op[i], 0xff, sizeof(op[i])); + } +} +#undef GLINFO_LOCATION + +struct ffp_desc *find_ffp_shader(struct list *shaders, struct texture_stage_op op[MAX_TEXTURES]) +{ + struct ffp_desc *entry; + + /* TODO: Optimize this. Finding the shader can be optimized by e.g. sorting the list, + * or maybe consider using hashtables + */ + LIST_FOR_EACH_ENTRY(entry, shaders, struct ffp_desc, entry) { + if(memcmp(op, entry->op, sizeof(struct texture_stage_op) * MAX_TEXTURES) == 0) { + TRACE("Found shader entry %p\n", entry); + return entry; + } + } + + TRACE("Shader not found\n"); + return NULL; +} + +void add_ffp_shader(struct list *shaders, struct ffp_desc *desc) { + list_add_head(shaders, &desc->entry); +} diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c index 71b61d5fb85..8a6102393b0 100644 --- a/dlls/wined3d/vertexshader.c +++ b/dlls/wined3d/vertexshader.c @@ -360,131 +360,7 @@ static VOID IWineD3DVertexShaderImpl_GenerateShader( buffer.lineNo = 0; buffer.newline = TRUE; - if (This->baseShader.shader_mode == SHADER_GLSL) { - - /* Create the hw GLSL shader program and assign it as the baseShader.prgId */ - GLhandleARB shader_obj = GL_EXTCALL(glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB)); - - /* Base Declarations */ - shader_generate_glsl_declarations( (IWineD3DBaseShader*) This, reg_maps, &buffer, &GLINFO_LOCATION); - - /* Base Shader Body */ - shader_generate_main( (IWineD3DBaseShader*) This, &buffer, reg_maps, pFunction); - - /* Unpack 3.0 outputs */ - if (This->baseShader.hex_version >= WINED3DVS_VERSION(3,0)) { - shader_addline(&buffer, "order_ps_input(OUT);\n"); - } else { - shader_addline(&buffer, "order_ps_input();\n"); - } - - /* If this shader doesn't use fog copy the z coord to the fog coord so that we can use table fog */ - if (!reg_maps->fog) - shader_addline(&buffer, "gl_FogFragCoord = gl_Position.z;\n"); - - /* Write the final position. - * - * OpenGL coordinates specify the center of the pixel while d3d coords specify - * the corner. The offsets are stored in z and w in posFixup. posFixup.y contains - * 1.0 or -1.0 to turn the rendering upside down for offscreen rendering. PosFixup.x - * contains 1.0 to allow a mad. - */ - shader_addline(&buffer, "gl_Position.y = gl_Position.y * posFixup.y;\n"); - shader_addline(&buffer, "gl_Position.xy += posFixup.zw * gl_Position.ww;\n"); - - /* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c - * - * Basically we want (in homogeneous coordinates) z = z * 2 - 1. However, shaders are run - * before the homogeneous divide, so we have to take the w into account: z = ((z / w) * 2 - 1) * w, - * which is the same as z = z / 2 - w. - */ - shader_addline(&buffer, "gl_Position.z = gl_Position.z * 2.0 - gl_Position.w;\n"); - - shader_addline(&buffer, "}\n"); - - TRACE("Compiling shader object %u\n", shader_obj); - GL_EXTCALL(glShaderSourceARB(shader_obj, 1, (const char**)&buffer.buffer, NULL)); - GL_EXTCALL(glCompileShaderARB(shader_obj)); - print_glsl_info_log(&GLINFO_LOCATION, shader_obj); - - /* Store the shader object */ - This->baseShader.prgId = shader_obj; - - } else if (This->baseShader.shader_mode == SHADER_ARB) { - - /* Create the hw ARB shader */ - shader_addline(&buffer, "!!ARBvp1.0\n"); - shader_addline(&buffer, "PARAM helper_const = { 2.0, -1.0, %d.0, 0.0 };\n", This->rel_offset); - - /* Mesa supports only 95 constants */ - if (GL_VEND(MESA) || GL_VEND(WINE)) - This->baseShader.limits.constant_float = - min(95, This->baseShader.limits.constant_float); - - shader_addline(&buffer, "TEMP TMP;\n"); - - /* Base Declarations */ - shader_generate_arb_declarations( (IWineD3DBaseShader*) This, reg_maps, &buffer, &GLINFO_LOCATION); - - /* We need a constant to fixup the final position */ - shader_addline(&buffer, "PARAM posFixup = program.env[%d];\n", ARB_SHADER_PRIVCONST_POS); - - if((GLINFO_LOCATION).set_texcoord_w) { - int i; - for(i = 0; i < min(8, MAX_REG_TEXCRD); i++) { - if(This->baseShader.reg_maps.texcoord_mask[i] != 0 && - This->baseShader.reg_maps.texcoord_mask[i] != WINED3DSP_WRITEMASK_ALL) { - shader_addline(&buffer, "MOV result.texcoord[%u].w, -helper_const.y;\n", i); - } - } - } - - /* Base Shader Body */ - shader_generate_main( (IWineD3DBaseShader*) This, &buffer, reg_maps, pFunction); - - /* If this shader doesn't use fog copy the z coord to the fog coord so that we can use table fog */ - if (!reg_maps->fog) - shader_addline(&buffer, "MOV result.fogcoord, TMP_OUT.z;\n"); - - /* Write the final position. - * - * OpenGL coordinates specify the center of the pixel while d3d coords specify - * the corner. The offsets are stored in z and w in posFixup. posFixup.y contains - * 1.0 or -1.0 to turn the rendering upside down for offscreen rendering. PosFixup.x - * contains 1.0 to allow a mad, but arb vs swizzles are too restricted for that. - */ - shader_addline(&buffer, "MUL TMP, posFixup, TMP_OUT.w;\n"); - shader_addline(&buffer, "ADD TMP_OUT.x, TMP_OUT.x, TMP.z;\n"); - shader_addline(&buffer, "MAD TMP_OUT.y, TMP_OUT.y, posFixup.y, TMP.w;\n"); - - /* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c - * and the glsl equivalent - */ - shader_addline(&buffer, "MAD TMP_OUT.z, TMP_OUT.z, helper_const.x, -TMP_OUT.w;\n"); - - shader_addline(&buffer, "MOV result.position, TMP_OUT;\n"); - - shader_addline(&buffer, "END\n"); - - /* TODO: change to resource.glObjectHandle or something like that */ - GL_EXTCALL(glGenProgramsARB(1, &This->baseShader.prgId)); - - TRACE("Creating a hw vertex shader, prg=%d\n", This->baseShader.prgId); - GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, This->baseShader.prgId)); - - TRACE("Created hw vertex shader, prg=%d\n", This->baseShader.prgId); - /* Create the program and check for errors */ - GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, - buffer.bsize, buffer.buffer)); - - if (glGetError() == GL_INVALID_OPERATION) { - GLint errPos; - glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos); - FIXME("HW VertexShader Error at position %d: %s\n", - errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); - This->baseShader.prgId = -1; - } - } + ((IWineD3DDeviceImpl *)This->baseShader.device)->shader_backend->shader_generate_vshader(iface, &buffer); #if 1 /* if were using the data buffer of device then we don't need to free it */ HeapFree(GetProcessHeap(), 0, buffer.buffer); diff --git a/dlls/wined3d/wined3d_main.c b/dlls/wined3d/wined3d_main.c index 26e7f707cad..6d6a47389b3 100644 --- a/dlls/wined3d/wined3d_main.c +++ b/dlls/wined3d/wined3d_main.c @@ -93,6 +93,11 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv) DWORD len; WNDCLASSA wc; + atifs_shader_backend.shader_dll_load_init(); + glsl_shader_backend.shader_dll_load_init(); + arb_program_shader_backend.shader_dll_load_init(); + none_shader_backend.shader_dll_load_init(); + /* We need our own window class for a fake window which we use to retrieve GL capabilities */ /* We might need CS_OWNDC in the future if we notice strange things on Windows. * Various articles/posts about OpenGL problems on Windows recommend this. */ diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 8da308e11dc..0abeb1d8518 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -74,7 +74,7 @@ void hash_table_put(hash_table_t *table, void *key, void *value); void hash_table_remove(hash_table_t *table, void *key); /* Device caps */ -#define MAX_PALETTES 256 +#define MAX_PALETTES 65536 #define MAX_STREAMS 16 #define MAX_TEXTURES 8 #define MAX_FRAGMENT_SAMPLERS 16 @@ -217,7 +217,8 @@ static inline unsigned short float_32_to_16(const float *in) { #define SHADER_ARB 1 #define SHADER_GLSL 2 -#define SHADER_NONE 3 +#define SHADER_ATI 3 +#define SHADER_NONE 4 #define RTL_DISABLE -1 #define RTL_AUTO 0 @@ -249,6 +250,34 @@ extern wined3d_settings_t wined3d_settings; /* Shader backends */ struct SHADER_OPCODE_ARG; +#define SHADER_PGMSIZE 65535 +typedef struct SHADER_BUFFER { + char* buffer; + unsigned int bsize; + unsigned int lineNo; + BOOL newline; +} SHADER_BUFFER; + +struct shader_caps { + DWORD TextureOpCaps; + DWORD MaxTextureBlendStages; + DWORD MaxSimultaneousTextures; + + DWORD VertexShaderVersion; + DWORD MaxVertexShaderConst; + + DWORD PixelShaderVersion; + float PixelShader1xMaxValue; + + WINED3DVSHADERCAPS2_0 VS20Caps; + WINED3DPSHADERCAPS2_0 PS20Caps; + + DWORD MaxVShaderInstructionsExecuted; + DWORD MaxPShaderInstructionsExecuted; + DWORD MaxVertexShader30InstructionSlots; + DWORD MaxPixelShader30InstructionSlots; +}; + typedef struct { void (*shader_select)(IWineD3DDevice *iface, BOOL usePS, BOOL useVS); void (*shader_select_depth_blt)(IWineD3DDevice *iface); @@ -260,8 +289,14 @@ typedef struct { HRESULT (*shader_alloc_private)(IWineD3DDevice *iface); void (*shader_free_private)(IWineD3DDevice *iface); BOOL (*shader_dirtifyable_constants)(IWineD3DDevice *iface); + void (*shader_generate_pshader)(IWineD3DPixelShader *iface, SHADER_BUFFER *buffer); + void (*shader_generate_vshader)(IWineD3DVertexShader *iface, SHADER_BUFFER *buffer); + void (*shader_get_caps)(WINED3DDEVTYPE devtype, WineD3D_GL_Info *gl_info, struct shader_caps *caps); + void (*shader_dll_load_init)(void); + const struct StateEntry *StateTable; } shader_backend_t; +extern const shader_backend_t atifs_shader_backend; extern const shader_backend_t glsl_shader_backend; extern const shader_backend_t arb_program_shader_backend; extern const shader_backend_t none_shader_backend; @@ -329,7 +364,6 @@ extern int num_lock; /* Maximum number of constants provided to the shaders */ #define HIGHEST_TRANSFORMSTATE 512 /* Highest value in WINED3DTRANSFORMSTATETYPE */ -#define MAX_PALETTES 256 /* Checking of API calls */ /* --------------------- */ @@ -543,8 +577,8 @@ struct StateEntry APPLYSTATEFUNC apply; }; -/* Global state table */ -extern const struct StateEntry StateTable[]; +/* "Base" state table */ +extern const struct StateEntry FFPStateTable[]; /* The new context manager that should deal with onscreen and offscreen rendering */ struct WineD3DContext { @@ -679,6 +713,35 @@ struct WineD3DRectPatch HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This, struct WineD3DRectPatch *patch); +enum projection_types +{ + proj_none, + proj_count3, + proj_count4 +}; + +/***************************************************************************** + * Fixed function pipeline replacements + */ +struct texture_stage_op +{ + WINED3DTEXTUREOP cop, aop; + DWORD carg1, carg2, carg0; + DWORD aarg1, aarg2, aarg0; + WINED3DFORMAT color_correction; + enum projection_types projected; +}; + +struct ffp_desc +{ + struct texture_stage_op op[MAX_TEXTURES]; + struct list entry; +}; + +void gen_ffp_op(IWineD3DStateBlockImpl *stateblock,struct texture_stage_op op[MAX_TEXTURES]); +struct ffp_desc *find_ffp_shader(struct list *shaders, struct texture_stage_op op[MAX_TEXTURES]); +void add_ffp_shader(struct list *shaders, struct ffp_desc *desc); + /***************************************************************************** * IWineD3D implementation structure */ @@ -770,7 +833,8 @@ struct IWineD3DDeviceImpl IWineD3DSwapChain *lastActiveSwapChain; /* palettes texture management */ - PALETTEENTRY palettes[MAX_PALETTES][256]; + UINT NumberOfPalettes; + PALETTEENTRY **palettes; UINT currentPalette; UINT paletteConversionShader; @@ -1803,14 +1867,6 @@ typedef struct shader_reg_maps { } shader_reg_maps; -#define SHADER_PGMSIZE 65535 -typedef struct SHADER_BUFFER { - char* buffer; - unsigned int bsize; - unsigned int lineNo; - BOOL newline; -} SHADER_BUFFER; - /* Undocumented opcode controls */ #define INST_CONTROLS_SHIFT 16 #define INST_CONTROLS_MASK 0x00ff0000 @@ -2355,5 +2411,4 @@ static inline BOOL use_ps(IWineD3DDeviceImpl *device) { void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED3DRECT *src_rect, IWineD3DSurface *dst_surface, WINED3DRECT *dst_rect, const WINED3DTEXTUREFILTERTYPE filter, BOOL flip); - #endif diff --git a/dlls/wined3d/wined3d_private_types.h b/dlls/wined3d/wined3d_private_types.h index 8a7750f8ecd..26ff9389756 100644 --- a/dlls/wined3d/wined3d_private_types.h +++ b/dlls/wined3d/wined3d_private_types.h @@ -30,6 +30,9 @@ typedef enum { WINED3D_DCS_NO_COPY = 2 } WINED3D_DEPTHCOPYSTATE; +/* WineD3D pixel format flags */ +#define WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING 0x1 + /** DCL usage masks **/ #define WINED3DSP_DCL_USAGE_SHIFT 0 #define WINED3DSP_DCL_USAGE_MASK 0x0000000f diff --git a/dlls/wineesd.drv/audio.c b/dlls/wineesd.drv/audio.c index a5a04dbb900..b57191cb139 100644 --- a/dlls/wineesd.drv/audio.c +++ b/dlls/wineesd.drv/audio.c @@ -1227,7 +1227,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) wwo->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); - memcpy(&wwo->waveDesc, lpDesc, sizeof(WAVEOPENDESC)); + wwo->waveDesc = *lpDesc; copy_format(lpDesc->lpFormat, &wwo->waveFormat); if (wwo->waveFormat.Format.wBitsPerSample == 0) { @@ -1881,8 +1881,8 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) dwFlags &= ~WAVE_DIRECTSOUND; wwi->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); - - memcpy(&wwi->waveDesc, lpDesc, sizeof(WAVEOPENDESC)); + + wwi->waveDesc = *lpDesc; copy_format(lpDesc->lpFormat, &wwi->waveFormat); if (wwi->waveFormat.Format.wBitsPerSample == 0) { diff --git a/dlls/winejack.drv/audio.c b/dlls/winejack.drv/audio.c index 6e89330cb0a..8c0255403af 100644 --- a/dlls/winejack.drv/audio.c +++ b/dlls/winejack.drv/audio.c @@ -1322,9 +1322,8 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) dwFlags &= ~WAVE_DIRECTSOUND; /* direct sound not supported, ignore the flag */ - wwo->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); - - memcpy(&wwo->waveDesc, lpDesc, sizeof(WAVEOPENDESC)); + + wwo->waveDesc = *lpDesc; memcpy(&wwo->format, lpDesc->lpFormat, sizeof(PCMWAVEFORMAT)); /* open up jack ports for this device */ @@ -2131,8 +2130,8 @@ static DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) dwFlags &= ~WAVE_DIRECTSOUND; /* direct sound not supported, ignore the flag */ wwi->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); - - memcpy(&wwi->waveDesc, lpDesc, sizeof(WAVEOPENDESC)); + + wwi->waveDesc = *lpDesc; memcpy(&wwi->format, lpDesc->lpFormat, sizeof(PCMWAVEFORMAT)); LeaveCriticalSection(&wwi->access_crst); diff --git a/dlls/winenas.drv/audio.c b/dlls/winenas.drv/audio.c index 4d949352181..3efe3b4c3f5 100644 --- a/dlls/winenas.drv/audio.c +++ b/dlls/winenas.drv/audio.c @@ -941,7 +941,7 @@ static DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) wwo->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); - memcpy(&wwo->waveDesc, lpDesc, sizeof(WAVEOPENDESC)); + wwo->waveDesc = *lpDesc; memcpy(&wwo->format, lpDesc->lpFormat, sizeof(PCMWAVEFORMAT)); if (wwo->format.wBitsPerSample == 0) { diff --git a/dlls/wineoss.drv/audio.c b/dlls/wineoss.drv/audio.c index ebd785e34a7..2e22d14af6a 100644 --- a/dlls/wineoss.drv/audio.c +++ b/dlls/wineoss.drv/audio.c @@ -2056,7 +2056,7 @@ DWORD wodOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) wwo->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); - memcpy(&wwo->waveDesc, lpDesc, sizeof(WAVEOPENDESC)); + wwo->waveDesc = *lpDesc; copy_format(lpDesc->lpFormat, &wwo->waveFormat); if (wwo->waveFormat.Format.wBitsPerSample == 0) { @@ -2943,7 +2943,7 @@ DWORD widOpen(WORD wDevID, LPWAVEOPENDESC lpDesc, DWORD dwFlags) wwi->dwTotalRead = 0; wwi->wFlags = HIWORD(dwFlags & CALLBACK_TYPEMASK); - memcpy(&wwi->waveDesc, lpDesc, sizeof(WAVEOPENDESC)); + wwi->waveDesc = *lpDesc; copy_format(lpDesc->lpFormat, &wwi->waveFormat); if (wwi->waveFormat.Format.wBitsPerSample == 0) { diff --git a/dlls/wineoss.drv/dscapture.c b/dlls/wineoss.drv/dscapture.c index 0724ea88e79..a2157ec4374 100644 --- a/dlls/wineoss.drv/dscapture.c +++ b/dlls/wineoss.drv/dscapture.c @@ -769,7 +769,7 @@ static HRESULT WINAPI IDsCaptureDriverImpl_GetDriverDesc( } /* copy version from driver */ - memcpy(pDesc, &(WInDev[This->wDevID].ossdev.ds_desc), sizeof(DSDRIVERDESC)); + *pDesc = WInDev[This->wDevID].ossdev.ds_desc; pDesc->dnDevNode = WInDev[This->wDevID].waveDesc.dnDevNode; pDesc->wVxdId = 0; @@ -809,7 +809,7 @@ static HRESULT WINAPI IDsCaptureDriverImpl_GetCaps( { IDsCaptureDriverImpl *This = (IDsCaptureDriverImpl *)iface; TRACE("(%p,%p)\n",This,pCaps); - memcpy(pCaps, &(WInDev[This->wDevID].ossdev.dsc_caps), sizeof(DSCDRIVERCAPS)); + *pCaps = WInDev[This->wDevID].ossdev.dsc_caps; return DS_OK; } diff --git a/dlls/wineoss.drv/dsrender.c b/dlls/wineoss.drv/dsrender.c index 55712c717f8..dfc636a484d 100644 --- a/dlls/wineoss.drv/dsrender.c +++ b/dlls/wineoss.drv/dsrender.c @@ -710,7 +710,7 @@ static HRESULT WINAPI IDsDriverImpl_GetDriverDesc(PIDSDRIVER iface, TRACE("(%p,%p)\n",iface,pDesc); /* copy version from driver */ - memcpy(pDesc, &(WOutDev[This->wDevID].ossdev.ds_desc), sizeof(DSDRIVERDESC)); + *pDesc = WOutDev[This->wDevID].ossdev.ds_desc; pDesc->dwFlags |= DSDDESC_DOMMSYSTEMOPEN | DSDDESC_DOMMSYSTEMSETFORMAT | DSDDESC_USESYSTEMMEMORY | DSDDESC_DONTNEEDPRIMARYLOCK | @@ -761,7 +761,7 @@ static HRESULT WINAPI IDsDriverImpl_GetCaps(PIDSDRIVER iface, PDSDRIVERCAPS pCap { IDsDriverImpl *This = (IDsDriverImpl *)iface; TRACE("(%p,%p)\n",iface,pCaps); - memcpy(pCaps, &(WOutDev[This->wDevID].ossdev.ds_caps), sizeof(DSDRIVERCAPS)); + *pCaps = WOutDev[This->wDevID].ossdev.ds_caps; return DS_OK; } @@ -960,7 +960,7 @@ DWORD wodDsCreate(UINT wDevID, PIDSDRIVER* drv) DWORD wodDsDesc(UINT wDevID, PDSDRIVERDESC desc) { TRACE("(%d,%p)\n",wDevID,desc); - memcpy(desc, &(WOutDev[wDevID].ossdev.ds_desc), sizeof(DSDRIVERDESC)); + *desc = WOutDev[wDevID].ossdev.ds_desc; return MMSYSERR_NOERROR; } diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c index 0dba308527b..2996857d937 100644 --- a/dlls/winex11.drv/clipboard.c +++ b/dlls/winex11.drv/clipboard.c @@ -72,6 +72,7 @@ # include #endif #include +#include #include #include @@ -2006,71 +2007,55 @@ static BOOL X11DRV_CLIPBOARD_ReadProperty(Window w, Atom prop, Display *display = thread_display(); Atom atype = AnyPropertyType; int aformat; - unsigned long total, nitems, remain, val_cnt; - long reqlen, bwc; - unsigned char* val; - unsigned char* buffer; + unsigned long pos = 0, nitems, remain, count; + unsigned char *val = NULL, *buffer; if (prop == None) return FALSE; - TRACE("Reading property %d from X window %d\n", - (unsigned int)prop, (unsigned int)w); + TRACE("Reading property %lu from X window %lx\n", prop, w); - /* - * First request a zero length in order to figure out the request size. - */ - wine_tsx11_lock(); - if(XGetWindowProperty(display,w,prop,0,0,False, AnyPropertyType, - &atype, &aformat, &nitems, &remain, &buffer) != Success) - { - wine_tsx11_unlock(); - WARN("Failed to get property size\n"); - return FALSE; - } - - /* Free zero length return data if any */ - if (buffer) + for (;;) { - XFree(buffer); - buffer = NULL; - } - - bwc = aformat/8; - reqlen = remain * bwc; - - TRACE("Retrieving %ld bytes\n", reqlen); - - val = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, reqlen); + wine_tsx11_lock(); + if (XGetWindowProperty(display, w, prop, pos, INT_MAX / 4, False, + AnyPropertyType, &atype, &aformat, &nitems, &remain, &buffer) != Success) + { + wine_tsx11_unlock(); + WARN("Failed to read property\n"); + HeapFree( GetProcessHeap(), 0, val ); + return FALSE; + } - /* Read property in 4K blocks */ - for (total = 0, val_cnt = 0; remain;) - { - if (XGetWindowProperty(display, w, prop, (total / 4), 4096, False, - AnyPropertyType, &atype, &aformat, &nitems, &remain, &buffer) != Success) - { - wine_tsx11_unlock(); - WARN("Failed to read property\n"); - HeapFree(GetProcessHeap(), 0, val); - return FALSE; - } + count = nitems * (aformat / 8); + if (!val) *data = HeapAlloc( GetProcessHeap(), 0, pos * sizeof(int) + count + 1 ); + else *data = HeapReAlloc( GetProcessHeap(), 0, val, pos * sizeof(int) + count + 1 ); - bwc = aformat/8; - memcpy(&val[val_cnt], buffer, nitems * bwc); - val_cnt += nitems * bwc; - total += nitems*bwc; - XFree(buffer); + if (!*data) + { + XFree( buffer ); + wine_tsx11_unlock(); + HeapFree( GetProcessHeap(), 0, val ); + return FALSE; + } + val = *data; + memcpy( (int *)val + pos, buffer, count ); + XFree( buffer ); + wine_tsx11_unlock(); + if (!remain) + { + *datasize = pos * sizeof(int) + count; + val[*datasize] = 0; + break; + } + pos += count / sizeof(int); } /* Delete the property on the window now that we are done * This will send a PropertyNotify event to the selection owner. */ + wine_tsx11_lock(); XDeleteProperty(display, w, prop); - wine_tsx11_unlock(); - - *data = val; - *datasize = total; - return TRUE; } diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 1ab8846b067..a2b7e92f5f4 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -706,6 +706,8 @@ void X11DRV_make_systray_window( HWND hwnd ) struct x11drv_win_data *data; Window systray_window; + if (root_window != DefaultRootWindow(display)) return; + if (!(data = X11DRV_get_win_data( hwnd )) && !(data = X11DRV_create_win_data( hwnd ))) return; @@ -1064,20 +1066,8 @@ void X11DRV_sync_window_position( Display *display, struct x11drv_win_data *data changes.stack_mode = Above; mask |= CWStackMode; } - else - { - /* should use stack_mode Below but most window managers don't get it right */ - /* so move it above the next one in Z order */ - HWND next = GetWindow( data->hwnd, GW_HWNDNEXT ); - while (next && !(GetWindowLongW( next, GWL_STYLE ) & WS_VISIBLE)) - next = GetWindow( next, GW_HWNDNEXT ); - if (next) - { - changes.stack_mode = Above; - changes.sibling = X11DRV_get_whole_window(next); - mask |= CWStackMode | CWSibling; - } - } + /* should use stack_mode Below but most window managers don't get it right */ + /* and Above with a sibling doesn't work so well either, so we ignore it */ } /* only the size is allowed to change for the desktop window */ @@ -1087,8 +1077,8 @@ void X11DRV_sync_window_position( Display *display, struct x11drv_win_data *data { DWORD style = GetWindowLongW( data->hwnd, GWL_STYLE ); - TRACE( "setting win %lx pos %d,%d,%dx%d after %lx changes=%x\n", - data->whole_window, data->whole_rect.left, data->whole_rect.top, + TRACE( "setting win %p/%lx pos %d,%d,%dx%d after %lx changes=%x\n", + data->hwnd, data->whole_window, data->whole_rect.left, data->whole_rect.top, data->whole_rect.right - data->whole_rect.left, data->whole_rect.bottom - data->whole_rect.top, changes.sibling, mask ); @@ -1591,7 +1581,7 @@ void X11DRV_SetCapture( HWND hwnd, UINT flags ) { struct x11drv_thread_data *thread_data = x11drv_thread_data(); - if (!(flags & GUI_INMOVESIZE)) return; + if (!(flags & (GUI_INMOVESIZE | GUI_INMENUMODE))) return; if (hwnd) { @@ -1602,7 +1592,7 @@ void X11DRV_SetCapture( HWND hwnd, UINT flags ) XFlush( gdi_display ); XGrabPointer( thread_data->display, grab_win, False, PointerMotionMask | ButtonPressMask | ButtonReleaseMask, - GrabModeAsync, GrabModeAsync, root_window, None, CurrentTime ); + GrabModeAsync, GrabModeAsync, None, None, CurrentTime ); wine_tsx11_unlock(); thread_data->grab_window = grab_win; } diff --git a/dlls/winex11.drv/winpos.c b/dlls/winex11.drv/winpos.c index 25e643e36f0..ad62236a671 100644 --- a/dlls/winex11.drv/winpos.c +++ b/dlls/winex11.drv/winpos.c @@ -199,6 +199,8 @@ static void update_net_wm_states( Display *display, struct x11drv_win_data *data new_state |= (1 << NET_WM_STATE_ABOVE); if (ex_style & WS_EX_TOOLWINDOW) new_state |= (1 << NET_WM_STATE_SKIP_TASKBAR) | (1 << NET_WM_STATE_SKIP_PAGER); + if (GetWindow( data->hwnd, GW_OWNER )) + new_state |= (1 << NET_WM_STATE_SKIP_TASKBAR); xev.xclient.type = ClientMessage; xev.xclient.window = data->whole_window; diff --git a/dlls/wininet/ftp.c b/dlls/wininet/ftp.c index 76ddbfda199..4077de3fadc 100644 --- a/dlls/wininet/ftp.c +++ b/dlls/wininet/ftp.c @@ -937,7 +937,7 @@ BOOL WINAPI FtpGetCurrentDirectoryW(HINTERNET hFtpSession, LPWSTR lpszCurrentDir LPWININETAPPINFOW hIC = NULL; BOOL r = FALSE; - TRACE("len(%d)\n", *lpdwCurrentDirectory); + TRACE("%p %p %p\n", hFtpSession, lpszCurrentDirectory, lpdwCurrentDirectory); lpwfs = (LPWININETFTPSESSIONW) WININET_GetObject( hFtpSession ); if (NULL == lpwfs) @@ -1015,8 +1015,6 @@ static BOOL FTP_FtpGetCurrentDirectoryW(LPWININETFTPSESSIONW lpwfs, LPWSTR lpszC LPWININETAPPINFOW hIC = NULL; DWORD bSuccess = FALSE; - TRACE("len(%d)\n", *lpdwCurrentDirectory); - /* Clear any error information */ INTERNET_SetLastError(0); diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c index d02217a22c3..3980e9a1f22 100644 --- a/dlls/wininet/http.c +++ b/dlls/wininet/http.c @@ -63,6 +63,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wininet); +static const WCHAR g_szHttp1_0[] = {'H','T','T','P','/','1','.','0',0}; static const WCHAR g_szHttp1_1[] = {'H','T','T','P','/','1','.','1',0}; static const WCHAR g_szReferer[] = {'R','e','f','e','r','e','r',0}; static const WCHAR g_szAccept[] = {'A','c','c','e','p','t',0}; @@ -106,7 +107,7 @@ struct HttpAuthInfo }; static BOOL HTTP_OpenConnection(LPWININETHTTPREQW lpwhr); -static BOOL HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr); +static BOOL HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr, BOOL clear); static BOOL HTTP_ProcessHeader(LPWININETHTTPREQW lpwhr, LPCWSTR field, LPCWSTR value, DWORD dwModifier); static LPWSTR * HTTP_InterpretHttpHeader(LPCWSTR buffer); static BOOL HTTP_InsertCustomHeader(LPWININETHTTPREQW lpwhr, LPHTTPHEADERW lpHdr); @@ -845,7 +846,7 @@ BOOL WINAPI HttpEndRequestW(HINTERNET hRequest, SendAsyncCallback(&lpwhr->hdr, lpwhr->hdr.dwContext, INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0); - responseLen = HTTP_GetResponseHeaders(lpwhr); + responseLen = HTTP_GetResponseHeaders(lpwhr, TRUE); if (responseLen) rc = TRUE; @@ -1563,7 +1564,7 @@ static DWORD HTTPREQ_SetOption(WININETHANDLEHEADER *hdr, DWORD option, void *buf return ERROR_INTERNET_INVALID_OPTION; } -static DWORD HTTPREQ_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync) +static DWORD HTTP_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync) { int bytes_read; @@ -1572,8 +1573,7 @@ static DWORD HTTPREQ_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD if(req->dwContentLength != -1 && req->dwContentRead != req->dwContentLength) ERR("not all data received %d/%d\n", req->dwContentRead, req->dwContentLength); - /* always returns TRUE, even if the network layer returns an - * error */ + /* always return success, even if the network layer returns an error */ *read = 0; HTTP_FinishedReading(req); return ERROR_SUCCESS; @@ -1596,10 +1596,105 @@ static DWORD HTTPREQ_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD return ERROR_SUCCESS; } +static DWORD get_chunk_size(const char *buffer) +{ + const char *p; + DWORD size = 0; + + for (p = buffer; *p; p++) + { + if (*p >= '0' && *p <= '9') size = size * 16 + *p - '0'; + else if (*p >= 'a' && *p <= 'f') size = size * 16 + *p - 'a' + 10; + else if (*p >= 'A' && *p <= 'F') size = size * 16 + *p - 'A' + 10; + else if (*p == ';') break; + } + return size; +} + +static DWORD HTTP_ReadChunked(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync) +{ + char reply[MAX_REPLY_LEN], *p = buffer; + DWORD buflen, to_write = size; + size_t to_read; + int bytes_read; + + *read = 0; + for (;;) + { + if (*read == size) break; + + if (req->dwContentLength == ~0UL) /* new chunk */ + { + buflen = sizeof(reply); + if (!NETCON_getNextLine(&req->netConnection, reply, &buflen)) break; + + if (!(req->dwContentLength = get_chunk_size(reply))) + { + /* zero sized chunk marks end of transfer; read any trailing headers and return */ + HTTP_GetResponseHeaders(req, FALSE); + break; + } + } + to_read = min(to_write, req->dwContentLength - req->dwContentRead); + + if (!NETCON_recv(&req->netConnection, p, to_read, sync ? MSG_WAITALL : 0, &bytes_read)) + { + if (bytes_read != to_read) + ERR("Not all data received %d/%d\n", bytes_read, to_read); + + /* always return success, even if the network layer returns an error */ + *read = 0; + break; + } + if (!bytes_read) break; + + req->dwContentRead += bytes_read; + to_write -= bytes_read; + *read += bytes_read; + + if (req->lpszCacheFile) + { + if (!WriteFile(req->hCacheFile, p, bytes_read, NULL, NULL)) + WARN("WriteFile failed: %u\n", GetLastError()); + } + p += bytes_read; + + if (req->dwContentRead == req->dwContentLength) /* chunk complete */ + { + req->dwContentRead = 0; + req->dwContentLength = ~0UL; + + buflen = sizeof(reply); + if (!NETCON_getNextLine(&req->netConnection, reply, &buflen)) + { + ERR("Malformed chunk\n"); + *read = 0; + break; + } + } + } + if (!*read) HTTP_FinishedReading(req); + return ERROR_SUCCESS; +} + +static DWORD HTTPREQ_Read(WININETHTTPREQW *req, void *buffer, DWORD size, DWORD *read, BOOL sync) +{ + WCHAR encoding[20]; + DWORD buflen = sizeof(encoding); + static const WCHAR szChunked[] = {'c','h','u','n','k','e','d',0}; + + if (HTTP_HttpQueryInfoW(req, HTTP_QUERY_TRANSFER_ENCODING, encoding, &buflen, NULL) && + !strcmpiW(encoding, szChunked)) + { + return HTTP_ReadChunked(req, buffer, size, read, sync); + } + else + return HTTP_Read(req, buffer, size, read, sync); +} + static DWORD HTTPREQ_ReadFile(WININETHANDLEHEADER *hdr, void *buffer, DWORD size, DWORD *read) { WININETHTTPREQW *req = (WININETHTTPREQW*)hdr; - return HTTPREQ_Read(req, buffer, size, read, TRUE); } @@ -1638,9 +1733,7 @@ static DWORD HTTPREQ_ReadFileExA(WININETHANDLEHEADER *hdr, INTERNET_BUFFERSA *bu INTERNET_SendCallback(&req->hdr, req->hdr.dwContext, INTERNET_STATUS_RECEIVING_RESPONSE, NULL, 0); - /* FIXME: IRF_ASYNC may not be the right thing to test here; - * hIC->hdr.dwFlags & INTERNET_FLAG_ASYNC is probably better */ - if (flags & IRF_ASYNC) { + if (hdr->dwFlags & INTERNET_FLAG_ASYNC) { DWORD available = 0; NETCON_query_data_available(&req->netConnection, &available); @@ -1928,7 +2021,7 @@ static void HTTP_DrainContent(WININETHTTPREQW *req) do { char buffer[2048]; - if (HTTPREQ_Read(req, buffer, sizeof(buffer), &bytes_read, TRUE) != ERROR_SUCCESS) + if (HTTP_Read(req, buffer, sizeof(buffer), &bytes_read, TRUE) != ERROR_SUCCESS) return; } while (bytes_read); } @@ -2493,7 +2586,7 @@ BOOL WINAPI HttpSendRequestExA(HINTERNET hRequest, DWORD headerlen; LPWSTR header = NULL; - TRACE("(%p, %p, %p, %08x, %08lx): stub\n", hRequest, lpBuffersIn, + TRACE("(%p, %p, %p, %08x, %08lx)\n", hRequest, lpBuffersIn, lpBuffersOut, dwFlags, dwContext); if (lpBuffersIn) @@ -3001,7 +3094,7 @@ static BOOL HTTP_SecureProxyConnect(LPWININETHTTPREQW lpwhr) if (!ret || cnt < 0) return FALSE; - responseLen = HTTP_GetResponseHeaders( lpwhr ); + responseLen = HTTP_GetResponseHeaders( lpwhr, TRUE ); if (!responseLen) return FALSE; @@ -3127,7 +3220,7 @@ BOOL WINAPI HTTP_HttpSendRequestW(LPWININETHTTPREQW lpwhr, LPCWSTR lpszHeaders, if (cnt < 0) goto lend; - responseLen = HTTP_GetResponseHeaders(lpwhr); + responseLen = HTTP_GetResponseHeaders(lpwhr, TRUE); if (responseLen) bSuccess = TRUE; @@ -3522,7 +3615,7 @@ static void HTTP_clear_response_headers( LPWININETHTTPREQW lpwhr ) * TRUE on success * FALSE on error */ -static INT HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr) +static INT HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr, BOOL clear) { INT cbreaks = 0; WCHAR buffer[MAX_REPLY_LEN]; @@ -3540,7 +3633,7 @@ static INT HTTP_GetResponseHeaders(LPWININETHTTPREQW lpwhr) TRACE("-->\n"); /* clear old response headers (eg. from a redirect response) */ - HTTP_clear_response_headers( lpwhr ); + if (clear) HTTP_clear_response_headers( lpwhr ); if (!NETCON_connected(&lpwhr->netConnection)) goto lend; @@ -3997,13 +4090,11 @@ static BOOL HTTP_DeleteCustomHeader(LPWININETHTTPREQW lpwhr, DWORD index) */ static BOOL HTTP_VerifyValidHeader(LPWININETHTTPREQW lpwhr, LPCWSTR field) { - BOOL rc = TRUE; - /* Accept-Encoding is stripped from HTTP/1.0 requests. It is invalid */ - if (strcmpiW(field,szAccept_Encoding)==0) + if (!strcmpW(lpwhr->lpszVersion, g_szHttp1_0) && !strcmpiW(field, szAccept_Encoding)) return FALSE; - return rc; + return TRUE; } /*********************************************************************** diff --git a/dlls/wininet/tests/ftp.c b/dlls/wininet/tests/ftp.c index 9832fce9e9e..992bce99feb 100644 --- a/dlls/wininet/tests/ftp.c +++ b/dlls/wininet/tests/ftp.c @@ -26,7 +26,6 @@ * Add W-function tests. * Add missing function tests: * FtpFindFirstFile - * FtpGetCurrentDirectory * FtpGetFileSize * FtpSetCurrentDirectory */ diff --git a/dlls/wininet/tests/http.c b/dlls/wininet/tests/http.c index fb561c4e3a8..5d42077a42a 100644 --- a/dlls/wininet/tests/http.c +++ b/dlls/wininet/tests/http.c @@ -659,6 +659,8 @@ static void InternetReadFileExA_test(int flags) if (GetLastError() == ERROR_IO_PENDING) { trace("InternetReadFileEx -> PENDING\n"); + ok(flags & INTERNET_FLAG_ASYNC, + "Should not get ERROR_IO_PENDING without INTERNET_FLAG_ASYNC\n"); CHECK_NOTIFIED(INTERNET_STATUS_RECEIVING_RESPONSE); WaitForSingleObject(hCompleteEvent, INFINITE); CHECK_NOTIFIED(INTERNET_STATUS_REQUEST_COMPLETE); diff --git a/dlls/wininet/wininet.spec b/dlls/wininet/wininet.spec index 19e65512be3..dfbc38c02fc 100644 --- a/dlls/wininet/wininet.spec +++ b/dlls/wininet/wininet.spec @@ -116,8 +116,8 @@ @ stdcall InternetAutodial(long ptr) @ stub InternetAutodialCallback @ stdcall InternetAutodialHangup(long) -@ stdcall InternetCanonicalizeUrlA(str str ptr long) -@ stdcall InternetCanonicalizeUrlW(wstr wstr ptr long) +@ stdcall InternetCanonicalizeUrlA(str ptr ptr long) +@ stdcall InternetCanonicalizeUrlW(wstr ptr ptr long) @ stdcall InternetCheckConnectionA(ptr long long) @ stdcall InternetCheckConnectionW(ptr long long) @ stdcall InternetClearAllPerSiteCookieDecisions() diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c index 7d49d2c3e46..dadc61ff92b 100644 --- a/dlls/winspool.drv/info.c +++ b/dlls/winspool.drv/info.c @@ -251,6 +251,13 @@ static const DWORD di_sizeof[] = {0, sizeof(DRIVER_INFO_1W), sizeof(DRIVER_INFO_ sizeof(DRIVER_INFO_5W), sizeof(DRIVER_INFO_6W), 0, sizeof(DRIVER_INFO_8W)}; + +static const DWORD pi_sizeof[] = {0, sizeof(PRINTER_INFO_1W), sizeof(PRINTER_INFO_2W), + sizeof(PRINTER_INFO_3), sizeof(PRINTER_INFO_4W), + sizeof(PRINTER_INFO_5W), sizeof(PRINTER_INFO_6), + sizeof(PRINTER_INFO_7W), sizeof(PRINTER_INFO_8W), + sizeof(PRINTER_INFO_9W)}; + /****************************************************************** * validate the user-supplied printing-environment [internal] * @@ -1730,6 +1737,223 @@ static LPDEVMODEA DEVMODEdupWtoA(const DEVMODEW *dmW) return dmA; } +/****************************************************************** + * convert_printerinfo_W_to_A [internal] + * + */ +static void convert_printerinfo_W_to_A(LPBYTE out, LPBYTE pPrintersW, + DWORD level, DWORD outlen, DWORD numentries) +{ + DWORD id = 0; + LPSTR ptr; + INT len; + + TRACE("(%p, %p, %d, %u, %u)\n", out, pPrintersW, level, outlen, numentries); + + len = pi_sizeof[level] * numentries; + ptr = (LPSTR) out + len; + outlen -= len; + + /* copy the numbers of all PRINTER_INFO_* first */ + memcpy(out, pPrintersW, len); + + while (id < numentries) { + switch (level) { + case 1: + { + PRINTER_INFO_1W * piW = (PRINTER_INFO_1W *) pPrintersW; + PRINTER_INFO_1A * piA = (PRINTER_INFO_1A *) out; + + TRACE("(%u) #%u: %s\n", level, id, debugstr_w(piW->pName)); + if (piW->pDescription) { + piA->pDescription = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pDescription, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pName) { + piA->pName = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pName, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pComment) { + piA->pComment = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pComment, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + break; + } + + case 2: + { + PRINTER_INFO_2W * piW = (PRINTER_INFO_2W *) pPrintersW; + PRINTER_INFO_2A * piA = (PRINTER_INFO_2A *) out; + LPDEVMODEA dmA; + + TRACE("(%u) #%u: %s\n", level, id, debugstr_w(piW->pPrinterName)); + if (piW->pServerName) { + piA->pServerName = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pServerName, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pPrinterName) { + piA->pPrinterName = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pPrinterName, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pShareName) { + piA->pShareName = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pShareName, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pPortName) { + piA->pPortName = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pPortName, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pDriverName) { + piA->pDriverName = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pDriverName, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pComment) { + piA->pComment = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pComment, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pLocation) { + piA->pLocation = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pLocation, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + + dmA = DEVMODEdupWtoA(piW->pDevMode); + if (dmA) { + /* align DEVMODEA to a DWORD boundary */ + len = (4 - ( (DWORD_PTR) ptr & 3)) & 3; + ptr += len; + outlen -= len; + + piA->pDevMode = (LPDEVMODEA) ptr; + len = dmA->dmSize + dmA->dmDriverExtra; + memcpy(ptr, dmA, len); + HeapFree(GetProcessHeap(), 0, dmA); + + ptr += len; + outlen -= len; + } + + if (piW->pSepFile) { + piA->pSepFile = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pSepFile, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pPrintProcessor) { + piA->pPrintProcessor = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pPrintProcessor, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pDatatype) { + piA->pDatatype = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pDatatype, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pParameters) { + piA->pParameters = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pParameters, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pSecurityDescriptor) { + piA->pSecurityDescriptor = NULL; + FIXME("pSecurityDescriptor ignored: %s\n", debugstr_w(piW->pPrinterName)); + } + break; + } + + case 4: + { + PRINTER_INFO_4W * piW = (PRINTER_INFO_4W *) pPrintersW; + PRINTER_INFO_4A * piA = (PRINTER_INFO_4A *) out; + + TRACE("(%u) #%u: %s\n", level, id, debugstr_w(piW->pPrinterName)); + + if (piW->pPrinterName) { + piA->pPrinterName = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pPrinterName, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pServerName) { + piA->pServerName = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pServerName, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + break; + } + + case 5: + { + PRINTER_INFO_5W * piW = (PRINTER_INFO_5W *) pPrintersW; + PRINTER_INFO_5A * piA = (PRINTER_INFO_5A *) out; + + TRACE("(%u) #%u: %s\n", level, id, debugstr_w(piW->pPrinterName)); + + if (piW->pPrinterName) { + piA->pPrinterName = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pPrinterName, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + if (piW->pPortName) { + piA->pPortName = ptr; + len = WideCharToMultiByte(CP_ACP, 0, piW->pPortName, -1, + ptr, outlen, NULL, NULL); + ptr += len; + outlen -= len; + } + break; + } + + default: + FIXME("for level %u\n", level); + } + pPrintersW += pi_sizeof[level]; + out += pi_sizeof[level]; + id++; + } +} + /*********************************************************** * PRINTER_INFO_2AtoW * Creates a unicode copy of PRINTER_INFO_2A on heap @@ -4485,23 +4709,35 @@ BOOL WINAPI EnumPrintersW( } /****************************************************************** - * EnumPrintersA [WINSPOOL.@] + * EnumPrintersA [WINSPOOL.@] + * + * See EnumPrintersW * */ -BOOL WINAPI EnumPrintersA(DWORD dwType, LPSTR lpszName, - DWORD dwLevel, LPBYTE lpbPrinters, - DWORD cbBuf, LPDWORD lpdwNeeded, - LPDWORD lpdwReturned) +BOOL WINAPI EnumPrintersA(DWORD flags, LPSTR pName, DWORD level, LPBYTE pPrinters, + DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned) { - BOOL ret, unicode = FALSE; - UNICODE_STRING lpszNameW; - PWSTR pwstrNameW; + BOOL ret; + UNICODE_STRING pNameU; + LPWSTR pNameW; + LPBYTE pPrintersW; + + TRACE("(0x%x, %s, %u, %p, %d, %p, %p)\n", flags, debugstr_a(pName), level, + pPrinters, cbBuf, pcbNeeded, pcReturned); + + pNameW = asciitounicode(&pNameU, pName); - pwstrNameW = asciitounicode(&lpszNameW,lpszName); - if(!cbBuf) unicode = TRUE; /* return a buffer that's big enough for the unicode version */ - ret = WINSPOOL_EnumPrinters(dwType, pwstrNameW, dwLevel, lpbPrinters, cbBuf, - lpdwNeeded, lpdwReturned, unicode); - RtlFreeUnicodeString(&lpszNameW); + /* Request a buffer with a size, that is big enough for EnumPrintersW. + MS Office need this */ + pPrintersW = (pPrinters && cbBuf) ? HeapAlloc(GetProcessHeap(), 0, cbBuf) : NULL; + + ret = EnumPrintersW(flags, pNameW, level, pPrintersW, cbBuf, pcbNeeded, pcReturned); + + RtlFreeUnicodeString(&pNameU); + if (ret) { + convert_printerinfo_W_to_A(pPrinters, pPrintersW, level, *pcbNeeded, *pcReturned); + } + HeapFree(GetProcessHeap(), 0, pPrintersW); return ret; } diff --git a/dlls/ws2_32/protocol.c b/dlls/ws2_32/protocol.c index 7cccecb4cc6..43bf424c00c 100644 --- a/dlls/ws2_32/protocol.c +++ b/dlls/ws2_32/protocol.c @@ -99,7 +99,7 @@ static INT WINSOCK_EnterSingleProtocolW( INT protocol, WSAPROTOCOL_INFOW* info ) info->dwServiceFlags1 = XP1_PARTIAL_MESSAGE | XP1_EXPEDITED_DATA | XP1_GRACEFUL_CLOSE | XP1_GUARANTEED_ORDER | XP1_GUARANTEED_DELIVERY; - memcpy( &info->ProviderId, &ProviderIdIP, sizeof(GUID) ); + info->ProviderId = ProviderIdIP; info->dwCatalogEntryId = 0x3e9; info->ProtocolChain.ChainLen = 1; info->iVersion = 2; @@ -114,7 +114,7 @@ static INT WINSOCK_EnterSingleProtocolW( INT protocol, WSAPROTOCOL_INFOW* info ) info->dwServiceFlags1 = XP1_PARTIAL_MESSAGE | XP1_SUPPORT_BROADCAST | XP1_SUPPORT_MULTIPOINT | XP1_MESSAGE_ORIENTED | XP1_CONNECTIONLESS; - memcpy( &info->ProviderId, &ProviderIdIP, sizeof(GUID) ); + info->ProviderId = ProviderIdIP; info->dwCatalogEntryId = 0x3ea; info->ProtocolChain.ChainLen = 1; info->iVersion = 2; @@ -130,7 +130,7 @@ static INT WINSOCK_EnterSingleProtocolW( INT protocol, WSAPROTOCOL_INFOW* info ) info->dwServiceFlags1 = XP1_PARTIAL_MESSAGE | XP1_SUPPORT_BROADCAST | XP1_SUPPORT_MULTIPOINT | XP1_MESSAGE_ORIENTED | XP1_CONNECTIONLESS; - memcpy( &info->ProviderId, &ProviderIdIPX, sizeof(GUID) ); + info->ProviderId = ProviderIdIPX; info->dwCatalogEntryId = 0x406; info->ProtocolChain.ChainLen = 1; info->iVersion = 2; @@ -147,7 +147,7 @@ static INT WINSOCK_EnterSingleProtocolW( INT protocol, WSAPROTOCOL_INFOW* info ) info->dwServiceFlags1 = XP1_IFS_HANDLES | XP1_PSEUDO_STREAM | XP1_MESSAGE_ORIENTED | XP1_GUARANTEED_ORDER | XP1_GUARANTEED_DELIVERY; - memcpy( &info->ProviderId, &ProviderIdSPX, sizeof(GUID) ); + info->ProviderId = ProviderIdSPX; info->dwCatalogEntryId = 0x407; info->ProtocolChain.ChainLen = 1; info->iVersion = 2; @@ -163,7 +163,7 @@ static INT WINSOCK_EnterSingleProtocolW( INT protocol, WSAPROTOCOL_INFOW* info ) info->dwServiceFlags1 = XP1_IFS_HANDLES | XP1_GRACEFUL_CLOSE | XP1_PSEUDO_STREAM | XP1_MESSAGE_ORIENTED | XP1_GUARANTEED_ORDER | XP1_GUARANTEED_DELIVERY; - memcpy( &info->ProviderId, &ProviderIdSPX, sizeof(GUID) ); + info->ProviderId = ProviderIdSPX; info->dwCatalogEntryId = 0x409; info->ProtocolChain.ChainLen = 1; info->iVersion = 2; @@ -203,7 +203,7 @@ static INT WINSOCK_EnterSingleProtocolA( INT protocol, WSAPROTOCOL_INFOA* info ) info->dwServiceFlags1 = XP1_IFS_HANDLES | XP1_EXPEDITED_DATA | XP1_GRACEFUL_CLOSE | XP1_GUARANTEED_ORDER | XP1_GUARANTEED_DELIVERY; - memcpy( &info->ProviderId, &ProviderIdIP, sizeof(GUID) ); + info->ProviderId = ProviderIdIP; info->dwCatalogEntryId = 0x3e9; info->ProtocolChain.ChainLen = 1; info->iVersion = 2; @@ -218,7 +218,7 @@ static INT WINSOCK_EnterSingleProtocolA( INT protocol, WSAPROTOCOL_INFOA* info ) info->dwServiceFlags1 = XP1_IFS_HANDLES | XP1_SUPPORT_BROADCAST | XP1_SUPPORT_MULTIPOINT | XP1_MESSAGE_ORIENTED | XP1_CONNECTIONLESS; - memcpy( &info->ProviderId, &ProviderIdIP, sizeof(GUID) ); + info->ProviderId = ProviderIdIP; info->dwCatalogEntryId = 0x3ea; info->ProtocolChain.ChainLen = 1; info->iVersion = 2; @@ -234,7 +234,7 @@ static INT WINSOCK_EnterSingleProtocolA( INT protocol, WSAPROTOCOL_INFOA* info ) info->dwServiceFlags1 = XP1_IFS_HANDLES | XP1_SUPPORT_BROADCAST | XP1_SUPPORT_MULTIPOINT | XP1_MESSAGE_ORIENTED | XP1_CONNECTIONLESS; - memcpy( &info->ProviderId, &ProviderIdIPX, sizeof(GUID) ); + info->ProviderId = ProviderIdIPX; info->dwCatalogEntryId = 0x406; info->ProtocolChain.ChainLen = 1; info->iVersion = 2; @@ -251,7 +251,7 @@ static INT WINSOCK_EnterSingleProtocolA( INT protocol, WSAPROTOCOL_INFOA* info ) info->dwServiceFlags1 = XP1_IFS_HANDLES | XP1_PSEUDO_STREAM | XP1_MESSAGE_ORIENTED | XP1_GUARANTEED_ORDER | XP1_GUARANTEED_DELIVERY; - memcpy( &info->ProviderId, &ProviderIdSPX, sizeof(GUID) ); + info->ProviderId = ProviderIdSPX; info->dwCatalogEntryId = 0x407; info->ProtocolChain.ChainLen = 1; info->iVersion = 2; @@ -267,7 +267,7 @@ static INT WINSOCK_EnterSingleProtocolA( INT protocol, WSAPROTOCOL_INFOA* info ) info->dwServiceFlags1 = XP1_IFS_HANDLES | XP1_GRACEFUL_CLOSE | XP1_PSEUDO_STREAM | XP1_MESSAGE_ORIENTED | XP1_GUARANTEED_ORDER | XP1_GUARANTEED_DELIVERY; - memcpy( &info->ProviderId, &ProviderIdSPX, sizeof(GUID) ); + info->ProviderId = ProviderIdSPX; info->dwCatalogEntryId = 0x409; info->ProtocolChain.ChainLen = 1; info->iVersion = 2; diff --git a/dlls/wsock32/socket.c b/dlls/wsock32/socket.c index d326443a6fd..6073a760c6e 100644 --- a/dlls/wsock32/socket.c +++ b/dlls/wsock32/socket.c @@ -410,7 +410,7 @@ DWORD WINAPI WsControl(DWORD protocol, TRACE("Found IP info for tei_instance 0x%x:\n", index); TRACE("IP 0x%08x, mask 0x%08x\n", table->table[i].dwAddr, table->table[i].dwMask); - memcpy(baseIPInfo, &table->table[i], sizeof(MIB_IPADDRROW)); + *baseIPInfo = table->table[i]; break; } } diff --git a/fonts/courier.sfd b/fonts/courier.sfd index 0829c25c0f7..6a21169a502 100644 --- a/fonts/courier.sfd +++ b/fonts/courier.sfd @@ -43,10 +43,10 @@ NameList: Adobe Glyph List DisplaySize: 13 AntiAlias: 0 FitToEm: 1 -WinInfo: 946 22 21 +WinInfo: 208 26 11 OnlyBitmaps: 1 TeXData: 1 0 0 346030 173015 115343 0 1048576 115343 783286 444596 497025 792723 393216 433062 380633 303038 157286 324010 404750 52429 2506097 1059062 262144 -BeginChars: 65536 362 +BeginChars: 65536 370 StartChar: space Encoding: 32 32 0 Width: 8 @@ -1891,8 +1891,56 @@ Width: 8 Flags: HW TeX: 0 0 0 0 EndChar +StartChar: Edotaccent +Encoding: 278 278 362 +Width: 8 +Flags: HW +TeX: 0 0 0 0 +EndChar +StartChar: edotaccent +Encoding: 279 279 363 +Width: 8 +Flags: HW +TeX: 0 0 0 0 +EndChar +StartChar: Iogonek +Encoding: 302 302 364 +Width: 8 +Flags: HW +TeX: 0 0 0 0 +EndChar +StartChar: iogonek +Encoding: 303 303 365 +Width: 8 +Flags: HW +TeX: 0 0 0 0 +EndChar +StartChar: Umacron +Encoding: 362 362 366 +Width: 8 +Flags: HW +TeX: 0 0 0 0 +EndChar +StartChar: umacron +Encoding: 363 363 367 +Width: 8 +Flags: HW +TeX: 0 0 0 0 +EndChar +StartChar: Uogonek +Encoding: 370 370 368 +Width: 8 +Flags: HW +TeX: 0 0 0 0 +EndChar +StartChar: uogonek +Encoding: 371 371 369 +Width: 8 +Flags: HW +TeX: 0 0 0 0 +EndChar EndChars -BitmapFont: 13 362 11 2 1 +BitmapFont: 13 370 11 2 1 BDFChar: 0 32 8 0 0 0 0 z BDFChar: 1 33 8 4 4 0 8 @@ -2617,5 +2665,21 @@ BDFChar: 360 1168 8 2 7 0 10 "9eWf5X7S"5X=6- BDFChar: 361 1169 8 1 5 0 6 #l&q#J:N.M +BDFChar: 362 278 8 1 7 0 10 +&-2\r5Y-,j5XPGM +BDFChar: 363 279 8 1 7 0 7 +&-.*0rd]TJ +BDFChar: 364 302 8 2 6 -2 8 +p`L\%+rU6ps^, +BDFChar: 368 370 8 1 7 -2 8 +mR0H26psF23"Qo, +BDFChar: 369 371 8 1 7 -2 5 +bX=ie9K!.b EndBitmapFont EndSplineFont diff --git a/fonts/courier.ttf b/fonts/courier.ttf index 80217cf61d34c3c1ceb2f517ae699cd0d18f6776..b9a9e61cbcaf35583ad6791d03ef60c6ad7df459 100644 GIT binary patch delta 1115 zcwSvpYfw~W7=E6!z#fFn0Ork(R=2c_j$hea^CZN z-<+GC%f288AWa?#FgxsRz0va%lR)uzK>AUKy|cA-YNQsZ-3>`}*n3)kOFHKU>Vzx3 z?d`o?ow=u82I?2%qWb-r3VO**PKoVsUFnPoF*WTHy`hs_=6= zdp4}w6nL%dvNV5H79MqZoc`Ro>@k_*qx@N`t+zH+Y>M_i=yTSt$qusW16`qCqA9h z%Gt+>&~xlJXlBK%EhL!lz5v5YiUkQP6FrG$B%(xHPN*=9a9mrT*p-#d0#>t;53q$D z?B-*9oWt7T#I7A*>R;%e=pX7I=ZkNK^w;&1`U!nbe|CBM@|NYsXm&I+nh`Zc zQ==)-Y8HF-8ye<1D5S zU_c8SYg*PKW|Nqu7b7@=V>pf9@dsVp!>2ezHwW;QWL%=C%`y7S z#kq?#GYk8e&I}12WHvLI7Rw9GsaF;4O*Q@Pp%jw{HJmfgAoFR#E!-9j3ULPuETWag zEWyuMEXR3#%ynGP3Rbd;)%Y7rxQ-j#!27w8n^?nI)^RiI*&teO!Drmc zCehS}U+^o=;0hx60oM@5Rs6(lY!gbV=XH-5hvHsKwVW{-`#et9n9pmR5U+h?k+isAautXzBRdiLD%v8Z9-X(Y~GX-afo{H$`5$u({QRw5i z;Ml$$unw8La>&x;q8ze7=$5rSB}YZD*jn0DYAp_~Y^n-dOR%}crWIE1$^&d_+-z!U zEQW?v5}K}@WsVKcl*G-lQrv_A!DacHUe%EEUno{877ryPh3cyJB_;<Eyx^AXs?dDc0b|EPvf=aT1 zs0cBl3n7s#MA40+mx`c=q9P$TyF64+(cSg$TkEMAX6Brk@B3!HGc!->KLuMr07IoS zBFW<_Du4X3doqyb1BOlTxJupbt#!MBTxo>I<#m6I>#7Fwglpx+#pPwCiS2eE|A|C# zloWZ2lM<5p0H;~_{*vX(yhTl=jS{awxUAvv!>)UoSY=iJRuV+ zs)GK|uu-Esa}i6poIb8m9j3A+cl6u(W&MJFPCu)k z(NF0o^y7M)eo${5a1G=PWJeRD)~F?FiW;MaD5L2A)&C%}IO2&EMck3X$gD_K@9o}- z-ld?T<`18YTgs7D*o7drU>mEk7niUD4GgFs@wtoQ5i3nNz#44EA+(_rpYWM0xr*!P z=W4FOJ+XK=nCd2OWL?aG8?cXSxt_HuU``wTnr7OtlS62c#a1TL%7mC*_=@?JcDCJO z6KRemUtCyQm(FX;D6V zs-czp)lPe-n&FtLHaX5KXG(h5my&5vtJ:RCp +BDFChar: 365 279 6 1 5 0 7 ++96A:pje0> +BDFChar: 366 302 3 0 1 -2 8 +5X7S"5X7S"5_-WM +BDFChar: 367 303 2 0 1 -2 8 +5QCdL5X7S"5_-WM +BDFChar: 368 362 8 1 6 0 10 +GQJ:N5>2uipY +82($'7"Tr>J:N5>2uipY BDFChar: 201 269 7 1 6 0 9 82($gKReT'KQmIs BDFChar: 202 270 10 1 8 0 12 @@ -3282,9 +3351,9 @@ I"Hm!Hia?NJp\+80E;(Q BDFChar: 272 351 7 1 5 -3 6 E/9$`#`*FB&7>J< BDFChar: 273 352 9 1 7 0 12 -,T$N/Jq/B!!WiFTHiO-H +82($kJq/B!!WiFTHiO-H BDFChar: 274 353 7 1 5 0 9 -82($_Lk'FMLi<=o +OC/'-Lk'FMLi<=o BDFChar: 275 354 9 0 8 -3 9 s*t@T#QP,1#QP,1#QP,1#QP,1#QOu-(]XO9 BDFChar: 276 355 3 0 2 -3 8 @@ -3461,8 +3530,24 @@ BDFChar: 362 1168 7 1 6 0 11 "9eXQJ:N0#J:N0# BDFChar: 363 1169 6 1 5 0 7 #l&q#J:N0# +BDFChar: 364 278 9 1 7 0 11 +&-2][J:REFJ:N1L +BDFChar: 365 279 8 1 6 0 8 ++96Y>K`$@RGQ7^D +BDFChar: 366 302 3 0 1 -2 9 +5X7S"5X7S"5X9k8 +BDFChar: 367 303 3 0 1 -2 9 +5QCdL5X7S"5X9k8 +BDFChar: 368 362 10 1 8 0 11 +IK4qMJUrB'JUp-M +BDFChar: 369 363 7 1 5 0 8 +p]-,+LkpkSBE/#4 +BDFChar: 370 370 10 1 8 -2 9 +JUrB'JUrB'69GM^ +BDFChar: 371 371 7 1 5 -2 6 +LkpkCLmVie(]XO9 EndBitmapFont -BitmapFont: 20 364 16 4 1 FontForge +BitmapFont: 20 374 16 4 1 FontForge BDFChar: 0 32 4 0 0 0 0 z BDFChar: 1 33 4 2 2 0 11 @@ -3851,6 +3936,18 @@ BDFChar: 192 254 9 1 7 -4 11 J:N0[`.ESmJqCqNJ:N0# BDFChar: 193 255 7 0 6 -4 11 6i[4=Jj`!T-kHq4+@&2B +BDFChar: 196 260 11 0 10 -2 11 +"98Q)$31D5&HECC+Fl\,5X7S"J09@b!'gNl +BDFChar: 197 261 9 1 8 -2 8 +I"DEKJqAT+I0'KN +BDFChar: 200 268 11 1 10 0 15 +&HE.<"98E%*rmF65X9i"J,k*"J,k*"J,hi"+FkO6 +BDFChar: 201 269 8 1 7 0 12 +6mrTH3(/@KJ:N5>2uipY +BDFChar: 206 280 11 2 9 -2 11 +s+#WMJGaqJJ:N1M"9ni+ +BDFChar: 207 281 9 1 7 -2 8 +3(/AtJ:N5>3!]om BDFChar: 222 1071 12 2 9 0 11 5='jOJO)L,&KsGk BDFChar: 223 1072 9 1 8 0 8 @@ -3941,16 +4038,16 @@ BDFChar: 271 350 11 1 9 -4 11 4odkKJ:N.M5QEtJ!<<+M!.]TM5la(K#QOu-"998= BDFChar: 272 351 8 1 6 -4 8 G_CTtGQ\/&GRt,d0E;(Q -BDFChar: 273 352 5 0 3 0 11 -E,]c8E,]c8E,]c8 -BDFChar: 274 353 5 0 3 0 11 -E,]c8E,]c8E,]c8 +BDFChar: 273 352 11 1 9 0 15 ++oi;W#QOi)4odkKJ:N.M5QEtJ!<<+M!.]TM5la(K +BDFChar: 274 353 8 1 6 0 12 +6mrTHG_CTtGQ\/&GQ7^D BDFChar: 283 376 5 0 3 0 11 E,]c8E,]c8E,]c8 -BDFChar: 288 381 5 0 3 0 11 -E,]c8E,]c8E,]c8 -BDFChar: 289 382 5 0 3 0 11 -E,]c8E,]c8E,]c8 +BDFChar: 288 381 10 0 9 0 15 +&HE.<"98E%s1eV"!.Y(M!WW?'#QPD9+94Y,J,oVb +BDFChar: 289 382 8 1 6 0 12 +6mrTHqud9:+udytSp5;Bm0YzdJyvV_UP9t4D;DSH~000|Q%p+S)eVHHEG zyz<%BLIIW1nkshe@&WxCTB~h8sD4li2$cju(6$z}3rfQD|0WLwU%ubm`_8@Z-gD16 z_uiB1=lBPgI7UoF7JfWrjxQ>iJ)~*3m#9xO(Xcb)i%N@MIeY6*L~}P2bvZP?Xjbv* zvqe89svbln%$_h|_O#OOd%sN-ZNMn$6HCTV=#!ouC(3$_hzCuaF@09a+R{3V*M#=a z#95J|l*>J@5oNdHy?Oeq!LcE=FZBIAI)4{}ITh9AH7RzFhl%`uAQFGEylUOD(p_Kw zl*p(-`;5w^nir`{fYdsIhSM`}k(htZ*TXdOz2 z+#$A~YMa^iP}{V&(zeNM;kNwNH(M9B&LXxymgeu0z42-C6i%(8Cn!oaRLiSr6E)N0 zw3h4aW@TuhNzPMG+c`?rw3D8u1N1R{!b^B5ui%xujF;2v=y8H&Sa}UU!jC#1a5Zh_ zN?ye^c1Z2j{R&&$jn;ElPC?@qPUBSW;`ECzR?iA{RP7cYX-v`KrN$mdIL7ImK{x3$ z*ddcXr?VX5Ufi3r=rX;>+1!Ww^8MV8`_o~1l?U)Z9>h7Y*kHOv?R15%avndxLwG0; zLv`%a6lUBLAaSY3YQ98 z!?mc_!QHvpEA%MB)50GkJnP~wWPe{W{3J_eXn)D{ea9Q6pgk>TO;^<)8YdOMy}3a0 zvg8Y8Wd1hS{&mizfIzYsiBzd5g~CWx+><+jyVgtPTZ83W(;AYUZ)OGGsJ6!s9uic2 zEK5#Hu)My|Y4rJ;D!RW`9RKFvWri?mv3+T5Bwh2fCYxfrWEO-s3jQ0i^HIpZf7{Jo z_4crW1*RsDf;s0U%fiUK_%j8=x$C6G;`O{xf#A{7S`;rUew*y`;|kL?i8W;dZFHZa zF|wCszoXO8O8dU>7^j1xeAz5%=-~G^RRm8S2*&4x$60LH4@^vrd8kE|SeDl}3L6^n zJRyjt!lr5o4PnZZvVGJLk_2inyGZMGKkHJ-jIg+UU&}^8$!ahp!B9;~G~j7>ei{<0 zpH8GR%^QhC4jTe#SbpTN z-7<4h%#@)@Z$%*SvLaGAlftIv^{m%@jw1W%v0$j)EU$Oe(7rT=v)-f{w*@VjxA=Ht z({)D;?e2C-ORBNS=k$1floZrND3HK&!&JyrlFLtIw3w1dU}^}5Oi4`KnYP{B9NHXe zkLNvn#%pyRs-4Fr&TVh2ol=&i*XcSVihcD-Nl96jRcD%xL@R@I2Kol<`m#*9E+qw0 z5h1#-tXPbd;23@g%m>Q>t}m$pd<#4W4gp+mQVYPs;4!cT*kCVFOvc?S{}NyV`H$c%zy$I~029Coq~LN;FoDt=U~mOj zoC3v_Qh?Pd7+k@XsbFwrJHX(|et@x+BLJtYauQqw?}Pt<1g=SgVx$I9f#&J}kOxMB zv7i`W0u}eOx)7`ckATO)4)82^9=rlDiHbX1Jq@k`+{bD=Os{}$0E%ma!DuiM%mRzR zsu+IOf=%E%09tD=0}QCW31DvR3it%v#x02f^)!$Lkd^3ARu6+o0E6mqqYgLfu!g=4 zU|b#9h`t-_1IT9dpMj$QiHIKiGk#!l9VXZR31Au>roqug2Cf;SC+H7`0a(SD0A_-@ zU7G=N{2Ie%{h;ohVsKD0&CqOZ2zySAw zfnb;ur{p9G?8JN^KVG$Pkr-P5_pNZniLpL`5Sl-zp}`Xx zyr30=i0f8ZUqhH^JHhwBO90Ag2oVh-qFn$Vf`7xltSNl2+rtu0s&Nf%^esH-PU03ov;A0|YQY0Hz9Hg#nl<@G3Y4Fi7AOfVl!# zWdI@Nq(UYxXA^^&*lZ>gGO>$ItkA^qW6lH104!&209crbI=QzbjjFmu!G5+vCdce+S{* zqT!&#ZEJJef{qceLkY(MjZJnSn%dbZcaYl&XBDNmval<|j-kHpH>GY{(>)V*%3i)l rMl{HkzvIfgJ6Rt5O+&z#&c?yr+(yNH55?D4wu;*8`meS)VyFB+QaPF# delta 2763 zcwSwW3vg7`8OOhGH=FG4eQpVbDIo+17$AWdM4?3>FTx`bItdt2AmNoDSrSV`Xo0OL zinWf9s}_rW42_f)+9IpP;#gGBPARoBY6TP_K~SbuYK0aogzfK!ZEa2FxA&ZL?>*-` z|L<|`Qz!Jy5lx7SNQ|EhaVyIz>dv0~-8qpV86qXA%ChS6eFar(MC$3s&R3SzmcMzp z>}Mj&E{X)|CQq)LG5tm3evy`HX343lsGOX)J#VVW;CvCyu9{U-Td}J84w3v*+|R43 zon4lFGWRh3vGjM=)Q(D&w08`Bm4`PoFlSM`v8~Ud>>EU~wu=OR+0?RTY4xKwW038? zFspe<o~npOSMX8X}!+()`zE0eL1x+^{dqO)V5Sd zYHMms>dDmiQV*r>Pp!IAer5EPl5VHl>NdMGyF=X>-GOeseChJRuBlyzva$UDO*Gsq=~>M)HoxH0`}u)=8_hNxLqUyJe?*OIB&zdn-D+)ZdZFYT2Ys z5|;<%Vc9Al%UQiu=V_xZ)cLwV4)DYw_2pWw%k;J$uPl*!v_ThXvp2;U*t=6BYRg(R z)a2$yb=1;ma=pZ!aNwQ9hG@$zjdW{s=HYPRje5rvr764%U1fBD>@n z9je!8fezE*IzleVWjQ6MwNQ(6q>e(eYqdm2%L{s)j?wG&2Khiflx=cEy5wCsCY^Fr zPUu*K{i=RV$0P3qov4!#xlGH|JJ&xkNOnt7el2_0)wA-Pyeb>y6}eA#$ZPUj*{ApD zMz14xmv`HMTyOJ$ZQjhhg5AJXt;D`(Y<6 zk+AC)6jZF;uwg?W=$$WG>8%@CnS5hprFx@^i<0fdOYJ~@v3G33Y;VTIdC9#K$7rwo z;^3L$ya|B}v(HP>kVdnne%lL_mU;_H$0zrcPKo0QDq%5=i;*WswL*L?X}|`a=O+3pYX)%!US7 z0o1n0eefu3few*GWH*f$;P>zb9EUS-9=b)MOdh2MMF+q&FdCRVIvwV~VrT_wOq9u^ zkHC-N=kOcY4~O8-@Gf9{l=-7);esS2$|44f80^5H&>2Hv43xo4ms0qc#Q z0?HUDWBd``fe+wQxPsbI_%aNHkuVXc+~&=|eC9Xct^_|wZT} z4vT`4JG$<|V{6)7~2d7-~&`nzYy0w6&U; zw7x?F)vTSc7kn?hllIU*5sEOdi7k5wTnFWVf%ZbU9oVH!mf1f^t4oHjkWdb>?v%m|pm;b7iAjfab&$(pmkt@_PzoHr5*#LTkj%j#hp=(jq4O6&HWv@N z?9RmnE<1CHOSb~poqG!`13ph&%8N@px=#S#4=$T@2@97q%%#M*2_|;QBp1nCfjae>H~lHYIOuDhVbE@4UK@*jL93H>UfU>HY&>=s%L~lW;NuN?=_2-of-eM3C(C z*zxpO9~jCA30vfUn)^?* J_8d9>_1|T)0WSam diff --git a/fonts/small_fonts.sfd b/fonts/small_fonts.sfd index 8e976161791..f41b2864588 100644 --- a/fonts/small_fonts.sfd +++ b/fonts/small_fonts.sfd @@ -53,7 +53,7 @@ NameList: Adobe Glyph List DisplaySize: 11 AntiAlias: 1 FitToEm: 1 -WinInfo: 704 32 21 +WinInfo: 0 61 20 OnlyBitmaps: 1 TeXData: 1 0 0 189792 94896 63264 0 1048576 63264 783286 444596 497025 792723 393216 433062 380633 303038 157286 324010 404750 52429 2506097 1059062 262144 BeginChars: 65536 416 @@ -2548,7 +2548,7 @@ Flags: HW TeX: 0 0 0 0 EndChar EndChars -BitmapFont: 11 416 9 2 1 +BitmapFont: 11 417 9 2 1 BDFChar: 0 65 7 1 6 0 6 0JH$gG_C_M BDFChar: 1 33 2 1 1 0 6 @@ -3147,14 +3147,14 @@ BDFChar: 297 342 7 1 6 -2 6 pk4=qKS5!i0E;(Q BDFChar: 298 343 3 0 2 -2 4 ?pHtB5X<*b -BDFChar: 299 302 3 1 2 -2 6 -J:N0#J:N0#^]4?7 +BDFChar: 299 302 3 0 1 -2 6 +5X7S"5X7Sb5QCca BDFChar: 300 256 7 1 6 0 8 GQ9EO84[uYKE(uP BDFChar: 301 274 5 1 4 0 8 n,Vs.JFJ)>n,NFg -BDFChar: 302 278 5 1 4 0 8 -5QL;(JFJ)>n,NFg +BDFChar: 302 278 5 0 4 0 8 ++9;1eJFJ)>p](9o BDFChar: 303 290 7 1 6 -2 6 G_CU;KT(!q?iU0, BDFChar: 304 310 6 1 5 -2 6 @@ -3171,8 +3171,8 @@ BDFChar: 309 370 6 1 5 -2 6 LkpkCLkp!m0E;(Q BDFChar: 310 362 6 1 5 0 8 Dub]MLkpkCDu]k< -BDFChar: 311 303 3 1 3 -3 6 -J,k+MJ:N0#^gI-B +BDFChar: 311 303 3 0 1 -2 6 +5QF&75X7Sb5QCca BDFChar: 312 257 5 1 4 0 6 Dua8WE0,#= BDFChar: 313 275 5 1 4 0 6 diff --git a/fonts/small_fonts.ttf b/fonts/small_fonts.ttf index 6fe98a4f9268a74202955b4d69e1caea92b3950e..cd21e512fa126f6411781bda8029048d7356e9dd 100644 GIT binary patch delta 664 zcwR-3O;6NN6o$|34D{o)ciPe!TGVmMf?)$_$ixukBf|_Eapedbwl0l(Lv-cR7}JC$ z2^;>vuBUg=fV}x-dj#D=Gx@#&FS;xy(j6#{>Ab zyL7eVx`>W+s+oDj9O-H1d59=cF-{C6*Nk&S_pXOEWOi6}`{a1i*N*QadP4QFKoApw zWsV;r*0!AXR3&`6UT^Aq3$vgVo{N3mL!OAu3V!{zbnq$nzh@AGx>~Sojm)q knmnwfHvso;QthNEV&}S3&9(XKY;JAV{pNlBSfT2?1qzIDVgLXD delta 664 zcwR-0KWNlo7{=e+#Y=Kel1tLunY40VN_*{Mi$j&7EpojpNOkg{;O^YXtvGbjsYnLt zQgH2hZXyUyf|GPqbSS!sE_z=6obQ($pMfVI55HfYFXxBnhka6r$mN$x&Y;&H-W-fi zh`O(c?7czn-pok-v^wm5_}VHx%{ydm`;4=QHOU=ND%} zq}MnO=L(0f)7LpSINPJ)=F7@v&VMu2#h(|Ct^?XsE4sl+w^c~{8HPeaMV5D1deZI9Va+LE=~z0))uos= +rkQ=br4p+`_#=`Z$ig8- BDFChar: 168 281 8 1 6 -3 6 -Gg+D,^s%$W?oS,d +Gg+D,^s%$?0Gjci BDFChar: 169 282 9 1 7 0 12 CcDFo^qdb`^qdb$rVuou BDFChar: 170 283 8 1 6 0 10 @@ -3570,8 +3623,26 @@ BDFChar: 473 1168 8 1 7 0 11 !WrA:^qdb$^qdb$ BDFChar: 474 1169 6 1 5 0 7 #l)3N^qdb$ +BDFChar: 475 302 4 1 3 -3 9 +^qdb$^qdb$^qa?n?iU0, +BDFChar: 476 303 4 1 3 -3 9 +^q]rc^qdb$^qa?n?iU0, +BDFChar: 477 362 10 1 8 0 12 +IXV:7_o'C0_o'B(49,?] +BDFChar: 478 363 8 1 6 0 9 +r;6Q=bfn;Tb^9Bj +BDFChar: 479 370 10 1 8 -3 9 +_o'C0_o'C0Aip8+"onW' +BDFChar: 480 371 8 1 6 -3 6 +bfn;TbfkGC(^pBE +BDFChar: 481 278 9 1 7 0 12 +0JEM+^qdb`^qdb$rVuou +BDFChar: 482 279 8 1 6 0 9 +0JEKObfojtb]j*f +BDFChar: 483 27 16 0 0 0 0 +z EndBitmapFont -BitmapFont: 18 475 16 2 1 +BitmapFont: 18 485 16 2 1 BDFChar: 0 32 6 0 0 0 0 z BDFChar: 1 33 7 3 3 0 13 @@ -3882,6 +3953,18 @@ BDFChar: 153 254 8 1 6 -3 9 ^qdb\bfn;TbkSuh^]4?7 BDFChar: 154 255 8 0 7 -3 9 AnD%\_e*LC4;\nh?iU0, +BDFChar: 157 260 11 1 9 -2 12 +#QP,1'EAgI+oiee+ojn/IfMb7J:N0#J:IY#!It.M +BDFChar: 158 261 8 1 6 -2 6 +Gg$SDbfkG?$ig8- +BDFChar: 161 268 11 1 9 0 15 +'EAC=!!!u=+ojn/J:N.MJ,k*"J,k*"J:Koc+oiS_ +BDFChar: 162 269 8 1 6 0 10 +b]kfAGg*t=^s%$' +BDFChar: 167 280 7 1 5 -2 12 +pjdmFJFJ)>J:N0#p^e8B +BDFChar: 168 281 9 1 6 -2 6 +Gg+D,^s%$7(]XO9 BDFChar: 183 141 8 1 6 -1 13 r;?Kjr;?Kjr;?Kjr;?Hm BDFChar: 184 143 8 1 6 -1 13 @@ -3972,6 +4055,14 @@ BDFChar: 226 237 4 0 3 0 10 E+$H]?smAM?sm@B BDFChar: 227 238 4 0 3 0 9 @.4/(?smAM?sis7 +BDFChar: 238 352 9 1 7 0 15 +-kHA<7"U"U0F.d_Jq?BM +BDFChar: 239 353 7 1 6 0 10 +b]kfAGg'PL(sI4) +BDFChar: 253 381 8 0 7 0 15 +'F4^=!6fmn,D"oo&3)k8h[B(j-4 BDFChar: 348 138 8 1 6 -1 13 @@ -3988,5 +4079,23 @@ BDFChar: 353 158 8 1 6 -1 13 r;?Kjr;?Kjr;?Kjr;?Hm BDFChar: 354 159 8 1 6 -1 13 r;?Kjr;?Kjr;?Kjr;?Hm +BDFChar: 475 302 5 1 3 -2 12 +i'9Om5X7S"5X7S"i':ZM +BDFChar: 476 303 3 1 2 -2 9 +^q]rc^qdb$^qbK9 +BDFChar: 477 362 11 2 8 0 14 +HiSbMJqAT+JqAT+Jj_Qu +BDFChar: 478 363 8 1 6 0 9 +r;6Q=bfn;Tb^9Bj +BDFChar: 479 370 11 2 8 -2 12 +JqAT+JqAT+JqASB3!]om +BDFChar: 480 371 8 1 6 -2 6 +bfn;TbfkG?$ig8- +BDFChar: 481 278 7 1 5 0 14 ++9;1eJ:N1>J:N0#J:RCp +BDFChar: 482 279 9 1 6 0 9 +0JEKObfojtb]j*f +BDFChar: 483 27 18 0 0 0 0 +z EndBitmapFont EndSplineFont diff --git a/fonts/system.ttf b/fonts/system.ttf index 437d3679986f5bd8dde00ff9476331d14738a164..6b5f0086e4dfc0bbd1803a054762813d6cae4d5c 100644 GIT binary patch delta 3115 zcwSwW33wFc8OPsuXS4V0&fX)zB%4DK0xVYoHbMwV5Csz&f?Sp42|)Q*90dr?8zgq!w;`9zP* zATmrVE}k}J@*OYzh^XRqNa;VZu&6jRC)7za@O~n;Oe`%aD_l0Yk!Vm4*3%}Il^6J~ zrT!k{QjA|ODH|FY-rSmV1e>>DVtQ3=Wy6Sd-&KgL4Mf6?M;EW0|Int{UqZudtd}mR zuADcs=A|I^LqW<}fC;KGzK`)Vj58P1E?p5QM349?k-24YeN|;vOI8b!xB&9@*H*4* zFl5pgtgp}%s;eAWTitr-9cbfT4GU*A)Gt}uHlpzkqB~)Qqb}hcP(J-)wlaWA%rR}m zv1l`Q2+E`+Ntv1?TP1ALFex=jsmhw9im4WD1hm$uw`P5phE1RAYy0N4y;gm$uhrf& zMbk~=h2ZBTBsA(zMm~nNf$}Md!pbV^AYlbq*Y+NS0+rw2{xyWArR-rdQ|&-Q@T9eLl`7_y`}RzhK94c4GH=KFc3!FWC4LJ;}%T1MXBT zV#t4q1Ds52SY||(p5p%8kAu;%;x0j%D@xJp(h-L_rfES2rP==WFW0AVghQN8|E8}v zgEQ$rbcVC|F20)w&?j_(@8N+wh_iVx51}2@#zQ&G!+1E4;E{BTdg!n8Hy*_~oXevT zhI{!toQGhH<#C)(dk~ZYp1_54kv^sE)JffRjy|Foouw`=;$npCepZsw9`-h?ZsOJSf>M|EVSqp5%ltWC;eYTKe3h@!PKxqBm4`yf=Ii_~{*rGf4WTQ3ThYAw zrIl4x)pbj4)qP!MPI{_jo>c#6eO>h;^TOU%X-eNNn#*e|s~)SbGdH4DQZfcf=5l>o zV{aRsl+j>fQrhp?GeIS0?Z1HyETZE?1PttA5BgsAq3`E@=qJPR1~~jQ`ezVD19$Sr z=y!3KvU}h{@eI=0jXy>@cSW-Y?XbB!1e0JhvDwlT?mC*=A%~SKqn;QeTEi9Q9y#2+ zZ>`A{!@A89-kWlC+>XOB(abihis{a9#lD{K-o3qV=iTneT_3JcHs*}?3T!i;tKEI} zqNw#cwO;ga&THJSxtTijfAjMaQq`*?j^EsEy>K1bwC;)D6QBUmLxemwZHZ=X6@N89`FqP zkKI@o?bm3Bq3qQjAPk&5GyXFvn18p>G5Dz;I5seKNKR#M0OnW_Itr(FdI~Z zdVu5F9sxfFF9IAR_TAtea2#9!*KlGB04g{#z;FOrjsk%4;Ft@(4;}~40LXEm);azF z-Xn@Q&Z2V}+(5m+$t&Un67L2hK{0?35yekLK@)LyiJJg~h&#aB-~{Lb*NL1k)`=6` z31yrzNCS6)!C(})51>*x9|UtiEk(!)3!P7b=K(6J6GEMb!AAg!IlqGApqMKFpqMKM z6oDxK-g4D|Ch!zML3O^caKt6cZ19-~wD)nB2ng}sENvF_WMcKrsYBbWvD4%4MQA{tQ9f^{PyQ;A;QJly)gK>1B zUCa)YDKfU8I6*<-f#H$7Y|L^6wd6(DEtLS~shHtFM; z|2LkikC88wuFtK}=Wti0EPZafKIbCs3Wr-T$ko@*>uYw37;vYfOvIT4hkKe@y1Hd+xm_ zC+Gam@BHrm5A~Vd+94_;UOtkq})GFqbe^`CM{oCc#zJUxN-M_*2cDnYs1%zq}GVozxrXzvZmP^ z>;ETW{Fmo7%?~v`ICtUZ5dFt+UD(VGS(wzv^&GBqnp+ny4IH2)`Y#b@L(8HCjX6U( zLn7|!jQ3V+3+T+mFbc!6Rn@8=If8F{i*f7u#VFLE!JsTqLo^s_v(CW zN?QFr{qer|j`;TY8}V)Nt?{n-=J>1ejq!Ey_Tk%yrwkXxHpJG)UXHDcy%ejD&5hj~ ztBu_mtBK8yRmCb}!Ha{@?&xo$+oNwrw?(_6o1%Hq2}65^c8Xf((pn<((yKJ^iL8{x zvP72YL3v(!q*K~;z~|%L$b`u^aNVyrhTZG5LwSB3tF( z@*nNhKK)n^Xus~0kLhtl9rQk`NAyo4`}e85p!@ZYde|y(XI=G~dekQ?)KD)EUsS)E znvv)iX><43Bl+HgE;i-D*gmb5ujL!LAOo7E<274z0~X`BAp_;3GdB%i%zvNGXojZ^j5u1rxWf{ouOsc zO_>d*{6d%L6Z&Ias>}3AZP%x)Et$u2Tm=km6^BYm<%cFJC2_K~cXH>6+Qmk;y{ z{Zh~9SJtkqGuH0$dG|S7&NPQQQ`!qo z94hKBXtSO!eD>Tqw-+J+(PmZFl#`l8p>np-?IvZHuk za6(#!q#13EJ*%4Ro1{TI9sj(#z3KewDb$3K-A;T`5S-0c_nq0r1BRg_v-2<~u$w2z zi7v))#>mk!VkG`~Q{~E!T@RZk{q0QHRlCOC!9h=-h-s(*X_h`83&9~ye+Cv_Lk~W{ z5uCs|&M;%TI9@IT<3Vw8-G)2x12B%O9na%u*oxnS8sIu6(&0Kug9_xfBY+%Sce$dt zXX61Z!YXV4gSdZ%-+=YH-^P2`i%;=q`~_cv)qBWe&sE67R4}IJK2S0}?b0D0>Z^zH z=-GmI(2t||8@|8=k&JYF2e~K$k;=FW3-B0LU_CZtJKo19V2ljL$oQHqp->q_$+!mj zxEYlld{A4B`_YOgu^Q{ZN)0AuM8JRst1|{c#0=`Magnmhpk5PWLDalV&dcPywO~vy ztMo3zb9e=e=iLd$^HRyZ9fZpJIld7w*+(-7LS>R|W;MtKlZly3)MQfTFY!AtfXRf+ zzk(H-M9D{q_3`rXu{s~2_K{1zdhqu?w$H~~&c_6NJJ5^7{`*eRI15(er$+e+k)PH0 z3AMivC76Y|co5`*pM>(WB0u@ye-*s){0!TB3Ax wahn_Arid}G!agbc=xD+4T)v-ua`f6UdVTs^*JmR&^IL4L-V=*Pid5qJ|FtUL%m4rY diff --git a/fonts/tahoma.sfd b/fonts/tahoma.sfd index 17548f9626a..c62946f44c5 100644 --- a/fonts/tahoma.sfd +++ b/fonts/tahoma.sfd @@ -12,13 +12,13 @@ UnderlinePosition: -170 UnderlineWidth: 130 Ascent: 1638 Descent: 410 -XUID: [1021 135 1692684408 1110813] +XUID: [1021 135 1692684408 1110817] FSType: 0 OS2Version: 2 OS2_WeightWidthSlopeOnly: 0 OS2_UseTypoMetrics: 1 CreationTime: 1169210120 -ModificationTime: 1205132887 +ModificationTime: 1206566066 PfmFamily: 33 TTFWeight: 400 TTFWidth: 5 @@ -94,7 +94,7 @@ NameList: Adobe Glyph List DisplaySize: 16 AntiAlias: 1 FitToEm: 1 -WinInfo: 899 29 12 +WinInfo: 0 28 11 BeginPrivate: 10 BlueValues 27 [-30 0 1120 1177 1522 1522] OtherBlues 11 [-426 -426] @@ -108,7 +108,7 @@ SnapStemV 9 [184 203] ExpansionFactor 4 0.06 EndPrivate TeXData: 1 0 0 327680 163840 109226 571904 -1048576 109226 783286 444596 497025 792723 393216 433062 380633 303038 157286 324010 404750 52429 2506097 1059062 262144 -BeginChars: 65537 418 +BeginChars: 65537 425 StartChar: .notdef Encoding: 0 0 0 Width: 2048 @@ -565,8 +565,8 @@ EndChar StartChar: four Encoding: 52 52 21 Width: 1118 -Flags: HW -HStem: 0 21G<673 874> 524 168<280 673 874 1087> +Flags: W +HStem: 0 21G<673 874> 524 168<286.644 673 874 1087> VStem: 675 199<0 524 692 1185> Fore 40 690 m 1 @@ -2357,22 +2357,9 @@ StartChar: exclamdown Encoding: 161 161 96 Width: 680 Flags: W -HStem: 0 21G<227 430> 1239 254<227 430> -VStem: 227 203<0 759.448 1239 1493> -Fore -430 1493 m 1 - 430 1239 l 1 - 227 1239 l 1 - 227 1493 l 1 - 430 1493 l 1 -430 655 m 1 - 430 0 l 1 - 227 0 l 1 - 227 655 l 1 - 248 1012 l 1 - 410 1012 l 1 - 430 655 l 1 -EndSplineSet +HStem: 1239 254<229 432> +VStem: 229 203<0 759.448 1239 1493> +Refer: 2 33 N -1 0 0 -1 659 1493 2 EndChar StartChar: cent Encoding: 162 162 97 @@ -2759,10 +2746,10 @@ Fore EndSplineSet EndChar StartChar: overscore -Encoding: 175 175 109 -AltUni: 713 +Encoding: 175 175 424 Width: 1118 Flags: W +TeX: 0 0 0 0 HStem: 1671 135<-16 989> Fore -16 1806 m 1 @@ -3166,71 +3153,28 @@ StartChar: questiondown Encoding: 191 191 124 Width: 971 Flags: W -HStem: -29 164<411.6 636.067> 1239 254<408 610> -VStem: 57 203<249.933 412> 414 190<833.03 1092 1239 1493> -Fore -414 969 m 2 - 414 1092 l 1 - 604 1092 l 1 - 604 936 l 2 - 604 864 592.667 805.333 570 760 c 0 - 549.333 718 512.333 670.667 459 618 c 2 - 369 530 l 2 - 296.333 459.333 260 394 260 334 c 0 - 260 269.333 284.667 219 334 183 c 0 - 376.667 151 432 135 500 135 c 0 - 604.667 135 722.667 180.667 854 272 c 1 - 854 84 l 1 - 728.667 8.66667 599 -29 465 -29 c 0 - 347 -29 251.667 0 179 58 c 0 - 97.6667 121.333 57 210 57 324 c 0 - 57 418.667 111 518.333 219 623 c 2 - 307 709 l 2 - 332 734 350 753 361 766 c 0 - 381 790.667 394.333 813.333 401 834 c 0 - 409.667 858 414 903 414 969 c 2 -610 1493 m 1 - 610 1239 l 1 - 408 1239 l 1 - 408 1493 l 1 - 610 1493 l 1 -EndSplineSet +HStem: -27 164<320.69 634.333> 1239 254<408 611> +VStem: 58 203<168.22 413.13> 408 203<800.003 1092 1239 1493> +Refer: 32 63 N -1 0 0 -1 964 1493 2 KernsSLIFO: 43 31 0 0 EndChar StartChar: Agrave Encoding: 192 192 125 Width: 1229 Flags: W -HStem: 0 21G<-10 190 1029 1238> 416 169<380 839> -Fore -290 1961 m 1 - 477 1961 l 1 - 673 1697 l 1 - 520 1697 l 1 - 290 1961 l 1 -839 585 m 1 - 614 1294 l 1 - 380 585 l 1 - 839 585 l 1 --10 0 m 1 - 500 1493 l 1 - 729 1493 l 1 - 1238 0 l 1 - 1029 0 l 1 - 894 416 l 1 - 325 416 l 1 - 190 0 l 1 - -10 0 l 1 -EndSplineSet +HStem: 0 21<-10 190 1029 1238> 416 169<380 839> 1697 374<492 671> +VStem: 249 422<1697 2071> +Refer: 65 96 N 1 0 0 1 1 395 2 +Refer: 34 65 N 1 0 0 1 0 0 2 EndChar StartChar: Aacute Encoding: 193 193 126 Width: 1229 Flags: W -HStem: 0 21<-10 190 1029 1238> 416 169<380 839> 1675 375<637 874> -VStem: 637 459<1675 2050> +HStem: 0 21<-10 190 1029 1238> 416 169<380 839> 1675 375<553 790> +VStem: 553 459<1675 2050> Refer: 34 65 N 1 0 0 1 0 0 2 -Refer: 114 180 N 1 0 0 1 188 373 2 +Refer: 114 180 S 1 0 0 1 104 373 2 EndChar StartChar: Acircumflex Encoding: 194 194 127 @@ -3359,28 +3303,10 @@ StartChar: Egrave Encoding: 200 200 133 Width: 1149 Flags: W -HStem: 0 176<350 1083> 729 176<350 1033> 1313 176<350 1083> -VStem: 152 198<176 729 905 1313> -Fore -368 1980 m 1 - 555 1980 l 1 - 751 1716 l 1 - 598 1716 l 1 - 368 1980 l 1 -152 0 m 1 - 152 1489 l 1 - 1083 1489 l 1 - 1083 1313 l 1 - 350 1313 l 1 - 350 905 l 1 - 1033 905 l 1 - 1033 729 l 1 - 350 729 l 1 - 350 176 l 1 - 1083 176 l 1 - 1083 0 l 1 - 152 0 l 1 -EndSplineSet +HStem: 0 176<350 1083> 729 176<350 1033> 1313 176<350 1083> 1716 374<570 749> +VStem: 152 198<176 729 905 1313> 327 422<1716 2090> +Refer: 38 69 S 1 0 0 1 0 0 2 +Refer: 65 96 N 1 0 0 1 79 414 2 EndChar StartChar: Eacute Encoding: 201 201 134 @@ -3413,28 +3339,10 @@ StartChar: Igrave Encoding: 204 204 137 Width: 764 Flags: W -HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> -VStem: 280 198<152 1337> -Fore -112 1899 m 1 - 299 1899 l 1 - 497 1635 l 1 - 342 1635 l 1 - 112 1899 l 1 -92 1489 m 1 - 670 1489 l 1 - 670 1337 l 1 - 478 1337 l 1 - 478 152 l 1 - 670 152 l 1 - 670 0 l 1 - 92 0 l 1 - 92 152 l 1 - 280 152 l 1 - 280 1337 l 1 - 92 1337 l 1 - 92 1489 l 1 -EndSplineSet +HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> 1635 374<315 494> +VStem: 72 422<1635 2009> 280 198<152 1337> +Refer: 42 73 N 1 0 0 1 0 0 2 +Refer: 65 96 N 1 0 0 1 -176 333 2 EndChar StartChar: Iacute Encoding: 205 205 138 @@ -3449,63 +3357,20 @@ StartChar: Icircumflex Encoding: 206 206 139 Width: 764 Flags: W -HStem: 0 152<126 314 512 704> 1337 152<126 314 512 704> -VStem: 314 198<152 1337> -Fore -126 1489 m 1 - 704 1489 l 1 - 704 1337 l 1 - 512 1337 l 1 - 512 152 l 1 - 704 152 l 1 - 704 0 l 1 - 126 0 l 1 - 126 152 l 1 - 314 152 l 1 - 314 1337 l 1 - 126 1337 l 1 - 126 1489 l 1 -299 2053 m 1 - 515 2053 l 1 - 745 1669 l 1 - 585 1669 l 1 - 403 1926 l 1 - 203 1669 l 1 - 43 1669 l 1 - 299 2053 l 1 -EndSplineSet +HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> 1668.83 384<289 735> +VStem: 33 702<1668.83 1668.83> 280 198<152 1337> +Refer: 225 710 S 1 0 0 1 -184 372.833 2 +Refer: 42 73 N 1 0 0 1 0 0 2 EndChar StartChar: Idieresis Encoding: 207 207 140 Width: 764 Flags: W -HStem: 0 152<122 310 508 700> 1337 152<122 310 508 700> 1677 203<76 279 489 692> -VStem: 76 203<1677 1880> 310 198<152 1337> 489 203<1677 1880> -Fore -76 1677 m 1xf0 - 76 1880 l 1 - 279 1880 l 1 - 279 1677 l 1 - 76 1677 l 1xf0 -489 1677 m 1xf4 - 489 1880 l 1 - 692 1880 l 1 - 692 1677 l 1 - 489 1677 l 1xf4 -122 1489 m 1 - 700 1489 l 1 - 700 1337 l 1 - 508 1337 l 1 - 508 152 l 1 - 700 152 l 1 - 700 0 l 1 - 122 0 l 1 - 122 152 l 1 - 310 152 l 1 - 310 1337 l 1xf8 - 122 1337 l 1 - 122 1489 l 1 -EndSplineSet +HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> 1677 203<71 274 484 687> +VStem: 71 203<1677 1880> 280 198<152 1337> 484 203<1677 1880> +CounterMasks: 1 00 +Refer: 103 168 S 1 0 0 1 -183 373 2 +Refer: 42 73 N 1 0 0 1 0 0 2 EndChar StartChar: Eth Encoding: 208 208 141 @@ -3544,36 +3409,19 @@ StartChar: Ntilde Encoding: 209 209 142 Width: 1366 Flags: W -HStem: 0 21<152 337 995 1217> 1675 374<555 734> -VStem: 152 185<0 1284> 312 422<1675 2049> 1032 185<310 1489> +HStem: 0 21<152 337 995 1217> 1675 147<803.588 943.167> 1795 148<420.833 560.153> +VStem: 152 185<0 1284> 1032 185<310 1489> +Refer: 231 732 S 1 0 0 1 122.5 333 2 Refer: 47 78 N 1 0 0 1 0 0 2 -Refer: 65 96 N 1 0 0 1 64 373 2 EndChar StartChar: Ograve Encoding: 210 210 143 Width: 1450 Flags: W -HStem: 1345 170<486.673 862.285> -VStem: 66 204<367.578 1031.53> -Fore -385 1957 m 1 - 572 1957 l 1 - 768 1693 l 1 - 615 1693 l 1 - 385 1957 l 1 -906.5 1494 m 0 - 1451.58 1355.63 1448.32 631.789 1292.5 316 c 0 - 1075.34 -124.11 553.765 -78.9474 334.5 89 c 0 - 230.093 168.971 66 342.532 66 724 c 0 - 66 1078.75 170.663 1495.69 701 1515 c 0 - 772.333 1517.67 840.833 1510.67 906.5 1494 c 0 -913 182.5 m 0 - 1271.58 352.711 1198.7 964.267 1077.5 1157 c 0 - 992.412 1292.3 869.686 1340.99 715 1345 c 0 - 539.364 1346.67 256.189 1253.57 270 727 c 0 - 276.572 431.27 376.208 133.931 742 143 c 0 - 803.333 144.333 860.333 157.5 913 182.5 c 0 -EndSplineSet +HStem: 1345 170<486.673 862.285> 1693 374<586.5 765.5> +VStem: 66 204<367.578 1031.53> 343.5 422<1693 2067> +Refer: 48 79 N 1 0 0 1 0 0 2 +Refer: 65 96 N 1 0 0 1 95.5 391 2 EndChar StartChar: Oacute Encoding: 211 211 144 @@ -3606,30 +3454,10 @@ StartChar: Odieresis Encoding: 214 214 147 Width: 1450 Flags: W -HStem: -29 172<251.12 967.16> 1345 170<483.6 1161.79> 1682 203<407 610 820 1023> -VStem: 66 204<359.084 1409.94> 407 203<1682 1885> 820 203<1682 1885> 1175 206<112.364 1185.08> -Fore -820 1682 m 1 - 820 1885 l 1 - 1023 1885 l 1 - 1023 1682 l 1 - 820 1682 l 1 -407 1682 m 1 - 407 1885 l 1 - 610 1885 l 1 - 610 1682 l 1 - 407 1682 l 1 -66 724 m 0 - 66 1411.11 447.044 1515.04 701 1515 c 0 - 1122.31 1514.94 1381 1228.66 1381 723 c 0 - 1381 129.637 1005.72 -29 722 -29 c 0 - 197.2 -29 66 411.013 66 724 c 0 -742 143 m 0 - 915.2 143 1175 258.126 1175 744 c 0 - 1175 1083.29 1058.68 1345 715 1345 c 0 - 537 1345 270 1252.34 270 727 c 0 - 270 443.987 364.4 143 742 143 c 0 -EndSplineSet +HStem: 1345 170<486.673 862.285> 1682 203<415.5 618.5 828.5 1031.5> +VStem: 66 204<367.578 1031.53> 415.5 203<1682 1885> 828.5 203<1682 1885> +Refer: 48 79 N 1 0 0 1 0 0 2 +Refer: 103 168 S 1 0 0 1 161.5 378 2 EndChar StartChar: multiply Encoding: 215 215 148 @@ -3692,28 +3520,10 @@ StartChar: Ugrave Encoding: 217 217 150 Width: 1343 Flags: W -HStem: -29 164<523.867 886.133> -VStem: 166 198<1119.99 1489> 166 191<418.199 1379.68> 1042 201<417.44 1489> -Fore -166 561 m 2xb0 - 166 1489 l 1 - 364 1489 l 1xd0 - 357 595 l 2 - 363 434.333 380.333 323.333 409 262 c 1 - 467 177.333 565.667 135 705 135 c 0 - 844.333 135 943 177.333 1001 262 c 1 - 1028.33 336.667 1041.54 444.001 1042 584 c 2 - 1045 1489 l 1 - 1243 1489 l 1 - 1243 560 l 2 - 1265 167.333 1085.67 -29 705 -29 c 0 - 323.667 -29 144 167.667 166 561 c 2xb0 -486 1919 m 1 - 673 1919 l 1 - 869 1655 l 1 - 716 1655 l 1 - 486 1919 l 1 -EndSplineSet +HStem: -29 164<523.867 886.133> 1654.83 374<688.167 867.167> +VStem: 166 191<418.199 1379.68> 166 198<1119.99 1489> 445.167 422<1654.83 2028.83> 1042 201<417.44 1489> +Refer: 65 96 N 1 0 0 1 197.167 352.833 2 +Refer: 54 85 N 1 0 0 1 0 0 2 EndChar StartChar: Uacute Encoding: 218 218 151 @@ -3815,121 +3625,28 @@ StartChar: agrave Encoding: 224 224 157 Width: 1075 Flags: W -HStem: -27 154<364.467 586.333> 565 144<463.341 767> 993 156<342.4 588.733> -VStem: 57 171<253.333 466.533> 767 171<0 172 416 565 709 815.667> -Fore -361 1638 m 1 - 558 1638 l 1 - 840 1264 l 1 - 687 1264 l 1 - 361 1638 l 1 -767 565 m 1 - 596 565 l 2 - 484.667 565 403.667 555.333 353 536 c 0 - 269.667 502.667 228 437.333 228 340 c 0 - 228 273.333 248.333 221 289 183 c 0 - 330.333 145.667 384.667 127 452 127 c 0 - 555.333 127 635.667 168.667 693 252 c 0 - 742.333 325.333 767 416 767 524 c 2 - 767 565 l 1 -938 641 m 2 - 938 0 l 1 - 767 0 l 1 - 767 172 l 1 - 690.333 39.3333 570 -27 406 -27 c 0 - 297.333 -27 212 5 150 69 c 0 - 88 133 57 219.333 57 328 c 0 - 57 582 213.333 709 526 709 c 2 - 767 709 l 1 - 767 727 l 2 - 767 815.667 739 883 683 929 c 0 - 632.333 971.667 561.333 993 470 993 c 0 - 350.667 993 238.333 962.333 133 901 c 1 - 133 1071 l 1 - 257.667 1123 376 1149 488 1149 c 0 - 788 1149 938 979.667 938 641 c 2 -EndSplineSet +HStem: -27 154<403.467 585.467> 563 157<445 647.414> 993 156<382.267 627.733> 1264 374<498.5 677.5> +VStem: 57 171<249.333 463.4> 255.5 422<1264 1638> 759 187<0 132.535 414 563> +Refer: 66 97 N 1 0 0 1 0 0 2 +Refer: 65 96 S 1 0 0 1 7.5 -38 2 EndChar StartChar: aacute Encoding: 225 225 158 Width: 1075 Flags: W -HStem: -27 154<364.467 586.333> 565 144<463.341 767> 993 156<342.4 588.733> -VStem: 57 171<253.333 466.533> 767 171<0 172 416 565 709 815.667> -Fore -361 1262 m 1 - 641 1638 l 1 - 840 1638 l 1 - 514 1262 l 1 - 361 1262 l 1 -767 565 m 1 - 596 565 l 2 - 484.667 565 403.667 555.333 353 536 c 0 - 269.667 502.667 228 437.333 228 340 c 0 - 228 273.333 248.333 221 289 183 c 0 - 330.333 145.667 384.667 127 452 127 c 0 - 555.333 127 635.667 168.667 693 252 c 0 - 742.333 325.333 767 416 767 524 c 2 - 767 565 l 1 -938 641 m 2 - 938 0 l 1 - 767 0 l 1 - 767 172 l 1 - 690.333 39.3333 570 -27 406 -27 c 0 - 297.333 -27 212 5 150 69 c 0 - 88 133 57 219.333 57 328 c 0 - 57 582 213.333 709 526 709 c 2 - 767 709 l 1 - 767 727 l 2 - 767 815.667 739 883 683 929 c 0 - 632.333 971.667 561.333 993 470 993 c 0 - 350.667 993 238.333 962.333 133 901 c 1 - 133 1071 l 1 - 257.667 1123 376 1149 488 1149 c 0 - 788 1149 938 979.667 938 641 c 2 -EndSplineSet +HStem: -27 154<403.467 585.467> 563 157<445 647.414> 993 156<382.267 627.733> 1262 375<360.5 597.5> +VStem: 57 171<249.333 463.4> 360.5 459<1262 1637> 759 187<0 132.535 414 563> +Refer: 66 97 N 1 0 0 1 0 0 2 +Refer: 114 180 N 1 0 0 1 -88.5 -40 2 EndChar StartChar: acircumflex Encoding: 226 226 159 Width: 1075 Flags: W -HStem: -27 154<364.467 586.333> 565 144<463.341 767> 993 156<342.4 588.733> -VStem: 57 171<253.333 466.533> 767 171<0 172 416 565 709 815.667> -Fore -176 1268 m 1 - 421 1644 l 1 - 569 1644 l 1 - 814 1268 l 1 - 675 1268 l 1 - 495 1513 l 1 - 315 1268 l 1 - 176 1268 l 1 -767 565 m 1 - 596 565 l 2 - 484.667 565 403.667 555.333 353 536 c 0 - 269.667 502.667 228 437.333 228 340 c 0 - 228 273.333 248.333 221 289 183 c 0 - 330.333 145.667 384.667 127 452 127 c 0 - 555.333 127 635.667 168.667 693 252 c 0 - 742.333 325.333 767 416 767 524 c 2 - 767 565 l 1 -938 641 m 2 - 938 0 l 1 - 767 0 l 1 - 767 172 l 1 - 690.333 39.3333 570 -27 406 -27 c 0 - 297.333 -27 212 5 150 69 c 0 - 88 133 57 219.333 57 328 c 0 - 57 582 213.333 709 526 709 c 2 - 767 709 l 1 - 767 727 l 2 - 767 815.667 739 883 683 929 c 0 - 632.333 971.667 561.333 993 470 993 c 0 - 350.667 993 238.333 962.333 133 901 c 1 - 133 1071 l 1 - 257.667 1123 376 1149 488 1149 c 0 - 788 1149 938 979.667 938 641 c 2 -EndSplineSet +HStem: -27 154<403.467 585.467> 563 157<445 647.414> 993 156<382.267 627.733> 1268 384<398.5 844.5> +VStem: 57 171<249.333 463.4> 142.5 702<1268 1268> 759 187<0 132.535 414 563> +Refer: 66 97 N 1 0 0 1 0 0 2 +Refer: 225 710 N 1 0 0 1 -74.5 -28 2 EndChar StartChar: atilde Encoding: 227 227 160 @@ -3944,45 +3661,10 @@ StartChar: adieresis Encoding: 228 228 161 Width: 1075 Flags: W -HStem: -27 154<364.467 586.333> 565 144<423.543 767> 993 156<342.4 588.733> 1351 202<215 418 606 809> -VStem: 57 171<253.333 466.533> 215 203<1351 1553> 606 203<1351 1553> 767 171<0 172 416 565> -Fore -938 641 m 2xf9 - 938 0 l 1 - 767 0 l 1 - 767 172 l 1 - 690.333 39.3333 570 -27 406 -27 c 0 - 297.333 -27 212 5 150 69 c 0 - 88 133 57 219.333 57 328 c 0 - 57 582 213.333 709 526 709 c 2 - 767 709 l 1 - 767 727 l 2 - 767 815.667 739 883 683 929 c 0 - 632.333 971.667 561.333 993 470 993 c 0 - 350.667 993 238.333 962.333 133 901 c 1 - 133 1071 l 1 - 257.667 1123 376 1149 488 1149 c 0 - 788 1149 938 979.667 938 641 c 2xf9 -767 565 m 1 - 596 565 l 2 - 484.667 565 403.667 555.333 353 536 c 0 - 269.667 502.667 228 437.333 228 340 c 0 - 228 273.333 248.333 221 289 183 c 0 - 330.333 145.667 384.667 127 452 127 c 0 - 555.333 127 635.667 168.667 693 252 c 0 - 742.333 325.333 767 416 767 524 c 2 - 767 565 l 1 -215 1351 m 1xf4 - 215 1553 l 1 - 418 1553 l 1 - 418 1351 l 1 - 215 1351 l 1xf4 -606 1351 m 1xf2 - 606 1553 l 1 - 809 1553 l 1 - 809 1351 l 1 - 606 1351 l 1xf2 -EndSplineSet +HStem: -27 154<403.467 585.467> 563 157<445 647.414> 993 156<382.267 627.733> 1351 203<194 397 607 810> +VStem: 57 171<249.333 463.4> 194 203<1351 1554> 607 203<1351 1554> 759 187<0 132.535 414 563> +Refer: 66 97 N 1 0 0 1 0 0 2 +Refer: 103 168 S 1 0 0 1 -60 47 2 EndChar StartChar: aring Encoding: 229 229 162 @@ -4077,227 +3759,100 @@ StartChar: egrave Encoding: 232 232 165 Width: 1077 Flags: W -HStem: -41 157<380.5 780.467> 507 144<246 866> 985 157<448.133 698.6> -VStem: 866 174<598 775.933> -Fore -204 1642 m 1 - 401 1642 l 1 - 683 1268 l 1 - 530 1268 l 1 - 204 1642 l 1 -1040 598 m 2 - 1040 507 l 1 - 240 507 l 1 - 256 246.333 382 116 618 116 c 0 - 749 116 876 151 999 221 c 1 - 999 46 l 1 - 871 -12 740.667 -41 608 -41 c 0 - 433 -41 297 13 200 121 c 0 - 106 224.333 59 364 59 540 c 0 - 59 715.333 100.667 856.667 184 964 c 0 - 276 1082.67 407.333 1142 578 1142 c 0 - 730.667 1142 848 1088 930 980 c 0 - 1003.33 882.667 1040 755.333 1040 598 c 2 -246 651 m 1 - 866 652 l 1 - 864.667 747.333 841 825 795 885 c 0 - 743 951.667 671 985 579 985 c 0 - 478.333 985 399 954.333 341 893 c 0 - 286.333 835.667 254.667 755 246 651 c 1 -EndSplineSet +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1268.5 374<501 680> +VStem: 258 422<1268.5 1642.5> 866 174<630 812> +Refer: 70 101 N 1 0 0 1 0 0 2 +Refer: 65 96 N 1 0 0 1 10 -33.5 2 EndChar StartChar: eacute Encoding: 233 233 166 Width: 1077 Flags: W -HStem: -41 157<380.5 780.467> 507 144<246 866> 985 157<448.133 698.6> -VStem: 866 174<598 775.933> -Fore -469 1262 m 1 - 749 1638 l 1 - 948 1638 l 1 - 622 1262 l 1 - 469 1262 l 1 -1040 598 m 2 - 1040 507 l 1 - 240 507 l 1 - 256 246.333 382 116 618 116 c 0 - 749 116 876 151 999 221 c 1 - 999 46 l 1 - 871 -12 740.667 -41 608 -41 c 0 - 433 -41 297 13 200 121 c 0 - 106 224.333 59 364 59 540 c 0 - 59 715.333 100.667 856.667 184 964 c 0 - 276 1082.67 407.333 1142 578 1142 c 0 - 730.667 1142 848 1088 930 980 c 0 - 1003.33 882.667 1040 755.333 1040 598 c 2 -246 651 m 1 - 866 652 l 1 - 864.667 747.333 841 825 795 885 c 0 - 743 951.667 671 985 579 985 c 0 - 478.333 985 399 954.333 341 893 c 0 - 286.333 835.667 254.667 755 246 651 c 1 -EndSplineSet +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1263 375<457 694> +VStem: 457 459<1263 1638> 866 174<630 812> +Refer: 70 101 N 1 0 0 1 0 0 2 +Refer: 114 180 N 1 0 0 1 8 -39 2 EndChar StartChar: ecircumflex Encoding: 234 234 167 Width: 1077 Flags: W -HStem: -41 157<380.5 780.467> 507 144<246 866> 985 157<448.133 698.6> -VStem: 866 174<598 775.933> -Fore -243 1260 m 1 - 488 1636 l 1 - 636 1636 l 1 - 881 1260 l 1 - 742 1260 l 1 - 562 1505 l 1 - 382 1260 l 1 - 243 1260 l 1 -1040 598 m 2 - 1040 507 l 1 - 240 507 l 1 - 256 246.333 382 116 618 116 c 0 - 749 116 876 151 999 221 c 1 - 999 46 l 1 - 871 -12 740.667 -41 608 -41 c 0 - 433 -41 297 13 200 121 c 0 - 106 224.333 59 364 59 540 c 0 - 59 715.333 100.667 856.667 184 964 c 0 - 276 1082.67 407.333 1142 578 1142 c 0 - 730.667 1142 848 1088 930 980 c 0 - 1003.33 882.667 1040 755.333 1040 598 c 2 -246 651 m 1 - 866 652 l 1 - 864.667 747.333 841 825 795 885 c 0 - 743 951.667 671 985 579 985 c 0 - 478.333 985 399 954.333 341 893 c 0 - 286.333 835.667 254.667 755 246 651 c 1 -EndSplineSet +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1259.5 384<460.5 906.5> +VStem: 204.5 702<1259.5 1259.5> 866 174<630 812> +Refer: 70 101 N 1 0 0 1 0 0 2 +Refer: 225 710 S 1 0 0 1 -12.5 -36.5 2 EndChar StartChar: edieresis Encoding: 235 235 168 Width: 1077 Flags: W -HStem: -41 157<380.5 780.467> 507 144<246 866> 985 157<448.133 698.6> 1360 202<250 453 641 844> -VStem: 250 203<1360 1562> 641 203<1360 1562> 866 174<598 775.933> -Fore -641 1360 m 1 - 641 1562 l 1 - 844 1562 l 1 - 844 1360 l 1 - 641 1360 l 1 -250 1360 m 1 - 250 1562 l 1 - 453 1562 l 1 - 453 1360 l 1 - 250 1360 l 1 -1040 598 m 2 - 1040 507 l 1 - 240 507 l 1 - 256 246.333 382 116 618 116 c 0 - 749 116 876 151 999 221 c 1 - 999 46 l 1 - 871 -12 740.667 -41 608 -41 c 0 - 433 -41 297 13 200 121 c 0 - 106 224.333 59 364 59 540 c 0 - 59 715.333 100.667 856.667 184 964 c 0 - 276 1082.67 407.333 1142 578 1142 c 0 - 730.667 1142 848 1088 930 980 c 0 - 1003.33 882.667 1040 755.333 1040 598 c 2 -246 651 m 1 - 866 652 l 1 - 864.667 747.333 841 825 795 885 c 0 - 743 951.667 671 985 579 985 c 0 - 478.333 985 399 954.333 341 893 c 0 - 286.333 835.667 254.667 755 246 651 c 1 -EndSplineSet +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1360 203<246 449 659 862> +VStem: 246 203<1360 1563> 659 203<1360 1563> 866 174<630 812> +Refer: 70 101 N 1 0 0 1 0 0 2 +Refer: 103 168 S 1 0 0 1 -8 56 2 EndChar StartChar: igrave Encoding: 236 236 169 Width: 469 Flags: W -HStem: 0 21G<156 340> 1100 20G<156 340> -VStem: 156 184<0 1120> +HStem: 0 21G<129 313> 1100 20G<129 313> 1269 374<119 298> +VStem: -124 422<1269 1643> 129 184<0 1120> Fore --158 1642 m 1 - 39 1642 l 1 - 321 1268 l 1 - 168 1268 l 1 - -158 1642 l 1 -156 0 m 1 - 156 1120 l 1 - 340 1120 l 1 - 340 0 l 1 - 156 0 l 1 +129 0 m 1xe8 + 129 1120 l 1 + 313 1120 l 1 + 313 0 l 1 + 129 0 l 1xe8 EndSplineSet +Refer: 65 96 S 1 0 0 1 -372 -33 2 EndChar StartChar: iacute Encoding: 237 237 170 Width: 469 Flags: W -HStem: 0 21G<121 305> 1100 20G<121 305> -VStem: 121 184<0 1120> -Fore -132 1256 m 1 - 412 1632 l 1 - 611 1632 l 1 - 285 1256 l 1 - 132 1256 l 1 -121 0 m 1 - 121 1120 l 1 - 305 1120 l 1 - 305 0 l 1 - 121 0 l 1 +HStem: 0 21G<127 311> 1100 20G<127 311> 1256 375<127 364> +VStem: 127 184<0 1120> 127 459<1256 1631> +Fore +127 0 m 1xf0 + 127 1120 l 1 + 311 1120 l 1 + 311 0 l 1 + 127 0 l 1xf0 EndSplineSet +Refer: 114 180 S 1 0 0 1 -322 -46 2 KernsSLIFO: 240 20 0 0 EndChar StartChar: icircumflex Encoding: 238 238 171 Width: 469 Flags: W -HStem: 1105 20G<183 367> -VStem: 183 184<5 1125> -Fore --53 1297 m 1 - 192 1673 l 1 - 340 1673 l 1 - 585 1297 l 1 - 446 1297 l 1 - 266 1542 l 1 - 86 1297 l 1 - -53 1297 l 1 -183 5 m 1 - 183 1125 l 1 - 367 1125 l 1 - 367 5 l 1 - 183 5 l 1 +HStem: 1105 20G<127 311> 1297 384<110 556> +VStem: -146 702<1297 1297> 127 184<5 1125> +Fore +127 5 m 1xd0 + 127 1125 l 1 + 311 1125 l 1 + 311 5 l 1 + 127 5 l 1xd0 EndSplineSet +Refer: 225 710 N 1 0 0 1 -363 1 2 KernsSLIFO: 77 10 0 0 EndChar StartChar: idieresis Encoding: 239 239 172 Width: 469 Flags: W -HStem: 0 21G<165 349> 1100 20G<165 349> 1304 202<-39 164 316 519> -VStem: -39 203<1304 1506> 165 184<0 1120> 316 203<1304 1506> +HStem: 0 21G<129 313> 1100 20G<129 313> 1304 203<-87 116 326 529> +VStem: -87 203<1304 1507> 129 184<0 1120> 326 203<1304 1507> +CounterMasks: 1 00 Fore -165 0 m 1xf8 - 165 1120 l 1 - 349 1120 l 1 - 349 0 l 1 - 165 0 l 1xf8 --39 1304 m 1 - -39 1506 l 1 - 164 1506 l 1 - 164 1304 l 1 - -39 1304 l 1 -316 1304 m 1xf4 - 316 1506 l 1 - 519 1506 l 1 - 519 1304 l 1 - 316 1304 l 1xf4 +129 0 m 1 + 129 1120 l 1 + 313 1120 l 1 + 313 0 l 1 + 129 0 l 1 EndSplineSet +Refer: 103 168 S 1 0 0 1 -341 0 2 KernsSLIFO: 267 14 0 0 266 14 0 0 77 10 0 0 71 14 0 0 EndChar StartChar: eth @@ -4351,100 +3906,28 @@ StartChar: ograve Encoding: 242 242 175 Width: 1112 Flags: W -HStem: -29 156<424.533 714> 991 156<427.133 714> -VStem: 57 194<403.867 713.267> 890 195<405.6 712.4> -Fore -449 1638 m 1 - 646 1638 l 1 - 928 1264 l 1 - 775 1264 l 1 - 449 1638 l 1 -571 991 m 0 - 460.333 991 377 944.667 321 852 c 0 - 274.333 775.333 251 677.667 251 559 c 0 - 251 439.667 274 342 320 266 c 0 - 374.667 173.333 458.333 127 571 127 c 0 - 681 127 764 173.667 820 267 c 0 - 866.667 343.667 890 441 890 559 c 0 - 890 677 866.667 774.333 820 851 c 0 - 764 944.333 681 991 571 991 c 0 -571 1147 m 0 - 741 1147 871 1090 961 976 c 0 - 1043.67 873.333 1085 734.333 1085 559 c 0 - 1085 383.667 1043.67 244.667 961 142 c 0 - 871 28 741 -29 571 -29 c 0 - 401 -29 271 28 181 142 c 0 - 98.3333 244.667 57 383.667 57 559 c 0 - 57 734.333 98.3333 873.333 181 976 c 0 - 271 1090 401 1147 571 1147 c 0 -EndSplineSet +HStem: -29 156<424.533 686.267> 991 156<427.133 688> 1264 374<482 661> +VStem: 57 194<403.867 713.267> 239 422<1264 1638> 860 195<404.6 711.4> +Refer: 65 96 S 1 0 0 1 -9 -38 2 +Refer: 80 111 N 1 0 0 1 0 0 2 EndChar StartChar: oacute Encoding: 243 243 176 Width: 1112 Flags: W -HStem: -29 156<424.533 714> 991 156<427.133 714> -VStem: 57 194<403.867 713.267> 890 195<405.6 712.4> -Fore -449 1262 m 1 - 729 1638 l 1 - 928 1638 l 1 - 602 1262 l 1 - 449 1262 l 1 -571 991 m 0 - 460.333 991 377 944.667 321 852 c 0 - 274.333 775.333 251 677.667 251 559 c 0 - 251 439.667 274 342 320 266 c 0 - 374.667 173.333 458.333 127 571 127 c 0 - 681 127 764 173.667 820 267 c 0 - 866.667 343.667 890 441 890 559 c 0 - 890 677 866.667 774.333 820 851 c 0 - 764 944.333 681 991 571 991 c 0 -571 1147 m 0 - 741 1147 871 1090 961 976 c 0 - 1043.67 873.333 1085 734.333 1085 559 c 0 - 1085 383.667 1043.67 244.667 961 142 c 0 - 871 28 741 -29 571 -29 c 0 - 401 -29 271 28 181 142 c 0 - 98.3333 244.667 57 383.667 57 559 c 0 - 57 734.333 98.3333 873.333 181 976 c 0 - 271 1090 401 1147 571 1147 c 0 -EndSplineSet +HStem: -29 156<424.533 686.267> 991 156<427.133 688> 1262 375<434 671> +VStem: 57 194<403.867 713.267> 434 459<1262 1637> 860 195<404.6 711.4> +Refer: 80 111 N 1 0 0 1 0 0 2 +Refer: 114 180 N 1 0 0 1 -15 -40 2 EndChar StartChar: ocircumflex Encoding: 244 244 177 Width: 1112 Flags: W -HStem: -29 156<424.533 714> 991 156<427.133 714> -VStem: 57 194<403.867 713.267> 890 195<405.6 712.4> -Fore -284 1258 m 1 - 529 1634 l 1 - 677 1634 l 1 - 922 1258 l 1 - 783 1258 l 1 - 603 1503 l 1 - 423 1258 l 1 - 284 1258 l 1 -571 991 m 0 - 460.333 991 377 944.667 321 852 c 0 - 274.333 775.333 251 677.667 251 559 c 0 - 251 439.667 274 342 320 266 c 0 - 374.667 173.333 458.333 127 571 127 c 0 - 681 127 764 173.667 820 267 c 0 - 866.667 343.667 890 441 890 559 c 0 - 890 677 866.667 774.333 820 851 c 0 - 764 944.333 681 991 571 991 c 0 -571 1147 m 0 - 741 1147 871 1090 961 976 c 0 - 1043.67 873.333 1085 734.333 1085 559 c 0 - 1085 383.667 1043.67 244.667 961 142 c 0 - 871 28 741 -29 571 -29 c 0 - 401 -29 271 28 181 142 c 0 - 98.3333 244.667 57 383.667 57 559 c 0 - 57 734.333 98.3333 873.333 181 976 c 0 - 271 1090 401 1147 571 1147 c 0 -EndSplineSet +HStem: -29 156<424.533 686.267> 991 156<427.133 688> 1258 384<462 908> +VStem: 57 194<403.867 713.267> 206 702<1258 1258> 860 195<404.6 711.4> +Refer: 80 111 N 1 0 0 1 0 0 2 +Refer: 225 710 S 1 0 0 1 -11 -38 2 EndChar StartChar: otilde Encoding: 245 245 178 @@ -4459,38 +3942,10 @@ StartChar: odieresis Encoding: 246 246 179 Width: 1112 Flags: W -HStem: -29 156<424.533 714> 991 156<427.133 714> 1355 201<289 492 680 883> -VStem: 57 194<403.867 713.267> 289 203<1355 1556> 680 203<1355 1556> 890 195<405.6 712.4> -Fore -680 1355 m 5 - 680 1556 l 5 - 883 1556 l 5 - 883 1355 l 5 - 680 1355 l 5 -289 1355 m 5 - 289 1556 l 5 - 492 1556 l 5 - 492 1355 l 5 - 289 1355 l 5 -571 991 m 0 - 460.333 991 377 944.667 321 852 c 0 - 274.333 775.333 251 677.667 251 559 c 0 - 251 439.667 274 342 320 266 c 0 - 374.667 173.333 458.333 127 571 127 c 0 - 681 127 764 173.667 820 267 c 0 - 866.667 343.667 890 441 890 559 c 0 - 890 677 866.667 774.333 820 851 c 0 - 764 944.333 681 991 571 991 c 0 -571 1147 m 0 - 741 1147 871 1090 961 976 c 0 - 1043.67 873.333 1085 734.333 1085 559 c 0 - 1085 383.667 1043.67 244.667 961 142 c 0 - 871 28 741 -29 571 -29 c 0 - 401 -29 271 28 181 142 c 0 - 98.3333 244.667 57 383.667 57 559 c 0 - 57 734.333 98.3333 873.333 181 976 c 0 - 271 1090 401 1147 571 1147 c 0 -EndSplineSet +HStem: -29 156<424.533 686.267> 991 156<427.133 688> 1355 203<247 450 660 863> +VStem: 57 194<403.867 713.267> 247 203<1355 1558> 660 203<1355 1558> 860 195<404.6 711.4> +Refer: 80 111 N 1 0 0 1 0 0 2 +Refer: 103 168 S 1 0 0 1 -7 51 2 EndChar StartChar: divide Encoding: 247 247 180 @@ -4557,149 +4012,46 @@ StartChar: ugrave Encoding: 249 249 182 Width: 1143 Flags: W -HStem: -29 160<344.067 693.333> 1100 20G<127 311 881 1065> -VStem: 127 184<173.4 1120> 881 184<0 172 347.2 1120> -Fore -467 1638 m 1 - 664 1638 l 1 - 946 1264 l 1 - 793 1264 l 1 - 467 1638 l 1 -127 442 m 2 - 127 1120 l 1 - 311 1120 l 1 - 311 449 l 2 - 311 237 393.667 131 559 131 c 0 - 662.333 131 742.667 164.667 800 232 c 0 - 854 294.667 881 379 881 485 c 2 - 881 1120 l 1 - 1065 1120 l 1 - 1065 0 l 1 - 881 0 l 1 - 881 172 l 1 - 793 38 672.667 -29 520 -29 c 0 - 258 -29 127 128 127 442 c 2 -EndSplineSet +HStem: -29 160<434.533 633.867> 1100 20<817 1001> 1264 374<477.5 656.5> +VStem: 127 184<332 1117> 234.5 422<1264 1638> 817 184<0 172 347.2 1120> +Refer: 86 117 N 1 0 0 1 0 0 2 +Refer: 65 96 S 1 0 0 1 -13.5 -38 2 EndChar StartChar: uacute Encoding: 250 250 183 Width: 1143 Flags: W -HStem: -29 160<344.067 693.333> 1100 20G<127 311 881 1065> -VStem: 127 184<173.4 1120> 881 184<0 172 347.2 1120> -Fore -747 1638 m 5 - 946 1638 l 5 - 620 1262 l 5 - 467 1262 l 5 - 747 1638 l 5 -127 442 m 2 - 127 1120 l 1 - 311 1120 l 1 - 311 449 l 2 - 311 237 393.667 131 559 131 c 0 - 662.333 131 742.667 164.667 800 232 c 0 - 854 294.667 881 379 881 485 c 2 - 881 1120 l 1 - 1065 1120 l 1 - 1065 0 l 1 - 881 0 l 1 - 881 172 l 1 - 793 38 672.667 -29 520 -29 c 0 - 258 -29 127 128 127 442 c 2 -EndSplineSet +HStem: -29 160<434.533 633.867> 1100 20<817 1001> 1262 375<451.5 688.5> +VStem: 127 184<332 1117> 451.5 459<1262 1637> 817 184<0 172 347.2 1120> +Refer: 114 180 N 1 0 0 1 2.5 -40 2 +Refer: 86 117 N 1 0 0 1 0 0 2 EndChar StartChar: ucircumflex Encoding: 251 251 184 Width: 1143 Flags: W -HStem: -29 160<344.067 693.333> 1100 20G<127 311 881 1065> -VStem: 127 184<173.4 1120> 881 184<0 172 347.2 1120> -Fore -633 1638 m 1 - 781 1638 l 1 - 1026 1262 l 1 - 887 1262 l 1 - 707 1507 l 1 - 527 1262 l 1 - 388 1262 l 1 - 633 1638 l 1 -127 442 m 2 - 127 1120 l 1 - 311 1120 l 1 - 311 449 l 2 - 311 237 393.667 131 559 131 c 0 - 662.333 131 742.667 164.667 800 232 c 0 - 854 294.667 881 379 881 485 c 2 - 881 1120 l 1 - 1065 1120 l 1 - 1065 0 l 1 - 881 0 l 1 - 881 172 l 1 - 793 38 672.667 -29 520 -29 c 0 - 258 -29 127 128 127 442 c 2 -EndSplineSet +HStem: -29 160<434.533 633.867> 1100 20<817 1001> 1262 384<468 914> +VStem: 127 184<332 1117> 212 702<1262 1262> 817 184<0 172 347.2 1120> +Refer: 86 117 N 1 0 0 1 0 0 2 +Refer: 225 710 S 1 0 0 1 -5 -34 2 EndChar StartChar: udieresis Encoding: 252 252 185 Width: 1143 Flags: W -HStem: -29 160<344.067 693.333> 1100 20G<127 311 881 1065> 1350 202<410 613 801 1004> -VStem: 127 184<173.4 1120> 410 203<1350 1552> 801 203<1350 1552> 881 184<0 172 347.2 1120> -Fore -127 442 m 2xfa - 127 1120 l 1 - 311 1120 l 1 - 311 449 l 2 - 311 237 393.667 131 559 131 c 0 - 662.333 131 742.469 164.836 800 232 c 0 - 853.815 294.826 881 379 881 485 c 2 - 881 1120 l 1 - 1065 1120 l 1 - 1065 0 l 1 - 881 0 l 1 - 881 172 l 1 - 793 38 672.667 -29 520 -29 c 0 - 258 -29 127 128 127 442 c 2xfa -410 1552 m 1 - 613 1552 l 1 - 613 1350 l 1 - 410 1350 l 1 - 410 1552 l 1 -801 1552 m 1xfc - 801 1350 l 1 - 1004 1350 l 1 - 1004 1552 l 1 - 801 1552 l 1xfc -EndSplineSet +HStem: -29 160<434.533 633.867> 1100 20<817 1001> 1350 203<255 458 668 871> +VStem: 127 184<332 1117> 255 203<1350 1553> 668 203<1350 1553> 817 184<0 172 347.2 1120> +Refer: 103 168 S 1 0 0 1 1 46 2 +Refer: 86 117 N 1 0 0 1 0 0 2 EndChar StartChar: yacute Encoding: 253 253 186 Width: 1020 Flags: W -HStem: -426 154<107 293.867> 1100 20G<6 201 901 1096> -Fore -734 1638 m 1 - 933 1638 l 1 - 607 1262 l 1 - 454 1262 l 1 - 734 1638 l 1 -604 -104 m 2 - 560 -214.667 519.667 -291 483 -333 c 0 - 427.667 -395 351.333 -426 254 -426 c 2 - 107 -426 l 1 - 107 -272 l 1 - 215 -272 l 2 - 275.667 -272 322.333 -251.667 355 -211 c 0 - 373 -189 396.667 -140.667 426 -66 c 2 - 459 18 l 1 - 6 1120 l 1 - 201 1120 l 1 - 551 244 l 1 - 901 1120 l 1 - 1096 1120 l 1 - 604 -104 l 2 -EndSplineSet +HStem: -429 154<107 293.867> 1262 375<428 665> +VStem: 6 1007<1117 1117> 428 459<1262 1637> +Refer: 90 121 N 1 0 0 1 0 0 2 +Refer: 114 180 S 1 0 0 1 -21 -40 2 EndChar StartChar: thorn Encoding: 254 254 187 @@ -4735,35 +4087,10 @@ StartChar: ydieresis Encoding: 255 255 188 Width: 1020 Flags: W -HStem: -426 154<107 293.867> 1100 20G<6 201 901 1096> 1350 202<397 600 788 991> -VStem: 397 203<1350 1552> 788 203<1350 1552> -Fore -788 1552 m 1 - 991 1552 l 1 - 991 1350 l 1 - 788 1350 l 1 - 788 1552 l 1 -397 1552 m 1 - 600 1552 l 1 - 600 1350 l 1 - 397 1350 l 1 - 397 1552 l 1 -604 -104 m 2 - 560 -214.667 519.667 -291 483 -333 c 0 - 427.667 -395 351.333 -426 254 -426 c 2 - 107 -426 l 1 - 107 -272 l 1 - 215 -272 l 2 - 275.667 -272 322.333 -251.667 355 -211 c 0 - 373 -189 396.667 -140.667 426 -66 c 2 - 459 18 l 1 - 6 1120 l 1 - 201 1120 l 1 - 551 244 l 1 - 901 1120 l 1 - 1096 1120 l 1 - 604 -104 l 2 -EndSplineSet +HStem: -429 154<107 293.867> 1350.17 203<201.5 404.5 614.5 817.5> +VStem: 6 1007<1117 1117> 201.5 203<1350.17 1553.17> 614.5 203<1350.17 1553.17> +Refer: 90 121 N 1 0 0 1 0 0 2 +Refer: 103 168 S 1 0 0 1 -52.5 46.1666 2 EndChar StartChar: Aogonek Encoding: 260 260 189 @@ -4833,63 +4160,28 @@ StartChar: Cacute Encoding: 262 262 191 Width: 1231 Flags: W -HStem: 1347.28 168.716<571.697 830.264> 1675 375<750 987> -VStem: 66 206<580.825 1140.2> 750 459<1675 2050> +HStem: 1347.28 168.716<571.697 830.264> 1675 375<621 858> +VStem: 66 206<580.825 1140.2> 621 459<1675 2050> Refer: 36 67 N 1 0 0 1 0 0 2 -Refer: 114 180 N 1 0 0 1 301 373 2 +Refer: 114 180 S 1 0 0 1 172 373 2 EndChar StartChar: cacute Encoding: 263 263 192 Width: 944 Flags: W -HStem: 0 157<303.136 764.267> 1021 156<306.017 766.933> -VStem: 59 194<245.405 932.739> -Fore -766 1638 m 1 - 965 1638 l 1 - 639 1262 l 1 - 486 1262 l 1 - 766 1638 l 1 -59 589 m 0 - 59 957.436 267.3 1177 622 1177 c 0 - 737.333 1177 845 1153.67 945 1107 c 1 - 945 935 l 1 - 840.333 992.333 735.333 1021 630 1021 c 0 - 380.783 1021 253 853.415 253 589 c 0 - 253 324.696 378.566 157 630 157 c 0 - 735.333 157 840.333 185.667 945 243 c 1 - 945 73 l 1 - 840.333 24.3333 728.667 -1.73472e-18 610 0 c 0 - 267.207 0 59 225.546 59 589 c 0 -EndSplineSet +HStem: -22 156<435.2 735.867> 1262 375<453 690> +VStem: 82 194<337.3 751.133> 453 459<1262 1637> +Refer: 68 99 N 1 0 0 1 0 0 2 +Refer: 114 180 S 1 0 0 1 4 -40 2 EndChar StartChar: Ccaron Encoding: 268 268 193 Width: 1231 Flags: W -HStem: -29 166<342.085 1022.93> 1354 166<341.83 1026.4> -VStem: 66 213<255.415 1237.81> -Fore -631 1638 m 1 - 420 1904 l 1 - 559 1904 l 1 - 725 1726 l 1 - 891 1904 l 1 - 1030 1904 l 1 - 819 1638 l 1 - 631 1638 l 1 -66 745 m 0 - 66 1226.22 334.951 1520 795 1520 c 0 - 973 1520 1131.33 1472.67 1270 1378 c 1 - 1270 1165 l 1 - 1135.33 1291 981 1354 807 1354 c 0 - 449.177 1354 279 1124.08 279 745 c 0 - 279 368.396 449.373 137 807 137 c 0 - 981 137 1135.33 200 1270 326 c 1 - 1270 115 l 1 - 1128.67 19 970.333 -29 795 -29 c 0 - 333.459 -29 66 263.497 66 745 c 0 -EndSplineSet +HStem: 1347.28 168.716<571.697 830.264> 1638 376<406 651> +VStem: 66 206<580.825 1140.2> 406 638<2014 2014> +Refer: 226 711 N 1 0 0 1 193 376 2 +Refer: 36 67 N 1 0 0 1 0 0 2 EndChar StartChar: ccaron Encoding: 269 269 194 @@ -4904,34 +4196,16 @@ StartChar: dcaron Encoding: 271 271 195 Width: 1407 Flags: W -HStem: -24 154<409.667 659.333> 998 154<410.1 659.333> -VStem: 59 190<404.733 713.267> 806 184<5 173 244.471 882.669 955 1561> +HStem: -24 154<409.667 634.133> 998 154<410.1 634.133> 1057 509<1092 1286> +VStem: 59 190<404.733 713.267> 806 184<5 173 409.733 718.267 955 1561> 1092 377<1057 1566> Fore -806 955 m 1 - 806 1561 l 1 - 990 1561 l 1 - 990 5 l 1 - 806 5 l 1 - 806 173 l 1 - 730 41.6667 610.333 -24 447 -24 c 0 - 343.667 -27.3333 250.333 33.6667 167 159 c 0 - 95 267.667 59 401 59 559 c 0 - 59 717 95 850.333 167 959 c 0 - 250.333 1084.33 343.667 1148.67 447 1152 c 0 - 610.333 1152 730 1086.33 806 955 c 1 -806 564 m 0 - 806 809.13 706.503 998 492 998 c 0 - 429 995 370 946 315 851 c 0 - 271 775 249 677.667 249 559 c 0 - 249 440.333 271 343 315 267 c 0 - 369.667 172.333 428.667 126.667 492 130 c 0 - 706.055 130 806 318.209 806 564 c 0 -1092 1057 m 1 +1092 1057 m 1xbc 1286 1566 l 1 1469 1566 l 1 1243 1057 l 1 - 1092 1057 l 1 + 1092 1057 l 1xbc EndSplineSet +Refer: 69 100 N 1 0 0 1 0 0 2 EndChar StartChar: Eogonek Encoding: 280 280 196 @@ -5002,78 +4276,19 @@ StartChar: Gbreve Encoding: 286 286 198 Width: 1366 Flags: W -HStem: -29 166<501.6 1011.73> 614 166<840 1170> 1354 166<499 1067.53> 1659 131<684.4 971.7> -VStem: 66 213<433 1059.6> 1170 200<213 614> -Fore -517 1901 m 1 - 635 1901 l 1 - 653 1827 718 1790 830 1790 c 0 - 939 1790 1004 1827 1025 1901 c 1 - 1143 1901 l 1 - 1129.67 1739.67 1025.33 1659 830 1659 c 0 - 634.667 1659 530.333 1739.67 517 1901 c 1 -1170 213 m 1 - 1170 614 l 1 - 840 614 l 1 - 840 780 l 1 - 1370 780 l 1 - 1370 139 l 1 - 1212 27 1025.67 -29 811 -29 c 0 - 573 -29 388.333 40.6667 257 180 c 0 - 129.667 316.667 66 505 66 745 c 0 - 66 987 129.333 1175.67 256 1311 c 0 - 386 1450.33 571 1520 811 1520 c 0 - 1008.33 1520 1181.67 1472.67 1331 1378 c 1 - 1331 1163 l 1 - 1180.33 1290.33 1012.67 1354 828 1354 c 0 - 462 1354 279 1151 279 745 c 0 - 279 339.667 462 137 828 137 c 0 - 969.333 137 1083.33 162.333 1170 213 c 1 -EndSplineSet +HStem: -34 176<611.436 910.133> 575 174<636.961 1267> 1659 137<568.5 864.9> +VStem: 69 206<453.065 958.254> 405 626<1831.38 1946 1946 1946> 1075 194<99 614.43> +Refer: 40 71 N 1 0 0 1 0 0 2 +Refer: 227 728 S 1 0 0 1 176 338 2 EndChar StartChar: gbreve Encoding: 287 287 199 Width: 1133 Flags: W -HStem: -412 150<337.653 757.867> 12 154<428.102 635.867> 1005 154<415.733 571.319> 1321 137<419.867 686.8> -VStem: 59 190<418.733 726.4> 806 184<-211.333 209 432.467 740.133 962 1132> -Fore -236 1608 m 1 - 354 1608 l 1 - 369 1508 434 1458 549 1458 c 0 - 662 1458 727 1508 744 1608 c 1 - 862 1608 l 1 - 862 1510 836.333 1437.67 785 1391 c 0 - 733.667 1344.33 655 1321 549 1321 c 0 - 449.667 1321 372.667 1345.33 318 1394 c 0 - 263.333 1442.67 236 1514 236 1608 c 1 -990 1132 m 1 - 990 151 l 2 - 990 -224.333 818 -412 474 -412 c 0 - 369.333 -412 276 -397 194 -367 c 1 - 194 -188 l 1 - 299.333 -245.333 383 -270 445 -262 c 0 - 685.667 -262 806 -135.333 806 118 c 2 - 806 209 l 1 - 730.667 77.6667 611 12 447 12 c 0 - 337.667 12 244.333 68 167 180 c 0 - 95 285 59 416 59 573 c 0 - 59 731 95 862.333 167 967 c 0 - 254.883 1093.87 348.217 1157.87 447 1159 c 0 - 534.333 1160 607 1146 665 1117 c 0 - 723 1088 770 1036.33 806 962 c 1 - 806 1132 l 1 - 990 1132 l 1 -806 585 m 0 - 806 704.333 784 800 740 872 c 0 - 690 960.667 607.333 1005 492 1005 c 0 - 433.333 1005 374.333 956.333 315 859 c 0 - 271 786.333 249 691 249 573 c 0 - 249 454.333 271 359 315 287 c 0 - 369 198.333 428 158 492 166 c 0 - 602.667 166 685 210.333 739 299 c 0 - 783.667 372.333 806 467.667 806 585 c 0 -EndSplineSet +HStem: -412 150<337.653 757.867> 12 154<428.102 635.867> 1005 155.41<408.153 635.294> 1321 137<383.5 679.9> +VStem: 59 190<418.733 726.4> 220 626<1493.38 1608 1608 1608> 806 184<-211.333 209 431.6 740.133 962 1132> +Refer: 72 103 N 1 0 0 1 0 0 2 +Refer: 227 728 N 1 0 0 1 -9 0 2 EndChar StartChar: Hbar Encoding: 294 294 200 @@ -5145,157 +4360,73 @@ StartChar: Itilde Encoding: 296 296 202 Width: 764 Flags: W -HStem: 0 152<78 266 464 656> 1337 152<78 266 464 656> 1676 160<488.467 615.867> 1807 162<136 259.957> -VStem: 266 198<152 1337> -Fore -741 1992 m 1xe8 - 741 1818 l 1 - 667 1723.33 594.667 1676 524 1676 c 0xe8 - 482 1676 433.333 1695.33 378 1734 c 2 - 376 1734.67 368.667 1739 356 1747 c 0 - 294.667 1787 247.333 1807 214 1807 c 0 - 150 1807 82 1755.33 10 1652 c 1 - 10 1824 l 1 - 84.6667 1920.67 157 1969 227 1969 c 0xd8 - 267.667 1969 316.667 1949.33 374 1910 c 0 - 445.518 1860.94 499.667 1836 537 1836 c 0 - 598 1836 666 1888 741 1992 c 1xe8 -78 1489 m 1 - 656 1489 l 1 - 656 1337 l 1 - 464 1337 l 1 - 464 152 l 1 - 656 152 l 1 - 656 0 l 1 - 78 0 l 1 - 78 152 l 1 - 266 152 l 1 - 266 1337 l 1 - 78 1337 l 1 - 78 1489 l 1 -EndSplineSet +HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> 1676 147<502.088 641.667> 1796 148<119.333 258.653> +VStem: 280 198<152 1337> +Refer: 231 732 S 1 0 0 1 -179 334 2 +Refer: 42 73 N 1 0 0 1 0 0 2 EndChar StartChar: itilde Encoding: 297 297 203 Width: 469 Flags: W -HStem: 0 21G<130 318> 1102 20G<130 318> 1341 141<319.614 419.067> 1457 142<46.6667 144.464> -VStem: 130 188<0 1122> -Fore -517 1619 m 1xe8 - 517 1466 l 1 - 459 1382.67 402.667 1341 348 1341 c 0xe8 - 316 1341 278 1358 234 1392 c 2 - 232 1392.67 226.333 1396.67 217 1404 c 0 - 169.667 1439.33 132.667 1457 106 1457 c 0 - 56 1457 3 1411.33 -53 1320 c 1 - -53 1471 l 1 - 6.33333 1556.33 62.6667 1599 116 1599 c 0xd8 - 148 1599 186.333 1581.67 231 1547 c 0 - 286.518 1503.91 328.667 1482 358 1482 c 0 - 406 1482 459 1527.67 517 1619 c 1xe8 -130 0 m 1 - 130 1122 l 1 - 318 1122 l 1 - 318 0 l 1 - 130 0 l 1 +HStem: 0 21G<127 311> 1100 20G<127 311> 1341 147<354.088 493.667> 1461 148<-28.667 110.653> +VStem: 127 184<0 1120> +Fore +127 0 m 1xc8 + 127 1120 l 1 + 311 1120 l 1 + 311 0 l 1 + 127 0 l 1xc8 EndSplineSet +Refer: 231 732 S 1 0 0 1 -327 -1 2 EndChar StartChar: Imacron Encoding: 298 298 204 Width: 764 Flags: W -HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> 1698 154<55 709> +HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> 1698 154<61.55 702.45> VStem: 280 198<152 1337> -Fore -92 1489 m 1 - 670 1489 l 1 - 670 1337 l 1 - 478 1337 l 1 - 478 152 l 1 - 670 152 l 1 - 670 0 l 1 - 92 0 l 1 - 92 152 l 1 - 280 152 l 1 - 280 1337 l 1 - 92 1337 l 1 - 92 1489 l 1 -55 1698 m 1 - 55 1852 l 1 - 709 1852 l 1 - 709 1698 l 1 - 55 1698 l 1 -EndSplineSet +Refer: 42 73 N 1 0 0 1 0 0 2 +Refer: 109 713 N 0.85 0 0 1 -93.15 27 2 EndChar StartChar: imacron Encoding: 299 299 205 Width: 469 Flags: W -HStem: 0 21G<139 327> 1335 154<-33 500> -VStem: 139 188<0 1117> +HStem: 0 21G<129 313> 1100 20G<129 313> 1335 154<-21.36 491.36> +VStem: 129 184<0 1120> Fore -139 0 m 1 - 139 1117 l 1 - 327 1117 l 1 - 327 0 l 1 - 139 0 l 1 --33 1335 m 1 - -33 1489 l 1 - 500 1489 l 1 - 500 1335 l 1 - -33 1335 l 1 +129 0 m 1 + 129 1120 l 1 + 313 1120 l 1 + 313 0 l 1 + 129 0 l 1 EndSplineSet +Refer: 109 713 S 0.68 0 0 1 -145.12 -336 2 EndChar StartChar: Ibreve Encoding: 300 300 206 Width: 764 Flags: W -HStem: 0 152<112 300 498 690> 1337 152<112 300 498 690> 1623 137<247.5 543.9> -VStem: 300 198<152 1337> -Fore -112 1489 m 1 - 690 1489 l 1 - 690 1337 l 1 - 498 1337 l 1 - 498 152 l 1 - 690 152 l 1 - 690 0 l 1 - 112 0 l 1 - 112 152 l 1 - 300 152 l 1 - 300 1337 l 1 - 112 1337 l 1 - 112 1489 l 1 -84 1910 m 1 - 202 1910 l 1 - 217 1810 282 1760 397 1760 c 0 - 510 1760 575 1810 592 1910 c 1 - 710 1910 l 1 - 696.667 1718.67 592.333 1623 397 1623 c 0 - 201.667 1623 97.3333 1718.67 84 1910 c 1 -EndSplineSet +HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> 1623 137<232.5 528.9> +VStem: 69 626<1795.38 1910 1910 1910> 280 198<152 1337> +Refer: 42 73 N 1 0 0 1 0 0 2 +Refer: 227 728 S 1 0 0 1 -160 302 2 EndChar StartChar: ibreve Encoding: 301 301 207 Width: 469 Flags: W -HStem: 0 21G<168 356> 1257 137<118.5 414.9> -VStem: 168 188<0 1117> +HStem: 0 21G<127 311> 1100 20G<127 311> 1257 137<69.5 365.9> +VStem: -94 626<1429.38 1544 1544 1544> 127 184<0 1120> Fore -168 0 m 1 - 168 1117 l 1 - 356 1117 l 1 - 356 0 l 1 - 168 0 l 1 --45 1544 m 1 - 73 1544 l 1 - 88 1444 153 1394 268 1394 c 0 - 381 1394 446 1444 463 1544 c 1 - 581 1544 l 1 - 567.667 1352.67 463.333 1257 268 1257 c 0 - 72.6667 1257 -31.6667 1352.67 -45 1544 c 1 +127 0 m 1xe8 + 127 1120 l 1 + 311 1120 l 1 + 311 0 l 1 + 127 0 l 1xe8 EndSplineSet +Refer: 227 728 S 1 0 0 1 -323 -64 2 EndChar StartChar: Idot Encoding: 304 304 208 @@ -5331,44 +4462,34 @@ Fore EndSplineSet EndChar StartChar: Lcaron -Encoding: 317 317 210 -Width: 1020 -Flags: W -HStem: 0 170<350 1015> -VStem: 152 198<170 1493> -Fore -152 0 m 1 - 152 1493 l 1 - 350 1493 l 1 - 350 170 l 1 - 1015 170 l 1 - 1015 0 l 1 - 152 0 l 1 +Encoding: 317 317 210 +Width: 1020 +Flags: W +HStem: 0 170<350 1015> 1066 490<567 765> +VStem: 152 198<170 1493> 567 384<1066 1556> +Fore 567 1066 m 1 765 1556 l 1 951 1556 l 1 721 1066 l 1 567 1066 l 1 EndSplineSet +Refer: 45 76 N 1 0 0 1 0 0 2 EndChar StartChar: lcaron Encoding: 318 318 211 Width: 469 Flags: W -HStem: 0 21G<139 323> -VStem: 139 184<0 1556> +HStem: 0 21<139 323> 1061 495<438 628> +VStem: 139 184<0 1556> 438 367<1061 1556> Fore -139 0 m 5 - 139 1556 l 5 - 323 1556 l 5 - 323 0 l 5 - 139 0 l 5 438 1061 m 1 628 1556 l 1 805 1556 l 1 585 1061 l 1 438 1061 l 1 EndSplineSet +Refer: 77 108 N 1 0 0 1 0 0 2 EndChar StartChar: Lslash Encoding: 321 321 212 @@ -5574,39 +4695,10 @@ StartChar: Scaron Encoding: 352 352 218 Width: 1141 Flags: W -HStem: -29 164<373.267 869.867> 1356 164<407.867 784> -VStem: 78 203<1010.33 1281.2> 918 211<169.933 579> -Fore -668 1638 m 1 - 480 1638 l 1 - 269 1904 l 1 - 408 1904 l 1 - 574 1726 l 1 - 740 1904 l 1 - 879 1904 l 1 - 668 1638 l 1 -1039 1444 m 1 - 1039 1247 l 1 - 887.667 1319.67 749.667 1356 625 1356 c 0 - 395.667 1356 281 1274 281 1110 c 0 - 281 1033.33 311 977 371 941 c 0 - 407.667 918.333 472.667 897.667 566 879 c 2 - 688 854 l 2 - 829.333 824.667 934 780 1002 720 c 0 - 1086.67 647.333 1129 544.667 1129 412 c 0 - 1129 118 938.333 -29 557 -29 c 0 - 415.667 -29 258 2.66667 84 66 c 1 - 84 274 l 1 - 248.667 181.333 406.333 135 557 135 c 0 - 797.667 135 918 222.333 918 397 c 0 - 918 537 821.667 625.333 629 662 c 2 - 506 686 l 2 - 368.667 713.333 268 753 204 805 c 0 - 120 872.333 78 968.667 78 1094 c 0 - 78 1238 131.333 1347.33 238 1422 c 0 - 331.333 1487.33 452.667 1520 602 1520 c 0 - 742 1520 887.667 1494.67 1039 1444 c 1 -EndSplineSet +HStem: -17 164<338.667 837.867> 1369 163<435.993 753.733> 1638 376<255.5 500.5> +VStem: 89 206<1023.33 1289.2> 255.5 638<2014 2014> 886 211<181.933 591> +Refer: 226 711 N 1 0 0 1 42.5 376 2 +Refer: 52 83 N 1 0 0 1 0 0 2 EndChar StartChar: scaron Encoding: 353 353 219 @@ -5630,46 +4722,28 @@ StartChar: Ydieresis Encoding: 376 376 221 Width: 1180 Flags: W -HStem: 0 21<490 693> 1677 203<369 572 782 985> -VStem: 369 203<1677 1880> 493 198<0 638> 782 203<1677 1880> +HStem: 0 21<490 693> 1677 203<285 488 698 901> +VStem: 285 203<1677 1880> 493 198<0 638> 698 203<1677 1880> Refer: 58 89 N 1 0 0 1 0 0 2 -Refer: 103 168 N 1 0 0 1 115 373 2 +Refer: 103 168 S 1 0 0 1 31 373 2 EndChar StartChar: Zcaron Encoding: 381 381 222 Width: 1145 Flags: W -HStem: 0 170<311 1278> 1323 170<82 1003> -Fore -704 1635 m 1 - 493 1901 l 1 - 632 1901 l 1 - 798 1723 l 1 - 964 1901 l 1 - 1103 1901 l 1 - 892 1635 l 1 - 704 1635 l 1 -82 1493 m 1 - 1255 1493 l 1 - 1255 1339 l 1 - 311 170 l 1 - 1278 170 l 1 - 1278 0 l 1 - 59 0 l 1 - 59 154 l 1 - 1003 1323 l 1 - 82 1323 l 1 - 82 1493 l 1 -EndSplineSet +HStem: 0 176<273 1099> 1313 176<95 856> 1638 376<257 502> +VStem: 257 638<2014 2014> +Refer: 226 711 N 1 0 0 1 44 376 2 +Refer: 59 90 N 1 0 0 1 0 0 2 EndChar StartChar: zcaron Encoding: 382 382 223 Width: 909 Flags: W -HStem: 0 146<239 874> 972 145<72 684> 1262 376<239 484> -VStem: 239 638<1638 1638> +HStem: 0 146<239 874> 972 145<72 684> 1262 376<148 393> +VStem: 148 638<1638 1638> Refer: 91 122 N 1 0 0 1 0 0 2 -Refer: 226 711 N 1 0 0 1 26 0 2 +Refer: 226 711 S 1 0 0 1 -65 0 2 EndChar StartChar: florin Encoding: 402 402 224 @@ -6966,193 +6040,45 @@ StartChar: Abreve Encoding: 258 258 272 Width: 1229 Flags: W -HStem: -8 21G<-10 190 1029 1238> 408 169<380 839> 1630 137<476.5 772.9> -Fore -839 577 m 1 - 614 1286 l 1 - 380 577 l 1 - 839 577 l 1 --10 -8 m 1 - 500 1485 l 1 - 729 1485 l 1 - 1238 -8 l 1 - 1029 -8 l 1 - 894 408 l 1 - 325 408 l 1 - 190 -8 l 1 - -10 -8 l 1 -313 1917 m 5 - 431 1917 l 5 - 446 1817 511 1767 626 1767 c 4 - 739 1767 804 1817 821 1917 c 5 - 939 1917 l 5 - 925.667 1725.67 821.333 1630 626 1630 c 4 - 430.667 1630 326.333 1725.67 313 1917 c 5 -EndSplineSet +HStem: 0 21<-10 190 1029 1238> 416 169<380 839> 1630 137<476.5 772.9> +VStem: 313 626<1802.38 1917 1917 1917> +Refer: 34 65 N 1 0 0 1 0 0 2 +Refer: 227 728 N 1 0 0 1 84 309 2 EndChar StartChar: Amacron Encoding: 256 256 273 Width: 1229 Flags: W -HStem: 0 21G<-10 190 1029 1238> 417 169<380 839> 1698 154<248 999> -Fore -248 1852 m 1 - 999 1852 l 1 - 999 1698 l 1 - 245 1698 l 1 - 248 1852 l 1 -839 586 m 1 - 614 1295 l 1 - 380 586 l 1 - 839 586 l 1 --10 0 m 1 - 500 1494 l 1 - 729 1494 l 1 - 1238 0 l 1 - 1029 0 l 1 - 894 417 l 1 - 325 417 l 1 - 190 0 l 1 - -10 0 l 1 -EndSplineSet +HStem: 0 21<-10 190 1029 1238> 416 169<380 839> 1698 154<246 1000> +Refer: 34 65 N 1 0 0 1 0 0 2 +Refer: 109 713 N 1 0 0 1 64 27 2 EndChar StartChar: Ccircumflex Encoding: 264 264 274 Width: 1231 Flags: W -HStem: 1349 165.887<547.937 801.731> -VStem: 66 206<598.366 907.8> -Fore -1196 1154 m 1 - 1113.33 1223.33 1029.17 1275.17 943.5 1309.5 c 0 - 857.833 1343.83 780.333 1357 711 1349 c 0 - 411 1311.67 264.667 1110.67 272 746 c 0 - 272 744.667 272.049 742.914 272.147 740.742 c 0 - 272.716 716.914 273.333 697.667 274 683 c 0 - 274.667 668.333 276.833 645.167 280.5 613.5 c 0 - 284.167 581.833 288.5 554.833 293.5 532.5 c 0 - 298.5 510.167 306.333 482.833 317 450.5 c 0 - 327.667 418.167 340.167 390.333 354.5 367 c 0 - 368.833 343.667 387.333 318.667 410 292 c 0 - 432.667 265.333 457.833 243 485.5 225 c 0 - 513.167 207 546.333 190.833 585 176.5 c 0 - 623.667 162.167 665.667 152.333 711 147 c 0 - 849.667 131 1011.33 195.333 1196 340 c 1 - 1196 104 l 1 - 1120 57.3333 1039.5 23.6667 954.5 3 c 0 - 869.5 -17.6667 788.333 -26.6667 711 -24 c 0 - 623.667 -20 544.5 -4.33333 473.5 23 c 0 - 402.5 50.3333 341.833 87 291.5 133 c 0 - 241.167 179 199 233.833 165 297.5 c 0 - 131 361.167 106 430.333 90 505 c 0 - 74 579.667 66 660 66 746 c 0 - 66 770 66.5 792.667 67.5 814 c 0 - 68.5 835.333 71.1667 865.167 75.5 903.5 c 0 - 79.8333 941.833 85.8333 977.167 93.5 1009.5 c 0 - 101.167 1041.83 112.833 1078.67 128.5 1120 c 0 - 144.167 1161.33 162.667 1198.83 184 1232.5 c 0 - 205.333 1266.17 232.667 1300.33 266 1335 c 0 - 299.333 1369.67 336.5 1399.17 377.5 1423.5 c 0 - 418.5 1447.83 467.833 1468.67 525.5 1486 c 0 - 583.167 1503.33 645.667 1514.33 713 1519 c 0 - 763 1522.33 810.5 1521.17 855.5 1515.5 c 0 - 900.5 1509.83 945.167 1499 989.5 1483 c 0 - 1033.83 1467 1068.17 1453.67 1092.5 1443 c 0 - 1116.83 1432.33 1151.33 1415.67 1196 1393 c 1 - 1196 1154 l 1 -619 2057 m 1 - 835 2057 l 1 - 1065 1673 l 1 - 905 1673 l 1 - 723 1930 l 1 - 523 1673 l 1 - 363 1673 l 1 - 619 2057 l 1 -EndSplineSet +HStem: 1347.28 168.716<571.697 830.264> 1673 384<618.5 1064.5> +VStem: 66 206<580.825 1140.2> 362.5 702<1673 1673> +Refer: 36 67 N 1 0 0 1 0 0 2 +Refer: 225 710 N 1 0 0 1 145.5 377 2 EndChar StartChar: Cdotaccent Encoding: 266 266 275 Width: 1231 Flags: W -HStem: 1674 204<605 809> -VStem: 75 206<599.366 908.8> 605 204<1674 1878> -Fore -1205 1155 m 1 - 1122.33 1224.33 1038.17 1276.17 952.5 1310.5 c 0 - 866.833 1344.83 789.333 1358 720 1350 c 0 - 420 1312.67 273.667 1111.67 281 747 c 0 - 281 745.667 281.049 743.914 281.147 741.742 c 0 - 281.716 717.914 282.333 698.667 283 684 c 0 - 283.667 669.333 285.833 646.167 289.5 614.5 c 0 - 293.167 582.833 297.5 555.833 302.5 533.5 c 0 - 307.5 511.167 315.333 483.833 326 451.5 c 0 - 336.667 419.167 349.167 391.333 363.5 368 c 0 - 377.833 344.667 396.333 319.667 419 293 c 0 - 441.667 266.333 466.833 244 494.5 226 c 0 - 522.167 208 555.333 191.833 594 177.5 c 0 - 632.667 163.167 674.667 153.333 720 148 c 0 - 858.667 132 1020.33 196.333 1205 341 c 1 - 1205 105 l 1 - 1129 58.3333 1048.5 24.6667 963.5 4 c 0 - 878.5 -16.6667 797.333 -25.6667 720 -23 c 0 - 632.667 -19 553.5 -3.33333 482.5 24 c 0 - 411.5 51.3333 350.833 88 300.5 134 c 0 - 250.167 180 208 234.833 174 298.5 c 0 - 140 362.167 115 431.333 99 506 c 0 - 83 580.667 75 661 75 747 c 0 - 75 771 75.5 793.667 76.5 815 c 0 - 77.5 836.333 80.1667 866.167 84.5 904.5 c 0 - 88.8333 942.833 94.8333 978.167 102.5 1010.5 c 0 - 110.167 1042.83 121.833 1079.67 137.5 1121 c 0 - 153.167 1162.33 171.667 1199.83 193 1233.5 c 0 - 214.333 1267.17 241.667 1301.33 275 1336 c 0 - 308.333 1370.67 345.5 1400.5 386.5 1425.5 c 0 - 427.5 1450.5 476.833 1471.67 534.5 1489 c 0 - 592.167 1506.33 654.667 1516.67 722 1520 c 0 - 776.891 1522.72 824.391 1521.55 864.5 1516.5 c 0 - 909.5 1510.83 954.167 1500 998.5 1484 c 0 - 1042.83 1468 1077.17 1454.67 1101.5 1444 c 0 - 1125.83 1433.33 1160.33 1416.67 1205 1394 c 1 - 1205 1155 l 1 -605 1878 m 1 - 809 1878 l 1 - 809 1674 l 1 - 605 1674 l 1 - 605 1878 l 1 -EndSplineSet +HStem: 1347.28 168.716<571.697 830.264> 1673.5 204<602 806> +VStem: 66 206<580.825 1140.2> 602 204<1673.5 1877.5> +Refer: 36 67 N 1 0 0 1 0 0 2 +Refer: 228 729 N 1 0 0 1 149 325.5 2 EndChar StartChar: Dcaron Encoding: 270 270 276 Width: 1389 Flags: W -HStem: 0 163<350 716.667> 1326 166<350 780.067> -VStem: 152 198<163 1326> 1110 213<485.7 1009.6> -Fore -514 1326 m 2 - 350 1326 l 1 - 350 163 l 1 - 514 165 l 2 - 716.667 165 866.333 211 963 303 c 0 - 1061 398 1110 546 1110 747 c 0 - 1110 949 1061 1096.67 963 1190 c 0 - 868.333 1280.67 718.667 1326 514 1326 c 2 -152 0 m 1 - 152 1492 l 1 - 483 1492 l 2 - 758 1492 963 1438 1098 1330 c 0 - 1248 1208.67 1323 1014.33 1323 747 c 0 - 1323 478.333 1248 283.667 1098 163 c 0 - 961.333 54.3333 756.333 3.46945e-18 483 0 c 2 - 152 0 l 1 -561 1669 m 1 - 316 2045 l 1 - 455 2045 l 1 - 635 1800 l 1 - 815 2045 l 1 - 954 2045 l 1 - 709 1669 l 1 - 561 1669 l 1 -EndSplineSet +HStem: 0 162<350 914.744> 1325 164<350 1039.28> 1669 376<336.5 581.5> +VStem: 152 198<162 1325> 336.5 638<2045 2045> 1110 213<220.751 1274.51> +Refer: 37 68 N 1 0 0 1 0 0 2 +Refer: 226 711 S 1 0 0 1 123.5 407 2 EndChar StartChar: Dslash Encoding: 272 272 277 @@ -7209,55 +6135,19 @@ StartChar: Edotaccent Encoding: 278 278 280 Width: 1149 Flags: W -HStem: 0 176<350 1083> 729 176<350 1033> 1313 176<350 1083> 1661 254<540 751> -VStem: 152 198<176 729 905 1313> 540 211<1661 1915> -Fore -152 0 m 1 - 152 1489 l 1 - 1083 1489 l 1 - 1083 1313 l 1 - 350 1313 l 1 - 350 905 l 1 - 1033 905 l 1 - 1033 729 l 1 - 350 729 l 1 - 350 176 l 1 - 1083 176 l 1 - 1083 0 l 1 - 152 0 l 1 -540 1915 m 1 - 751 1915 l 1 - 751 1661 l 1 - 540 1661 l 1 - 540 1915 l 1 -EndSplineSet +HStem: 0 176<350 1083> 729 176<350 1033> 1313 176<350 1083> 1661 204<544 748> +VStem: 152 198<176 729 905 1313> 544 204<1661 1865> +Refer: 228 729 N 1 0 0 1 91 313 2 +Refer: 38 69 N 1 0 0 1 0 0 2 EndChar StartChar: Emacron Encoding: 274 274 281 Width: 1149 Flags: W -HStem: 0 176<350 1083> 729 176<350 1033> 1313 176<350 1083> 1694 158<245 992> +HStem: 0 176<350 1083> 729 176<350 1033> 1313 176<350 1083> 1694 154<249 1003> VStem: 152 198<176 729 905 1313> -Fore -152 0 m 1 - 152 1489 l 1 - 1083 1489 l 1 - 1083 1313 l 1 - 350 1313 l 1 - 350 905 l 1 - 1033 905 l 1 - 1033 729 l 1 - 350 729 l 1 - 350 176 l 1 - 1083 176 l 1 - 1083 0 l 1 - 152 0 l 1 -245 1852 m 1 - 992 1852 l 1 - 992 1694 l 1 - 245 1694 l 1 - 245 1852 l 1 -EndSplineSet +Refer: 38 69 N 1 0 0 1 0 0 2 +Refer: 109 713 S 1 0 0 1 67 23 2 EndChar StartChar: Gcedilla Encoding: 290 290 282 @@ -7319,56 +6209,19 @@ StartChar: Gdotaccent Encoding: 288 288 284 Width: 1366 Flags: W -HStem: -34 176<650.789 910.133> 575 175<684.994 1123.75> 1676 254<616 827> -VStem: 69 206<592.274 906.673> 616 211<1676 1930> 1075 194<134.721 614.43> -Fore -1269 1146 m 1 - 1097 1278.67 933 1345 777 1345 c 0 - 703 1345 636 1333.33 576 1310 c 0 - 516 1286.67 462.5 1250.5 415.5 1201.5 c 0 - 368.5 1152.5 332.667 1086 308 1002 c 0 - 283.333 918 272.333 819.333 275 706 c 0 - 275.667 650.667 282.167 596.167 294.5 542.5 c 0 - 306.833 488.833 326.167 437 352.5 387 c 0 - 378.833 337 410.667 293.333 448 256 c 0 - 485.333 218.667 531.667 189.5 587 168.5 c 0 - 642.333 147.5 702.667 138.667 768 142 c 0 - 877.333 146.667 979.667 162.667 1075 190 c 1 - 1072.33 232.667 1072.33 297 1075 383 c 0 - 1077.67 469 1077.67 533 1075 575 c 1 - 1038.33 577 981.667 577 905 575 c 0 - 828.333 573 771.333 573 734 575 c 1 - 735.333 593 735.333 622.333 734 663 c 0 - 732.667 703.667 732.333 733 733 751 c 1 - 792.333 751.667 881.333 751.333 1000 750 c 0 - 1118.67 748.667 1207.67 748.333 1267 749 c 1 - 1267.67 675.667 1268 567.333 1268 424 c 0 - 1268 280.667 1268.33 172.333 1269 99 c 1 - 1176.33 55.6667 1092.67 22.6667 1018 0 c 0 - 943.333 -22.6667 867.667 -34 791 -34 c 0 - 687.667 -34 593.5 -19.3333 508.5 10 c 0 - 423.5 39.3333 348.667 83.3333 284 142 c 0 - 219.333 200.667 168.333 277.5 131 372.5 c 0 - 93.6667 467.5 73 577.333 69 702 c 0 - 53 1215.33 281 1486.67 753 1516 c 0 - 943 1527.33 1113.33 1483.67 1264 1385 c 1 - 1265.33 1358.33 1266.33 1318.5 1267 1265.5 c 0 - 1267.67 1212.5 1268.33 1172.67 1269 1146 c 1 -616 1930 m 1 - 827 1930 l 1 - 827 1676 l 1 - 616 1676 l 1 - 616 1930 l 1 -EndSplineSet +HStem: -34 176<611.436 910.133> 575 174<636.961 1267> 1675.5 204<619 823> +VStem: 69 206<453.065 958.254> 619 204<1675.5 1879.5> 1075 194<99 614.43> +Refer: 40 71 N 1 0 0 1 0 0 2 +Refer: 228 729 N 1 0 0 1 166 327.5 2 EndChar StartChar: Hcircumflex Encoding: 292 292 285 Width: 1382 Flags: W -HStem: 0 21<152 350 1035 1233> 729 176<350 1035> 1666 384<590 1036> -VStem: 152 198<0 729 905 1489> 334 702<1666 1666> 1035 198<0 729 905 1489> +HStem: 0 21<152 350 1035 1233> 729 176<350 1035> 1666 384<598 1044> +VStem: 152 198<0 729 905 1489> 342 702<1666 1666> 1035 198<0 729 905 1489> Refer: 41 72 N 1 0 0 1 0 0 2 -Refer: 225 710 N 1 0 0 1 117 370 2 +Refer: 225 710 S 1 0 0 1 125 370 2 EndChar StartChar: Lacute Encoding: 313 313 286 @@ -7472,73 +6325,19 @@ StartChar: Uhungarumlaut Encoding: 368 368 295 Width: 1343 Flags: W -HStem: -29 164<495.867 858.133> -VStem: 138 198<1119.99 1489> 138 191<418.199 1379.68> 1014 201<417.44 1489> -Fore -544 2053 m 1x90 - 354 1677 l 1 - 491 1677 l 1 - 714 2053 l 1 - 544 2053 l 1x90 -965 2053 m 1 - 760 1677 l 1 - 895 1677 l 1 - 1143 2053 l 1 - 965 2053 l 1 -138 561 m 2xb0 - 138 1489 l 1 - 336 1489 l 1xd0 - 329 595 l 2 - 335 434.333 352.333 323.333 381 262 c 1 - 439 177.333 537.667 135 677 135 c 0 - 816.333 135 915 177.333 973 262 c 1 - 1000.33 336.667 1013.54 444.001 1014 584 c 2 - 1017 1489 l 1 - 1215 1489 l 1 - 1215 560 l 2 - 1237 167.333 1057.67 -29 677 -29 c 0 - 295.667 -29 116 167.667 138 561 c 2xb0 -EndSplineSet +HStem: -29 164<523.867 886.133> 1677 376<775.5 980.5> +VStem: 166 191<418.199 1379.68> 166 198<1119.99 1489> 369.5 789<1677 2053> 1042 201<417.44 1489> +Refer: 54 85 N 1 0 0 1 0 0 2 +Refer: 232 733 N 1 0 0 1 119.5 375 2 EndChar StartChar: Uring Encoding: 366 366 296 Width: 1343 Flags: W -HStem: -31 164<523.867 886.133> 1403 123<646.855 763.442> 1829 123<646.855 763.442> -VStem: 166 198<1119.43 1489> 166 191<416.199 1379.43> 433 122<1617.86 1737.35> 859 122<1621.55 1733.68> 1042 201<415.44 1489> -Fore -981 1678 m 0xe7 - 981 1599.33 955 1533.67 903 1481 c 0 - 851 1429 785.667 1403 707 1403 c 0 - 628.333 1403 563 1429 511 1481 c 0 - 459 1533.67 433 1599.33 433 1678 c 0 - 433 1756.67 459 1822 511 1874 c 0 - 563 1926 628.333 1952 707 1952 c 0 - 785.667 1952 851 1926 903 1874 c 0 - 955 1822 981 1756.67 981 1678 c 0xe7 -859 1678 m 0 - 859 1720 844.333 1755.67 815 1785 c 0 - 785.667 1814.33 749.667 1829 707 1829 c 0 - 663 1829 626.667 1814.67 598 1786 c 0 - 569.333 1757.33 555 1721.33 555 1678 c 0 - 555 1634 569.333 1597.67 598 1569 c 0 - 626.667 1540.33 663 1526 707 1526 c 0 - 749.667 1526 785.667 1540.67 815 1570 c 0 - 844.333 1599.33 859 1635.33 859 1678 c 0 -166 559 m 2xef - 166 1489 l 1 - 364 1489 l 1xf7 - 357 593 l 2 - 363 432.333 380.333 321.333 409 260 c 1 - 467 175.333 565.667 133 705 133 c 0 - 844.333 133 943 175.333 1001 260 c 1 - 1028.33 334.667 1041.54 442.001 1042 582 c 2 - 1045 1489 l 1 - 1243 1489 l 1 - 1243 558 l 2 - 1265 165.333 1085.67 -31 705 -31 c 0 - 323.667 -31 144 165.667 166 559 c 2xef -EndSplineSet +HStem: -29 164<523.867 886.133> 1403 123<646.855 763.442> 1829 123<646.855 763.442> +VStem: 166 191<418.199 1379.68> 166 198<1119.99 1489> 433 122<1617.86 1737.35> 859 122<1621.55 1733.68> 1042 201<417.44 1489> +Refer: 229 730 N 1 0 0 1 179 251 2 +Refer: 54 85 N 1 0 0 1 0 0 2 EndChar StartChar: Zacute Encoding: 377 377 297 @@ -7562,81 +6361,19 @@ StartChar: abreve Encoding: 259 259 299 Width: 1075 Flags: W -HStem: -28 154<403.467 585.467> 562 157<445 647.414> 992 156<382.267 627.733> 1247 137<392.5 688.9> -VStem: 57 171<249.2 462.4> 759 187<0 131.657 413 562> -Fore -759 562 m 1 - 588 562 l 2 - 506.667 563.333 441.333 554.333 392 535 c 0 - 282.667 499.667 228 433 228 335 c 0 - 228 269 255 217.333 309 180 c 0 - 363 144 423.667 126 491 126 c 0 - 563.667 125.333 628.333 166.333 685 249 c 0 - 734.333 322.333 759 413 759 521 c 2 - 759 562 l 1 -946 638 m 2 - 946 0 l 1 - 759 0 l 1 - 766 150 l 1 - 685.333 30 578.333 -29.3333 445 -28 c 0 - 310.333 -30.6667 212 0 150 64 c 0 - 88 128 57 214.333 57 323 c 0 - 57 577 228 709 570 719 c 2 - 759 734 l 1 - 759 724 l 1 - 790.333 814 778 882 722 928 c 0 - 671.333 970.667 600.333 992 509 992 c 0 - 389.667 992 277.333 961.333 172 900 c 1 - 172 1070 l 1 - 297.333 1122 415.667 1148 527 1148 c 0 - 806.333 1146.67 946 976.667 946 638 c 2 -229 1534 m 5 - 347 1534 l 5 - 362 1434 427 1384 542 1384 c 4 - 655 1384 720 1434 737 1534 c 5 - 855 1534 l 5 - 841.667 1342.67 737.333 1247 542 1247 c 4 - 346.667 1247 242.333 1342.67 229 1534 c 5 -EndSplineSet +HStem: -27 154<403.467 585.467> 563 157<445 647.414> 993 156<382.267 627.733> 1247 137<392.5 688.9> +VStem: 57 171<249.333 463.4> 229 626<1419.38 1534 1534 1534> 759 187<0 132.535 414 563> +Refer: 66 97 N 1 0 0 1 0 0 2 +Refer: 227 728 N 1 0 0 1 0 -74 2 EndChar StartChar: amacron Encoding: 257 257 300 Width: 1075 Flags: W -HStem: -23 154<403.467 585.467> 567 157<445 647.414> 997 156<382.267 627.733> 1340 149<155 893> -VStem: 57 171<253.333 467.4> 759 187<4 136.535 418 567> -Fore -155 1489 m 1 - 893 1489 l 1 - 893 1340 l 1 - 151 1340 l 1 - 155 1489 l 1 -759 567 m 1 - 588 567 l 2 - 506.667 568.333 441.333 559.333 392 540 c 0 - 282.667 504.667 228 438 228 340 c 0 - 228 273.333 255 221.667 309 185 c 0 - 363 149 423.667 131 491 131 c 0 - 563.667 130.333 628.333 171.333 685 254 c 0 - 734.333 327.333 759 418 759 526 c 2 - 759 567 l 1 -946 643 m 2 - 946 4 l 1 - 759 4 l 1 - 766 155 l 1 - 685.333 35 578.333 -24.3333 445 -23 c 0 - 310.333 -25.6667 212 5 150 69 c 0 - 88 133 57 219.333 57 328 c 0 - 57 582 228 714 570 724 c 2 - 759 739 l 1 - 759 729 l 1 - 790.333 819 778 887 722 933 c 0 - 671.333 975.667 600.333 997 509 997 c 0 - 389.667 997 277.333 966.333 172 905 c 1 - 172 1075 l 1 - 297.333 1127 415.667 1153 527 1153 c 0 - 806.333 1151.67 946 981.667 946 643 c 2 -EndSplineSet +HStem: -27 154<403.467 585.467> 563 157<445 647.414> 993 156<382.267 627.733> 1340 154<142 896> +VStem: 57 171<249.333 463.4> 759 187<0 132.535 414 563> +Refer: 66 97 N 1 0 0 1 0 0 2 +Refer: 109 713 S 1 0 0 1 -40 -331 2 EndChar StartChar: ccircumflex Encoding: 265 265 301 @@ -7651,30 +6388,10 @@ StartChar: cdotaccent Encoding: 267 267 302 Width: 956 Flags: W -HStem: -21 156<411.2 711.867> 1309 204<438 642> -VStem: 58 194<338.3 752.133> 438 204<1309 1513> -Fore -908 1054 m 1 - 908 897 l 1 - 802.667 954.333 697.667 983 593 983 c 0 - 466.333 983 382.333 952.333 341 891 c 0 - 281.667 815.667 252 713.333 252 584 c 0 - 237 441 259 332 318 257 c 1 - 363.333 175.667 449 135 575 135 c 0 - 682.333 135 784.333 175.333 881 256 c 1 - 890 51 l 1 - 787.333 3 675.667 -21 555 -21 c 0 - 380.333 -21 254 33.3333 176 142 c 0 - 82 246.667 42.6667 394 58 584 c 0 - 58 764 110.667 903.667 216 1003 c 0 - 303.333 1082.33 431 1128 599 1140 c 1 - 705.667 1128.67 808.667 1100 908 1054 c 1 -438 1513 m 1 - 642 1513 l 1 - 642 1309 l 1 - 438 1309 l 1 - 438 1513 l 1 -EndSplineSet +HStem: -22 156<435.2 735.867> 1309 204<438 642> +VStem: 82 194<337.3 751.133> 438 204<1309 1513> +Refer: 68 99 N 1 0 0 1 0 0 2 +Refer: 228 729 N 1 0 0 1 -15 -39 2 EndChar StartChar: dmacron Encoding: 273 273 303 @@ -7718,40 +6435,10 @@ StartChar: ebreve Encoding: 277 277 304 Width: 1077 Flags: W -HStem: -7 157<469.333 783.467> 558 144<246 866> 1004 157<457.533 691.039> 1253 137<442.5 738.9> -Fore -1040 649 m 2 - 1040 558 l 1 - 240 558 l 1 - 248 426 284.333 325 349 255 c 0 - 413.667 185 504.333 150 621 150 c 0 - 752 150 879 185 1002 255 c 1 - 1002 80 l 1 - 874 22 743.667 -7 611 -7 c 0 - 436 -7 300 47 203 155 c 0 - 107 260.333 59 405.667 59 591 c 0 - 59 676.333 69 749.167 89 809.5 c 0 - 109 869.833 140.333 927.667 183 983 c 0 - 275 1101.67 406.333 1161 577 1161 c 0 - 729.667 1161 847 1107 929 999 c 0 - 967.667 948.333 995.833 896.333 1013.5 843 c 0 - 1031.17 789.667 1040 725 1040 649 c 2 -246 702 m 1 - 866 703 l 1 - 866 785.667 841.667 860 793 926 c 0 - 769.667 957.333 741 978.167 707 988.5 c 0 - 673 998.833 630 1004 578 1004 c 0 - 485.333 1004 409 974 349 914 c 0 - 317.667 880.667 293.5 848.5 276.5 817.5 c 0 - 259.5 786.5 249.333 748 246 702 c 1 -279 1540 m 1 - 397 1540 l 1 - 412 1440 477 1390 592 1390 c 0 - 705 1390 770 1440 787 1540 c 1 - 905 1540 l 1 - 891.667 1348.67 787.333 1253 592 1253 c 0 - 396.667 1253 292.333 1348.67 279 1540 c 1 -EndSplineSet +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1253 137<442.5 738.9> +VStem: 279 626<1425.38 1540 1540 1540> 866 174<630 812> +Refer: 70 101 N 1 0 0 1 0 0 2 +Refer: 227 728 N 1 0 0 1 50 -68 2 EndChar StartChar: ecaron Encoding: 283 283 305 @@ -7766,76 +6453,19 @@ StartChar: edotaccent Encoding: 279 279 306 Width: 1077 Flags: W -HStem: 0 155<458.333 775.933> 563 144<235 855> 1009 157<446.533 680.039> 1300 256<477 688> -VStem: 477 211<1300 1556> -Fore -1029 654 m 2 - 1029 563 l 1 - 229 563 l 1 - 237 431 273.333 330 338 260 c 0 - 402.667 190 493.333 155 610 155 c 0 - 741 155 868 190 991 260 c 1 - 991 85 l 1 - 865.667 28.3333 735.333 -1.73472e-18 600 0 c 0 - 424 0 288 53.3333 192 160 c 0 - 96 265.333 48 410.667 48 596 c 0 - 48 681.333 58 754.167 78 814.5 c 0 - 98 874.833 129.333 932.667 172 988 c 0 - 264 1106.67 395.333 1166 566 1166 c 0 - 718.667 1166 836 1112 918 1004 c 0 - 956.667 953.333 984.833 901.333 1002.5 848 c 0 - 1020.17 794.667 1029 730 1029 654 c 2 -235 707 m 1 - 855 708 l 1 - 855 790.667 830.667 865 782 931 c 0 - 758.667 962.333 730 983.167 696 993.5 c 0 - 662 1003.83 619 1009 567 1009 c 0 - 474.333 1009 398 979 338 919 c 0 - 306.667 885.667 282.5 853.5 265.5 822.5 c 0 - 248.5 791.5 238.333 753 235 707 c 1 -477 1556 m 1 - 688 1556 l 1 - 688 1300 l 1 - 477 1300 l 1 - 477 1556 l 1 -EndSplineSet +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1300 204<480.5 684.5> +VStem: 480.5 204<1300 1504> 866 174<630 812> +Refer: 70 101 S 1 0 0 1 0 0 2 +Refer: 228 729 N 1 0 0 1 27.5 -48 2 EndChar StartChar: emacron Encoding: 275 275 307 Width: 1077 Flags: W -HStem: 0 155<469.333 786.933> 563 144<246 866> 1009 157<457.533 691.039> 1328 161<208 960> -Fore -1040 654 m 2 - 1040 563 l 1 - 240 563 l 1 - 248 431 284.333 330 349 260 c 0 - 413.667 190 504.333 155 621 155 c 0 - 752 155 879 190 1002 260 c 1 - 1002 85 l 1 - 876.667 28.3333 746.333 -1.73472e-18 611 0 c 0 - 435 0 299 53.3333 203 160 c 0 - 107 265.333 59 410.667 59 596 c 0 - 59 681.333 69 754.167 89 814.5 c 0 - 109 874.833 140.333 932.667 183 988 c 0 - 275 1106.67 406.333 1166 577 1166 c 0 - 729.667 1166 847 1112 929 1004 c 0 - 967.667 953.333 995.833 901.333 1013.5 848 c 0 - 1031.17 794.667 1040 730 1040 654 c 2 -246 707 m 1 - 866 708 l 1 - 866 790.667 841.667 865 793 931 c 0 - 769.667 962.333 741 983.167 707 993.5 c 0 - 673 1003.83 630 1009 578 1009 c 0 - 485.333 1009 409 979 349 919 c 0 - 317.667 885.667 293.5 853.5 276.5 822.5 c 0 - 259.5 791.5 249.333 753 246 707 c 1 -208 1489 m 1 - 960 1489 l 1 - 960 1328 l 1 - 208 1328 l 1 - 208 1489 l 1 -EndSplineSet +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1328 154<207 961> +VStem: 866 174<630 812> +Refer: 70 101 N 1 0 0 1 0 0 2 +Refer: 109 713 N 1 0 0 1 25 -343 2 EndChar StartChar: uni2215 Encoding: 8725 8725 308 @@ -7858,31 +6488,6 @@ Flags: W HStem: -412 150<337.653 757.867> 12 154<428.102 635.867> 1005 155.41<408.153 635.294> VStem: 59 190<418.733 726.4> 806 184<-211.333 209 431.6 740.133 962 1132> Fore -806 585 m 0 - 806 704.333 784 800 740 872 c 0 - 684.667 969.333 602 1013.67 492 1005 c 0 - 428 997 369 948.333 315 859 c 0 - 271 786.333 249 691 249 573 c 0 - 249 454.333 271 359 315 287 c 0 - 369 198.333 428 158 492 166 c 0 - 602.667 166 685 210.333 739 299 c 0 - 783.667 371.667 806 467 806 585 c 0 -990 1132 m 1 - 990 151 l 2 - 990 -224.333 818 -412 474 -412 c 0 - 392 -420 298.667 -405 194 -367 c 1 - 194 -188 l 1 - 299.333 -245.333 383 -270 445 -262 c 0 - 685.667 -262 806 -135.333 806 118 c 2 - 806 209 l 1 - 730.667 77.6667 611 12 447 12 c 0 - 343 4 249.667 60 167 180 c 0 - 95 285 59 416 59 573 c 0 - 59 731 95 862.333 167 967 c 0 - 249.667 1087 343 1151 447 1159 c 0 - 610.333 1183 730 1117.33 806 962 c 1 - 806 1132 l 1 - 990 1132 l 1 696 1302 m 1 414 1302 l 1 417 1423 l 1 @@ -7891,6 +6496,7 @@ Fore 699 1422 l 1 696 1302 l 1 EndSplineSet +Refer: 72 103 N 1 0 0 1 0 0 2 EndChar StartChar: gcircumflex Encoding: 285 285 310 @@ -7905,40 +6511,10 @@ StartChar: gdotaccent Encoding: 289 289 311 Width: 1133 Flags: W -HStem: -412 150<337.653 757.867> 12 154<428.102 635.867> 1005 155.41<408.153 635.294> 1296 254<449 660> -VStem: 59 190<418.733 726.4> 449 211<1296 1550> 806 184<-211.333 209 431.6 740.133 962 1132> -Fore -806 585 m 0 - 806 704.333 784 800 740 872 c 0 - 684.667 969.333 602 1013.67 492 1005 c 0 - 428 997 369 948.333 315 859 c 0 - 271 786.333 249 691 249 573 c 0 - 249 454.333 271 359 315 287 c 0 - 369 198.333 428 158 492 166 c 0 - 602.667 166 685 210.333 739 299 c 0 - 783.667 371.667 806 467 806 585 c 0 -990 1132 m 1 - 990 151 l 2 - 990 -224.333 818 -412 474 -412 c 0 - 392 -420 298.667 -405 194 -367 c 1 - 194 -188 l 1 - 299.333 -245.333 383 -270 445 -262 c 0 - 685.667 -262 806 -135.333 806 118 c 2 - 806 209 l 1 - 730.667 77.6667 611 12 447 12 c 0 - 343 4 249.667 60 167 180 c 0 - 95 285 59 416 59 573 c 0 - 59 731 95 862.333 167 967 c 0 - 249.667 1087 343 1151 447 1159 c 0 - 610.333 1183 730 1117.33 806 962 c 1 - 806 1132 l 1 - 990 1132 l 1 -449 1550 m 1 - 660 1550 l 1 - 660 1296 l 1 - 449 1296 l 1 - 449 1550 l 1 -EndSplineSet +HStem: -412 150<337.653 757.867> 12 154<428.102 635.867> 1005 155.41<408.153 635.294> 1296.5 204<440 644> +VStem: 59 190<418.733 726.4> 440 204<1296.5 1500.5> 806 184<-211.333 209 431.6 740.133 962 1132> +Refer: 72 103 N 1 0 0 1 0 0 2 +Refer: 228 729 S 1 0 0 1 -13 -51.5 2 EndChar StartChar: hcircumflex Encoding: 293 293 312 @@ -7966,20 +6542,10 @@ StartChar: lacute Encoding: 314 314 314 Width: 469 Flags: W -HStem: 0 21G<177 361> -VStem: 177 184<0 1556> -Fore -177 0 m 5 - 177 1556 l 5 - 361 1556 l 5 - 361 0 l 5 - 177 0 l 5 -115 1664 m 1 - 352 2039 l 1 - 574 2039 l 1 - 299 1664 l 1 - 115 1664 l 1 -EndSplineSet +HStem: 0 21<139 323> 1666 375<89 326> +VStem: 89 459<1666 2041> 139 184<0 1556> +Refer: 77 108 N 1 0 0 1 0 0 2 +Refer: 114 180 N 1 0 0 1 -360 364 2 EndChar StartChar: uni2219 Encoding: 8729 8729 315 @@ -8049,29 +6615,10 @@ StartChar: rcaron Encoding: 345 345 321 Width: 737 Flags: W -HStem: 0 21G<114 302> 949 164<534.695 679.003> -VStem: 114 188<0 929.6 945 1117> -Fore -706 1104 m 1 - 706 915 l 1 - 691.333 937.667 659 949 609 949 c 0 - 404.333 971 302 851 302 589 c 2 - 302 0 l 1 - 114 0 l 1 - 114 1117 l 1 - 302 1117 l 1 - 302 945 l 1 - 366.667 1055.67 484.333 1111.67 655 1113 c 0 - 676 1113 693 1110 706 1104 c 1 -298 1291 m 1 - 53 1667 l 1 - 192 1667 l 1 - 372 1422 l 1 - 552 1667 l 1 - 691 1667 l 1 - 446 1291 l 1 - 298 1291 l 1 -EndSplineSet +HStem: 0 21<135 323> 949 164<555.695 700.003> 1292.5 376<110 355> +VStem: 110 638<1668.5 1668.5> 135 188<0 929.6 945 1117> +Refer: 83 114 N 1 0 0 1 0 0 2 +Refer: 226 711 S 1 0 0 1 -103 30.5 2 EndChar StartChar: sacute Encoding: 347 347 322 @@ -10473,8 +9020,167 @@ Fore 604 -104 l 2 EndSplineSet EndChar +StartChar: Iogonek +Encoding: 302 302 418 +Width: 764 +Flags: W +TeX: 0 0 0 0 +HStem: -356 123<432.447 598.968> 0 152<92 280 478 670> 1337 152<92 280 478 670> +VStem: 278.914 139<-220.733 -108.4> 280 198<152 1337> +Fore +353.914 0 m 1xf0 + 92 0 l 1 + 92 152 l 1 + 280 152 l 1 + 280 1337 l 1 + 92 1337 l 1 + 92 1489 l 1 + 670 1489 l 1 + 670 1337 l 1 + 478 1337 l 1 + 478 152 l 1xe8 + 670 152 l 1 + 670 0 l 1 + 477.914 0 l 1 + 437.914 -60 417.914 -107 417.914 -141 c 0 + 417.914 -202.333 454.247 -233 526.914 -233 c 0 + 569.581 -233 611.247 -223 651.914 -203 c 1 + 651.914 -336 l 1 + 599.914 -349.333 554.581 -356 515.914 -356 c 0 + 357.914 -356 278.914 -296 278.914 -176 c 0 + 278.914 -124 303.914 -65.333 353.914 0 c 1xf0 +EndSplineSet +EndChar +StartChar: iogonek +Encoding: 303 303 419 +Width: 469 +Flags: W +TeX: 0 0 0 0 +HStem: -374 123<190.533 356.415> 1100 20G<127 311> 1323 233<127 311> +VStem: 126.999 49.001<-159 0> 126.999 184.001<0 1120 1323 1556> +Fore +126.999 0 m 2xf0 + 127 1120 l 1 + 311 1120 l 1 + 311 0 l 1 + 247.653 0.00390625 l 1 + 200.986 -66.6631 176 -121.667 176 -159 c 0 + 176 -220.333 212.333 -251 285 -251 c 0 + 327 -251 368.67 -241 410 -221 c 1 + 410 -354 l 1 + 358 -367.333 312.667 -374 274 -374 c 0 + 116 -374 36.999 -314 36.999 -194 c 0 + 36.999 -137.333 126.999 -94.2363 126.999 0 c 2xf0 +127 1323 m 1 + 127 1556 l 1 + 311 1556 l 1 + 311 1323 l 1 + 127 1323 l 1 +EndSplineSet +EndChar +StartChar: Umacron +Encoding: 362 362 420 +Width: 1343 +Flags: W +TeX: 0 0 0 0 +HStem: -29 164<523.867 886.133> 1694 154<333 1087> +VStem: 166 191<418.199 1379.68> 166 198<1119.99 1489> 1042 201<417.44 1489> +Refer: 109 713 S 1 0 0 1 151 23 2 +Refer: 54 85 N 1 0 0 1 0 0 2 +EndChar +StartChar: umacron +Encoding: 363 363 421 +Width: 1143 +Flags: W +TeX: 0 0 0 0 +HStem: -29 160<434.533 633.867> 1100 20<817 1001> 1281 154<189 943> +VStem: 127 184<332 1117> 817 184<0 172 347.2 1120> +Refer: 109 713 N 1 0 0 1 7 -390 2 +Refer: 86 117 N 1 0 0 1 0 0 2 +EndChar +StartChar: Uogonek +Encoding: 370 370 422 +Width: 1343 +Flags: W +TeX: 0 0 0 0 +HStem: -365 123<876.533 1042.42> -29 164<523.867 803.346> +VStem: 164.2 192.8<386.133 1379.68> 166 198<499.343 1489> 710.5 151.5<-229.733 -133.377> 1042 201<397.166 1489> +Fore +927.859 -0.25 m 1xec + 883.859 -65.25 862 -115 862 -150 c 0 + 862 -211.333 898.333 -242 971 -242 c 0 + 1013 -242 1054.67 -232 1096 -212 c 1 + 1096 -345 l 1 + 1044 -358.333 998.667 -365 960 -365 c 0 + 802 -365 710.5 -321.844 710.5 -201.844 c 0 + 710.5 -149.177 735.5 -90.5107 785.5 -25.8438 c 1 + 759.693 -27.9658 732.983 -29 705 -29 c 0 + 344.467 -29 164.2 146.798 164.2 498.392 c 0xec + 164.2 518.676 164.8 539.546 166 561 c 2 + 166 1489 l 1 + 364 1489 l 1xdc + 357 595 l 2 + 363 434.333 380.333 323.333 409 262 c 1 + 467 177.333 565.667 135 705 135 c 0 + 844.333 135 943 177.333 1001 262 c 1 + 1028.33 336.667 1041.54 444.001 1042 584 c 2 + 1045 1489 l 1 + 1243 1489 l 1 + 1243 560 l 2 + 1244.2 538.546 1244.8 517.678 1244.8 497.396 c 0 + 1244.8 173.753 1233.94 24.916 927.859 -0.25 c 1xec +EndSplineSet +EndChar +StartChar: uogonek +Encoding: 371 371 423 +Width: 1143 +Flags: W +TeX: 0 0 0 0 +HStem: -356 123<895.808 1061.69> -29 160<434.533 633.867> 1100 20G<817 1001> +VStem: 127 184<332 1117> 742.275 139<-220.733 -107.533> 817 184<0 172 347.2 1120> +Fore +941.25 0 m 1xf4 + 897.25 -65 881.275 -106 881.275 -141 c 0 + 881.275 -202.333 917.608 -233 990.275 -233 c 0 + 1032.28 -233 1073.94 -223 1115.28 -203 c 1 + 1115.28 -336 l 1 + 1063.28 -349.333 1017.94 -356 979.275 -356 c 0 + 821.275 -356 742.275 -296 742.275 -176 c 0xf8 + 742.275 -123.333 767.275 -64.667 817.275 0 c 1 + 817 0 l 1 + 817 172 l 1 + 729 38 620 -29 490 -29 c 0 + 368.667 -32.3333 277.833 4.33333 217.5 81 c 0 + 157.167 157.667 127 274.333 127 431 c 2 + 127 1117 l 1 + 311 1117 l 1 + 311 438 l 2 + 311 332 329.167 253.5 365.5 202.5 c 0 + 401.833 151.5 456.333 127.667 529 131 c 0 + 609.667 131 678.667 164.667 736 232 c 0 + 790 294.667 817 379 817 485 c 2 + 817 1120 l 1 + 1001 1120 l 1 + 1001 0 l 1 + 941.25 0 l 1xf4 +817.276 0 m 0 +EndSplineSet +EndChar +StartChar: macron +Encoding: 713 713 109 +Width: 1118 +Flags: W +HStem: 1671 154<182 936> +Fore +936 1671 m 1 + 182 1671 l 1 + 182 1825 l 1 + 936 1825 l 1 + 936 1671 l 1 +EndSplineSet +EndChar EndChars -BitmapFont: 9 426 7 2 1 +BitmapFont: 9 425 7 2 1 BDFChar: 0 0 9 1 7 0 6 rdo`RJqEt% BDFChar: 1 32 3 0 0 0 0 @@ -10693,7 +9399,7 @@ BDFChar: 107 172 7 1 5 1 3 p]q-* BDFChar: 108 174 8 0 6 -1 6 3(1?XZDp;P -BDFChar: 109 175 5 0 3 7 7 +BDFChar: 109 713 5 0 3 7 7 n,NFg BDFChar: 110 176 4 0 3 3 6 @$$IX @@ -10753,14 +9459,14 @@ BDFChar: 137 204 4 0 2 0 6 i'9Om5X=6- BDFChar: 138 205 4 0 2 0 8 +@+jM5X7S"huE`W -BDFChar: 139 206 4 0 2 0 9 +BDFChar: 139 206 3 0 2 0 9 5bJ,85X7S"5i;VB BDFChar: 140 207 4 0 2 0 7 T\r(#5X7Tm BDFChar: 141 208 7 0 5 0 6 GYCNd6pu8" -BDFChar: 142 209 7 1 4 0 8 -5X:FXd*T#$O8o7\ +BDFChar: 142 209 6 0 5 0 8 +-r@k#Unj66MuWhX BDFChar: 143 210 8 0 5 0 8 +96Z1KS5#7Du]k< BDFChar: 144 211 8 0 5 0 8 @@ -10854,23 +9560,23 @@ J:QR>OHACNJ,fQL BDFChar: 188 255 6 0 3 -2 6 0E@22:bX"7?iU0, BDFChar: 189 260 5 0 5 -2 6 -+Abm2G_h"Y$ig8- -BDFChar: 190 261 5 0 3 -2 4 -E"MN#n.6-2 +0JH$gG_C_U$ig8- +BDFChar: 190 261 5 0 4 -2 4 +?k@:=E"Eid BDFChar: 191 262 5 0 4 0 8 #S;6rJ:N0#GQ7^D BDFChar: 192 263 4 0 3 0 6 &0PqBJ:MS= -BDFChar: 193 268 5 0 4 0 8 -&--sjJ:N0cGQ7^D -BDFChar: 194 269 4 0 3 0 7 -:`oaWJ:N/h +BDFChar: 193 268 5 0 5 0 8 +-kJ@+J:N/<2uipY +BDFChar: 194 269 4 0 2 0 7 +TKiKbJ:N/X BDFChar: 195 271 6 0 5 0 6 'GPMJOH=D] -BDFChar: 196 280 5 1 4 -2 6 -n:6&YJ:R,30E;(Q -BDFChar: 197 281 5 0 4 -2 4 -E/=:>GT\[? +BDFChar: 196 280 5 0 4 -2 6 +pjdniJ:RD+(]XO9 +BDFChar: 197 281 5 0 3 -2 4 +@$'l.E$-h7 BDFChar: 198 286 6 0 5 0 8 -ocUiJ;f0"HiO-H BDFChar: 199 287 5 0 3 -2 6 @@ -10913,16 +9619,16 @@ BDFChar: 217 351 4 0 3 -2 4 n:4mXi#lD- BDFChar: 218 352 9 0 4 0 8 :`t"5J8bc"n,NFg -BDFChar: 219 353 9 0 3 0 7 -:`oc-J8c(h +BDFChar: 219 353 9 0 2 0 7 +TKiKbJ3Y6m BDFChar: 220 357 3 0 4 0 6 #Z1"U5X98g BDFChar: 221 376 9 0 4 0 7 0SkN]+n,NFg BDFChar: 279 282 5 1 4 0 8 +@,FHJFJ)>n,NFg -BDFChar: 280 278 5 1 3 0 7 -5i@0Ci.-@9 +BDFChar: 280 278 5 0 4 0 7 ++S^J;pjdni BDFChar: 281 274 5 1 4 0 7 nF1sYn:6&Y BDFChar: 282 290 6 0 5 -2 6 @@ -11088,7 +9794,7 @@ BDFChar: 304 277 5 0 4 0 6 BDFChar: 305 283 5 0 4 0 7 :`oaWM"lLF BDFChar: 306 279 5 0 3 0 6 -+96ABn:5HX ++95f2n:5HX BDFChar: 307 275 5 0 4 0 6 Duaj=pjd;` BDFChar: 308 8725 3 0 3 0 6 @@ -11311,8 +10017,22 @@ BDFChar: 416 1117 5 0 3 0 6 5QHn-YgAI3 BDFChar: 417 1118 4 0 3 -2 6 ?iZ:M:gbD2J,fQL +BDFChar: 418 302 3 0 2 -2 6 +i'9Om5X=6m?iU0, +BDFChar: 419 303 2 0 1 -2 6 +5QF&75X7Sb5QCca +BDFChar: 420 362 6 0 5 0 8 +GQQcE"Eid +BDFChar: 424 175 5 0 3 7 7 +n,NFg EndBitmapFont -BitmapFont: 11 426 9 2 1 FontForge +BitmapFont: 11 425 9 2 1 FontForge BDFStartProperties: 36 FONT 1 "-FontForge-Tahoma-Normal-R-Normal--11-80-96-96-P-62-ISO10646-1" FONTBOUNDINGBOX 1 "15 11 0 -2" @@ -11566,7 +10286,7 @@ BDFChar: 107 172 8 1 6 0 3 qud-* BDFChar: 108 174 10 0 8 -1 7 4odkKS:HcQS:HiSP(5gu4obQ_ -BDFChar: 109 175 6 0 5 9 9 +BDFChar: 109 713 6 0 5 9 9 qu?]s BDFChar: 110 176 5 0 3 4 7 @$$IX @@ -11726,24 +10446,24 @@ BDFChar: 187 254 6 0 4 -2 8 J:N1>LkpkCn:6#h BDFChar: 188 255 6 0 4 -2 7 :]Q<-:f&8W5X5;L -BDFChar: 189 260 7 0 6 -2 7 -&25L\9RK6["9ni+ +BDFChar: 189 260 7 0 5 -2 7 +0JH$g8Gn-o#Rg\5 BDFChar: 190 261 6 0 5 -2 5 -E!U]EM"hN$ +E!U]ELj016 BDFChar: 191 262 7 0 5 0 10 ":+ue7"BfJ9W1j +pjdnaJ:N1F&/YBI +BDFChar: 197 281 6 0 4 -2 5 +E/=:>Li +BDFChar: 306 279 6 0 4 0 7 ++96A:pje0> BDFChar: 307 275 6 0 4 0 7 GQ;tZpjbVS BDFChar: 308 8725 4 0 4 0 7 @@ -12184,8 +10904,22 @@ BDFChar: 416 1117 6 0 4 0 8 5Tg&_LmY-^L]@DT BDFChar: 417 1118 6 0 4 -2 7 :`tRM:f&8W5X5;L +BDFChar: 418 302 4 0 2 -2 7 +i'9Om5X7Tm5[XQl +BDFChar: 419 303 3 0 1 -2 7 +5QF&75X7S"JA;-b +BDFChar: 420 362 7 1 6 0 9 +GQ_%u&P!GO&P!Dlp@=TC! -BDFChar: 109 175 7 0 6 9 9 +BDFChar: 109 713 7 0 6 9 9 rVuou BDFChar: 110 176 6 1 4 5 8 @$$IX @@ -12551,7 +11285,7 @@ BDFChar: 164 231 6 0 4 -2 6 G^tJcLB&KCFHmJcJ+;5O\XQ BDFChar: 215 339 12 0 10 0 6 @@ -13308,6 +12084,10 @@ BDFChar: 252 8364 7 0 5 0 8 4@"GpJGap_49,?] BDFChar: 253 8482 11 1 9 5 8 k^ZBX8q9H_ +BDFChar: 280 278 7 1 6 0 11 +0JEM)J:RQJJ:N1J +BDFChar: 306 279 7 0 5 0 8 +&--s.K`$@RGQ7^D BDFChar: 313 173 5 0 3 4 4 n,NFg BDFChar: 316 183 5 2 2 5 6 @@ -13490,12 +12270,22 @@ BDFChar: 416 1117 7 0 5 0 9 +:nO+N/X!s`.S*j BDFChar: 417 1118 6 0 4 -3 9 82(%"LepoE+^*6@j[h!rr<$ +BDFChar: 190 261 8 0 6 -2 7 +4@0*56@sr<"9ni+ +BDFChar: 193 268 9 0 7 0 14 +&IJX@*[*e!J:N0#5Tq0K +BDFChar: 194 269 7 0 5 0 11 +6mrTH3(/:IJ:L$I +BDFChar: 196 280 8 0 6 -2 10 +rd]NLrd]NLJ:RV%"onW' +BDFChar: 197 281 8 0 6 -2 7 +3(/AtJ:KsK#Rg\5 BDFChar: 214 338 15 0 13 0 10 +8fOI5lcH9Jc('!JH16$5lb)Ld[%eLd[;WLkLRP815Sl&0MM! -BDFChar: 109 175 9 0 8 13 13 +BDFChar: 109 713 9 0 8 13 13 s*t(L BDFChar: 110 176 8 1 6 6 11 G_Ca'KQmIs @@ -14576,6 +13380,18 @@ BDFChar: 187 254 9 0 7 -3 12 J:N0#]Y]5NJUrB(r.'4TY`g +BDFChar: 424 175 9 0 8 13 14 +!!*%L EndBitmapFont EndSplineFont diff --git a/fonts/tahoma.ttf b/fonts/tahoma.ttf index 76526b0c6736175ffbae692f9d85961848587221..e54313cf51944756f63ab9b16dfe5f1cd82d458a 100644 GIT binary patch delta 11840 zcwWtVd3+RAy7qf|sjA+qvv$bVo$l-*goG?0gb)IRRX~Wy5(7vC2@wSp7^Fi85fKq7 zG{7*5h=_<736iMjWRP*x@pDjtizutWh%$%_VuYmoK2=?50{7nE@4LV6pD+5Px}JK^ zd(OL_Qys3os&AC^Ya^!Z{DDYhgNjSWt+b7Lk?6fkL^H|<6^|Hrrf<=2#GE6DQcDL9 z9yfC6d9FXPq3ek#W=P4P!TdLdUPLc?a9=!R^xgNwE*-vu=%pee(~cqcj4vKIZ|GV) zpZVOvc<*5%{psm*rp^tizw|hfbuW?jviN~NY+=~xZ zEvo$5fA#~S@MA=CGiJ`1`oPrsT`Pzf7Dah8L4>#jH}30j@0mGg{=x;bHvU4SNg?8P zRXsd?YURr1F+|>w8caB0&eVl-*$ryM0IZap)l=upa2U?bC#u(BQAKkfo;Uy16X_F( z)|U_&4iO{yXTZ|0BRlT5_5GDhf?L`X~8fjR%A@+zO>74nYSli@`bY)3980ODohAb=V2HF(H_uYXj*yof@mB+{ zOKrOQ?W1)6pki$!1+M#Plr&S{LwZ&($gtd{FQXFO98#{*UVT!g|7Q%H1cm)@{R!7W zxNemvf@+U?eOlX28*sgE9oL^#OGR9ceVgua^6L9j@G8yca@fA6ZJb*O?aBJELRP{` z*?2aI&0w?HJn6V~ysbCu#|E$=Y&4s|%GpCwp>6z>5B%@@-}N{98~wZeyZk%++x=Vp z&-!b9Q+$(sqdKZOx_4xBq;{lqBzJhu%sn&bOx2m$XJ($c|IEFoFPwhlboJ>zry5SJ zKehVQ)2E&~Rex&vsmD)EI#qINz_%y3*N92K*dAyaCk|)cr)fS_(t|XcJwuD>6?&BB zFo_mY728IuXfu167O+>@cA7^ZiBy>4Wy=@0Blwu(I~rG&V` ze`Ri#M)Oz_OJ*swgr&1o=8?)nzV?<{YpuJiS8Or1EL)xJ1>0rOBMuWMiZjJ8#P94@ zd#1h2UTa@x-)}!|zhL);goO+anHjP<UELwAQB4fBL$h4l?9 z4I39$5mptpFsv?Yf7mBshr>>XT?%Up*M%pASA{POuM1xrzBznH_-7HuhzM^)LPTan zpNPQ`V#<53r)u6E1pR?+RnZacf}>vo{q z7u}9`yAW-S9vfXA{ZRB{(Y4WQqBli*w@2@ZF~>}dsf>9vW>d_;m_spbv0QAo*reE^ z*vi;dv72Le#_o$f5c^&1)i^OOEiNyvIBrzj#JI}1N8`4~U60qqTjRUMC&g#S7sjuS z|1SQA_-oDx=P+lPbDFc-x!76nT<3hzxzqWBtD7symF+5Y4Re*brn#zJTV1r23?zNk1gVB#%p;nY=prT#7EmnNpHco>G(2l5#aQDfNNW{i&DJ z($dzY9ZtKD9+N&ceR2A}^h4>_GsFz<;Ec+Q+Kjy!pJcRmPw8IRy`uYP-G9u~WhP}7 zWmaUa%lstsdXJPIGka|9aWc!9)hDYeYiHK}tixGXdq(uk>si@ze$U#T>w9kNxwq#R zJ%7m7WOvIh%r48W&avhsLlJnm&Hugb1phC^yMJXN)WGgAb;-asIV8RP=d^pcN{k+i(HspDjw|a4 z@H2w^!X3xD@bf!)=H7QM$hUA01o^a^`Y!SzK|NImdjxsQ9&Sr;KuS~N-~uKu=`Q~T zoyg6`lVO1+8BZ!h0(@nVUnqRjg|F)5nfuyzUHIsrd{tWk8nMQYeV+B^W|LMvCFIz1 z?AlN_Th?-*>3QGJUR}k_E!=G1D)yMX!)nNjU&FZjy9(zpZ%fO+PWt{O%j$k$kNcid zWc}5o*JNR|Dz-ygdCv z%`xy3)nx_v>P~s)zIn0>ZwFt+GP}rgzI(L4DtgKTX8d$a3CNSaGM)7F-BY|lnUJ7N z)#sVFdI#TE?FAf5EQ-FBjQXQ$&haeKf6VtzQ2vQv?|{iHHz@B5=4cY_Qv!Y6_p)BH zjlJUCr8KA%wL$HY8x)Q5|ES%jEW9+ZaNRMr!q4h<35HI2G_G}QQBeNrPI>0$Z{CvU z%YyRB^gJ8fDX+gM%g<5(bFmjNfyT0Ha@wh&XND12aohl3M%j0S~ABh;t!9pF=y z2|PGmG$0Z0^8Zu+0T+i)p>k(qp*dQ;6q^>y>q-tZpY;uw`ldN}or`t&w3Sj>noD}A z?1a~^Hdeks3^Z1FePHCRI@Eur)*-x3QNGuM@=vJpve)lbydJ1qU9g^$viEnc7xF`4 zUouT%y2Rr0!SV53!6u0HoH5kzTi& zZ-J+qf=`pEk&TtL`=)A7a;4x$1XlA~SNRD+`DEJ8N;~ECCxY_H|NdM)s?$i{Qk_qK znb3onhflC-BI9)VdHK?)DX&`f6fW-=%+;So@}bhrDJcd`i|>N=)UHQnOJ^p>3;Kvf z9jv4MeW@lrH8bdpFO}@;u4dB{>{0MfqC~GM{7BWvUFACv9skdGVC3JFHy-~;HY%`3 zA(toN*JE5cq8%A%a4ej2CnP5&C%F^&+`OFZ$cUV5Zwu?cXx_ldT*$P7Sqt!K%DloE zN;4~esWw+*%wO}T6?p@dh4q8JKP$B-?~#L9;w#a4BP)vn9r8yQc}f4}t!^6X%5^Pk z+2ccDD{U@+lcHo0gq!)tR3!+8zk+3A{8sQ`Qfo!H*W2Qo{aD1CuXlSatYe?D65)jx zd}rY3$-d2+7coZ^-Z@!rj@_N>3U}Lc!rfeWSWb4nY+Y_IHqCcq|9(wzYin!YIYs?O z_4(HZ-OC#`+`NCo#GJ`-E5i1UQksni8^I&$zYscN z5@K59wN&<2bcAFk_0>&Q!z@}d1j>zJ zCRey7|Ks;Abo}jO%|=}s`_UJ1^QivFjUzh)`_j`GlciFrfm%LC zwF@};)G{G3Mw(msk=H||Y%`wX)g3J$9#8L6duyG4oxk%qQvhv=)IgE)apu-0qW`19 z^S;G_Z6qkaMU-Ein&{^3^4uF@=Vp{*Ng>=EH%JjZj|EyYT@ELl1tIj!S+ z&BweU{a&{9-W2B5eyjE5(6W?atWL*V0i=n%?=joSRF^MM{K4rI``&4pGiOoR zn3k6Nl)3iaJ$2Wo`lJg#X?Azq_tHlFjPjQ>f4I3t-5Yl*eXfuK$IEzW>C8dHl8I;i z;F+GtrH62)Ponz+{cinV16>*8hO2?kPy*jy;T3u1+z^oW{8{QZ>!@QN_oQ|Q??OJK z4d%MEJ36eItK5^Dnrsh!+=so;G zzVD%9bcT-8xAYyIpwsjXouWUoacn#*WB0NNOzQpG^Jcb9e*0&y$?xjY7q7+l+)1nH zCH4l}#olDQQ7~`OCfZ0pvqttdy-Mq7GrdO7(t3KH-lbM-%zK*RcC2C|KlI@TAFiG; zo1Yc9N;_VE#lnxDGj;l-4_EUGaFt4Tri=V|Rct}v+B9$HQLQw5cSh8Dye>V@HjsvG zWUt{f)`QPG*-mNg?%7^^rZH>>evd+$G8!&-M$(ZL9kql;!_NYV-}5VQ_`r$RD8Llaax#7$GUxNRVtpMurd?l_=N#oug6TO^_tPWV?zl>Qz zz-#>fWQx4h`gS5)BVBmApI(dmHB!o+-qFkb-$T>)q$fK@gaS!O;#L0Zc)ny$u0`X& z%(VXf(69j-KHM|ZE;GyhGcjr==AMap9ZfDs_i5@Gs_6B}=W{!BhC=rmX=zh;yVn0H z#%#rytr)W(WA-=Y;@Q=vXQ1y(%+LeRAHnlSz^>gJj^Eq&_Ooaq-)ZX_>B`;#VD@%l z3g79C6<%in{d=*(x_4&T18ZIZ<_X9>0Xg40{ZvanRee#qFFsoK5eFY#M$6tprT!cA zhW`ehU&iy=ear33vC=xAo=VtLz#1u{`7VQ2u^+Zb6Pt6ut!eHTuEiRZaX>xALOK>t zPB(`mg5QAs25bnd*0dz%YyH>QEjAvJD#K1@_wQF$5{m0!Tz4w7bZQKPw(^!lb#8h6 zt6O^8|BEK+XiKU-uzuaU?jCFWawI}-X+qvZ7jkY4-nn$ha;y9ad2dBESf!iRxW<;nQ-}Ax)rRRJ*j+G zw~DQi>#Hf|eRH@+J8u5E$pQ*U_kpK@=ZNPQ^;$G2vc|xXflD3n$o7rXS2qni^b@mZ z9bC8AQEcY*q}NycDOsqH27T2p6k__6fzQEPk?FnKKtg{k$9sS6c#S2k{(D_uUE8i7^v9O(MUI)}2b^{>hci#(ET*I{8}fAN%F z5fn|2z9vmMlE5(?)^(-Hdt{9{k|TkKQN!D&3Rwb295*+4>r-nl>nsq zpMRWV92vRxrt{}@7REJ1GnOdX{{5}jq=#2Z-QlSvF44r3ffq-=TvGbdfLg)P#Tqk5 zW;jM*x zO*qiOrgaxkGFSRRA%PRPG*}UoV}i|V%##^*I0a~2&P5+m?gg>vwtI1m*m-Y+ zUj$EJ1@+f#LFq9GDWi*)=>$@!Wg4An!xjvP{6ut;MI94Xx++X`4$#0oWHLA$9*@WC zDPCHkQYjrhcF^+n~o_H|i+PRa7JY6uIJ*L@9ZhdOMIPqbxkL2%@%K z5c{`cHrr{D*ul}>)|$F2IQW3L;w)OGZF5#okS}VrXqkzFPls=}XvhSgma*1`H6d(F ze=j++9A-|-YFaB&+@}>QeVtZX3}iCmfhw`(*_xs(Wxa~K<@Gik4`CxYCcrX(b8;x_ z9pY8|P_k0zNO?|nO|9%2Bbkk6-7;sXODMMciq@uZjB1L^W&yd>w^&nHTw7beSfkU5 z1`>^SJx&t8=w%6~C}^m*(89r$st3@{Yyz{vi{zIbr2MM!E8%ivv4e%9EBwot;WRvH zHguJM`hr#F_$y9VU%{DW(=ju5t^_}$JXz=p7G0@l-B8af4b_Qk{AjC@tVVB*z_FSN zhx)7N*;bPrK0hrB{0!`;*mX;yrXoye*D%VG?J@+VFmc02iL8ug2C`yF%~45gC1)q~ zPjGl8VDjGp+Z!4)nA@_`U|{m!R2$;zO7hfS98TNHWAZSoe2EFY8ARo>hYs_3_MOe5ldx7{|tW|Idb zv~*pNr6XLKK*R(>n|PbND6-Cbr*cjt%7Xc_1B&o`XY;x4>}icxB+|zKaEBhRhWa94 zI4~BN0?Y*F0ZRcaR4)OWf$hLs0M?`b3-B56HSis90r(mC9c#s@pR)jX%jV*ML?8pe zTpV6Iyxb6c7!Ba(i(l^o9|4~N zUjeX6I0yU$U_!x1C|LmMYk&(42$lS&bpzaIfK>)~&j9ZkkTixlz+(WsXMpz%&jWt~ zUI*Yk!w10M0EEhbP#L`c#IIj~n@CqZfJuze0ODjsavFOB1A!4h8Bh)&Cyeuf#Xt>E z53B~(0ULpr09a^z1K10E2w+md|AzXMYt#t9tCns+0)V8n$wfr9d@w9vcz+%gJ0PeM11=@+^FF>rQ3Tp^}1z3?k)=U5%wtC@W zD`IP%0Kjr9Cbzni{f$chBAqB5)p0ZeLz#a38s{Q*D@S#O|WVlo?g ziVfD$C!!h~Gu5rZr$Pa9N)keiZT)r>94l{EAg+uKY(w63xNtW zzz743GN4f!kT(XDyP+gdd0qo@#(;)mKt&i(4F=S?VZB;*2$unh4e*));WD7a4agP4 zQQ$1_BY-L}AWYcg$!G=OIip9dJ}lli6hL|y5gj9^ia zfIq7hg>air0w`Y-7H&e4o34A+(n6m%8vq*+1)zVJdjiOEGs0(v`^{)lW=v+T0?^{k z$T72|RuzmeBfrdO?`C+(jD$9y0nh}^Xzdp0w;=o$Y{(XP$AT7NxeM?P#xKOdG6|TW zRu5ccfpQC!TcF&s3qa?yK(XbBS|zZ+0`FM0YIPuItnolHkPSe&6}qjcPV2qEQ~>?Q zihaY1mTs*B&=$Pb7w};V01K>d1MdTv$ck2OJpo)$tD{4$4!c?%C`DU$0O7Eq3TKCZQ8w%ywygj{V?$oq-a-6rn9zo=Zb9V6jc_5(Ald}A6GeR7w);+I9Z>D5UJF6<$07>`3^Fx zvaPBtwh{_axvx|XU7ehzDtWbwQb&MGGpd}tplFp#yp02)@^?4P?av~z(-x@DRi~u= z;g0)d>OHUCuWa7YpKWK}9;qPpIs-G9ZYrz)-=@NGB^AC^QbABtAx2GwEHxEM)Kr+D zrb3mP3UzFHAQd*Nsjy2;h5c$Oe6FU#{J^SvWZrI7k6w4&_fhX<7kgB$d|xs9U5@vU z0ivLDZ|dUSg6S%UqENmm>r_q-h#JMAdsWUJ$cUjhd64{tj!9@ozydNCRT()WLS+u;w4v=PiG7yR z1A@bnRZdP5m&$dfW|v8aJ#-sKl&A7r8pPqK{9&DKMGf$2Ns# zM&poAg5FFf%ME4q|Jwxkf7t|9cP7C9vRVkcFC{^Xgbs3qYa*I_?_PPA;p$h^5pMvuanauK+d+n&?fb0jVtc8Lde994( z!~RM=y#cbEQ^{}&HmCBmE|Vv#+!&P$ERv|d%6IN_f$=D1mH$-b)c}_ty5rvdA9oNZ Xn>}NY0h$?Q4WEx?9^FB4PWFESLdu)d delta 13292 zcwW7FcYG987xq1~z3-+6Qg+irC?T6dAPFIajv*97qzFO4pp;Oh1ef}PB+>@y#E{Sg z^hJUaF(T4bVxg<=t5i`$?4StQ+3%UzNdybu`_K0!zb89$=iYP9eeOBuo;%q+yz16g z)$)K5Z-y{tr7k(S1CC!GvWl^KJ7Yz2y5#ik{PBz1q8PQTWGtp#*RBH|>G5&wmyG&- z$`}jjmfNMP<}IC#u~!OlpVKYBPygnZd*Io>r!Z#N(XIcZIh_agn1|;ZS4FsM83txt}fG5Y!G?iq|xZ#+*eMuShB789TaxQ{9xH)VR^hiiH;#>FwFUOslh6GbN- zd(JZE@)-$*J;xPIFQH!;gwYNRu#YbqH!4W?B`jVIn6pbJOrCP7sK&+EmVJ!rRx)DZ zPp7sQTJXax8Mm21D>alx@0rv1=@}t}>JMwfaI0k;^ZsC*mW0Q^gu^qU!L1KIEQ@OT zp)FzyZK-*MY#d$X4=J9ZbiSR^X&S;cFcAqrZ+^ORvS|dJV>9TSrylr>zoQ&x>!AFY z~Gji0Ilma7~medh4{R53A3FN%TSG<;sf=Ky@3 z5fws3nWBNM#ph&RtL{iCe0Q~z7W3t5XU!3{UF+M5+ERPUqFm}ukJ4ZoMHBg7&5v3V zDV;K@6Lq6}Dx}BxL6%2{9`?NHdBd~c^P1-s&u-67PnBn*=Q&TQFwnhI=;j{fj&Vo3 zBis(R-5q*)%;nLSM_nFyx#)7?<@`$*FFkeX$xF_Q%P&5EapA=U7w27cT`av=a&f@L z%!}>+dtP11h__jX^LDGMW}>wxxfZY~Y&3h4Jx%{&Gg&p8#KuuMo6g44Cbooar1fkn zRnUuU3@BVlFVHHArVVU7dlrkZlhv{LY!oY@b<~_T63-?u7cIh*1#A&pM~sL{X*SKJ zdGsu~*qcO060nAvh$sFnD$F`DOvl zS~kmRHl*2Pp}j*Vg}xqoC9Gvw zVc3?iJz*EZ6T>sYmxLb-zhhV0GwjpsJM3RM)Q;|s0gjE11CF~95fP&!CPh3Ou_R)3 z#OcVWNZ0hp!%-no#ZgnD=0xp?IvuTyZXMk_dU*7L=!)n)(FdbXL|=-&6Jv~N5tAE} zA2TGTIA%)BoS5>ML$TJ_kl47`%xtl;#XeVy6D=ANLK3nQ1|_UbIGu34 zrM_iM%bqQtYPqrHftI&g<+K{mYDufARwr6(TiaWAZ9Tm8#?}W~pKcS;Cb>;7Ftr#kC}5cWOXtYHEJ!q}1}%-KiJS{L*sLrljpl`@UU^c4OQ9t6goo zU(>be_Vldu5$W^N_og38|0w-Z`j72d`)2Kv+vl|(-F`{?s`dvu4C*kx!-5WnI$Y0) z%2=8il({ie$jZqo%o>}uIBRv*wyeEbA9M`rIG|&B$Gsg-cD$Lb&Q8oOP-c%{tmaey z(vUVtQ&-``uc*#31=HcmKQhJF7HRW!(ku1#_5M|=bAr%tz&(*$Mx!w3$)tC5E(}Wd zTvZfcP&kXkpcJRSpGIvVwZC6rfHNu0UmY0{8kFY&aWEo0f6%y|*`qfd zt9$>|aWkt5qitb&)6o-(_h)S!o7=HZ;ZuW(QWKx6n>cXTuBDp_qWz-7qqqrzfOPHo z6??*Y%}X#+&BmCa(&-yX2GWs}A{7n=MZ9@*9d*2XLzqdzHFBR?! zcL(==)w#O~R4EK+%;WJ2({k1r7K5!tgA7qeQybegm5uEb%FoFNq{y1J8H-6w=-8>0 z9r*0Q!BoNz8XU&A%Sv#CvTl^?@pzwU3Nf~YBy%jwq^TG)1UpcL=4lviVayj+YaITO zHmAQM#c7KydGq*&yIjtpL+*ohb(*JzJ1f`T8@6_>ax)X{l*YcI*$0`ey>@ycC>Amk z(Eg29#SF|R6+-V5C@L^e`xVtF%}|KcFgr{4dJGKqr{pY^)6Q&uoSBP^Xsx28EJaFk zYh0UE{(fN!MRL7+ZN2+as~%&<&!3QiE$68L3--P;c-$Kc#&k-saa+>IPcLlWHF3=A zvs>g1&g+pJ9-Q;!OX`(y-TH={Wj8j@>ekXC6bXxV3BPQ4I^J0@bHUm&feRZj?>}V= zPj4S=ib^k<{o1&}6&okyGX7G>ll?&N7SC1X7aA9{GNgB3n^O@G7+{AV`#Nnt4!g+5 zw&NOI!a%AT7)OfZ4)-zlQ7QsATw6tD!@Qq{xLo7UDxPZ?=C09f6z=fHvs=NHZe`zb zfq-<+HN{T#Xk6J?oX9Rk`bI`*8Y3q)CCwI@g7Aq+u{xY7$+0nbn3C$W)0kt_Y+e4Y z?Y(DbW{uiV&~w+W$-h<~pmRSB=>1$x#hW|muzIwx#N8z{Y30cDcC*J?uS{R{GO%@i{0J+!3GzMXf$9f0@+XWd}Wa^9z1?%AXL}``QF^D;&b<~l+!^a_IUwdqf&6<|#ND2&4MaM`M ztLdDyfKN^{J*X;B_3@E7lDa4SWDdgV=-_NO2+sFP9_ z*-Q%h5Egx3&_7fvH@DvXNlXcPpF4``})Gm#l8z93bxcLuZzas3zE8Xo_eO@dZ?en?DdfA zE6p8&Z%gscu&7pLqv;*Q+1atJQOOk<}r;+nfh*WTGs(6_dB!8PF-ah)4ZaNFEP!r@VmzsSwH zSGoIr$H&~?J@TGs;t7dL$HFo9}h7UoR^ev|44ty$7wt0{xv>m2}BUhE&SOc}rw!C6(PBV8$`Y zC4%Lkurh2j{@7w*iF`(}Gft2K<57wy{mZL2Rn)$7=#7d^oAwGG;Xk5ZxQCHHrFGq1 z@YRX>YXv)dPzGe@c)nKd*6J`bRJj!6iqa^3{rtnUfdSF}W{PdCOi9ktq@{*YU_c;w z3v%V|Qo&O!WEqGvSnLV8{io!fB>zdCDf7>*8J(yw1-8i^IqT(7y%sHuitg-w+gr6O z=M_I`Z0G)hQ$)2K*14!_erkd?=(C$$vy|$7OWwXTH!6E_QR%2+SC3?k%9d!gMsRDr z)xA_a(fWTdK2WyaKT`SH|HbqIukHOZ zau-HNb$0Lg-~;9S|H<%P$ttB*D;iE;e&F4-Q$61*%2nTB(L(vpCxo~}0~F;In+|3@ z7EqY`*5(zu^{)wcr#>H8F~6ZwcpIw1HWdt+c=-IpnKM4@UcHGz$^61IJ~sN7EHDST z>{m?*!b^NLsBi|RITfNS*x?Ee96ZEJxB@P@XU>#u+g5hQZK1hTNQRRqgnKUGci}h0 zgoacn&frZ$dR>?xjC-wGy^yA3hg|H<2pv3MtKL$F;po{MhdD-a zo>hxmTWVU8k2NL|namm(kd}lETA_%kt(|mx!|btRXK%PYsdD|}iT!hO`VCu82M_PR zqIi>g{P&wXj;ZRZ=|9zVs)nCw!H>#ilZ1_vmZ}sll3P$P#yfjnb~T=qk=G33sn=;k zCXzw;SgWXZM{>K|k8)o$9N@ln`>Rgv5sLS?KiQ+nsE`fEcq>v_Aol4P@vVd-jGRp+ zV{)ogGlr2WIyttrcych40)my+hD*l7u74k^t*aOAEMK0Hy@c4cS?yCAzT(FAh#Z|) zHmHp=f&0;I<(3XUetOKmAFZsQfH|-A-&@tYGLuT5XcImtX(;!;eEjxKVs_(^p2FEc zN|9Lo9fhq@GA`k-#<~8+x~6pMH4zpbdRO>;#ot>P@<$qcPBL>~)!&$@AUWMOvOP;? z+jT$Ph@boDc3(bo<`1%GiEma|A_l8a7X9y3;~X5RR7vwV`o>?GPH39QcW2H#jA(_? z!&mpZNn!l*-hshk5kV5`xtmZC&Tu^rh$I&cBe3K)o_7jhV1Vs_C zDFJDATZ;VROML4U5SU`~9u}p&FAc@Q&1nHIztn8n`WIi=!u{-S*fgtRD2y{~F z$1Yek|CQ97UN09umXp(W__n^C)!kRG=F3+KuQnvOKTK^^Q(&ah!N+z~eEZ#|gB%r< z>~w!oGj`$1aj)(jyU@6Byu^-|yCv9}+Jc>^NdA#Wf?Q^-T5IBBx#%dQ^Z+TR-xh=$ z6ZSpdQ%TW%O16#IvP`K}rhV0pQ_^EJ@-d>aOOrQv4wtBdxT6$$g(GrLIdeui^WCm| z!_NMjSC@2DY2veq>!?sGn$K)bN*X8RkL#3MxQ9aDRB$bAtK$0f<-QR_>dc_72-KP3 zoH$MMgAx+dQd*DU+vkO=g$;0$9(++=oRX>p#*z><8gEzKc;PF> z#oZIVz1!}b;U>2nrKh9{pq1BO*i@Q?_C?VBv()~G>_@eEJIqq4!?%!09LgWdmWdO`QzD@)sxF=NB-6&-pCTbo|hiRVYg zsnq=;GEfxh5)&<_8rUx}M`7+3*K5FI`H7teBy<*7x@gk)Y{|RIwAY`fv-?_p4+KxK{tc|sec*zN6QC1seg0SL12>&{9Z8 z&~t~?^HI}^|MWp285K+-f2q+)(ejpkIG~sCVO?Djv2dZ(yHP9i-->Vu&$w%pLw9fE z_Ifwxnur18Nn|4r)yWvCI%y%61CkhDh_;IfBb*Se{zxs+DFIHqEjc{L*Q;R!KfK?$^nw5h1}X2aS7I z=r-(R8L3aFg$BjvjjH>!WP~^Ao>xp&4+R5--in2z!^~=_R#*%Y-_fe1 zWe<{yJUEHd_b=vf_Jhw|y!YXvI}N^nu|lg77K<+zX!_lje|m?TSR*S}TGUIMlt(ev z^sj`S(rf=L`L+LKKBBOT%g!{EiE+roilGiy^_s`8dc zDdgY|d27*z^U4<*@)hsi%T(-XcvAg@xAa`P{@#S0>y;~*EPtGObd&tBW};!lzg~E% zruwnN?P*KR=v80A**>ARl!Sv&GP}aAQVOL~8nvTzYR~qtSE&PKP$p$jN6KdRSOfc# zU87EvL!Bv?x=>f@M%~$))Ps7W679{tVqddu^a%TuU1tAfpR+I6CH5J+$Tm=RDrNxo`7Qrl;A! zBG30s$$ZexJYSR4pD*7WO^f)wn=@5}`$hb%&FRfcJy#*=D)O8SBYc4v_|+26uXx_Q zD#gS+-xGQ2AYm;eEUD^Y6I)6>#TZo#-Nn%RWt9WH)zxi%CAq>?@ht#k`a)#d2vLu!z61t%HsvrZ8(h zX1fz@gSKa;5v-HO0WKDb-l5WrwUGW9d(87AthfoCH__`e^!g0Fe8AU7+oLh|)_twv zu&MxA(dMa>Ec3-@SA6c2v^Hw+gWeW9qGek|FDTrR9{hKb45Ac%{PtkeE^tuSXeWPi zM`Wu-9&t^5{*Vl>hirInUz9XT){B|NE85J=RK?q08c1{b=`W2kJ}=NdNd;hm}A0WhUSDT58R>YwZmDiOW7U`+qFqwDQwA{PtgRNP`Z+eEO~M zn#XUISw>jxc5UMDcjl{`pF|edTC?xFv-Y*#cgNWBKlkh#5tpAmSE*%lIi+E3C7uPo zXSI8KHa%N&T}ge{%vMqN{q-tJ_c7-#RtCkb5FgJIAHNeskFFUVOa=Ro1k+-*#rrKL zY_uePjq1{xA$E#1RqJ#leyvH1rcc+DqsdlnFo;d&ON^;L#|YD!Lv{-9RBkki&3<)_ z&7w5D+ai7g%42k6{9V%@--c39xydB%Zn22X_90Eu^U+M@Yf8kA z>ix?dRK~f?c#7>$g$hNL1Yk#2^#JmL!N6!>B2Wta3s?c5E>>*;UItzV-Ui+SP67V` zz68DleuJs7Ky3j0fe;`PK;5Q>E_DWDE_D}NIm)FXhgz%;-GECyBr8-Z=W9^e3g zS*kx0c?3{ft8W6gm{`Fw4a!~(icJlwR1N6YV6(>wfoY&egGp%~14aT9fSJt2Gz)O? zJg^49!9=qQK=Gsj{hH$dd_{vwj^`>)vV8vbBby5Heq3IJyl zJqkj-14saH#L{O1odNiT9<$RI0Pre3mP=m@z(4e}05GXv3SfqMFsXkDcoo2s=~2Py z!K5Bc>aPM=GW~6=zaHmZ@mqlg8-O)4z!43J0A^>v>0lr~?A_G`7K#}1K;A;R38o;1Y31G>L!2l*_gcBN*u>Qt$T;u>f0i5-W zSUckr0F)U)r4gQQTnNBNj4uG7(+Gt|c)xKU07{LZ)QF`sega_Wj95A&6dU0yCa`Kk z1emaVCisg95n#fp+ms4qVJ0RxjR|XL>Ia}uHeseFtfL9au@Ny7Xf-VXmIJE+%-B=~ zfL_zTfj597!27_*01Pl;Sxw&ppx6Y4&4>y!LePwvo1xr{Nt>~x=1!p34CgV!dCZ7) zGs40=6_^V^sTngiW5(vKz$?Ih0LsiC0+_A&i!~*2)Vvd%83$z&zrbn!UCvBu`QG#3 zy+tM8i+Qb?+!nt7gE+D%T<}TFSAZDJuv-gv)CK}LI%r|Hw!Iu={Q(s3TJWTO2AB_E zfwb!Yq$VxAK?`rtB7n8<1}zex7T%!6(L)D);umjq@HQP>Tn87|L8h)R+)+0a7w~Bv zIM9IuT{!>_bQJ(rT?fHB5Ux7}K)CKS0H4+&JLurkI^;YZ4A<)cq#?Z>fUD_2xE@OM z@Gw2N*2BB>(4mJ8J$Tk5dF!j;j`}@vz#NwY<^lkB(nGKT$<$y0;KK%_9YY%cX~%%T zG(fPS2mm7nFk*mU0~j$NSsNL@a0}}$y1i>b3HzrVTg1?xMPE6ke5N;Oz z4b+=`0j#eXESXyaSYvZG0H(}{Gc(ec851y%1HhIUddx^&E;Ag+jNmdOy3L@;d|3AN z^8l8@{0)G}He(yMV85}zkt|pa3ua=81+XL*D6@0|5Y!f=F3aNpb^{BR#)4dFfkF!c z+XAH)_?HDiZNU;*wqyM*P;7Yzzzi*jX3J*)W@z~VfKn?`i4_X1P-ew0U=@$hn3Yxh z$Gv#W#;mMQ0btLH%wa{=u)?{lNXS-fZPwQSOv;K$S+RdwFCYTNYN8l%$YK52bX3e( zf3_F_i;g&59>FhDY!tuFi_blzCm5kPN`B&3c@>{hFd?rgu2U$5ieDO_NQxBy6+zKd zhEF?{Q@K&&yw3^Gvjl`8>6ULZs@f?I~hlE zS1W`)Qz><%!#-oYpH24voXl1~iQhxK&&*c8J!p2TMz%#-qP%Ub9sA!)1)2RNGE>DD z&RV0FOp~`qnpz%(Fk%sMTb$e`E=!2qmMgc(WTy3BGp9WTM5N7n(2BIV^1aMm+T#81 zwHLX|fY&y0XL<;CsE@$iTM~B*WbW3=-0haRJ0x>=(#st3$p^<}b 524 168<280 673 874 1087> +Flags: W +HStem: 0 21G<673 874> 524 168<286.644 673 874 1087> VStem: 675 199<0 524 692 1185> Fore 40 690 m 1 @@ -2356,22 +2356,9 @@ StartChar: exclamdown Encoding: 161 161 96 Width: 702 Flags: W -HStem: 0 21G<227 430> 1239 254<227 430> +HStem: 1239 254<227 430> VStem: 227 203<0 759.448 1239 1493> -Fore -430 1493 m 1 - 430 1239 l 1 - 227 1239 l 1 - 227 1493 l 1 - 430 1493 l 1 -430 655 m 1 - 430 0 l 1 - 227 0 l 1 - 227 655 l 1 - 248 1012 l 1 - 410 1012 l 1 - 430 655 l 1 -EndSplineSet +Refer: 2 33 N -1 0 0 -1 657 1493 2 EndChar StartChar: cent Encoding: 162 162 97 @@ -3165,62 +3152,19 @@ StartChar: questiondown Encoding: 191 191 124 Width: 1160 Flags: W -HStem: -29 164<411.6 636.067> 1239 254<408 610> -VStem: 57 203<249.933 412> 414 190<833.03 1092 1239 1493> -Fore -414 969 m 2 - 414 1092 l 1 - 604 1092 l 1 - 604 936 l 2 - 604 864 592.667 805.333 570 760 c 0 - 549.333 718 512.333 670.667 459 618 c 2 - 369 530 l 2 - 296.333 459.333 260 394 260 334 c 0 - 260 269.333 284.667 219 334 183 c 0 - 376.667 151 432 135 500 135 c 0 - 604.667 135 722.667 180.667 854 272 c 1 - 854 84 l 1 - 728.667 8.66667 599 -29 465 -29 c 0 - 347 -29 251.667 0 179 58 c 0 - 97.6667 121.333 57 210 57 324 c 0 - 57 418.667 111 518.333 219 623 c 2 - 307 709 l 2 - 332 734 350 753 361 766 c 0 - 381 790.667 394.333 813.333 401 834 c 0 - 409.667 858 414 903 414 969 c 2 -610 1493 m 1 - 610 1239 l 1 - 408 1239 l 1 - 408 1493 l 1 - 610 1493 l 1 -EndSplineSet +HStem: -28.9999 164<319.69 633.333> 1237 254<407 610> +VStem: 57 203<166.22 411.13> 407 203<798.003 1090 1237 1491> +Refer: 32 63 N -1 0 0 -1 963 1491 2 KernsSLIFO: 43 31 0 0 EndChar StartChar: Agrave Encoding: 192 192 125 Width: 1402 Flags: W -HStem: 0 21G<-10 190 1029 1238> 416 169<380 839> -Fore -290 1961 m 1 - 477 1961 l 1 - 673 1697 l 1 - 520 1697 l 1 - 290 1961 l 1 -839 585 m 1 - 614 1294 l 1 - 380 585 l 1 - 839 585 l 1 --10 0 m 1 - 500 1493 l 1 - 729 1493 l 1 - 1238 0 l 1 - 1029 0 l 1 - 894 416 l 1 - 325 416 l 1 - 190 0 l 1 - -10 0 l 1 -EndSplineSet +HStem: 0 21<-10 190 1029 1238> 416 169<380 839> 1697 374<491.5 670.5> +VStem: 248.5 422<1697 2071> +Refer: 65 96 N 1 0 0 1 0.5 395 2 +Refer: 34 65 N 1 0 0 1 0 0 2 EndChar StartChar: Aacute Encoding: 193 193 126 @@ -3358,28 +3302,10 @@ StartChar: Egrave Encoding: 200 200 133 Width: 1260 Flags: W -HStem: 0 176<350 1083> 729 176<350 1033> 1313 176<350 1083> -VStem: 152 198<176 729 905 1313> -Fore -368 1980 m 1 - 555 1980 l 1 - 751 1716 l 1 - 598 1716 l 1 - 368 1980 l 1 -152 0 m 1 - 152 1489 l 1 - 1083 1489 l 1 - 1083 1313 l 1 - 350 1313 l 1 - 350 905 l 1 - 1033 905 l 1 - 1033 729 l 1 - 350 729 l 1 - 350 176 l 1 - 1083 176 l 1 - 1083 0 l 1 - 152 0 l 1 -EndSplineSet +HStem: 0 176<350 1083> 729 176<350 1033> 1313 176<350 1083> 1716 374<569.5 748.5> +VStem: 152 198<176 729 905 1313> 326.5 422<1716 2090> +Refer: 65 96 N 1 0 0 1 78.5 414 2 +Refer: 38 69 N 1 0 0 1 0 0 2 EndChar StartChar: Eacute Encoding: 201 201 134 @@ -3412,28 +3338,10 @@ StartChar: Igrave Encoding: 204 204 137 Width: 990 Flags: W -HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> -VStem: 280 198<152 1337> -Fore -112 1899 m 1 - 299 1899 l 1 - 497 1635 l 1 - 342 1635 l 1 - 112 1899 l 1 -92 1489 m 1 - 670 1489 l 1 - 670 1337 l 1 - 478 1337 l 1 - 478 152 l 1 - 670 152 l 1 - 670 0 l 1 - 92 0 l 1 - 92 152 l 1 - 280 152 l 1 - 280 1337 l 1 - 92 1337 l 1 - 92 1489 l 1 -EndSplineSet +HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> 1635 374<315 494> +VStem: 72 422<1635 2009> 280 198<152 1337> +Refer: 65 96 N 1 0 0 1 -176 333 2 +Refer: 42 73 N 1 0 0 1 0 0 2 EndChar StartChar: Iacute Encoding: 205 205 138 @@ -3448,63 +3356,19 @@ StartChar: Icircumflex Encoding: 206 206 139 Width: 990 Flags: W -HStem: 0 152<126 314 512 704> 1337 152<126 314 512 704> -VStem: 314 198<152 1337> -Fore -126 1489 m 1 - 704 1489 l 1 - 704 1337 l 1 - 512 1337 l 1 - 512 152 l 1 - 704 152 l 1 - 704 0 l 1 - 126 0 l 1 - 126 152 l 1 - 314 152 l 1 - 314 1337 l 1 - 126 1337 l 1 - 126 1489 l 1 -299 2053 m 1 - 515 2053 l 1 - 745 1669 l 1 - 585 1669 l 1 - 403 1926 l 1 - 203 1669 l 1 - 43 1669 l 1 - 299 2053 l 1 -EndSplineSet +HStem: 0 152<126 314 512 704> 1337 152<126 314 512 704> 1670 384<299 745> +VStem: 43 702<1670 1670> 314 198<152 1337> +Refer: 42 73 N 1 0 0 1 34 0 2 +Refer: 225 710 N 1 0 0 1 -174 374 2 EndChar StartChar: Idieresis Encoding: 207 207 140 Width: 990 Flags: W -HStem: 0 152<122 310 508 700> 1337 152<122 310 508 700> 1677 203<76 279 489 692> -VStem: 76 203<1677 1880> 310 198<152 1337> 489 203<1677 1880> -Fore -76 1677 m 1xf0 - 76 1880 l 1 - 279 1880 l 1 - 279 1677 l 1 - 76 1677 l 1xf0 -489 1677 m 1xf4 - 489 1880 l 1 - 692 1880 l 1 - 692 1677 l 1 - 489 1677 l 1xf4 -122 1489 m 1 - 700 1489 l 1 - 700 1337 l 1 - 508 1337 l 1 - 508 152 l 1 - 700 152 l 1 - 700 0 l 1 - 122 0 l 1 - 122 152 l 1 - 310 152 l 1 - 310 1337 l 1xf8 - 122 1337 l 1 - 122 1489 l 1 -EndSplineSet +HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> 1677 203<76 279 489 692> +VStem: 76 203<1677 1880> 280 198<152 1337> 489 203<1677 1880> +Refer: 42 73 N 1 0 0 1 0 0 2 +Refer: 103 168 N 1 0 0 1 -178 373 2 EndChar StartChar: Eth Encoding: 208 208 141 @@ -3543,36 +3407,19 @@ StartChar: Ntilde Encoding: 209 209 142 Width: 1578 Flags: W -HStem: 0 21<152 337 995 1217> 1675 374<555 734> -VStem: 152 185<0 1284> 312 422<1675 2049> 1032 185<310 1489> +HStem: 0 21<152 337 995 1217> 1675 147<805.588 945.167> 1795 148<422.833 562.153> +VStem: 152 185<0 1284> 1032 185<310 1489> +Refer: 231 732 S 1 0 0 1 124.5 333 2 Refer: 47 78 N 1 0 0 1 0 0 2 -Refer: 65 96 N 1 0 0 1 64 373 2 EndChar StartChar: Ograve Encoding: 210 210 143 Width: 1577 Flags: W -HStem: 1345 170<486.673 862.285> -VStem: 66 204<367.578 1031.53> -Fore -385 1957 m 1 - 572 1957 l 1 - 768 1693 l 1 - 615 1693 l 1 - 385 1957 l 1 -906.5 1494 m 0 - 1451.58 1355.63 1448.32 631.789 1292.5 316 c 0 - 1075.34 -124.11 553.765 -78.9474 334.5 89 c 0 - 230.093 168.971 66 342.532 66 724 c 0 - 66 1078.75 170.663 1495.69 701 1515 c 0 - 772.333 1517.67 840.833 1510.67 906.5 1494 c 0 -913 182.5 m 0 - 1271.58 352.711 1198.7 964.267 1077.5 1157 c 0 - 992.412 1292.3 869.686 1340.99 715 1345 c 0 - 539.364 1346.67 256.189 1253.57 270 727 c 0 - 276.572 431.27 376.208 133.931 742 143 c 0 - 803.333 144.333 860.333 157.5 913 182.5 c 0 -EndSplineSet +HStem: 1345 170<486.673 862.285> 1693 374<587 766> +VStem: 66 204<367.578 1031.53> 344 422<1693 2067> +Refer: 65 96 N 1 0 0 1 96 391 2 +Refer: 48 79 N 1 0 0 1 0 0 2 EndChar StartChar: Oacute Encoding: 211 211 144 @@ -3605,30 +3452,10 @@ StartChar: Odieresis Encoding: 214 214 147 Width: 1577 Flags: W -HStem: -29 172<251.12 967.16> 1345 170<483.6 1161.79> 1682 203<407 610 820 1023> -VStem: 66 204<359.084 1409.94> 407 203<1682 1885> 820 203<1682 1885> 1175 206<112.364 1185.08> -Fore -820 1682 m 1 - 820 1885 l 1 - 1023 1885 l 1 - 1023 1682 l 1 - 820 1682 l 1 -407 1682 m 1 - 407 1885 l 1 - 610 1885 l 1 - 610 1682 l 1 - 407 1682 l 1 -66 724 m 0 - 66 1411.11 447.044 1515.04 701 1515 c 0 - 1122.31 1514.94 1381 1228.66 1381 723 c 0 - 1381 129.637 1005.72 -29 722 -29 c 0 - 197.2 -29 66 411.013 66 724 c 0 -742 143 m 0 - 915.2 143 1175 258.126 1175 744 c 0 - 1175 1083.29 1058.68 1345 715 1345 c 0 - 537 1345 270 1252.34 270 727 c 0 - 270 443.987 364.4 143 742 143 c 0 -EndSplineSet +HStem: 1345 170<486.673 862.285> 1682 203<407 610 820 1023> +VStem: 66 204<367.578 1031.53> 407 203<1682 1885> 820 203<1682 1885> +Refer: 103 168 S 1 0 0 1 153 378 2 +Refer: 48 79 N 1 0 0 1 0 0 2 EndChar StartChar: multiply Encoding: 215 215 148 @@ -3691,28 +3518,10 @@ StartChar: Ugrave Encoding: 217 217 150 Width: 1513 Flags: W -HStem: -29 164<523.867 886.133> -VStem: 166 198<1119.99 1489> 166 191<418.199 1379.68> 1042 201<417.44 1489> -Fore -166 561 m 2xb0 - 166 1489 l 1 - 364 1489 l 1xd0 - 357 595 l 2 - 363 434.333 380.333 323.333 409 262 c 1 - 467 177.333 565.667 135 705 135 c 0 - 844.333 135 943 177.333 1001 262 c 1 - 1028.33 336.667 1041.54 444.001 1042 584 c 2 - 1045 1489 l 1 - 1243 1489 l 1 - 1243 560 l 2 - 1265 167.333 1085.67 -29 705 -29 c 0 - 323.667 -29 144 167.667 166 561 c 2xb0 -486 1919 m 1 - 673 1919 l 1 - 869 1655 l 1 - 716 1655 l 1 - 486 1919 l 1 -EndSplineSet +HStem: -29 164<523.867 886.133> 1655 374<688 867> +VStem: 166 191<418.199 1379.68> 166 198<1119.99 1489> 445 422<1655 2029> 1042 201<417.44 1489> +Refer: 65 96 N 1 0 0 1 197 353 2 +Refer: 54 85 N 1 0 0 1 0 0 2 EndChar StartChar: Uacute Encoding: 218 218 151 @@ -3814,121 +3623,28 @@ StartChar: agrave Encoding: 224 224 157 Width: 1226 Flags: W -HStem: -27 154<364.467 586.333> 565 144<463.341 767> 993 156<342.4 588.733> -VStem: 57 171<253.333 466.533> 767 171<0 172 416 565 709 815.667> -Fore -361 1638 m 1 - 558 1638 l 1 - 840 1264 l 1 - 687 1264 l 1 - 361 1638 l 1 -767 565 m 1 - 596 565 l 2 - 484.667 565 403.667 555.333 353 536 c 0 - 269.667 502.667 228 437.333 228 340 c 0 - 228 273.333 248.333 221 289 183 c 0 - 330.333 145.667 384.667 127 452 127 c 0 - 555.333 127 635.667 168.667 693 252 c 0 - 742.333 325.333 767 416 767 524 c 2 - 767 565 l 1 -938 641 m 2 - 938 0 l 1 - 767 0 l 1 - 767 172 l 1 - 690.333 39.3333 570 -27 406 -27 c 0 - 297.333 -27 212 5 150 69 c 0 - 88 133 57 219.333 57 328 c 0 - 57 582 213.333 709 526 709 c 2 - 767 709 l 1 - 767 727 l 2 - 767 815.667 739 883 683 929 c 0 - 632.333 971.667 561.333 993 470 993 c 0 - 350.667 993 238.333 962.333 133 901 c 1 - 133 1071 l 1 - 257.667 1123 376 1149 488 1149 c 0 - 788 1149 938 979.667 938 641 c 2 -EndSplineSet +HStem: -27 154<403.467 585.467> 563 157<445 647.414> 993 156<382.267 627.733> 1264 374<658.5 837.5> +VStem: 57 171<249.333 463.4> 415.5 422<1264 1638> 759 187<0 132.535 414 563> +Refer: 65 96 N 1 0 0 1 167.5 -38 2 +Refer: 66 97 N 1 0 0 1 0 0 2 EndChar StartChar: aacute Encoding: 225 225 158 Width: 1226 Flags: W -HStem: -27 154<364.467 586.333> 565 144<463.341 767> 993 156<342.4 588.733> -VStem: 57 171<253.333 466.533> 767 171<0 172 416 565 709 815.667> -Fore -361 1262 m 1 - 641 1638 l 1 - 840 1638 l 1 - 514 1262 l 1 - 361 1262 l 1 -767 565 m 1 - 596 565 l 2 - 484.667 565 403.667 555.333 353 536 c 0 - 269.667 502.667 228 437.333 228 340 c 0 - 228 273.333 248.333 221 289 183 c 0 - 330.333 145.667 384.667 127 452 127 c 0 - 555.333 127 635.667 168.667 693 252 c 0 - 742.333 325.333 767 416 767 524 c 2 - 767 565 l 1 -938 641 m 2 - 938 0 l 1 - 767 0 l 1 - 767 172 l 1 - 690.333 39.3333 570 -27 406 -27 c 0 - 297.333 -27 212 5 150 69 c 0 - 88 133 57 219.333 57 328 c 0 - 57 582 213.333 709 526 709 c 2 - 767 709 l 1 - 767 727 l 2 - 767 815.667 739 883 683 929 c 0 - 632.333 971.667 561.333 993 470 993 c 0 - 350.667 993 238.333 962.333 133 901 c 1 - 133 1071 l 1 - 257.667 1123 376 1149 488 1149 c 0 - 788 1149 938 979.667 938 641 c 2 -EndSplineSet +HStem: -27 154<403.467 585.467> 563 157<445 647.414> 993 156<382.267 627.733> 1262.17 375<346.667 583.667> +VStem: 57 171<249.333 463.4> 346.667 459<1262.17 1637.17> 759 187<0 132.535 414 563> +Refer: 114 180 N 1 0 0 1 -102.333 -39.8333 2 +Refer: 66 97 N 1 0 0 1 0 0 2 EndChar StartChar: acircumflex Encoding: 226 226 159 Width: 1226 Flags: W -HStem: -27 154<364.467 586.333> 565 144<463.341 767> 993 156<342.4 588.733> -VStem: 57 171<253.333 466.533> 767 171<0 172 416 565 709 815.667> -Fore -176 1268 m 1 - 421 1644 l 1 - 569 1644 l 1 - 814 1268 l 1 - 675 1268 l 1 - 495 1513 l 1 - 315 1268 l 1 - 176 1268 l 1 -767 565 m 1 - 596 565 l 2 - 484.667 565 403.667 555.333 353 536 c 0 - 269.667 502.667 228 437.333 228 340 c 0 - 228 273.333 248.333 221 289 183 c 0 - 330.333 145.667 384.667 127 452 127 c 0 - 555.333 127 635.667 168.667 693 252 c 0 - 742.333 325.333 767 416 767 524 c 2 - 767 565 l 1 -938 641 m 2 - 938 0 l 1 - 767 0 l 1 - 767 172 l 1 - 690.333 39.3333 570 -27 406 -27 c 0 - 297.333 -27 212 5 150 69 c 0 - 88 133 57 219.333 57 328 c 0 - 57 582 213.333 709 526 709 c 2 - 767 709 l 1 - 767 727 l 2 - 767 815.667 739 883 683 929 c 0 - 632.333 971.667 561.333 993 470 993 c 0 - 350.667 993 238.333 962.333 133 901 c 1 - 133 1071 l 1 - 257.667 1123 376 1149 488 1149 c 0 - 788 1149 938 979.667 938 641 c 2 -EndSplineSet +HStem: -27 154<403.467 585.467> 563 157<445 647.414> 993 156<382.267 627.733> 1268 384<465 911> +VStem: 57 171<249.333 463.4> 209 702<1268 1268> 759 187<0 132.535 414 563> +Refer: 66 97 N 1 0 0 1 0 0 2 +Refer: 225 710 S 1 0 0 1 -8 -28 2 EndChar StartChar: atilde Encoding: 227 227 160 @@ -3943,45 +3659,10 @@ StartChar: adieresis Encoding: 228 228 161 Width: 1226 Flags: W -HStem: -27 154<364.467 586.333> 565 144<423.543 767> 993 156<342.4 588.733> 1351 202<215 418 606 809> -VStem: 57 171<253.333 466.533> 215 203<1351 1553> 606 203<1351 1553> 767 171<0 172 416 565> -Fore -938 641 m 2xf9 - 938 0 l 1 - 767 0 l 1 - 767 172 l 1 - 690.333 39.3333 570 -27 406 -27 c 0 - 297.333 -27 212 5 150 69 c 0 - 88 133 57 219.333 57 328 c 0 - 57 582 213.333 709 526 709 c 2 - 767 709 l 1 - 767 727 l 2 - 767 815.667 739 883 683 929 c 0 - 632.333 971.667 561.333 993 470 993 c 0 - 350.667 993 238.333 962.333 133 901 c 1 - 133 1071 l 1 - 257.667 1123 376 1149 488 1149 c 0 - 788 1149 938 979.667 938 641 c 2xf9 -767 565 m 1 - 596 565 l 2 - 484.667 565 403.667 555.333 353 536 c 0 - 269.667 502.667 228 437.333 228 340 c 0 - 228 273.333 248.333 221 289 183 c 0 - 330.333 145.667 384.667 127 452 127 c 0 - 555.333 127 635.667 168.667 693 252 c 0 - 742.333 325.333 767 416 767 524 c 2 - 767 565 l 1 -215 1351 m 1xf4 - 215 1553 l 1 - 418 1553 l 1 - 418 1351 l 1 - 215 1351 l 1xf4 -606 1351 m 1xf2 - 606 1553 l 1 - 809 1553 l 1 - 809 1351 l 1 - 606 1351 l 1xf2 -EndSplineSet +HStem: -27 154<403.467 585.467> 563 157<445 647.414> 993 156<382.267 627.733> 1351 203<201 404 614 817> +VStem: 57 171<249.333 463.4> 201 203<1351 1554> 614 203<1351 1554> 759 187<0 132.535 414 563> +Refer: 103 168 S 1 0 0 1 -53 47 2 +Refer: 66 97 N 1 0 0 1 0 0 2 EndChar StartChar: aring Encoding: 229 229 162 @@ -3990,7 +3671,7 @@ Flags: W HStem: -27 154<403.467 585.467> 563 157<445 647.414> 993 156<382.267 627.733> 1147 123<434.855 551.442> 1573 123<434.855 551.442> VStem: 57 171<249.333 463.4> 221 122<1361.86 1481.35> 647 122<1365.55 1477.68> 759 187<0 132.535 414 563> Refer: 66 97 N 1 0 0 1 0 0 2 -Refer: 229 730 N 1 0 0 1 -33 -5 2 +Refer: 229 730 S 1 0 0 1 -33 -5 2 EndChar StartChar: ae Encoding: 230 230 163 @@ -4076,227 +3757,99 @@ StartChar: egrave Encoding: 232 232 165 Width: 1216 Flags: W -HStem: -41 157<380.5 780.467> 507 144<246 866> 985 157<448.133 698.6> -VStem: 866 174<598 775.933> -Fore -204 1642 m 1 - 401 1642 l 1 - 683 1268 l 1 - 530 1268 l 1 - 204 1642 l 1 -1040 598 m 2 - 1040 507 l 1 - 240 507 l 1 - 256 246.333 382 116 618 116 c 0 - 749 116 876 151 999 221 c 1 - 999 46 l 1 - 871 -12 740.667 -41 608 -41 c 0 - 433 -41 297 13 200 121 c 0 - 106 224.333 59 364 59 540 c 0 - 59 715.333 100.667 856.667 184 964 c 0 - 276 1082.67 407.333 1142 578 1142 c 0 - 730.667 1142 848 1088 930 980 c 0 - 1003.33 882.667 1040 755.333 1040 598 c 2 -246 651 m 1 - 866 652 l 1 - 864.667 747.333 841 825 795 885 c 0 - 743 951.667 671 985 579 985 c 0 - 478.333 985 399 954.333 341 893 c 0 - 286.333 835.667 254.667 755 246 651 c 1 -EndSplineSet +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1268 374<502 681> +VStem: 259 422<1268 1642> 866 174<630 812> +Refer: 65 96 N 1 0 0 1 11 -34 2 +Refer: 70 101 N 1 0 0 1 0 0 2 EndChar StartChar: eacute Encoding: 233 233 166 Width: 1216 Flags: W -HStem: -41 157<380.5 780.467> 507 144<246 866> 985 157<448.133 698.6> -VStem: 866 174<598 775.933> -Fore -469 1262 m 1 - 749 1638 l 1 - 948 1638 l 1 - 622 1262 l 1 - 469 1262 l 1 -1040 598 m 2 - 1040 507 l 1 - 240 507 l 1 - 256 246.333 382 116 618 116 c 0 - 749 116 876 151 999 221 c 1 - 999 46 l 1 - 871 -12 740.667 -41 608 -41 c 0 - 433 -41 297 13 200 121 c 0 - 106 224.333 59 364 59 540 c 0 - 59 715.333 100.667 856.667 184 964 c 0 - 276 1082.67 407.333 1142 578 1142 c 0 - 730.667 1142 848 1088 930 980 c 0 - 1003.33 882.667 1040 755.333 1040 598 c 2 -246 651 m 1 - 866 652 l 1 - 864.667 747.333 841 825 795 885 c 0 - 743 951.667 671 985 579 985 c 0 - 478.333 985 399 954.333 341 893 c 0 - 286.333 835.667 254.667 755 246 651 c 1 -EndSplineSet +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1262 375<454 691> +VStem: 454 459<1262 1637> 866 174<630 812> +Refer: 114 180 N 1 0 0 1 5 -40 2 +Refer: 70 101 N 1 0 0 1 0 0 2 EndChar StartChar: ecircumflex Encoding: 234 234 167 Width: 1216 Flags: W -HStem: -41 157<380.5 780.467> 507 144<246 866> 985 157<448.133 698.6> -VStem: 866 174<598 775.933> -Fore -243 1260 m 1 - 488 1636 l 1 - 636 1636 l 1 - 881 1260 l 1 - 742 1260 l 1 - 562 1505 l 1 - 382 1260 l 1 - 243 1260 l 1 -1040 598 m 2 - 1040 507 l 1 - 240 507 l 1 - 256 246.333 382 116 618 116 c 0 - 749 116 876 151 999 221 c 1 - 999 46 l 1 - 871 -12 740.667 -41 608 -41 c 0 - 433 -41 297 13 200 121 c 0 - 106 224.333 59 364 59 540 c 0 - 59 715.333 100.667 856.667 184 964 c 0 - 276 1082.67 407.333 1142 578 1142 c 0 - 730.667 1142 848 1088 930 980 c 0 - 1003.33 882.667 1040 755.333 1040 598 c 2 -246 651 m 1 - 866 652 l 1 - 864.667 747.333 841 825 795 885 c 0 - 743 951.667 671 985 579 985 c 0 - 478.333 985 399 954.333 341 893 c 0 - 286.333 835.667 254.667 755 246 651 c 1 -EndSplineSet +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1260 384<468 914> +VStem: 212 702<1260 1260> 866 174<630 812> +Refer: 225 710 S 1 0 0 1 -5 -36 2 +Refer: 70 101 N 1 0 0 1 0 0 2 EndChar StartChar: edieresis Encoding: 235 235 168 Width: 1216 Flags: W -HStem: -41 157<380.5 780.467> 507 144<246 866> 985 157<448.133 698.6> 1360 202<250 453 641 844> -VStem: 250 203<1360 1562> 641 203<1360 1562> 866 174<598 775.933> -Fore -641 1360 m 1 - 641 1562 l 1 - 844 1562 l 1 - 844 1360 l 1 - 641 1360 l 1 -250 1360 m 1 - 250 1562 l 1 - 453 1562 l 1 - 453 1360 l 1 - 250 1360 l 1 -1040 598 m 2 - 1040 507 l 1 - 240 507 l 1 - 256 246.333 382 116 618 116 c 0 - 749 116 876 151 999 221 c 1 - 999 46 l 1 - 871 -12 740.667 -41 608 -41 c 0 - 433 -41 297 13 200 121 c 0 - 106 224.333 59 364 59 540 c 0 - 59 715.333 100.667 856.667 184 964 c 0 - 276 1082.67 407.333 1142 578 1142 c 0 - 730.667 1142 848 1088 930 980 c 0 - 1003.33 882.667 1040 755.333 1040 598 c 2 -246 651 m 1 - 866 652 l 1 - 864.667 747.333 841 825 795 885 c 0 - 743 951.667 671 985 579 985 c 0 - 478.333 985 399 954.333 341 893 c 0 - 286.333 835.667 254.667 755 246 651 c 1 -EndSplineSet +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1360 203<247 450 660 863> +VStem: 247 203<1360 1563> 660 203<1360 1563> 866 174<630 812> +Refer: 103 168 S 1 0 0 1 -7 56 2 +Refer: 70 101 N 1 0 0 1 0 0 2 EndChar StartChar: igrave Encoding: 236 236 169 Width: 618 Flags: W -HStem: 0 21G<156 340> 1100 20G<156 340> -VStem: 156 184<0 1120> +HStem: 0 21G<127 311> 1100 20G<127 311> 1268 374<110.5 289.5> +VStem: -132.5 422<1268 1642> 127 184<0 1120> Fore --158 1642 m 1 - 39 1642 l 1 - 321 1268 l 1 - 168 1268 l 1 - -158 1642 l 1 -156 0 m 1 - 156 1120 l 1 - 340 1120 l 1 - 340 0 l 1 - 156 0 l 1 +127 0 m 1xe8 + 127 1120 l 1 + 311 1120 l 1 + 311 0 l 1 + 127 0 l 1xe8 EndSplineSet +Refer: 65 96 N 1 0 0 1 -380.5 -34 2 EndChar StartChar: iacute Encoding: 237 237 170 Width: 618 Flags: W -HStem: 0 21G<121 305> 1100 20G<121 305> -VStem: 121 184<0 1120> -Fore -132 1256 m 1 - 412 1632 l 1 - 611 1632 l 1 - 285 1256 l 1 - 132 1256 l 1 -121 0 m 1 - 121 1120 l 1 - 305 1120 l 1 - 305 0 l 1 - 121 0 l 1 +HStem: 0 21G<127 311> 1100 20G<127 311> 1256 375<123 360> +VStem: 123 459<1256 1631> 127 184<0 1120> +Fore +127 0 m 1xe8 + 127 1120 l 1 + 311 1120 l 1 + 311 0 l 1 + 127 0 l 1xe8 EndSplineSet +Refer: 114 180 N 1 0 0 1 -326 -46 2 KernsSLIFO: 240 20 0 0 EndChar StartChar: icircumflex Encoding: 238 238 171 Width: 618 Flags: W -HStem: 1105 20G<183 367> -VStem: 183 184<5 1125> -Fore --53 1297 m 1 - 192 1673 l 1 - 340 1673 l 1 - 585 1297 l 1 - 446 1297 l 1 - 266 1542 l 1 - 86 1297 l 1 - -53 1297 l 1 -183 5 m 1 +HStem: 1105 20G<183 367> 1297 384<171 617> +VStem: -85 702<1297 1297> 183 184<5 1125> +Fore +183 5 m 1xd0 183 1125 l 1 367 1125 l 1 367 5 l 1 - 183 5 l 1 + 183 5 l 1xd0 EndSplineSet +Refer: 225 710 S 1 0 0 1 -302 1 2 KernsSLIFO: 77 10 0 0 EndChar StartChar: idieresis Encoding: 239 239 172 Width: 618 Flags: W -HStem: 0 21G<165 349> 1100 20G<165 349> 1304 202<-39 164 316 519> -VStem: -39 203<1304 1506> 165 184<0 1120> 316 203<1304 1506> +HStem: 0 21G<165 349> 1100 20G<165 349> 1304 203<-52 151 361 564> +VStem: -52 203<1304 1507> 165 184<0 1120> 361 203<1304 1507> Fore -165 0 m 1xf8 +165 0 m 1 165 1120 l 1 349 1120 l 1 349 0 l 1 - 165 0 l 1xf8 --39 1304 m 1 - -39 1506 l 1 - 164 1506 l 1 - 164 1304 l 1 - -39 1304 l 1 -316 1304 m 1xf4 - 316 1506 l 1 - 519 1506 l 1 - 519 1304 l 1 - 316 1304 l 1xf4 + 165 0 l 1 EndSplineSet +Refer: 103 168 N 1 0 0 1 -306 0 2 KernsSLIFO: 267 14 0 0 266 14 0 0 77 10 0 0 71 14 0 0 EndChar StartChar: eth @@ -4350,100 +3903,28 @@ StartChar: ograve Encoding: 242 242 175 Width: 1264 Flags: W -HStem: -29 156<424.533 714> 991 156<427.133 714> -VStem: 57 194<403.867 713.267> 890 195<405.6 712.4> -Fore -449 1638 m 1 - 646 1638 l 1 - 928 1264 l 1 - 775 1264 l 1 - 449 1638 l 1 -571 991 m 0 - 460.333 991 377 944.667 321 852 c 0 - 274.333 775.333 251 677.667 251 559 c 0 - 251 439.667 274 342 320 266 c 0 - 374.667 173.333 458.333 127 571 127 c 0 - 681 127 764 173.667 820 267 c 0 - 866.667 343.667 890 441 890 559 c 0 - 890 677 866.667 774.333 820 851 c 0 - 764 944.333 681 991 571 991 c 0 -571 1147 m 0 - 741 1147 871 1090 961 976 c 0 - 1043.67 873.333 1085 734.333 1085 559 c 0 - 1085 383.667 1043.67 244.667 961 142 c 0 - 871 28 741 -29 571 -29 c 0 - 401 -29 271 28 181 142 c 0 - 98.3333 244.667 57 383.667 57 559 c 0 - 57 734.333 98.3333 873.333 181 976 c 0 - 271 1090 401 1147 571 1147 c 0 -EndSplineSet +HStem: -29 156<424.533 686.267> 991 156<427.133 688> 1264 374<473.167 652.167> +VStem: 57 194<403.867 713.267> 230.167 422<1264 1638> 860 195<404.6 711.4> +Refer: 80 111 N 1 0 0 1 0 0 2 +Refer: 65 96 S 1 0 0 1 -17.833 -38 2 EndChar StartChar: oacute Encoding: 243 243 176 Width: 1264 Flags: W -HStem: -29 156<424.533 714> 991 156<427.133 714> -VStem: 57 194<403.867 713.267> 890 195<405.6 712.4> -Fore -449 1262 m 1 - 729 1638 l 1 - 928 1638 l 1 - 602 1262 l 1 - 449 1262 l 1 -571 991 m 0 - 460.333 991 377 944.667 321 852 c 0 - 274.333 775.333 251 677.667 251 559 c 0 - 251 439.667 274 342 320 266 c 0 - 374.667 173.333 458.333 127 571 127 c 0 - 681 127 764 173.667 820 267 c 0 - 866.667 343.667 890 441 890 559 c 0 - 890 677 866.667 774.333 820 851 c 0 - 764 944.333 681 991 571 991 c 0 -571 1147 m 0 - 741 1147 871 1090 961 976 c 0 - 1043.67 873.333 1085 734.333 1085 559 c 0 - 1085 383.667 1043.67 244.667 961 142 c 0 - 871 28 741 -29 571 -29 c 0 - 401 -29 271 28 181 142 c 0 - 98.3333 244.667 57 383.667 57 559 c 0 - 57 734.333 98.3333 873.333 181 976 c 0 - 271 1090 401 1147 571 1147 c 0 -EndSplineSet +HStem: -29 156<424.533 686.267> 991 156<427.133 688> 1262 375<434 671> +VStem: 57 194<403.867 713.267> 434 459<1262 1637> 860 195<404.6 711.4> +Refer: 80 111 N 1 0 0 1 0 0 2 +Refer: 114 180 S 1 0 0 1 -15 -40 2 EndChar StartChar: ocircumflex Encoding: 244 244 177 Width: 1264 Flags: W -HStem: -29 156<424.533 714> 991 156<427.133 714> -VStem: 57 194<403.867 713.267> 890 195<405.6 712.4> -Fore -284 1258 m 1 - 529 1634 l 1 - 677 1634 l 1 - 922 1258 l 1 - 783 1258 l 1 - 603 1503 l 1 - 423 1258 l 1 - 284 1258 l 1 -571 991 m 0 - 460.333 991 377 944.667 321 852 c 0 - 274.333 775.333 251 677.667 251 559 c 0 - 251 439.667 274 342 320 266 c 0 - 374.667 173.333 458.333 127 571 127 c 0 - 681 127 764 173.667 820 267 c 0 - 866.667 343.667 890 441 890 559 c 0 - 890 677 866.667 774.333 820 851 c 0 - 764 944.333 681 991 571 991 c 0 -571 1147 m 0 - 741 1147 871 1090 961 976 c 0 - 1043.67 873.333 1085 734.333 1085 559 c 0 - 1085 383.667 1043.67 244.667 961 142 c 0 - 871 28 741 -29 571 -29 c 0 - 401 -29 271 28 181 142 c 0 - 98.3333 244.667 57 383.667 57 559 c 0 - 57 734.333 98.3333 873.333 181 976 c 0 - 271 1090 401 1147 571 1147 c 0 -EndSplineSet +HStem: -29 156<424.533 686.267> 991 156<427.133 688> 1258 384<462 908> +VStem: 57 194<403.867 713.267> 206 702<1258 1258> 860 195<404.6 711.4> +Refer: 225 710 S 1 0 0 1 -11 -38 2 +Refer: 80 111 N 1 0 0 1 0 0 2 EndChar StartChar: otilde Encoding: 245 245 178 @@ -4458,38 +3939,10 @@ StartChar: odieresis Encoding: 246 246 179 Width: 1264 Flags: W -HStem: -29 156<424.533 714> 991 156<427.133 714> 1355 201<289 492 680 883> -VStem: 57 194<403.867 713.267> 289 203<1355 1556> 680 203<1355 1556> 890 195<405.6 712.4> -Fore -680 1355 m 1 - 680 1556 l 1 - 883 1556 l 1 - 883 1355 l 1 - 680 1355 l 1 -289 1355 m 1 - 289 1556 l 1 - 492 1556 l 1 - 492 1355 l 1 - 289 1355 l 1 -571 991 m 0 - 460.333 991 377 944.667 321 852 c 0 - 274.333 775.333 251 677.667 251 559 c 0 - 251 439.667 274 342 320 266 c 0 - 374.667 173.333 458.333 127 571 127 c 0 - 681 127 764 173.667 820 267 c 0 - 866.667 343.667 890 441 890 559 c 0 - 890 677 866.667 774.333 820 851 c 0 - 764 944.333 681 991 571 991 c 0 -571 1147 m 0 - 741 1147 871 1090 961 976 c 0 - 1043.67 873.333 1085 734.333 1085 559 c 0 - 1085 383.667 1043.67 244.667 961 142 c 0 - 871 28 741 -29 571 -29 c 0 - 401 -29 271 28 181 142 c 0 - 98.3333 244.667 57 383.667 57 559 c 0 - 57 734.333 98.3333 873.333 181 976 c 0 - 271 1090 401 1147 571 1147 c 0 -EndSplineSet +HStem: -29 156<424.533 686.267> 991 156<427.133 688> 1355 203<248 451 661 864> +VStem: 57 194<403.867 713.267> 248 203<1355 1558> 661 203<1355 1558> 860 195<404.6 711.4> +Refer: 80 111 N 1 0 0 1 0 0 2 +Refer: 103 168 S 1 0 0 1 -6 51 2 EndChar StartChar: divide Encoding: 247 247 180 @@ -4556,149 +4009,46 @@ StartChar: ugrave Encoding: 249 249 182 Width: 1311 Flags: W -HStem: -29 160<344.067 693.333> 1100 20G<127 311 881 1065> -VStem: 127 184<173.4 1120> 881 184<0 172 347.2 1120> -Fore -467 1638 m 1 - 664 1638 l 1 - 946 1264 l 1 - 793 1264 l 1 - 467 1638 l 1 -127 442 m 2 - 127 1120 l 1 - 311 1120 l 1 - 311 449 l 2 - 311 237 393.667 131 559 131 c 0 - 662.333 131 742.667 164.667 800 232 c 0 - 854 294.667 881 379 881 485 c 2 - 881 1120 l 1 - 1065 1120 l 1 - 1065 0 l 1 - 881 0 l 1 - 881 172 l 1 - 793 38 672.667 -29 520 -29 c 0 - 258 -29 127 128 127 442 c 2 -EndSplineSet +HStem: -29 160<434.533 633.867> 1100 20<817 1001> 1264 374<497 676> +VStem: 127 184<332 1117> 254 422<1264 1638> 817 184<0 172 347.2 1120> +Refer: 65 96 S 1 0 0 1 6 -38 2 +Refer: 86 117 N 1 0 0 1 0 0 2 EndChar StartChar: uacute Encoding: 250 250 183 Width: 1311 Flags: W -HStem: -29 160<344.067 693.333> 1100 20G<127 311 881 1065> -VStem: 127 184<173.4 1120> 881 184<0 172 347.2 1120> -Fore -747 1638 m 1 - 946 1638 l 1 - 620 1262 l 1 - 467 1262 l 1 - 747 1638 l 1 -127 442 m 2 - 127 1120 l 1 - 311 1120 l 1 - 311 449 l 2 - 311 237 393.667 131 559 131 c 0 - 662.333 131 742.667 164.667 800 232 c 0 - 854 294.667 881 379 881 485 c 2 - 881 1120 l 1 - 1065 1120 l 1 - 1065 0 l 1 - 881 0 l 1 - 881 172 l 1 - 793 38 672.667 -29 520 -29 c 0 - 258 -29 127 128 127 442 c 2 -EndSplineSet +HStem: -29 160<434.533 633.867> 1100 20<817 1001> 1262.17 375<451.667 688.667> +VStem: 127 184<332 1117> 451.667 459<1262.17 1637.17> 817 184<0 172 347.2 1120> +Refer: 114 180 N 1 0 0 1 2.66669 -39.8333 2 +Refer: 86 117 N 1 0 0 1 0 0 2 EndChar StartChar: ucircumflex Encoding: 251 251 184 Width: 1311 Flags: W -HStem: -29 160<344.067 693.333> 1100 20G<127 311 881 1065> -VStem: 127 184<173.4 1120> 881 184<0 172 347.2 1120> -Fore -633 1638 m 1 - 781 1638 l 1 - 1026 1262 l 1 - 887 1262 l 1 - 707 1507 l 1 - 527 1262 l 1 - 388 1262 l 1 - 633 1638 l 1 -127 442 m 2 - 127 1120 l 1 - 311 1120 l 1 - 311 449 l 2 - 311 237 393.667 131 559 131 c 0 - 662.333 131 742.667 164.667 800 232 c 0 - 854 294.667 881 379 881 485 c 2 - 881 1120 l 1 - 1065 1120 l 1 - 1065 0 l 1 - 881 0 l 1 - 881 172 l 1 - 793 38 672.667 -29 520 -29 c 0 - 258 -29 127 128 127 442 c 2 -EndSplineSet +HStem: -29 160<434.533 633.867> 1100 20<817 1001> 1262 384<470 916> +VStem: 127 184<332 1117> 214 702<1262 1262> 817 184<0 172 347.2 1120> +Refer: 225 710 S 1 0 0 1 -3 -34 2 +Refer: 86 117 N 1 0 0 1 0 0 2 EndChar StartChar: udieresis Encoding: 252 252 185 Width: 1311 Flags: W -HStem: -29 160<344.067 693.333> 1100 20G<127 311 881 1065> 1350 202<410 613 801 1004> -VStem: 127 184<173.4 1120> 410 203<1350 1552> 801 203<1350 1552> 881 184<0 172 347.2 1120> -Fore -127 442 m 2xfa - 127 1120 l 1 - 311 1120 l 1 - 311 449 l 2 - 311 237 393.667 131 559 131 c 0 - 662.333 131 742.469 164.836 800 232 c 0 - 853.815 294.826 881 379 881 485 c 2 - 881 1120 l 1 - 1065 1120 l 1 - 1065 0 l 1 - 881 0 l 1 - 881 172 l 1 - 793 38 672.667 -29 520 -29 c 0 - 258 -29 127 128 127 442 c 2xfa -410 1552 m 1 - 613 1552 l 1 - 613 1350 l 1 - 410 1350 l 1 - 410 1552 l 1 -801 1552 m 1xfc - 801 1350 l 1 - 1004 1350 l 1 - 1004 1552 l 1 - 801 1552 l 1xfc -EndSplineSet +HStem: -29 160<434.533 633.867> 1100 20<817 1001> 1350 203<258.5 461.5 671.5 874.5> +VStem: 127 184<332 1117> 258.5 203<1350 1553> 671.5 203<1350 1553> 817 184<0 172 347.2 1120> +Refer: 103 168 S 1 0 0 1 4.5 46 2 +Refer: 86 117 N 1 0 0 1 0 0 2 EndChar StartChar: yacute Encoding: 253 253 186 Width: 1179 Flags: W -HStem: -426 154<107 293.867> 1100 20G<6 201 901 1096> -Fore -734 1638 m 1 - 933 1638 l 1 - 607 1262 l 1 - 454 1262 l 1 - 734 1638 l 1 -604 -104 m 2 - 560 -214.667 519.667 -291 483 -333 c 0 - 427.667 -395 351.333 -426 254 -426 c 2 - 107 -426 l 1 - 107 -272 l 1 - 215 -272 l 2 - 275.667 -272 322.333 -251.667 355 -211 c 0 - 373 -189 396.667 -140.667 426 -66 c 2 - 459 18 l 1 - 6 1120 l 1 - 201 1120 l 1 - 551 244 l 1 - 901 1120 l 1 - 1096 1120 l 1 - 604 -104 l 2 -EndSplineSet +HStem: -429 154<107 293.867> 1262 375<432.5 669.5> +VStem: 6 1007<1117 1117> 432.5 459<1262 1637> +Refer: 114 180 N 1 0 0 1 -16.5 -40 2 +Refer: 90 121 N 1 0 0 1 0 0 2 EndChar StartChar: thorn Encoding: 254 254 187 @@ -4734,35 +4084,10 @@ StartChar: ydieresis Encoding: 255 255 188 Width: 1179 Flags: W -HStem: -426 154<107 293.867> 1100 20G<6 201 901 1096> 1350 202<397 600 788 991> -VStem: 397 203<1350 1552> 788 203<1350 1552> -Fore -788 1552 m 1 - 991 1552 l 1 - 991 1350 l 1 - 788 1350 l 1 - 788 1552 l 1 -397 1552 m 1 - 600 1552 l 1 - 600 1350 l 1 - 397 1350 l 1 - 397 1552 l 1 -604 -104 m 2 - 560 -214.667 519.667 -291 483 -333 c 0 - 427.667 -395 351.333 -426 254 -426 c 2 - 107 -426 l 1 - 107 -272 l 1 - 215 -272 l 2 - 275.667 -272 322.333 -251.667 355 -211 c 0 - 373 -189 396.667 -140.667 426 -66 c 2 - 459 18 l 1 - 6 1120 l 1 - 201 1120 l 1 - 551 244 l 1 - 901 1120 l 1 - 1096 1120 l 1 - 604 -104 l 2 -EndSplineSet +HStem: -429 154<107 293.867> 1350 203<203 406 616 819> +VStem: 6 1007<1117 1117> 203 203<1350 1553> 616 203<1350 1553> +Refer: 103 168 S 1 0 0 1 -51 46 2 +Refer: 90 121 N 1 0 0 1 0 0 2 EndChar StartChar: Aogonek Encoding: 259 260 189 @@ -4841,54 +4166,19 @@ StartChar: cacute Encoding: 262 263 192 Width: 1080 Flags: W -HStem: 0 157<303.136 764.267> 1021 156<306.017 766.933> -VStem: 59 194<245.405 932.739> -Fore -766 1638 m 1 - 965 1638 l 1 - 639 1262 l 1 - 486 1262 l 1 - 766 1638 l 1 -59 589 m 0 - 59 957.436 267.3 1177 622 1177 c 0 - 737.333 1177 845 1153.67 945 1107 c 1 - 945 935 l 1 - 840.333 992.333 735.333 1021 630 1021 c 0 - 380.783 1021 253 853.415 253 589 c 0 - 253 324.696 378.566 157 630 157 c 0 - 735.333 157 840.333 185.667 945 243 c 1 - 945 73 l 1 - 840.333 24.3333 728.667 -1.73472e-18 610 0 c 0 - 267.207 0 59 225.546 59 589 c 0 -EndSplineSet +HStem: -22 156<435.2 735.867> 1262.17 375<470.667 707.667> +VStem: 82 194<337.3 751.133> 470.667 459<1262.17 1637.17> +Refer: 114 180 N 1 0 0 1 21.6667 -39.8333 2 +Refer: 68 99 N 1 0 0 1 0 0 2 EndChar StartChar: Ccaron Encoding: 263 268 193 Width: 1367 Flags: W -HStem: -29 166<342.085 1022.93> 1354 166<341.83 1026.4> -VStem: 66 213<255.415 1237.81> -Fore -631 1638 m 1 - 420 1904 l 1 - 559 1904 l 1 - 725 1726 l 1 - 891 1904 l 1 - 1030 1904 l 1 - 819 1638 l 1 - 631 1638 l 1 -66 745 m 0 - 66 1226.22 334.951 1520 795 1520 c 0 - 973 1520 1131.33 1472.67 1270 1378 c 1 - 1270 1165 l 1 - 1135.33 1291 981 1354 807 1354 c 0 - 449.177 1354 279 1124.08 279 745 c 0 - 279 368.396 449.373 137 807 137 c 0 - 981 137 1135.33 200 1270 326 c 1 - 1270 115 l 1 - 1128.67 19 970.333 -29 795 -29 c 0 - 333.459 -29 66 263.497 66 745 c 0 -EndSplineSet +HStem: 1347.28 168.716<571.697 830.264> 1638 376<406 651> +VStem: 66 206<580.825 1140.2> 406 638<2014 2014> +Refer: 226 711 N 1 0 0 1 193 376 2 +Refer: 36 67 N 1 0 0 1 0 0 2 EndChar StartChar: ccaron Encoding: 264 269 194 @@ -4903,34 +4193,16 @@ StartChar: dcaron Encoding: 265 271 195 Width: 1674 Flags: W -HStem: -24 154<409.667 659.333> 998 154<410.1 659.333> -VStem: 59 190<404.733 713.267> 806 184<5 173 244.471 882.669 955 1561> +HStem: -24 154<409.667 634.133> 998 154<410.1 634.133> 1057 509<1092 1286> +VStem: 59 190<404.733 713.267> 806 184<5 173 409.733 718.267 955 1561> 1092 377<1057 1566> Fore -806 955 m 1 - 806 1561 l 1 - 990 1561 l 1 - 990 5 l 1 - 806 5 l 1 - 806 173 l 1 - 730 41.6667 610.333 -24 447 -24 c 0 - 343.667 -27.3333 250.333 33.6667 167 159 c 0 - 95 267.667 59 401 59 559 c 0 - 59 717 95 850.333 167 959 c 0 - 250.333 1084.33 343.667 1148.67 447 1152 c 0 - 610.333 1152 730 1086.33 806 955 c 1 -806 564 m 0 - 806 809.13 706.503 998 492 998 c 0 - 429 995 370 946 315 851 c 0 - 271 775 249 677.667 249 559 c 0 - 249 440.333 271 343 315 267 c 0 - 369.667 172.333 428.667 126.667 492 130 c 0 - 706.055 130 806 318.209 806 564 c 0 -1092 1057 m 1 +1092 1057 m 1xbc 1286 1566 l 1 1469 1566 l 1 1243 1057 l 1 - 1092 1057 l 1 + 1092 1057 l 1xbc EndSplineSet +Refer: 69 100 S 1 0 0 1 0 0 2 EndChar StartChar: Eogonek Encoding: 268 280 196 @@ -5001,78 +4273,19 @@ StartChar: Gbreve Encoding: 270 286 198 Width: 1526 Flags: W -HStem: -29 166<501.6 1011.73> 614 166<840 1170> 1354 166<499 1067.53> 1659 131<684.4 971.7> -VStem: 66 213<433 1059.6> 1170 200<213 614> -Fore -517 1901 m 1 - 635 1901 l 1 - 653 1827 718 1790 830 1790 c 0 - 939 1790 1004 1827 1025 1901 c 1 - 1143 1901 l 1 - 1129.67 1739.67 1025.33 1659 830 1659 c 0 - 634.667 1659 530.333 1739.67 517 1901 c 1 -1170 213 m 1 - 1170 614 l 1 - 840 614 l 1 - 840 780 l 1 - 1370 780 l 1 - 1370 139 l 1 - 1212 27 1025.67 -29 811 -29 c 0 - 573 -29 388.333 40.6667 257 180 c 0 - 129.667 316.667 66 505 66 745 c 0 - 66 987 129.333 1175.67 256 1311 c 0 - 386 1450.33 571 1520 811 1520 c 0 - 1008.33 1520 1181.67 1472.67 1331 1378 c 1 - 1331 1163 l 1 - 1180.33 1290.33 1012.67 1354 828 1354 c 0 - 462 1354 279 1151 279 745 c 0 - 279 339.667 462 137 828 137 c 0 - 969.333 137 1083.33 162.333 1170 213 c 1 -EndSplineSet +HStem: -34 176<611.436 910.133> 575 174<636.961 1267> 1659 137<561.5 857.9> +VStem: 69 206<453.065 958.254> 398 626<1831.38 1946 1946 1946> 1075 194<99 614.43> +Refer: 227 728 S 1 0 0 1 169 338 2 +Refer: 40 71 N 1 0 0 1 0 0 2 EndChar StartChar: gbreve Encoding: 271 287 199 Width: 1289 Flags: W -HStem: -412 150<337.653 757.867> 12 154<428.102 635.867> 1005 154<415.733 571.319> 1321 137<419.867 686.8> -VStem: 59 190<418.733 726.4> 806 184<-211.333 209 432.467 740.133 962 1132> -Fore -236 1608 m 1 - 354 1608 l 1 - 369 1508 434 1458 549 1458 c 0 - 662 1458 727 1508 744 1608 c 1 - 862 1608 l 1 - 862 1510 836.333 1437.67 785 1391 c 0 - 733.667 1344.33 655 1321 549 1321 c 0 - 449.667 1321 372.667 1345.33 318 1394 c 0 - 263.333 1442.67 236 1514 236 1608 c 1 -990 1132 m 1 - 990 151 l 2 - 990 -224.333 818 -412 474 -412 c 0 - 369.333 -412 276 -397 194 -367 c 1 - 194 -188 l 1 - 299.333 -245.333 383 -270 445 -262 c 0 - 685.667 -262 806 -135.333 806 118 c 2 - 806 209 l 1 - 730.667 77.6667 611 12 447 12 c 0 - 337.667 12 244.333 68 167 180 c 0 - 95 285 59 416 59 573 c 0 - 59 731 95 862.333 167 967 c 0 - 254.883 1093.87 348.217 1157.87 447 1159 c 0 - 534.333 1160 607 1146 665 1117 c 0 - 723 1088 770 1036.33 806 962 c 1 - 806 1132 l 1 - 990 1132 l 1 -806 585 m 0 - 806 704.333 784 800 740 872 c 0 - 690 960.667 607.333 1005 492 1005 c 0 - 433.333 1005 374.333 956.333 315 859 c 0 - 271 786.333 249 691 249 573 c 0 - 249 454.333 271 359 315 287 c 0 - 369 198.333 428 158 492 166 c 0 - 602.667 166 685 210.333 739 299 c 0 - 783.667 372.333 806 467.667 806 585 c 0 -EndSplineSet +HStem: -412 150<337.653 757.867> 12 154<428.102 635.867> 1005 155.41<408.153 635.294> 1321 137<392.5 688.9> +VStem: 59 190<418.733 726.4> 229 626<1493.38 1608 1608 1608> 806 184<-211.333 209 431.6 740.133 962 1132> +Refer: 227 728 N 1 0 0 1 0 0 2 +Refer: 72 103 N 1 0 0 1 0 0 2 EndChar StartChar: Hbar Encoding: 274 294 200 @@ -5144,61 +4357,25 @@ StartChar: Itilde Encoding: 276 296 202 Width: 990 Flags: W -HStem: 0 152<78 266 464 656> 1337 152<78 266 464 656> 1676 160<488.467 615.867> 1807 162<136 259.957> -VStem: 266 198<152 1337> -Fore -741 1992 m 1xe8 - 741 1818 l 1 - 667 1723.33 594.667 1676 524 1676 c 0xe8 - 482 1676 433.333 1695.33 378 1734 c 2 - 376 1734.67 368.667 1739 356 1747 c 0 - 294.667 1787 247.333 1807 214 1807 c 0 - 150 1807 82 1755.33 10 1652 c 1 - 10 1824 l 1 - 84.6667 1920.67 157 1969 227 1969 c 0xd8 - 267.667 1969 316.667 1949.33 374 1910 c 0 - 445.518 1860.94 499.667 1836 537 1836 c 0 - 598 1836 666 1888 741 1992 c 1xe8 -78 1489 m 1 - 656 1489 l 1 - 656 1337 l 1 - 464 1337 l 1 - 464 152 l 1 - 656 152 l 1 - 656 0 l 1 - 78 0 l 1 - 78 152 l 1 - 266 152 l 1 - 266 1337 l 1 - 78 1337 l 1 - 78 1489 l 1 -EndSplineSet +HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> 1676 147<496.088 635.667> 1796 148<113.333 252.653> +VStem: 280 198<152 1337> +Refer: 231 732 S 1 0 0 1 -185 334 2 +Refer: 42 73 N 1 0 0 1 0 0 2 EndChar StartChar: itilde Encoding: 277 297 203 Width: 618 Flags: W -HStem: 0 21G<130 318> 1102 20G<130 318> 1341 141<319.614 419.067> 1457 142<46.6667 144.464> +HStem: 0 21G<130 318> 1102 20G<130 318> 1341 147<351.088 490.667> 1461 148<-31.667 107.653> VStem: 130 188<0 1122> Fore -517 1619 m 1xe8 - 517 1466 l 1 - 459 1382.67 402.667 1341 348 1341 c 0xe8 - 316 1341 278 1358 234 1392 c 2 - 232 1392.67 226.333 1396.67 217 1404 c 0 - 169.667 1439.33 132.667 1457 106 1457 c 0 - 56 1457 3 1411.33 -53 1320 c 1 - -53 1471 l 1 - 6.33333 1556.33 62.6667 1599 116 1599 c 0xd8 - 148 1599 186.333 1581.67 231 1547 c 0 - 286.518 1503.91 328.667 1482 358 1482 c 0 - 406 1482 459 1527.67 517 1619 c 1xe8 -130 0 m 1 +130 0 m 1xc8 130 1122 l 1 318 1122 l 1 318 0 l 1 - 130 0 l 1 + 130 0 l 1xc8 EndSplineSet +Refer: 231 732 S 1 0 0 1 -330 -1 2 EndChar StartChar: Imacron Encoding: 278 298 204 @@ -5207,25 +4384,13 @@ Flags: W HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> 1698 154<55 709> VStem: 280 198<152 1337> Fore -92 1489 m 1 - 670 1489 l 1 - 670 1337 l 1 - 478 1337 l 1 - 478 152 l 1 - 670 152 l 1 - 670 0 l 1 - 92 0 l 1 - 92 152 l 1 - 280 152 l 1 - 280 1337 l 1 - 92 1337 l 1 - 92 1489 l 1 55 1698 m 1 55 1852 l 1 709 1852 l 1 709 1698 l 1 55 1698 l 1 EndSplineSet +Refer: 42 73 S 1 0 0 1 0 0 2 EndChar StartChar: imacron Encoding: 279 299 205 @@ -5250,51 +4415,25 @@ StartChar: Ibreve Encoding: 280 300 206 Width: 990 Flags: W -HStem: 0 152<112 300 498 690> 1337 152<112 300 498 690> 1623 137<247.5 543.9> -VStem: 300 198<152 1337> -Fore -112 1489 m 1 - 690 1489 l 1 - 690 1337 l 1 - 498 1337 l 1 - 498 152 l 1 - 690 152 l 1 - 690 0 l 1 - 112 0 l 1 - 112 152 l 1 - 300 152 l 1 - 300 1337 l 1 - 112 1337 l 1 - 112 1489 l 1 -84 1910 m 1 - 202 1910 l 1 - 217 1810 282 1760 397 1760 c 0 - 510 1760 575 1810 592 1910 c 1 - 710 1910 l 1 - 696.667 1718.67 592.333 1623 397 1623 c 0 - 201.667 1623 97.3333 1718.67 84 1910 c 1 -EndSplineSet +HStem: 0 152<92 280 478 670> 1337 152<92 280 478 670> 1623 137<230.5 526.9> +VStem: 67 626<1795.38 1910 1910 1910> 280 198<152 1337> +Refer: 227 728 S 1 0 0 1 -162 302 2 +Refer: 42 73 N 1 0 0 1 0 0 2 EndChar StartChar: ibreve Encoding: 281 301 207 Width: 618 Flags: W -HStem: 0 21G<168 356> 1257 137<118.5 414.9> -VStem: 168 188<0 1117> +HStem: 0 21G<168 356> 1256.5 137<118.5 414.9> +VStem: -45 626<1428.88 1543.5 1543.5 1543.5> 168 188<0 1117> Fore -168 0 m 1 +168 0 m 1xd0 168 1117 l 1 356 1117 l 1 356 0 l 1 - 168 0 l 1 --45 1544 m 1 - 73 1544 l 1 - 88 1444 153 1394 268 1394 c 0 - 381 1394 446 1444 463 1544 c 1 - 581 1544 l 1 - 567.667 1352.67 463.333 1257 268 1257 c 0 - 72.6667 1257 -31.6667 1352.67 -45 1544 c 1 + 168 0 l 1xd0 EndSplineSet +Refer: 227 728 N 1 0 0 1 -274 -64.5 2 EndChar StartChar: Idot Encoding: 282 304 208 @@ -5333,41 +4472,31 @@ StartChar: Lcaron Encoding: 284 317 210 Width: 1172 Flags: W -HStem: 0 170<350 1015> -VStem: 152 198<170 1493> +HStem: 0 170<350 1015> 1066 490<567 765> +VStem: 152 198<170 1493> 567 384<1066 1556> Fore -152 0 m 1 - 152 1493 l 1 - 350 1493 l 1 - 350 170 l 1 - 1015 170 l 1 - 1015 0 l 1 - 152 0 l 1 567 1066 m 1 765 1556 l 1 951 1556 l 1 721 1066 l 1 567 1066 l 1 EndSplineSet +Refer: 45 76 S 1 0 0 1 0 0 2 EndChar StartChar: lcaron Encoding: 285 318 211 Width: 1003 Flags: W -HStem: 0 21G<139 323> -VStem: 139 184<0 1556> +HStem: 0 21<139 323> 1061 495<438 628> +VStem: 139 184<0 1556> 438 367<1061 1556> Fore -139 0 m 1 - 139 1556 l 1 - 323 1556 l 1 - 323 0 l 1 - 139 0 l 1 438 1061 m 1 628 1556 l 1 805 1556 l 1 585 1061 l 1 438 1061 l 1 EndSplineSet +Refer: 77 108 S 1 0 0 1 0 0 2 EndChar StartChar: Lslash Encoding: 286 321 212 @@ -5573,39 +4702,10 @@ StartChar: Scaron Encoding: 138 352 218 Width: 1297 Flags: W -HStem: -29 164<373.267 869.867> 1356 164<407.867 784> -VStem: 78 203<1010.33 1281.2> 918 211<169.933 579> -Fore -668 1638 m 1 - 480 1638 l 1 - 269 1904 l 1 - 408 1904 l 1 - 574 1726 l 1 - 740 1904 l 1 - 879 1904 l 1 - 668 1638 l 1 -1039 1444 m 1 - 1039 1247 l 1 - 887.667 1319.67 749.667 1356 625 1356 c 0 - 395.667 1356 281 1274 281 1110 c 0 - 281 1033.33 311 977 371 941 c 0 - 407.667 918.333 472.667 897.667 566 879 c 2 - 688 854 l 2 - 829.333 824.667 934 780 1002 720 c 0 - 1086.67 647.333 1129 544.667 1129 412 c 0 - 1129 118 938.333 -29 557 -29 c 0 - 415.667 -29 258 2.66667 84 66 c 1 - 84 274 l 1 - 248.667 181.333 406.333 135 557 135 c 0 - 797.667 135 918 222.333 918 397 c 0 - 918 537 821.667 625.333 629 662 c 2 - 506 686 l 2 - 368.667 713.333 268 753 204 805 c 0 - 120 872.333 78 968.667 78 1094 c 0 - 78 1238 131.333 1347.33 238 1422 c 0 - 331.333 1487.33 452.667 1520 602 1520 c 0 - 742 1520 887.667 1494.67 1039 1444 c 1 -EndSplineSet +HStem: -17 164<338.667 837.867> 1369 163<435.993 753.733> 1638.5 376<255 500> +VStem: 89 206<1023.33 1289.2> 255 638<2014.5 2014.5> 886 211<181.933 591> +Refer: 226 711 N 1 0 0 1 42 376.5 2 +Refer: 52 83 N 1 0 0 1 0 0 2 EndChar StartChar: scaron Encoding: 154 353 219 @@ -5638,37 +4738,22 @@ StartChar: Zcaron Encoding: 142 381 222 Width: 1275 Flags: W -HStem: 0 170<311 1278> 1323 170<82 1003> -Fore -704 1635 m 1 - 493 1901 l 1 - 632 1901 l 1 - 798 1723 l 1 - 964 1901 l 1 - 1103 1901 l 1 - 892 1635 l 1 - 704 1635 l 1 -82 1493 m 1 - 1255 1493 l 1 - 1255 1339 l 1 - 311 170 l 1 - 1278 170 l 1 - 1278 0 l 1 - 59 0 l 1 - 59 154 l 1 - 1003 1323 l 1 - 82 1323 l 1 - 82 1493 l 1 +HStem: 0 176<273 1099> 1313 176<95 856> 1639 376<252 497> +VStem: 252 638<2015 2015> +Fore +704 1635 m 1,0,-1 EndSplineSet +Refer: 226 711 S 1 0 0 1 39 377 2 +Refer: 59 90 N 1 0 0 1 0 0 2 EndChar StartChar: zcaron Encoding: 158 382 223 Width: 1077 Flags: W -HStem: 0 146<239 874> 972 145<72 684> 1262 376<239 484> -VStem: 239 638<1638 1638> +HStem: 0 146<239 874> 972 145<72 684> 1262 376<155 400> +VStem: 155 638<1638 1638> Refer: 91 122 N 1 0 0 1 0 0 2 -Refer: 226 711 N 1 0 0 1 26 0 2 +Refer: 226 711 S 1 0 0 1 -58 0 2 EndChar StartChar: florin Encoding: 131 402 224 @@ -6965,193 +6050,51 @@ StartChar: Abreve Encoding: 322 258 272 Width: 1402 Flags: W -HStem: -8 21G<-10 190 1029 1238> 408 169<380 839> 1630 137<476.5 772.9> -Fore -839 577 m 1 - 614 1286 l 1 - 380 577 l 1 - 839 577 l 1 --10 -8 m 1 - 500 1485 l 1 - 729 1485 l 1 - 1238 -8 l 1 - 1029 -8 l 1 - 894 408 l 1 - 325 408 l 1 - 190 -8 l 1 - -10 -8 l 1 -313 1917 m 1 - 431 1917 l 1 - 446 1817 511 1767 626 1767 c 0 - 739 1767 804 1817 821 1917 c 1 - 939 1917 l 1 - 925.667 1725.67 821.333 1630 626 1630 c 0 - 430.667 1630 326.333 1725.67 313 1917 c 1 -EndSplineSet +HStem: 0 21<-10 190 1029 1238> 416 169<380 839> 1630 137<476.5 772.9> +VStem: 313 626<1802.38 1917 1917 1917> +Refer: 227 728 N 1 0 0 1 84 309 2 +Refer: 34 65 N 1 0 0 1 0 0 2 EndChar StartChar: Amacron Encoding: 323 256 273 Width: 1402 Flags: W -HStem: 0 21G<-10 190 1029 1238> 417 169<380 839> 1698 154<248 999> +HStem: 0 21<-10 190 1029 1238> 416 169<380 839> 1698 154<248 999> Fore 248 1852 m 1 999 1852 l 1 999 1698 l 1 245 1698 l 1 248 1852 l 1 -839 586 m 1 - 614 1295 l 1 - 380 586 l 1 - 839 586 l 1 --10 0 m 1 - 500 1494 l 1 - 729 1494 l 1 - 1238 0 l 1 - 1029 0 l 1 - 894 417 l 1 - 325 417 l 1 - 190 0 l 1 - -10 0 l 1 EndSplineSet +Refer: 34 65 S 1 0 0 1 0 0 2 EndChar StartChar: Ccircumflex Encoding: 324 264 274 Width: 1367 Flags: W -HStem: 1349 165.887<547.937 801.731> -VStem: 66 206<598.366 907.8> -Fore -1196 1154 m 1 - 1113.33 1223.33 1029.17 1275.17 943.5 1309.5 c 0 - 857.833 1343.83 780.333 1357 711 1349 c 0 - 411 1311.67 264.667 1110.67 272 746 c 0 - 272 744.667 272.049 742.914 272.147 740.742 c 0 - 272.716 716.914 273.333 697.667 274 683 c 0 - 274.667 668.333 276.833 645.167 280.5 613.5 c 0 - 284.167 581.833 288.5 554.833 293.5 532.5 c 0 - 298.5 510.167 306.333 482.833 317 450.5 c 0 - 327.667 418.167 340.167 390.333 354.5 367 c 0 - 368.833 343.667 387.333 318.667 410 292 c 0 - 432.667 265.333 457.833 243 485.5 225 c 0 - 513.167 207 546.333 190.833 585 176.5 c 0 - 623.667 162.167 665.667 152.333 711 147 c 0 - 849.667 131 1011.33 195.333 1196 340 c 1 - 1196 104 l 1 - 1120 57.3333 1039.5 23.6667 954.5 3 c 0 - 869.5 -17.6667 788.333 -26.6667 711 -24 c 0 - 623.667 -20 544.5 -4.33333 473.5 23 c 0 - 402.5 50.3333 341.833 87 291.5 133 c 0 - 241.167 179 199 233.833 165 297.5 c 0 - 131 361.167 106 430.333 90 505 c 0 - 74 579.667 66 660 66 746 c 0 - 66 770 66.5 792.667 67.5 814 c 0 - 68.5 835.333 71.1667 865.167 75.5 903.5 c 0 - 79.8333 941.833 85.8333 977.167 93.5 1009.5 c 0 - 101.167 1041.83 112.833 1078.67 128.5 1120 c 0 - 144.167 1161.33 162.667 1198.83 184 1232.5 c 0 - 205.333 1266.17 232.667 1300.33 266 1335 c 0 - 299.333 1369.67 336.5 1399.17 377.5 1423.5 c 0 - 418.5 1447.83 467.833 1468.67 525.5 1486 c 0 - 583.167 1503.33 645.667 1514.33 713 1519 c 0 - 763 1522.33 810.5 1521.17 855.5 1515.5 c 0 - 900.5 1509.83 945.167 1499 989.5 1483 c 0 - 1033.83 1467 1068.17 1453.67 1092.5 1443 c 0 - 1116.83 1432.33 1151.33 1415.67 1196 1393 c 1 - 1196 1154 l 1 -619 2057 m 1 - 835 2057 l 1 - 1065 1673 l 1 - 905 1673 l 1 - 723 1930 l 1 - 523 1673 l 1 - 363 1673 l 1 - 619 2057 l 1 -EndSplineSet +HStem: 1347.28 168.716<571.697 830.264> 1673 384<619 1065> +VStem: 66 206<580.825 1140.2> 363 702<1673 1673> +Refer: 225 710 N 1 0 0 1 146 377 2 +Refer: 36 67 N 1 0 0 1 0 0 2 EndChar StartChar: Cdotaccent Encoding: 325 266 275 Width: 1367 Flags: W -HStem: 1674 204<605 809> -VStem: 75 206<599.366 908.8> 605 204<1674 1878> -Fore -1205 1155 m 1 - 1122.33 1224.33 1038.17 1276.17 952.5 1310.5 c 0 - 866.833 1344.83 789.333 1358 720 1350 c 0 - 420 1312.67 273.667 1111.67 281 747 c 0 - 281 745.667 281.049 743.914 281.147 741.742 c 0 - 281.716 717.914 282.333 698.667 283 684 c 0 - 283.667 669.333 285.833 646.167 289.5 614.5 c 0 - 293.167 582.833 297.5 555.833 302.5 533.5 c 0 - 307.5 511.167 315.333 483.833 326 451.5 c 0 - 336.667 419.167 349.167 391.333 363.5 368 c 0 - 377.833 344.667 396.333 319.667 419 293 c 0 - 441.667 266.333 466.833 244 494.5 226 c 0 - 522.167 208 555.333 191.833 594 177.5 c 0 - 632.667 163.167 674.667 153.333 720 148 c 0 - 858.667 132 1020.33 196.333 1205 341 c 1 - 1205 105 l 1 - 1129 58.3333 1048.5 24.6667 963.5 4 c 0 - 878.5 -16.6667 797.333 -25.6667 720 -23 c 0 - 632.667 -19 553.5 -3.33333 482.5 24 c 0 - 411.5 51.3333 350.833 88 300.5 134 c 0 - 250.167 180 208 234.833 174 298.5 c 0 - 140 362.167 115 431.333 99 506 c 0 - 83 580.667 75 661 75 747 c 0 - 75 771 75.5 793.667 76.5 815 c 0 - 77.5 836.333 80.1667 866.167 84.5 904.5 c 0 - 88.8333 942.833 94.8333 978.167 102.5 1010.5 c 0 - 110.167 1042.83 121.833 1079.67 137.5 1121 c 0 - 153.167 1162.33 171.667 1199.83 193 1233.5 c 0 - 214.333 1267.17 241.667 1301.33 275 1336 c 0 - 308.333 1370.67 345.5 1400.5 386.5 1425.5 c 0 - 427.5 1450.5 476.833 1471.67 534.5 1489 c 0 - 592.167 1506.33 654.667 1516.67 722 1520 c 0 - 776.891 1522.72 824.391 1521.55 864.5 1516.5 c 0 - 909.5 1510.83 954.167 1500 998.5 1484 c 0 - 1042.83 1468 1077.17 1454.67 1101.5 1444 c 0 - 1125.83 1433.33 1160.33 1416.67 1205 1394 c 1 - 1205 1155 l 1 -605 1878 m 1 - 809 1878 l 1 - 809 1674 l 1 - 605 1674 l 1 - 605 1878 l 1 -EndSplineSet +HStem: 1347.28 168.716<571.697 830.264> 1674 204<605 809> +VStem: 66 206<580.825 1140.2> 605 204<1674 1878> +Refer: 228 729 N 1 0 0 1 152 326 2 +Refer: 36 67 N 1 0 0 1 0 0 2 EndChar StartChar: Dcaron Encoding: 326 270 276 Width: 1551 Flags: W -HStem: 0 163<350 716.667> 1326 166<350 780.067> -VStem: 152 198<163 1326> 1110 213<485.7 1009.6> -Fore -514 1326 m 2 - 350 1326 l 1 - 350 163 l 1 - 514 165 l 2 - 716.667 165 866.333 211 963 303 c 0 - 1061 398 1110 546 1110 747 c 0 - 1110 949 1061 1096.67 963 1190 c 0 - 868.333 1280.67 718.667 1326 514 1326 c 2 -152 0 m 1 - 152 1492 l 1 - 483 1492 l 2 - 758 1492 963 1438 1098 1330 c 0 - 1248 1208.67 1323 1014.33 1323 747 c 0 - 1323 478.333 1248 283.667 1098 163 c 0 - 961.333 54.3333 756.333 3.46945e-18 483 0 c 2 - 152 0 l 1 -561 1669 m 1 - 316 2045 l 1 - 455 2045 l 1 - 635 1800 l 1 - 815 2045 l 1 - 954 2045 l 1 - 709 1669 l 1 - 561 1669 l 1 -EndSplineSet +HStem: 0 162<350 914.744> 1325 164<350 1039.28> 1669 376<316 561> +VStem: 152 198<162 1325> 316 638<2045 2045> 1110 213<220.751 1274.51> +Refer: 226 711 N 1 0 0 1 103 407 2 +Refer: 37 68 N 1 0 0 1 0 0 2 EndChar StartChar: Dslash Encoding: 327 272 277 @@ -7208,28 +6151,10 @@ StartChar: Edotaccent Encoding: 330 278 280 Width: 1260 Flags: W -HStem: 0 176<350 1083> 729 176<350 1033> 1313 176<350 1083> 1661 254<540 751> -VStem: 152 198<176 729 905 1313> 540 211<1661 1915> -Fore -152 0 m 1 - 152 1489 l 1 - 1083 1489 l 1 - 1083 1313 l 1 - 350 1313 l 1 - 350 905 l 1 - 1033 905 l 1 - 1033 729 l 1 - 350 729 l 1 - 350 176 l 1 - 1083 176 l 1 - 1083 0 l 1 - 152 0 l 1 -540 1915 m 1 - 751 1915 l 1 - 751 1661 l 1 - 540 1661 l 1 - 540 1915 l 1 -EndSplineSet +HStem: 0 176<350 1083> 729 176<350 1033> 1313 176<350 1083> 1661 204<543.5 747.5> +VStem: 152 198<176 729 905 1313> 543.5 204<1661 1865> +Refer: 228 729 N 1 0 0 1 90.5 313 2 +Refer: 38 69 N 1 0 0 1 0 0 2 EndChar StartChar: Emacron Encoding: 331 274 281 @@ -7238,25 +6163,13 @@ Flags: W HStem: 0 176<350 1083> 729 176<350 1033> 1313 176<350 1083> 1694 158<245 992> VStem: 152 198<176 729 905 1313> Fore -152 0 m 1 - 152 1489 l 1 - 1083 1489 l 1 - 1083 1313 l 1 - 350 1313 l 1 - 350 905 l 1 - 1033 905 l 1 - 1033 729 l 1 - 350 729 l 1 - 350 176 l 1 - 1083 176 l 1 - 1083 0 l 1 - 152 0 l 1 245 1852 m 1 992 1852 l 1 992 1694 l 1 245 1694 l 1 245 1852 l 1 EndSplineSet +Refer: 38 69 S 1 0 0 1 0 0 2 EndChar StartChar: Gcedilla Encoding: 332 290 282 @@ -7318,47 +6231,10 @@ StartChar: Gdotaccent Encoding: 334 288 284 Width: 1526 Flags: W -HStem: -34 176<650.789 910.133> 575 175<684.994 1123.75> 1676 254<616 827> -VStem: 69 206<592.274 906.673> 616 211<1676 1930> 1075 194<134.721 614.43> -Fore -1269 1146 m 1 - 1097 1278.67 933 1345 777 1345 c 0 - 703 1345 636 1333.33 576 1310 c 0 - 516 1286.67 462.5 1250.5 415.5 1201.5 c 0 - 368.5 1152.5 332.667 1086 308 1002 c 0 - 283.333 918 272.333 819.333 275 706 c 0 - 275.667 650.667 282.167 596.167 294.5 542.5 c 0 - 306.833 488.833 326.167 437 352.5 387 c 0 - 378.833 337 410.667 293.333 448 256 c 0 - 485.333 218.667 531.667 189.5 587 168.5 c 0 - 642.333 147.5 702.667 138.667 768 142 c 0 - 877.333 146.667 979.667 162.667 1075 190 c 1 - 1072.33 232.667 1072.33 297 1075 383 c 0 - 1077.67 469 1077.67 533 1075 575 c 1 - 1038.33 577 981.667 577 905 575 c 0 - 828.333 573 771.333 573 734 575 c 1 - 735.333 593 735.333 622.333 734 663 c 0 - 732.667 703.667 732.333 733 733 751 c 1 - 792.333 751.667 881.333 751.333 1000 750 c 0 - 1118.67 748.667 1207.67 748.333 1267 749 c 1 - 1267.67 675.667 1268 567.333 1268 424 c 0 - 1268 280.667 1268.33 172.333 1269 99 c 1 - 1176.33 55.6667 1092.67 22.6667 1018 0 c 0 - 943.333 -22.6667 867.667 -34 791 -34 c 0 - 687.667 -34 593.5 -19.3333 508.5 10 c 0 - 423.5 39.3333 348.667 83.3333 284 142 c 0 - 219.333 200.667 168.333 277.5 131 372.5 c 0 - 93.6667 467.5 73 577.333 69 702 c 0 - 53 1215.33 281 1486.67 753 1516 c 0 - 943 1527.33 1113.33 1483.67 1264 1385 c 1 - 1265.33 1358.33 1266.33 1318.5 1267 1265.5 c 0 - 1267.67 1212.5 1268.33 1172.67 1269 1146 c 1 -616 1930 m 1 - 827 1930 l 1 - 827 1676 l 1 - 616 1676 l 1 - 616 1930 l 1 -EndSplineSet +HStem: -34 176<611.436 910.133> 575 174<636.961 1267> 1676 204<620.5 824.5> +VStem: 69 206<453.065 958.254> 620.5 204<1676 1880> 1075 194<99 614.43> +Refer: 228 729 N 1 0 0 1 167.5 328 2 +Refer: 40 71 N 1 0 0 1 0 0 2 EndChar StartChar: Hcircumflex Encoding: 335 292 285 @@ -7471,73 +6347,19 @@ StartChar: Uhungarumlaut Encoding: 345 368 295 Width: 1513 Flags: W -HStem: -29 164<495.867 858.133> -VStem: 138 198<1119.99 1489> 138 191<418.199 1379.68> 1014 201<417.44 1489> -Fore -544 2053 m 1x90 - 354 1677 l 1 - 491 1677 l 1 - 714 2053 l 1 - 544 2053 l 1x90 -965 2053 m 1 - 760 1677 l 1 - 895 1677 l 1 - 1143 2053 l 1 - 965 2053 l 1 -138 561 m 2xb0 - 138 1489 l 1 - 336 1489 l 1xd0 - 329 595 l 2 - 335 434.333 352.333 323.333 381 262 c 1 - 439 177.333 537.667 135 677 135 c 0 - 816.333 135 915 177.333 973 262 c 1 - 1000.33 336.667 1013.54 444.001 1014 584 c 2 - 1017 1489 l 1 - 1215 1489 l 1 - 1215 560 l 2 - 1237 167.333 1057.67 -29 677 -29 c 0 - 295.667 -29 116 167.667 138 561 c 2xb0 -EndSplineSet +HStem: -29 164<523.867 886.133> 1677 376<775 980> +VStem: 166 191<418.199 1379.68> 166 198<1119.99 1489> 369 789<1677 2053> 1042 201<417.44 1489> +Refer: 232 733 S 1 0 0 1 119 375 2 +Refer: 54 85 N 1 0 0 1 0 0 2 EndChar StartChar: Uring Encoding: 346 366 296 Width: 1513 Flags: W -HStem: -31 164<523.867 886.133> 1403 123<646.855 763.442> 1829 123<646.855 763.442> -VStem: 166 198<1119.43 1489> 166 191<416.199 1379.43> 433 122<1617.86 1737.35> 859 122<1621.55 1733.68> 1042 201<415.44 1489> -Fore -981 1678 m 0xe7 - 981 1599.33 955 1533.67 903 1481 c 0 - 851 1429 785.667 1403 707 1403 c 0 - 628.333 1403 563 1429 511 1481 c 0 - 459 1533.67 433 1599.33 433 1678 c 0 - 433 1756.67 459 1822 511 1874 c 0 - 563 1926 628.333 1952 707 1952 c 0 - 785.667 1952 851 1926 903 1874 c 0 - 955 1822 981 1756.67 981 1678 c 0xe7 -859 1678 m 0 - 859 1720 844.333 1755.67 815 1785 c 0 - 785.667 1814.33 749.667 1829 707 1829 c 0 - 663 1829 626.667 1814.67 598 1786 c 0 - 569.333 1757.33 555 1721.33 555 1678 c 0 - 555 1634 569.333 1597.67 598 1569 c 0 - 626.667 1540.33 663 1526 707 1526 c 0 - 749.667 1526 785.667 1540.67 815 1570 c 0 - 844.333 1599.33 859 1635.33 859 1678 c 0 -166 559 m 2xef - 166 1489 l 1 - 364 1489 l 1xf7 - 357 593 l 2 - 363 432.333 380.333 321.333 409 260 c 1 - 467 175.333 565.667 133 705 133 c 0 - 844.333 133 943 175.333 1001 260 c 1 - 1028.33 334.667 1041.54 442.001 1042 582 c 2 - 1045 1489 l 1 - 1243 1489 l 1 - 1243 558 l 2 - 1265 165.333 1085.67 -31 705 -31 c 0 - 323.667 -31 144 165.667 166 559 c 2xef -EndSplineSet +HStem: -29 164<523.867 886.133> 1402.5 123<646.855 763.442> 1828.5 123<646.855 763.442> +VStem: 166 191<418.199 1379.68> 166 198<1119.99 1489> 433 122<1617.36 1736.85> 859 122<1621.05 1733.18> 1042 201<417.44 1489> +Refer: 229 730 N 1 0 0 1 179 250.5 2 +Refer: 54 85 N 1 0 0 1 0 0 2 EndChar StartChar: Zacute Encoding: 347 377 297 @@ -7561,81 +6383,25 @@ StartChar: abreve Encoding: 349 259 299 Width: 1226 Flags: W -HStem: -28 154<403.467 585.467> 562 157<445 647.414> 992 156<382.267 627.733> 1247 137<392.5 688.9> -VStem: 57 171<249.2 462.4> 759 187<0 131.657 413 562> -Fore -759 562 m 1 - 588 562 l 2 - 506.667 563.333 441.333 554.333 392 535 c 0 - 282.667 499.667 228 433 228 335 c 0 - 228 269 255 217.333 309 180 c 0 - 363 144 423.667 126 491 126 c 0 - 563.667 125.333 628.333 166.333 685 249 c 0 - 734.333 322.333 759 413 759 521 c 2 - 759 562 l 1 -946 638 m 2 - 946 0 l 1 - 759 0 l 1 - 766 150 l 1 - 685.333 30 578.333 -29.3333 445 -28 c 0 - 310.333 -30.6667 212 0 150 64 c 0 - 88 128 57 214.333 57 323 c 0 - 57 577 228 709 570 719 c 2 - 759 734 l 1 - 759 724 l 1 - 790.333 814 778 882 722 928 c 0 - 671.333 970.667 600.333 992 509 992 c 0 - 389.667 992 277.333 961.333 172 900 c 1 - 172 1070 l 1 - 297.333 1122 415.667 1148 527 1148 c 0 - 806.333 1146.67 946 976.667 946 638 c 2 -229 1534 m 1 - 347 1534 l 1 - 362 1434 427 1384 542 1384 c 0 - 655 1384 720 1434 737 1534 c 1 - 855 1534 l 1 - 841.667 1342.67 737.333 1247 542 1247 c 0 - 346.667 1247 242.333 1342.67 229 1534 c 1 -EndSplineSet +HStem: -27 154<403.467 585.467> 563 157<445 647.414> 993 156<382.267 627.733> 1247 137<392.5 688.9> +VStem: 57 171<249.333 463.4> 229 626<1419.38 1534 1534 1534> 759 187<0 132.535 414 563> +Refer: 227 728 N 1 0 0 1 0 -74 2 +Refer: 66 97 N 1 0 0 1 0 0 2 EndChar StartChar: amacron Encoding: 350 257 300 Width: 1226 Flags: W -HStem: -23 154<403.467 585.467> 567 157<445 647.414> 997 156<382.267 627.733> 1340 149<155 893> -VStem: 57 171<253.333 467.4> 759 187<4 136.535 418 567> +HStem: -27 154<403.467 585.467> 563 157<445 647.414> 993 156<382.267 627.733> 1340 149<155 893> +VStem: 57 171<249.333 463.4> 759 187<0 132.535 414 563> Fore 155 1489 m 1 893 1489 l 1 893 1340 l 1 151 1340 l 1 155 1489 l 1 -759 567 m 1 - 588 567 l 2 - 506.667 568.333 441.333 559.333 392 540 c 0 - 282.667 504.667 228 438 228 340 c 0 - 228 273.333 255 221.667 309 185 c 0 - 363 149 423.667 131 491 131 c 0 - 563.667 130.333 628.333 171.333 685 254 c 0 - 734.333 327.333 759 418 759 526 c 2 - 759 567 l 1 -946 643 m 2 - 946 4 l 1 - 759 4 l 1 - 766 155 l 1 - 685.333 35 578.333 -24.3333 445 -23 c 0 - 310.333 -25.6667 212 5 150 69 c 0 - 88 133 57 219.333 57 328 c 0 - 57 582 228 714 570 724 c 2 - 759 739 l 1 - 759 729 l 1 - 790.333 819 778 887 722 933 c 0 - 671.333 975.667 600.333 997 509 997 c 0 - 389.667 997 277.333 966.333 172 905 c 1 - 172 1075 l 1 - 297.333 1127 415.667 1153 527 1153 c 0 - 806.333 1151.67 946 981.667 946 643 c 2 EndSplineSet +Refer: 66 97 S 1 0 0 1 0 0 2 EndChar StartChar: ccircumflex Encoding: 351 265 301 @@ -7650,30 +6416,10 @@ StartChar: cdotaccent Encoding: 352 267 302 Width: 1080 Flags: W -HStem: -21 156<411.2 711.867> 1309 204<438 642> -VStem: 58 194<338.3 752.133> 438 204<1309 1513> -Fore -908 1054 m 1 - 908 897 l 1 - 802.667 954.333 697.667 983 593 983 c 0 - 466.333 983 382.333 952.333 341 891 c 0 - 281.667 815.667 252 713.333 252 584 c 0 - 237 441 259 332 318 257 c 1 - 363.333 175.667 449 135 575 135 c 0 - 682.333 135 784.333 175.333 881 256 c 1 - 890 51 l 1 - 787.333 3 675.667 -21 555 -21 c 0 - 380.333 -21 254 33.3333 176 142 c 0 - 82 246.667 42.6667 394 58 584 c 0 - 58 764 110.667 903.667 216 1003 c 0 - 303.333 1082.33 431 1128 599 1140 c 1 - 705.667 1128.67 808.667 1100 908 1054 c 1 -438 1513 m 1 - 642 1513 l 1 - 642 1309 l 1 - 438 1309 l 1 - 438 1513 l 1 -EndSplineSet +HStem: -22 156<435.2 735.867> 1309 204<454 658> +VStem: 82 194<337.3 751.133> 454 204<1309 1513> +Refer: 228 729 S 1 0 0 1 1 -39 2 +Refer: 68 99 N 1 0 0 1 0 0 2 EndChar StartChar: dmacron Encoding: 353 273 303 @@ -7717,40 +6463,10 @@ StartChar: ebreve Encoding: 354 277 304 Width: 1216 Flags: W -HStem: -7 157<469.333 783.467> 558 144<246 866> 1004 157<457.533 691.039> 1253 137<442.5 738.9> -Fore -1040 649 m 2 - 1040 558 l 1 - 240 558 l 1 - 248 426 284.333 325 349 255 c 0 - 413.667 185 504.333 150 621 150 c 0 - 752 150 879 185 1002 255 c 1 - 1002 80 l 1 - 874 22 743.667 -7 611 -7 c 0 - 436 -7 300 47 203 155 c 0 - 107 260.333 59 405.667 59 591 c 0 - 59 676.333 69 749.167 89 809.5 c 0 - 109 869.833 140.333 927.667 183 983 c 0 - 275 1101.67 406.333 1161 577 1161 c 0 - 729.667 1161 847 1107 929 999 c 0 - 967.667 948.333 995.833 896.333 1013.5 843 c 0 - 1031.17 789.667 1040 725 1040 649 c 2 -246 702 m 1 - 866 703 l 1 - 866 785.667 841.667 860 793 926 c 0 - 769.667 957.333 741 978.167 707 988.5 c 0 - 673 998.833 630 1004 578 1004 c 0 - 485.333 1004 409 974 349 914 c 0 - 317.667 880.667 293.5 848.5 276.5 817.5 c 0 - 259.5 786.5 249.333 748 246 702 c 1 -279 1540 m 1 - 397 1540 l 1 - 412 1440 477 1390 592 1390 c 0 - 705 1390 770 1440 787 1540 c 1 - 905 1540 l 1 - 891.667 1348.67 787.333 1253 592 1253 c 0 - 396.667 1253 292.333 1348.67 279 1540 c 1 -EndSplineSet +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1252.5 137<442.5 738.9> +VStem: 279 626<1424.88 1539.5 1539.5 1539.5> 866 174<630 812> +Refer: 227 728 N 1 0 0 1 50 -68.5 2 +Refer: 70 101 N 1 0 0 1 0 0 2 EndChar StartChar: ecaron Encoding: 355 283 305 @@ -7765,76 +6481,25 @@ StartChar: edotaccent Encoding: 356 279 306 Width: 1216 Flags: W -HStem: 0 155<458.333 775.933> 563 144<235 855> 1009 157<446.533 680.039> 1300 256<477 688> -VStem: 477 211<1300 1556> -Fore -1029 654 m 2 - 1029 563 l 1 - 229 563 l 1 - 237 431 273.333 330 338 260 c 0 - 402.667 190 493.333 155 610 155 c 0 - 741 155 868 190 991 260 c 1 - 991 85 l 1 - 865.667 28.3333 735.333 -1.73472e-18 600 0 c 0 - 424 0 288 53.3333 192 160 c 0 - 96 265.333 48 410.667 48 596 c 0 - 48 681.333 58 754.167 78 814.5 c 0 - 98 874.833 129.333 932.667 172 988 c 0 - 264 1106.67 395.333 1166 566 1166 c 0 - 718.667 1166 836 1112 918 1004 c 0 - 956.667 953.333 984.833 901.333 1002.5 848 c 0 - 1020.17 794.667 1029 730 1029 654 c 2 -235 707 m 1 - 855 708 l 1 - 855 790.667 830.667 865 782 931 c 0 - 758.667 962.333 730 983.167 696 993.5 c 0 - 662 1003.83 619 1009 567 1009 c 0 - 474.333 1009 398 979 338 919 c 0 - 306.667 885.667 282.5 853.5 265.5 822.5 c 0 - 248.5 791.5 238.333 753 235 707 c 1 -477 1556 m 1 - 688 1556 l 1 - 688 1300 l 1 - 477 1300 l 1 - 477 1556 l 1 -EndSplineSet +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1300 204<480.5 684.5> +VStem: 480.5 204<1300 1504> 866 174<630 812> +Refer: 228 729 N 1 0 0 1 27.5 -48 2 +Refer: 70 101 N 1 0 0 1 0 0 2 EndChar StartChar: emacron Encoding: 357 275 307 Width: 1216 Flags: W -HStem: 0 155<469.333 786.933> 563 144<246 866> 1009 157<457.533 691.039> 1328 161<208 960> -Fore -1040 654 m 2 - 1040 563 l 1 - 240 563 l 1 - 248 431 284.333 330 349 260 c 0 - 413.667 190 504.333 155 621 155 c 0 - 752 155 879 190 1002 260 c 1 - 1002 85 l 1 - 876.667 28.3333 746.333 -1.73472e-18 611 0 c 0 - 435 0 299 53.3333 203 160 c 0 - 107 265.333 59 410.667 59 596 c 0 - 59 681.333 69 754.167 89 814.5 c 0 - 109 874.833 140.333 932.667 183 988 c 0 - 275 1106.67 406.333 1166 577 1166 c 0 - 729.667 1166 847 1112 929 1004 c 0 - 967.667 953.333 995.833 901.333 1013.5 848 c 0 - 1031.17 794.667 1040 730 1040 654 c 2 -246 707 m 1 - 866 708 l 1 - 866 790.667 841.667 865 793 931 c 0 - 769.667 962.333 741 983.167 707 993.5 c 0 - 673 1003.83 630 1009 578 1009 c 0 - 485.333 1009 409 979 349 919 c 0 - 317.667 885.667 293.5 853.5 276.5 822.5 c 0 - 259.5 791.5 249.333 753 246 707 c 1 +HStem: -26 157<298.443 783.467> 539 144<246 866> 985 157<355.133 691.039> 1328 161<208 960> +VStem: 866 174<630 812> +Fore 208 1489 m 1 960 1489 l 1 960 1328 l 1 208 1328 l 1 208 1489 l 1 EndSplineSet +Refer: 70 101 N 1 0 0 1 0 0 2 EndChar StartChar: uni2215 Encoding: 358 8725 308 @@ -7857,31 +6522,6 @@ Flags: W HStem: -412 150<337.653 757.867> 12 154<428.102 635.867> 1005 155.41<408.153 635.294> VStem: 59 190<418.733 726.4> 806 184<-211.333 209 431.6 740.133 962 1132> Fore -806 585 m 0 - 806 704.333 784 800 740 872 c 0 - 684.667 969.333 602 1013.67 492 1005 c 0 - 428 997 369 948.333 315 859 c 0 - 271 786.333 249 691 249 573 c 0 - 249 454.333 271 359 315 287 c 0 - 369 198.333 428 158 492 166 c 0 - 602.667 166 685 210.333 739 299 c 0 - 783.667 371.667 806 467 806 585 c 0 -990 1132 m 1 - 990 151 l 2 - 990 -224.333 818 -412 474 -412 c 0 - 392 -420 298.667 -405 194 -367 c 1 - 194 -188 l 1 - 299.333 -245.333 383 -270 445 -262 c 0 - 685.667 -262 806 -135.333 806 118 c 2 - 806 209 l 1 - 730.667 77.6667 611 12 447 12 c 0 - 343 4 249.667 60 167 180 c 0 - 95 285 59 416 59 573 c 0 - 59 731 95 862.333 167 967 c 0 - 249.667 1087 343 1151 447 1159 c 0 - 610.333 1183 730 1117.33 806 962 c 1 - 806 1132 l 1 - 990 1132 l 1 696 1302 m 1 414 1302 l 1 417 1423 l 1 @@ -7890,6 +6530,7 @@ Fore 699 1422 l 1 696 1302 l 1 EndSplineSet +Refer: 72 103 S 1 0 0 1 0 0 2 EndChar StartChar: gcircumflex Encoding: 360 285 310 @@ -7904,40 +6545,10 @@ StartChar: gdotaccent Encoding: 361 289 311 Width: 1289 Flags: W -HStem: -412 150<337.653 757.867> 12 154<428.102 635.867> 1005 155.41<408.153 635.294> 1296 254<449 660> -VStem: 59 190<418.733 726.4> 449 211<1296 1550> 806 184<-211.333 209 431.6 740.133 962 1132> -Fore -806 585 m 0 - 806 704.333 784 800 740 872 c 0 - 684.667 969.333 602 1013.67 492 1005 c 0 - 428 997 369 948.333 315 859 c 0 - 271 786.333 249 691 249 573 c 0 - 249 454.333 271 359 315 287 c 0 - 369 198.333 428 158 492 166 c 0 - 602.667 166 685 210.333 739 299 c 0 - 783.667 371.667 806 467 806 585 c 0 -990 1132 m 1 - 990 151 l 2 - 990 -224.333 818 -412 474 -412 c 0 - 392 -420 298.667 -405 194 -367 c 1 - 194 -188 l 1 - 299.333 -245.333 383 -270 445 -262 c 0 - 685.667 -262 806 -135.333 806 118 c 2 - 806 209 l 1 - 730.667 77.6667 611 12 447 12 c 0 - 343 4 249.667 60 167 180 c 0 - 95 285 59 416 59 573 c 0 - 59 731 95 862.333 167 967 c 0 - 249.667 1087 343 1151 447 1159 c 0 - 610.333 1183 730 1117.33 806 962 c 1 - 806 1132 l 1 - 990 1132 l 1 -449 1550 m 1 - 660 1550 l 1 - 660 1296 l 1 - 449 1296 l 1 - 449 1550 l 1 -EndSplineSet +HStem: -412 150<337.653 757.867> 12 154<428.102 635.867> 1005 155.41<408.153 635.294> 1296 204<453 657> +VStem: 59 190<418.733 726.4> 453 204<1296 1500> 806 184<-211.333 209 431.6 740.133 962 1132> +Refer: 228 729 N 1 0 0 1 0 -52 2 +Refer: 72 103 N 1 0 0 1 0 0 2 EndChar StartChar: hcircumflex Encoding: 362 293 312 @@ -7965,20 +6576,16 @@ StartChar: lacute Encoding: 363 314 314 Width: 618 Flags: W -HStem: 0 21G<177 361> -VStem: 177 184<0 1556> +HStem: 0 21G<177 361> 1664 375<115 352> +VStem: 115 459<1664 2039> 177 184<0 1556> Fore -177 0 m 1 +177 0 m 1xd0 177 1556 l 1 361 1556 l 1 361 0 l 1 - 177 0 l 1 -115 1664 m 1 - 352 2039 l 1 - 574 2039 l 1 - 299 1664 l 1 - 115 1664 l 1 + 177 0 l 1xd0 EndSplineSet +Refer: 114 180 N 1 0 0 1 -334 362 2 EndChar StartChar: uni2219 Encoding: 364 8729 315 @@ -8048,29 +6655,10 @@ StartChar: rcaron Encoding: 369 345 321 Width: 888 Flags: W -HStem: 0 21G<114 302> 949 164<534.695 679.003> -VStem: 114 188<0 929.6 945 1117> -Fore -706 1104 m 1 - 706 915 l 1 - 691.333 937.667 659 949 609 949 c 0 - 404.333 971 302 851 302 589 c 2 - 302 0 l 1 - 114 0 l 1 - 114 1117 l 1 - 302 1117 l 1 - 302 945 l 1 - 366.667 1055.67 484.333 1111.67 655 1113 c 0 - 676 1113 693 1110 706 1104 c 1 -298 1291 m 1 - 53 1667 l 1 - 192 1667 l 1 - 372 1422 l 1 - 552 1667 l 1 - 691 1667 l 1 - 446 1291 l 1 - 298 1291 l 1 -EndSplineSet +HStem: 0 21<135 323> 949 164<555.695 700.003> 1291 376<101 346> +VStem: 101 638<1667 1667> 135 188<0 929.6 945 1117> +Refer: 226 711 S 1 0 0 1 -112 29 2 +Refer: 83 114 N 1 0 0 1 0 0 2 EndChar StartChar: sacute Encoding: 370 347 322 @@ -8229,8 +6817,166 @@ Width: 1000 Flags: W TeX: 0 0 0 0 EndChar +StartChar: Iogonek +Encoding: 377 302 332 +Width: 990 +Flags: W +TeX: 0 0 0 0 +HStem: -356 123<432.447 598.968> 0 152<92 280 478 670> 1337 152<92 280 478 670> +VStem: 278.914 139<-220.733 -108.4> 280 198<152 1337> +Fore +353.914 0 m 1xf0 + 92 0 l 1 + 92 152 l 1 + 280 152 l 1 + 280 1337 l 1 + 92 1337 l 1 + 92 1489 l 1 + 670 1489 l 1 + 670 1337 l 1 + 478 1337 l 1 + 478 152 l 1xe8 + 670 152 l 1 + 670 0 l 1 + 477.914 0 l 1 + 437.914 -60 417.914 -107 417.914 -141 c 0 + 417.914 -202.333 454.247 -233 526.914 -233 c 0 + 569.581 -233 611.247 -223 651.914 -203 c 1 + 651.914 -336 l 1 + 599.914 -349.333 554.581 -356 515.914 -356 c 0 + 357.914 -356 278.914 -296 278.914 -176 c 0 + 278.914 -124 303.914 -65.333 353.914 0 c 1xf0 +EndSplineSet +EndChar +StartChar: iogonek +Encoding: 378 303 333 +Width: 618 +Flags: W +TeX: 0 0 0 0 +HStem: -374 123<190.533 356.415> 1100 20G<127 311> 1323 233<127 311> +VStem: 126.999 49.001<-159 0> 126.999 184.001<0 1120 1323 1556> +Fore +126.999 0 m 2xf0 + 127 1120 l 1 + 311 1120 l 1 + 311 0 l 1 + 247.653 0.00390625 l 1 + 200.986 -66.6631 176 -121.667 176 -159 c 0 + 176 -220.333 212.333 -251 285 -251 c 0 + 327 -251 368.67 -241 410 -221 c 1 + 410 -354 l 1 + 358 -367.333 312.667 -374 274 -374 c 0 + 116 -374 36.999 -314 36.999 -194 c 0 + 36.999 -137.333 126.999 -94.2363 126.999 0 c 2xf0 +127 1323 m 1 + 127 1556 l 1 + 311 1556 l 1 + 311 1323 l 1 + 127 1323 l 1 +EndSplineSet +EndChar +StartChar: Umacron +Encoding: 379 362 334 +Width: 1513 +Flags: W +TeX: 0 0 0 0 +HStem: -29 164<523.867 886.133> 1694 158<337 1084> +VStem: 166 191<418.199 1379.68> 166 198<1119.99 1489> 1042 201<417.44 1489> +Fore +337 1852 m 1xc8 + 1084 1852 l 1 + 1084 1694 l 1 + 337 1694 l 1 + 337 1852 l 1xc8 +EndSplineSet +Refer: 54 85 S 1 0 0 1 0 0 2 +EndChar +StartChar: umacron +Encoding: 380 363 335 +Width: 1311 +Flags: W +TeX: 0 0 0 0 +HStem: -29 160<434.533 633.867> 1100 20<817 1001> 1281 161<190 942> +VStem: 127 184<332 1117> 817 184<0 172 347.2 1120> +Fore +190 1442 m 1 + 942 1442 l 1 + 942 1281 l 1 + 190 1281 l 1 + 190 1442 l 1 +EndSplineSet +Refer: 86 117 S 1 0 0 1 0 0 2 +EndChar +StartChar: Uogonek +Encoding: 381 370 336 +Width: 1513 +Flags: W +TeX: 0 0 0 0 +HStem: -365 123<876.533 1042.42> -29 164<523.867 803.346> +VStem: 164.2 192.8<386.133 1379.68> 166 198<499.343 1489> 710.5 151.5<-229.733 -133.377> 1042 201<397.166 1489> +Fore +927.859 -0.25 m 1xec + 883.859 -65.25 862 -115 862 -150 c 0 + 862 -211.333 898.333 -242 971 -242 c 0 + 1013 -242 1054.67 -232 1096 -212 c 1 + 1096 -345 l 1 + 1044 -358.333 998.667 -365 960 -365 c 0 + 802 -365 710.5 -321.844 710.5 -201.844 c 0 + 710.5 -149.177 735.5 -90.5107 785.5 -25.8438 c 1 + 759.693 -27.9658 732.983 -29 705 -29 c 0 + 344.467 -29 164.2 146.798 164.2 498.392 c 0xec + 164.2 518.676 164.8 539.546 166 561 c 2 + 166 1489 l 1 + 364 1489 l 1xdc + 357 595 l 2 + 363 434.333 380.333 323.333 409 262 c 1 + 467 177.333 565.667 135 705 135 c 0 + 844.333 135 943 177.333 1001 262 c 1 + 1028.33 336.667 1041.54 444.001 1042 584 c 2 + 1045 1489 l 1 + 1243 1489 l 1 + 1243 560 l 2 + 1244.2 538.546 1244.8 517.678 1244.8 497.396 c 0 + 1244.8 173.753 1233.94 24.916 927.859 -0.25 c 1xec +EndSplineSet +EndChar +StartChar: uogonek +Encoding: 382 371 337 +Width: 1311 +Flags: W +TeX: 0 0 0 0 +HStem: -356 123<895.808 1061.69> -29 160<434.533 633.867> 1100 20G<817 1001> +VStem: 127 184<332 1117> 742.275 139<-220.733 -107.533> 817 184<0 172 347.2 1120> +Fore +941.25 0 m 1xf4 + 897.25 -65 881.275 -106 881.275 -141 c 0 + 881.275 -202.333 917.608 -233 990.275 -233 c 0 + 1032.28 -233 1073.94 -223 1115.28 -203 c 1 + 1115.28 -336 l 1 + 1063.28 -349.333 1017.94 -356 979.275 -356 c 0 + 821.275 -356 742.275 -296 742.275 -176 c 0xf8 + 742.275 -123.333 767.275 -64.667 817.275 0 c 1 + 817 0 l 1 + 817 172 l 1 + 729 38 620 -29 490 -29 c 0 + 368.667 -32.3333 277.833 4.33333 217.5 81 c 0 + 157.167 157.667 127 274.333 127 431 c 2 + 127 1117 l 1 + 311 1117 l 1 + 311 438 l 2 + 311 332 329.167 253.5 365.5 202.5 c 0 + 401.833 151.5 456.333 127.667 529 131 c 0 + 609.667 131 678.667 164.667 736 232 c 0 + 790 294.667 817 379 817 485 c 2 + 817 1120 l 1 + 1001 1120 l 1 + 1001 0 l 1 + 941.25 0 l 1xf4 +817.276 0 m 0 +EndSplineSet +EndChar EndChars -BitmapFont: 11 332 9 2 1 FontForge +BitmapFont: 11 339 9 2 1 FontForge BDFStartProperties: 36 FONT 1 "-FontForge-Tahoma-Normal-R-Normal--11-80-96-96-P-62-WinRoman-0" FONTBOUNDINGBOX 1 "15 11 0 -2" @@ -8644,24 +7390,24 @@ BDFChar: 187 254 7 0 5 -2 8 ^qdb\bfn;TpqXZF BDFChar: 188 255 7 0 5 -2 7 bQ,l2G^(nr?sis7 -BDFChar: 189 259 8 0 7 -2 7 -(`5@tAq"@0"pY,. +BDFChar: 189 259 8 0 6 -2 7 +3&k_jD#VGo"9ni+ BDFChar: 190 260 7 0 5 -2 5 -E!U]EM"hN$ +GRSuDb^9[) BDFChar: 191 261 8 0 5 0 10 ":+ue7"BfJ9W1j +BDFChar: 196 268 7 0 5 -2 7 +r4p,C^qdb`#Rg\5 +BDFChar: 197 269 7 0 5 -2 5 +Gg-*$b]j[9 BDFChar: 198 270 8 0 6 0 10 ,T$MD6@aTHJjMR" BDFChar: 199 271 7 0 4 -2 8 @@ -8826,8 +7572,8 @@ BDFChar: 278 328 7 1 5 0 9 :a#O`JG=YFJG9*E BDFChar: 279 329 7 1 5 0 10 :`oc5J:REFJ:RCp -BDFChar: 280 330 7 1 5 0 9 -+9;1eJFJ)>JG9*E +BDFChar: 280 330 7 0 5 0 9 +&-2XD_"b^\_#+04 BDFChar: 281 331 7 1 5 0 9 n,W66JG=YFJG9*E BDFChar: 282 332 8 0 6 -2 7 @@ -8878,8 +7624,8 @@ BDFChar: 304 354 7 0 4 0 8 #VZ7'8GI^#2uipY BDFChar: 305 355 7 1 5 0 8 TKiKrM"lLNGQ7^D -BDFChar: 306 356 7 1 5 0 7 -+96A:pjdm> +BDFChar: 306 356 7 0 5 0 7 +&--t!r4pO$ BDFChar: 307 357 7 0 4 0 7 GQ;tZpjbVS BDFChar: 308 358 5 0 4 0 7 @@ -8930,8 +7676,20 @@ BDFChar: 330 31 12 1 9 0 7 s+%q9_19@P_19@P_1;Q9 BDFChar: 331 127 12 1 9 0 7 s+%q9_19@P_19@P_1;Q9 +BDFChar: 332 377 5 0 3 -2 7 +n6fX3?smC3+>t3bfn:Y +BDFChar: 336 381 8 0 6 -2 7 +`l?$<`l?#G#Rg\5 +BDFChar: 337 382 7 0 5 -2 5 +bfn;Tb^9[) EndBitmapFont -BitmapFont: 12 332 10 2 1 FontForge +BitmapFont: 12 339 10 2 1 FontForge BDFStartProperties: 36 FONT 1 "-FontForge-Tahoma-Normal-R-Normal--12-90-96-96-P-70-WinRoman-0" FONTBOUNDINGBOX 1 "16 12 0 -2" @@ -9305,7 +8063,7 @@ BDFChar: 166 233 8 0 6 0 9 (bbr;`lA"n`d@ad BDFChar: 167 234 8 0 6 0 9 3,ASB`lA"n`d@ad -BDFChar: 168 235 8 0 6 0 8 +BDFChar: 168 235 7 0 6 0 8 C]Jk&`rA +BDFChar: 194 264 6 0 5 0 9 +fPgh<^qdb$^jH+^ +BDFChar: 196 268 7 0 6 -2 8 +rkQ=brkQ=brWEE* +BDFChar: 197 269 7 0 6 -2 6 +I)a2*^rCa-$ig8- BDFChar: 214 140 13 0 11 0 8 5O`.__Z7RS_skPD_Z40H5O\XQ BDFChar: 215 156 12 0 10 0 6 @@ -9405,6 +8173,10 @@ BDFChar: 252 128 8 0 6 0 8 5%)2*_#D,W4obQ_ BDFChar: 253 153 12 1 10 5 8 r4m6dDnp2) +BDFChar: 280 330 7 0 6 0 10 +&-2^F^qfrb^qfpL +BDFChar: 306 356 7 0 6 0 8 +&-.*t`rJcLB&KCFHmJcJ+;5O\XQ BDFChar: 215 156 12 0 10 0 6 @@ -9884,6 +8680,10 @@ BDFChar: 252 128 7 0 5 0 8 4@"GpJGap_49,?] BDFChar: 253 153 11 1 9 5 8 k^ZBX8q9H_ +BDFChar: 280 330 8 0 5 0 10 +&-2WYJ:RQJJ:ROt +BDFChar: 306 356 8 0 5 0 8 +&--s.K`$@RGQ7^D BDFChar: 313 173 5 0 3 4 4 n,NFg BDFChar: 316 183 5 2 2 5 6 @@ -9894,8 +8694,20 @@ BDFChar: 330 31 13 2 11 0 9 s1j.MJ3\WMJ3\WMJ3\WMJ3a.M BDFChar: 331 127 13 2 11 0 9 s1j.MJ3\WMJ3\WMJ3\WMJ3a.M +BDFChar: 332 377 6 0 2 -2 8 +i'9Om5X7S"i':ZM +BDFChar: 333 378 4 0 1 -2 8 +5QF&75X7S"5_)*" +BDFChar: 334 379 10 0 6 0 10 +HiSbMJqAT+Jj_Qu +BDFChar: 335 380 8 0 5 0 8 +quDD'KS5#;F8u:@ +BDFChar: 336 381 10 0 6 -2 8 +JqAT+JqASB3!]om +BDFChar: 337 382 8 0 5 -2 6 +KS5#3KT(!Y$ig8- EndBitmapFont -BitmapFont: 15 332 12 3 1 FontForge +BitmapFont: 15 339 12 3 1 FontForge BDFStartProperties: 36 FONT 1 "-FontForge-Tahoma-Normal-R-Normal--15-110-96-96-P-85-WinRoman-0" FONTBOUNDINGBOX 1 "19 15 0 -3" @@ -10265,7 +9077,7 @@ BDFChar: 166 233 8 0 6 0 11 #RCtA3(/AtJ:KsK BDFChar: 167 234 8 0 6 0 11 &1BpH3(/AtJ:KsK -BDFChar: 168 235 8 0 6 0 9 +BDFChar: 168 235 9 0 6 0 9 ,QKelK)U:N69G5J BDFChar: 169 236 2 1 1 -3 -3 z @@ -10307,6 +9119,18 @@ BDFChar: 187 254 8 0 6 -3 11 J:N0#\AWuNJqA[NJ:N.M BDFChar: 188 255 8 0 6 -3 9 ,QNFJ6prFO&.fBq+92BA +BDFChar: 189 259 10 0 7 -2 10 +(`4MD,U>^*6@j[h!rr<$ +BDFChar: 190 260 9 0 6 -2 7 +4@0*56@sr<"9ni+ +BDFChar: 193 263 10 0 7 0 14 ++qt:_*[*e!J:N0#5Tq0K +BDFChar: 194 264 8 0 5 0 11 +6mrTH3(/:IJ:L$I +BDFChar: 196 268 9 0 6 -2 10 +rd]NLrd]NLJ:RV%"onW' +BDFChar: 197 269 9 0 6 -2 7 +3(/AtJ:KsK#Rg\5 BDFChar: 214 140 15 0 13 0 10 +8fOI5lcH9Jc('!JH16$5lb4TY`g EndBitmapFont EndSplineFont diff --git a/fonts/tahomabd.ttf b/fonts/tahomabd.ttf index 021102adad19dfc85a8030ed82c9bf4e32d21dde..a4e4a3780eb6c050b974f985972a980f5fd54f88 100644 GIT binary patch delta 7053 zcwV(xdt6l2_TPKXb7sykXJBR+Uc(Fw!+@nEAgH8>h?t6`sA#C*10SK1qG53zL{l?= zW}ZGqUaz8g%go9eGH!Wo6!rEnAHQ2>W=LvWO)D%l6K3YFedd5z|NegS;XCJ?wbx#I zt?yoY?R|#zzfsrQsEy|7>#iWAj~$kiTQu>z=rDw~@Caq!8J06@=<7CPIYQqcge--5 zc}1f~T)zBQgnlgqLG9q^npyl~98Gbh555priEq}@Gy-1wX!ujIc8 z?Q>qJj&)Zf#I(+sUsm})bsr=lq$`H!%o$6oY$%s8AQZY0jL@^o7FVKh#6c$`Jd3j{ zmX%-lumT1#fzhI-IkU=UmaW?R3_^GmwD+3>f>5jQ3p}raXUClRRn`C4R&yL7l?&__ zRxF%R){^t_W^gL>MG)?pUshd-UqSnz!*1wcTTnKC)~#C`>JgfI2ceJ=l?xYFb+`|L z@#I8-U}|OlDmF0%ju0p)*kdyABPc zucLa}iv}{cfiyK5$PPgQV?rF&61WOIim4Wq0oMy~9V)dmuizZ%MRv@CyO^tJ7u^B< z2|h*rWq?fr27%0b50c2Grq80SC|Av*ozysFWMYwDYr6Y38W!{&r-3p*0_Mc74SzHx$at#P;Ul(Ew!nEIKD zOr@r3(*~2*bkS@!PcZK^?=?4>kC;!H&zrA=yTS{@w}tNs-yeQB{6zS<@V0RGFX4Vm zKTD3Kz%toVZdqhmZfUTzS$?tjBQz1_h`5N{h*c3ABeq8Dj%bYVMjVfHMV3b{id-JK zE^>3^-pIp|=Ob@MWk%&j6-Jdr&55dts*Tzb)e`kX)a__hbVzh$^r-0K=$X+Qqt8cQ ziM|0hIo3Ps z9lIQ#I?gyQI(|y9B|MOjnUI?>GvQ#urwL~gE++hxaM#H?L!DM^#b#y z*AvzMkUAL}`Ufsi6PSNPgM(^j{_RD9K;SlbbcPQHXNN(z=fIHDvw7$VYyo{JQ}jSS zS#B%9+n^1~t+Z=ceknBOLw(!EeN7qzg?KbH_J(y6KqVl5i)#eG;92C56o|u#Anyh8 zt2|5OaYSAb7>k#J9BQAckt^=jUlS<6OQetUs$JY(Fun}c$i`D;<2ixvm^ply>`^IR z1M)QRsB?IJcvmAg1sd0&m+@0_qjW9*v>DoV1uoIwazDx)kK!_D8{i3f#EJ7{S}s%X z0+Xa|ci~D9|r5z3IJpVepR8~fytjc4j^;Av;4ZfaP(7RSHebmVMX!~TyO7}@%Ie=WxT0O>;o$d;JKT$1f;5sD#0 zgr%oKil>_X-XwhHtN)C2Vl1D*N1FKP4!6wSMLJd{yhtW?*iYva!ijuVw_Lh$wuhWB zT5*d^TT%A}5&5)k{blB!a&xzQ&D~VuEZT-580p%$_lOVfz(wk+?87jY*qp4`yeF5a zvwxB=AU^n7{vVmLbY@cS42 zBc-iL7LK-KpPwq1_9w+k&rJG?*v}2L(6_iPV8@4E$78|H1Hq*8mr*TjK8)*=se@H3 zEq(0O2cUvn1qx~IO|n)4!*M~d5J1|%iA%MZoeKPh2UASiSYj-zJAl)dEgo9JhEC6% zy9Dm0EFLtAp5C#Iow~g)U8Tv`@V96B4V5X$fUl!m78uYY6b2=dv76!zat;~dGgKRV zFR608Uf;n32iTokww$i-m{wm;?~rs;dXZ`XHdOC%OGzYwskpc7mgJrigK6n+Q^IL- zW{?`Ej2urPb&wwnF4|41jAI|P`TliG^)j7|fAE_-&M;rz{c=xmlAeQ56If$#)pYg2 z`wzZz-k;M%C*Ys`hK_Go}jz4Hb9>M@}Rp!E={fMYwaqT zj9<>I{asZS`~$g^{KQoJoAm4x15I72&s+sXKmJ-yeJN>?ds=rzq=|{X2mVwkmxKI~ z;1(HYxhH2@iKXaM-4&El)bO z-rZTav*I!D*|~2|R2`l9s!6|J8e8>X2!l*y4PZNHabeP$DwkT-K>7(RW zo-r@;VPEHmQfqP&oZuy4iN(~l$e8oQFLYd9WYT*}J|djYg1NiIu7sA(jWN(N5%!hC zOJBooj7t1lRolSn2!xU_SsCfURT9sdjH!JyOl*8ydK#YYzkA>SSuWnJ`PmN_4EPaN zNyW61&bk{VZuf#OsAoH;`8=|7az$l!2J1;MbyHmiqdB8*M!$68YdRaxIuDYm z8r(F0{;~;=HZ`qk-v1u6b4TY}67FMklh>qOeu@4T=z*GpBlf2)yH+S-n*y;EC{lGYLv%=JBzTqb){lU*wt&rElM{4AR0b z&sS99w(68p@9}mugVgLdwVg98)jaf5YfP8(Ux>@nu!!dZ!k}hhFrOluczSUA=ijlO zKJN}t2`tiZqQ1TPdP;Mb!Pmeobh6A)UY_uo62tDzCk+%7L)7_U(wo;n%WsNs-? zuc542)i*93yTcRxYT?(DSr;_K+kZVz8V>Rnd8m_F#9Pnm{r^;B&XeoaV>i59t2s+n zR#tiW^5$lmg*Q-+t4_IaGUKoya7Z8#-L|BZ9$K-Y9h}jyUwdPlg_J|>ft9TOPD-ht zw;+5w%iTVsMob|Ta3bXwEQ4DQt-K>D4O$wg0H@1;Nztm1nm!r048v;G%TaURX8BW| zrRI=Y3FAM@iBsz4t|oAbL!2DSvI}*rXVRf8HRh$wpI&tfgyj5qQ&O&7tcB6lYSFeM zH-Gz(I^IGe;j6`It21)sNYsuLd^yFIy#lLSNhDmp*ILKhRz=02E|&~CE2TvO;>B>Acl>fsZED?H8m=M@Kd+86-HF^oqXA9%Zw`G zjAkWEns#Q2DY7%GEoH~0+$C$s)DB6aokPgV#SS${Q!|ljf zp0i?wiXzFP&RV6unNs#oTF`?XO`MTOR(p0W`DELzkedRZy94#N*y`wlfQr_)1DDht z8*JS8NTJ(XyQ)3g3uEcjBGt)@gT3H|zEwmQU4vV*bEjgqd9ic>n1g$`?u;ttN9D_f5ql?9;Hk%}cS|i6?+WZu6OA*yb)EXF! z@C}A2*hF51>IUgpAWR9IH)I9~AM#f%kU&9M&djZ=^VinqWYIk9mZ`H?P){{W3J_Ep zAc?1^u)qTgBbHe76cU(xxJ|HxXi$jYuH{)=TWV3hvY+>oMWR`bRs=soA0~ka_cUrt zjeI9KY7t<$Xo5;+P$OOie-mQ>ci>Vlo%%lBJx;5IBMD+R!ubadrbzx-P2)GnKavS> zre*I6_kJ*=@Hjyr`kE`CUrkhHeV?A_;Gn+lK7E~z=<7>+>I=RwSzqs)4ln$_>+kEJ z*OLxmXM1+g`Al*L5eDF)g!I%GMbO9cZ(XpL$U&ySUP!|=8?jKOzi4}#a?eFbT?MEE ztOxuR@G9V4z(;^j0bc{Y2mAu?!^m*{)r10~0C4QlJP7Cqco+buXw7KAcmTwvnGFE@ zFf&NA7O(;EB47((2SRSmYjE=>;2(gafRg}ti_^e>nsxvjh_x^^S`iQpNC5N!^al(9 zz(GVi2{03|2v7@vL9`Hv_I1F1z!AV{zy-iHz;8e`B%>fAHxj_80B2nR3<|>m;{ekD zj{}|rtOjfXYy<2Cdx0$cPEt31E_hv)5{>g!KaZeUgOZBP_Zqo}}4p%{?BtVNJ+8dBal9}*P3Hx)g-qH_T5 zdG-A|M-&|`07xaLYsg*_7eb?z7z>fgEeBbuq;(~D*8j#h$B zQDV+kVlD~}8fj1lRbq?`|HE^P@=Sg5 z^`OQ<=u&ItT@dLMy$y<9h@!Im}&3CE_$Rx2{{ zf0no)9S@Ozi3qT3YSo=UZ&1&x=ou6p$Ve#guq$@y05uPtQ*9;`f*H0!O%=6mk^MzTq_B`C<|6eaQx3YQ}5)1#v^7yMJ}|HQ!~eoKmWN$C_*olA>`DUI{vBTp}W%FhVOT5UKD7a zju3rmMoC_2#op$52)QIdJAB5%G7U#fu9Aj2lyc zfE=M2xkWSc3i2wO79)g5!}oDT@W4I9`3AJtKwDo_Qnu*Tp-c1#5g{Nyu6XW@Jo$UK zD-bff18btDByUkE-ih|XfJPXgnUhyC^VY4(DufmlA>=x;bnb$(>#H56A+&Bk2-t!! z5Mv7qRcM&#B8*fm~Cwbe9aZm;|C;CZ5MtyNq;;!UOOiJQSzmOq`3Sa=*Ex$*rFtWNmq1 z7H*VlS~A#Wwg_B`=i_B~72brmNj9so0shzHM%*ObHQDXi*u%E#Dcg8)*eYX2v_ix;P_DJ@~ z_Gt3BqLeAUltyKRvRc`pys1*El2nN53y^#!j`uTfq(Uin^gyehn^yvzr^E_f@wHQo!oS9w=@S9|~LBlpSiS>aRRQ{_|d zv(M+Wue)!S?-t+lzE}K=e$jrFejWZY{}KM{{Ezux@c%8qIY1v!6i^n>6mTstD6ntf z?7%gFp9cP_@zSJdN;TD*4o#OZa-ff+x*-_J@7Dla#s*I|RYKUr%`X=gHzqEeK`fcd9wO?(&Cd*(|Tc8;hScdg`Y8G3H z7zD`%>qwJ2-sGV&>NF~)+A|P)sy$V5ZIB_>)1*#FFDe z>a;J)F>^Xz=G7--X6sj_`J6g-ODcg9AZZC~32=e@ge58@tyN*IN*jx{#9>L{nXdEH z-?}o%yf|PT^s~d)wRFRdw_^LFhWj&m&&OGhw-Y z(*I)z(QX5*-;+5oC=lsjP^?L%WEnTih*mR2$Ez4!kZ7qPI4&OkJU}R}ITRF_Ik99^ zQsK^{ttZ|oSyGp4Py{%-963pzSh}M)Wysjv*%R~PqF!vBH(}bI%AGj|r6EvH%oPNL zNQwM;_AMaEpafS?Y4XrvC+vVt;503XgFZO&DjstAy08QbS22HTJ%4;X`<8I0vynK; zC-Cpl=kA5!T4B0nZ}R6j2_^tpno3|>L72QCG1LNd9F*AaX8r-*OaR^iUw z(e$Z(LeW0{%YEF|lr+%_lf`X-eby$#1B9?zl}=#-f0-1z(hrVpzegk=KFl9#ZDpSo z?rf>*oK{suy)L;!8oQU>5ANtIxr4I?;b4#%2G4(#(Z~t8gUlZCMEOow_kvyIl-9Su zx>kGO(^~qJT`tiftiV{X0v*`Uh*mZi?pWjjV!%Nr0Nq2}==Rg?{IUD|n3urY?XBGm zxy0d%f@K)knIv|@Q4$0TiIT0C=_2+GxC=z_Hp9`}hq@pZuM|C?<1Xu>Y4#1_&T&qq zkL4~52Rl(P>IyxRog&fEpaHgs0TwD8Gnh7MkU~kg61t$iG>#rj#>Vu8dskYe3?Rvv zcD|~ezZ5ZY)|}OI6JZ;eoxP@c@1&CV*UTCkrXcDE%vqE>FlyF;<)ImqGDgM(dM7{g z7PCd1OIPyC*I!?n8Xn>%S+rND1GvW>|zuu$;m~LK4tG7<-r$?plpFfM;}yDCSUAR5xz-dL6KsSpW8+L3JnJa-c{Ov-o1>Qx8a#7*&Zs?m7Tn%-5TE;Z z_UIQaH6JwMHl|S6$Pf3A-cm52|MEF?&++D_pIw&wv8{;T%Zc4B2O ztMe`0EXahD@Ua|9%fP8%hXm`Fl$@CjcV0*+cilwqqG)UvIA4@*aM9V!`Ab z)UB!Tz9w+F!;>}PbCR!dU2k2*b`KZ*zuF4GzrJAAZvQ?};qNxb5?gvJoJ-xbdvo^V zR8n@0K2l=wLxvuS<%vp(mF@iAb|SsEPBWb;I*Ml=r;)JcgN|&;cTiZ6;_jm`DQZOj zIJb!I=yay0ch-vMMgl=;LCj#L+xmLIaufTmkqlhlLj534uhUEFPFUL!O^lqxya>i~ z1i>DX=^*S>YoQf3d))iOu7R|E4GLKLilo2^Aro}JAF*$=2+P{5+QqK4mpCad zIQ?~78v33ZB!z@K3b3Uivd03H2OISowWpkAz;N<-{INK-j)v?J!?WIcBO3}gVKNrh zFI%==AmG24c!Xcd7c^Vumsc#n`3ov`?5XB|tKPGxnsBW~sFyx-fGzDjQK4j?z{hE{ zg`x28C+O@}nh(ZQiE)qZ=A7~by?!=3Z+)!d>o)TXw;rdOa~th#mQstTTq$|Q69qj8 zN{`2@CmO|w9Q!!sbovSS2wR_M=^ErsbE%`>6;CE+;Lu01y2|Eb46z}XGA!JPnNEYx zh_2-eTkdSn8Q0RX=Bn_#=+3T_L<65Ew9TCQ8nLvqw&{cv%6~x~aRdDJs?gM8en{Yk zu8t=OWW+MhmMH#A=3>byQw15Z0GGX9akUa#8iPc106fLkVI5~d& z7Or?wKi_bzknjnfil=@ea=y2_VaSx~LE6%6Dx+&FS~#c+Vqf;=jb_qMxFjvymKp%VlVX+N@S5Ftn| zdtc4NhRkPr97^R^m>cf%{8Xm|SJq|hnc75)R~cox$q&%*ti!U}uQbh~Rc z6zw}J&wVJg3Ev9e2_JuWW)t3yxWQu$MQ*Ug1d5xs&8dvIhT`I*-Q`9dm`$$sjE{yz zPm;!#mif1~FE1`$zWvtx+Ulv}lasTiRpUc#?_D83Ag12E*?5$0-G#r|)k=5$hS&T` zy*yvoF~5=~U&FjW!a4XKW4|`rCP`0(+Ds;`XOn0#6QhBeAy%t^nc4Rk+msb@Z8SkI z^lhvUT&Uy^5Q~Kag!@mzAz}N`j}Co;i*U%LE5Z%_pM>EoTQYaNb^M|4br;-#foPINwrcusbEkP6ddaruTjL>3ofzR@>Itv zYzHSP*~CNq++67S_FFy+t6%$DJ@FggwR36B6g+F*?fSCf;x$`W?~O}Ne>?Z-#MQa8hm0pZCPz;%E}bnuF0 zTH0m^>vuro5Bd}rniY@=qO#%HF?Jz{QuY#M^BSQky)Vzt<`D>w2j$zKZQF#)+_Wrz ztl^etsky4G^f9zpl#Ba16r~W)RmX@|g`{H#uR%R~ZZ{Q*uM3{iEXpBR4E8-o>JNu6 zvb<%%p?5AY%DXoy1O7!&So)9e@024})7CpsO)r<+2IXOoLfYd#Q!@48VtVO9b<=Kd zDV~QuTvD@ZCEn|%CYo)<_5u3*y-@tRFwJJ*Wb6M?O)>`*fnq?FQO{ByN>zYN?P*ZC z;^4kiY|LObJ}v;OJ=NG&;!;h^1Z$Bn*a;I(Zkn)^@ntDrVAXtU+3Itz6h@IQ>d2&m zrEkwnU%ysw7{-5OD}$+3MdoLm`}5xtq&|Gwu)GnOabYsAuWybROfgv-Kf1J1pR^!v z+03GmF)Xc!lFNgLDtoysl1#V$K)uW6KrJ5q1d?hyOO=j#_fIIAALW>pn6lQOAI3L! zbWp2{{tCbJ7@CsFM1uHV9kxBK3L!d-<-u7hDaYy*@lcQ|;0OT;2o4bnI7MhZNYgMe z^%6vVJ&xMUah3cGoQ`*%ynOjHp)f<*MsLx5JD(#qzKkPqWW|Pir|GkG2ZXso$-BFl zwRjPnZ8jjzXWBM%_xq8hwq;@J`ECSeU-jV42!Hv^neO)@>{0=Bk4^lOv2f`zw(B5q zgI7HmooIU-i#Vt0Cqxb@){E3Fb|XYiKX|Oy1-TOH019%P(LLD61jiZUw$ z5$u13z?d&PbB0=Sd<56Ed;II$N`r^cY@Z}d3?UiPcZn~iaEXvvGBhQ3ANK!%B*GP2 zL&lCHeiSU%rw2&o{RY?uKbFzb3iOgTLRhaR58V3&0--td;&+{&t-sUd@yKfg87*uO zPnmepz3|@e62w5Lw_c{cWoscPsE`p%rDPdMfiZFBXpflgtvv1#mE^gMjGGx5J8lN$ zCMD5u4UsheXnGREHAA^bcfH)m*aPHyLAvaV}|okMxo6p@3~D!rymm(g+~ z8e)HO^*xu7?<2PzyUAu+KrT@JMQ{^Cf*tVve8Q~^(G28G53)!!;UCM*=pTodiBV5M>x#*bD4eo7}4Wo z1vjUUIzadcR$9Q$oXPXr&d*!2__MTKJF!1@{oC{I3cRj^i=AOMOO@(fs2eHRM}ovR z5l}4#U{iOw7!xPeivgH6#02*h-%q&W?!-vRyDmAm{rzYQRE>8xZ%Rzsh|$%h17o|c z5yc~Qg&E}&BTaq}rupKeW2ePZvIcvucz1kr-RN4kL3r7W$iRuwQ%Edj&XY5IL{3p) zR~k~d$jSH@IVp4$EzvphervmMXVah4`RU9VqEh1VRP6&E4`?`BrT0UkW99Uz|A7Dr z>$%$=PaqIR{L0IpM1dksypFhq1rahg6e7M5#oRjuAxyA#2v)P)PoY|Nj&P0qu4x|U z8WtM0dohoBF%pG5@*=YdB5}0zrd#~k&vs}MpSvPA`-aW?!g=8kJq-1C% zK{-{`!guOVi2YsV&^U6xzccS4^>^d*5n}JUJv6}0O&p*&+f#uHuaXAHL4oX!{GtAGIrPWU z51~*hNt29%=M-F%5ChSpyzqC@JR2d0=K!k#F9F~v>hK2O9l(cx`RUsKq$Zj7zjuLi~?i*uU_d$`2apGt3s?>SB~EZ^aB2X+F5~nu z;Bx@j&FKfgA7ErJOfw&SOusAfMuK;0q+5h0!{(o z#O@3vo$rAwz#%SR6&D|X4iE_di?|F2fJ_(h2lp8OAn5|ua9I!70-4eU1iRD%zzQz= z0fzx60H*=p0&W0q0pMuq3deU>$SJM?cF%g*JsTp1AYA*yQ)s)6vc~~qZ)f&u=h)j8 z>*X@ieB3TA#4fGBJxR`XzjD9(4{|2LpQEhdxE{K0)*P1 zt-Mdm^2hbzb`p`|Kvy>wIm@~r>;F%-iL^YdH1hpk?T_qjs5xP0vOW8$n?&(1Q%Dbq U#GtYsB;;J??_Sg=o+ozx7gUB5DgXcg diff --git a/include/fusion.idl b/include/fusion.idl index 0596192b500..99638383535 100644 --- a/include/fusion.idl +++ b/include/fusion.idl @@ -65,7 +65,65 @@ typedef enum _tagAssemblyComparisonResult ] interface IAssemblyCache : IUnknown { + typedef struct _FUSION_INSTALL_REFERENCE_ + { + DWORD cbSize; + DWORD dwFlags; + GUID guidScheme; + LPCWSTR szIdentifier; + LPCWSTR szNonCannonicalData; + } FUSION_INSTALL_REFERENCE, *LPFUSION_INSTALL_REFERENCE; + + typedef const FUSION_INSTALL_REFERENCE *LPCFUSION_INSTALL_REFERENCE; + + typedef struct _ASSEMBLY_INFO + { + ULONG cbAssemblyInfo; + DWORD dwAssemblyFlags; + ULARGE_INTEGER uliAssemblySizeInKB; + LPWSTR pszCurrentAssemblyPathBuf; + ULONG cchBuf; + } ASSEMBLY_INFO; + + cpp_quote("#define IASSEMBLYCACHE_INSTALL_FLAG_REFRESH 0x00000001") + cpp_quote("#define IASSEMBLYCACHE_INSTALL_FLAG_FORCE_REFRESH 0x00000002") + + cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED 1") + cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_STILL_IN_USE 2") + cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED 3") + cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_DELETE_PENDING 4") + cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_HAS_INSTALL_REFERENCES 5") + cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_REFERENCE_NOT_FOUND 6") + + cpp_quote("#define QUERYASMINFO_FLAG_VALIDATE 0x00000001") + cpp_quote("#define QUERYASMINFO_FLAG_GETSIZE 0x00000002") + + cpp_quote("#define ASSEMBLYINFO_FLAG_INSTALLED 0x00000001") + cpp_quote("#define ASSEMBLYINFO_FLAG_PAYLOADRESIDENT 0x00000002") + + HRESULT UninstallAssembly( + [in] DWORD dwFlags, + [in] LPCWSTR pszAssemblyName, + [in] LPCFUSION_INSTALL_REFERENCE pRefData, + [out, optional] ULONG *pulDisposition); + HRESULT QueryAssemblyInfo( + [in] DWORD dwFlags, + [in] LPCWSTR pszAssemblyName, + [in, out] ASSEMBLY_INFO *pAsmInfo); + + HRESULT CreateAssemblyCacheItem( + [in] DWORD dwFlags, + [in] PVOID pvReserved, + [out] IAssemblyCacheItem **ppAsmItem, + [in, optional] LPCWSTR pszAssemblyName); + + HRESULT CreateAssemblyScavenger([out] IUnknown **ppUnkReserved); + + HRESULT InstallAssembly( + [in] DWORD dwFlags, + [in] LPCWSTR pszManifestFilePath, + [in] LPCFUSION_INSTALL_REFERENCE pRefData); } [ @@ -76,7 +134,31 @@ interface IAssemblyCache : IUnknown ] interface IAssemblyCacheItem : IUnknown { + cpp_quote("#define STREAM_FORMAT_COMPLIB_MODULE 0") + cpp_quote("#define STREAM_FORMAT_COMPLIB_MANIFEST 1") + cpp_quote("#define STREAM_FORMAT_WIN32_MODULE 2") + cpp_quote("#define STREAM_FORMAT_WIN32_MANIFEST 4") + + cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_FLAG_REFRESH 0x00000001") + cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_FLAG_FORCE_REFRESH 0x00000002") + + cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_DISPOSITION_INSTALLED 1") + cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_DISPOSITION_REFRESHED 2") + cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_DISPOSITION_ALREADY_INSTALLED 3") + HRESULT CreateStream( + [in] DWORD dwFlags, + [in] LPCWSTR pszStreamName, + [in] DWORD dwFormat, + [in] DWORD dwFormatFlags, + [out] IStream **ppIStream, + [in, optional] ULARGE_INTEGER *puliMaxSize); + + HRESULT Commit( + [in] DWORD dwFlags, + [out, optional] ULONG *pulDisposition); + + HRESULT AbortItem(); } [ @@ -230,7 +312,14 @@ interface IAssemblyName: IUnknown ] interface IAssemblyEnum : IUnknown { + HRESULT GetNextAssembly( + [in] LPVOID pvReserved, + [out] IAssemblyName **ppName, + [in] DWORD dwFlags); + + HRESULT Reset(void); + HRESULT Clone([out] IAssemblyEnum **ppEnum); } [ diff --git a/include/msxml2.idl b/include/msxml2.idl index 9aa56458cf3..ab10f1407f1 100644 --- a/include/msxml2.idl +++ b/include/msxml2.idl @@ -1,5 +1,6 @@ /* * Copyright (C) 2005 Vijay Kiran Kamuju + * Copyright (C) 2008 Alistair Leslie-Hughes * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -57,6 +58,34 @@ interface IXTLRuntime; interface IXSLTemplate; interface IXSLProcessor; +/* SAX Interfaces */ +interface ISAXAttributes; +interface ISAXContentHandler; +interface ISAXDeclHandler; +interface ISAXDTDHandler; +interface ISAXEntityResolver; +interface ISAXErrorHandler; +interface ISAXLexicalHandler; +interface ISAXLocator; +interface ISAXXMLFilter; +interface ISAXXMLReader; + +interface IVBSAXAttributes; +interface IVBSAXContentHandler; +interface IVBSAXDeclHandler; +interface IVBSAXDTDHandler; +interface IVBSAXEntityResolver; +interface IVBSAXErrorHandler; +interface IVBSAXLexicalHandler; +interface IVBSAXLocator; +interface IVBSAXXMLFilter; +interface IVBSAXXMLReader; + +interface IMXAttributes; +interface IMXReaderControl; +interface IMXWriter; + + cpp_quote("#define DOMDocument DOMDocument2") cpp_quote("#define CLSID_DOMDocument CLSID_DOMDocument2") @@ -1063,4 +1092,890 @@ coclass XSLTemplate30 [default] interface IXSLTemplate; } +/* + * Sax Interfaces + */ +[ + object, + local, + uuid(f078abe1-45d2-4832-91ea-4466ce2f25c9) +] +interface ISAXAttributes : IUnknown +{ + HRESULT getLength( + [out, retval] int *length); + + HRESULT getURI( + [in] int nIndex, + [out] const WCHAR **pUrl, + [out] int *pUriSize); + + HRESULT getLocalName( + [in] int nIndex, + [out] const WCHAR **pLocalName, + [out] int *pLocalNameLength); + + HRESULT getQName( + [in] int nIndex, + [out] const WCHAR **pQName, + [out] int *pQNameLength); + + HRESULT getName( + [in] int nIndex, + [out] const WCHAR **pUri, + [out] int * pUriLength, + [out] const WCHAR ** pLocalName, + [out] int * pLocalNameSize, + [out] const WCHAR ** pQName, + [out] int * pQNameLength); + + HRESULT getIndexFromName( + [in] const WCHAR * pUri, + [in] int cUriLength, + [in] const WCHAR * pLocalName, + [in] int cocalNameLength, + [out, retval] int * index); + + HRESULT getIndexFromQName( + [in] const WCHAR * pQName, + [in] int nQNameLength, + [out, retval] int * index); + + HRESULT getType( + [in] int nIndex, + [out] const WCHAR ** pType, + [out] int * pTypeLength); + + HRESULT getTypeFromName( + [in] const WCHAR * pUri, + [in] int nUri, + [in] const WCHAR * pLocalName, + [in] int nLocalName, + [out] const WCHAR ** pType, + [out] int * nType); + + HRESULT getTypeFromQName( + [in] const WCHAR * pQName, + [in] int nQName, + [out] const WCHAR ** pType, + [out] int * nType); + + HRESULT getValue( + [in] int nIndex, + [out] const WCHAR ** pValue, + [out] int * nValue); + + HRESULT getValueFromName( + [in] const WCHAR * pUri, + [in] int nUri, + [in] const WCHAR * pLocalName, + [in] int nLocalName, + [out] const WCHAR ** pValue, + [out] int * nValue); + + HRESULT getValueFromQName( + [in] const WCHAR * pQName, + [in] int nQName, + [out] const WCHAR ** pValue, + [out] int * nValue); +}; + +[ + object, + local, + uuid(1545cdfa-9e4e-4497-a8a4-2bf7d0112c44) +] +interface ISAXContentHandler : IUnknown +{ + HRESULT putDocumentLocator( + [in] ISAXLocator * pLocator); + + HRESULT startDocument(); + + HRESULT endDocument(); + + HRESULT startPrefixMapping( + [in] const WCHAR * pPrefix, + [in] int nPrefix, + [in] const WCHAR * pUri, + [in] int nUri); + + HRESULT endPrefixMapping( + [in] const WCHAR * pPrefix, + [in] int nPrefix); + + HRESULT startElement( + [in] const WCHAR * pNamespaceUri, + [in] int nNamespaceUri, + [in] const WCHAR * pLocalName, + [in] int nLocalName, + [in] const WCHAR * pQName, + [in] int nQName, + [in] ISAXAttributes * pAttr); + + HRESULT endElement( + [in] const WCHAR * pNamespaceUri, + [in] int nNamespaceUri, + [in] const WCHAR * pLocalName, + [in] int nLocalName, + [in] const WCHAR * pQName, + [in] int nQName); + + HRESULT characters( + [in] const WCHAR * pChars, + [in] int nChars); + + HRESULT ignorableWhitespace( + [in] const WCHAR * pChars, + [in] int nChars); + + HRESULT processingInstruction( + [in] const WCHAR * pTarget, + [in] int nTarget, + [in] const WCHAR * pData, + [in] int nData); + + HRESULT skippedEntity( + [in] const WCHAR * pName, + [in] int nName); +}; + +[ + object, + local, + uuid(862629ac-771a-47b2-8337-4e6843c1be90) +] +interface ISAXDeclHandler : IUnknown +{ + HRESULT elementDecl( + [in] const WCHAR * pName, + [in] int nName, + [in] const WCHAR * pModel, + [in] int nModel); + + HRESULT attributeDecl( + [in] const WCHAR * pElementName, + [in] int nElementName, + [in] const WCHAR * pAttributeName, + [in] int nAttributeName, + [in] const WCHAR * pType, + [in] int nType, + [in] const WCHAR * pValueDefault, + [in] int nValueDefault, + [in] const WCHAR * pValue, + [in] int nValue); + + HRESULT internalEntityDecl( + [in] const WCHAR * pName, + [in] int nName, + [in] const WCHAR * pValue, + [in] int nValue); + + HRESULT externalEntityDecl( + [in] const WCHAR * pName, + [in] int nName, + [in] const WCHAR * pPublicId, + [in] int nPublicId, + [in] const WCHAR * pSystemId, + [in] int nSystemId); +}; + +[ + object, + local, + uuid(e15c1baf-afb3-4d60-8c36-19a8c45defed) +] +interface ISAXDTDHandler : IUnknown +{ + HRESULT notationDecl( + [in] const WCHAR * pName, + [in] int nName, + [in] const WCHAR * pPublicId, + [in] int nPublicId, + [in] const WCHAR * pSystemId, + [in] int nSystemId); + + HRESULT unparsedEntityDecl( + [in] const WCHAR * pName, + [in] int nName, + [in] const WCHAR * pPublicId, + [in] int nPublicId, + [in] const WCHAR * pSystemId, + [in] int nSystemId, + [in] const WCHAR * pNotationName, + [in] int nNotationName); +}; + +[ + object, + local, + uuid(99bca7bd-e8c4-4d5f-a0cf-6d907901ff07), +] +interface ISAXEntityResolver : IUnknown +{ + HRESULT resolveEntity( + [in] const WCHAR * pPublicId, + [in] const WCHAR * pSystemId, + [out, retval] VARIANT * ret); +}; + +[ + object, + local, + uuid(a60511c4-ccf5-479e-98a3-dc8dc545b7d0) +] +interface ISAXErrorHandler : IUnknown +{ + HRESULT error( + [in] ISAXLocator * pLocator, + [in] const WCHAR * pErrorMessage, + [in] HRESULT hrErrorCode); + + HRESULT fatalError( + [in] ISAXLocator * pLocator, + [in] const WCHAR * pErrorMessage, + [in] HRESULT hrErrorCode); + + HRESULT ignorableWarning( + [in] ISAXLocator * pLocator, + [in] const WCHAR * pErrorMessage, + [in] HRESULT hrErrorCode); +}; + +[ + object, + local, + uuid(7f85d5f5-47a8-4497-bda5-84ba04819ea6) +] +interface ISAXLexicalHandler : IUnknown +{ + HRESULT startDTD( + [in] const WCHAR * pName, + [in] int nName, + [in] const WCHAR * pPublicId, + [in] int nPublicId, + [in] const WCHAR * pSystemId, + [in] int nSystemId); + + HRESULT endDTD(); + + HRESULT startEntity( + [in] const WCHAR * pName, + [in] int nName); + + HRESULT endEntity( + [in] const WCHAR * pName, + [in] int nName); + + HRESULT startCDATA(); + + HRESULT endCDATA(); + + HRESULT comment( + [in] const WCHAR * pChars, + [in] int nChars); +}; + +[ + object, + local, + uuid(9b7e472a-0de4-4640-bff3-84d38a051c31) +] +interface ISAXLocator : IUnknown +{ + HRESULT getColumnNumber( + [out, retval] int * nColumn); + + HRESULT getLineNumber( + [out, retval] int * nLine); + + HRESULT getPublicId( + [out, retval] const WCHAR ** publicId); + + HRESULT getSystemId( + [out, retval] const WCHAR ** systemId); +}; + +[ + local, + object, + uuid(70409222-ca09-4475-acb8-40312fe8d145) +] +interface ISAXXMLFilter : ISAXXMLReader +{ + HRESULT getParent( + [out, retval] ISAXXMLReader ** pReader); + HRESULT putParent( + [in] ISAXXMLReader * reader); +}; + +[ +local, +object, +uuid (a4f96ed0-f829-476e-81c0-cdc7bd2a0802) +] +interface ISAXXMLReader : IUnknown +{ + HRESULT getFeature( + [in] const WCHAR * pFeature, + [out, retval] VARIANT_BOOL * pValue); + HRESULT putFeature( + [in] const WCHAR * pFeature, + [in] VARIANT_BOOL vfValue); + + HRESULT getProperty( + [in] const WCHAR * pProp, + [out, retval] VARIANT * pValue); + HRESULT putProperty( + [in] const WCHAR * pProp, + [in] VARIANT value); + + HRESULT getEntityResolver( + [out, retval] ISAXEntityResolver ** ppEntityResolver); + HRESULT putEntityResolver( + [in] ISAXEntityResolver * pEntityResolver); + + HRESULT getContentHandler( + [out, retval] ISAXContentHandler ** pContentHandler); + HRESULT putContentHandler( + [in] ISAXContentHandler * contentHandler); + + HRESULT getDTDHandler( + [out, retval] ISAXDTDHandler ** pDTDHandler); + HRESULT putDTDHandler( + [in] ISAXDTDHandler * pDTDHandler); + + HRESULT getErrorHandler( + [out, retval] ISAXErrorHandler ** pErrorHandler); + HRESULT putErrorHandler( + [in] ISAXErrorHandler * errorHandler); + + HRESULT getBaseURL( + [out, retval] const WCHAR ** pBaseUrl); + HRESULT putBaseURL( + [in] const WCHAR * pBaseUrl); + + HRESULT getSecureBaseURL( + [out, retval] const WCHAR ** pSecureBaseUrl); + HRESULT putSecureBaseURL( + [in] const WCHAR * secureBaseUrl); + + HRESULT parse( + [in] VARIANT varInput); + HRESULT parseURL( + [in] const WCHAR * url); +} + +[ + object, + dual, + uuid(10dc0586-132b-4cac-8bb3-db00ac8b7ee0) +] +interface IVBSAXAttributes : IDispatch +{ + [propget, id(DISPID_SAX_ATTRIBUTES_LENGTH)] + HRESULT length( [out, retval] int * nLength); + + [id(DISPID_SAX_ATTRIBUTES_GETURI)] + HRESULT getURI( [in] int nIndex, [out, retval] BSTR * uri); + + [id(DISPID_SAX_ATTRIBUTES_GETLOCALNAME)] + HRESULT getLocalName( [in] int nIndex, [out, retval] BSTR * localName); + + [id(DISPID_SAX_ATTRIBUTES_GETQNAME)] + HRESULT getQName( [in] int nIndex, [out, retval] BSTR * QName); + + [id(DISPID_SAX_ATTRIBUTES_GETINDEXFROMNAME)] + HRESULT getIndexFromName( [in] BSTR uri, + [in] BSTR localName, [out, retval] int * nIndex); + + [id(DISPID_SAX_ATTRIBUTES_GETINDEXFROMQNAME)] + HRESULT getIndexFromQName( [in] BSTR QName, [out, retval] int * nIndex); + + [id(DISPID_SAX_ATTRIBUTES_GETTYPE)] + HRESULT getType( [in] int nIndex, [out, retval] BSTR * type); + + [id(DISPID_SAX_ATTRIBUTES_GETTYPEFROMNAME)] + HRESULT getTypeFromName( [in] BSTR uri, [in] BSTR localName, + [out, retval] BSTR * type); + + [id(DISPID_SAX_ATTRIBUTES_GETTYPEFROMQNAME)] + HRESULT getTypeFromQName( [in] BSTR QName, [out, retval] BSTR * type); + + [id(DISPID_SAX_ATTRIBUTES_GETVALUE)] + HRESULT getValue( [in] int nIndex, [out, retval] BSTR * value); + + [id(DISPID_SAX_ATTRIBUTES_GETVALUEFROMNAME)] + HRESULT getValueFromName( [in] BSTR uri, + [in] BSTR localName, + [out, retval] BSTR * value); + + [id(DISPID_SAX_ATTRIBUTES_GETVALUEFROMQNAME)] + HRESULT getValueFromQName( [in] BSTR QName, [out, retval] BSTR * value); +}; + +[ + object, + dual, + uuid(2ed7290a-4dd5-4b46-bb26-4e4155e77faa) +] +interface IVBSAXContentHandler : IDispatch +{ + [propputref, id(DISPID_SAX_CONTENTHANDLER_DOCUMENTLOCATOR)] + HRESULT documentLocator( [in] IVBSAXLocator * oLocator); + + [id(DISPID_SAX_CONTENTHANDLER_STARTDOCUMENT)] + HRESULT startDocument(); + + [id(DISPID_SAX_CONTENTHANDLER_ENDDOCUMENT)] + HRESULT endDocument(); + + [id(DISPID_SAX_CONTENTHANDLER_STARTPREFIXMAPPING)] + HRESULT startPrefixMapping( [in, out] BSTR * prefix, [in, out] BSTR * uri); + + [id(DISPID_SAX_CONTENTHANDLER_ENDPREFIXMAPPING)] + HRESULT endPrefixMapping( [in, out] BSTR * prefix); + + [id(DISPID_SAX_CONTENTHANDLER_STARTELEMENT)] + HRESULT startElement( [in, out] BSTR * namespaceURI, + [in, out] BSTR * localName, + [in, out] BSTR * QName, + [in] IVBSAXAttributes * oAttributes); + + [id(DISPID_SAX_CONTENTHANDLER_ENDELEMENT)] + HRESULT endElement( [in, out] BSTR * namespaceURI, + [in, out] BSTR * localName, [in, out] BSTR * strQName); + + [id(DISPID_SAX_CONTENTHANDLER_CHARACTERS)] + HRESULT characters( [in, out] BSTR * chars); + + [id(DISPID_SAX_CONTENTHANDLER_IGNORABLEWHITESPACE)] + HRESULT ignorableWhitespace( [in, out] BSTR * chars); + + [id(DISPID_SAX_CONTENTHANDLER_PROCESSINGINSTRUCTION)] + HRESULT processingInstruction( [in, out] BSTR * target, + [in, out] BSTR * data); + + [id(DISPID_SAX_CONTENTHANDLER_SKIPPEDENTITY)] + HRESULT skippedEntity( [in, out] BSTR * name); +}; + +[ + object, + dual, + uuid(e8917260-7579-4be1-b5dd-7afbfa6f077b) +] +interface IVBSAXDeclHandler : IDispatch +{ + [id(DISPID_SAX_DECLHANDLER_ELEMENTDECL)] + HRESULT elementDecl( + [in, out] BSTR * name, + [in, out] BSTR * model); + + [id(DISPID_SAX_DECLHANDLER_ATTRIBUTEDECL)] + HRESULT attributeDecl( + [in, out] BSTR * elementName, + [in, out] BSTR * attributeName, + [in, out] BSTR * type, + [in, out] BSTR * valueDefault, + [in, out] BSTR * value); + + [id(DISPID_SAX_DECLHANDLER_INTERNALENTITYDECL)] + HRESULT internalEntityDecl( + [in, out] BSTR * name, + [in, out] BSTR * value); + + [id(DISPID_SAX_DECLHANDLER_EXTERNALENTITYDECL)] + HRESULT externalEntityDecl( + [in, out] BSTR * name, + [in, out] BSTR * publicId, + [in, out] BSTR * systemId); +}; + +[ + object, + dual, + uuid(24fb3297-302d-4620-ba39-3a732d850558) +] +interface IVBSAXDTDHandler : IDispatch +{ + [id(DISPID_SAX_DTDHANDLER_NOTATIONDECL)] + HRESULT notationDecl( + [in, out] BSTR * name, + [in, out] BSTR * publicId, + [in, out] BSTR * systemId); + + [id(DISPID_SAX_DTDHANDLER_UNPARSEDENTITYDECL)] + HRESULT unparsedEntityDecl( + [in, out] BSTR * name, + [in, out] BSTR * publicId, + [in, out] BSTR * systemId, + [in, out] BSTR * notationName); +}; + +[ + object, + dual, + uuid(0c05d096-f45b-4aca-ad1a-aa0bc25518dc) +] +interface IVBSAXEntityResolver : IDispatch +{ + [id(DISPID_SAX_ENTITYRESOLVER_RESOLVEENTITY)] + HRESULT resolveEntity( + [in, out] BSTR * publicId, + [in, out] BSTR * systemId, + [out, retval] VARIANT * ret); +}; + +[ + object, + dual, + uuid(d963d3fe-173c-4862-9095-b92f66995f52) +] +interface IVBSAXErrorHandler : IDispatch +{ + [id(DISPID_SAX_ERRORHANDLER_ERROR)] + HRESULT error( + [in] IVBSAXLocator * locator, + [in, out] BSTR * errorMessage, + [in] long errorCode); + + [id(DISPID_SAX_ERRORHANDLER_FATALERROR)] + HRESULT fatalError( + [in] IVBSAXLocator * locator, + [in, out] BSTR * errorMessage, + [in] long errorCode); + + [id(DISPID_SAX_ERRORHANDLER_IGNORABLEWARNING)] + HRESULT ignorableWarning( + [in] IVBSAXLocator * locator, + [in, out] BSTR * errorMessage, + [in] long errorCode); +}; + +[ + object, + dual, + uuid(032aac35-8c0e-4d9d-979f-e3b702935576) +] +interface IVBSAXLexicalHandler : IDispatch +{ + [id(DISPID_SAX_LEXICALHANDLER_STARTDTD)] + HRESULT startDTD( + [in, out] BSTR * name, + [in, out] BSTR * publicId, + [in, out] BSTR * systemId); + [id(DISPID_SAX_LEXICALHANDLER_ENDDTD)] + HRESULT endDTD(); + + [id(DISPID_SAX_LEXICALHANDLER_STARTENTITY)] + HRESULT startEntity([in, out] BSTR * name); + [id(DISPID_SAX_LEXICALHANDLER_ENDENTITY)] + HRESULT endEntity([in, out] BSTR * name); + + [id(DISPID_SAX_LEXICALHANDLER_STARTCDATA)] + HRESULT startCDATA(); + [id(DISPID_SAX_LEXICALHANDLER_ENDCDATA)] + HRESULT endCDATA(); + + [id(DISPID_SAX_LEXICALHANDLER_COMMENT)] + HRESULT comment( [in, out] BSTR * chars); +}; + +[ + object, + uuid(796e7ac5-5aa2-4eff-acad-3faaf01a3288) +] +interface IVBSAXLocator : IDispatch +{ + [propget, id(DISPID_SAX_LOCATOR_COLUMNNUMBER)] + HRESULT columnNumber( [out, retval] int * column); + + [propget, id(DISPID_SAX_LOCATOR_LINENUMBER)] + HRESULT lineNumber( [out, retval] int * line); + + [propget, id(DISPID_SAX_LOCATOR_PUBLICID)] + HRESULT publicId( [out, retval] BSTR * publicId); + + [propget, id(DISPID_SAX_LOCATOR_SYSTEMID)] + HRESULT systemId( [out, retval] BSTR * systemId); +}; + +[ + object, + dual, + uuid(1299eb1b-5b88-433e-82de-82ca75ad4e04) +] +interface IVBSAXXMLFilter : IDispatch +{ + [propget, id(DISPID_SAX_XMLFILTER_PARENT)] + HRESULT parent( [out, retval] IVBSAXXMLReader ** reader); + [propputref, id(DISPID_SAX_XMLFILTER_PARENT)] + HRESULT parent( [in] IVBSAXXMLReader * reader); + +}; + +[ + dual, + object, + uuid (8c033caa-6cd6-4f73-b728-4531af74945f) +] +interface IVBSAXXMLReader : IDispatch +{ + [id(DISPID_SAX_XMLREADER_GETFEATURE)] + HRESULT getFeature( [in] const WCHAR * pFeature, + [out, retval] VARIANT_BOOL * pValue); + [id(DISPID_SAX_XMLREADER_PUTFEATURE)] + HRESULT putFeature( [in] const WCHAR * pFeature, + [in] VARIANT_BOOL vfValue); + + [id(DISPID_SAX_XMLREADER_GETPROPERTY)] + HRESULT getProperty( [in] const WCHAR * pProp, + [out, retval] VARIANT * pValue); + [id(DISPID_SAX_XMLREADER_PUTPROPERTY)] + HRESULT putProperty( [in] const WCHAR * pProp, [in] VARIANT value); + + [propget, id(DISPID_SAX_XMLREADER_ENTITYRESOLVER)] + HRESULT getEntityResolver( + [out, retval] IVBSAXEntityResolver ** ppEntityResolver); + [propputref, id(DISPID_SAX_XMLREADER_ENTITYRESOLVER)] + HRESULT putEntityResolver( [in] IVBSAXEntityResolver * pEntityResolver); + + [propget, id(DISPID_SAX_XMLREADER_CONTENTHANDLER)] + HRESULT getContentHandler( + [out, retval] IVBSAXContentHandler ** pContentHandler); + [propputref, id(DISPID_SAX_XMLREADER_CONTENTHANDLER)] + HRESULT putContentHandler([in] IVBSAXContentHandler * contentHandler); + + [propget, id(DISPID_SAX_XMLREADER_DTDHANDLER)] + HRESULT getDTDHandler([out, retval] IVBSAXDTDHandler ** pDTDHandler); + [propputref, id(DISPID_SAX_XMLREADER_DTDHANDLER)] + HRESULT putDTDHandler([in] IVBSAXDTDHandler * pDTDHandler); + + [propget, id(DISPID_SAX_XMLREADER_ERRORHANDLER)] + HRESULT getErrorHandler([out, retval] IVBSAXErrorHandler ** pErrorHandler); + [propputref, id(DISPID_SAX_XMLREADER_ERRORHANDLER)] + HRESULT putErrorHandler([in] IVBSAXErrorHandler * errorHandler); + + [propget, id(DISPID_SAX_XMLREADER_BASEURL)] + HRESULT getBaseURL([out, retval] const WCHAR ** pBaseUrl); + [propput, id(DISPID_SAX_XMLREADER_BASEURL)] + HRESULT putBaseURL([in] const WCHAR * pBaseUrl); + + [propget, id(DISPID_SAX_XMLREADER_SECUREBASEURL)] + HRESULT getSecureBaseURL([out, retval] const WCHAR ** pSecureBaseUrl); + [propput, id(DISPID_SAX_XMLREADER_SECUREBASEURL)] + HRESULT putSecureBaseURL([in] const WCHAR * secureBaseUrl); + + [propget, id(DISPID_SAX_XMLREADER_PARSE)] + HRESULT parse( [in] VARIANT varInput); + [propput, id(DISPID_SAX_XMLREADER_PARSE)] + HRESULT parseURL([in] const WCHAR * url); +} + +[ + object, + dual, + uuid(f10d27cc-3ec0-415c-8ed8-77ab1c5e7262) +] +interface IMXAttributes : IDispatch +{ + [id(DISPID_MX_ATTRIBUTES_ADDATTRIBUTE)] + HRESULT addAttribute( + [in] BSTR uri, + [in] BSTR localName, + [in] BSTR QName, + [in] BSTR type, + [in] BSTR value); + + [id(DISPID_MX_ATTRIBUTES_ADDATTRIBUTEFROMINDEX)] + HRESULT addAttributeFromIndex( [in] VARIANT atts, + [in] int index); + + [id(DISPID_MX_ATTRIBUTES_CLEAR)] + HRESULT clear(); + + [id(DISPID_MX_ATTRIBUTES_REMOVEATTRIBUTE)] + HRESULT removeAttribute( [in] int index); + + [id(DISPID_MX_ATTRIBUTES_SETATTRIBUTE)] + HRESULT setAttribute( + [in] int index, + [in] BSTR uri, + [in] BSTR localName, + [in] BSTR QName, + [in] BSTR type, + [in] BSTR value); + + [id(DISPID_MX_ATTRIBUTES_SETATTRIBUTES)] + HRESULT setAttributes( [in] VARIANT atts); + + [id(DISPID_MX_ATTRIBUTES_SETLOCALNAME)] + HRESULT setLocalName( [in] int index, + [in] BSTR localName); + + [id(DISPID_MX_ATTRIBUTES_SETQNAME)] + HRESULT setQName( + [in] int index, + [in] BSTR QName); + + [id(DISPID_MX_ATTRIBUTES_SETTYPE)] + HRESULT setType( [in] int index, [in] BSTR type); + + [id(DISPID_MX_ATTRIBUTES_SETURI)] + HRESULT setURI( [in] int index, [in] BSTR uri); + + [id(DISPID_MX_ATTRIBUTES_SETVALUE)] + HRESULT setValue([in] int index, [in] BSTR value); +}; + +[ + object, + dual, + uuid(808f4e35-8d5a-4fbe-8466-33a41279ed30) +] +interface IMXReaderControl : IDispatch +{ + [id(DISPID_MX_READER_CONTROL_ABORT)] + HRESULT abort(); + + [id(DISPID_MX_READER_CONTROL_RESUME)] + HRESULT resume(); + + [id(DISPID_MX_READER_CONTROL_SUSPEND)] + HRESULT suspend(); +}; + +[ + object, + dual, + uuid(4d7ff4ba-1565-4ea8-94e1-6e724a46f98d) +] +interface IMXWriter : IDispatch +{ + [propput, id(DISPID_MX_WRITER_OUTPUT)] + HRESULT output ( [in] VARIANT Destination); + [propget, id(DISPID_MX_WRITER_OUTPUT)] + HRESULT output ( [out, retval] VARIANT * Destination); + + [propput, id(DISPID_MX_WRITER_ENCODING)] + HRESULT encoding ([in] BSTR encoding); + [propget, id(DISPID_MX_WRITER_ENCODING)] + HRESULT encoding ([out, retval] BSTR * encoding); + + [propput, id(DISPID_MX_WRITER_BYTEORDERMARK)] + HRESULT byteOrderMark ([in] VARIANT_BOOL writeByteOrderMark); + [propget, id(DISPID_MX_WRITER_BYTEORDERMARK)] + HRESULT byteOrderMark ([out, retval] VARIANT_BOOL * writeByteOrderMark); + + [propput, id(DISPID_MX_WRITER_INDENT)] + HRESULT indent ([in] VARIANT_BOOL indentMode); + [propget, id(DISPID_MX_WRITER_INDENT)] + HRESULT indent ([out, retval] VARIANT_BOOL * indentMode); + + [propput, id(DISPID_MX_WRITER_STANDALONE)] + HRESULT standalone ([in] VARIANT_BOOL value); + [propget, id(DISPID_MX_WRITER_STANDALONE)] + HRESULT standalone ([out, retval] VARIANT_BOOL * value); + + [propput, id(DISPID_MX_WRITER_OMITXMLDECLARATION)] + HRESULT omitXMLDeclaration ([in] VARIANT_BOOL value); + [propget, id(DISPID_MX_WRITER_OMITXMLDECLARATION)] + HRESULT omitXMLDeclaration ([out, retval] VARIANT_BOOL * value); + + [propput, id(DISPID_MX_WRITER_VERSION)] + HRESULT version ([in] BSTR version); + [propget, id(DISPID_MX_WRITER_VERSION)] + HRESULT version ([out, retval] BSTR * version); + + [propput, id(DISPID_MX_WRITER_DISABLEOUTPUTESCAPING)] + HRESULT disableOutputEscaping([in] VARIANT_BOOL value); + [propget, id(DISPID_MX_WRITER_DISABLEOUTPUTESCAPING)] + HRESULT disableOutputEscaping([out, retval] VARIANT_BOOL * value); + + [id(DISPID_MX_WRITER_FLUSH)] + HRESULT flush(); +}; + +[ + uuid(079aa557-4a18-424a-8eee-e39f0a8d41b9) +] +coclass SAXXMLReader +{ + [default] interface IVBSAXXMLReader; + interface ISAXXMLReader; + interface IMXReaderControl; +}; + +[ + uuid(3124c396-fb13-4836-a6ad-1317f1713688) +] +coclass SAXXMLReader30 +{ + [default] interface IVBSAXXMLReader; + interface ISAXXMLReader; + interface IMXReaderControl; +}; + +[ + uuid(fc220ad8-a72a-4ee8-926e-0b7ad152a020) +] +coclass MXXMLWriter +{ + [default] interface IMXWriter; + + interface ISAXContentHandler; + interface ISAXErrorHandler; + interface ISAXDTDHandler; + interface ISAXLexicalHandler; + interface ISAXDeclHandler; + + interface IVBSAXContentHandler; + interface IVBSAXDeclHandler; + interface IVBSAXDTDHandler; + interface IVBSAXErrorHandler; + interface IVBSAXLexicalHandler; +}; + +[ + uuid(3d813dfe-6c91-4a4e-8f41-04346a841d9c) +] +coclass MXXMLWriter30 +{ + [default] interface IMXWriter; + + interface ISAXContentHandler; + interface ISAXDeclHandler; + interface ISAXDTDHandler; + interface ISAXErrorHandler; + interface ISAXLexicalHandler; + + interface IVBSAXContentHandler; + interface IVBSAXDeclHandler; + interface IVBSAXDTDHandler; + interface IVBSAXErrorHandler; + interface IVBSAXLexicalHandler; +}; + +[ + uuid(4dd441ad-526d-4a77-9f1b-9841ed802fb0) +] +coclass SAXAttributes +{ + [default] interface IMXAttributes; + interface IVBSAXAttributes; + interface ISAXAttributes; +}; + +[ + uuid(3e784a01-f3ae-4dc0-9354-9526b9370eba) +] +coclass SAXAttributes30 +{ + [default] interface IMXAttributes; + interface IVBSAXAttributes; + interface ISAXAttributes; +}; + + } /* Library MSXML */ diff --git a/include/msxml2did.h b/include/msxml2did.h index 1a718de4151..f2adaaff427 100644 --- a/include/msxml2did.h +++ b/include/msxml2did.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2005 Vijay Kiran Kamuju + * Copyright (C) 2008 Alistair Leslie-Hughes * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -268,4 +269,130 @@ #define DISPID_XMLDSO_DOCUMENT 0x10001 #define DISPID_XMLDSO_JAVADSOCOMPATIBLE 0x10002 +/* SAX Defines */ +#define DISPID_SAX_XMLREADER__MIN 0x00000501 +#define DISPID_SAX_XMLREADER__MAX 0x00010000 +#define DISPID_SAX_XMLREADER__BASE DISPID_SAX_XMLREADER__MIN + +#define DISPID_SAX_XMLREADER 0x00000501 +#define DISPID_SAX_XMLREADER_GETFEATURE 0x00000502 +#define DISPID_SAX_XMLREADER_PUTFEATURE 0x00000503 +#define DISPID_SAX_XMLREADER_GETPROPERTY 0x00000504 +#define DISPID_SAX_XMLREADER_PUTPROPERTY 0x00000505 +#define DISPID_SAX_XMLREADER_ENTITYRESOLVER 0x00000506 +#define DISPID_SAX_XMLREADER_CONTENTHANDLER 0x00000507 +#define DISPID_SAX_XMLREADER_DTDHANDLER 0x00000508 +#define DISPID_SAX_XMLREADER_ERRORHANDLER 0x00000509 +#define DISPID_SAX_XMLREADER_BASEURL 0x0000050A +#define DISPID_SAX_XMLREADER_SECUREBASEURL 0x0000050B +#define DISPID_SAX_XMLREADER_PARSE 0x0000050C +#define DISPID_SAX_XMLREADER_PARSEURL 0x0000050D +#define DISPID_SAX_XMLREADER_PARENT 0x0000050E + +#define DISPID_SAX_XMLFILTER 0x00000510 +#define DISPID_SAX_XMLFILTER_GETFEATURE 0x00000511 +#define DISPID_SAX_XMLFILTER_PUTFEATURE 0x00000512 +#define DISPID_SAX_XMLFILTER_GETPROPERTY 0x00000513 +#define DISPID_SAX_XMLFILTER_PUTPROPERTY 0x00000514 +#define DISPID_SAX_XMLFILTER_ENTITYRESOLVER 0x00000515 +#define DISPID_SAX_XMLFILTER_CONTENTHANDLER 0x00000516 +#define DISPID_SAX_XMLFILTER_DTDHANDLER 0x00000517 +#define DISPID_SAX_XMLFILTER_ERRORHANDLER 0x00000518 +#define DISPID_SAX_XMLFILTER_BASEURL 0x00000519 +#define DISPID_SAX_XMLFILTER_SECUREBASEURL 0x0000051A +#define DISPID_SAX_XMLFILTER_PARSE 0x0000051B +#define DISPID_SAX_XMLFILTER_PARSEURL 0x0000051C +#define DISPID_SAX_XMLFILTER_PARENT 0x0000051D + +#define DISPID_SAX_LOCATOR 0x00000520 +#define DISPID_SAX_LOCATOR_COLUMNNUMBER 0x00000521 +#define DISPID_SAX_LOCATOR_LINENUMBER 0x00000522 +#define DISPID_SAX_LOCATOR_PUBLICID 0x00000523 +#define DISPID_SAX_LOCATOR_SYSTEMID 0x00000524 + +#define DISPID_SAX_ENTITYRESOLVER 0x00000526 +#define DISPID_SAX_ENTITYRESOLVER_RESOLVEENTITY 0x00000527 + +#define DISPID_SAX_CONTENTHANDLER 0x00000529 +#define DISPID_SAX_CONTENTHANDLER_DOCUMENTLOCATOR 0x0000052A +#define DISPID_SAX_CONTENTHANDLER_STARTDOCUMENT 0x0000052B +#define DISPID_SAX_CONTENTHANDLER_ENDDOCUMENT 0x0000052C +#define DISPID_SAX_CONTENTHANDLER_STARTPREFIXMAPPING 0x0000052D +#define DISPID_SAX_CONTENTHANDLER_ENDPREFIXMAPPING 0x0000052E +#define DISPID_SAX_CONTENTHANDLER_STARTELEMENT 0x0000052F +#define DISPID_SAX_CONTENTHANDLER_ENDELEMENT 0x00000530 +#define DISPID_SAX_CONTENTHANDLER_CHARACTERS 0x00000531 +#define DISPID_SAX_CONTENTHANDLER_IGNORABLEWHITESPACE 0x00000532 +#define DISPID_SAX_CONTENTHANDLER_PROCESSINGINSTRUCTION 0x00000533 +#define DISPID_SAX_CONTENTHANDLER_SKIPPEDENTITY 0x00000534 + +#define DISPID_SAX_DTDHANDLER 0x00000536 +#define DISPID_SAX_DTDHANDLER_NOTATIONDECL 0x00000537 +#define DISPID_SAX_DTDHANDLER_UNPARSEDENTITYDECL 0x00000538 + +#define DISPID_SAX_ERRORHANDLER 0x0000053A +#define DISPID_SAX_ERRORHANDLER_ERROR 0x0000053B +#define DISPID_SAX_ERRORHANDLER_FATALERROR 0x0000053C +#define DISPID_SAX_ERRORHANDLER_IGNORABLEWARNING 0x0000053D + +#define DISPID_SAX_ATTRIBUTES 0x0000053F +#define DISPID_SAX_ATTRIBUTES_LENGTH 0x00000540 +#define DISPID_SAX_ATTRIBUTES_GETURI 0x00000541 +#define DISPID_SAX_ATTRIBUTES_GETLOCALNAME 0x00000542 +#define DISPID_SAX_ATTRIBUTES_GETQNAME 0x00000543 +#define DISPID_SAX_ATTRIBUTES_GETINDEXFROMNAME 0x00000544 +#define DISPID_SAX_ATTRIBUTES_GETINDEXFROMQNAME 0x00000545 +#define DISPID_SAX_ATTRIBUTES_GETTYPE 0x00000546 +#define DISPID_SAX_ATTRIBUTES_GETTYPEFROMNAME 0x00000547 +#define DISPID_SAX_ATTRIBUTES_GETTYPEFROMQNAME 0x00000548 +#define DISPID_SAX_ATTRIBUTES_GETVALUE 0x00000549 +#define DISPID_SAX_ATTRIBUTES_GETVALUEFROMNAME 0x0000054A +#define DISPID_SAX_ATTRIBUTES_GETVALUEFROMQNAME 0x0000054B + +#define DISPID_SAX_LEXICALHANDLER 0x0000054D +#define DISPID_SAX_LEXICALHANDLER_STARTDTD 0x0000054E +#define DISPID_SAX_LEXICALHANDLER_ENDDTD 0x0000054F +#define DISPID_SAX_LEXICALHANDLER_STARTENTITY 0x00000550 +#define DISPID_SAX_LEXICALHANDLER_ENDENTITY 0x00000551 +#define DISPID_SAX_LEXICALHANDLER_STARTCDATA 0x00000552 +#define DISPID_SAX_LEXICALHANDLER_ENDCDATA 0x00000553 +#define DISPID_SAX_LEXICALHANDLER_COMMENT 0x00000554 + +#define DISPID_SAX_DECLHANDLER 0x00000556 +#define DISPID_SAX_DECLHANDLER_ELEMENTDECL 0x00000557 +#define DISPID_SAX_DECLHANDLER_ATTRIBUTEDECL 0x00000558 +#define DISPID_SAX_DECLHANDLER_INTERNALENTITYDECL 0x00000559 +#define DISPID_SAX_DECLHANDLER_EXTERNALENTITYDECL 0x0000055A + +#define DISPID_MX_ATTRIBUTES_ADDATTRIBUTE 0x0000055D +#define DISPID_MX_ATTRIBUTES_CLEAR 0x0000055E +#define DISPID_MX_ATTRIBUTES_REMOVEATTRIBUTE 0x0000055F +#define DISPID_MX_ATTRIBUTES_SETATTRIBUTE 0x00000560 +#define DISPID_MX_ATTRIBUTES_SETATTRIBUTES 0x00000561 +#define DISPID_MX_ATTRIBUTES_SETLOCALNAME 0x00000562 +#define DISPID_MX_ATTRIBUTES_SETQNAME 0x00000563 +#define DISPID_MX_ATTRIBUTES_SETTYPE 0x00000564 +#define DISPID_MX_ATTRIBUTES_SETURI 0x00000565 +#define DISPID_MX_ATTRIBUTES_SETVALUE 0x00000566 +#define DISPID_MX_ATTRIBUTES_ADDATTRIBUTEFROMINDEX 0x00000567 + +#define DISPID_MX_WRITER 0x00000568 +#define DISPID_MX_WRITER_OUTPUT 0x00000569 +#define DISPID_MX_WRITER_DESTINATION 0x0000056A +#define DISPID_MX_WRITER_ENCODING 0x0000056B +#define DISPID_MX_WRITER_BYTEORDERMARK 0x0000056C +#define DISPID_MX_WRITER_INDENT 0x0000056D +#define DISPID_MX_WRITER_STANDALONE 0x0000056E +#define DISPID_MX_WRITER_OMITXMLDECLARATION 0x0000056F +#define DISPID_MX_WRITER_VERSION 0x00000570 +#define DISPID_MX_WRITER_DISABLEOUTPUTESCAPING 0x00000571 +#define DISPID_MX_WRITER_FLUSH 0x00000572 +#define DISPID_MX_WRITER_RESET 0x00000573 + +#define DISPID_MX_READER_CONTROL 0x00000575 +#define DISPID_MX_READER_CONTROL_ABORT 0x00000576 +#define DISPID_MX_READER_CONTROL_RESUME 0x00000577 +#define DISPID_MX_READER_CONTROL_SUSPEND 0x00000578 + + #endif /* __MSXML2DID_H__ */ diff --git a/include/wine/library.h b/include/wine/library.h index f00919e097a..0c603789665 100644 --- a/include/wine/library.h +++ b/include/wine/library.h @@ -38,6 +38,8 @@ extern const char *wine_get_config_dir(void); extern const char *wine_get_data_dir(void); extern const char *wine_get_server_dir(void); extern const char *wine_get_user_name(void); +extern const char *wine_get_version(void); +extern const char *wine_get_build_id(void); extern void wine_init_argv0_path( const char *argv0 ); extern void wine_exec_wine_binary( const char *name, char **argv, const char *env_var ); @@ -66,6 +68,7 @@ extern void wine_init( int argc, char *argv[], char *error, int error_size ); /* portability */ extern void DECLSPEC_NORETURN wine_switch_to_stack( void (*func)(void *), void *arg, void *stack ); +extern int wine_call_on_stack( int (*func)(void *), void *arg, void *stack ); extern void wine_set_pe_load_area( void *base, size_t size ); extern void wine_free_pe_load_area(void); diff --git a/include/wine/wined3d_gl.h b/include/wine/wined3d_gl.h index 1e45b200565..43d82e070f5 100644 --- a/include/wine/wined3d_gl.h +++ b/include/wine/wined3d_gl.h @@ -2920,6 +2920,85 @@ typedef void (WINE_GLAPI * PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC) (GLenum target #define GL_MAX_SPOT_EXPONENT_NV 0x8505 #endif +/* GL_ATI_fragment_shader */ +#ifndef GL_ATI_fragment_shader +#define GL_ATI_fragment_shader +typedef GLuint (WINE_GLAPI *PGLFNGENFRAGMENTSHADERSATI) (GLuint range); +typedef void (WINE_GLAPI *PGLFNBINDFRAGMENTSHADERATI) (GLuint id); +typedef void (WINE_GLAPI *PGLFNDELETEFRAGMENTSHADERATI) (GLuint id); +typedef void (WINE_GLAPI *PGLFNBEGINFRAGMENTSHADERATI) (); +typedef void (WINE_GLAPI *PGLFNENDFRAGMENTSHADERATI) (); +typedef void (WINE_GLAPI *PGLFNPASSTEXCOORDATI) (GLuint dst, GLuint coord, GLenum swizzle); +typedef void (WINE_GLAPI *PGLFNSAMPLEMAPATI) (GLuint dst, GLuint interp, GLenum swizzle); +typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP1ATI) (GLenum op, GLuint dst, GLuint dstMask, + GLuint dstMod, GLuint arg1, GLuint arg1Rep, + GLuint arg1Mod); +typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP2ATI) (GLenum op, GLuint dst, GLuint dstMask, + GLuint dstMod, GLuint arg1, GLuint arg1Rep, + GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, + GLuint arg2Mod); +typedef void (WINE_GLAPI *PGLFNCOLORFRAGMENTOP3ATI) (GLenum op, GLuint dst, GLuint dstMask, + GLuint dstMod, GLuint arg1, GLuint arg1Rep, + GLuint arg1Mod, GLuint arg2, GLuint arg2Rep, + GLuint arg2Mod, GLuint arg3, GLuint arg3Rep, + GLuint arg3Mod); +typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP1ATI) (GLenum op, GLuint dst, GLuint dstMod, + GLuint arg1, GLuint arg1Rep, GLuint arg1Mod); +typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP2ATI) (GLenum op, GLuint dst, GLuint dstMod, + GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, + GLuint arg2, GLuint arg2Rep, GLuint arg2Mod); +typedef void (WINE_GLAPI *PGLFNALPHAFRAGMENTOP3ATI) (GLenum op, GLuint dst, GLuint dstMod, + GLuint arg1, GLuint arg1Rep, GLuint arg1Mod, + GLuint arg2, GLuint arg2Rep, GLuint arg2Mod, + GLuint arg3, GLuint arg3Rep, GLuint arg3Mod); +typedef void (WINE_GLAPI *PGLFNSETFRAGMENTSHADERCONSTANTATI) (GLuint dst, const GLfloat *value); +#define GL_FRAGMENT_SHADER_ATI 0x8920 +#define GL_REG_0_ATI 0x8921 +#define GL_REG_1_ATI 0x8922 +#define GL_REG_2_ATI 0x8923 +#define GL_REG_3_ATI 0x8924 +#define GL_REG_4_ATI 0x8925 +#define GL_REG_5_ATI 0x8926 +#define GL_CON_0_ATI 0x8941 +#define GL_CON_1_ATI 0x8942 +#define GL_CON_2_ATI 0x8943 +#define GL_CON_3_ATI 0x8944 +#define GL_CON_4_ATI 0x8945 +#define GL_CON_5_ATI 0x8946 +#define GL_CON_6_ATI 0x8947 +#define GL_CON_7_ATI 0x8948 +#define GL_MOV_ATI 0x8961 +#define GL_ADD_ATI 0x8963 +#define GL_MUL_ATI 0x8964 +#define GL_SUB_ATI 0x8965 +#define GL_DOT3_ATI 0x8966 +#define GL_DOT4_ATI 0x8967 +#define GL_MAD_ATI 0x8968 +#define GL_LERP_ATI 0x8969 +#define GL_CND_ATI 0x896A +#define GL_CND0_ATI 0x896B +#define GL_DOT2_ADD_ATI 0x896C +#define GL_SECONDARY_INTERPOLATOR_ATI 0x896D +#define GL_SWIZZLE_STR_ATI 0x8976 +#define GL_SWIZZLE_STQ_ATI 0x8977 +#define GL_SWIZZLE_STR_DR_ATI 0x8978 +#define GL_SWIZZLE_STQ_DQ_ATI 0x8979 +#define GL_RED_BIT_ATI 0x00000001 +#define GL_GREEN_BIT_ATI 0x00000002 +#define GL_BLUE_BIT_ATI 0x00000004 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_4X_BIT_ATI 0x00000002 +#define GL_8X_BIT_ATI 0x00000004 +#define GL_HALF_BIT_ATI 0x00000008 +#define GL_QUARTER_BIT_ATI 0x00000010 +#define GL_EIGHTH_BIT_ATI 0x00000020 +#define GL_SATURATE_BIT_ATI 0x00000040 +#define GL_2X_BIT_ATI 0x00000001 +#define GL_COMP_BIT_ATI 0x00000002 +#define GL_NEGATE_BIT_ATI 0x00000004 +#define GL_BIAS_BIT_ATI 0x00000008 +#endif + /* GL_VERSION_2_0 */ #ifndef GL_VERSION_2_0 #define GL_VERSION_2_0 1 @@ -3281,6 +3360,7 @@ typedef enum _GL_SupportedExt { ATI_TEXTURE_MIRROR_ONCE, EXT_VERTEX_SHADER, ATI_ENVMAP_BUMPMAP, + ATI_FRAGMENT_SHADER, /* APPLE */ APPLE_FENCE, APPLE_CLIENT_STORAGE, @@ -3578,7 +3658,22 @@ typedef enum _GL_SupportedExt { USE_GL_FUNC(PGLFNFINISHRENDERAPPLEPROC, glFinishRenderApple, APPLE_FLUSH_RENDER, NULL );\ /* GL_EXT_gpu_program_parameters */ \ USE_GL_FUNC(PGLFNPROGRAMENVPARAMETERS4FVEXTPROC, glProgramEnvParameters4fvEXT, EXT_GPU_PROGRAM_PARAMETERS,NULL );\ - USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC, glProgramLocalParameters4fvEXT, EXT_GPU_PROGRAM_PARAMETERS,NULL ); + USE_GL_FUNC(PGLFNPROGRAMLOCALPARAMETERS4FVEXTPROC, glProgramLocalParameters4fvEXT, EXT_GPU_PROGRAM_PARAMETERS,NULL );\ + /* GL_ATI_fragment_shader */ \ + USE_GL_FUNC(PGLFNGENFRAGMENTSHADERSATI, glGenFragmentShadersATI, ATI_FRAGMENT_SHADER, NULL );\ + USE_GL_FUNC(PGLFNBINDFRAGMENTSHADERATI, glBindFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL );\ + USE_GL_FUNC(PGLFNDELETEFRAGMENTSHADERATI, glDeleteFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL );\ + USE_GL_FUNC(PGLFNBEGINFRAGMENTSHADERATI, glBeginFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL );\ + USE_GL_FUNC(PGLFNENDFRAGMENTSHADERATI, glEndFragmentShaderATI, ATI_FRAGMENT_SHADER, NULL );\ + USE_GL_FUNC(PGLFNPASSTEXCOORDATI, glPassTexCoordATI, ATI_FRAGMENT_SHADER, NULL );\ + USE_GL_FUNC(PGLFNSAMPLEMAPATI, glSampleMapATI, ATI_FRAGMENT_SHADER, NULL );\ + USE_GL_FUNC(PGLFNCOLORFRAGMENTOP1ATI, glColorFragmentOp1ATI, ATI_FRAGMENT_SHADER, NULL );\ + USE_GL_FUNC(PGLFNCOLORFRAGMENTOP2ATI, glColorFragmentOp2ATI, ATI_FRAGMENT_SHADER, NULL );\ + USE_GL_FUNC(PGLFNCOLORFRAGMENTOP3ATI, glColorFragmentOp3ATI, ATI_FRAGMENT_SHADER, NULL );\ + USE_GL_FUNC(PGLFNALPHAFRAGMENTOP1ATI, glAlphaFragmentOp1ATI, ATI_FRAGMENT_SHADER, NULL );\ + USE_GL_FUNC(PGLFNALPHAFRAGMENTOP2ATI, glAlphaFragmentOp2ATI, ATI_FRAGMENT_SHADER, NULL );\ + USE_GL_FUNC(PGLFNALPHAFRAGMENTOP3ATI, glAlphaFragmentOp3ATI, ATI_FRAGMENT_SHADER, NULL );\ + USE_GL_FUNC(PGLFNSETFRAGMENTSHADERCONSTANTATI, glSetFragmentShaderConstantATI, ATI_FRAGMENT_SHADER, NULL ); /**************************************************** * OpenGL WGL defines and functions pointer @@ -3689,6 +3784,7 @@ typedef BOOL (WINAPI * WINED3D_PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, typedef struct { GLint glInternal, glGammaInternal, rtInternal, glFormat, glType; WINED3DFORMAT conversion_group; + unsigned int Flags; } GlPixelFormatDesc; typedef struct _WINED3DGLTYPE { diff --git a/include/wine/wined3d_types.h b/include/wine/wined3d_types.h index d85528356e9..195f38b2b73 100644 --- a/include/wine/wined3d_types.h +++ b/include/wine/wined3d_types.h @@ -1096,111 +1096,111 @@ typedef struct _WINED3DINDEXBUFFER_DESC { */ typedef struct _WINED3DVSHADERCAPS2_0 { - DWORD *Caps; - INT *DynamicFlowControlDepth; - INT *NumTemps; - INT *StaticFlowControlDepth; + DWORD Caps; + INT DynamicFlowControlDepth; + INT NumTemps; + INT StaticFlowControlDepth; } WINED3DVSHADERCAPS2_0; typedef struct _WINED3DPSHADERCAPS2_0 { - DWORD *Caps; - INT *DynamicFlowControlDepth; - INT *NumTemps; - INT *StaticFlowControlDepth; - INT *NumInstructionSlots; + DWORD Caps; + INT DynamicFlowControlDepth; + INT NumTemps; + INT StaticFlowControlDepth; + INT NumInstructionSlots; } WINED3DPSHADERCAPS2_0; typedef struct _WINED3DCAPS { - WINED3DDEVTYPE *DeviceType; - UINT *AdapterOrdinal; - - DWORD *Caps; - DWORD *Caps2; - DWORD *Caps3; - DWORD *PresentationIntervals; - - DWORD *CursorCaps; - - DWORD *DevCaps; - - DWORD *PrimitiveMiscCaps; - DWORD *RasterCaps; - DWORD *ZCmpCaps; - DWORD *SrcBlendCaps; - DWORD *DestBlendCaps; - DWORD *AlphaCmpCaps; - DWORD *ShadeCaps; - DWORD *TextureCaps; - DWORD *TextureFilterCaps; - DWORD *CubeTextureFilterCaps; - DWORD *VolumeTextureFilterCaps; - DWORD *TextureAddressCaps; - DWORD *VolumeTextureAddressCaps; - - DWORD *LineCaps; - - DWORD *MaxTextureWidth; - DWORD *MaxTextureHeight; - DWORD *MaxVolumeExtent; - - DWORD *MaxTextureRepeat; - DWORD *MaxTextureAspectRatio; - DWORD *MaxAnisotropy; - float *MaxVertexW; - - float *GuardBandLeft; - float *GuardBandTop; - float *GuardBandRight; - float *GuardBandBottom; - - float *ExtentsAdjust; - DWORD *StencilCaps; - - DWORD *FVFCaps; - DWORD *TextureOpCaps; - DWORD *MaxTextureBlendStages; - DWORD *MaxSimultaneousTextures; - - DWORD *VertexProcessingCaps; - DWORD *MaxActiveLights; - DWORD *MaxUserClipPlanes; - DWORD *MaxVertexBlendMatrices; - DWORD *MaxVertexBlendMatrixIndex; - - float *MaxPointSize; - - DWORD *MaxPrimitiveCount; - DWORD *MaxVertexIndex; - DWORD *MaxStreams; - DWORD *MaxStreamStride; - - DWORD *VertexShaderVersion; - DWORD *MaxVertexShaderConst; - - DWORD *PixelShaderVersion; - float *PixelShader1xMaxValue; + WINED3DDEVTYPE DeviceType; + UINT AdapterOrdinal; + + DWORD Caps; + DWORD Caps2; + DWORD Caps3; + DWORD PresentationIntervals; + + DWORD CursorCaps; + + DWORD DevCaps; + + DWORD PrimitiveMiscCaps; + DWORD RasterCaps; + DWORD ZCmpCaps; + DWORD SrcBlendCaps; + DWORD DestBlendCaps; + DWORD AlphaCmpCaps; + DWORD ShadeCaps; + DWORD TextureCaps; + DWORD TextureFilterCaps; + DWORD CubeTextureFilterCaps; + DWORD VolumeTextureFilterCaps; + DWORD TextureAddressCaps; + DWORD VolumeTextureAddressCaps; + + DWORD LineCaps; + + DWORD MaxTextureWidth; + DWORD MaxTextureHeight; + DWORD MaxVolumeExtent; + + DWORD MaxTextureRepeat; + DWORD MaxTextureAspectRatio; + DWORD MaxAnisotropy; + float MaxVertexW; + + float GuardBandLeft; + float GuardBandTop; + float GuardBandRight; + float GuardBandBottom; + + float ExtentsAdjust; + DWORD StencilCaps; + + DWORD FVFCaps; + DWORD TextureOpCaps; + DWORD MaxTextureBlendStages; + DWORD MaxSimultaneousTextures; + + DWORD VertexProcessingCaps; + DWORD MaxActiveLights; + DWORD MaxUserClipPlanes; + DWORD MaxVertexBlendMatrices; + DWORD MaxVertexBlendMatrixIndex; + + float MaxPointSize; + + DWORD MaxPrimitiveCount; + DWORD MaxVertexIndex; + DWORD MaxStreams; + DWORD MaxStreamStride; + + DWORD VertexShaderVersion; + DWORD MaxVertexShaderConst; + + DWORD PixelShaderVersion; + float PixelShader1xMaxValue; /* DX 9 */ - DWORD *DevCaps2; + DWORD DevCaps2; - float *MaxNpatchTessellationLevel; - DWORD *Reserved5; /*undocumented*/ + float MaxNpatchTessellationLevel; + DWORD Reserved5; /*undocumented*/ - UINT *MasterAdapterOrdinal; - UINT *AdapterOrdinalInGroup; - UINT *NumberOfAdaptersInGroup; - DWORD *DeclTypes; - DWORD *NumSimultaneousRTs; - DWORD *StretchRectFilterCaps; + UINT MasterAdapterOrdinal; + UINT AdapterOrdinalInGroup; + UINT NumberOfAdaptersInGroup; + DWORD DeclTypes; + DWORD NumSimultaneousRTs; + DWORD StretchRectFilterCaps; WINED3DVSHADERCAPS2_0 VS20Caps; WINED3DPSHADERCAPS2_0 PS20Caps; - DWORD *VertexTextureFilterCaps; - DWORD *MaxVShaderInstructionsExecuted; - DWORD *MaxPShaderInstructionsExecuted; - DWORD *MaxVertexShader30InstructionSlots; - DWORD *MaxPixelShader30InstructionSlots; - DWORD *Reserved2;/* Not in the microsoft headers but documented */ - DWORD *Reserved3; + DWORD VertexTextureFilterCaps; + DWORD MaxVShaderInstructionsExecuted; + DWORD MaxPShaderInstructionsExecuted; + DWORD MaxVertexShader30InstructionSlots; + DWORD MaxPixelShader30InstructionSlots; + DWORD Reserved2;/* Not in the microsoft headers but documented */ + DWORD Reserved3; } WINED3DCAPS; diff --git a/include/winsvc.h b/include/winsvc.h index fb77789d747..1031f0cf754 100644 --- a/include/winsvc.h +++ b/include/winsvc.h @@ -243,8 +243,14 @@ typedef struct _QUERY_SERVICE_CONFIGW { } QUERY_SERVICE_CONFIGW, *LPQUERY_SERVICE_CONFIGW; /* defines and structures for ChangeServiceConfig2 */ -#define SERVICE_CONFIG_DESCRIPTION 1 -#define SERVICE_CONFIG_FAILURE_ACTIONS 2 +#define SERVICE_CONFIG_DESCRIPTION 1 +#define SERVICE_CONFIG_FAILURE_ACTIONS 2 +#define SERVICE_CONFIG_DELAYED_AUTO_START_INFO 3 +#define SERVICE_CONFIG_FAILURE_ACTIONS_FLAG 4 +#define SERVICE_CONFIG_SERVICE_SID_INFO 5 +#define SERVICE_CONFIG_REQUIRED_PRIVILEGES_INFO 6 +#define SERVICE_CONFIG_PRESHUTDOWN_INFO 7 + typedef struct _SERVICE_DESCRIPTIONA { LPSTR lpDescription; @@ -351,6 +357,9 @@ WINADVAPI BOOL WINAPI QueryServiceStatusEx(SC_HANDLE,SC_STATUS_TYPE,LPBYT WINADVAPI BOOL WINAPI QueryServiceConfigA(SC_HANDLE,LPQUERY_SERVICE_CONFIGA,DWORD,LPDWORD); WINADVAPI BOOL WINAPI QueryServiceConfigW(SC_HANDLE,LPQUERY_SERVICE_CONFIGW,DWORD,LPDWORD); #define QueryServiceConfig WINELIB_NAME_AW(QueryServiceConfig) +WINADVAPI BOOL WINAPI QueryServiceConfig2A(SC_HANDLE,DWORD,LPBYTE,DWORD,LPDWORD); +WINADVAPI BOOL WINAPI QueryServiceConfig2W(SC_HANDLE,DWORD,LPBYTE,DWORD,LPDWORD); +#define QueryServiceConfig2 WINELIB_NAME_AW(QueryServiceConfig2) WINADVAPI BOOL WINAPI QueryServiceLockStatusA(SC_HANDLE,LPQUERY_SERVICE_LOCK_STATUSA,DWORD,LPDWORD); WINADVAPI BOOL WINAPI QueryServiceLockStatusW(SC_HANDLE,LPQUERY_SERVICE_LOCK_STATUSW,DWORD,LPDWORD); #define QueryServiceLockStatus WINELIB_NAME_AW(QueryServiceLockStatus) diff --git a/libs/.gitignore b/libs/.gitignore index ff27f54c4da..b332749eef8 100644 --- a/libs/.gitignore +++ b/libs/.gitignore @@ -1,2 +1,4 @@ *.dylib *.so.* +wine/version-stamp +wine/version.c diff --git a/libs/wine/Makefile.in b/libs/wine/Makefile.in index 11278b743a4..ea74396fac3 100644 --- a/libs/wine/Makefile.in +++ b/libs/wine/Makefile.in @@ -96,6 +96,8 @@ C_SRCS = \ c_28605.c \ c_28606.c +EXTRA_OBJS = version.o + all: $(MODULE) $(MODULE:.dll=.a) @MAKE_RULES@ @@ -173,8 +175,14 @@ uninstall:: -cd $(DESTDIR)$(libdir) && $(RM) libwine.a libwine.dll libwine.so libwine.so.$(VERSION) \ libwine.so.$(SOVERSION) libwine.dylib libwine.$(VERSION).dylib libwine.$(SOVERSION).dylib +version-stamp: dummy + (GIT_DIR=$(TOPSRCDIR)/.git git describe HEAD 2>/dev/null || echo "wine-@PACKAGE_VERSION@") | sed -e 's/\(.*\)/const char wine_build[] = "\1";/' >$@ || ($(RM) $@ && exit 1) + +version.c: version-stamp + @cmp -s version-stamp $@ || cp version-stamp $@ + clean:: - $(RM) libwine.so.$(SOVERSION) libwine.so.$(VERSION) + $(RM) libwine.so.$(SOVERSION) libwine.so.$(VERSION) version.c version-stamp $(RELPATH): @cd $(TOOLSDIR)/tools && $(MAKE) relpath diff --git a/libs/wine/config.c b/libs/wine/config.c index eb187e5840b..9e33f4eab44 100644 --- a/libs/wine/config.c +++ b/libs/wine/config.c @@ -407,6 +407,19 @@ const char *wine_get_user_name(void) return user_name; } +/* return the standard version string */ +const char *wine_get_version(void) +{ + return PACKAGE_VERSION; +} + +/* return the build id string */ +const char *wine_get_build_id(void) +{ + extern const char wine_build[]; + return wine_build; +} + /* exec a binary using the preloader if requested; helper for wine_exec_wine_binary */ static void preloader_exec( char **argv, int use_preloader ) { diff --git a/libs/wine/port.c b/libs/wine/port.c index 838c3ffea58..e2f7b0cbbe3 100644 --- a/libs/wine/port.c +++ b/libs/wine/port.c @@ -116,5 +116,69 @@ __ASM_GLOBAL_FUNC( wine_switch_to_stack, "callq *%rax\n\t" /* call func */ "int $3") #else +void DECLSPEC_NORETURN wine_switch_to_stack( void (*func)(void *), void *arg, void *stack ) +{ + wine_call_on_stack( (int (*)(void *))func, arg, stack ); + abort(); +} +#endif + + +/*********************************************************************** + * wine_call_on_stack + * + * Switch to the specified stack to call the function and return. + */ +int wine_call_on_stack( int (*func)(void *), void *arg, void *stack ); +#if defined(__i386__) && defined(__GNUC__) +__ASM_GLOBAL_FUNC( wine_call_on_stack, + "pushl %ebp\n\t" + "pushl %esi\n\t" + "movl 12(%esp),%ecx\n\t" /* func */ + "movl 16(%esp),%edx\n\t" /* arg */ + "movl 20(%esp),%esi\n\t" /* stack */ + "andl $~15,%esi\n\t" + "subl $12,%esi\n\t" + "xchgl %esi,%esp\n\t" + "pushl %edx\n\t" + "xorl %ebp,%ebp\n\t" + "call *%ecx\n\t" + "movl %esi,%esp\n\t" + "popl %esi\n\t" + "popl %ebp\n\t" + "ret" ) +#elif defined(__i386__) && defined(_MSC_VER) +__declspec(naked) int wine_call_on_stack( int (*func)(void *), void *arg, void *stack ) +{ + __asm push ebp; + __asm push esi; + __asm mov ecx, 12[esp]; + __asm mov edx, 16[esp]; + __asm mov esi, 20[esp]; + __asm xchg esp, esi; + __asm push edx; + __asm xor ebp, ebp; + __asm call [ecx]; + __asm mov esp, esi; + __asm pop esi; + __asm pop ebp + __asm ret; +} +#elif defined(__x86_64__) && defined(__GNUC__) +__ASM_GLOBAL_FUNC( wine_call_on_stack, + "pushq %rbp\n\t" + "pushq %rbx\n\t" + "movq %rsp,%rbx\n\t" + "movq %rdi,%rax\n\t" /* func */ + "movq %rsi,%rdi\n\t" /* arg */ + "andq $~15,%rdx\n\t" /* stack */ + "movq %rdx,%rsp\n\t" + "xorq %rbp,%rbp\n\t" + "callq *%rax\n\t" /* call func */ + "movq %rbx,%rsp\n\t" + "popq %rbx\n\t" + "popq %rbp\n\t" + "ret") +#else #error You must implement wine_switch_to_stack for your platform #endif diff --git a/libs/wine/wine.def b/libs/wine/wine.def index 8597c4ea8c7..b641c9476b9 100644 --- a/libs/wine/wine.def +++ b/libs/wine/wine.def @@ -51,6 +51,7 @@ EXPORTS vsnprintfW vsprintfW wine_anon_mmap + wine_call_on_stack wine_casemap_lower wine_casemap_upper wine_compare_string @@ -66,7 +67,7 @@ EXPORTS wine_dbgstr_an wine_dbgstr_wn wine_dlclose - wine_dll_enum_load_path; + wine_dll_enum_load_path wine_dll_get_owner wine_dll_load wine_dll_load_main_exe @@ -77,6 +78,7 @@ EXPORTS wine_exec_wine_binary wine_fold_string wine_get_build_dir + wine_get_build_id wine_get_config_dir wine_get_cs wine_get_data_dir @@ -88,6 +90,7 @@ EXPORTS wine_get_sortkey wine_get_ss wine_get_user_name + wine_get_version wine_init wine_init_argv0_path wine_is_dbcs_leadbyte diff --git a/libs/wine/wine.map b/libs/wine/wine.map index 0928a87cb00..19d454e0586 100644 --- a/libs/wine/wine.map +++ b/libs/wine/wine.map @@ -51,6 +51,7 @@ WINE_1.0 vsnprintfW; vsprintfW; wine_anon_mmap; + wine_call_on_stack; wine_casemap_lower; wine_casemap_upper; wine_compare_string; @@ -77,6 +78,7 @@ WINE_1.0 wine_exec_wine_binary; wine_fold_string; wine_get_build_dir; + wine_get_build_id; wine_get_config_dir; wine_get_cs; wine_get_data_dir; @@ -88,6 +90,7 @@ WINE_1.0 wine_get_sortkey; wine_get_ss; wine_get_user_name; + wine_get_version; wine_init; wine_init_argv0_path; wine_is_dbcs_leadbyte; diff --git a/loader/.gitignore b/loader/.gitignore deleted file mode 100644 index b0470638e83..00000000000 --- a/loader/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/version-stamp -/version.c diff --git a/loader/Makefile.in b/loader/Makefile.in index 64695fedf79..3179e2211a9 100644 --- a/loader/Makefile.in +++ b/loader/Makefile.in @@ -12,8 +12,8 @@ C_SRCS = \ preloader.c \ pthread.c -KTHREAD_OBJS = kthread.o main.o version.o -PTHREAD_OBJS = pthread.o main.o version.o +KTHREAD_OBJS = kthread.o main.o +PTHREAD_OBJS = pthread.o main.o MAIN_BINARY = @MAIN_BINARY@ EXTRA_BINARIES = @EXTRA_BINARIES@ @@ -97,13 +97,4 @@ uninstall:: $(RM) $(DESTDIR)$(mandir)/de.UTF-8/man$(prog_manext)/wine.$(prog_manext) $(RM) $(DESTDIR)$(mandir)/fr.UTF-8/man$(prog_manext)/wine.$(prog_manext) -clean:: - $(RM) version.c version-stamp - -version-stamp: dummy - (GIT_DIR=$(TOPSRCDIR)/.git git-describe HEAD 2>/dev/null || echo "wine-@PACKAGE_VERSION@") | sed -e 's/\(.*\)/const char wine_version[] = "\1";/' >$@ || ($(RM) $@ && exit 1) - -version.c: version-stamp - @cmp -s version-stamp $@ || cp version-stamp $@ - @DEPENDENCIES@ # everything below this line is overwritten by make depend diff --git a/loader/main.c b/loader/main.c index 5e0f330caa4..0a1afbb6dfa 100644 --- a/loader/main.c +++ b/loader/main.c @@ -68,7 +68,6 @@ static inline void reserve_area( void *addr, size_t size ) */ static void check_command_line( int argc, char *argv[] ) { - extern const char wine_version[]; static const char usage[] = "Usage: wine PROGRAM [ARGUMENTS...] Run the specified program\n" " wine --help Display this help and exit\n" @@ -86,7 +85,7 @@ static void check_command_line( int argc, char *argv[] ) } if (!strcmp( argv[1], "--version" )) { - printf( "%s\n", wine_version ); + printf( "%s\n", wine_get_build_id() ); exit(0); } } diff --git a/programs/Makefile.in b/programs/Makefile.in index 5681f84015a..5635923485b 100644 --- a/programs/Makefile.in +++ b/programs/Makefile.in @@ -27,6 +27,7 @@ SUBDIRS = \ rpcss \ rundll32 \ secedit \ + services \ spoolsv \ start \ svchost \ @@ -73,6 +74,7 @@ INSTALLSUBDIRS = \ rpcss \ rundll32 \ secedit \ + services \ spoolsv \ start \ svchost \ diff --git a/programs/notepad/Ru.rc b/programs/notepad/Ru.rc index dfebde4d170..f34eec009bc 100644 --- a/programs/notepad/Ru.rc +++ b/programs/notepad/Ru.rc @@ -18,7 +18,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -MAIN_MENU MENU LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT + +MAIN_MENU MENU { POPUP "&Ôàéë" { MENUITEM "Ñîçä&àòü\tCtrl+N", CMD_NEW @@ -66,7 +68,6 @@ POPUP "& /* Dialog `Page setup' */ DIALOG_PAGESETUP DIALOG 0, 0, 225, 95 -LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" CAPTION "Ïàðàìåòðû ñòðàíèöû" @@ -91,7 +92,7 @@ PUSHBUTTON " PUSHBUTTON "&Ñïðàâêà", IDHELP, 180, 39, 40, 15, WS_TABSTOP } -STRINGTABLE DISCARDABLE LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT +STRINGTABLE DISCARDABLE { STRING_PAGESETUP_HEADERVALUE, "&f" STRING_PAGESETUP_FOOTERVALUE, "Ñòðàíèöà &p" diff --git a/programs/regedit/En.rc b/programs/regedit/En.rc index 307ffcc3c3c..c8c497fdc6b 100644 --- a/programs/regedit/En.rc +++ b/programs/regedit/En.rc @@ -369,7 +369,7 @@ STRINGTABLE DISCARDABLE BEGIN IDS_FILEDIALOG_IMPORT_TITLE "Import Registry File" IDS_FILEDIALOG_EXPORT_TITLE "Export Registry File" - IDS_FILEDIALOG_FILTER "Registration Files\0*.reg\0Win9x/NT4 Registration Files (REGEDIT4)\0*.reg\0All Files (*.*)\0*.*\0\0" + IDS_FILEDIALOG_FILTER "Registry Files\0*.reg\0Win9x/NT4 Registry Files (REGEDIT4)\0*.reg\0All Files (*.*)\0*.*\0\0" END STRINGTABLE DISCARDABLE diff --git a/programs/regedit/Ja.rc b/programs/regedit/Ja.rc index 129bebf082a..823f80e55a2 100644 --- a/programs/regedit/Ja.rc +++ b/programs/regedit/Ja.rc @@ -59,7 +59,7 @@ BEGIN MENUITEM "ŒŸ�õ(&F)\tCtrl+F", ID_EDIT_FIND, GRAYED MENUITEM "ŽŸ‚ÌŒŸ�õŒó•â(&x)\tF3", ID_EDIT_FINDNEXT, GRAYED END - POPUP "•\Ž¦(&V)" + POPUP "•\\Ž¦(&V)" BEGIN MENUITEM "ƒXƒe�[ƒ^ƒXƒo�[(&B)", ID_VIEW_STATUSBAR MENUITEM SEPARATOR diff --git a/programs/regedit/Makefile.in b/programs/regedit/Makefile.in index 9487067b639..2de20fb2776 100644 --- a/programs/regedit/Makefile.in +++ b/programs/regedit/Makefile.in @@ -24,6 +24,8 @@ C_SRCS = \ RC_SRCS = rsrc.rc +SVG_SRCS = regedit.svg + @MAKE_PROG_RULES@ @DEPENDENCIES@ # everything below this line is overwritten by make depend diff --git a/programs/regedit/Ru.rc b/programs/regedit/Ru.rc index 1952eb86f77..12ee92fedec 100644 --- a/programs/regedit/Ru.rc +++ b/programs/regedit/Ru.rc @@ -49,6 +49,7 @@ BEGIN MENUITEM "&Ñòðîêîâîå çíà÷åíèå", ID_EDIT_NEW_STRINGVALUE MENUITEM "&Áèíàðíîå çíà÷åíèå", ID_EDIT_NEW_BINARYVALUE MENUITEM "&DWORD çíà÷åíèå", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&Ìíîãî-ñòðîêîâîå çíà÷åíèå", ID_EDIT_NEW_MULTI_STRINGVALUE END MENUITEM SEPARATOR MENUITEM "&Óäàëèòü\tDel", ID_EDIT_DELETE @@ -80,11 +81,146 @@ BEGIN END END +IDR_POPUP_MENUS MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Èçìåíèòü", ID_EDIT_MODIFY + MENUITEM "Èçìåíèòü &áèíàðíîå çíà÷åíèå", ID_EDIT_MODIFY_BIN + MENUITEM SEPARATOR + MENUITEM "&Óäàëèòü\tDel", ID_EDIT_DELETE + MENUITEM "&Ïåðåèìåíîâàòü", ID_EDIT_RENAME + END + POPUP "" + BEGIN + POPUP "Ñîçä&àòü" + BEGIN + MENUITEM "Êë&þ÷", ID_EDIT_NEW_KEY + MENUITEM SEPARATOR + MENUITEM "&Ñòðîêîâîå çíà÷åíèå", ID_EDIT_NEW_STRINGVALUE + MENUITEM "&Áèíàðíîå çíà÷åíèå", ID_EDIT_NEW_BINARYVALUE + MENUITEM "&DWORD çíà÷åíèå", ID_EDIT_NEW_DWORDVALUE + MENUITEM "&Ìíîãî-ñòðîêîâîå çíà÷åíèå", ID_EDIT_NEW_MULTI_STRINGVALUE + END + MENUITEM SEPARATOR + MENUITEM "&Óäàëèòü\tDel", ID_EDIT_DELETE + MENUITEM "&Ïåðåèìåíîâàòü\tF2", ID_EDIT_RENAME + MENUITEM SEPARATOR + MENUITEM "Ñ&êîïèðîâàòü èìÿ êëþ÷à", ID_EDIT_COPYKEYNAME + MENUITEM SEPARATOR + MENUITEM "&Íàéòè\tCtrl+F", ID_EDIT_FIND, GRAYED + END +END + /* * Dialog */ +IDD_EXPORT_TEMPLATE DIALOG DISCARDABLE 50, 50, 278, 54 +STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | + WS_BORDER +FONT 8, "MS Shell Dlg" +BEGIN + GROUPBOX "Ýêñïîðò ðååñòðà", IDC_EXPORT_BASE, 6, 6, 266, 42, WS_GROUP + AUTORADIOBUTTON "&Âåñü ðååñòð", IDC_EXPORT_ALL, 12, 15, 244, 12 + AUTORADIOBUTTON "Â&ûáðàííóþ âåòêó:", IDC_EXPORT_SELECTED, 12, 30, 80, 12 + EDITTEXT IDC_EXPORT_PATH, 92, 30, 174, 12 +END + +IDD_FIND DIALOG DISCARDABLE 22, 17, 210, 85 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Ïîèñê" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Íàéòè:",IDC_STATIC,5,7,119,8 + EDITTEXT IDC_VALUE_NAME,40,5,120,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + LTEXT "Èñêàòü â:",IDC_STATIC,5, 22, 119, 8 + CHECKBOX "Êëþ÷àõ", IDC_FIND_KEYS, 5, 34, 90, 10, WS_TABSTOP | WS_GROUP | BS_AUTOCHECKBOX + CHECKBOX "Íàçâàíèÿõ çíà÷åíèé", IDC_FIND_VALUES, 5, 46, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + CHECKBOX "Ñîäåðæèìîì", IDC_FIND_CONTENT, 5, 58, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + CHECKBOX "Âñþ ñòðîêó öåëèêîì", IDC_FIND_WHOLE, 5, 70, 90, 10, WS_TABSTOP | BS_AUTOCHECKBOX + DEFPUSHBUTTON "Èñêàòü",IDOK,170,5,35,11,WS_GROUP + PUSHBUTTON "Çàêðûòü",IDCANCEL,170,22,35,11, WS_GROUP +END + +IDD_ADDFAVORITE DIALOG DISCARDABLE 22, 17, 210, 55 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Äîáàâèòü èçáðàííîå" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Èìÿ:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,130,40,30,11,WS_GROUP + PUSHBUTTON "Îòìåíèòü",IDCANCEL,165,40,40,11, WS_GROUP +END + +IDD_DELFAVORITE DIALOG DISCARDABLE 22, 17, 210, 90 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Óäàëèòü èçáðàííîå" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Èìÿ:",IDC_STATIC,5,5,119,8 + LISTBOX IDC_NAME_LIST,5,15,200,52, WS_BORDER | WS_TABSTOP | LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL + DEFPUSHBUTTON "OK",IDOK,130,73,30,11,WS_GROUP + PUSHBUTTON "Îòìåíèòü",IDCANCEL,165,73,40,11, WS_GROUP +END + +IDD_EDIT_STRING DIALOG DISCARDABLE 22, 17, 210, 75 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Èçìåíèòü ñòðîêó" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Íàçâàíèå çíà÷åíèÿ:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "Äàííûå:",IDC_STATIC,5,30,119,8 + EDITTEXT IDC_VALUE_DATA,5,40,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL + DEFPUSHBUTTON "OK",IDOK,130,60,30,11,WS_GROUP + PUSHBUTTON "Îòìåíèòü",IDCANCEL,165,60,40,11,WS_GROUP +END + +IDD_EDIT_DWORD DIALOG DISCARDABLE 22, 17, 210, 100 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "Èçìåíèòü DWORD" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Íàçâàíèå çíà÷åíèÿ:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "Äàííûå:",IDC_STATIC,5,30,90,8 + EDITTEXT IDC_VALUE_DATA,5,40,90,12, WS_BORDER | WS_TABSTOP + GROUPBOX "Èñ÷èñëåíèå", IDC_DWORD_BASE, 120, 30, 85, 37, BS_GROUPBOX + AUTORADIOBUTTON "16-òè ðè÷íîå", IDC_DWORD_HEX, 130, 40, 60, 10, WS_TABSTOP + AUTORADIOBUTTON "Äåñÿòè÷íîå", IDC_DWORD_DEC, 130, 52, 60, 10, WS_TABSTOP + DEFPUSHBUTTON "OK",IDOK,130,80,30,11,WS_GROUP + PUSHBUTTON "Îòìåíèòü",IDCANCEL,165,80,40,11,WS_GROUP +END + +IDD_EDIT_BINARY DIALOG DISCARDABLE 22, 17, 210, 100 +STYLE DS_MODALFRAME | DS_NOIDLEMSG | WS_CAPTION | WS_SYSMENU +CAPTION "Èçìåíèòü áèíàðíûå äàííûå" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Íàçâàíèå çíà÷åíèÿ:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "Äàííûå:",IDC_STATIC,5,30,90,8 + CONTROL "",IDC_VALUE_DATA,"HexEdit",WS_TABSTOP,4,40,160,40 + DEFPUSHBUTTON "OK",IDOK,130,80,30,11,WS_GROUP + PUSHBUTTON "Îòìåíèòü",IDCANCEL,165,80,40,11,WS_GROUP +END + +IDD_EDIT_MULTI_STRING DIALOG DISCARDABLE 22, 17, 210, 175 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +CAPTION "Èçìåíèòü ìíîãî-ñòðîêîâûå äàííûå" +FONT 8, "MS Shell Dlg" +BEGIN + LTEXT "Íàçâàíèå çíà÷åíèÿ:",IDC_STATIC,5,5,119,8 + EDITTEXT IDC_VALUE_NAME,5,15,200,12, WS_BORDER | WS_TABSTOP | ES_AUTOHSCROLL| WS_DISABLED + LTEXT "Äàííûå:",IDC_STATIC,5,30,119,8 + EDITTEXT IDC_VALUE_DATA,5,40,200,112, WS_BORDER | WS_TABSTOP | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN + DEFPUSHBUTTON "OK",IDOK,130,160,30,11,WS_GROUP + PUSHBUTTON "Îòìåíèòü",IDCANCEL,165,160,40,11,WS_GROUP +END + /* * String Table */ @@ -118,6 +254,7 @@ BEGIN ID_EDIT_NEW_STRINGVALUE "Äîáàâëÿåò íîâîå ñòðîêîâîå çíà÷åíèå" ID_EDIT_NEW_BINARYVALUE "Äîáàâëÿåò íîâîå áèíàðíîå çíà÷åíèå" ID_EDIT_NEW_DWORDVALUE "Äîáàâëÿåò íîâîå DWORD-çíà÷åíèå" + ID_EDIT_NEW_MULTI_STRINGVALUE "Äîáàâëÿåò íîâîå ìíîãî-ñòðîêîâîå çíà÷åíèå" ID_REGISTRY_IMPORTREGISTRYFILE "Èìïîðòèðóåò òåêñòîâîé ôàéë â ðååñòð" ID_REGISTRY_EXPORTREGISTRYFILE "Ýêñïîðòèðóåò âåñü ðååñòð èëè åãî ÷àñòü â òåêñòîâîé ôàéë" @@ -145,6 +282,36 @@ BEGIN ID_EDIT_FINDNEXT "Èùåò ñëåäóþùåå ñîâïàäåíèå òåêñòà, çàäàííîãî â ïðåäûäóùåì ïîèñêå" END +STRINGTABLE DISCARDABLE +BEGIN + IDS_ERROR "Îøûáêà" + IDS_BAD_KEY "Íåâîçìîæíî çàïðîñèòü êëþ÷ '%s'" + IDS_BAD_VALUE "Íåâîçìîæíî çàïðîñèòü çíà÷åíèå '%s'" + IDS_UNSUPPORTED_TYPE "Ðåäàêòèðîâàíèå êëþ÷åé òèïà (%ld) íå ïîääåðæèâàåòñÿ" + IDS_TOO_BIG_VALUE "Çíà÷åíèå ñëèøêîì âåëèêî (%ld)" + IDS_DELETE_BOX_TITLE "Ïîäòâåðæäåíèå" + IDS_DELETE_BOX_TEXT "Óäàëèòü çíà÷åíèå '%s'?" + IDS_NEWKEY "Íîâûé êëþ÷ #%d" + IDS_NEWVALUE "Íîâîå çíà÷åíè #%d" + IDS_NOTFOUND "Èñêîìàÿ ñòðîêà '%s' íå íàéäåíà" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_FILEDIALOG_IMPORT_TITLE "Èìïîðò ôàéëà ðååñòðà" + IDS_FILEDIALOG_EXPORT_TITLE "Ýêñïîðò ôàéëà ðååñòðà" + IDS_FILEDIALOG_FILTER "Âñå ôàéëû ðååñòðà\0*.reg\0Ôàéëû ðååñòðà äëÿ Win9x/NT4 (REGEDIT4)\0*.reg\0Âñå ôàéëû (*.*)\0*.*\0\0" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_REGISTRY_ROOT_NAME "Ìîé Êîìïüþòåð" + IDS_REGISTRY_DEFAULT_VALUE "(Ïî óìîë÷àíèþ)" + IDS_REGISTRY_VALUE_NOT_SET "(çíà÷åíèå íå çàäàíî)" + IDS_REGISTRY_VALUE_CANT_DISPLAY "(íåâîçìîæíî îòîáðàçèòü)" + IDS_REGISTRY_UNKNOWN_TYPE "(íåèçâåñòíî %d)" +END + /*****************************************************************/ /* diff --git a/programs/regedit/about.c b/programs/regedit/about.c index 7258a4dd28a..89960ad64c8 100644 --- a/programs/regedit/about.c +++ b/programs/regedit/about.c @@ -28,7 +28,8 @@ void ShowAboutBox(HWND hWnd) { - TCHAR title[64]; - LoadString(hInst, IDS_APP_TITLE, title, COUNT_OF(title)); - ShellAbout(hWnd, title, _T(""), LoadIcon(hInst, MAKEINTRESOURCE(IDI_REGEDIT))); + WCHAR title[64]; + HICON icon = LoadImageW( hInst, MAKEINTRESOURCEW(IDI_REGEDIT), IMAGE_ICON, 48, 48, LR_SHARED ); + LoadStringW(hInst, IDS_APP_TITLE, title, COUNT_OF(title)); + ShellAboutW(hWnd, title, NULL, icon); } diff --git a/programs/regedit/regedit.ico b/programs/regedit/regedit.ico dissimilarity index 89% index b7481b412cf6f25e447fbf80fda2d91fc143fab8..a156268db9bfc87412e4924ce20130707a6e7fe7 100644 GIT binary patch literal 15086 zcwX&V2Urx>7M@+IsGwp&G!aW;i!CZ3prAnol%|LxHUv8udqZ(Wr7j=~0*b7F1+b&h zSWvN1l|+3Sdy7&8Bv??9-T$4L1%e7J5%Zq!dpY0te`j`f&i((nbIZARhGBS&0@I`k z!`VzlhS4Rjqa*trPv^ySu6OV9-`_CIuoeu{g^t+}_A(w*ez79+*$rD=yI|XlEbMf> zh=h6RZ)4ro?3inn^(=1rSsd|6LgHFK9QF^u>4-x(7rh@RLbpS}@c)dTIT1d60g)*( z-A&O|yV=X3J=;mHZkh+24F`_;XCZmZRoqVl@@@jxPCms_Q;iSfMRuLR=kd_Ef%3cE zi>%9@9}v_nK5|x1M2>kRjdXZW7&`7=x?ptl8aw^pABNAoh6AfEV(+R*B(9Ibsf}lF zR(ul2LlZG(j6!AnmKi@_y*&&eQ~{!EV15M!K{`!t%L@U+IQD9&-@4OsB^9opVyMBWIU3ZafG) zo*P;;w~~$;sCTL8@(J1fKhFb>i+n2M!zZ>xq+<%Ard&Xj(>cUAyLye$OH@=G0ft#X zSO@LaP743S=p4=$13IQJZf z{8!g}|E|f{n^dQ5>zz}2Xm@$9{X|V2&BbpR3`E#~ z>i;zMui7-pVjvzqe2Ai=BE-aOLuO_s7P-#IIkRb9JkD+pdan$D!FTX9>IH#bPquBa z@g)ZZ@OEE-3M(lof%BA!_~m>O@cXqFRol>qM$g9t6ZGTB&<*}Cj~qGta_&@z zqVyvPD9ODqH@>QM@7~?0bGOc8ZbdHMh4axF$k?5NGts9Y=&md;wk`&GIs%msu(}-7 z%6$my=-fID+3z=mG6K%YV%c#KwD$(8llyo z=U$f1AN|k9vGI$BHAH~jq-x6$+VriJKWu^z0*!$nf@l~JW(gX%fT;06xXs%uv-+6M zH|tqC$Gi`oZJ&?3o96;QdsBZG0!cwqi0p&0$t4~cJAsS4fnO4VD?bCjodRy22lfaa z)z&T%I(|F6dINrXq`?FTH3K$LpA|b`|13R8LnVGbdzq7IFQf)d$F(hsfaDP1LL`u} z9SF8NfJm30afABc9pZa<5y-v<1)tBuwguK4 zf9@`izm30CXbd0gZ=t5FP{~b@&a>z(N%fzC->B}T$Nl~`{-ZN`LZg9VCHHr2)TJs4 z{O5<3Se0c2IN{X+y7v?QpO=55!$ywZR~KwMd>1?vHv~iQSZIl7zC+&`x7UcY)9X<7 zG{zOz!)8<4TTksSfHZ{CTpj_0*hdrp0bDr+_wCXJ_;fgGCK4*CC1eMGfJ zezxxf+iZczb~{9)VhJ$_868dKis^VIU82ycvFhX4$@+&*%^Q;NXq~kfVdKLP;TVdI z;{)MCb3@SZ)(CeB#3n+7a{x9?6(VxFA2v<%Mfghq#4zv2)%Xh#c)|D_@?` zJ=EC$Xznb7VBk0;%q^Wfq$h+fX1KR)IUXi>{`vexWA@AAsLg8Y{~W)&kps)06Z0d! zYN3JOcdo>x%}en5bXaBklgCk;)s-Iy-QnRl7%iJ=qJe4?G}UO136zgzE;LP|V$`u^ z&SXT*Jc+2;NgTwkC&-^5e;iw8FRCxUByj~AHqd~w@-XU~ZZsxMBOSfaK&63%ikXn% zIpNoLH_v?B|6UdX`@Mdxkw3&?TaEnT*2F)+0r767o90+h&efT?T{wP*SwdJ1b@drg zP*5%N8aL?Pr9?5_+)nwJ|DfOH8u>#f3`MZ{Q;00`5o(!-Q0rWT+2$a8%oB*LZefnD zCL+fFGP>{AFZulbAMsN*f~HN~Nt=o^LF9?7BRf#~@N(Vx1;d*mV)9mmO^m0!H;#^X zRw8_oC)gB*H9kL{&+k_)Kf{Qiqcay8>gu?#PmC)k_e1*hcHQ{HCWgcN`|9gI%<3Jy z26mJ2Gpm)9y4J|gFp+54qA$z`8zO^p$|qM->c%g({SDMDzf@O2vAMK1{)P>=vd;mD z0_Rt0p^J-4k4F?Dd21oI%|BURej4LfC@D3R^7#(LX-x6;ZG;gj0Q&V$Ve|(E}?FLi(TTJ~i09sm} z`0A_fP;01GLLml(euT<(VZHdpPI+m8)4?95rKNG}4~ayABS((F(QzUS42j)zxFVYT8Cvb?66yQ3tAnYBO+zI(osY58y-VHK8GCpfyv-aO(S3G`0?Z zi**L=D)@1D4NP^r<3!R4)Mon+?8o@whNb64%Zsl@uP?&+?FHDm>?Y<9Xz&p~^)IY3 zu*RDHjxy*vz=I&r8%NNuysn)8hIkSB^z4c^Z{F0%pOce=UcI^_^>`vKo~69x%?p~Z z;tHuAzW$KEu2#X1n15_wHQ`8DfH=g9jo#=@8PBk9{8gP2+AOYQk$o zJC#UdroS@p-&qnHEw1D(EiJ`bPl2RM=Z*+jzZ{vz_u;|iR7i^RJ`caZq>-#0$#B@Q zM-T1REpCaoMwOmFe;yq=btoP^piB0--J5YaX%9*sT>+l`4!p?!Ec`WC<0j3T{HoDZ z<1QUr9+_)?Cimh|;0bX*z4bo-x!63c&}${Hz)vuC&w!mHcm={y{Sh^7Kg2WkLOgRf z#B+8b#w{K(Kkh{2EI)Y#{l8h&ej_kpj0MccNKT%zI@x43{cl{3-o^qGopyA6yJQwq zn0A7B72rWIr2>ow9#jEXY#_YRsNiJxDcCL2DNL1picZxj{m1^Xe++)MQz0~ah5&Pd z#WMtrAWsMyS;!&KlDt&`ohyXDr8~RshH&J~pQh^y)vfo{q+Nwrd%( zHoD=))}_E{k?dVUN)(VD3q((Q3BdqetQ|T7Ng-0)JPF)k_aZ1)dz3|U(pA}Bd%-`JDh~2qbl`3N$~jM^cMwMV9wx9 zoK~iab{1B;-yl`!#Oc2n>WVUU5AO@ozhg>oXsN4wq?<*jR_fB9J?uICX+hIauzMAd zB>W=u-&?5%)6UJR)y+bQ&wp`b!SK>l--(?5{CH~j$GpE7{Y74e7~f9|3j9CY43Ed4 z_t(u}*17p>`YjEcY*czp6gOa@Gbm}-a=^n211iJocA-`)k90wSb_R;piS4eZvxF;rY(}h~&yJs|A#Ny0^nSnni=CfCp#Qx*4fV0Q z%)gxe*va(&583b-ID+z;*OGlp(El54^zNX=_1|kzi*af5Vw5Fs{Am1h zDKZ0{xw$#a%^I%`dm}AuAs+5t|39N2hgM>`c|T~Xt0605KEzALBf!-TMaM(_XY@bW zwg{RUjkqm8hEXW@JZQIQhLA}EOTCA*b0M0x1VsecrpwL$SqMknu4!-cL#wa;e&4jE zeyj>5C3Dg}n=luAzC9EaWbcZbsw&e)YX0ISt+7hCmp2j z+k&*jSUgBSR)77TgY{^xzXo5k+cf{*f}e#9?6JSaO%A>UKa1<+hkg)#hsV>YlYaKw zv^H&4fTeUEYlYMUF-SeM1BEv;>Zd=@HkEtVBd`5OPhj(hJMRVam~(u7%R1|4m?&sz z4WhQh$HAx#oc_#Xd+{#!_NVLri{sCG!F(o^$5SF*lj^KrRdp*A6;;u>V>?cN+RwXi zJM;AW`p<1Er97+FZ!9XTUiulvh%JK8x2&^%hS`P=9p;0L+w5fW{G9vfXXjSg7ruy^ zo6F_@JC!L!(ABYtWy7 zCQS^uXF#wd=$AvS2AMV5C+lBtCP2b`>{@QmJqlITUZh_MW@hFH2?>Fvr4`*5ADWu& z(X!a(8oe<0o08g%SvOvj37)VNU@^`Rg}rd^NFzDA)nSbgkwG-|-Ur>m%c_PzFBTCdT#f3H6Jaae$* zV+T=vDxjdC05#d;$B%LS`gOc|^{VpR<;$1BQ{Z98ME&1R%rd!pa<<9U0x#PPY_Ly( zXj}?{?7eE!&glrWj>Gz1kj(-8XpGmFy>kzs`v@8W1P=p3%w_QVA-yuLivD+p*P@-a zCYCKe>Mbqv*DpXi*kmU9M%k&A%p%j2>Mo*RaHNZu1CVE2~bv1!nJGH*$>!|E zix+6vxFLFc*SS)E>ZzmuHT{p`1<-8P7%SXY$ditPhYsSauiHXfyCnkFuBg<1^Vf7p zON#$~{hmWz5Ia+XM0bG3AnqH`<9;~mI~|Hj3fQ}EZ?(GFer#)N0|mNf{3r{Y+OrjD zNB82=>BD&T@CNX*;6GFUY`+nXIE?`F>kwL8lVQZa2v-GWopY2`6mjhMu}a4Pt`?NISG0sXxWxLDm^a^6yih&H0b%muGxM{u*Uf<+8Z=IAmpIp;wv;yb7s!jFarpn z1tX(&;P^!i*hscrJ88e409d9DSXoKBh}Q@9v;xJ~^tFHy9eBL7zfc4Cxtm;kUtqGa zT)ZyuZ+p3Ts&&|f_CswRGKwfbD=0>UWJ5%R)bJlZM8D3QIYT2%vVk$F;Xizcex0g^ z`jvz0!Y^cV9r%TWGdVnL>DTYqnZA(c=Wm=0qxf{o^~XnS){0Qjm*Ba2_0L!R^Q-K9 zzi#mBoL~Azcsjk0!ImDtMHQWqT zL%OFL65P~qikR!Ij)DLU6s>5D>wc|~<)wk|{WWpTR|{ADv``$<2A7vAX<05n0om&T0-RkWK>j=d#gI;7l81n_5#4#58fhclTsyT3$mY*eqZm2{ckWZC zaU$6QvRC}oaglB$7k$+!pZi;(D7Y2H5UE|bocA?QxIzOrgIiNu6E{|9qA*wsg(2D~ zqT?+N)j@HX4vNBbag$iQQXf}CJK&q(&L~;e6<-Az;%rbilHhf;eODh>`OjzBrt%0o1l zheo3E@EBCaj6+3?9e#~LL<% zN={Br8I{9^W@j<@rxd>njqQWM-;bKP}BfB<`J=nVFcFsVtU2fqnk|c#BL` zVmT z^aSB9?&Up>O#*LQ&w*0Vk5FAQ8Z{=;=ECrtDcq-T7vHe0+TBJTK+nAl@6 z`wk!7_1T_72MNr=bbp*2ye2egk_6MdyaG5v zY7h|MGi{O#)0T$?DZAJHAB1#yCRy_}Xe0PTlAz{csl_U`>NWGF+4y|cw{`z+)%ZGf zO~59Jb#-<`?4;f}N<2c0b2P!{F8vVaVvdmUR#-F92EiX#A(+|$c9sZnu*MeGF>s&i zgc+23^ur#Aooq~by~$D?PO1^&U)wR~HkP z5P5qU(HFQv_VOYkja}k?e+^t;-5rJDCir2a1xmJ9;FsODsG>F7zhlSY#@6>xx_1=H zk4`~Vf*0w<9_dJLC3R&MvsUj=0`{tRYI)cSXsDuDHE{+iocNxH~Gg8>3`nFI4O_ zA#03ZBTZ59nHj30EQtN_>+XTLMY=2Z3_|7JLHK>Y4XXCp;E%(DQ58J|mC=Lo+W|Tz z35TNU;Cpm@!|_|pNL>Gv)~_c%!cWP5h>tsrSsredAGs$|D|2--wC`htSZ9&7x`}>it z2zhyJ_4zVTw;l}i47Ih}m}cj_rP;azp|eISb$N8s(CDJov0ZjvccBES$!WrR$Pik$ z&(7;16!J$Dq14DjDC|Z4Zo>3*diHGq>B63B*?GN%8L2604Mn60O~`L4%uH*zLYlBo z-|W1B!pxMElm^`7w<7;Ap|C+O_m3q1y9)dx$Ujtpe>nMVCH@8#2;b|Poo7dLm(t)7 zqzgY7m7O<^^2z(WJ4Gn8C;y~IjxUA$j^v+6`Eq_~Gc6-6ll+t4&d&Rg_W#!*qzKcc z0V(t&Tu6R*@;8VKp>P5DJ?fu!Im{=&TT()N{D~8vpCH7ail?W~_>)KDjvtFX5|bEx zI6Ke5#>~9GMSpX1a|?6xe&!ba`}ZF(WPy`$Fn{_Vfq1V zo^6L)xySISw;ew5vO`I33?BXQJ2HH2v3vd~L@pSI9rMQFZvH{s`Qi{NzC4IhQ8eRHjTi6u$j0o-iL=&Gk<|T?qqI2a#RTJZ8O2o zJ52GvJ1ua3M}PeM8F9w|+}}A6KXXP7!u?1q-2LnwltvA~ooEM?-oAqSw=Uow**~dX zdGTr7E&c|jC0A(dGPN(E^iCn}QNNl!qx)Pn-S4U!y!Y|@UQ|>RHf-2{@bGY~S+fSK zSFct$uPtanbB9xXd^l-xEgUC0YG`X}YH3Q*O1-tCj#_)uVeO?*Yv0CEZ^HQTAJkyH zLmS6-6YOeXKUUYVOPzjO$IkNoar%yi6YT732gY=A?E9DB-hNC+M}r9y90<~16FNBd z8#Q9Mt?g)A+jmF4KlD8lM>C_IJ$m%&*|l5u-o|eU%pHdewz0At^tN?>i-7~)>GRHW zhgTnr3DYBxnu_O{4ya`V!VDlSt&UHSn#x#e8e?kNb^mW^q;RfV(1KTl!5d1{*lolU zZy0wF4USDQW6hb7;yifKulvnk^|?rg?nZFwr&$LnUC^I!UplfLSw z_t`^w5R>tdTwBHpVpR)W>W`mhqBOp_ zF@9Q~TK%U!>dhX@`5xD^&5iszNFdEJ{fX0!C0b=vmfswhG{dM?f3j;YMr*1%`ep4W zHEd4D#&x8~=}(*4vsUMmnwa|i=0vVPZDx;J{Tc2(nzi2ggwtzNq>*?K6-V0 z%IY)~<#EABpXuuACX#;RON*PAex{%;1J~TCQ>SFo-}~DoZR+^y$12<3i||!z%D^>u z>C#1_|MD_zCJ$vbnvybb%`*Mhe6^T7l+|bo*2h&pty=xp{aQB=(Y*1!zotyTaY29v z`{DN2ZxjoH_4(^JiNAm5daJW^Pc@e0Az%q^YV4G|fSr<98Eg7(0%=<|CiB<&YL zecrCMd|cX>jtL}jk{r45hL|g}vRGcfW?yH0JFtT7qgehzZAsku(BACQYBNcE+&pvU zzi2Cq^l@TmgSxSEK?eN(70;g^&Mp$Li_6s6^#B388K}mJf{4onWU0TL+QFLCC%d9G zD-P9R#Vhq$ahTK=h3T^5kT&e*idGaS<;~^ljgr^C$?LD+q%mSqum-hTu?Gk2*u(r) ztYlqR$$l#0rm;t&wUpP2tqj=3?EUUCZ~rWIew_{bCRpk{3W=Sxtula-BSfR;o(tH+%XtTl<8mu4?4U^7G0nH(2 zALHTNy45;Hl@{GqJFic@=G6u()tmvfJZ9SXOfk*bZbncyh}Qh(vz!7ePtROz$4jS zRH@Hi8H(#G6RQZS)MpB3Ug@Sv{o1qk60ZVP>OXqf>tB`gt89)HL6!Qf<@#3$WnvXU zmHLXcsRG6I|8B5X-kP?43tltiFWoAj?dzcYKI?vO&q$$GNJHNuwtoTg_%=1Uiy>Wt zu2qrih%1SXF^;A=o9+9Qt{-b$&bh9}HpcMLM&%prOe&rGb+}CVeg&!fA3y%%pX|{e zzq5zLKZ%bNP!=0t*T0147iAs(jn9|t^9WCsQ1+Ps|8eHGc>b-d{gV90D)Nb>Ml}nv zHA5oMOZxd|&r1%kZ^j ztEM}%=& + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dlls/fusion/Makefile.in b/programs/services/Makefile.in similarity index 62% copy from dlls/fusion/Makefile.in copy to programs/services/Makefile.in index f7c47f8cc5c..67c3db5acb0 100644 --- a/dlls/fusion/Makefile.in +++ b/programs/services/Makefile.in @@ -2,14 +2,15 @@ TOPSRCDIR = @top_srcdir@ TOPOBJDIR = ../.. SRCDIR = @srcdir@ VPATH = @srcdir@ -MODULE = fusion.dll +MODULE = services.exe +APPMODE = -mconsole IMPORTS = kernel32 +IMPORTS = advapi32 kernel32 C_SRCS = \ - asmname.c \ - fusion.c \ - fusion_main.c + services.c \ + utils.c -@MAKE_DLL_RULES@ +@MAKE_PROG_RULES@ @DEPENDENCIES@ # everything below this line is overwritten by make depend diff --git a/programs/services/services.c b/programs/services/services.c new file mode 100644 index 00000000000..c5be9e6fd9a --- /dev/null +++ b/programs/services/services.c @@ -0,0 +1,204 @@ +/* + * Services - controls services keeps track of their state + * + * Copyright 2007 Google (Mikolaj Zalewski) + * + * 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 + */ + +#define WIN32_LEAN_AND_MEAN + +#include +#include +#include + +#include "wine/list.h" +#include "wine/unicode.h" +#include "wine/debug.h" + +#include "services.h" + +#define MAX_SERVICE_NAME 260 + +WINE_DEFAULT_DEBUG_CHANNEL(service); + +static struct list g_services; + +/* Registry constants */ +static const WCHAR SZ_SERVICES_KEY[] = { 'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'S','e','r','v','i','c','e','s',0 }; + +/* Service key values names */ +static const WCHAR SZ_DISPLAY_NAME[] = {'D','i','s','p','l','a','y','N','a','m','e',0 }; +static const WCHAR SZ_TYPE[] = {'T','y','p','e',0 }; +static const WCHAR SZ_START[] = {'S','t','a','r','t',0 }; +static const WCHAR SZ_ERROR[] = {'E','r','r','o','r','C','o','n','t','r','o','l',0 }; +static const WCHAR SZ_IMAGE_PATH[] = {'I','m','a','g','e','P','a','t','h',0}; +static const WCHAR SZ_GROUP[] = {'G','r','o','u','p',0}; +static const WCHAR SZ_DEPEND_ON_SERVICE[] = {'D','e','p','e','n','d','O','n','S','e','r','v','i','c','e',0}; +static const WCHAR SZ_DEPEND_ON_GROUP[] = {'D','e','p','e','n','d','O','n','G','r','o','u','p',0}; +static const WCHAR SZ_OBJECT_NAME[] = {'O','b','j','e','c','t','N','a','m','e',0}; +static const WCHAR SZ_TAG[] = {'T','a','g',0}; +static const WCHAR SZ_DESCRIPTION[] = {'D','e','s','c','r','i','p','t','i','o','n',0}; + + +static void free_service_entry(struct service_entry *entry) +{ + HeapFree(GetProcessHeap(), 0, entry->name); + HeapFree(GetProcessHeap(), 0, entry->config.lpBinaryPathName); + HeapFree(GetProcessHeap(), 0, entry->config.lpDependencies); + HeapFree(GetProcessHeap(), 0, entry->config.lpLoadOrderGroup); + HeapFree(GetProcessHeap(), 0, entry->config.lpServiceStartName); + HeapFree(GetProcessHeap(), 0, entry->config.lpDisplayName); + HeapFree(GetProcessHeap(), 0, entry->description); + HeapFree(GetProcessHeap(), 0, entry); +} + +static DWORD load_service_config(HKEY hKey, struct service_entry *entry) +{ + DWORD err; + WCHAR *wptr; + + if ((err = load_reg_string(hKey, SZ_IMAGE_PATH, TRUE, &entry->config.lpBinaryPathName)) != 0) + return err; + if ((err = load_reg_string(hKey, SZ_GROUP, 0, &entry->config.lpLoadOrderGroup)) != 0) + return err; + if ((err = load_reg_string(hKey, SZ_OBJECT_NAME, TRUE, &entry->config.lpServiceStartName)) != 0) + return err; + if ((err = load_reg_string(hKey, SZ_DISPLAY_NAME, 0, &entry->config.lpDisplayName)) != 0) + return err; + if ((err = load_reg_string(hKey, SZ_DESCRIPTION, 0, &entry->description)) != 0) + return err; + if ((err = load_reg_multisz(hKey, SZ_DEPEND_ON_SERVICE, &entry->dependOnServices)) != 0) + return err; + if ((err = load_reg_multisz(hKey, SZ_DEPEND_ON_GROUP, &entry->dependOnGroups)) != 0) + return err; + + if ((err = load_reg_dword(hKey, SZ_TYPE, &entry->config.dwServiceType)) != 0) + return err; + if ((err = load_reg_dword(hKey, SZ_START, &entry->config.dwStartType)) != 0) + return err; + if ((err = load_reg_dword(hKey, SZ_ERROR, &entry->config.dwErrorControl)) != 0) + return err; + if ((err = load_reg_dword(hKey, SZ_TAG, &entry->config.dwTagId)) != 0) + return err; + + WINE_TRACE("Image path = %s\n", wine_dbgstr_w(entry->config.lpBinaryPathName) ); + WINE_TRACE("Group = %s\n", wine_dbgstr_w(entry->config.lpLoadOrderGroup) ); + WINE_TRACE("Service account name = %s\n", wine_dbgstr_w(entry->config.lpServiceStartName) ); + WINE_TRACE("Display name = %s\n", wine_dbgstr_w(entry->config.lpDisplayName) ); + WINE_TRACE("Service dependancies : %s\n", entry->dependOnServices[0] ? "" : "(none)"); + for (wptr = entry->dependOnServices; *wptr; wptr += strlenW(wptr) + 1) + WINE_TRACE(" * %s\n", wine_dbgstr_w(wptr)); + WINE_TRACE("Group dependancies : %s\n", entry->dependOnGroups[0] ? "" : "(none)"); + for (wptr = entry->dependOnGroups; *wptr; wptr += strlenW(wptr) + 1) + WINE_TRACE(" * %s\n", wine_dbgstr_w(wptr)); + + return ERROR_SUCCESS; +} + +static BOOL validate_service_config(struct service_entry *entry) +{ + if (entry->config.dwServiceType & SERVICE_WIN32 && (entry->config.lpBinaryPathName == NULL || !entry->config.lpBinaryPathName[0])) + { + WINE_ERR("Service %s is Win32 but have no image path set\n", wine_dbgstr_w(entry->name)); + return FALSE; + } + return TRUE; +} + +static DWORD load_services(void) +{ + HKEY hServicesRootKey; + DWORD err; + int i; + + if ((err = RegCreateKeyExW(HKEY_LOCAL_MACHINE, SZ_SERVICES_KEY, 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_READ, NULL, + &hServicesRootKey, NULL)) != ERROR_SUCCESS) + { + WINE_ERR("Couldn't open services key\n"); + return err; + } + + for (i = 0; TRUE; i++) + { + WCHAR szName[MAX_SERVICE_NAME]; + struct service_entry *entry; + HKEY hServiceKey; + + err = RegEnumKeyW(hServicesRootKey, i, szName, MAX_SERVICE_NAME); + if (err == ERROR_NO_MORE_ITEMS) + break; + + if (err != 0) + { + WINE_ERR("Error %d reading key %d name - skipping\n", err, i); + continue; + } + + entry = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*entry)); + entry->name = strdupW(szName); + + WINE_TRACE("Loading service %s\n", wine_dbgstr_w(szName)); + err = RegOpenKeyExW(hServicesRootKey, szName, 0, KEY_READ | KEY_WRITE, &hServiceKey); + if (err == ERROR_SUCCESS) + { + err = load_service_config(hServiceKey, entry); + RegCloseKey(hServiceKey); + } + + if (err != ERROR_SUCCESS) + { + WINE_ERR("Error %d reading registry key for service %s - skipping\n", err, wine_dbgstr_w(szName)); + free_service_entry(entry); + continue; + } + + if (entry->config.dwServiceType == 0) + { + /* Maybe an application only wrote some configuration in the service key. Continue silently */ + WINE_TRACE("Even the service type not set for service %s - skipping\n", wine_dbgstr_w(szName)); + free_service_entry(entry); + continue; + } + + if (!validate_service_config(entry)) + { + WINE_ERR("Invalid configuration of service %s - skipping\n", wine_dbgstr_w(szName)); + free_service_entry(entry); + continue; + } + + entry->status.dwServiceType = entry->config.dwServiceType; + entry->status.dwCurrentState = SERVICE_STOPPED; + entry->status.dwWin32ExitCode = ERROR_SERVICE_NEVER_STARTED; + /* all other fields are zero */ + + list_add_tail(&g_services, &entry->entry); + } + RegCloseKey(hServicesRootKey); + return ERROR_SUCCESS; +} + +int main(int argc, char *argv[]) +{ + DWORD err; + list_init(&g_services); + if ((err = load_services()) != ERROR_SUCCESS) + return err; + return 0; +} diff --git a/programs/winetest/resource.h b/programs/services/services.h similarity index 51% copy from programs/winetest/resource.h copy to programs/services/services.h index 61fe35cb3cb..7b7c3c12439 100644 --- a/programs/winetest/resource.h +++ b/programs/services/services.h @@ -1,7 +1,7 @@ /* - * Resource definitions + * Services.exe - include file * - * Copyright 2004 Ferenc Wagner + * Copyright 2007 Google (Mikolaj Zalewski) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,40 +18,31 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#define IDI_WINE 1 +#ifndef WINE_PROGRAMS_UTILS_H_ +#define WINE_PROGRAMS_UTILS_H_ -#define IDD_STATUS 100 -#define IDD_ABOUT 101 -#define IDD_TAG 102 +#include "wine/list.h" -#define IDC_STATIC -1 +struct service_entry +{ + struct list entry; + LPWSTR name; + SERVICE_STATUS_PROCESS status; + QUERY_SERVICE_CONFIGW config; + LPWSTR description; + LPWSTR dependOnServices; + LPWSTR dependOnGroups; +}; -#define IDC_ST0 1000 -#define IDC_PB0 1001 -#define IDC_ST1 1002 -#define IDC_PB1 1003 -#define IDC_ST2 1004 -#define IDC_PB2 1005 +extern HANDLE g_hStartedEvent; -#define IDC_DIR 2000 -#define IDC_OUT 2001 -#define IDC_TAG 2002 +DWORD RPC_MainLoop(void); -#define IDC_SB 3000 +/* from utils.c */ +LPWSTR strdupW(LPCWSTR str); -#define IDC_EDIT 4000 -#define IDC_ABOUT 4001 +DWORD load_reg_string(HKEY hKey, LPCWSTR szValue, BOOL bExpand, LPWSTR *output); +DWORD load_reg_multisz(HKEY hKey, LPCWSTR szValue, LPWSTR *output); +DWORD load_reg_dword(HKEY hKey, LPCWSTR szValue, DWORD *output); -/* Resource types */ - -#define TESTRES 1000 -#define STRINGRES 1001 - -/* String resources */ - -#define WINE_BUILD 10000 -#define BUILD_INFO 10001 -#define TESTS_URL 10002 - -/* Revision info strings start from this index: */ -#define REV_INFO 30000 +#endif /*WINE_PROGRAMS_UTILS_H_*/ diff --git a/programs/services/utils.c b/programs/services/utils.c new file mode 100644 index 00000000000..be997e58567 --- /dev/null +++ b/programs/services/utils.c @@ -0,0 +1,147 @@ +/* + * Services.exe - some utility functions + * + * Copyright 2007 Google (Mikolaj Zalewski) + * + * 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 + */ + +#define WIN32_LEAN_AND_MEAN + +#include +#include + +#include "wine/unicode.h" +#include "wine/debug.h" +#include "services.h" + +WINE_DEFAULT_DEBUG_CHANNEL(service); + +LPWSTR strdupW(LPCWSTR str) +{ + int len = strlenW(str); + WCHAR *buf = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*(len+1)); + if (buf == NULL) + return NULL; + strcpyW(buf, str); + return buf; +} + +DWORD load_reg_string(HKEY hKey, LPCWSTR szValue, BOOL bExpand, LPWSTR *output) +{ + DWORD size, type; + LPWSTR buf = NULL; + DWORD err; + + *output = NULL; + if ((err = RegQueryValueExW(hKey, szValue, 0, &type, NULL, &size)) != 0) + { + if (err == ERROR_FILE_NOT_FOUND) + return ERROR_SUCCESS; + goto failed; + } + if (!(type == REG_SZ || (type == REG_EXPAND_SZ && bExpand))) + { + err = ERROR_INVALID_DATATYPE; + goto failed; + } + buf = HeapAlloc(GetProcessHeap(), 0, size + sizeof(WCHAR)); + if ((err = RegQueryValueExW(hKey, szValue, 0, &type, (LPBYTE)buf, &size)) != 0) + goto failed; + buf[size/sizeof(WCHAR)] = 0; + + if (type == REG_EXPAND_SZ) + { + LPWSTR str; + DWORD size = ExpandEnvironmentStringsW(buf, NULL, 0); + if (size == 0) + { + err = GetLastError(); + goto failed; + } + str = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR)); + ExpandEnvironmentStringsW(buf, str, size); + HeapFree(GetProcessHeap(), 0, buf); + *output = str; + } + else + *output = buf; + return ERROR_SUCCESS; + +failed: + WINE_ERR("Error %d while reading value %s\n", err, wine_dbgstr_w(szValue)); + HeapFree(GetProcessHeap(), 0, buf); + return err; +} + +DWORD load_reg_multisz(HKEY hKey, LPCWSTR szValue, LPWSTR *output) +{ + DWORD size, type; + LPWSTR buf = NULL; + DWORD err; + + *output = NULL; + if ((err = RegQueryValueExW(hKey, szValue, 0, &type, NULL, &size)) != 0) + { + if (err == ERROR_FILE_NOT_FOUND) + { + *output = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WCHAR)); + return ERROR_SUCCESS; + } + goto failed; + } + if (type != REG_MULTI_SZ) + { + err = ERROR_INVALID_DATATYPE; + goto failed; + } + buf = HeapAlloc(GetProcessHeap(), 0, size + 2*sizeof(WCHAR)); + if ((err = RegQueryValueExW(hKey, szValue, 0, &type, (LPBYTE)buf, &size)) != 0) + goto failed; + buf[size/sizeof(WCHAR)] = 0; + buf[size/sizeof(WCHAR) + 1] = 0; + *output = buf; + return ERROR_SUCCESS; + +failed: + WINE_ERR("Error %d while reading value %s\n", err, wine_dbgstr_w(szValue)); + HeapFree(GetProcessHeap(), 0, buf); + return err; +} + +DWORD load_reg_dword(HKEY hKey, LPCWSTR szValue, DWORD *output) +{ + DWORD size, type; + DWORD err; + + *output = 0; + size = sizeof(DWORD); + if ((err = RegQueryValueExW(hKey, szValue, 0, &type, (LPBYTE)output, &size)) != 0) + { + if (err == ERROR_FILE_NOT_FOUND) + return ERROR_SUCCESS; + goto failed; + } + if (type != REG_DWORD || size != sizeof(DWORD)) + { + err = ERROR_INVALID_DATATYPE; + goto failed; + } + return ERROR_SUCCESS; + +failed: + WINE_ERR("Error %d while reading value %s\n", err, wine_dbgstr_w(szValue)); + return err; +} diff --git a/programs/winecfg/x11drvdlg.c b/programs/winecfg/x11drvdlg.c index 972ca6d3c22..a631493d9ea 100644 --- a/programs/winecfg/x11drvdlg.c +++ b/programs/winecfg/x11drvdlg.c @@ -40,6 +40,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(winecfg); #define MAXDPI 480 #define DEFDPI 96 +#define IDT_DPIEDIT 0x1234 + static const WCHAR logpixels_reg[] = {'S','y','s','t','e','m','\\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\','H','a','r','d','w','a','r','e',' ','P','r','o','f','i','l','e','s','\\','C','u','r','r','e','n','t','\\','S','o','f','t','w','a','r','e','\\','F','o','n','t','s',0}; static const WCHAR logpixels[] = {'L','o','g','P','i','x','e','l','s',0}; @@ -253,18 +255,16 @@ static INT read_logpixels_reg(void) static void init_dpi_editbox(HWND hDlg) { - HWND hDpiEditBox = GetDlgItem(hDlg, IDC_RES_DPIEDIT); DWORD dwLogpixels; char szLogpixels[MAXBUFLEN]; updating_ui = TRUE; dwLogpixels = read_logpixels_reg(); - WINE_TRACE("%d\n", (int) dwLogpixels); + WINE_TRACE("%u\n", dwLogpixels); - szLogpixels[0] = 0; - sprintf(szLogpixels, "%d", dwLogpixels); - SendMessage(hDpiEditBox, WM_SETTEXT, 0, (LPARAM) szLogpixels); + sprintf(szLogpixels, "%u", dwLogpixels); + SetDlgItemText(hDlg, IDC_RES_DPIEDIT, szLogpixels); updating_ui = FALSE; } @@ -284,6 +284,40 @@ static void init_trackbar(HWND hDlg) updating_ui = FALSE; } +static void update_dpi_trackbar_from_edit(HWND hDlg, BOOL fix) +{ + DWORD dpi; + + updating_ui = TRUE; + + dpi = GetDlgItemInt(hDlg, IDC_RES_DPIEDIT, NULL, FALSE); + + if (fix) + { + DWORD fixed_dpi = dpi; + + if (dpi < MINDPI) fixed_dpi = MINDPI; + if (dpi > MAXDPI) fixed_dpi = MAXDPI; + + if (fixed_dpi != dpi) + { + char buf[16]; + + dpi = fixed_dpi; + sprintf(buf, "%u", dpi); + SetDlgItemText(hDlg, IDC_RES_DPIEDIT, buf); + } + } + + if (dpi >= MINDPI && dpi <= MAXDPI) + { + SendDlgItemMessage(hDlg, IDC_RES_TRACKBAR, TBM_SETPOS, TRUE, dpi); + set_reg_key_dwordW(HKEY_LOCAL_MACHINE, logpixels_reg, logpixels, dpi); + } + + updating_ui = FALSE; +} + INT_PTR CALLBACK GraphDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -296,6 +330,14 @@ GraphDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) case WM_SHOWWINDOW: set_window_title(hDlg); break; + + case WM_TIMER: + if (wParam == IDT_DPIEDIT) + { + KillTimer(hDlg, IDT_DPIEDIT); + update_dpi_trackbar_from_edit(hDlg, TRUE); + } + break; case WM_COMMAND: switch(HIWORD(wParam)) { @@ -304,6 +346,11 @@ GraphDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) SendMessage(GetParent(hDlg), PSM_CHANGED, 0, 0); if ( ((LOWORD(wParam) == IDC_DESKTOP_WIDTH) || (LOWORD(wParam) == IDC_DESKTOP_HEIGHT)) && !updating_ui ) set_from_desktop_edits(hDlg); + else if (LOWORD(wParam) == IDC_RES_DPIEDIT) + { + update_dpi_trackbar_from_edit(hDlg, FALSE); + SetTimer(hDlg, IDT_DPIEDIT, 1500, NULL); + } break; } case BN_CLICKED: { diff --git a/programs/winefile/Cs.rc b/programs/winefile/Cs.rc index 11aee5776d0..a4e327a46ae 100644 --- a/programs/winefile/Cs.rc +++ b/programs/winefile/Cs.rc @@ -145,9 +145,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Jak používat nápovìdu\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "&Informace o Winefile...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "Informace o &Wine...", ID_ABOUT_WINE -#endif } } @@ -195,7 +192,6 @@ STRINGTABLE IDS_SHELL "Pøíkazový øádek" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Zatím neimplementováno" - IDS_WINE "WINE" IDS_WINE_FILE "Wine File" } diff --git a/programs/winefile/De.rc b/programs/winefile/De.rc index 550f2386b2e..ae1a80fc3bf 100644 --- a/programs/winefile/De.rc +++ b/programs/winefile/De.rc @@ -137,9 +137,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Hilfe &verwenden\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "&Info über Winefile...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "Info über &Wine...", ID_ABOUT_WINE -#endif } } @@ -240,7 +237,6 @@ STRINGTABLE IDS_SHELL "Shell" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Noch nicht implementiert" - IDS_WINE "WINE" IDS_WINE_FILE "Wine File" } @@ -258,30 +254,3 @@ STRINGTABLE IDS_FREE_SPACE_FMT "%s von %s frei" } - -STRINGTABLE -{ -IDS_LICENSE_CAPTION, "LIZENZ" -IDS_LICENSE, -"Diese Bibliothek ist freie Software; Sie dürfen sie unter den \ -Bedingungen der GNU Lesser General Public License, wie von der \ -Free Software Foundation veröffentlicht, weiterverteilen und/oder \ -modifizieren; entweder gemäß Version 2.1 der Lizenz oder (nach \ -Ihrer Option) jeder späteren Version.\n\ -Diese Bibliothek wird in der Hoffnung weiterverbreitet, daß sie \ -nützlich sein wird, jedoch OHNE IRGENDEINE GARANTIE, auch ohne \ -die implizierte Garantie der MARKTREIFE oder der VERWENDBARKEIT \ -FÜR EINEN BESTIMMTEN ZWECK. Mehr Details finden Sie in der \ -GNU Lesser General Public License.\n\ -Sie sollten eine Kopie der GNU Lesser General Public License zusammen \ -mit dieser Bibliothek erhalten haben; falls nicht, schreiben Sie an \ -die Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, \ -Boston, MA 02110, USA." - -IDS_WARRANTY_CAPTION, "KEINE GARANTIE" -IDS_WARRANTY, -"Diese Bibliothek wird in der Hoffnung weiterverbreitet, daß sie nützlich \ -sein wird, jedoch OHNE IRGENDEINE GARANTIE, auch ohne die implizierte Garantie \ -der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Mehr Details \ -finden Sie in der GNU Lesser General Public License." -} diff --git a/programs/winefile/En.rc b/programs/winefile/En.rc index 37a2e07c0e1..ae059d2515b 100644 --- a/programs/winefile/En.rc +++ b/programs/winefile/En.rc @@ -140,10 +140,7 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Help &Search...\tF1", ID_HELP MENUITEM "&Using Help\tF1", ID_HELP_USING MENUITEM SEPARATOR - MENUITEM "&Info about Winefile...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "Info about &Wine...", ID_ABOUT_WINE -#endif + MENUITEM "&About Winefile...", ID_ABOUT } } @@ -236,7 +233,7 @@ STRINGTABLE STRINGTABLE { - IDS_WINEFILE "Winefile" + IDS_WINEFILE "Wine File Manager" IDS_ERROR "Error" IDS_ROOT_FS "root fs" IDS_UNIXFS "unixfs" @@ -244,7 +241,6 @@ STRINGTABLE IDS_SHELL "Shell" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Not yet implemented" - IDS_WINE "WINE" IDS_WINE_FILE "Wine File" } @@ -262,27 +258,3 @@ STRINGTABLE IDS_FREE_SPACE_FMT "%s of %s free" } - -STRINGTABLE -{ -IDS_LICENSE_CAPTION, "LICENSE" -IDS_LICENSE, -"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.\n\ -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.\n\ -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" - -IDS_WARRANTY_CAPTION, "NO WARRANTY" -IDS_WARRANTY, -"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." -} diff --git a/programs/winefile/Es.rc b/programs/winefile/Es.rc index 4ad3e953948..fa82f4fd563 100644 --- a/programs/winefile/Es.rc +++ b/programs/winefile/Es.rc @@ -139,9 +139,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Usando la ayuda\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "&Acerca de Winefile...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "Acerca de &Wine...", ID_ABOUT_WINE -#endif } } @@ -242,7 +239,6 @@ STRINGTABLE IDS_SHELL "Shell" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Aún no implementado" - IDS_WINE "WINE" IDS_WINE_FILE "Wine File" } @@ -260,27 +256,3 @@ STRINGTABLE IDS_FREE_SPACE_FMT "%s de %s libre" } - -STRINGTABLE -{ -IDS_LICENSE_CAPTION, "LICENCIA" -IDS_LICENSE, -"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.\n\ -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.\n\ -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" - -IDS_WARRANTY_CAPTION, "SIN GARANTÍA" -IDS_WARRANTY, -"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." -} diff --git a/programs/winefile/Fr.rc b/programs/winefile/Fr.rc index b990781c8c8..2a8207f5f83 100644 --- a/programs/winefile/Fr.rc +++ b/programs/winefile/Fr.rc @@ -143,9 +143,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Utiliser l'aide\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "À &propos de Winefile", ID_ABOUT -#ifdef __WINE__ - MENUITEM "À propos de &Wine", ID_ABOUT_WINE -#endif } } @@ -246,7 +243,6 @@ STRINGTABLE IDS_SHELL "Shell" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Pas encore implémenté" - IDS_WINE "WINE" IDS_WINE_FILE "Wine File" } @@ -264,30 +260,3 @@ STRINGTABLE IDS_FREE_SPACE_FMT "%s sur %s libre" } - -STRINGTABLE -{ -IDS_LICENSE_CAPTION, "LICENCE" -IDS_LICENSE, -"Cette bibliothèque est libre, vous pouvez la redistribuer et/ou \ -la modifier selon les termes de la Licence Publique Générale GNU \ -Limitée publiée par la Free Software Foundation (version 2.1 ou \ -bien toute autre version ultérieure choisie par vous).\n\ -Cette bibliothèque est distribuée car potentiellement utile, \ -mais SANS AUCUNE GARANTIE, ni explicite ni implicite, y compris \ -les garanties de commercialisation ou d'adaptation dans un but \ -spécifique. Reportez-vous à la Licence Publique Générale GNU \ -Limitée pour plus de détails.\n\ -Vous devez avoir reçu une copie de la Licence Publique Générale \ -GNU Limitée en même temps que cette bibliothèque ; si ce n'est pas \ -le cas, écrivez à la Free Software Foundation, Inc., 51 Franklin St, \ -Fifth Floor, Boston, MA 02111-1301, États-Unis." - -IDS_WARRANTY_CAPTION, "AUCUNE GARANTIE" -IDS_WARRANTY, -"Cette bibliothèque est distribuée car potentiellement utile, \ -mais SANS AUCUNE GARANTIE, ni explicite ni implicite, y compris \ -les garanties de commercialisation ou d'adaptation dans un but \ -spécifique. Reportez-vous à la Licence Publique Générale GNU \ -Limitée pour plus de détails." -} diff --git a/programs/winefile/Hu.rc b/programs/winefile/Hu.rc index 6cd8cdf8d2a..f73f376d875 100644 --- a/programs/winefile/Hu.rc +++ b/programs/winefile/Hu.rc @@ -142,9 +142,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Használat\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "&Winefile-ról...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "W&ine-ról...", ID_ABOUT_WINE -#endif } } diff --git a/programs/winefile/It.rc b/programs/winefile/It.rc index 9d98051ce6e..75a6450e4fb 100644 --- a/programs/winefile/It.rc +++ b/programs/winefile/It.rc @@ -142,9 +142,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Uso dell Guida\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "&Informazioni su Winefile...",ID_ABOUT -#ifdef __WINE__ - MENUITEM "Informazioni su &Wine...", ID_ABOUT_WINE -#endif } } diff --git a/programs/winefile/Ko.rc b/programs/winefile/Ko.rc index 6c431173d3c..6a6f12d1d4c 100644 --- a/programs/winefile/Ko.rc +++ b/programs/winefile/Ko.rc @@ -142,9 +142,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "µµ¿ò¸» »ç¿ë¹ý(&U)\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "Winefile °ü·Ã Á¤º¸(&I)...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "&Wine °ü·Ã Á¤º¸...", ID_ABOUT_WINE -#endif } } @@ -245,7 +242,6 @@ STRINGTABLE IDS_SHELL "¼¿" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "¹Ì±¸Çö" - IDS_WINE "WINE" IDS_WINE_FILE "Wine ÆÄÀÏ" } @@ -263,28 +259,3 @@ STRINGTABLE IDS_FREE_SPACE_FMT "%s of %s »ç¿ë°¡´É" } - - -STRINGTABLE -{ -IDS_LICENSE_CAPTION, "¶óÀ̼¾" -IDS_LICENSE, -"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.\n\ -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.\n\ -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" - -IDS_WARRANTY_CAPTION, "º¸Áõ ¾øÀ½" -IDS_WARRANTY, -"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." -} diff --git a/programs/winefile/Makefile.in b/programs/winefile/Makefile.in index 799ae8efe2c..d14eb7aee8c 100644 --- a/programs/winefile/Makefile.in +++ b/programs/winefile/Makefile.in @@ -14,6 +14,8 @@ C_SRCS = \ RC_SRCS = rsrc.rc +SVG_SRCS = winefile.svg + @MAKE_PROG_RULES@ @DEPENDENCIES@ # everything below this line is overwritten by make depend diff --git a/programs/winefile/Nl.rc b/programs/winefile/Nl.rc index 50ee5feedc0..06eef8e347b 100644 --- a/programs/winefile/Nl.rc +++ b/programs/winefile/Nl.rc @@ -138,9 +138,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Instructie\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "&Over Winefile...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "Over &Wine...", ID_ABOUT_WINE -#endif } } @@ -241,7 +238,6 @@ STRINGTABLE IDS_SHELL "Shell" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Nog niet geimplementeerd" - IDS_WINE "WINE" IDS_WINE_FILE "Wine File" } @@ -259,27 +255,3 @@ STRINGTABLE IDS_FREE_SPACE_FMT "%s van %s vrij" } - -STRINGTABLE -{ -IDS_LICENSE_CAPTION, "LICENTIE" -IDS_LICENSE, -"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.\n\ -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.\n\ -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" - -IDS_WARRANTY_CAPTION, "NO WARRANTY" -IDS_WARRANTY, -"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." -} diff --git a/programs/winefile/No.rc b/programs/winefile/No.rc index 16043c8429e..8a2377025a6 100644 --- a/programs/winefile/No.rc +++ b/programs/winefile/No.rc @@ -139,9 +139,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Br&uk av hjelp\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "&Informasjon om Filbehandling . . .", ID_ABOUT -#ifdef __WINE__ - MENUITEM "Informasjon om &Wine . . .", ID_ABOUT_WINE -#endif } } @@ -242,7 +239,6 @@ STRINGTABLE IDS_SHELL "Skall" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Ikke implementert ennå" - IDS_WINE "WINE" IDS_WINE_FILE "Filbehandling" } @@ -260,27 +256,3 @@ STRINGTABLE IDS_FREE_SPACE_FMT "%s av %s ledig" } - -STRINGTABLE -{ -IDS_LICENSE_CAPTION, "LISENS" -IDS_LICENSE, -"Dette biblioteket er fri programvare; du kan redistribuere det \ -og/eller endre det under vilkårene i «GNU Lesser General Public \ -License», utgitt av the Free Software Foundation; enten \ -versjon 2.1 av Lisensen, eller (hvis du ønsker det) en nyere versjon.\n\ -Dette biblioteket distribueres i håp om at det er nyttig, \ -men UTEN ENHVER GARANTI; ikke engang den uttrykte garantien for \ -HANDELSDYKTIGHET eller EGNETHET FOR ET SPESIELT FORMÅL. Se «GNU \ -Lesser General Public License» for flere detaljer.\n\ -Du skal ha mottatt et eksemplar av «GNU Lesser General Public \ -License» sammen med dette biblioteket; hvis ikke, skriv til: the Free Software \ -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA" - -IDS_WARRANTY_CAPTION, "INGEN GARANTI" -IDS_WARRANTY, -"Dette biblioteket distribueres i håp om at det er nyttig, \ -men UTEN ENHVER GARANTI; ikke engang en uttrykte garantien for \ -HANDELSDYKTIGHET eller EGNETHET FOR ET SPESIELT FORMÅL. Se «GNU \ -Lesser General Public License» for flere detaljer." -} diff --git a/programs/winefile/Pl.rc b/programs/winefile/Pl.rc index 42e5051682e..480c862c1c6 100644 --- a/programs/winefile/Pl.rc +++ b/programs/winefile/Pl.rc @@ -142,9 +142,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&U¿ywanie pomocy", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "&Winefile...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "W&ine...", ID_ABOUT_WINE -#endif } } @@ -244,7 +241,6 @@ STRINGTABLE IDS_SHELL "Pulpit" /* t³umaczenie nie dos³owne, ale chyba lepiej pasuje */ IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Jeszcze nie zaimplementowane" - IDS_WINE "WINE" IDS_WINE_FILE "Wine File" } @@ -262,27 +258,3 @@ STRINGTABLE IDS_FREE_SPACE_FMT "%s z %s wolne" } - -STRINGTABLE -{ -IDS_LICENSE_CAPTION, "LICENCJA" -IDS_LICENSE, -"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.\n\ -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.\n\ -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" - -IDS_WARRANTY_CAPTION, "BEZ GWARANCJI" -IDS_WARRANTY, -"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." -} diff --git a/programs/winefile/Pt.rc b/programs/winefile/Pt.rc index c247caa7cbe..0a859b33ec2 100644 --- a/programs/winefile/Pt.rc +++ b/programs/winefile/Pt.rc @@ -141,9 +141,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Usando a ajuda", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "&Sobre o Winefile...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "Sobre o &Wine...", ID_ABOUT_WINE -#endif } } @@ -264,9 +261,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Pesquisar...", ID_HELP MENUITEM "&Usar a ajuda", ID_HELP_USING MENUITEM SEPARATOR -#ifdef __WINE__ - MENUITEM "Acerca do &Wine...", ID_ABOUT_WINE -#endif } } @@ -348,7 +342,6 @@ STRINGTABLE IDS_SHELL "Shell" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Ainda não implementado" - IDS_WINE "WINE" IDS_WINE_FILE "Wine File" } @@ -364,7 +357,6 @@ STRINGTABLE IDS_SHELL "Linha de Comandos" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Ainda não implementado" - IDS_WINE "WINE" IDS_WINE_FILE "Ficheiro Wine" } diff --git a/programs/winefile/Ru.rc b/programs/winefile/Ru.rc index 6294beb088a..dd07152b491 100644 --- a/programs/winefile/Ru.rc +++ b/programs/winefile/Ru.rc @@ -139,9 +139,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Èñïîëüçîâàíèå ñïðàâêè\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "&Î Winefile...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "Î &Wine...", ID_ABOUT_WINE -#endif } } @@ -241,7 +238,6 @@ STRINGTABLE IDS_SHELL "Shell" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Åù¸ íå ðåàëèçîâàíî" - IDS_WINE "WINE" IDS_WINE_FILE "Wine File" } @@ -259,27 +255,3 @@ STRINGTABLE IDS_FREE_SPACE_FMT "%s èç %s ñâîáîäíî" } - -STRINGTABLE -{ -IDS_LICENSE_CAPTION, "Ëèöåíçèÿ" -IDS_LICENSE, -"Ýòà ðàáîòà ÿâëÿåòñÿ ñâîáîäíûì ïðîãðàììíûì îáåñïå÷åíèåì; âû ìîæåòå ñâîáîäíî ðàñïðîñòðàíÿòü è/èëè \ -èçìåíÿòü å¸ ïðè ñîáëþäåíèè óñëîâèé ëèöåíçèè GNU Lesser General Public \ -êîòîðàÿ áûëà îïóáëèêîâàíà Free Software Foundation; \ -ëèáî âåðñèè 2.1, ëèáî ëþáîé áîëåå ïîçäíåé âåðñèè.\n\ -Äàííàÿ ðàáîòà ðàñïðîñòðàíÿåòñÿ â íàäåæäå, ÷òî îíà áóäåò ïîëåçíîé, \ -íî ÁÅÇ ÂÑßÊÎÉ ÃÀÐÀÍÒÈÈ; â òîì ÷èñëå áåç âûòåêàþùåé ãàðàíòèè \ -ÒÎÂÀÐÍÎÉ ÏÐÈÃÎÄÍÎÑÒÈ èëè ÏÐÈÃÎÄÍÎÑÒÈ ÄËß ×ÀÑÒÍÎÃÎ ÈÑÏÎËÜÇÎÂÀÍÈß. \ -Ñì. GNU Lesser General Public License äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè.\n\ -Âû äîëæíû áûëè ïîëó÷èòü êîïèþ the GNU Lesser General Public \ -License âìåñòå ñ ýòîé ðàáîòîé; åñëè íåò, ïèøèòå: the Free Software \ -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA" - -IDS_WARRANTY_CAPTION, "Îòñóòñòâèå ãàðàíòèè" -IDS_WARRANTY, -"Äàííàÿ ðàáîòà ðàñïðîñòðàíÿåòñÿ â íàäåæäå, ÷òî îíà áóäåò ïîëåçíîé, \ -íî ÁÅÇ ÂÑßÊÎÉ ÃÀÐÀÍÒÈÈ; â òîì ÷èñëå áåç âûòåêàþùåé ãàðàíòèè \ -ÒÎÂÀÐÍÎÉ ÏÐÈÃÎÄÍÎÑÒÈ èëè ÏÐÈÃÎÄÍÎÑÒÈ ÄËß ×ÀÑÒÍÎÃÎ ÈÑÏÎËÜÇÎÂÀÍÈß. \ -Ñì. GNU Lesser General Public License äëÿ áîëåå ïîäðîáíîé èíôîðìàöèè." -} diff --git a/programs/winefile/Si.rc b/programs/winefile/Si.rc index 5441d50aa21..9acbe7f5700 100644 --- a/programs/winefile/Si.rc +++ b/programs/winefile/Si.rc @@ -139,9 +139,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Using Help\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "&Info about Winefile...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "Info about &Wine...", ID_ABOUT_WINE -#endif } } diff --git a/programs/winefile/Sv.rc b/programs/winefile/Sv.rc index 0b52641c3df..83bca511128 100644 --- a/programs/winefile/Sv.rc +++ b/programs/winefile/Sv.rc @@ -139,9 +139,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "&Använda hjälpen\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "Information om &Winefile...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "Info about &Wine...", ID_ABOUT_WINE -#endif } } @@ -189,7 +186,6 @@ STRINGTABLE IDS_SHELL "Skal" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Ej implementerat ännu" - IDS_WINE "WINE" IDS_WINE_FILE "Wine File" } diff --git a/programs/winefile/Tr.rc b/programs/winefile/Tr.rc index 27ca3a290ef..3a75a7e001f 100644 --- a/programs/winefile/Tr.rc +++ b/programs/winefile/Tr.rc @@ -139,9 +139,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "Yardým &Kullanýmý\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "Winefile hakkýnda &bilgi...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "&Wine hakkýnda bilgi...", ID_ABOUT_WINE -#endif } } @@ -242,7 +239,6 @@ STRINGTABLE IDS_SHELL "Kabuk" IDS_TITLEFMT "%s - %s" IDS_NO_IMPL "Henüz tamamlanmadý" - IDS_WINE "WINE" IDS_WINE_FILE "Wine Dosya Yöneticisi" } diff --git a/programs/winefile/Zh.rc b/programs/winefile/Zh.rc index d9b43311d82..39851c89be8 100644 --- a/programs/winefile/Zh.rc +++ b/programs/winefile/Zh.rc @@ -139,9 +139,6 @@ IDM_WINEFILE MENU FIXED IMPURE MENUITEM "ʹÓðïÖú£¨&U£©\tF1", ID_HELP_USING MENUITEM SEPARATOR MENUITEM "&¹ØÓÚ Winefile...", ID_ABOUT -#ifdef __WINE__ - MENUITEM "¹ØÓÚ &Wine...", ID_ABOUT_WINE -#endif } } diff --git a/programs/winefile/resource.h b/programs/winefile/resource.h index 358dc8656c9..1e843e52b39 100644 --- a/programs/winefile/resource.h +++ b/programs/winefile/resource.h @@ -101,9 +101,6 @@ /* winefile extensions */ -#define ID_ABOUT_WINE 0x8000 -#define ID_LICENSE 0x8001 -#define ID_NO_WARRANTY 0x8002 #define ID_WINDOW_AUTOSORT 0x8003 #define ID_VIEW_FULLSCREEN 0x8004 #define ID_PREFERRED_SIZES 0x8005 @@ -122,8 +119,7 @@ #define IDS_SHELL 1205 #define IDS_TITLEFMT 1206 #define IDS_NO_IMPL 1207 -#define IDS_WINE 1208 -#define IDS_WINE_FILE 1209 +#define IDS_WINE_FILE 1208 #define IDS_COL_NAME 1210 #define IDS_COL_SIZE 1211 @@ -136,11 +132,6 @@ #define IDS_COL_SEC 1218 #define IDS_FREE_SPACE_FMT 1219 -#define IDS_LICENSE_CAPTION 1300 -#define IDS_LICENSE 1301 -#define IDS_WARRANTY_CAPTION 1302 -#define IDS_WARRANTY 1303 - /* range for drive bar command ids: 0x9000..0x90FF */ #ifdef __WINE__ diff --git a/programs/winefile/winefile.c b/programs/winefile/winefile.c index 571b543a6b5..ec9b8b5f613 100644 --- a/programs/winefile/winefile.c +++ b/programs/winefile/winefile.c @@ -244,22 +244,6 @@ static void display_network_error(HWND hwnd) MessageBox(hwnd, msg, RS(b2,IDS_WINEFILE), MB_OK); } -static VOID WineLicense(HWND Wnd) -{ - WCHAR cap[20], text[1024]; - LoadStringW(Globals.hInstance, IDS_LICENSE, text, 1024); - LoadStringW(Globals.hInstance, IDS_LICENSE_CAPTION, cap, 20); - MessageBoxW(Wnd, text, cap, MB_ICONINFORMATION | MB_OK); -} - -static VOID WineWarranty(HWND Wnd) -{ - WCHAR cap[20], text[1024]; - LoadStringW(Globals.hInstance, IDS_WARRANTY, text, 1024); - LoadStringW(Globals.hInstance, IDS_WARRANTY_CAPTION, cap, 20); - MessageBoxW(Wnd, text, cap, MB_ICONEXCLAMATION | MB_OK); -} - static inline BOOL get_check(HWND hwnd, INT id) { return BST_CHECKED&SendMessageW(GetDlgItem(hwnd, id), BM_GETSTATE, 0, 0); @@ -2509,25 +2493,11 @@ static LRESULT CALLBACK FrameWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM /*TODO: There are even more menu items! */ -#ifndef _NO_EXTENSIONS -#ifdef __WINE__ - case ID_LICENSE: - WineLicense(Globals.hMainWnd); - break; - - case ID_NO_WARRANTY: - WineWarranty(Globals.hMainWnd); - break; - - case ID_ABOUT_WINE: - ShellAbout(hwnd, RS(b2,IDS_WINE), RS(b1,IDS_WINEFILE), 0); - break; -#endif - case ID_ABOUT: - ShellAbout(hwnd, RS(b1,IDS_WINEFILE), NULL, 0); + ShellAbout(hwnd, RS(b1,IDS_WINEFILE), NULL, + LoadImage( Globals.hInstance, MAKEINTRESOURCE(IDI_WINEFILE), + IMAGE_ICON, 48, 48, LR_SHARED )); break; -#endif /* _NO_EXTENSIONS */ default: /*TODO: if (wParam >= PM_FIRST_LANGUAGE && wParam <= PM_LAST_LANGUAGE) diff --git a/programs/winefile/winefile.h b/programs/winefile/winefile.h index 55d942107c0..cba4843144a 100644 --- a/programs/winefile/winefile.h +++ b/programs/winefile/winefile.h @@ -43,10 +43,6 @@ #include #include -#ifndef __WINE__ -#include /* for alloca() */ -#endif - #include /* for ShellExecute() */ #include /* for SHFormatDrive() */ diff --git a/programs/winefile/winefile.ico b/programs/winefile/winefile.ico dissimilarity index 100% index 51cb8b248ff9cc9f8dd5d35155b1099ec8a39482..4030d8e759f29a81defb969b8309a789e4521f24 100644 GIT binary patch literal 15086 zcwX(BcU%-l|Hr?(cX0HkAczXF0QQC`8pReNc4JBGjo2`VB?eJr2YUw%wwRb0Bes~} z6Gfy5q7sSN6%_=j8af;Ze15Zca306Okv!)4<&S(`ulH-X-JSh@W_EUWc4i>rNJJ(k zB-0!*krPX8ZRNjzVA~I~ZJjz*{%%Dy$ehT5{Vik>4&$iuU@`qO_3^aN`TfC#{GL-O z-1_mG#-#t=B($(PZM zVHXet`~9ck7@dM1?6>n>IXxM@9%h%@dwPyj+*-Pi>V)R|Q{xF|>R_`?G+Wq_KGv<~*f1ZeC%QoW6FSlZn&vMYt1KA4i z>ZM1OciTr}KDt;|R)#9=-n*xeI(Od2b{W=@Umn2OTSo*N2s0hn^mL<0D*nT71 z+>GjuUrn~Qwhm4`oPK0~c4O!&?*rsSGQx}*A{96#*zZIJ1pFA!<fc zr1=?~+vs>|X@8DHqBHF9-V6hVj)v3LUlZnD7x@R*e7960IvfVBbr<=2$ld!5H)>iT zH+)hG*Jsdmva&kLwohU-(h#L~dHII%i+0zHeenhOv9m$ENEVxn%peK~hA8k7#Gz^O zW3DlOCu1x4l>t(2=8`|S5tE;=YZ%I|;dYj10Lh>T=a#-FwulCX40qO&16bsOS&s~{fl0WHrB(B60q9IFeRpg8Cp34>mE2J~6IS7C51 zM}eUdMwJ+zyizPSG3irRd|LD?8XOLV)r}l9R>HaxquD+%7(EkK7aqg%)Gaioq*9#3l)s1WbD%-1>+c>BxFeYtXcCPs_mKOwK1HIyoABR08D+Fhv`Yh zGG@G}$+)No(6?#=`|;CZ<2n?5cYlqk_cJl`Ssp%R`vqnxF*~^!^Aa|9BesO_wm?Vhk3gNwHXoB}#mH?LNd>2CVPq1Rb3L(9*Vrj)586wgkZaYCM)C z=fgX_M8Pt~ij-Hxkz3NAL#3U3bEJ#F7v$L$@;nLl3ru;>rxq87~9jcOMV8Tou^DWq&B|i z`cMkaf{Y7U;Evyc?yj@2ShF8?z5y6@=s5P}lwyDG8)!)kS>JV1wfL;V%<5t-s|#be zc`nAv@aynT&Bh^iyujD5a!VtDxRKu8zp9PDVC`kP{2H~vpLv8X8+KvrzQf=}dMw`5 z8u5v?!qjvl^Pmfl{fDsm>J9vuU4+wxWjL2pP#On3oWEm7JgNKY{A|@FV$Vs9Tzv(R z#E6xDoZ9$A{%GF(a~PVKVsH3W9FF}RVbXF$<`=z501|(^b}iZ1%F3}ud=H<~6q}3s zpkv(vJpVzh@rjPW)T}LRoqAx(+6_2#ISjY+3d+)ej6|t4v)hm%Yih)Ib91I;Ys2Wm z?P6lzc6A{dF&^65o$8ElX7&}UCtc8?pP{w+0Bja{=Y8ny{max18-8<|F=I}R_*L@u zjix7sP)h=f|D18*CPZQ**51d%+`JPSH*N!K>yhmDT19-3=pbt+VsO*hx7w+2(7Nr3 zwZ>G|$CLdi{zV0)NI~q`QH`TPY1FOTTADaAQeUBFiai2bY3g@2A zc@51QMzDRZ3}HONSi?E~TZtN4G(6MPrfD%t(|9d@KHDZd<7}utV`cA3A{s{W{)Hvg zRg zi1q1NZg8$+-f+$XipaKQ4mD_yRM`esF@*2?zrPL6T$#*IS*qDLL*#c1WMM7yT?M}) zKt7fyjANd=4{=0l^)}etE~Byyo?yq%WwfGq*_WEXF^L=EUbpX{+u(Y+Rr4*t+1Nq! z)kV4g14`qtstDtne%E;YYL@E{h`x`i;FoMF;RcN^Ap7>O$-;7J-G){4 z+4f{^*kXu(eq6oI1A@W5=TOskmG_y;-g^Ho2I9z9n*G)T&S^kFoqkp2xg&+9AA)FG z&|B|9JLfp{-i3C<%BAprAmp8S7vRTCE@m;T>Tq0Lf`6YF@H3WIJCA7Nci>r@=WJSm zv+oGrc_2jd*Fxm6R#pb_!i~@legZAl?zPW9l#P|^sGzHYo*I-WSFYKOd$F-;}2-N3;}O$1+yzJVS4&Dj1PyRVN{lEJ%BRiDp;t{ zNF66H6lhyoZq{U5p-TT+ZZpy3My`yi@qBgT`T~uAx&w~g)5g;l!Y1Z5tiB0@_35~3 z6dMK~?P{v8v9-9Rnn-(zcIRH-a%+Ki^NoSrc`HMC7$;l75M|f&0Sm~HCdNw{^l3- zeJTXRivltBY$z6_N)>peRcE0J!u(dBFa6kkz=7vYp{?BkT3Yt({Vf5<@v!dR6Q7*A zgejL|;Bh}yHt+Sh8kVNZ@p<^9_$Y9x$K=Ve%$<=Y`{d!5L?_cBV|O&(U%L&jSIoB-#Ny7Z46`6#leLJk6k6IJvNC8xn_ZicyAQzqLIgan-o~obLfKle zD%NI|D)4>$Od14)&j}3to!!IzG}$K)-z3?5oxtgIH0bMw-mE^y1b&OT!Qt?^lL)^| zDK@?;#irLa={kN2^C-+CO;hpj4PkAWSnR{DhZQ(pgb}{m;Cb;X7GAlIO{w|V#_|hn zS7P_GBxx`Z6Zr69oRx!vuO|C6Z(Sn&k_839!kph-aC`p)$+{yjUbr3>Q#@chZ5{@$ z_QTesEcoZVkrBW!YhuH^+d)1LSJS^RAH;E+pr_YHR)&u^?SOYk6nw(2!#|?{U$Jup zDsea|r6e5qO`y4><1d=*)11}MW$XLu0srkySWTIWCBdOMnpY-6qHo07Pscj_6K!Ga zguXue-Vux8b^H|8T#3f|tFibdTZ-@U%M_e=nO1TgxFgWn&F!Wp`!sLubGq^xe+E;Z zZD{?e2b@1!B%9;pxGweZzl*gcf7X_ap>JXW-;fAw4vU8Wtvfhd@CN6ExlzV18JVTG zfky&^r%!)Ob*&WU%h_w2zV~A?%=^>b`STe)Bo(1&(y8&tT*r3v-Z=p-u{UWp;@yDvhSni zUj^b&L=+B3Mk6w}5Z6n}@mo&rnsqb7t40-#l?hYc$k-8mJVbIq?VUwwQ+X7RHy%5y*JRJC-b7 z`}+RTcHqE}I{nLKP8JqNDdcWNwROJr;a(m%k?{WNr0~yi?$Fhp%F?R&^qT&OPCz0t z2XAE!V*OS+aRqelI%xFx1ev4QSS>Ag_a5Z!ZK}b0mCR|usx(Rv=GW`NWA?sFW@%y( zxb|IG{Tni-!N8z3^DY1Omq>JBY1xOROKbSo(b+Dqf8p4}XFx$$D^aYpHT1h+qFnoliHnHwOUFYI|fnzfmdnt$B)Qobvm66enUfs-mj5^ zr^O;IQF(H5at;4=Nhk*==0V5Lfmr{J-tV1A_33y1HCd6K-iKsn)<(@fPNFBdH+jnB zw+rg)q4M%_=o#u)kex$1jU1CsZQEXE=W43v{QnE};zV3|$mI}CwyUW_rw+o}3Sm82 zUq(+x>$=1IePV5Bf0JfSN^){?G})Hb{jS~Yxx@?4Ari)XdQ?(#UDp3j`Vw8q-jId7bm$D?8?^VDXa0H42cQpN|Dz z3o3XqU!f(@3S-9#W1WI;;a|u8`nvIVFBevZk`*ggD9Z5D`Jd3JaidagUF}!G^NQZK z7d!fU*7W>$5|b;tAEf;U^e=aHb1h?aUe1enVf~fxT`SbNuqNoA{vR=2h5J)mNBbVh z=kx^MLY>>tyPOC6dnMFyl~-;0i}$Cz71lqMuBuGA%9JFPDY;apRF#SYnounbU Mqy + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/programs/winetest/Makefile.in b/programs/winetest/Makefile.in index b2102cea9a8..86a176e6db0 100644 --- a/programs/winetest/Makefile.in +++ b/programs/winetest/Makefile.in @@ -6,6 +6,8 @@ MODULE = winetest.exe APPMODE = -mconsole IMPORTS = comctl32 version user32 gdi32 advapi32 wsock32 kernel32 +EXTRARCFLAGS = -DBUILD_SHA1=\"$$(GIT_DIR=$(TOPSRCDIR)/.git git rev-parse HEAD 2>/dev/null)\" + C_SRCS = \ gui.c \ main.c \ @@ -48,6 +50,7 @@ TESTBINS = \ infosoft_test.exe \ iphlpapi_test.exe \ itss_test.exe \ + jscript_test.exe \ kernel32_test.exe \ localspl_test.exe \ localui_test.exe \ @@ -155,6 +158,8 @@ iphlpapi_test.exe: $(DLLDIR)/iphlpapi/tests/iphlpapi_test.exe$(DLLEXT) cp $(DLLDIR)/iphlpapi/tests/iphlpapi_test.exe$(DLLEXT) $@ && $(STRIP) $@ itss_test.exe: $(DLLDIR)/itss/tests/itss_test.exe$(DLLEXT) cp $(DLLDIR)/itss/tests/itss_test.exe$(DLLEXT) $@ && $(STRIP) $@ +jscript_test.exe: $(DLLDIR)/jscript/tests/jscript_test.exe$(DLLEXT) + cp $(DLLDIR)/jscript/tests/jscript_test.exe$(DLLEXT) $@ && $(STRIP) $@ kernel32_test.exe: $(DLLDIR)/kernel32/tests/kernel32_test.exe$(DLLEXT) cp $(DLLDIR)/kernel32/tests/kernel32_test.exe$(DLLEXT) $@ && $(STRIP) $@ localspl_test.exe: $(DLLDIR)/localspl/tests/localspl_test.exe$(DLLEXT) diff --git a/programs/winetest/main.c b/programs/winetest/main.c index 41879b4ef41..72b74422838 100644 --- a/programs/winetest/main.c +++ b/programs/winetest/main.c @@ -132,6 +132,7 @@ static void print_version (void) OSVERSIONINFOEX ver; BOOL ext; int is_win2k3_r2; + const char *(*wine_get_build_id)(void); ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if (!(ext = GetVersionEx ((OSVERSIONINFO *) &ver))) @@ -148,6 +149,9 @@ static void print_version (void) ver.dwMajorVersion, ver.dwMinorVersion, ver.dwBuildNumber, ver.dwPlatformId, ver.szCSDVersion); + wine_get_build_id = (void *)GetProcAddress(GetModuleHandleA("ntdll.dll"), "wine_get_build_id"); + if (wine_get_build_id) xprintf( " WineBuild=%s\n", wine_get_build_id() ); + is_win2k3_r2 = GetSystemMetrics(SM_SERVERR2); if(is_win2k3_r2) xprintf(" R2 build number=%d\n", is_win2k3_r2); @@ -497,6 +501,7 @@ run_tests (char *logname) int logfile; char *strres, *eol, *nextline; DWORD strsize; + char build[64]; SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); @@ -535,7 +540,8 @@ run_tests (char *logname) xprintf ("Version 4\n"); strres = extract_rcdata (MAKEINTRESOURCE(WINE_BUILD), STRINGRES, &strsize); xprintf ("Tests from build "); - if (strres) xprintf ("%.*s", strsize, strres); + if (LoadStringA( 0, IDS_BUILD_ID, build, sizeof(build) )) xprintf( "%s\n", build ); + else if (strres) xprintf ("%.*s", strsize, strres); else xprintf ("-\n"); strres = extract_rcdata (MAKEINTRESOURCE(TESTS_URL), STRINGRES, &strsize); xprintf ("Archive: "); diff --git a/programs/winetest/resource.h b/programs/winetest/resource.h index 61fe35cb3cb..a40c089416f 100644 --- a/programs/winetest/resource.h +++ b/programs/winetest/resource.h @@ -42,6 +42,8 @@ #define IDC_EDIT 4000 #define IDC_ABOUT 4001 +#define IDS_BUILD_ID 1 + /* Resource types */ #define TESTRES 1000 diff --git a/programs/winetest/winetest.rc b/programs/winetest/winetest.rc index 950981ebb6f..951b923c468 100644 --- a/programs/winetest/winetest.rc +++ b/programs/winetest/winetest.rc @@ -24,6 +24,13 @@ #include "resource.h" +#ifdef BUILD_SHA1 +STRINGTABLE +BEGIN + IDS_BUILD_ID BUILD_SHA1 +END +#endif + IDD_TAG DIALOG 0, 0, 150, 65 STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "No tag supplied" @@ -106,6 +113,7 @@ inetcomm_test.exe TESTRES "inetcomm_test.exe" infosoft_test.exe TESTRES "infosoft_test.exe" iphlpapi_test.exe TESTRES "iphlpapi_test.exe" itss_test.exe TESTRES "itss_test.exe" +jscript_test.exe TESTRES "jscript_test.exe" kernel32_test.exe TESTRES "kernel32_test.exe" localspl_test.exe TESTRES "localspl_test.exe" localui_test.exe TESTRES "localui_test.exe" diff --git a/programs/winhelp/De.rc b/programs/winhelp/De.rc index 8ec84cd4fb9..783226db0b3 100644 --- a/programs/winhelp/De.rc +++ b/programs/winhelp/De.rc @@ -50,6 +50,16 @@ MAIN_MENU MENU LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL } } +IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU +FONT 8, "MS Shell Dlg" +CAPTION "Index" +{ + LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER + PUSHBUTTON "&OK", IDOK, 40, 170, 50, 12 + PUSHBUTTON "&Abbrechen", IDCANCEL, 120, 170, 50, 12 +} + /* Strings */ STRINGTABLE DISCARDABLE LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL @@ -64,8 +74,8 @@ STID_CONTENTS, "&Inhalt" STID_SEARCH, "&Suchen" STID_BACK, "&Zurück" STID_HISTORY, "&Bisher" -STID_TOPICS, "&Topics" +STID_TOPICS, "&Themen" STID_ALL_FILES, "Alle Dateien (*.*)" STID_HELP_FILES_HLP, "Hilfe-Dateien (*.hlp)" -STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?" +STID_FILE_NOT_FOUND_s "'%s' konnte nicht gefunden werden. Wollen Sie selber nach dieser Datei suchen?" } diff --git a/programs/winhelp/Va.rc b/programs/winhelp/Rm.rc similarity index 63% rename from programs/winhelp/Va.rc rename to programs/winhelp/Rm.rc index 647c9df5eda..ebbb154a7aa 100644 --- a/programs/winhelp/Va.rc +++ b/programs/winhelp/Rm.rc @@ -20,13 +20,12 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ +/* FIXME: This file is in the Vallader Romansh dialect and not in the + official Rumantsch Grischun. */ + /* Menu */ -/* -* language : switzerland romanch -* not supported today -*/ -MAIN_MENU MENU LANGUAGE LANG_, SUBLANG_DEFAULT +MAIN_MENU MENU LANGUAGE LANG_ROMANSH, SUBLANG_DEFAULT { POPUP "&Datoteca" { MENUITEM "&Rivir", MNID_FILE_OPEN @@ -44,33 +43,32 @@ MAIN_MENU MENU LANGUAGE LANG_, SUBLANG_DEFAULT POPUP "&Marca" { MENUITEM "&Definir...", MNID_BKMK_DEFINE } - POPUP "&Agüd" { - MENUITEM "&Douvrar l'agüd", MNID_HELP_HELPON - MENUITEM "Adüna da&vant", MNID_HELP_HELPTOP + POPUP "&Ag�d" { + MENUITEM "&Douvrar l'ag�d", MNID_HELP_HELPON + MENUITEM "Ad�na da&vant", MNID_HELP_HELPTOP MENUITEM SEPARATOR MENUITEM "I&nfuormaziuns", MNID_HELP_ABOUT #ifdef WINELIB - MENUITEM "Davart &WINE", MNID_HELP_WINE + MENUITEM "Davart &Wine", MNID_HELP_WINE #endif } } /* Strings */ - -STRINGTABLE DISCARDABLE LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT +STRINGTABLE DISCARDABLE LANGUAGE LANG_ROMANSH, SUBLANG_DEFAULT { -WINE_HELP, "WINE agüd" -WHERROR, "SBAGL" -WARNING, "ATTENZIUN" -INFO, "INFUORMAZIUN" -NOT_IMPLEMENTED, "Na implementa" -HLPFILE_ERROR_s, "Sbagl cun leger la datoteca d'agüd `%s'" -CONTENTS, "&Cuntgnü" -SEARCH, "&Tscherchar" -BACK, "&Inavo" -HISTORY, "&Fin qua" -TOPICS, "T&opics" -ALL_FILES, "Tuot las datotecas (*.*)" -HELP_FILES_HLP, "Datotecas d'agüd (*.hlp)" +STID_WINE_HELP, "WINE ag�d" +STID_WHERROR, "SBAGL" +STID_WARNING, "ATTENZIUN" +STID_INFO, "INFUORMAZIUN" +STID_NOT_IMPLEMENTED, "Na implementa" +STID_HLPFILE_ERROR_s, "Sbagl cun leger la datoteca d'ag�d `%s'" +STID_CONTENTS, "&Cuntgn�" +STID_SEARCH, "&Tscherchar" +STID_BACK, "&Inavo" +STID_HISTORY, "&Fin qua" +STID_TOPICS, "T&opics" +STID_ALL_FILES, "Tuot las datotecas (*.*)" +STID_HELP_FILES_HLP, "Datotecas d'ag�d (*.hlp)" STID_FILE_NOT_FOUND_s "Cannot find '%s'. Do you want to find this file yourself?" } diff --git a/programs/winhelp/rsrc.rc b/programs/winhelp/rsrc.rc index 8109916cd5f..c8a6417b6a6 100644 --- a/programs/winhelp/rsrc.rc +++ b/programs/winhelp/rsrc.rc @@ -41,6 +41,7 @@ #include "No.rc" #include "Pl.rc" #include "Pt.rc" +#include "Rm.rc" #include "Ru.rc" #include "Si.rc" #include "Sk.rc" diff --git a/programs/wordpad/De.rc b/programs/wordpad/De.rc index f5ab003ebda..c5be02f3429 100644 --- a/programs/wordpad/De.rc +++ b/programs/wordpad/De.rc @@ -213,6 +213,8 @@ BEGIN STRING_PREVIEW_PRINT, "&Drucken" STRING_PREVIEW_NEXTPAGE, "&Nächste" STRING_PREVIEW_PREVPAGE, "&Vorherige" + STRING_PREVIEW_TWOPAGES, "Two pages" + STRING_PREVIEW_ONEPAGE, "One page" STRING_PREVIEW_CLOSE, "&Schließen" END diff --git a/programs/wordpad/En.rc b/programs/wordpad/En.rc index b449ae46451..d4d53987cd8 100644 --- a/programs/wordpad/En.rc +++ b/programs/wordpad/En.rc @@ -213,6 +213,8 @@ BEGIN STRING_PREVIEW_PRINT, "Print" STRING_PREVIEW_NEXTPAGE, "Next page" STRING_PREVIEW_PREVPAGE, "Previous page" + STRING_PREVIEW_TWOPAGES, "Two pages" + STRING_PREVIEW_ONEPAGE, "One page" STRING_PREVIEW_CLOSE, "Close" END diff --git a/programs/wordpad/Fr.rc b/programs/wordpad/Fr.rc index 4d239552123..56461374889 100644 --- a/programs/wordpad/Fr.rc +++ b/programs/wordpad/Fr.rc @@ -213,6 +213,8 @@ BEGIN STRING_PREVIEW_PRINT, "Imprimer" STRING_PREVIEW_NEXTPAGE, "Page suivante" STRING_PREVIEW_PREVPAGE, "Page précédente" + STRING_PREVIEW_TWOPAGES, "Two pages" + STRING_PREVIEW_ONEPAGE, "One page" STRING_PREVIEW_CLOSE, "Fermer" END diff --git a/programs/wordpad/Hu.rc b/programs/wordpad/Hu.rc index dc01f628c0a..76bfb896bdb 100644 --- a/programs/wordpad/Hu.rc +++ b/programs/wordpad/Hu.rc @@ -213,6 +213,8 @@ BEGIN STRING_PREVIEW_PRINT, "Print" STRING_PREVIEW_NEXTPAGE, "Next page" STRING_PREVIEW_PREVPAGE, "Previous page" + STRING_PREVIEW_TWOPAGES, "Two pages" + STRING_PREVIEW_ONEPAGE, "One page" STRING_PREVIEW_CLOSE, "Close" END diff --git a/programs/wordpad/Ko.rc b/programs/wordpad/Ko.rc index 73d17809510..59e8f81d0a6 100644 --- a/programs/wordpad/Ko.rc +++ b/programs/wordpad/Ko.rc @@ -208,6 +208,8 @@ BEGIN STRING_PREVIEW_PRINT, "Àμâ" STRING_PREVIEW_NEXTPAGE, "´ÙÀ½ ÆäÀÌÁö" STRING_PREVIEW_PREVPAGE, "ÀÌÀü ÆäÀÌÁö" + STRING_PREVIEW_TWOPAGES, "Two pages" + STRING_PREVIEW_ONEPAGE, "One page" STRING_PREVIEW_CLOSE, "´Ý±â" END diff --git a/programs/wordpad/Nl.rc b/programs/wordpad/Nl.rc index 62f3759ae58..013643ae34e 100644 --- a/programs/wordpad/Nl.rc +++ b/programs/wordpad/Nl.rc @@ -213,6 +213,8 @@ BEGIN STRING_PREVIEW_PRINT, "Print" STRING_PREVIEW_NEXTPAGE, "Next page" STRING_PREVIEW_PREVPAGE, "Previous page" + STRING_PREVIEW_TWOPAGES, "Two pages" + STRING_PREVIEW_ONEPAGE, "One page" STRING_PREVIEW_CLOSE, "Close" END diff --git a/programs/wordpad/No.rc b/programs/wordpad/No.rc index 01e6b7b4e93..c75e610cc4f 100644 --- a/programs/wordpad/No.rc +++ b/programs/wordpad/No.rc @@ -213,6 +213,8 @@ BEGIN STRING_PREVIEW_PRINT, "Skriv ut" STRING_PREVIEW_NEXTPAGE, "Neste side" STRING_PREVIEW_PREVPAGE, "Forrige side" + STRING_PREVIEW_TWOPAGES, "To sider" + STRING_PREVIEW_ONEPAGE, "Én side" STRING_PREVIEW_CLOSE, "Lukk" END diff --git a/programs/wordpad/Pl.rc b/programs/wordpad/Pl.rc index cb29bc9022a..0c4f5ba270b 100644 --- a/programs/wordpad/Pl.rc +++ b/programs/wordpad/Pl.rc @@ -214,6 +214,8 @@ BEGIN STRING_PREVIEW_PRINT, "Drukuj" STRING_PREVIEW_NEXTPAGE, "Nast. strona" STRING_PREVIEW_PREVPAGE, "Poprz. strona" + STRING_PREVIEW_TWOPAGES, "Two pages" + STRING_PREVIEW_ONEPAGE, "One page" STRING_PREVIEW_CLOSE, "Zamknij" END diff --git a/programs/wordpad/Ru.rc b/programs/wordpad/Ru.rc index 3dcfc6d3387..91f6467badd 100644 --- a/programs/wordpad/Ru.rc +++ b/programs/wordpad/Ru.rc @@ -37,11 +37,12 @@ BEGIN BEGIN MENUITEM "&Îòìåíèòü\tCtrl+Z", ID_EDIT_UNDO MENUITEM "&Ïîâòîðèòü\tCtrl+Y", ID_EDIT_REDO - MENUITEM "Âûäåëèòü â&ñå\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR MENUITEM "&Âûðåçàòü\tCtrl+X", ID_EDIT_CUT MENUITEM "&Êîïèðîâàòü\tCtrl+C", ID_EDIT_COPY MENUITEM "&Âñòàâèòü\tCtrl+V", ID_EDIT_PASTE + MENUITEM "&Óäàëèòü\tDEL", ID_EDIT_CLEAR + MENUITEM "Âûäåëèòü â&ñå\tCtrl+A", ID_EDIT_SELECTALL MENUITEM SEPARATOR MENUITEM "&Íàéòè . . .\tCrtl+F", ID_FIND MENUITEM "Íà&éòè äàëåå\tF3", ID_FIND_NEXT @@ -212,6 +213,8 @@ BEGIN STRING_PREVIEW_PRINT, "Ïå÷àòü" STRING_PREVIEW_NEXTPAGE, "Ñëåäóþùàÿ ñòðàíèöà" STRING_PREVIEW_PREVPAGE, "Ïðåäûäóùàÿ ñòðàíèöà" + STRING_PREVIEW_TWOPAGES, "Two pages" + STRING_PREVIEW_ONEPAGE, "One page" STRING_PREVIEW_CLOSE, "Çàêðûòü" END diff --git a/programs/wordpad/Tr.rc b/programs/wordpad/Tr.rc index 26c6d88c09d..506edc12e00 100644 --- a/programs/wordpad/Tr.rc +++ b/programs/wordpad/Tr.rc @@ -216,6 +216,8 @@ BEGIN STRING_PREVIEW_PRINT, "Print" STRING_PREVIEW_NEXTPAGE, "Next page" STRING_PREVIEW_PREVPAGE, "Previous page" + STRING_PREVIEW_TWOPAGES, "Two pages" + STRING_PREVIEW_ONEPAGE, "One page" STRING_PREVIEW_CLOSE, "Close" END diff --git a/programs/wordpad/print.c b/programs/wordpad/print.c index 3fb2d7a8afd..2a4413208c6 100644 --- a/programs/wordpad/print.c +++ b/programs/wordpad/print.c @@ -29,7 +29,9 @@ typedef struct _previewinfo int page; int pages; HDC hdc; + HDC hdc2; HDC hdcSized; + HDC hdcSized2; RECT window; LPWSTR wszFileName; } previewinfo, *ppreviewinfo; @@ -229,6 +231,7 @@ static LPWSTR dialog_print_to_file(HWND hMainWnd) static int get_num_pages(HWND hEditorWnd, FORMATRANGE fr) { int page = 0; + fr.chrg.cpMin = 0; do { @@ -245,11 +248,10 @@ static void char_from_pagenum(HWND hEditorWnd, FORMATRANGE *fr, int page) { int i; - for(i = 1; i <= page; i++) - { - if(i == page) - break; + fr->chrg.cpMin = 0; + for(i = 1; i < page; i++) + { fr->chrg.cpMin = SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)fr); } } @@ -431,7 +433,8 @@ static void preview_bar_show(HWND hMainWnd, BOOL show) AddTextButton(hReBar, STRING_PREVIEW_PRINT, ID_PRINT, BANDID_PREVIEW_BTN1); AddTextButton(hReBar, STRING_PREVIEW_NEXTPAGE, ID_PREVIEW_NEXTPAGE, BANDID_PREVIEW_BTN2); AddTextButton(hReBar, STRING_PREVIEW_PREVPAGE, ID_PREVIEW_PREVPAGE, BANDID_PREVIEW_BTN3); - AddTextButton(hReBar, STRING_PREVIEW_CLOSE, ID_FILE_EXIT, BANDID_PREVIEW_BTN4); + AddTextButton(hReBar, STRING_PREVIEW_TWOPAGES, ID_PREVIEW_NUMPAGES, BANDID_PREVIEW_BTN4); + AddTextButton(hReBar, STRING_PREVIEW_CLOSE, ID_FILE_EXIT, BANDID_PREVIEW_BTN5); hStatic = CreateWindowW(WC_STATICW, NULL, WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, @@ -458,6 +461,7 @@ void init_preview(HWND hMainWnd, LPWSTR wszFileName) { preview.page = 1; preview.hdc = 0; + preview.hdc2 = 0; preview.wszFileName = wszFileName; preview_bar_show(hMainWnd, TRUE); } @@ -616,17 +620,63 @@ LRESULT CALLBACK ruler_proc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) return 0; } +void draw_preview_page(HDC hdc, HDC* hdcSized, FORMATRANGE* lpFr, float ratio, int bmNewWidth, int bmNewHeight, int bmWidth, int bmHeight) +{ + HBITMAP hBitmapScaled = CreateCompatibleBitmap(hdc, bmNewWidth, bmNewHeight); + HPEN hPen; + int TopMargin = (int)((float)twips_to_pixels(lpFr->rc.top, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio); + int BottomMargin = (int)((float)twips_to_pixels(lpFr->rc.bottom, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio); + int LeftMargin = (int)((float)twips_to_pixels(lpFr->rc.left, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio); + int RightMargin = (int)((float)twips_to_pixels(lpFr->rc.right, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio); + + if(*hdcSized) + DeleteDC(*hdcSized); + *hdcSized = CreateCompatibleDC(hdc); + SelectObject(*hdcSized, hBitmapScaled); + + StretchBlt(*hdcSized, 0, 0, bmNewWidth, bmNewHeight, hdc, 0, 0, bmWidth, bmHeight, SRCCOPY); + + /* Draw margin lines */ + hPen = CreatePen(PS_DOT, 1, RGB(0,0,0)); + SelectObject(*hdcSized, hPen); + + MoveToEx(*hdcSized, 0, TopMargin, NULL); + LineTo(*hdcSized, bmNewWidth, TopMargin); + MoveToEx(*hdcSized, 0, BottomMargin, NULL); + LineTo(*hdcSized, bmNewWidth, BottomMargin); + + MoveToEx(*hdcSized, LeftMargin, 0, NULL); + LineTo(*hdcSized, LeftMargin, bmNewHeight); + MoveToEx(*hdcSized, RightMargin, 0, NULL); + LineTo(*hdcSized, RightMargin, bmNewHeight); + +} + +static void draw_preview(HWND hEditorWnd, FORMATRANGE* lpFr, int bmWidth, int bmHeight, RECT* paper, int page) +{ + HBITMAP hBitmapCapture = CreateCompatibleBitmap(lpFr->hdc, bmWidth, bmHeight); + + char_from_pagenum(hEditorWnd, lpFr, page); + SelectObject(lpFr->hdc, hBitmapCapture); + FillRect(lpFr->hdc, paper, GetStockObject(WHITE_BRUSH)); + SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)lpFr); + /* EM_FORMATRANGE sets fr.rc to indicate the area printed in, but we want to + keep the original for drawing margins */ + lpFr->rc = get_print_rect(lpFr->hdcTarget); + SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0); +} + LRESULT print_preview(HWND hMainWnd) { FORMATRANGE fr; GETTEXTLENGTHEX gt; HDC hdc; RECT window, background; - HBITMAP hBitmapCapture, hBitmapScaled; int bmWidth, bmHeight, bmNewWidth, bmNewHeight; float ratioWidth, ratioHeight, ratio; int xOffset, yOffset; int barheight; + float spacing = 20.0; HWND hReBar = GetDlgItem(hMainWnd, IDC_REBAR); PAINTSTRUCT ps; @@ -643,14 +693,20 @@ LRESULT print_preview(HWND hMainWnd) bmWidth = twips_to_pixels(fr.rcPage.right, GetDeviceCaps(hdc, LOGPIXELSX)); bmHeight = twips_to_pixels(fr.rcPage.bottom, GetDeviceCaps(hdc, LOGPIXELSY)); - hBitmapCapture = CreateCompatibleBitmap(hdc, bmWidth, bmHeight); - if(!preview.hdc) { RECT paper; HWND hEditorWnd = GetDlgItem(hMainWnd, IDC_EDITOR); preview.hdc = CreateCompatibleDC(hdc); + + if(preview.hdc2) + { + if((int)preview.hdc2 != -1) + DeleteDC(preview.hdc2); + preview.hdc2 = CreateCompatibleDC(hdc); + } + fr.hdc = preview.hdc; gt.flags = GTL_DEFAULT; gt.codepage = 1200; @@ -665,21 +721,29 @@ LRESULT print_preview(HWND hMainWnd) if(!preview.pages) preview.pages = get_num_pages(hEditorWnd, fr); - SelectObject(preview.hdc, hBitmapCapture); - - char_from_pagenum(hEditorWnd, &fr, preview.page); + fr.hdc = preview.hdc; + draw_preview(hEditorWnd, &fr, bmWidth, bmHeight, &paper, preview.page); - FillRect(preview.hdc, &paper, GetStockObject(WHITE_BRUSH)); - SendMessageW(hEditorWnd, EM_FORMATRANGE, TRUE, (LPARAM)&fr); - SendMessageW(hEditorWnd, EM_FORMATRANGE, FALSE, 0); + if(preview.hdc2) + { + fr.hdc = preview.hdc2; + draw_preview(hEditorWnd, &fr, bmWidth, bmHeight, &paper, preview.page + 1); + } EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_PREVPAGE), preview.page > 1); - EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NEXTPAGE), preview.page < preview.pages); + EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NEXTPAGE), preview.hdc2 ? + (preview.page + 1) < preview.pages : + preview.page < preview.pages); + EnableWindow(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), preview.pages > 1); } barheight = SendMessageW(hReBar, RB_GETBARHEIGHT, 0, 0); - ratioWidth = ((float)window.right - 20.0) / (float)bmHeight; - ratioHeight = ((float)window.bottom - 20.0 - (float)barheight) / (float)bmHeight; + ratioHeight = ((float)window.bottom - spacing - (float)barheight) / (float)bmHeight; + + if(preview.hdc2) + ratioWidth = ((float)window.right / 2.0 - spacing * 2.0) / (float)bmWidth; + else + ratioWidth = ((float)window.right - spacing * 3.0) / (float)bmWidth; if(ratioWidth > ratioHeight) ratio = ratioHeight; @@ -688,45 +752,17 @@ LRESULT print_preview(HWND hMainWnd) bmNewWidth = (int)((float)bmWidth * ratio); bmNewHeight = (int)((float)bmHeight * ratio); - hBitmapScaled = CreateCompatibleBitmap(hdc, bmNewWidth, bmNewHeight); - xOffset = ((window.right - bmNewWidth) / 2); yOffset = ((window.bottom - bmNewHeight + barheight) / 2); - if(window.right != preview.window.right || window.bottom != preview.window.bottom) - { - HPEN hPen; - int TopMargin = (int)((float)twips_to_pixels(fr.rc.top, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio); - int BottomMargin = (int)((float)twips_to_pixels(fr.rc.bottom, GetDeviceCaps(hdc, LOGPIXELSX)) * ratio); - int LeftMargin = (int)((float)twips_to_pixels(fr.rc.left, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio); - int RightMargin = (int)((float)twips_to_pixels(fr.rc.right, GetDeviceCaps(hdc, LOGPIXELSY)) * ratio); - - DeleteDC(preview.hdcSized); - preview.hdcSized = CreateCompatibleDC(hdc); - SelectObject(preview.hdcSized, hBitmapScaled); - - StretchBlt(preview.hdcSized, 0, 0, bmNewWidth, bmNewHeight, preview.hdc, 0, 0, bmWidth, bmHeight, SRCCOPY); - - /* Draw margin lines */ - hPen = CreatePen(PS_DOT, 1, RGB(0,0,0)); - SelectObject(preview.hdcSized, hPen); - - MoveToEx(preview.hdcSized, 0, TopMargin, NULL); - LineTo(preview.hdcSized, bmNewWidth, TopMargin); - MoveToEx(preview.hdcSized, 0, BottomMargin, NULL); - LineTo(preview.hdcSized, bmNewWidth, BottomMargin); - - MoveToEx(preview.hdcSized, LeftMargin, 0, NULL); - LineTo(preview.hdcSized, LeftMargin, bmNewHeight); - MoveToEx(preview.hdcSized, RightMargin, 0, NULL); - LineTo(preview.hdcSized, RightMargin, bmNewHeight); - } + if(!preview.hdc2) + xOffset = (window.right - bmNewWidth) / 2; + else + xOffset = (window.right - bmNewWidth * 2) / 2; window.top = barheight; FillRect(hdc, &window, GetStockObject(GRAY_BRUSH)); - SelectObject(hdc, hBitmapScaled); - background.left = xOffset - 2; background.right = xOffset + bmNewWidth + 2; background.top = yOffset - 2; @@ -734,8 +770,28 @@ LRESULT print_preview(HWND hMainWnd) FillRect(hdc, &background, GetStockObject(BLACK_BRUSH)); + if(window.right != preview.window.right || window.bottom != preview.window.bottom) + { + draw_preview_page(preview.hdc, &preview.hdcSized, &fr, ratio, bmNewWidth, bmNewHeight, bmWidth, bmHeight); + + if(preview.hdc2) + { + background.left += bmNewWidth + spacing; + background.right += bmNewWidth + spacing; + + FillRect(hdc, &background, GetStockObject(BLACK_BRUSH)); + + draw_preview_page(preview.hdc2, &preview.hdcSized2, &fr, ratio, bmNewWidth, bmNewHeight, bmWidth, bmHeight); + } + } + BitBlt(hdc, xOffset, yOffset, bmNewWidth, bmNewHeight, preview.hdcSized, 0, 0, SRCCOPY); + if(preview.hdc2) + { + BitBlt(hdc, xOffset + bmNewWidth + spacing, yOffset, bmNewWidth, bmNewHeight, preview.hdcSized2, 0, 0, SRCCOPY); + } + DeleteDC(fr.hdcTarget); preview.window = window; @@ -744,6 +800,20 @@ LRESULT print_preview(HWND hMainWnd) return 0; } +void update_preview(HWND hWnd) +{ + RECT rc; + + DeleteDC(preview.hdc); + preview.hdc = 0; + + preview.window.right = 0; + + GetClientRect(hWnd, &rc); + rc.top += SendMessageW(GetDlgItem(hWnd, IDC_REBAR), RB_GETBARHEIGHT, 0, 0); + InvalidateRect(hWnd, &rc, TRUE); +} + LRESULT preview_command(HWND hWnd, WPARAM wParam, LPARAM lParam) { switch(LOWORD(wParam)) @@ -755,20 +825,37 @@ LRESULT preview_command(HWND hWnd, WPARAM wParam, LPARAM lParam) case ID_PREVIEW_NEXTPAGE: case ID_PREVIEW_PREVPAGE: { - HWND hReBar = GetDlgItem(hWnd, IDC_REBAR); - RECT rc; - if(LOWORD(wParam) == ID_PREVIEW_NEXTPAGE) preview.page++; else preview.page--; - preview.hdc = 0; - preview.window.right = 0; + update_preview(hWnd); + } + break; + + case ID_PREVIEW_NUMPAGES: + { + HWND hReBar = GetDlgItem(hWnd, IDC_REBAR); + WCHAR name[MAX_STRING_LEN]; + HINSTANCE hInst = (HINSTANCE)GetWindowLongPtrW(hWnd, GWLP_HINSTANCE); + + if(preview.hdc2) + { + DeleteDC(preview.hdc2); + preview.hdc2 = 0; + } else + { + if(preview.page == preview.pages) + preview.page--; + preview.hdc2 = (HDC)-1; + } + + LoadStringW(hInst, preview.hdc2 ? STRING_PREVIEW_ONEPAGE : STRING_PREVIEW_TWOPAGES, + name, MAX_STRING_LEN); - GetClientRect(hWnd, &rc); - rc.top += SendMessageW(hReBar, RB_GETBARHEIGHT, 0, 0); - InvalidateRect(hWnd, &rc, TRUE); + SetWindowTextW(GetDlgItem(hReBar, ID_PREVIEW_NUMPAGES), name); + update_preview(hWnd); } break; diff --git a/programs/wordpad/wordpad.h b/programs/wordpad/wordpad.h index 1e270e08981..42682dd98cf 100644 --- a/programs/wordpad/wordpad.h +++ b/programs/wordpad/wordpad.h @@ -44,6 +44,7 @@ #define ID_PREVIEW_NEXTPAGE 1017 #define ID_PREVIEW_PREVPAGE 1018 +#define ID_PREVIEW_NUMPAGES 1019 #define ID_ALIGN_LEFT 1100 #define ID_ALIGN_CENTER 1101 @@ -79,7 +80,7 @@ #define ID_TOGGLE_STATUSBAR 1502 #define ID_TOGGLE_RULER 1503 -#define PREVIEW_BUTTONS 4 +#define PREVIEW_BUTTONS 5 #define FILELIST_ENTRIES 4 #define FILELIST_ENTRY_LENGTH 33 @@ -95,7 +96,8 @@ #define BANDID_PREVIEW_BTN2 7 #define BANDID_PREVIEW_BTN3 8 #define BANDID_PREVIEW_BTN4 9 -#define BANDID_PREVIEW_BUFFER 10 +#define BANDID_PREVIEW_BTN5 10 +#define BANDID_PREVIEW_BUFFER 11 #define ID_WORDWRAP_NONE 0 #define ID_WORDWRAP_WINDOW 1 @@ -178,9 +180,11 @@ #define STRING_PREVIEW_PRINT 1414 #define STRING_PREVIEW_NEXTPAGE 1415 #define STRING_PREVIEW_PREVPAGE 1416 -#define STRING_PREVIEW_CLOSE 1417 +#define STRING_PREVIEW_TWOPAGES 1417 +#define STRING_PREVIEW_ONEPAGE 1418 +#define STRING_PREVIEW_CLOSE 1419 -#define STRING_UNITS_CM 1418 +#define STRING_UNITS_CM 1420 #define STRING_DEFAULT_FILENAME 1700 #define STRING_PROMPT_SAVE_CHANGES 1701 diff --git a/server/security.h b/server/security.h index ebdf95f99c0..39b1d2f72ff 100644 --- a/server/security.h +++ b/server/security.h @@ -48,7 +48,7 @@ extern const PSID security_local_system_sid; extern struct token *token_create_admin(void); extern struct token *token_duplicate( struct token *src_token, unsigned primary, - SECURITY_IMPERSONATION_LEVEL impersonation_level ); + int impersonation_level ); extern int token_check_privileges( struct token *token, int all_required, const LUID_AND_ATTRIBUTES *reqprivs, unsigned int count, LUID_AND_ATTRIBUTES *usedprivs); diff --git a/server/token.c b/server/token.c index 72b3e293f28..7352ec20508 100644 --- a/server/token.c +++ b/server/token.c @@ -90,7 +90,7 @@ struct token unsigned primary; /* is this a primary or impersonation token? */ ACL *default_dacl; /* the default DACL to assign to objects created by this user */ TOKEN_SOURCE source; /* source of the token */ - SECURITY_IMPERSONATION_LEVEL impersonation_level; /* impersonation level this token is capable of if non-primary token */ + int impersonation_level; /* impersonation level this token is capable of if non-primary token */ }; struct privilege @@ -421,7 +421,7 @@ static struct token *create_token( unsigned primary, const SID *user, const LUID_AND_ATTRIBUTES *privs, unsigned int priv_count, const ACL *default_dacl, TOKEN_SOURCE source, const luid_t *modified_id, - SECURITY_IMPERSONATION_LEVEL impersonation_level ) + int impersonation_level ) { struct token *token = alloc_object( &token_ops ); if (token) @@ -506,7 +506,7 @@ static struct token *create_token( unsigned primary, const SID *user, } struct token *token_duplicate( struct token *src_token, unsigned primary, - SECURITY_IMPERSONATION_LEVEL impersonation_level ) + int impersonation_level ) { const luid_t *modified_id = primary || (impersonation_level == src_token->impersonation_level) ? @@ -515,20 +515,19 @@ struct token *token_duplicate( struct token *src_token, unsigned primary, struct privilege *privilege; struct group *group; - if ((impersonation_level < SecurityAnonymous) || - (impersonation_level > SecurityDelegation)) + if (!primary && + (impersonation_level < SecurityAnonymous || + impersonation_level > SecurityDelegation || + (!src_token->primary && (impersonation_level > src_token->impersonation_level)))) { set_error( STATUS_BAD_IMPERSONATION_LEVEL ); return NULL; } - if (primary || (impersonation_level <= src_token->impersonation_level)) - token = create_token( primary, src_token->user, NULL, 0, - NULL, 0, src_token->default_dacl, - src_token->source, modified_id, - impersonation_level ); - else set_error( STATUS_BAD_IMPERSONATION_LEVEL ); - + token = create_token( primary, src_token->user, NULL, 0, + NULL, 0, src_token->default_dacl, + src_token->source, modified_id, + impersonation_level ); if (!token) return token; /* copy groups */ @@ -1013,7 +1012,7 @@ DECL_HANDLER(open_token) { if (thread->token) { - if (thread->token->impersonation_level <= SecurityAnonymous) + if (!thread->token->primary && thread->token->impersonation_level <= SecurityAnonymous) set_error( STATUS_CANT_OPEN_ANONYMOUS ); else reply->token = alloc_handle( current->process, thread->token, diff --git a/tools/widl/client.c b/tools/widl/client.c index 7747f114cfb..7f2a8064648 100644 --- a/tools/widl/client.c +++ b/tools/widl/client.c @@ -70,6 +70,20 @@ static void check_pointers(const func_t *func) } } +const var_t* get_context_handle_var(const func_t* func) +{ + const var_t* var; + + if (!func->args) + return NULL; + + LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry ) + if (is_attr(var->attrs, ATTR_IN) && is_context_handle(var->type)) + return var; + + return NULL; +} + static void write_function_stubs(type_t *iface, unsigned int *proc_offset) { const func_t *func; @@ -85,13 +99,21 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) { const var_t *def = func->def; const var_t* explicit_handle_var; + const var_t* explicit_generic_handle_var = NULL; + const var_t* context_handle_var = NULL; int has_full_pointer = is_full_pointer_function(func); /* check for a defined binding handle */ explicit_handle_var = get_explicit_handle_var(func); + if (!explicit_handle_var) + { + explicit_generic_handle_var = get_explicit_generic_handle_var(func); + if (!explicit_generic_handle_var) + context_handle_var = get_context_handle_var(func); + } if (explicit_handle) { - if (!explicit_handle_var) + if (!explicit_handle_var || !explicit_generic_handle_var || !context_handle_var) { error("%s() does not define an explicit binding handle!\n", def->name); return; @@ -131,7 +153,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) fprintf(client, " _RetVal;\n"); } - if (implicit_handle || explicit_handle_var) + if (implicit_handle || explicit_handle_var || explicit_generic_handle_var || context_handle_var) print_client("RPC_BINDING_HANDLE _Handle = 0;\n"); print_client("RPC_MESSAGE _RpcMessage;\n"); @@ -172,6 +194,25 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) print_client("_Handle = %s;\n", explicit_handle_var->name); fprintf(client, "\n"); } + else if (explicit_generic_handle_var) + { + print_client("_Handle = %s_bind(%s);\n", + get_explicit_generic_handle_type(explicit_generic_handle_var)->name, + explicit_generic_handle_var->name); + fprintf(client, "\n"); + } + else if (context_handle_var) + { + /* if the context_handle attribute appears in the chain of types + * without pointers being followed, then the context handle must + * be direct, otherwise it is a pointer */ + int is_ch_ptr = is_aliaschain_attr(context_handle_var->type, ATTR_CONTEXTHANDLE) ? FALSE : TRUE; + print_client("if (%s%s != 0)\n", is_ch_ptr ? "*" : "", context_handle_var->name); + indent++; + print_client("_Handle = NDRCContextBinding(%s%s);\n", is_ch_ptr ? "*" : "", context_handle_var->name); + indent--; + fprintf(client, "\n"); + } write_remoting_arguments(client, indent, func, PASS_IN, PHASE_BUFFERSIZE); @@ -179,7 +220,7 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) indent++; print_client("(PMIDL_STUB_MESSAGE)&_StubMsg,\n"); print_client("_StubMsg.BufferLength,\n"); - if (implicit_handle || explicit_handle_var) + if (implicit_handle || explicit_handle_var || explicit_generic_handle_var || context_handle_var) print_client("_Handle);\n"); else print_client("%s__MIDL_AutoBindHandle);\n", iface->name); @@ -254,6 +295,17 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) print_client("NdrFreeBuffer((PMIDL_STUB_MESSAGE)&_StubMsg);\n"); + if (!implicit_handle && explicit_generic_handle_var) + { + fprintf(client, "\n"); + print_client("if (_Handle)\n"); + indent++; + print_client("%s_unbind(%s, _Handle);\n", + get_explicit_generic_handle_type(explicit_generic_handle_var)->name, + explicit_generic_handle_var->name); + indent--; + } + indent--; print_client("}\n"); print_client("RpcEndFinally\n"); diff --git a/tools/widl/header.c b/tools/widl/header.c index 0a28fd93558..f1e5a035d9e 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -34,9 +34,12 @@ #include "parser.h" #include "header.h" +typedef struct _user_type_t generic_handle_t; + static int indentation = 0; user_type_list_t user_type_list = LIST_INIT(user_type_list); static context_handle_list_t context_handle_list = LIST_INIT(context_handle_list); +static struct list generic_handle_list = LIST_INIT(generic_handle_list); static void indent(FILE *h, int delta) { @@ -66,6 +69,19 @@ int is_ptrchain_attr(const var_t *var, enum attr_type t) } } +int is_aliaschain_attr(const type_t *type, enum attr_type attr) +{ + const type_t *t = type; + for (;;) + { + if (is_attr(t->attrs, attr)) + return 1; + else if (t->kind == TKIND_ALIAS) + t = t->orig; + else return 0; + } +} + int is_attr(const attr_list_t *list, enum attr_type t) { const attr_t *attr; @@ -330,7 +346,18 @@ static int context_handle_registered(const char *name) return 0; } -void check_for_user_types_and_context_handles(const var_list_t *list) +static int generic_handle_registered(const char *name) +{ + generic_handle_t *gh; + LIST_FOR_EACH_ENTRY(gh, &generic_handle_list, generic_handle_t, entry) + if (!strcmp(name, gh->name)) + return 1; + return 0; +} + +/* check for types which require additional prototypes to be generated in the + * header */ +void check_for_additional_prototype_types(const var_list_t *list) { const var_t *v; @@ -352,6 +379,16 @@ void check_for_user_types_and_context_handles(const var_list_t *list) /* don't carry on parsing fields within this type */ break; } + if (type->type != RPC_FC_BIND_PRIMITIVE && is_attr(type->attrs, ATTR_HANDLE)) { + if (!generic_handle_registered(name)) + { + generic_handle_t *gh = xmalloc(sizeof(*gh)); + gh->name = xstrdup(name); + list_add_tail(&generic_handle_list, &gh->entry); + } + /* don't carry on parsing fields within this type */ + break; + } if (is_attr(type->attrs, ATTR_WIREMARSHAL)) { if (!user_type_registered(name)) { @@ -365,7 +402,7 @@ void check_for_user_types_and_context_handles(const var_list_t *list) } else { - check_for_user_types_and_context_handles(type->fields); + check_for_additional_prototype_types(type->fields); } } } @@ -394,6 +431,17 @@ void write_context_handle_rundowns(void) } } +void write_generic_handle_routines(void) +{ + generic_handle_t *gh; + LIST_FOR_EACH_ENTRY(gh, &generic_handle_list, generic_handle_t, entry) + { + const char *name = gh->name; + fprintf(header, "handle_t __RPC_USER %s_bind(%s);\n", name, name); + fprintf(header, "void __RPC_USER %s_unbind(%s, handle_t);\n", name, name); + } +} + void write_typedef(type_t *type) { fprintf(header, "typedef "); @@ -524,6 +572,29 @@ const var_t* get_explicit_handle_var(const func_t* func) return NULL; } +const type_t* get_explicit_generic_handle_type(const var_t* var) +{ + const type_t *t; + for (t = var->type; is_ptr(t); t = t->ref) + if (t->type != RPC_FC_BIND_PRIMITIVE && is_attr(t->attrs, ATTR_HANDLE)) + return t; + return NULL; +} + +const var_t* get_explicit_generic_handle_var(const func_t* func) +{ + const var_t* var; + + if (!func->args) + return NULL; + + LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry ) + if (get_explicit_generic_handle_type(var)) + return var; + + return NULL; +} + int has_out_arg_or_return(const func_t *func) { const var_t *var; diff --git a/tools/widl/header.h b/tools/widl/header.h index 656d4b2597b..3f4fee22557 100644 --- a/tools/widl/header.h +++ b/tools/widl/header.h @@ -24,6 +24,7 @@ #include "widltypes.h" extern int is_ptrchain_attr(const var_t *var, enum attr_type t); +extern int is_aliaschain_attr(const type_t *var, enum attr_type t); extern int is_attr(const attr_list_t *list, enum attr_type t); extern void *get_attrp(const attr_list_t *list, enum attr_type t); extern unsigned long get_attrv(const attr_list_t *list, enum attr_type t); @@ -61,7 +62,10 @@ extern void write_externdef(const var_t *v); extern void write_library(const char *name, const attr_list_t *attr); extern void write_user_types(void); extern void write_context_handle_rundowns(void); +extern void write_generic_handle_routines(void); extern const var_t* get_explicit_handle_var(const func_t* func); +extern const type_t* get_explicit_generic_handle_type(const var_t* var); +extern const var_t* get_explicit_generic_handle_var(const func_t* func); extern int has_out_arg_or_return(const func_t *func); extern void write_guid(FILE *f, const char *guid_prefix, const char *name, const UUID *uuid); @@ -78,7 +82,7 @@ static inline int last_array(const type_t *type) static inline int is_string_type(const attr_list_t *attrs, const type_t *type) { - return ((is_attr(attrs, ATTR_STRING) || is_attr(type->attrs, ATTR_STRING)) + return ((is_attr(attrs, ATTR_STRING) || is_aliaschain_attr(type, ATTR_STRING)) && (last_ptr(type) || last_array(type))); } diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 3a8972368a7..a4f383fe1cd 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -2072,7 +2072,7 @@ static void check_all_user_types(ifref_list_t *ifrefs) { const func_list_t *fs = ifref->iface->funcs; if (fs) LIST_FOR_EACH_ENTRY(f, fs, const func_t, entry) - check_for_user_types_and_context_handles(f->args); + check_for_additional_prototype_types(f->args); } } diff --git a/tools/widl/server.c b/tools/widl/server.c index 820339639fd..a81c602baeb 100644 --- a/tools/widl/server.c +++ b/tools/widl/server.c @@ -184,9 +184,13 @@ static void write_function_stubs(type_t *iface, unsigned int *proc_offset) fprintf(server, ",\n"); if (is_context_handle(var->type)) { + /* if the context_handle attribute appears in the chain of types + * without pointers being followed, then the context handle must + * be direct, otherwise it is a pointer */ + int is_ch_ptr = is_aliaschain_attr(var->type, ATTR_CONTEXTHANDLE) ? FALSE : TRUE; print_server("("); write_type_decl_left(server, var->type); - fprintf(server, ")%sNDRSContextValue(%s)", is_ptr(var->type) ? "" : "*", var->name); + fprintf(server, ")%sNDRSContextValue(%s)", is_ch_ptr ? "" : "*", var->name); } else { diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index ae23f94df1d..2b0a624daeb 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -58,6 +58,9 @@ static size_t write_struct_tfs(FILE *file, type_t *type, const char *name, unsig static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *type, const char *name, int write_ptr, unsigned int *tfsoff); static const var_t *find_array_or_string_in_struct(const type_t *type); +static size_t write_string_tfs(FILE *file, const attr_list_t *attrs, + type_t *type, + const char *name, unsigned int *typestring_offset); const char *string_of_type(unsigned char type) { @@ -981,27 +984,13 @@ static unsigned int write_nonsimple_pointer(FILE *file, const type_t *type, size return 4; } -static unsigned char conf_string_type_of_char_type(unsigned char t) -{ - switch (t) - { - case RPC_FC_BYTE: - case RPC_FC_CHAR: - return RPC_FC_C_CSTRING; - case RPC_FC_WCHAR: - return RPC_FC_C_WSTRING; - } - - error("string_type_of_char_type: unrecognized type %d\n", t); - return 0; -} - static unsigned int write_simple_pointer(FILE *file, const type_t *type) { - unsigned char fc - = is_string_type(type->attrs, type) - ? conf_string_type_of_char_type(type->ref->type) - : type->ref->type; + unsigned char fc = type->ref->type; + /* for historical reasons, write_simple_pointer also handled string types, + * but no longer does. catch bad uses of the function with this check */ + if (is_string_type(type->attrs, type)) + error("write_simple_pointer: can't handle type %s which is a string type\n", type->name); print_file(file, 2, "0x%02x, 0x8,\t/* %s [simple_pointer] */\n", type->type, string_of_type(type->type)); print_file(file, 2, "0x%02x,\t/* %s */\n", fc, string_of_type(fc)); @@ -1202,7 +1191,12 @@ static int write_no_repeat_pointer_descriptions( *typestring_offset += 6; if (is_ptr(type)) - write_pointer_tfs(file, type, typestring_offset); + { + if (is_string_type(type->attrs, type)) + write_string_tfs(file, NULL, type, NULL, typestring_offset); + else + write_pointer_tfs(file, type, typestring_offset); + } else { unsigned absoff = type->typestring_offset; @@ -1268,7 +1262,9 @@ static int write_pointer_description_offsets( } *typestring_offset += 4; - if (processed(type->ref) || is_base_type(type->ref->type)) + if (is_string_type(attrs, type)) + write_string_tfs(file, NULL, type, NULL, typestring_offset); + else if (processed(type->ref) || is_base_type(type->ref->type)) write_pointer_tfs(file, type, typestring_offset); else error("write_pointer_description_offsets: type format string unknown\n"); @@ -1535,18 +1531,18 @@ int is_declptr(const type_t *t) static size_t write_string_tfs(FILE *file, const attr_list_t *attrs, type_t *type, - const char *name, unsigned int *typestring_offset, - int toplevel) + const char *name, unsigned int *typestring_offset) { size_t start_offset; unsigned char rtype; - if (toplevel && is_declptr(type)) + if (is_declptr(type)) { unsigned char flag = is_conformant_array(type) ? 0 : RPC_FC_P_SIMPLEPOINTER; int pointer_type = is_ptr(type) ? type->type : get_attrv(attrs, ATTR_POINTERTYPE); if (!pointer_type) pointer_type = RPC_FC_RP; + print_start_tfs_comment(file, type, *typestring_offset); print_file(file, 2,"0x%x, 0x%x,\t/* %s%s */\n", pointer_type, flag, string_of_type(pointer_type), flag ? " [simple_pointer]" : ""); @@ -1828,7 +1824,7 @@ static size_t write_struct_tfs(FILE *file, type_t *type, if (array && !processed(array->type)) array_offset = is_attr(array->attrs, ATTR_STRING) - ? write_string_tfs(file, array->attrs, array->type, array->name, tfsoff, FALSE) + ? write_string_tfs(file, array->attrs, array->type, array->name, tfsoff) : write_array_tfs(file, array->attrs, array->type, array->name, tfsoff); corroff = *tfsoff; @@ -1891,7 +1887,12 @@ static size_t write_struct_tfs(FILE *file, type_t *type, { type_t *ft = f->type; if (is_ptr(ft)) - write_pointer_tfs(file, ft, tfsoff); + { + if (is_string_type(f->attrs, ft)) + write_string_tfs(file, f->attrs, ft, f->name, tfsoff); + else + write_pointer_tfs(file, ft, tfsoff); + } else if (!ft->declarray && is_conformant_array(ft)) { unsigned int absoff = ft->typestring_offset; @@ -2181,8 +2182,8 @@ static size_t write_typeformatstring_var(FILE *file, int indent, const func_t *f return type->typestring_offset; } - if ((last_ptr(type) || last_array(type)) && is_ptrchain_attr(var, ATTR_STRING)) - return write_string_tfs(file, var->attrs, type, var->name, typeformat_offset, TRUE); + if (is_string_type(var->attrs, type)) + return write_string_tfs(file, var->attrs, type, var->name, typeformat_offset); if (is_array(type)) { @@ -2286,6 +2287,10 @@ static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *ty { write_user_tfs(file, type, tfsoff); } + else if (is_string_type(attrs, type)) + { + write_string_tfs(file, attrs, type, name, tfsoff); + } else if (is_ptr(type)) { type_t *ref = type->ref; @@ -2307,10 +2312,6 @@ static int write_embedded_types(FILE *file, const attr_list_t *attrs, type_t *ty retmask |= 1; } } - else if (last_array(type) && is_attr(attrs, ATTR_STRING)) - { - write_string_tfs(file, attrs, type, name, tfsoff, FALSE); - } else if (type->declarray && is_conformant_array(type)) ; /* conformant arrays and strings are handled specially */ else if (is_array(type)) @@ -2778,9 +2779,13 @@ static void write_remoting_arg(FILE *file, int indent, const func_t *func, { if (pass == PASS_IN) { + /* if the context_handle attribute appears in the chain of types + * without pointers being followed, then the context handle must + * be direct, otherwise it is a pointer */ + int is_ch_ptr = is_aliaschain_attr(type, ATTR_CONTEXTHANDLE) ? FALSE : TRUE; print_file(file, indent, "NdrClientContextMarshall(\n"); print_file(file, indent + 1, "&_StubMsg,\n"); - print_file(file, indent + 1, "(NDR_CCONTEXT)%s%s,\n", is_ptr(type) ? "*" : "", var->name); + print_file(file, indent + 1, "(NDR_CCONTEXT)%s%s,\n", is_ch_ptr ? "*" : "", var->name); print_file(file, indent + 1, "%s);\n", in_attr && out_attr ? "1" : "0"); } else diff --git a/tools/widl/widl.c b/tools/widl/widl.c index bb3f6514202..13daf7e17fa 100644 --- a/tools/widl/widl.c +++ b/tools/widl/widl.c @@ -601,6 +601,7 @@ int main(int argc,char *argv[]) fprintf(header, "/* Begin additional prototypes for all interfaces */\n"); fprintf(header, "\n"); write_user_types(); + write_generic_handle_routines(); write_context_handle_rundowns(); fprintf(header, "\n"); fprintf(header, "/* End additional prototypes */\n"); diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index acdc3f1a0c4..7eaacd13964 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -312,7 +312,7 @@ struct _user_type_t { extern unsigned char pointer_default; extern user_type_list_t user_type_list; -void check_for_user_types_and_context_handles(const var_list_t *list); +void check_for_additional_prototype_types(const var_list_t *list); void init_types(void); type_t *alloc_type(void); diff --git a/tools/winapi/msvcmaker b/tools/winapi/msvcmaker index f466bf1ddc8..325339b89e9 100755 --- a/tools/winapi/msvcmaker +++ b/tools/winapi/msvcmaker @@ -575,18 +575,18 @@ sub _generate_dsp($$) { if($debug) { if($lib || $exe) { print OUT "# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od"; - @defines = (qw(WINVER=0x0501 _WIN32_WINNT=0x0501 _WIN32_IE=0x0600 WIN32 _DEBUG _MBCS _LIB)); + @defines = (qw(WINVER=0x0600 _WIN32_WINNT=0x0600 _WIN32_IE=0x0700 WIN32 _DEBUG _MBCS _LIB)); } else { print OUT "# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od"; - @defines = (qw(WINVER=0x0501 _WIN32_WINNT=0x0501 _WIN32_IE=0x0600 WIN32 _DEBUG _WINDOWS _MBCS _USRDLL), ("\U${project}\E_EXPORTS")); + @defines = (qw(WINVER=0x0600 _WIN32_WINNT=0x0600 _WIN32_IE=0x0700 WIN32 _DEBUG _WINDOWS _MBCS _USRDLL), ("\U${project}\E_EXPORTS")); } } else { if($lib || $exe) { print OUT "# ADD BASE CPP /nologo /W3 /GX /O2"; - @defines = (qw(WINVER=0x0501 _WIN32_WINNT=0x0501 _WIN32_IE=0x0600 WIN32 NDEBUG _MBCS _LIB)); + @defines = (qw(WINVER=0x0600 _WIN32_WINNT=0x0600 _WIN32_IE=0x0700 WIN32 NDEBUG _MBCS _LIB)); } else { print OUT "# ADD BASE CPP /nologo /MD /W3 /GX /O2"; - @defines = (qw(WINVER=0x0501 _WIN32_WINNT=0x0501 _WIN32_IE=0x0600 WIN32 NDEBUG _WINDOWS _MBCS _USRDLL), ("\U${project}\E_EXPORTS")); + @defines = (qw(WINVER=0x0600 _WIN32_WINNT=0x0600 _WIN32_IE=0x0700 WIN32 NDEBUG _WINDOWS _MBCS _USRDLL), ("\U${project}\E_EXPORTS")); } } @@ -607,18 +607,18 @@ sub _generate_dsp($$) { if($debug) { if($lib) { print OUT "# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od"; - @defines2 = qw(WINVER=0x0501 _WIN32_WINNT=0x0501 _WIN32_IE=0x0600 WIN32 _DEBUG _WINDOWS _MBCS _LIB); + @defines2 = qw(WINVER=0x0600 _WIN32_WINNT=0x0600 _WIN32_IE=0x0700 WIN32 _DEBUG _WINDOWS _MBCS _LIB); } else { print OUT "# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od"; - @defines2 = qw(WINVER=0x0501 _WIN32_WINNT=0x0501 _WIN32_IE=0x0600 _DEBUG WIN32 _WINDOWS _MBCS _USRDLL); + @defines2 = qw(WINVER=0x0600 _WIN32_WINNT=0x0600 _WIN32_IE=0x700 _DEBUG WIN32 _WINDOWS _MBCS _USRDLL); } } else { if($lib) { print OUT "# ADD CPP /nologo /MD /W3 /GX /O2"; - @defines2 = qw(WINVER=0x0501 _WIN32_WINNT=0x0501 _WIN32_IE=0x0600 WIN32 NDEBUG _WINDOWS _MBCS _LIB); + @defines2 = qw(WINVER=0x0600 _WIN32_WINNT=0x0600 _WIN32_IE=0x0700 WIN32 NDEBUG _WINDOWS _MBCS _LIB); } else { print OUT "# ADD CPP /nologo /MD /W3 /GX /O2"; - @defines2 = qw(WINVER=0x0501 _WIN32_WINNT=0x0501 _WIN32_IE=0x0600 NDEBUG WIN32 _WINDOWS _MBCS _USRDLL); + @defines2 = qw(WINVER=0x0600 _WIN32_WINNT=0x0600 _WIN32_IE=0x0700 NDEBUG WIN32 _WINDOWS _MBCS _USRDLL); } } diff --git a/tools/wine.inf b/tools/wine.inf index 625c8ba9b14..f3a45e6690f 100644 --- a/tools/wine.inf +++ b/tools/wine.inf @@ -2229,6 +2229,7 @@ HKLM,%CurrentVersion%\Telephony\Country List\998,"SameAreaRule",,"G" 11,,dbghelp.dll 11,,ddhelp.exe 11,,ddraw.dll +11,,dosx.exe 11,,dsound.dll 11,,dsound.vxd 11,,gdi32.dll diff --git a/tools/wrc/utils.c b/tools/wrc/utils.c index 24f589e84e9..58d6124584e 100644 --- a/tools/wrc/utils.c +++ b/tools/wrc/utils.c @@ -405,6 +405,7 @@ static const struct lang2cp lang2cps[] = { LANG_PORTUGUESE, SUBLANG_NEUTRAL, 1252 }, { LANG_PUNJABI, SUBLANG_NEUTRAL, 0 }, { LANG_ROMANIAN, SUBLANG_NEUTRAL, 1250 }, + { LANG_ROMANSH, SUBLANG_NEUTRAL, 1252 }, { LANG_RUSSIAN, SUBLANG_NEUTRAL, 1251 }, { LANG_SANSKRIT, SUBLANG_NEUTRAL, 0 }, { LANG_SERBIAN, SUBLANG_NEUTRAL, 1250 }, -- 2.11.4.GIT