From 754d4ebe6285dea06ebccc7ecf4ff0e5a86e30e0 Mon Sep 17 00:00:00 2001 From: gho tik Date: Mon, 28 Jul 2014 12:39:37 -0400 Subject: [PATCH] v2_02_87_src Former-commit-id: 0ace3cadaa26eea269335760a9e5f36cae8d24ee --- Include/dxwnd.h | 6 + build/Resources_CN.dll | 2 +- build/Resources_EN.dll | 2 +- build/Resources_IT.dll | 2 +- build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/dxwnd.ini | 118 +++++++- build/exports/dxwnd.ini | 4 +- build/readme-relnotes.txt | 14 +- dll/ddraw.cpp | 32 +- dll/dxemublt.cpp | 592 ++++++++++++++++++++++++++++++++----- dll/dxhook.cpp | 97 +++++- dll/dxwcore.cpp | 12 + dll/dxwcore.hpp | 2 + dll/dxwnd.cpp | 4 +- dll/dxwnd.vs2008.suo | Bin 186880 -> 214528 bytes dll/gdi32.cpp | 6 + dll/user32.cpp | 57 +++- host/MainFrm.cpp | 1 + host/Resource.h | Bin 29328 -> 29450 bytes host/TabCompat.cpp | 1 + host/TargetDlg.cpp | 1 + host/TargetDlg.h | 1 + host/dxwndhost.aps | Bin 154008 -> 154124 bytes host/dxwndhost.cpp | 10 +- host/dxwndhost.rc | Bin 85894 -> 86102 bytes host/dxwndhost.vs2008.suo | Bin 31232 -> 47616 bytes host/dxwndhostView.cpp | 10 + locale/cn/Resources_Cn.ncb | Bin 35840 -> 27648 bytes locale/cn/Resources_Cn.rc | Bin 81116 -> 81324 bytes locale/cn/Resources_Cn.suo | Bin 7680 -> 7680 bytes locale/en/Resources_EN.rc | Bin 85894 -> 86102 bytes locale/en/Resources_En.ncb | Bin 27648 -> 27648 bytes locale/en/Resources_En.suo | Bin 7168 -> 7168 bytes locale/it/Resources_IT.rc | Bin 86950 -> 87158 bytes locale/it/Resources_It.ncb | Bin 35840 -> 27648 bytes locale/it/Resources_It.suo | Bin 7680 -> 7680 bytes 37 files changed, 867 insertions(+), 113 deletions(-) diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 6593552..f04c52c 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -146,6 +146,9 @@ #define OVERRIDEREGISTRY 0x40000000 // same as EMULATEREGISTRY, but fake keys takeprecedence #define HIDECDROMEMPTY 0x80000000 // hide empty CDROM drivers +// fifth flags DWORD dxw.dwFlags5: +#define DIABLOTWEAK 0x00000001 // ... ??? ... + // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general #define OUTDDRAWTRACE 0x00000002 // traces DxWnd directdraw screen handling @@ -176,6 +179,7 @@ typedef struct TARGETMAP int flags2; int flags3; int flags4; + int flags5; int tflags; short initx; short inity; @@ -285,3 +289,5 @@ typedef enum { TIMER_TYPE_USER32, TIMER_TYPE_WINMM } Timer_Types; + +#define CREATEDESKTOP FALSE \ No newline at end of file diff --git a/build/Resources_CN.dll b/build/Resources_CN.dll index 107b622..91c3a99 100644 --- a/build/Resources_CN.dll +++ b/build/Resources_CN.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c6ce831ba912fd0a77ada82ff268cc3c5cc5b143ceba47afa5e0788624735db6 +oid sha256:782d53dad4046b681b15ecfbc8dd370c7a8097b7903daf63e4089c9b96916158 size 125952 diff --git a/build/Resources_EN.dll b/build/Resources_EN.dll index 2db050a..0030f75 100644 --- a/build/Resources_EN.dll +++ b/build/Resources_EN.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e39bc9f35955a42e51eccb033dbb72b802e4e0a91c62191beef0052f7f1d3d22 +oid sha256:9ad4422aea023277c8d4310eb68782709f10d7567c8b12af62a30a32b3016c57 size 131072 diff --git a/build/Resources_IT.dll b/build/Resources_IT.dll index 29f7e48..a527ff2 100644 --- a/build/Resources_IT.dll +++ b/build/Resources_IT.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e4a8fde842a309899161df48662be08b6bf37c06b73f603cd9d199224e09ff82 +oid sha256:ab41e49d035c39a3a88ce07e5900ea8b8e8768ad56749e8f06969b9df343374f size 132096 diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 1e41ea6..f63f5a6 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:560b196fd41dbbde675f2e6704d3c54299dd975d272960a9cee2b7ce33ea7dc8 -size 495616 +oid sha256:4f143e88ec5785fc2144af1a779b09b9e0791bf0e1e7d7050c1921d36284787e +size 501248 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 2a8f0da..78aace7 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c4f935425138f4ca43dedf590f0e046ccea571fc42e7620b6673226b6f2179f9 +oid sha256:ad3ceed714b0d4f97f1187893964ff234e6c48de19bac84b66a1f25c9105088c size 549376 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index d060f11..56c15db 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -2,6 +2,120 @@ sizx=320 sizy=200 lang=automatic -posx=50 -posy=50 +posx=1429 +posy=317 [target] +title0=Age of Empires +path0=D:\Games\Age of Empires\Empires.exe +launchpath0= +module0= +opengllib0= +ver0=0 +coord0=2 +flag0=134217762 +flagg0=1207959568 +flagh0=20 +flagi0=4195332 +tflag0=6147 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +title1=Diablo +path1=D:\Games\Diablo\Diablo.exe +launchpath1= +module1= +opengllib1= +ver1=1 +coord1=3 +flag1=138428450 +flagg1=1242562576 +flagh1=20 +flagi1=4195328 +tflag1=0 +initx1=0 +inity1=0 +minx1=0 +miny1=0 +maxx1=0 +maxy1=0 +posx1=50 +posy1=50 +sizx1=640 +sizy1=480 +maxfps1=0 +initts1=0 +winver1=0 +maxres1=0 +title2=Dune 2000 +path2=D:\Games\Dune 2000\DUNE2000.DAT +launchpath2=D:\Games\Dune 2000\DUNE2000.EXE +module2= +opengllib2= +ver2=0 +coord2=2 +flag2=671105058 +flagg2=1207959568 +flagh2=20 +flagi2=4195332 +tflag2=64 +initx2=0 +inity2=0 +minx2=0 +miny2=0 +maxx2=0 +maxy2=0 +posx2=50 +posy2=50 +sizx2=800 +sizy2=600 +maxfps2=0 +initts2=0 +winver2=0 +maxres2=-1 +title3=Genocide (REMIXED VERSION) +path3=D:\Games\genocide\remixed version (1999)\genocide\genocide.exe +launchpath3= +module3= +opengllib3= +ver3=0 +coord3=3 +flag3=134217762 +flagg3=1207959568 +flagh3=20 +flagi3=4195332 +tflag3=6402 +initx3=0 +inity3=0 +minx3=0 +miny3=0 +maxx3=0 +maxy3=0 +posx3=50 +posy3=50 +sizx3=800 +sizy3=600 +maxfps3=0 +initts3=0 +winver3=0 +maxres3=-1 +title4=Dune 2000 +module4= +opengllib4= +title5=Genocide (REMIXED VERSION) +module5= +opengllib5= +flagj0=0 +flagj1=1 +flagj2=0 +flagj3=0 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini index e3fa042..87a33a6 100644 --- a/build/exports/dxwnd.ini +++ b/build/exports/dxwnd.ini @@ -1,5 +1,5 @@ [window] -posx=1547 -posy=779 +posx=1392 +posy=385 sizx=320 sizy=200 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 1aca786..48f1da9 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -556,4 +556,16 @@ fix: added recovery for rounded child win coordinates: fixes blitting problems i v2.02.86 fix: thank to aqrit's research, hooked and hanlded user32.dll GetUpdateRgn API. This fixes refresh and crash problems in Diablo & Hellfire. -added bilinear filtering to directdraw palettized 8BPP emulated mode (where it is mostly needed!). A must try is "Genocide" ! \ No newline at end of file +added bilinear filtering to directdraw palettized 8BPP emulated mode (where it is mostly needed!). A must try is "Genocide" ! + +v2.02.87 +attempt to fix Win8 missing support for earlier ddraw releases (Croc legend of the Gobbos, Project I.G.I., ...) +fix: optimized bilinear filtering with no horizontal / vertical sawtooth artifacts +added support for 16BPP and 32BPP desktop bilinear filtering +suppressed compatibility checking +fix: doubled default window size when bilinear filtering is active +added repositioning of control parent window when main win is moved +added debug messages about hooked window class and name +fix: ignore IME window when hooking main win, destroy it when requested +fix: ignore HWND_MESSAGE type windows +added "Diablo tweak" compatibility flag for Diablo proper screen update handling. It is a temporary tweak waiting to understand better how to properly manage it. diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index fe3c3af..abed4e1 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -293,11 +293,18 @@ int iRefreshDelayCount=2; void SetVSyncDelays(LPDIRECTDRAW lpdd) { - DDSURFACEDESC ddsdRefreshRate; + DDSURFACEDESC2 ddsdRefreshRate; int Reminder; + HRESULT res; + memset(&ddsdRefreshRate, 0, sizeof(ddsdRefreshRate)); - ddsdRefreshRate.dwSize = sizeof(ddsdRefreshRate); - (*pGetDisplayMode)(lpdd, &ddsdRefreshRate); + ddsdRefreshRate.dwSize = sizeof(DDSURFACEDESC); + res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsdRefreshRate); + if(res==DDERR_GENERIC){ // handling Win8 missing support for old ddraw interface + ddsdRefreshRate.dwSize = sizeof(DDSURFACEDESC2); + res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsdRefreshRate); + } + if(res) return; gdwRefreshRate = ddsdRefreshRate.dwRefreshRate; if(!gdwRefreshRate) return; iRefreshDelayCount=0; @@ -533,9 +540,14 @@ void mySetPalette(int dwstart, int dwcount, LPPALETTEENTRY lpentries) void InitDDScreenParameters(LPDIRECTDRAW lpdd) { HRESULT res; - DDSURFACEDESC ddsd; + DDSURFACEDESC2 ddsd; ddsd.dwSize=sizeof(DDSURFACEDESC); - if(res=(*pGetDisplayMode)(lpdd, &ddsd)){ + res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsd); + if(res==DDERR_GENERIC){ // Win8 missing support for old ddraw interfaces + ddsd.dwSize=sizeof(DDSURFACEDESC2); + res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsd); + } + if(res){ OutTraceE("GetDisplayMode: ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return; } @@ -1905,7 +1917,11 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_REFRESHRATE; ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT); ddsd.ddpfPixelFormat.dwFlags = DDPF_RGB; - (*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsd); + res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsd); + if(res==DDERR_GENERIC){ // handling Win8 missing support for old ddraw interface + ddsd.dwSize = sizeof(DDSURFACEDESC2); + res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsd); + } if(dxw.Windowize){ if(!IsChangeDisplaySettingsHotPatched){ @@ -4176,6 +4192,10 @@ HRESULT WINAPI extEnumDisplayModes(EnumDisplayModes1_Type pEnumDisplayModes, LPD memset(&EmuDesc, 0, sizeof(EmuDesc)); EmuDesc.dwSize = sizeof(DDSURFACEDESC); // using release 1 type .... res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&EmuDesc); + if(res==DDERR_GENERIC){ // Win8 missing support for old ddraw interface + EmuDesc.dwSize = sizeof(DDSURFACEDESC2); // using release 2 type .... + res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&EmuDesc); + } if(res){ OutTraceE("GetDisplayMode(D): ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); return res; diff --git a/dll/dxemublt.cpp b/dll/dxemublt.cpp index 6c049c7..a985cc0 100644 --- a/dll/dxemublt.cpp +++ b/dll/dxemublt.cpp @@ -63,6 +63,74 @@ static void MarkRect16(SHORT *dest, int w, int h, int destpitch) return; } +static DWORD Melt32(DWORD c1, DWORD c2) +{ + DWORD ret; + ret = + ((((c1 & 0x0000FF) + (c2 & 0x0000FF)) >> 1) & 0x0000FF) | + ((((c1 & 0x00FF00) + (c2 & 0x00FF00)) >> 1) & 0x00FF00) | + ((((c1 & 0xFF0000) + (c2 & 0xFF0000)) >> 1) & 0xFF0000); + return ret; +} + +static DWORD Melt16_555(DWORD c1, DWORD c2) +{ + DWORD ret; + ret = + ((((c1 & 0x00001F) + (c2 & 0x00001F)) >> 1) & 0x00001F) | + ((((c1 & 0x0003E0) + (c2 & 0x0003E0)) >> 1) & 0x0003E0) | + ((((c1 & 0x007C00) + (c2 & 0x007C00)) >> 1) & 0x007C00); + return ret; +} + +static DWORD Melt16_565(DWORD c1, DWORD c2) +{ + DWORD ret; + ret = + ((((c1 & 0x00001F) + (c2 & 0x00001F)) >> 1) & 0x00001F) | + ((((c1 & 0x0007E0) + (c2 & 0x0007E0)) >> 1) & 0x0007E0) | + ((((c1 & 0x00F800) + (c2 & 0x00F800)) >> 1) & 0x00F800); + return ret; +} + +static void SetPalette16BPP() +{ +// OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src16,dest,srcpitch,destpitch); + unsigned int pi; + Palette16BPP = (DWORD *)malloc(0x10000 * sizeof(DWORD)); + if (dxw.dwFlags3 & BLACKWHITE){ + // actually, it should be like this: R/G/B = (red * 0.30) + (green * 0.59) + (blue * 0.11) + // (http://www.codeproject.com/Articles/66253/Converting-Colors-to-Gray-Shades) + DWORD grey; + if (dxw.dwFlags1 & USERGB565){ + for (pi=0; pi<0x10000; pi++) { + //grey = ((((pi & 0x1F)<<3) + ((pi & 0x7E0)>>3) + ((pi & 0xF800)>>8)) / 3) & 0xFF; + grey = (((((pi & 0x1F)<<3) * 30) + (((pi & 0x7E0)>>3) * 59) + (((pi & 0xF800)>>8) * 11)) / 100) & 0xFF; + Palette16BPP[pi] = (grey) + (grey<<8) + (grey<<16); + } + } + else { + for (pi=0; pi<0x10000; pi++) { + //grey = ((((pi & 0x1F)<<3) + ((pi & 0x3E0)>>2) + ((pi & 0x7C00)>>7)) / 3) & 0xFF; + grey = (((((pi & 0x1F)<<3) * 30) + (((pi & 0x3E0)>>2) * 59) + (((pi & 0x7C00)>>7) * 11)) / 100) & 0xFF; + Palette16BPP[pi] = grey + (grey<<8) + (grey<<16); + } + } + } + else { + if (dxw.dwFlags1 & USERGB565){ + for (pi=0; pi<0x10000; pi++) { + Palette16BPP[pi]=(pi & 0x1F)<<3 | (pi & 0x7E0)<<5 | (pi & 0xF800)<<8; // RGB565 + } + } + else { + for (pi=0; pi<0x10000; pi++) { + Palette16BPP[pi]=(pi & 0x1F)<<3 | (pi & 0x3E0)<<6 | (pi & 0x7C00)<<9; // RGB555 + } + } + } +} + static HRESULT WINAPI EmuBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { @@ -134,19 +202,6 @@ static HRESULT WINAPI EmuBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest return res; } -static DWORD Melt(DWORD c1, DWORD c2) -{ - DWORD ret; - register BYTE *b1 = (BYTE *)&c1; - register BYTE *b2 = (BYTE *)&c2; - register BYTE *br = (BYTE *)&ret; - //for(int i=0; i<4; i++) - *br++ = (*(b1++)>>1) + (*(b2++)>>1); - *br++ = (*(b1++)>>1) + (*(b2++)>>1); - *br++ = (*(b1++)>>1) + (*(b2++)>>1); - return ret; -} - static HRESULT WINAPI BilinearBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { @@ -206,30 +261,38 @@ static HRESULT WINAPI BilinearBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT l srcpitch = ddsd_src.lPitch - w; // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); - for(y = 0; y < h; y ++){ - BYTE *begin = src8; - for(x = 0; x < w; x ++){ - *(dest ++) = PaletteEntries[*(src8)]; - *(dest ++) = Melt(PaletteEntries[*(src8)], PaletteEntries[*(src8+1)]); + for(y = 0; y < h-1; y ++){ // first h-1 lines .... + register DWORD Q1, Q2, Q3, Q4, Q5; + Q5 = Melt32(PaletteEntries[*(src8)], PaletteEntries[*(src8+ddsd_src.lPitch)]); + for(x = 0; x < w; x ++){ + Q1 = PaletteEntries[*(src8)]; + Q2 = Melt32(Q1, PaletteEntries[*(src8+1)]); + Q3 = Q5; + Q5 = Melt32(PaletteEntries[*(src8+1)], PaletteEntries[*(src8+ddsd_src.lPitch+1)]); // to be used in next for cycle + Q4 = Melt32(Q3, Q5); + + *(dest) = Q1; + *(dest+1) = Q2; + *(dest+ddsd_dst.lPitch) = Q3; + *(dest+ddsd_dst.lPitch+1) = Q4; src8++; - } - src8 = begin; - dest += destpitch; - if(y+1 == h) - for(x = 0; x < w; x ++){ // last line, duplicate the line above - *(dest ++) = PaletteEntries[*(src8)]; - *(dest ++) = Melt(PaletteEntries[*(src8)], PaletteEntries[*(src8+1)]); - src8++; - } - else - for(x = 0; x < w; x ++){ - *(dest ++) = Melt(PaletteEntries[*(src8)], PaletteEntries[*(src8+w)]); - *(dest ++) = Melt(PaletteEntries[*(src8+1)], PaletteEntries[*(src8+w)]); - src8++; - } - src8 += srcpitch; - dest += destpitch; + dest+=2; + } + src8 += srcpitch; + dest += (ddsd_dst.lPitch + destpitch); } + for(x = 0; x < w; x ++){ // last line (there's no next line to melt...) + register DWORD Q1, Q2; + Q1 = PaletteEntries[*(src8)]; + Q2 = Melt32(Q1, PaletteEntries[*(src8+1)]); + + *(dest) = Q1; + *(dest+1) = Q2; + *(dest+ddsd_dst.lPitch) = Q1; + *(dest+ddsd_dst.lPitch+1) = Q2; + src8++; + dest+=2; + } if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, w, h, destpitch); @@ -294,42 +357,8 @@ static HRESULT WINAPI EmuBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes src16 += lpsrcrect->left; srcpitch = ddsd_src.lPitch - w; - // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src16,dest,srcpitch,destpitch); - if (!Palette16BPP) { // first time through ..... - unsigned int pi; - Palette16BPP = (DWORD *)malloc(0x10000 * sizeof(DWORD)); - if (dxw.dwFlags3 & BLACKWHITE){ - // actually, it should be like this: R/G/B = (red * 0.30) + (green * 0.59) + (blue * 0.11) - // (http://www.codeproject.com/Articles/66253/Converting-Colors-to-Gray-Shades) - DWORD grey; - if (dxw.dwFlags1 & USERGB565){ - for (pi=0; pi<0x10000; pi++) { - //grey = ((((pi & 0x1F)<<3) + ((pi & 0x7E0)>>3) + ((pi & 0xF800)>>8)) / 3) & 0xFF; - grey = (((((pi & 0x1F)<<3) * 30) + (((pi & 0x7E0)>>3) * 59) + (((pi & 0xF800)>>8) * 11)) / 100) & 0xFF; - Palette16BPP[pi] = (grey) + (grey<<8) + (grey<<16); - } - } - else { - for (pi=0; pi<0x10000; pi++) { - //grey = ((((pi & 0x1F)<<3) + ((pi & 0x3E0)>>2) + ((pi & 0x7C00)>>7)) / 3) & 0xFF; - grey = (((((pi & 0x1F)<<3) * 30) + (((pi & 0x3E0)>>2) * 59) + (((pi & 0x7C00)>>7) * 11)) / 100) & 0xFF; - Palette16BPP[pi] = grey + (grey<<8) + (grey<<16); - } - } - } - else { - if (dxw.dwFlags1 & USERGB565){ - for (pi=0; pi<0x10000; pi++) { - Palette16BPP[pi]=(pi & 0x1F)<<3 | (pi & 0x7E0)<<5 | (pi & 0xF800)<<8; // RGB565 - } - } - else { - for (pi=0; pi<0x10000; pi++) { - Palette16BPP[pi]=(pi & 0x1F)<<3 | (pi & 0x3E0)<<6 | (pi & 0x7C00)<<9; // RGB555 - } - } - } - } + if (!Palette16BPP) SetPalette16BPP(); + for(y = 0; y < h; y ++){ for(x = 0; x < w; x ++){ //if (!(*src16 & 0x8000)) // try implement alpha bit @@ -348,6 +377,110 @@ static HRESULT WINAPI EmuBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes return res; } +static HRESULT WINAPI BilinearBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, + LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) +{ + HRESULT res; + WORD *src16; + DWORD *dest, *dest0; + DDSURFACEDESC2 ddsd_src, ddsd_dst; + long srcpitch, destpitch; + DWORD x, y, w, h; + + w = lpdestrect->right - lpdestrect->left; + h = lpdestrect->bottom - lpdestrect->top; + + lpdestrect->left <<= 1; + lpdestrect->top <<= 1; + lpdestrect->right <<= 1; + lpdestrect->bottom <<= 1; + + memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); + ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; + if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + OutTraceE("BilBlt16_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + + memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); + ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; + if (lpsurface) { // already locked, just get info .... + if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { + OutTraceE("BilBlt16_32: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + return 0; + } + } + else { + if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { + (*pUnlockMethod(lpddsdst))(lpddsdst,0); + OutTraceE("BilBlt16_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + lpsurface=ddsd_src.lpSurface; + } + + ddsd_dst.lPitch >>= 2; + dest = (DWORD *)ddsd_dst.lpSurface; + dest += lpdestrect->top*ddsd_dst.lPitch; + dest += lpdestrect->left; + destpitch = ddsd_dst.lPitch - (2 * w); + dest0 = dest; + + ddsd_src.lPitch >>= 1; + src16 = (WORD *)(lpsurface ? lpsurface:ddsd_src.lpSurface); + src16 += lpsrcrect->top*ddsd_src.lPitch; + src16 += lpsrcrect->left; + srcpitch = ddsd_src.lPitch - w; + + if (!Palette16BPP) SetPalette16BPP(); + + // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); + for(y = 0; y < h-1; y ++){ // first h-1 lines .... + register DWORD Q1, Q2, Q3, Q4, Q5; + Q5 = Melt32(Palette16BPP[*(src16)], Palette16BPP[*(src16+ddsd_src.lPitch)]); + for(x = 0; x < w; x ++){ + Q1 = Palette16BPP[*(src16)]; + Q2 = Melt32(Q1, Palette16BPP[*(src16+1)]); + Q3 = Q5; + Q5 = Melt32(Palette16BPP[*(src16+1)], Palette16BPP[*(src16+ddsd_src.lPitch+1)]); // to be used in next for cycle + Q4 = Melt32(Q3, Q5); + + *(dest) = Q1; + *(dest+1) = Q2; + *(dest+ddsd_dst.lPitch) = Q3; + *(dest+ddsd_dst.lPitch+1) = Q4; + src16++; + dest+=2; + } + src16 += srcpitch; + dest += (ddsd_dst.lPitch + destpitch); + } + for(x = 0; x < w; x ++){ // last line (there's no next line to melt...) + register DWORD Q1, Q2; + Q1 = Palette16BPP[*(src16)]; + Q2 = Melt32(Q1, Palette16BPP[*(src16+1)]); + + *(dest) = Q1; + *(dest+1) = Q2; + *(dest+ddsd_dst.lPitch) = Q1; + *(dest+ddsd_dst.lPitch+1) = Q2; + src16++; + dest+=2; + } + + if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, w, h, destpitch); + + res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + if (res) OutTraceE("BilBlt16_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); + res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + if (res) OutTraceE("BilBlt16_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); + return res; +} + static HRESULT WINAPI EmuBlt_24_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { @@ -569,6 +702,110 @@ static HRESULT WINAPI EmuBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest return res; } +static HRESULT WINAPI BilinearBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, + LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) +{ + HRESULT res; + BYTE *src8; + SHORT *dest, *dest0; + DDSURFACEDESC2 ddsd_src, ddsd_dst; + long srcpitch, destpitch; + DWORD x, y, w, h; + typedef DWORD (*Melt16_Type)(DWORD, DWORD); + Melt16_Type Melt16; + + w = lpdestrect->right - lpdestrect->left; + h = lpdestrect->bottom - lpdestrect->top; + + lpdestrect->left <<= 1; + lpdestrect->top <<= 1; + lpdestrect->right <<= 1; + lpdestrect->bottom <<= 1; + + memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); + ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; + if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + OutTraceE("BilBlt8_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + + Melt16 = (ddsd_dst.ddpfPixelFormat.dwGBitMask == 0x3E0) ? Melt16_555 : Melt16_565; + + memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); + ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; + if (lpsurface) { // already locked, just get info .... + if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { + OutTraceE("BilBlt8_16: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + return 0; + } + } + else { + if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { + (*pUnlockMethod(lpddsdst))(lpddsdst,0); + OutTraceE("BilBlt8_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return 0; + } + lpsurface=ddsd_src.lpSurface; + } + + ddsd_dst.lPitch >>= 1; + dest = (SHORT *)ddsd_dst.lpSurface; + dest += lpdestrect->top*ddsd_dst.lPitch; + dest += lpdestrect->left; + destpitch = ddsd_dst.lPitch - (2 * w); + dest0 = dest; + + src8 = (BYTE *)lpsurface; + src8 += lpsrcrect->top*ddsd_src.lPitch; + src8 += lpsrcrect->left; + srcpitch = ddsd_src.lPitch - w; + + // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); + for(y = 0; y < h-1; y ++){ // first h-1 lines .... + register DWORD Q1, Q2, Q3, Q4, Q5; + Q5 = Melt16(PaletteEntries[*(src8)], PaletteEntries[*(src8+ddsd_src.lPitch)]); + for(x = 0; x < w; x ++){ + Q1 = PaletteEntries[*(src8)]; + Q2 = Melt16(Q1, PaletteEntries[*(src8+1)]); + Q3 = Q5; + Q5 = Melt16(PaletteEntries[*(src8+1)], PaletteEntries[*(src8+ddsd_src.lPitch+1)]); // to be used in next for cycle + Q4 = Melt16(Q3, Q5); + + *(dest) = (SHORT)Q1; + *(dest+1) = (SHORT)Q2; + *(dest+ddsd_dst.lPitch) = (SHORT)Q3; + *(dest+ddsd_dst.lPitch+1) = (SHORT)Q4; + src8++; + dest+=2; + } + src8 += srcpitch; + dest += (ddsd_dst.lPitch + destpitch); + } + for(x = 0; x < w; x ++){ // last line (there's no next line to melt...) + register DWORD Q1, Q2; + Q1 = PaletteEntries[*(src8)]; + Q2 = Melt16(Q1, PaletteEntries[*(src8+1)]); + + *(dest) = (SHORT)Q1; + *(dest+1) = (SHORT)Q2; + *(dest+ddsd_dst.lPitch) = (SHORT)Q1; + *(dest+ddsd_dst.lPitch+1) = (SHORT)Q2; + src8++; + dest+=2; + } + + if(dxw.dwFlags3 & MARKBLIT) MarkRect16(dest0, w, h, destpitch); + + res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + if (res) OutTraceE("BilBlt8_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); + res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + if (res) OutTraceE("BilBlt8_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); + return res; +} static HRESULT WINAPI EmuBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) @@ -581,6 +818,113 @@ static HRESULT WINAPI EmuBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes #endif } +static HRESULT WINAPI BilinearBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, + LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) +{ + HRESULT res; + WORD *src16; + WORD *dest, *dest0; + DDSURFACEDESC2 ddsd_src, ddsd_dst; + long srcpitch, destpitch; + DWORD x, y, w, h; + typedef DWORD (*Melt16_Type)(DWORD, DWORD); + Melt16_Type Melt16; + + w = lpdestrect->right - lpdestrect->left; + h = lpdestrect->bottom - lpdestrect->top; + + lpdestrect->left <<= 1; + lpdestrect->top <<= 1; + lpdestrect->right <<= 1; + lpdestrect->bottom <<= 1; + + memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); + ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; + if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + OutTraceE("BilBlt16_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + + Melt16 = (ddsd_dst.ddpfPixelFormat.dwGBitMask == 0x3E0) ? Melt16_555 : Melt16_565; + + memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); + ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; + if (lpsurface) { // already locked, just get info .... + if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { + OutTraceE("BilBlt16_16: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + return 0; + } + } + else { + if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { + (*pUnlockMethod(lpddsdst))(lpddsdst,0); + OutTraceE("BilBlt16_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + lpsurface=ddsd_src.lpSurface; + } + + ddsd_dst.lPitch >>= 1; + dest = (WORD *)ddsd_dst.lpSurface; + dest += lpdestrect->top*ddsd_dst.lPitch; + dest += lpdestrect->left; + destpitch = ddsd_dst.lPitch - (2 * w); + dest0 = dest; + + ddsd_src.lPitch >>= 1; + src16 = (WORD *)(lpsurface ? lpsurface:ddsd_src.lpSurface); + src16 += lpsrcrect->top*ddsd_src.lPitch; + src16 += lpsrcrect->left; + srcpitch = ddsd_src.lPitch - w; + + // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); + for(y = 0; y < h-1; y ++){ // first h-1 lines .... + register DWORD Q1, Q2, Q3, Q4, Q5; + Q5 = Melt16(*(src16), *(src16+ddsd_src.lPitch)); + for(x = 0; x < w; x ++){ + Q1 = *(src16); + Q2 = Melt16(Q1, *(src16+1)); + Q3 = Q5; + Q5 = Melt16(*(src16+1), *(src16+ddsd_src.lPitch+1)); // to be used in next for cycle + Q4 = Melt16(Q3, Q5); + + *(dest) = (WORD)Q1; + *(dest+1) = (WORD)Q2; + *(dest+ddsd_dst.lPitch) = (WORD)Q3; + *(dest+ddsd_dst.lPitch+1) = (WORD)Q4; + src16++; + dest+=2; + } + src16 += srcpitch; + dest += (ddsd_dst.lPitch + destpitch); + } + for(x = 0; x < w; x ++){ // last line (there's no next line to melt...) + register DWORD Q1, Q2; + Q1 = *(src16); + Q2 = Melt16(Q1, *(src16+1)); + + *(dest) = (WORD)Q1; + *(dest+1) = (WORD)Q2; + *(dest+ddsd_dst.lPitch) = (WORD)Q1; + *(dest+ddsd_dst.lPitch+1) = (WORD)Q2; + src16++; + dest+=2; + } + + if(dxw.dwFlags3 & MARKBLIT) MarkRect16((SHORT *)dest0, w, h, destpitch); + + res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + if (res) OutTraceE("BilBlt16_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); + res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + if (res) OutTraceE("BilBlt16_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); + return res; +} + + static HRESULT WINAPI EmuBlt_24_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { @@ -723,6 +1067,108 @@ static HRESULT WINAPI EmuBlt_32_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdes return res; } +static HRESULT WINAPI BilinearBlt_32_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, + LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) +{ + HRESULT res; + DWORD *src32; + DWORD *dest, *dest0; + DDSURFACEDESC2 ddsd_src, ddsd_dst; + long srcpitch, destpitch; + DWORD x, y, w, h; + + w = lpdestrect->right - lpdestrect->left; + h = lpdestrect->bottom - lpdestrect->top; + + lpdestrect->left <<= 1; + lpdestrect->top <<= 1; + lpdestrect->right <<= 1; + lpdestrect->bottom <<= 1; + + memset(&ddsd_dst,0,sizeof(DDSURFACEDESC2)); + ddsd_dst.dwSize = Set_dwSize_From_Surface(lpddsdst); + ddsd_dst.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; + if(res=(*pLock)(lpddsdst, 0, (LPDDSURFACEDESC)&ddsd_dst, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ + OutTraceE("BilBlt32_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + + memset(&ddsd_src,0,sizeof(DDSURFACEDESC2)); + ddsd_src.dwSize = Set_dwSize_From_Surface(lpddssrc); + ddsd_src.dwFlags = DDSD_LPSURFACE | DDSD_PITCH; + if (lpsurface) { // already locked, just get info .... + if(res=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd_src)) { + OutTraceE("BilBlt32_32: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + return 0; + } + } + else { + if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { + (*pUnlockMethod(lpddsdst))(lpddsdst,0); + OutTraceE("BilBlt32_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + lpsurface=ddsd_src.lpSurface; + } + + ddsd_dst.lPitch >>= 2; + dest = (DWORD *)ddsd_dst.lpSurface; + dest += lpdestrect->top*ddsd_dst.lPitch; + dest += lpdestrect->left; + destpitch = ddsd_dst.lPitch - (2 * w); + dest0 = dest; + + ddsd_src.lPitch >>= 2; + src32 = (DWORD *)(lpsurface ? lpsurface:ddsd_src.lpSurface); + src32 += lpsrcrect->top*ddsd_src.lPitch; + src32 += lpsrcrect->left; + srcpitch = ddsd_src.lPitch - w; + + // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); + for(y = 0; y < h-1; y ++){ // first h-1 lines .... + register DWORD Q1, Q2, Q3, Q4, Q5; + Q5 = Melt32(*(src32), *(src32+ddsd_src.lPitch)); + for(x = 0; x < w; x ++){ + Q1 = *(src32); + Q2 = Melt32(Q1, *(src32+1)); + Q3 = Q5; + Q5 = Melt32(*(src32+1), *(src32+ddsd_src.lPitch+1)); // to be used in next for cycle + Q4 = Melt32(Q3, Q5); + + *(dest) = (WORD)Q1; + *(dest+1) = (WORD)Q2; + *(dest+ddsd_dst.lPitch) = (WORD)Q3; + *(dest+ddsd_dst.lPitch+1) = (WORD)Q4; + src32++; + dest+=2; + } + src32 += srcpitch; + dest += (ddsd_dst.lPitch + destpitch); + } + for(x = 0; x < w; x ++){ // last line (there's no next line to melt...) + register DWORD Q1, Q2; + Q1 = *(src32); + Q2 = Melt32(Q1, *(src32+1)); + + *(dest) = (WORD)Q1; + *(dest+1) = (WORD)Q2; + *(dest+ddsd_dst.lPitch) = (WORD)Q1; + *(dest+ddsd_dst.lPitch+1) = (WORD)Q2; + src32++; + dest+=2; + } + + if(dxw.dwFlags3 & MARKBLIT) MarkRect16((SHORT *)dest0, w, h, destpitch); + + res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + if (res) OutTraceE("BilBlt32_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); + res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + if (res) OutTraceE("BilBlt32_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); + return res; +} + static HRESULT WINAPI EmuBlt_Null(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { @@ -1086,6 +1532,7 @@ void SetBltTransformations() case 16: pRevBlt=RevBlt_32_to_16; pEmuBlt=EmuBlt_16_to_32; + if(dxw.dwFlags4 & BILINEARFILTER) pEmuBlt=BilinearBlt_16_to_32; OutTraceDW("set color transformation 16<->32\n"); break; case 24: @@ -1095,6 +1542,7 @@ void SetBltTransformations() break; case 32: pEmuBlt=EmuBlt_32_to_32; + if(dxw.dwFlags4 & BILINEARFILTER) pEmuBlt=BilinearBlt_32_to_32; OutTraceDW("set color transformation 32->32\n"); break; default: @@ -1107,11 +1555,13 @@ void SetBltTransformations() case 8: pRevBlt=RevBlt_16_to_8; pEmuBlt=EmuBlt_8_to_16; + if(dxw.dwFlags4 & BILINEARFILTER) pEmuBlt=BilinearBlt_8_to_16; OutTraceDW("set color transformation 8<->16\n"); break; case 16: pRevBlt=RevBlt_16_to_16; pEmuBlt=EmuBlt_16_to_16; + if(dxw.dwFlags4 & BILINEARFILTER) pEmuBlt=BilinearBlt_16_to_16; OutTraceDW("set color transformation 16<->16\n"); break; case 24: diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 5797968..4615070 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -21,6 +21,8 @@ #include "Mmsystem.h" #include "disasm.h" +#define SKIPIMEWINDOW TRUE + dxwCore dxw; typedef char *(*Geterrwarnmessage_Type)(unsigned long, unsigned long); @@ -90,6 +92,17 @@ static char *Flag4Names[32]={ "HOTPATCHALWAYS", "NOD3DRESET", "OVERRIDEREGISTRY", "HIDECDROMEMPTY", }; +static char *Flag5Names[32]={ + "DIABLOCHEAT", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "", +}; + static char *TFlagNames[32]={ "OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE", "OUTPROXYTRACE", "DXPROXED", "ASSERTDIALOG", "OUTIMPORTTABLE", @@ -116,6 +129,7 @@ static void OutTraceHeader(FILE *fp) for(i=0, dword=dxw.dwFlags2; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", Flag2Names[i]); for(i=0, dword=dxw.dwFlags3; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", Flag3Names[i]); for(i=0, dword=dxw.dwFlags4; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", Flag4Names[i]); + for(i=0, dword=dxw.dwFlags5; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", Flag5Names[i]); for(i=0, dword=dxw.dwTFlags; i<32; i++, dword>>=1) if(dword & 0x1) fprintf(fp, "%s ", TFlagNames[i]); fprintf(fp, "***\n"); } @@ -154,6 +168,7 @@ void OutTrace(const char *format, ...) fflush(fp); } +#ifdef CHECKFORCOMPATIBILITYFLAGS static BOOL CheckCompatibilityFlags() { typedef DWORD (WINAPI *GetFileVersionInfoSizeA_Type)(LPCSTR, LPDWORD); @@ -194,6 +209,7 @@ static BOOL CheckCompatibilityFlags() } return FALSE; } +#endif static void dx_ToggleLogging() { @@ -430,8 +446,14 @@ void CalculateWindowPos(HWND hwnd, DWORD width, DWORD height, LPWINDOWPOS wp) case DXW_DESKTOP_CENTER: MaxX = dxw.iSizX; MaxY = dxw.iSizY; - if (!MaxX) MaxX = width; - if (!MaxY) MaxY = height; + if (!MaxX) { + MaxX = width; + if(dxw.dwFlags4 & BILINEARFILTER) MaxX <<= 1; // double + } + if (!MaxY) { + MaxY = height; + if(dxw.dwFlags4 & BILINEARFILTER) MaxY <<= 1; // double + } //GetClientRect(0, &desktop); (*pGetClientRect)(GetDesktopWindow(), &desktop); rect.left = (desktop.right - MaxX) / 2; @@ -842,10 +864,18 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp case WM_WINDOWPOSCHANGING: case WM_WINDOWPOSCHANGED: if(dxw.Windowize && dxw.IsFullScreen()){ + extern HWND hControlParentWnd; LPWINDOWPOS wp; wp = (LPWINDOWPOS)lparam; dxwFixWindowPos("WindowProc", hwnd, lparam); OutTraceDW("WindowProc: WM_WINDOWPOSCHANGING fixed size=(%d,%d)\n", wp->cx, wp->cy); + // try to lock main wind & control parent together + if((message==WM_WINDOWPOSCHANGED) && hControlParentWnd){ + if(dxw.IsDesktop(hwnd)) { + POINT fo = dxw.GetFrameOffset(); + (*pMoveWindow)(hControlParentWnd, wp->x+fo.x, wp->y+fo.y, wp->cx, wp->cy, TRUE); + } + } } break; case WM_ENTERSIZEMOVE: @@ -1451,6 +1481,10 @@ static void ReplaceRDTSC() FreeLibrary(disasmlib); } +#ifdef CREATEDESKTOP +HWND hDesktopWindow = NULL; +#endif + void HookInit(TARGETMAP *target, HWND hwnd) { HMODULE base; @@ -1468,7 +1502,7 @@ void HookInit(TARGETMAP *target, HWND hwnd) if(dxw.dwFlags1 & AUTOMATIC) dxw.dwFlags1 |= EMULATESURFACE; // if AUTOMATIC, try this first! - if(hwnd){ // v2/02.32: skip this when in code injection mode. + if(hwnd){ // v2.02.32: skip this when in code injection mode. // v2.1.75: is it correct to set hWnd here? //dxw.SethWnd(hwnd); dxw.hParentWnd=GetParent(hwnd); @@ -1478,6 +1512,22 @@ void HookInit(TARGETMAP *target, HWND hwnd) if(dxw.dwFlags4 & ENABLEHOTKEYS) dxw.MapKeysInit(); } +#ifdef CREATEDESKTOP + if(CREATEDESKTOP){ + if (!hDesktopWindow){ + //hDesktopWindow=CreateWindowEx(0, "STATIC", "DxWnd Desktop", 0, + hDesktopWindow=CreateWindowEx(WS_EX_CONTROLPARENT, "STATIC", "DxWnd Desktop", 0, + target->posx, target->posy, target->sizx, target->sizy, NULL, NULL, NULL, NULL); + if(hDesktopWindow){ + OutTraceDW("created desktop emulation: hwnd=%x\n", hDesktopWindow); + } + else{ + OutTraceE("CreateWindowEx ERROR: err=%d at %d\n", GetLastError(), __LINE__); + } + } + } +#endif + if(IsTraceDW){ OutTrace("HookInit: path=\"%s\" module=\"%s\" dxversion=%s pos=(%d,%d) size=(%d,%d)", target->path, target->module, dxversions[dxw.dwTargetDDVersion], @@ -1490,16 +1540,51 @@ void HookInit(TARGETMAP *target, HWND hwnd) if (hwnd && IsDebug){ DWORD dwStyle, dwExStyle; + char ClassName[81]; + char WinText[81]; dwStyle=GetWindowLong(dxw.GethWnd(), GWL_STYLE); dwExStyle=GetWindowLong(dxw.GethWnd(), GWL_EXSTYLE); - OutTrace("HookInit: hWnd style=%x(%s) exstyle=%x(%s)\n", dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); + GetClassName(dxw.GethWnd(), ClassName, sizeof(ClassName)); + GetWindowText(dxw.GethWnd(), WinText, sizeof(WinText)); + OutTrace("HookInit: dxw.hChildWnd=%x class=\"%s\" text=\"%s\" style=%x(%s) exstyle=%x(%s)\n", + dxw.hChildWnd, ClassName, WinText, dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); dwStyle=GetWindowLong(dxw.hParentWnd, GWL_STYLE); dwExStyle=GetWindowLong(dxw.hParentWnd, GWL_EXSTYLE); - OutTrace("HookInit: dxw.hParentWnd style=%x(%s) exstyle=%x(%s)\n", dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); + GetClassName(dxw.hParentWnd, ClassName, sizeof(ClassName)); + GetWindowText(dxw.hParentWnd, WinText, sizeof(WinText)); + OutTrace("HookInit: dxw.hParentWnd=%x class=\"%s\" text=\"%s\" style=%x(%s) exstyle=%x(%s)\n", + dxw.hParentWnd, ClassName, WinText, dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); OutTrace("HookInit: target window pos=(%d,%d) size=(%d,%d)\n", dxw.iPosX, dxw.iPosY, dxw.iSizX, dxw.iSizY); } + if (SKIPIMEWINDOW) { + char ClassName[8+1]; + GetClassName(hwnd, ClassName, sizeof(ClassName)); + if(!strcmp(ClassName, "IME")){ + dxw.hChildWnd=GetParent(hwnd); + dxw.hParentWnd=GetParent(dxw.hChildWnd); + if (dxw.dwFlags2 & SUPPRESSIME) DestroyWindow(hwnd); + // v2.02.31: set main win either this one or the parent! + dxw.SethWnd((dxw.dwFlags1 & FIXPARENTWIN) ? dxw.hParentWnd : dxw.hChildWnd); + hwnd = dxw.GethWnd(); + if(hwnd) OutTraceDW("HookInit: skipped IME window. current hWnd=%x(hdc=%x) dxw.hParentWnd=%x(hdc=%x)\n", + hwnd, GetDC(hwnd), dxw.hParentWnd, GetDC(dxw.hParentWnd)); + } + } + +#ifdef CREATEDESKTOP + if(CREATEDESKTOP){ + if (hDesktopWindow){ + OutTraceDW("HookInit: set new parent=%x\n", hDesktopWindow); + SetParent(dxw.hChildWnd, hDesktopWindow); + dxw.hParentWnd = hDesktopWindow; + } + } +#endif + +#ifdef CHECKFORCOMPATIBILITYFLAGS CheckCompatibilityFlags(); // v2.02.83 Check for change of OS release +#endif HookSysLibsInit(); // this just once... @@ -1558,7 +1643,7 @@ void HookInit(TARGETMAP *target, HWND hwnd) InitScreenParameters(); if(hwnd) HookWindowProc(hwnd); // in fullscreen mode, messages seem to reach and get processed by the parent window - if(!dxw.Windowize && hwnd) HookWindowProc(GetParent(hwnd)); + if((!dxw.Windowize) && hwnd) HookWindowProc(GetParent(hwnd)); // initialize window: if // 1) not in injection mode (hwnd != 0) and diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index f23fd4a..1688fe5 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -76,6 +76,7 @@ void dxwCore::InitTarget(TARGETMAP *target) dwFlags2 = target->flags2; dwFlags3 = target->flags3; dwFlags4 = target->flags4; + dwFlags5 = target->flags5; dwTFlags = target->tflags; Windowize = (dwFlags2 & WINDOWIZE) ? TRUE : FALSE; if(dwFlags3 & FULLSCREENONLY) FullScreen=TRUE; @@ -302,6 +303,17 @@ RECT dxwCore::GetUnmappedScreenRect() return Screen; } +POINT dxwCore::GetFrameOffset() +{ + RECT wrect; + POINT FrameOffset={0, 0}; + (*pGetWindowRect)(hWnd, &wrect); + (*pClientToScreen)(hWnd, &FrameOffset); + FrameOffset.x -= wrect.left; + FrameOffset.y -= wrect.top; + OutTraceB("GetFrameOffset: offset=(%d,%d)\n", FrameOffset.x, FrameOffset.y); + return FrameOffset; +} BOOL dxwCore::IsDesktop(HWND hwnd) { diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 3656f2c..fef7be7 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -68,6 +68,7 @@ public: // methods RECT GetUnmappedScreenRect(); RECT GetWindowRect(RECT); RECT GetClientRect(RECT); + POINT GetFrameOffset(); POINT AddCoordinates(POINT, POINT); RECT AddCoordinates(RECT, POINT); POINT SubCoordinates(POINT, POINT); @@ -130,6 +131,7 @@ public: // simple data variables DWORD dwFlags2; DWORD dwFlags3; DWORD dwFlags4; + DWORD dwFlags5; DWORD dwTFlags; HWND hParentWnd; HWND hChildWnd; diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index f297218..c00f7ca 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -24,7 +24,7 @@ along with this program. If not, see . #include "dxwnd.h" #include "dxwcore.hpp" -#define VERSION "2.02.86" +#define VERSION "2.02.87" #define DDTHREADLOCK 1 @@ -184,6 +184,8 @@ LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam) // This callback is invoked per each process' thread. DoOnce = TRUE; + extern HHOOK hHook; + UnhookWindowsHookEx(hHook); // V.68: concurrency check. One game at a time, or exiting. // no good trying to insert fancy dialog boxes: the window diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index de13caba4d1eb0db88e7347474d26713bfd69cb5..79d498c84579d557fc557ed84a7582033d0ed8d7 100644 GIT binary patch delta 20879 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 V$LhAisHIP-n;cI5+CNd?e*mOhNEQG9 diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index 2b99b2a..6a340ee 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -871,6 +871,12 @@ HDC WINAPI extGDICreateCompatibleDC(HDC hdc) OutTraceDW("GDI.CreateCompatibleDC: hdc=%x\n", hdc); if(hdc==0){ hdc=(*pGDIGetDC)(dxw.GethWnd()); +#ifdef CREATEDESKTOP + if(CREATEDESKTOP){ + extern HWND hDesktopWindow; + hdc=(*pGDIGetDC)(hDesktopWindow); + } +#endif OutTraceDW("GDI.CreateCompatibleDC: duplicating win HDC hWnd=%x\n", dxw.GethWnd()); } diff --git a/dll/user32.cpp b/dll/user32.cpp index c04ce68..ef59493 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -816,14 +816,11 @@ BOOL WINAPI extGetCursorPos(LPPOINT lppoint) if(dxw.dwFlags4 & FRAMECOMPENSATION){ static int dx, dy, todo=TRUE; if (todo){ - RECT wrect; - POINT upleft={0, 0}; - todo=FALSE; - (*pGetWindowRect)(dxw.GethWnd(), &wrect); - (*pClientToScreen)(dxw.GethWnd(), &upleft); - dx=upleft.x - wrect.left; - dy=upleft.y - wrect.top; + POINT FrameOffset = dxw.GetFrameOffset(); + dx=FrameOffset.x; + dy=FrameOffset.y; OutTraceC("GetCursorPos: frame compensation=(%d,%d)\n", dx, dy); + todo=FALSE; } lppoint->x += dx; lppoint->y += dy; @@ -1062,11 +1059,19 @@ int WINAPI extMapWindowPoints(HWND hWndFrom, HWND hWndTo, LPPOINT lpPoints, UINT HWND WINAPI extGetDesktopWindow(void) { - // V2.1.73: correct ??? HWND res; + if((!dxw.Windowize) || (dxw.dwFlags5 & DIABLOTWEAK)) return (*pGetDesktopWindow)(); + OutTraceDW("GetDesktopWindow: FullScreen=%x\n", dxw.IsFullScreen()); if (dxw.IsFullScreen()){ +#ifdef CREATEDESKTOP + if(CREATEDESKTOP){ + extern HWND hDesktopWindow; + OutTraceDW("GetDesktopWindow: returning desktop emulated hwnd=%x\n", hDesktopWindow); + return hDesktopWindow; + } +#endif OutTraceDW("GetDesktopWindow: returning main window hwnd=%x\n", dxw.GethWnd()); return dxw.GethWnd(); } @@ -1174,6 +1179,8 @@ static void HookChildWndProc(HWND hwnd, DWORD dwStyle, LPCTSTR ApiName) if(!res) OutTraceE("%s: SetWindowLong ERROR %x\n", ApiName, GetLastError()); } +HWND hControlParentWnd = NULL; + static HWND WINAPI extCreateWindowCommon( LPCTSTR ApiName, BOOL WideChar, @@ -1196,7 +1203,7 @@ static HWND WINAPI extCreateWindowCommon( iOrigW=nWidth; iOrigH=nHeight; - if(!dxw.Windowize){ + if(!dxw.Windowize || (hWndParent == HWND_MESSAGE)){ // v2.02.87: don't process message windows (hWndParent == HWND_MESSAGE) if(WideChar) hwnd= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam); else @@ -1215,6 +1222,16 @@ static HWND WINAPI extCreateWindowCommon( dwStyle &= ~WS_MAXIMIZE; } +#ifdef CREATEDESKTOP + if(CREATEDESKTOP){ + extern HWND hDesktopWindow; + if (dxw.IsRealDesktop(hWndParent)){ + OutTraceE("%s: new parent win %x->%x\n", ApiName, hWndParent, hDesktopWindow); + hWndParent=hDesktopWindow; + } + } +#endif + // v2.1.92: fixes size & position for auxiliary big window, often used // for intro movies etc. : needed for ...... // evidently, this was supposed to be a fullscreen window.... @@ -1240,7 +1257,7 @@ static HWND WINAPI extCreateWindowCommon( && !(dwStyle & WS_CHILD) // Diablo fix ) - { + { RECT screen; POINT upleft = {0,0}; @@ -1340,6 +1357,8 @@ static HWND WINAPI extCreateWindowCommon( return hwnd; } + if (dwExStyle & WS_EX_CONTROLPARENT) hControlParentWnd=hwnd; + if ((!isValidHandle) && dxw.IsFullScreen()){ dxw.SethWnd(hwnd); extern void AdjustWindowPos(HWND, DWORD, DWORD); @@ -1409,9 +1428,10 @@ HWND WINAPI extCreateWindowExW( else sprintf(wString,"%d", nWidth); if (nHeight==CW_USEDEFAULT) strcpy(hString,"CW_USEDEFAULT"); else sprintf(hString,"%d", nHeight); - OutTrace("CreateWindowExW: class=\"%ls\" wname=\"%ls\" pos=(%s,%s) size=(%s,%s) Style=%x(%s) ExStyle=%x(%s)\n", + OutTrace("CreateWindowExW: class=\"%ls\" wname=\"%ls\" pos=(%s,%s) size=(%s,%s) Style=%x(%s) ExStyle=%x(%s) hWndParent=%x%s hMenu=%x\n", ClassToWStr(lpClassName), lpWindowName, xString, yString, wString, hString, - dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); + dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle), + hWndParent, hWndParent==HWND_MESSAGE?"(HWND_MESSAGE)":"", hMenu); } if(IsDebug) OutTrace("CreateWindowExW: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight()); @@ -1443,9 +1463,10 @@ HWND WINAPI extCreateWindowExA( else sprintf(wString,"%d", nWidth); if (nHeight==CW_USEDEFAULT) strcpy(hString,"CW_USEDEFAULT"); else sprintf(hString,"%d", nHeight); - OutTrace("CreateWindowExA: class=\"%s\" wname=\"%s\" pos=(%s,%s) size=(%s,%s) Style=%x(%s) ExStyle=%x(%s)\n", + OutTrace("CreateWindowExA: class=\"%s\" wname=\"%s\" pos=(%s,%s) size=(%s,%s) Style=%x(%s) ExStyle=%x(%s) hWndParent=%x%s hMenu=%x\n", ClassToStr(lpClassName), lpWindowName, xString, yString, wString, hString, - dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle)); + dwStyle, ExplainStyle(dwStyle), dwExStyle, ExplainExStyle(dwExStyle), + hWndParent, hWndParent==HWND_MESSAGE?"(HWND_MESSAGE)":"", hMenu); } if(IsDebug) OutTrace("CreateWindowExA: DEBUG screen=(%d,%d)\n", dxw.GetScreenWidth(), dxw.GetScreenHeight()); @@ -2317,6 +2338,10 @@ BOOL WINAPI extDestroyWindow(HWND hWnd) OutTraceDW("DestroyWindow: destroy main hwnd=%x\n", hWnd); dxw.SethWnd(NULL); } + if (hControlParentWnd && (hWnd == hControlParentWnd)) { + OutTraceDW("DestroyWindow: destroy control parent hwnd=%x\n", hWnd); + hControlParentWnd = NULL; + } res=(*pDestroyWindow)(hWnd); if(!res)OutTraceE("DestroyWindow: ERROR err=%d\n", GetLastError()); return res; @@ -2716,7 +2741,9 @@ int WINAPI extGetUpdateRgn(HWND hWnd, HRGN hRgn, BOOL bErase) if( regionType == SIMPLEREGION ){ dxw.UnmapClient(&rc); if( SetRectRgn( hRgn, rc.left, rc.top, rc.right, rc.bottom ) ){ - ; // success + // success + OutTraceDW("GetUpdateRgn: hwnd=%x hrgn=%x update rgn=(%d,%d)-(%d,%d) erase=%x\n", + hWnd, hRgn, rc.left, rc.top, rc.right, rc.bottom, bErase); } } } diff --git a/host/MainFrm.cpp b/host/MainFrm.cpp index 7ce9e7f..bae5892 100644 --- a/host/MainFrm.cpp +++ b/host/MainFrm.cpp @@ -116,6 +116,7 @@ BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) cs.cx = GetPrivateProfileInt("window", "sizx", 320, InitPath); cs.cy = GetPrivateProfileInt("window", "sizy", 200, InitPath); + // keep window inside desktop boundaries ::GetWindowRect(::GetDesktopWindow(), &DesktopRect); if(cs.cx < 320) cs.cx = 320; diff --git a/host/Resource.h b/host/Resource.h index 8ebc3a6755dbb784d9911ebdcfb21d32ef77d73e..e67e1891ffb659bca04e19bd9bbc91c57f221e91 100644 GIT binary patch delta 81 zcmbR6l(Fj>$$~P{izoOi0|3*275o4I delta 37 qcmeBr#yH_Am_NoPower2Fix); DDX_Check(pDX, IDC_NOPERFCOUNTER, cTarget->m_NoPerfCounter); DDX_Check(pDX, IDC_HIDECDROMEMPTY, cTarget->m_HideCDROMEmpty); + DDX_Check(pDX, IDC_DIABLOTWEAK, cTarget->m_DiabloTweak); // 3D management DDX_Check(pDX, IDC_NOTEXTURES, cTarget->m_NoTextures); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 752f061..82be5c4 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -40,6 +40,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_SuppressIME = FALSE; m_SuppressD3DExt = FALSE; m_SetCompatibility = TRUE; + m_DiabloTweak = TRUE; m_DisableHAL = FALSE; m_ForcesHEL = FALSE; m_ColorFix = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 0b43c81..d1a92a8 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -142,6 +142,7 @@ public: BOOL m_DisableFogging; BOOL m_SuppressIME; BOOL m_SetCompatibility; + BOOL m_DiabloTweak; BOOL m_DisableHAL; BOOL m_ForcesHEL; BOOL m_ColorFix; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 74a40fb0ff89d5ef9d44280a53923aebf2d5b865..0934b42c33f50270356c5d561e858719955a8f10 100644 GIT binary patch delta 5945 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 diff --git a/host/dxwndhost.cpp b/host/dxwndhost.cpp index b75639e..d93c908 100644 --- a/host/dxwndhost.cpp +++ b/host/dxwndhost.cpp @@ -104,6 +104,8 @@ CDxwndhostApp theApp; BOOL CDxwndhostApp::InitInstance() { + char InitPath[MAX_PATH]; + int CompatibilityMinLevel; AfxEnableControlContainer(); // standard initialization @@ -130,13 +132,15 @@ BOOL CDxwndhostApp::InitInstance() // and user-defined flags. The CCommandLine class has been replaced CNewCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); + + GetCurrentDirectory(MAX_PATH, InitPath); + strcat_s(InitPath, sizeof(InitPath), "\\dxwnd.ini"); + + //CompatibilityMinLevel = GetPrivateProfileInt("window", "compatminlevel", 0, InitPath); if(!LangSelected){ LANGID LangId; char LangString[20+1]; - char InitPath[MAX_PATH]; - GetCurrentDirectory(MAX_PATH, InitPath); - strcat_s(InitPath, sizeof(InitPath), "\\dxwnd.ini"); GetPrivateProfileString("window", "lang", "", LangString, 20+1, InitPath); if(!strcmp(LangString, "default") || !strlen(LangString)){ // if no specification, or lang=default // do nothing diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 65943347a60fb2701557f26333babed7dabc2bcc..e90125b8e1ee4c3fb34d244e6acd3e3f1fe00832 100644 GIT binary patch delta 93 zcmZph&w6bE>xPU=lM_yBO~&!E6i!cfkT%8H&0LKwmsT!B3A$q&QAnGF~WCU;IVoW6&dk#F;qOP^{0(FPh8 delta 23 fcmcb%fVFKt>xPU=ljls6o8H61$hSG=@~0XAgcJ(_ diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 3fa1ea210357df3cbcb5e556617a39819cbd3fa6..0ec922a24e072299ca5124331a1bd0eceb3b4f68 100644 GIT binary patch delta 7514 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 OC|fp6{RV)4SN;npF`0P) delta 1984 zcmbuASxj727{|}K+!?kh%nY;9&~X@+PAO#z7Ni4Q+QvvV6$oI1*q~G;7D=RI!deC& zco2$pz89Ywz?c|KOv`;C8Y8q+eQArf)(sU`nurv2sx3B*|HI6kqA>>JNq#xs_rGWP z&h}k@Q1S=)NrlIpsX8XfYoSnxrX-hD7^RG{dq5f31J=&ertpB=o;256ep#Bh#A6`( z>#0YsrgP>(Dv)KmDLJ)0pc92h3qm!WMqRMm}+Ue@`XQ47qb^7f4#B?rr z=|I>SsOP};h%Yn`>>WT1zZ2wwT_6wSg94yV>)Rw+=(DL6@k3k}3u#MqUVl91O}KwO z*6Adfx)N)6oc2`>CSH^VI7g3bVqMJ2y!v@5fw55NDTxVPl+s7Ma@b-z&F+XfbSZ(V;>&5opadLUTvods zyh3dN9v~t`=xBH#yRd=VvW3-j1zAT?fehYKb(r$+% z6=!n}&MY_&-UaUgN-J>oMIgo$+=|#ssDA>>;5uW4Yz4;8;1}>K2!b2nH}E^S30A?~Sj8Wx)uj?k zGVL9)(Q<*4t_{6GmVPhwWjM(D{A%(+b_CC{neAs?>><`cmDPjvShpD)<)FD?+r$A$ zCvL_Bj;vRlz9=qEbIAob?+$Eo0nNNzNvCSJmHp@29UhH2wc#>U<)EL_jBN+KJ!U84 zu`*m4CzaNE$X~0Y$zdnG+2Ev>(M&&v)76xVzx{7X5~+!Zz!n%iEipBfN7HfF|7_&q?Bjd~J%7Z8_vqYjseOsas5 zy2!FFQ1mxl_~JJvav<7sv+6(mzRY)ODTREk59*ot!{lj_8f?8H@j}g|;1l(HSJd-8 zITC}kPF2s8)9q3ZkEaflags2 = 0; t->flags3 = 0; t->flags4 = 0; + t->flags5 = 0; t->tflags = 0; if(dlg->m_UnNotify) t->flags |= UNNOTIFY; if(dlg->m_Windowize) t->flags2 |= WINDOWIZE; @@ -179,6 +180,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_SuppressIME) t->flags2 |= SUPPRESSIME; if(dlg->m_SuppressD3DExt) t->flags3 |= SUPPRESSD3DEXT; if(dlg->m_SetCompatibility) t->flags2 |= SETCOMPATIBILITY; + if(dlg->m_DiabloTweak) t->flags5 |= DIABLOTWEAK; if(dlg->m_DisableHAL) t->flags3 |= DISABLEHAL; if(dlg->m_ForcesHEL) t->flags3 |= FORCESHEL; if(dlg->m_ColorFix) t->flags3 |= COLORFIX; @@ -344,6 +346,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_SuppressIME = t->flags2 & SUPPRESSIME ? 1 : 0; dlg->m_SuppressD3DExt = t->flags3 & SUPPRESSD3DEXT ? 1 : 0; dlg->m_SetCompatibility = t->flags2 & SETCOMPATIBILITY ? 1 : 0; + dlg->m_DiabloTweak = t->flags5 & DIABLOTWEAK ? 1 : 0; dlg->m_DisableHAL = t->flags3 & DISABLEHAL ? 1 : 0; dlg->m_ForcesHEL = t->flags3 & FORCESHEL ? 1 : 0; dlg->m_ColorFix = t->flags3 & COLORFIX ? 1 : 0; @@ -488,6 +491,9 @@ static void SaveConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, sprintf_s(key, sizeof(key), "flagi%i", i); sprintf_s(val, sizeof(val), "%i", TargetMap->flags4); WritePrivateProfileString("target", key, val, InitPath); + sprintf_s(key, sizeof(key), "flagj%i", i); + sprintf_s(val, sizeof(val), "%i", TargetMap->flags5); + WritePrivateProfileString("target", key, val, InitPath); sprintf_s(key, sizeof(key), "tflag%i", i); sprintf_s(val, sizeof(val), "%i", TargetMap->tflags); WritePrivateProfileString("target", key, val, InitPath); @@ -555,6 +561,8 @@ static void ClearTarget(int i, char *InitPath) WritePrivateProfileString("target", key, 0, InitPath); sprintf_s(key, sizeof(key), "flagi%i", i); WritePrivateProfileString("target", key, 0, InitPath); + sprintf_s(key, sizeof(key), "flagj%i", i); + WritePrivateProfileString("target", key, 0, InitPath); sprintf_s(key, sizeof(key), "tflag%i", i); WritePrivateProfileString("target", key, 0, InitPath); sprintf_s(key, sizeof(key), "initx%i", i); @@ -626,6 +634,8 @@ static int LoadConfigItem(TARGETMAP *TargetMap, PRIVATEMAP *PrivateMap, int i, c TargetMap->flags3 = GetPrivateProfileInt("target", key, 0, InitPath); sprintf_s(key, sizeof(key), "flagi%i", i); TargetMap->flags4 = GetPrivateProfileInt("target", key, 0, InitPath); + sprintf_s(key, sizeof(key), "flagj%i", i); + TargetMap->flags5 = GetPrivateProfileInt("target", key, 0, InitPath); sprintf_s(key, sizeof(key), "tflag%i", i); TargetMap->tflags = GetPrivateProfileInt("target", key, 0, InitPath); sprintf_s(key, sizeof(key), "initx%i", i); diff --git a/locale/cn/Resources_Cn.ncb b/locale/cn/Resources_Cn.ncb index 48bdd41c6c18d947ce8e30d34358edac599d73e0..293e240163c3850ad9bac49f6d589fac3c40047b 100644 GIT binary patch delta 397 zcmZpe!PIbrae@Y~Gy?-e1rURP@Mb}Q)6C2d7(Q$kWO>g#S%HO*Q3A#kn8d@$!m;}= z<7QqSNk&HV&FZ}SfYf9Se#Ob`{0cw;4gNbUs=SA<1v3K8a$MrDaEa<}k9OCkzfP*F z`GG9}5+FH7pgq@_C0T$>5Vinf7+?l6Sb@^dnK#LZ$^Z=&v(N%r=4iQq(b+t{xF|U$ zCqFqcCp9KHFUC5>D#oQEJTE1t%qZT#DBc2H0RvD$N<}%6g30Seq$b;0O8_0dUPOFy zo;9y7KhVyzOb`dC0-XnPp%qZf6i7RP+=B$zCptzfvf-E{!XkmoqmyMsCV@@g%?t80 lClD6_G56+j(OxE286dN7GpEOQW=5gSj3xiY7b~c6007?5Uhn__ delta 611 zcmZp;!Pqc^X@Ul?G6Mrc1rURP>}ElM)66VC{xcld%*gSFnVEs%ACU2vc@hsNi^Bsp zrp>%Ol8lUIo7H*u0jbFv{ECy=`4xZy8vJ)yBofR{1Tz7R*}lKP+V0>bhn;i#dd}YW z&6_OaG6|@9y~}RiBA_%k5c>f!=jL+PUM9wh$*dmstU^Em*3F(C+nG1Xh{^y>6tmC* z+2m-sfYI43zPKnkCMQ2RF()-9IWNXK#VW?7B0Mi8rpzebz$o4VT>%47K}tnAk^-RZ zQj_hhCBW_wpPXmSJJCfzR+W)~0f-o^fIdA7bh;^!?F3}=12OwV$B0EX9FqiCIe?;! z9J@tudLI}NZ#Ii~ykVZCAj8PCSythP_~7vY%Onv>qQ+TQ8t8oiAQl8-VIUR*VhJFY c1Y&U@21T6+5Q_q_)JDf{W=5IKj6VOx0f45RO#lD@ diff --git a/locale/cn/Resources_Cn.rc b/locale/cn/Resources_Cn.rc index ee71530d5afd67da3c715f2ce326b6cb4d873d28..c95d8534f63341e4c199f9586eb424a0e9bd27e8 100644 GIT binary patch delta 98 zcmccflV#0smJMo0CokBpHMt;>#Way2i6Ms}pFx44grS@vl_8NKn?Z>|hryG|u5tj3XA8^# diff --git a/locale/cn/Resources_Cn.suo b/locale/cn/Resources_Cn.suo index 5c6baa9575c076cd2ce3d273b6ba24a76198eef6..6bed9dea171325698fe243db608179fc0a1cf74d 100644 GIT binary patch delta 259 zcmZp$X|UPg!@|fpS&>DaZGm%l(VA70i&z3DALcWhY{0@Y`3K7x9$^Ls20-_h*`Xn8k2%i4ag)3{CUqFG5AkU{_dfULd9nRLO0- hN%9CI4=+$56OuWTzexG>GB5%~n2|&`mq_<80RUXdW-I^z delta 245 zcmZp$X|UPg!@|flS&>Da&EcAg8{?wMMJ$1n4|5q#Heg|y{Db8Tj~D|3gCG$92ZG5L zSyU!F2(WDa!TN!T(QNVq8Tri|oDPf}JV**QmvEhD1{+br7ckjH!e$b`3y&yJ0Vk58 z$tC>$AT^u6@cT3IGI9W=xKX5qpwdD`%wUTwH!l!V2C4)(gBMBV<}VT#7xPU=lM_yBO~&!E6i!cfkT%8H&0LKwmsT!B3A$q&QAnGF~WCU;IVoW6&dk#F;qOP^{0(FPh8 delta 23 fcmcb%fVFKt>xPU=ljls6o8H61$hSG=@~0XAgcJ(_ diff --git a/locale/en/Resources_En.ncb b/locale/en/Resources_En.ncb index f02b3ef2748d4238da4ede872f4a67f05192d225..33ba46b796f06788be2896107b2bf71de6afb9bc 100644 GIT binary patch delta 287 zcmZp;!PszvaRWCG6Eo9hULHwCM)S?;y!(LEWDS1B$?W_JKmiT@J1i0p4qXdoWME+M zYe{!rnLp8IX~p4eiN*6bZk7@GsSH#kW}yYr>}a`w(b+t{xF|U$CqFqcCp9KDFUC5> zD#oQEJTE1t%qZT#DBc2H0RvD$N<}%6g30S$q$b;0O8_0R-bH+Jp0%J7&~gSRW)R81 z0CLG$CI$v8AfF$IRY3v_n-^LqbKrF8WEq!9VB?Bq-v@Dm)HA39F*^|N0AgMsjss$@ Q$>y%!8(qqn7I~-u0F delta 285 zcmZp;!PszvaRWCG({sknygZVOjAonFdG`US$r}8MliB$dfC3u)cUUAQnwDatzq@k@HML@7qML8;b&lAU;*O)Krs0ti^}8%4wlIktUf%# zKtVxd2?qg|%|BQ_Ffp2Me#sHd$ioJd-|thR*TpBL;RE+o;-U-LflBglS_mG zc*KALe8_@dfP&&c0U>0;65#+IUZ8*olHleq!bLzYO@7HCzqw7!j)eyl5CTXFCV!C% a;b2A delta 370 zcmZp$Xt3De!@|fpS&>DaO~9?Zm|@Z6B9==$A`A=+Y(V@U2qs@-QJLJp!7{mm)rUt6 zC@6|7;UK`W`3LIT|e#s%fxlPQDg@+d?DS)J4 e@)xNP4q;@066pXQW}pBck|2*7kOT5G2mkGhV#s00XHZ}$VJK%vWk_VmW>8|#Ven*dVQ^-M l2a=u)jtou=J`Da0Aq?RRu0Wpmj2KR6#W1I delta 14 Wcmeyif_2$))(v)7H}hS~r~?2u(g!vG diff --git a/locale/it/Resources_It.ncb b/locale/it/Resources_It.ncb index c36d64fe954bf66a07d80d7fd3da7ffc0c25d0af..dd9ef45eed0315c06ad2a714f178ec10bd3bbea6 100644 GIT binary patch delta 424 zcmZpe!PIbrae@Y~Gy?-e1rURP@Mb}Q)6C2d7(Q$kWO>g#S%HO*Q3A#kn8d@$yx_&> z%{)9(jEv@+)p_>;smU7rij&#-6@UU7{C8MXD-K-?W&|2FJHLBdW70c^O@0e~=f3n( z1)C2fKyr*gYpyd(vH+PNYyreDzzk%t0;QibZ;}y}0U9c1p#`$c(Q*N!vw3`RQF2U9 zesW??YD{KHjCG1tj7vp$UP?@vQM`dsyal=f2B3nJigF|clh=z#O}4X^06KiVi1_3@ zYhK;6ObiUFKxctm1_Gu)Yz1_O6UZ${fFHt8B6|)FIG_D F0026bW$XX| delta 731 zcmZp;!Pqc^X@Ul?G6Mrc1rURP>}ElM)66VC{xcld%*gSFnVEs%ACU2vc@hsNGso_y zn|XMo7#YnrtMl#yQj<0K6(_UvD*y#F`0ubtEHgV1%mg%L#p7wx>n23`EnDGr`{#x) z_b1D^OaiK2?^100JeU(~kvfoM2jU$-%nQV4ftU}7L4XB_?SYsBh*ttJ4-gjtG56+p z*QHF16_Z&#>{*3?0<4=oJ+?D%k`a{wxz|dd>TB`~o zfWQ=pt$<=@fqr%Z(#U{)qGQA&8;(f=tRP=9a_qi^E9iiM_-3<+#~bEJ3NnmLn`IS# zh!0ZVuuKx6XB<20N&|yV0Eh*FSQv=KfLH>EC4pERh(T#U1c*g}SZbqVH#4KmW=5a? F;sDIFru6^- diff --git a/locale/it/Resources_It.suo b/locale/it/Resources_It.suo index 92db4c49bd36c9d371f70a9753d4a00e3d19c4bd..39d388b9c036076662943a66774b3a698fde0ee2 100644 GIT binary patch delta 117 zcmZp$X|UPg!@|flS&>DaO+ZIhYR#(6MJ#13jOLqPazwH6GO#c(Fz^8Je;}BAkws;4 w317fu7k-1uU-$xexPcO!D3bjCyo?-B5tx?EU-*mI7|kcYDa%^*_8k8#oFB9<~1MzhT?Iigs38Ce(@7