From ab7246282c008e5768a38cac01a5724ac9fd0657 Mon Sep 17 00:00:00 2001 From: gho tik Date: Wed, 3 Aug 2016 12:45:12 -0400 Subject: [PATCH] v2_03_55_src Former-commit-id: f9c701a8752969160145a02028b1e3576f355691 --- build/dxwnd.0.ini | 31 +++++++ build/dxwnd.dll | 4 +- build/dxwnd.ini | 176 -------------------------------------- build/dxwnd.reg | 52 ----------- build/readme-relnotes.txt | 6 +- dll/dxwcore.cpp | 13 +++ dll/dxwcore.hpp | 1 + dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 270336 -> 272384 bytes dll/gdi32.cpp | 25 +++++- dll/shareddc.cpp | 146 ++++++++++++------------------- dll/user32.cpp | 9 +- 12 files changed, 137 insertions(+), 328 deletions(-) create mode 100644 build/dxwnd.0.ini delete mode 100644 build/dxwnd.ini delete mode 100644 build/dxwnd.reg diff --git a/build/dxwnd.0.ini b/build/dxwnd.0.ini new file mode 100644 index 0000000..be2c649 --- /dev/null +++ b/build/dxwnd.0.ini @@ -0,0 +1,31 @@ +[window] +posx=50 +posy=50 +sizx=320 +sizy=200 +lang=default +;lang=automatic +;updatepaths=1 +;debug=1 +;multiprocesshook=0 +;checkadmin=0 +[texture] +MinTexX=16 +MaxTexX=0 +MinTexY=16 +MaxTexY=0 +[keymapping] +timetoggle=0x72 +altf4=0x73 +timeslow=0x74 +timefast=0x75 +cliptoggle= +refresh= +logtoggle= +plocktoggle= +fpstoggle= +printscreen=0x7B +corner=0x7A +freezetime=0x79 + + diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 3b22216..8100502 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6ca8e1fa67ffd8ece8ce4dd729b0eec753da49cad2b29f93f9560f96a1105d18 -size 620544 +oid sha256:61651edf36eea1710fe669de4024922eca627ff0992815cd2b51cce9cadbd82c +size 620032 diff --git a/build/dxwnd.ini b/build/dxwnd.ini deleted file mode 100644 index ce40365..0000000 --- a/build/dxwnd.ini +++ /dev/null @@ -1,176 +0,0 @@ -[window] -exepath=D:\Games\Dark Earth\ -exportpath=D:\DxWnd\exports\ -posx=1087 -posy=286 -sizx=320 -sizy=200 -[target] -title0=Warlords Battlecry 3 (GOG) -path0=D:\Games\Warlords Battlecry 3 (GOG)\Battlecry III.exe -launchpath0= -module0= -opengllib0= -notes0= -registry0= -ver0=0 -coord0=2 -flag0=136314914 -flagg0=1207959568 -flagh0=20 -flagi0=138543108 -flagj0=4224 -flagk0=65536 -flagl0=0 -flagm0=0 -tflag0=0 -posx0=50 -posy0=50 -sizx0=800 -sizy0=600 -maxfps0=0 -initts0=0 -winver0=0 -maxres0=-1 -swapeffect0=0 -maxddinterface0=7 -title1=Galapagos -path1=D:\Games\Galapagos\GALA.EXE -launchpath1= -module1= -opengllib1= -notes1= -registry1= -ver1=7 -coord1=0 -flag1=681623718 -flagg1=1207959556 -flagh1=20 -flagi1=203423748 -flagj1=128 -flagk1=65536 -flagl1=0 -flagm1=0 -tflag1=-2147477245 -posx1=50 -posy1=50 -sizx1=800 -sizy1=600 -maxfps1=0 -initts1=0 -winver1=0 -maxres1=-1 -swapeffect1=0 -maxddinterface1=7 -title2=Warlords Battlecry III -path2=D:\Games\Warlords Battlecry III\Battlecry III.exe -launchpath2= -module2= -opengllib2= -notes2= -registry2= -ver2=0 -coord2=0 -flag2=136314914 -flagg2=1207959568 -flagh2=20 -flagi2=-2009071612 -flagj2=4224 -flagk2=65536 -flagl2=0 -flagm2=0 -tflag2=-2147477245 -posx2=50 -posy2=50 -sizx2=880 -sizy2=660 -maxfps2=0 -initts2=0 -winver2=0 -maxres2=-1 -swapeffect2=0 -maxddinterface2=7 -title3=Close Combat 2: a bridge too far -path3=D:\Games\Close Combat 2\CC2.EXE -launchpath3= -module3= -opengllib3= -notes3= -registry3=[HKEY_LOCAL_MACHINE\SOFTWARE]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Close Combat]\n[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Close Combat\2.00]\n"PID"="00000-000-0000000-00000"\n"InstalledTo"="C:\\GAMES\\CC2"\n"ScreenX"="800"\n"ScreenY"="600"\n"Version"="2.0"\n"IType"=hex:01,00,00,00\n"GameSpeed"=hex:01,00,00,00\n"ShowDSAlert"=hex:01,00,00,00\n"ShowQuickHelp"=hex:01,00,00,00\n"PlaySounds"=hex:01,00,00,00\n"PlayMusic"=hex:01,00,00,00\n"PlayVideos"=hex:00,00,00,00\n"FCopy"=hex:00,00,00,00\n"SMethod"=hex:00,00,00,00\n"Save"=hex:00,00,00,00\n"ShowTrees"=hex:01,00,00,00\n"StaticFPS"=hex:0a,00,00,00\n"InstalledFrom"=".\\"\n"Launched"="1"\n"VersionType"="RetailVersion"\n\n[HKEY_LOCAL_MACHINE\SOFTWARE]\n[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft]\n[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games]\n[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games\Close Combat]\n[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games\Close Combat\2.00]\n"PID"="00000-000-0000000-00000"\n"InstalledTo"="C:\\GAMES\\CC2"\n"ScreenX"="800"\n"ScreenY"="600"\n"Version"="2.0"\n"IType"=hex:01,00,00,00\n"GameSpeed"=hex:01,00,00,00\n"ShowDSAlert"=hex:01,00,00,00\n"ShowQuickHelp"=hex:01,00,00,00\n"PlaySounds"=hex:01,00,00,00\n"PlayMusic"=hex:01,00,00,00\n"PlayVideos"=hex:00,00,00,00\n"FCopy"=hex:00,00,00,00\n"SMethod"=hex:00,00,00,00\n"Save"=hex:00,00,00,00\n"ShowTrees"=hex:01,00,00,00\n"StaticFPS"=hex:0a,00,00,00\n"InstalledFrom"=".\\"\n"Launched"="1"\n"VersionType"="RetailVersion"\n\n -ver3=0 -coord3=0 -flag3=134225952 -flagg3=1744830464 -flagh3=1044 -flagi3=1279262724 -flagj3=8392832 -flagk3=0 -flagl3=0 -flagm3=0 -tflag3=0 -posx3=50 -posy3=50 -sizx3=0 -sizy3=0 -maxfps3=0 -initts3=0 -winver3=0 -maxres3=-1 -swapeffect3=0 -maxddinterface3=7 -title4=CyberStrike 2 -path4=D:\Games\CyberStrike 2\CS2OG.FUN -launchpath4= -module4= -opengllib4= -notes4= -registry4= -ver4=0 -coord4=0 -flag4=136314978 -flagg4=1476395008 -flagh4=20 -flagi4=136314884 -flagj4=1054848 -flagk4=65536 -flagl4=0 -flagm4=0 -tflag4=-2147477245 -posx4=50 -posy4=50 -sizx4=800 -sizy4=600 -maxfps4=0 -initts4=0 -winver4=0 -maxres4=-1 -swapeffect4=0 -maxddinterface4=7 -title5=Dark Earth -path5=D:\Games\Dark Earth\dkev.exe -launchpath5= -module5= -opengllib5= -notes5= -registry5= -ver5=0 -coord5=0 -flag5=136331362 -flagg5=1476395008 -flagh5=20 -flagi5=138936324 -flagj5=4224 -flagk5=65536 -flagl5=0 -flagm5=0 -tflag5=-2147477245 -posx5=50 -posy5=50 -sizx5=800 -sizy5=600 -maxfps5=0 -initts5=0 -winver5=0 -maxres5=-1 -swapeffect5=0 -maxddinterface5=7 diff --git a/build/dxwnd.reg b/build/dxwnd.reg deleted file mode 100644 index 3b510dd..0000000 --- a/build/dxwnd.reg +++ /dev/null @@ -1,52 +0,0 @@ -[HKEY_LOCAL_MACHINE\SOFTWARE] -[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft] -[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games] -[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Close Combat] -[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft Games\Close Combat\2.00] -"PID"="00000-000-0000000-00000" -"InstalledTo"="C:\\GAMES\\CC2" -"ScreenX"="800" -"ScreenY"="600" -"Version"="2.0" -"IType"=hex:01,00,00,00 -"GameSpeed"=hex:01,00,00,00 -"ShowDSAlert"=hex:01,00,00,00 -"ShowQuickHelp"=hex:01,00,00,00 -"PlaySounds"=hex:01,00,00,00 -"PlayMusic"=hex:01,00,00,00 -"PlayVideos"=hex:00,00,00,00 -"FCopy"=hex:00,00,00,00 -"SMethod"=hex:00,00,00,00 -"Save"=hex:00,00,00,00 -"ShowTrees"=hex:01,00,00,00 -"StaticFPS"=hex:0a,00,00,00 -"InstalledFrom"=".\\" -"Launched"="1" -"VersionType"="RetailVersion" - -[HKEY_LOCAL_MACHINE\SOFTWARE] -[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft] -[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games] -[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games\Close Combat] -[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft Games\Close Combat\2.00] -"PID"="00000-000-0000000-00000" -"InstalledTo"="C:\\GAMES\\CC2" -"ScreenX"="800" -"ScreenY"="600" -"Version"="2.0" -"IType"=hex:01,00,00,00 -"GameSpeed"=hex:01,00,00,00 -"ShowDSAlert"=hex:01,00,00,00 -"ShowQuickHelp"=hex:01,00,00,00 -"PlaySounds"=hex:01,00,00,00 -"PlayMusic"=hex:01,00,00,00 -"PlayVideos"=hex:00,00,00,00 -"FCopy"=hex:00,00,00,00 -"SMethod"=hex:00,00,00,00 -"Save"=hex:00,00,00,00 -"ShowTrees"=hex:01,00,00,00 -"StaticFPS"=hex:0a,00,00,00 -"InstalledFrom"=".\\" -"Launched"="1" -"VersionType"="RetailVersion" - diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index fdad1e6..a65a363 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1030,4 +1030,8 @@ add: syslib shared dc mode preliminary implementation, thank to Narzoul's ideas. fix: handling of cursor hide/show for programs that don't go through the message window ("Deadlock II rel. 1.2") add: /R:n command line option to automatically start DxWnd in icon tray, run the n-th program in configuration and terminate. add: option to disable the disabling of Alt-Tab key through SetWindowHooks through WH_KEYBOARD_LL event. Make it posssible to use Alt-Tab key on "Dungeon Kepper II". -fix: palette object reference count decremented from extra references and zeroed by the "Return 0 refcount" flag: make it possible to run "Dark Earth" that makes a check on the palette reerence counter before starting the game. \ No newline at end of file +fix: palette object reference count decremented from extra references and zeroed by the "Return 0 refcount" flag: make it possible to run "Dark Earth" that makes a check on the palette reerence counter before starting the game. + +v2.03.55 +fix: differentiated handling of blitting from memory to DC vs. from DC vs. memory. The second case is less frequent, but altered the correct rendering of "Battlezone 1998 edition", now working both in scaled, emulated DC shared DC and shared ddraw and GDI DC. The fix impacts both BitBlt and ScaledBlt GDI calls. +fix: prevented InvalidateRect to return giving a scaled rect. Fixes "Deadlock 2"partial screen updates. \ No newline at end of file diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index bfd77f2..4347e8c 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -711,6 +711,19 @@ void dxwCore::UnmapClient(int *nXDest, int *nYDest) if(h) *nYDest = ((*nYDest * (int)dwScreenHeight) + (h >> 1)) / h; } +void dxwCore::UnmapClient(int *nXDest, int *nYDest, int *nWidth, int *nHeight) +{ + RECT client; + int w, h; + if(!(*pGetClientRect)(hWnd, &client)) return; + w = client.right ? client.right : iSizX; + h = client.bottom ? client.bottom : iSizY; + if(w) *nXDest = ((*nXDest * (int)dwScreenWidth) + (w >> 1)) / w; + if(h) *nYDest = ((*nYDest * (int)dwScreenHeight) + (h >> 1)) / h; + if(w) *nWidth = ((*nWidth * (int)dwScreenWidth) + (w >> 1)) / w; + if(h) *nHeight = ((*nHeight * (int)dwScreenHeight) + (h >> 1)) / h; +} + void dxwCore::UnmapClient(LPRECT lpRect) { RECT client; diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 611be01..6ad431c 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -73,6 +73,7 @@ public: // methods //void MapClient(float *, float *); void UnmapClient(LPPOINT); void UnmapClient(int *, int *); + void UnmapClient(int *, int *, int *, int *); void UnmapClient(LPRECT); void MapWindow(LPPOINT); void MapWindow(LPRECT); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index ffd5170..6813106 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.03.54.fix2" +#define VERSION "2.03.55" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index bcb2651a7db2ff744b794dfbfb9df9ccabcc310e..e4af9b6457f2d0626a6e59c6f0fbc405fe1b192f 100644 GIT binary patch delta 7679 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 BOCyWF5U15KIz-o=Z2>etaH|TTN1*oqH zn*jSW*j&C5#(uY87off^jQzfa&E>8z_G{nHSxr%>`I<*H6ZTXd|9%1|1O6Zn=LzGf z7zvw8fv_Cdg~E!2an>6rY_70DVDp467sem2h0Xi=DrVzgaBH^WVkqiu;>c0G0ydZZ z!gy{E2zyT$e%%;fz-Iq1N!6;(wOzpYI~;djzK@a?#QF#uDr^Pr4-@uC5GxioO&IS0 zmBKa%>j}0|*k*^-+VN%y+$xT};kZrMK4E-%+Ar+1Fb>TRVf#>jER3`KTjKX+kY6k8 zUbv^ioeuM}W_Y{1`5j;#*G;zY^tyVuxY}U-Dl|ka)Da}a*wwP+ZDui3wu>qD*S#cEFdfm>`h^3 zgiQrIE9@^p>@qVR|E~nXG_H%|4PiWtw_x*p{f{ty;Z5=TK^Skm_k^{JbVl%DurSzM zyu$c*OIKlOsO`+p4t)gn7013{>B6#w<$(UNLipRX<=> z^U+Su=@X1s7s)-&xeLYrC1IVxwu}8Isd?wQEcP9#`+)rbn@b2bSsq00cqnhUC{e=L z?%2Uu14a*lMSwnW^b7krSf;Q7VQat&g%t~X4y;7jBw^ja9)r#CTp?^X?8)LcwS(lK zbiio>tHhBXo(r2Fo+s>a*t5j%31K{2)xs7CTMxES*h*oEV70>5wlR*ubpq=J&H`%? z_KL6&uzkV~3FDM;SlAh1Bf!oIYY{dS?1Hc_guMv%C2afmv&Iigo~JR83pST{VZ0){ zi|vo1(_fn-Ex#+G@oh5!e^Tgg|4D()9?|{~FVbNJjX$c3DF3KFL6t{!K3l{74>HNC A?*IS* delta 3788 zcmbtXe{fXQ6@KU5mvxh@%VyoIOGq}GO|n@@3>!?741vwAtU>}4k`S0mQ-(l{u|oxI ztd?pFNU3F*PLjvuFir;|Wul_hXq-I9033ymnz7o} zu2*9)e#F*6t^@aN+3MQwSn>2zCAEL>JC<{6om^xz*k5E<3wg%BvcH>Q&&ConxQy8O zuyNhF#`vRNWxHh8wB;Gbj(N?LWeg6LbJ8Pp>N1L4cNsC42e^Blt`TXP13$MeW6*V5 zUIB)F;7>1AyDv?DHlyB{@6ohc&-e*fSSqu5uX|2XhO#Ks%C z?Gz8t__LpP7x3X$+RRyNDaw}@N-tlY5-wxpZ5#FR!);X0V{0joyBa9Sk++18H?1Wf zw@-;WPUez>15Ko}{Uh>GGq+BO@(C}UwcE{1O)Ef%&2xSV+`{Jvg`X#L$;SIGlP6;p z{OmU3yVvrw>#*4VNfBcIItugtcIx8Y2StJ_1_eARk#-(vhk@%U5gQGYoBP*`eA%IC z{Proag?_~GGon_8@v1!Myb;8ws1%mZ9N4&VlE13W-3;010679-2^ zanA!50Qo=x;0FqU08j)3fnuNpCW5}*`NF3(46Yt-`gNJ(t0EQ#65hhjJ$Xm<)}7Y3${lQ#J%Ss zvaT{{)e>^=5(*9~pd`)R@tHZ|aZl~yYrpEi(Z;vyYbAbzEp&q~p~ zkABX}o}*4`m?QOM0<}j^&`;BmL{ywcq#&R7+(SEtFOuK%4~b8*xxHI#fEN&by|P%T z%Hn3%jIi_N6bji*rPjrLGr~g;D_f;}u2_25 zpMox}WLb3^QghKS`MDxluh^bviuc5HA)59RiXWw4M>@=?{5_Uu=dQtw#a8_gHhOQm zBJXoxgP&Z3$^!}XlCVSOOUNl1m*(iE zF|@&CIXG&hnQv8xEH7fWj6c363b{p9kE}xJviynVNUKF9_@oOxqyx<*Er?An8Boa% zOgQCf(%2wZ;jQvM6|?o+f0EiMrX>3qZAN>H54&ZhQn=fU zxnFjlbG`x z?Ac?n0Y`^#6u+?$E!rac!hp=@!>_@xr6H_YmlhzR?&JP|Y*r@@H(&aSY}n%7xu){{ zJW_;MTl$F_9rZRW%H; zGX;g<fOFMnmv9If*);4kYx96&DlicM*@}Li;coOxNaA3#!oe<^biW zN;Q9?LMC)RIfOIHqY>Ghsi`BLqO3ZJ+K%Epu`7#rM3l`cS!|;h@%Sa{Fxp!stz)Wr zy-FUi@u`og+Dz8T-rKY9*Lt;1w1-CRA9Qx0{TCoYlrus2s;Rx*}>B zZPRC_TIHDJD{H8nD<`n$r>AAD(O(xZ1MB5E;*lhP|t9sMM}3 zw0(yql>%8tnv zFWXG_X8DRRPh6Az;#=L^9C|?3cdsqzjTo~M=yr~Y7JsHxE z4Ha1@4u@hv8#Ni!Rm)2{z}*jy%8=3i_m{cvoM<0?Q&tZ}?MBBJOZjvbRT~lAVYQA> zomHXc{_!~_H0=W*2oGlGIoSYB>@J2;=+0r-eEBO>2J*C(+Wnwz7d{`+0@}UWgW6V% zf1)1Z%G1_r+q6gVYzt=p`#E0W&Lgsb!%=kpU0daOI$5DY6!CreateOffscreenPlainSurface(ScreenWidth, ScreenHeight, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, &pDestSurface, NULL); - // //res=((IDirect3DDevice9 *)lpD3DActiveDevice)->CreateOffscreenPlainSurface(dxw.GetScreenWidth(), dxw.GetScreenHeight(), D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, &pDestSurface, NULL); - // res=((IDirect3DDevice9 *)lpD3DActiveDevice)->CreateOffscreenPlainSurface(client.right, client.bottom, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, &pDestSurface, NULL); - // if(res){ - // OutTraceE("dxwSDC::CreateOffscreenPlainSurface: ERROR err=%x(%s) at=%d\n", res, ExplainDDError(res), __LINE__); - // return NULL; - // _Warn("CreateOffscreenPlainSurface ERROR"); - // } - //} - //res=((IDirect3DDevice9 *)lpD3DActiveDevice)->GetFrontBufferData(1, pDestSurface); - //if(res){ - // OutTraceE("GetFrontBufferData: ERROR err=%x(%s) at=%d\n", res, ExplainDDError(res), __LINE__); - // _Warn("GetFrontBufferData ERROR"); - //} - IDirect3DSurface9 *pRenderSurface; - res=((IDirect3DDevice9 *)lpD3DActiveDevice)->GetRenderTarget(0, &pRenderSurface); - if(res){ - OutTraceE("d3d9::GetRenderTarget: ERROR err=%x(%s) at=%d\n", res, ExplainDDError(res), __LINE__); - _Warn("d3d9::GetRenderTarget ERROR"); + + // look for ddraw first + //if(pReleaseDDThreadLock)(*pReleaseDDThreadLock)(); + lpDDSPrimary = dxwss.GetPrimarySurface(); + if (lpDDSPrimary) { + if(pReleaseDDThreadLock)(*pReleaseDDThreadLock)(); + res=((*pGetDC)(lpDDSPrimary, &PrimaryDC)); + while((PrimaryDC == NULL) && lpDDSPrimary) { + OutTraceB("dxwSDC::GetPrimaryDC: found primary surface with no DC, unref lpdds=%x\n", lpDDSPrimary); + dxwss.UnrefSurface(lpDDSPrimary); + lpDDSPrimary = dxwss.GetPrimarySurface(); + if (lpDDSPrimary) (*pGetDC)(lpDDSPrimary, &PrimaryDC); } - //res=((IDirect3DDevice9 *)lpD3DActiveDevice)->GetRenderTargetData(pRenderSurface, pDestSurface); - //if(res){ - // OutTraceE("d3d9::GetRenderTargetData: ERROR err=%x(%s) at=%d\n", res, ExplainDDError(res), __LINE__); - // _Warn("d3d9::GetRenderTargetData ERROR"); - //} - //res=pDestSurface->GetDC(&PrimaryDC); - res=pRenderSurface->GetDC(&PrimaryDC); - if(res){ - OutTraceE("d3d9::GetDC: ERROR err=%x(%s) at=%d\n", res, ExplainDDError(res), __LINE__); - //_Warn("d3d9::GetDC ERROR"); - VirtualSurfaceType = VIRTUAL_ON_D3D; + if (!PrimaryDC) { + _Warn("No primary DC"); + OutTraceB("dxwSDC::GetPrimaryDC: no ddraw primary DC\n"); return NULL; } - VirtualSurfaceType = VIRTUAL_ON_D3D; + // avoid double Getdc on same hdc and lock + // if(PrimaryDC == hdc) (*pReleaseDC)(lpDDSPrimary, PrimaryDC); + OutTraceB("dxwSDC::GetPrimaryDC: ddraw PrimaryDC=%x\n", PrimaryDC); + VirtualSurfaceType = VIRTUAL_ON_DDRAW; } else { -#else - { -#endif - // else look for ddraw - //if(pReleaseDDThreadLock)(*pReleaseDDThreadLock)(); - lpDDSPrimary = dxwss.GetPrimarySurface(); - if (lpDDSPrimary) { - if(pReleaseDDThreadLock)(*pReleaseDDThreadLock)(); - res=((*pGetDC)(lpDDSPrimary, &PrimaryDC)); - while((PrimaryDC == NULL) && lpDDSPrimary) { - OutTraceB("dxwSDC::GetPrimaryDC: found primary surface with no DC, unref lpdds=%x\n", lpDDSPrimary); - dxwss.UnrefSurface(lpDDSPrimary); - lpDDSPrimary = dxwss.GetPrimarySurface(); - if (lpDDSPrimary) (*pGetDC)(lpDDSPrimary, &PrimaryDC); - } - if (!PrimaryDC) { - _Warn("No primary DC"); - OutTraceB("dxwSDC::GetPrimaryDC: no ddraw primary DC\n"); - return NULL; - } - // avoid double Getdc on same hdc and lock - // if(PrimaryDC == hdc) (*pReleaseDC)(lpDDSPrimary, PrimaryDC); - OutTraceB("dxwSDC::GetPrimaryDC: ddraw PrimaryDC=%x\n", PrimaryDC); - VirtualSurfaceType = VIRTUAL_ON_DDRAW; + // finally, search GDI DC + PrimaryDC = (*pGDIGetDC)(dxw.GethWnd()); + if (!PrimaryDC) { + _Warn("No window DC"); + OutTraceB("dxwSDC::GetPrimaryDC: no windows DC\n"); + return NULL; } - else { - // finally, search GDI DC - PrimaryDC = (*pGDIGetDC)(dxw.GethWnd()); - if (!PrimaryDC) { - _Warn("No window DC"); - OutTraceB("dxwSDC::GetPrimaryDC: no windows DC\n"); - return NULL; - } - OutTraceB("dxwSDC::GetPrimaryDC: gdi PrimaryDC=%x\n", PrimaryDC); - VirtualSurfaceType = VIRTUAL_ON_WINDOW; - } - } + OutTraceB("dxwSDC::GetPrimaryDC: gdi PrimaryDC=%x\n", PrimaryDC); + VirtualSurfaceType = VIRTUAL_ON_WINDOW; + } // whenever the hdc changes, rebuild the virtual DC if(hdc != LastHDC) do { @@ -208,11 +163,27 @@ HDC dxwSDC::GetPrimaryDC(HDC hdc) } if(PrimaryDC){ - if(!(*pGDIBitBlt)(VirtualHDC, 0, 0, ScreenWidth, ScreenHeight, PrimaryDC, VirtualOffset.x, VirtualOffset.y, SRCCOPY)){ - OutTraceE("dxwSDC::GetPrimaryDC: StretchBlt ERROR err=%d at=%d\n", GetLastError(), __LINE__); - _Warn("StretchBlt ERROR"); + switch(VirtualSurfaceType){ + case VIRTUAL_ON_DDRAW: + if(!(*pGDIBitBlt)(VirtualHDC, 0, 0, ScreenWidth, ScreenHeight, PrimaryDC, VirtualOffset.x, VirtualOffset.y, SRCCOPY)){ + OutTraceE("dxwSDC::GetPrimaryDC: StretchBlt ERROR err=%d at=%d\n", GetLastError(), __LINE__); + _Warn("StretchBlt ERROR"); + } + OutTraceB("dxwSDC::GetPrimaryDC: fill=(0,0)-(%dx%d) from=(%d,%d)\n", ScreenWidth, ScreenHeight, VirtualOffset.x, VirtualOffset.y); + break; + case VIRTUAL_ON_WINDOW: + int w, h; + dxw.MapClient(&VirtualOffset); + w = ScreenWidth; + h = ScreenHeight; + dxw.MapClient(&w, &h); + if(!(*pGDIStretchBlt)(VirtualHDC, 0, 0, ScreenWidth, ScreenHeight, PrimaryDC, VirtualOffset.x, VirtualOffset.y, w, h, SRCCOPY)){ + OutTraceE("dxwSDC::GetPrimaryDC: StretchBlt ERROR err=%d at=%d\n", GetLastError(), __LINE__); + _Warn("StretchBlt ERROR"); + } + OutTraceB("dxwSDC::GetPrimaryDC: fill=(0,0)-(%dx%d) from=(%d,%d)-(%dx%d)\n", ScreenWidth, ScreenHeight, VirtualOffset.x, VirtualOffset.y, w, h); + break; } - OutTraceB("dxwSDC::GetPrimaryDC: fill=(0,0)-(%d,%d) from=(%d,%d)\n", ScreenWidth, ScreenHeight, VirtualOffset.x, VirtualOffset.y); } POINT origin = {}; @@ -274,18 +245,6 @@ BOOL dxwSDC::PutPrimaryDC(HDC hdc, BOOL UpdateScreen, int XDest, int YDest, int if(UpdateScreen){ switch(VirtualSurfaceType){ -#ifdef D3D9TRY - case VIRTUAL_ON_D3D: - RECT client; - SetStretchBltMode(PrimaryDC, HALFTONE); - (*pGetClientRect)(dxw.GethWnd(), &client); - if(PrimaryDC) ret=(*pGDIStretchBlt)(PrimaryDC, 0, 0, client.right, client.bottom, VirtualHDC, 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight(), SRCCOPY); - ret=(*pGDIReleaseDC)(dxw.GethWnd(), PrimaryDC); - //ret=(*pGDIReleaseDC)(dxw.GethWnd(), PrimaryDC); - if(!ret) OutTrace("dxwSDC::PutPrimaryDC: ReleaseDC ERROR err=%d\n", GetLastError()); - //pDestSurface->Release(); - break; -#endif case VIRTUAL_ON_DDRAW: ret=(*pGDIBitBlt)(PrimaryDC, XDest+VirtualOffset.x, YDest+VirtualOffset.y, nDestWidth, nDestHeight, VirtualHDC, XDest, YDest, SRCCOPY); if(!ret || (ret==GDI_ERROR)) { @@ -409,6 +368,7 @@ static BOOL CALLBACK excludeClipRectsForOverlappingWindows(HWND hwnd, LPARAM lPa void dxwSDC::setClippingRegion(HDC compatDc, HDC origDc, POINT& origin) { +#if 0 OutTrace("dxwSDC::setClippingRegion: compdc=%x origdc=%x origin=(%d,%d)\n", compatDc, origDc, origin.x, origin.y); HRGN clipRgn = CreateRectRgn(0, 0, 0, 0); const bool isEmptyClipRgn = (1 != GetRandomRgn(origDc, clipRgn, SYSRGN)); @@ -444,13 +404,14 @@ void dxwSDC::setClippingRegion(HDC compatDc, HDC origDc, POINT& origin) } } DeleteObject(origClipRgn); +#endif - return; +#if 0 // to finish ..... // on Win10 this part seems unnecessary and giving troubles ..... //dxw.MapClient(&origin); - if (!isEmptyClipRgn) - { + //if (!isEmptyClipRgn) + if(1){ HWND hwnd = WindowFromDC(origDc); if (hwnd) { @@ -458,4 +419,5 @@ void dxwSDC::setClippingRegion(HDC compatDc, HDC origDc, POINT& origin) EnumWindows(&excludeClipRectsForOverlappingWindows,(LPARAM)(&excludeClipRectsData)); } } +#endif } diff --git a/dll/user32.cpp b/dll/user32.cpp index 425ce1b..528c29b 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -639,12 +639,19 @@ BOOL WINAPI extInvalidateRect(HWND hwnd, RECT *lpRect, BOOL bErase) OutTrace("InvalidateRect: hwnd=%x rect=%s erase=%x\n", hwnd, sRect, bErase); } + RECT ScaledRect; if(dxw.IsFullScreen()) { switch(dxw.GDIEmulationMode){ case GDIMODE_STRETCHED: case GDIMODE_SHAREDDC: case GDIMODE_EMULATED: - if(lpRect) dxw.MapClient(lpRect); + if(lpRect) { + // v2.03.55: the lpRect area must NOT be altered by the call + // effect visible in partial updates of Deadlock 2 main menu buttons + ScaledRect = *lpRect; + dxw.MapClient(&ScaledRect); + lpRect = &ScaledRect; + } break; default: break;