From 41fa5c41323975f174fd042a814041937177322f Mon Sep 17 00:00:00 2001 From: gho tik Date: Wed, 8 Oct 2014 12:39:38 -0400 Subject: [PATCH] v2_02_88_src Former-commit-id: 7016413cfc5c8f6c6af6498062e9d1f36294e800 --- Include/dxwnd.h | 3 +- build/Resources_CN.dll | 4 +- build/Resources_EN.dll | 4 +- build/Resources_IT.dll | 4 +- build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/dxwnd.ini | 119 +--------------------- build/exports/dxwnd.ini | 4 +- build/readme-relnotes.txt | 11 +++ dll/ddraw.cpp | 66 ++++++------- dll/dxemublt.cpp | 2 +- dll/dxhook.cpp | 36 +++++-- dll/dxwcore.cpp | 185 +++++++++++++++++++++++++---------- dll/dxwcore.hpp | 12 ++- dll/dxwnd.cpp | 4 +- dll/dxwnd.vs2008.suo | Bin 214528 -> 259584 bytes dll/hd3d.cpp | 11 +++ dll/hd3d7.cpp | 8 +- dll/kernel32.cpp | 14 ++- host/DesktopDialog.cpp | 103 +++++++++++++++++++ host/DesktopDialog.h | 27 +++++ host/Resource.h | Bin 29450 -> 29518 bytes host/StatusDialog.cpp | 38 ++++++- host/TabCompat.cpp | 1 + host/TargetDlg.cpp | 2 +- host/TargetDlg.h | 1 + host/dxwnd.ini | 5 - host/dxwndhost.aps | Bin 154124 -> 150652 bytes host/dxwndhost.cpp | 1 - host/dxwndhost.rc | Bin 86102 -> 85436 bytes host/dxwndhost.vs2008.suo | Bin 47616 -> 66560 bytes host/dxwndhost.vs2008.vcproj | 12 +++ host/dxwndhostView.cpp | 11 +++ host/dxwndhostView.h | 1 + host/res/bigicons.bmp | Bin 9270 -> 5174 bytes host/res/palette0.bmp | Bin 314 -> 0 bytes locale/cn/Resources_Cn.ncb | Bin 27648 -> 35840 bytes locale/cn/Resources_Cn.rc | Bin 81324 -> 80182 bytes locale/cn/Resources_Cn.suo | Bin 7680 -> 7680 bytes locale/en/Resources_EN.rc | Bin 86102 -> 85436 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 87158 -> 86494 bytes locale/it/Resources_It.ncb | Bin 27648 -> 35840 bytes locale/it/Resources_It.suo | Bin 7680 -> 7680 bytes 45 files changed, 455 insertions(+), 242 deletions(-) create mode 100644 host/DesktopDialog.cpp create mode 100644 host/DesktopDialog.h delete mode 100644 host/dxwnd.ini delete mode 100644 host/res/palette0.bmp diff --git a/Include/dxwnd.h b/Include/dxwnd.h index f04c52c..6266ef9 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -148,6 +148,7 @@ // fifth flags DWORD dxw.dwFlags5: #define DIABLOTWEAK 0x00000001 // ... ??? ... +#define CLEARTARGET 0x00000002 // forces a D3D clean on target surface upon each BeginScene invocation // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general @@ -204,7 +205,7 @@ typedef struct short IsFullScreen; short Width, Height; short ColorDepth; - //DDPIXELFORMAT VirtualPixel; + DDPIXELFORMAT pfd; short DXVersion; HWND hWnd; DWORD dwPid; diff --git a/build/Resources_CN.dll b/build/Resources_CN.dll index 91c3a99..6defe55 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:782d53dad4046b681b15ecfbc8dd370c7a8097b7903daf63e4089c9b96916158 -size 125952 +oid sha256:4de37cdb906c386f2ba4b7f6793d36614ad77fcc432b1a21de322f93df87522a +size 132096 diff --git a/build/Resources_EN.dll b/build/Resources_EN.dll index 0030f75..63655f3 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:9ad4422aea023277c8d4310eb68782709f10d7567c8b12af62a30a32b3016c57 -size 131072 +oid sha256:3997d0254b83f70e4dd1ae372d7c5aefb6d6aeb5b6345651fca1dd1fa166b015 +size 137216 diff --git a/build/Resources_IT.dll b/build/Resources_IT.dll index a527ff2..670c9b7 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:ab41e49d035c39a3a88ce07e5900ea8b8e8768ad56749e8f06969b9df343374f -size 132096 +oid sha256:2b27f7aa0eaa1fe4770e14f916970df79b1885df82aef47f260b00527074d10a +size 138240 diff --git a/build/dxwnd.dll b/build/dxwnd.dll index f63f5a6..729ad7e 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f143e88ec5785fc2144af1a779b09b9e0791bf0e1e7d7050c1921d36284787e -size 501248 +oid sha256:b6a90eedd9d99a4deac23538e6b96663ef88f4d640ddf13bc9e58289bbd6ba82 +size 503296 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 78aace7..98f6cce 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ad3ceed714b0d4f97f1187893964ff234e6c48de19bac84b66a1f25c9105088c -size 549376 +oid sha256:79e9b0ed736620751f6a8788cba0d30c929abf45772b782f8fa6ccfdb6fa173c +size 557568 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index 56c15db..1db23f9 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -2,120 +2,5 @@ sizx=320 sizy=200 lang=automatic -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 +posx=50 +posy=50 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini index 87a33a6..58551d6 100644 --- a/build/exports/dxwnd.ini +++ b/build/exports/dxwnd.ini @@ -1,5 +1,5 @@ [window] -posx=1392 -posy=385 +posx=1803 +posy=246 sizx=320 sizy=200 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 48f1da9..5f3cfaa 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -569,3 +569,14 @@ 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. + +v2.02.88 +fix: DIABLOTWEAK flag defaulted to FALSE +add: CLEARTARGET flag - forces a Clear CLEAR_TARGET operation on D3D BeginPaint: useful in combination with wireframe mode. +updated "Optimize CPU" behavior: now it emulates a VSync wait also on D3D8/D3D9. Fixes some "swimming" problem in "Soul Reaver 2", and saves CPU time by limiting the FPS to the refresh rate. +fixed positioning of FPS and time stretching indication on screen overlay +cleaned up GUI project: no more japanese and localized resources, no more unreferenced resources. +GUI: added Desktop status window +GUI: added pixel format descriptor to DxWnd status + + diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index abed4e1..5b8f721 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -294,7 +294,6 @@ int iRefreshDelayCount=2; void SetVSyncDelays(LPDIRECTDRAW lpdd) { DDSURFACEDESC2 ddsdRefreshRate; - int Reminder; HRESULT res; memset(&ddsdRefreshRate, 0, sizeof(ddsdRefreshRate)); @@ -305,18 +304,7 @@ void SetVSyncDelays(LPDIRECTDRAW lpdd) res=(*pGetDisplayMode)(lpdd, (LPDDSURFACEDESC)&ddsdRefreshRate); } if(res) return; - gdwRefreshRate = ddsdRefreshRate.dwRefreshRate; - if(!gdwRefreshRate) return; - iRefreshDelayCount=0; - Reminder=0; - do{ - iRefreshDelays[iRefreshDelayCount]=(1000+Reminder)/gdwRefreshRate; - Reminder=(1000+Reminder)-(iRefreshDelays[iRefreshDelayCount]*gdwRefreshRate); - iRefreshDelayCount++; - } while(Reminder && (iRefreshDelayCountHeight=(short)dxw.GetScreenHeight(); GetHookInfo()->Width=(short)dxw.GetScreenWidth(); + GetHookInfo()->ColorDepth=(short)dwbpp; if(dxw.Windowize) AdjustWindowFrame(dxw.GethWnd(), dwwidth, dwheight); if(dxw.dwFlags1 & EMULATESURFACE){ @@ -1909,6 +1898,7 @@ HRESULT WINAPI extSetDisplayMode(int version, LPDIRECTDRAW lpdd, } else{ OutTraceDW("SetDisplayMode: mode=STANDARD BPP=%d\n", dwbpp); + dxw.VirtualPixelFormat.dwRGBBitCount = dwbpp; dxw.ActualPixelFormat.dwRGBBitCount = dwbpp; } @@ -2501,7 +2491,7 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf if(lpDDSEmu_Back==NULL){ ClearSurfaceDesc((void *)&ddsd, dxversion); ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; - ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; + ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwHeight = dxw.GetScreenHeight(); if(dxw.dwFlags4 & BILINEARFILTER){ @@ -2842,6 +2832,13 @@ static HRESULT WINAPI extCreateSurface(int dxversion, CreateSurface_Type pCreate lpDDSPrim = *lplpdds; dxw.MarkPrimarySurface(lpDDSPrim); + DDSURFACEDESC2 ddsdpix; + memset((void *)&ddsdpix, 0, sizeof(DDSURFACEDESC)); + ddsdpix.dwSize = sizeof(DDSURFACEDESC); + ddsdpix.dwFlags = DDSD_PIXELFORMAT; + (*pGetSurfaceDescMethod(lpDDSPrim))((LPDIRECTDRAWSURFACE2)lpDDSPrim, &ddsdpix); + GetHookInfo()->pfd=ddsdpix.ddpfPixelFormat; // v2.02.88 + if (BBCount){ // build emulated backbuffer surface res=BuildBackBuffer(lpdd, pCreateSurface, lpddsd, dxversion, &lpDDSBack, NULL); @@ -3525,6 +3522,7 @@ HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, if(dwtrans & DDBLTFAST_WAIT) flags = DDBLT_WAIT; if(dwtrans & DDBLTFAST_DESTCOLORKEY) flags |= DDBLT_KEYDEST; if(dwtrans & DDBLTFAST_SRCCOLORKEY) flags |= DDBLT_KEYSRC; + //if(dwtrans & DDBLTFAST_SRCCOLORKEY) flags |= DDBLT_COLORFILL; if ((dxw.dwFlags2 & FULLRECTBLT) && ToPrim){ return sBlt("BltFast", lpdds, NULL, lpddssrc, lpsrcrect, flags, NULL, FALSE); @@ -3542,16 +3540,23 @@ HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, else{ // does it EVER goes through here? NULL is not a valid rect value for BltFast call.... // yes, forced in FULLRECTBLT mode! - ddsd.dwSize=Set_dwSize_From_Surface(lpddssrc); - ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT; - ret=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); - if (ret){ - OutTraceE("BltFast: GetSurfaceDesc ERROR %x at %d\n", ret, __LINE__); - return 0; + // yes, when BltFast on DDBLTFAST_SRCCOLORKEY!! (Pax Corpus) + if(lpddssrc){ + ddsd.dwSize=Set_dwSize_From_Surface(lpddssrc); + ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT; + ret=lpddssrc->GetSurfaceDesc((LPDDSURFACEDESC)&ddsd); + if (ret){ + OutTraceE("BltFast: GetSurfaceDesc ERROR %x at %d\n", ret, __LINE__); + return 0; + } + destrect.right = destrect.left + ddsd.dwWidth; + destrect.bottom = destrect.top + ddsd.dwHeight; + ret=sBlt("BltFast", lpdds, &destrect, lpddssrc, NULL, flags, NULL, FALSE); + } + else{ + //ret=sBlt("BltFast", lpdds, NULL, lpddssrc, NULL, flags, NULL, FALSE); + ret=DD_OK; } - destrect.right = destrect.left + ddsd.dwWidth; - destrect.bottom = destrect.top + ddsd.dwHeight; - ret=sBlt("BltFast", lpdds, &destrect, lpddssrc, NULL, flags, NULL, FALSE); } return ret; @@ -3559,16 +3564,11 @@ HRESULT WINAPI extBltFast(LPDIRECTDRAWSURFACE lpdds, DWORD dwx, DWORD dwy, HRESULT WINAPI extWaitForVerticalBlank(LPDIRECTDRAW lpdd, DWORD dwflags, HANDLE hevent) { - static DWORD time = 0; - static BOOL step = 0; - DWORD tmp; - if(!(dxw.dwFlags1 & SAVELOAD)) return (*pWaitForVerticalBlank)(lpdd, dwflags, hevent); - tmp = (*pGetTickCount)(); - if((time - tmp) > 32) time = tmp; - (*pSleep)(time - tmp); - time += iRefreshDelays[step++]; - if(step >= iRefreshDelayCount) step=0; - return 0; + if(dxw.dwFlags1 & SAVELOAD){ + dxw.VSyncWait(); + return 0; + } + return (*pWaitForVerticalBlank)(lpdd, dwflags, hevent); } #define DDPCAPS_INITIALIZE_LEGACY 0x00000008l diff --git a/dll/dxemublt.cpp b/dll/dxemublt.cpp index a985cc0..75d83d3 100644 --- a/dll/dxemublt.cpp +++ b/dll/dxemublt.cpp @@ -261,7 +261,7 @@ 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-1; y ++){ // first h-1 lines .... + 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 ++){ diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 4615070..6ebab4e 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -93,7 +93,7 @@ static char *Flag4Names[32]={ }; static char *Flag5Names[32]={ - "DIABLOCHEAT", "", "", "", + "DIABLOTWEAK", "CLEARTARGET", "", "", "", "", "", "", "", "", "", "", "", "", "", "", @@ -106,8 +106,8 @@ static char *Flag5Names[32]={ static char *TFlagNames[32]={ "OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE", "OUTPROXYTRACE", "DXPROXED", "ASSERTDIALOG", "OUTIMPORTTABLE", - "OUTDEBUG", "OUTREGISTRY", "TRACEHOOKS", "", - "", "", "", "", + "OUTDEBUG", "OUTREGISTRY", "TRACEHOOKS", "OUTD3DTRACE", + "OUTDXWINTRACE", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", @@ -1515,10 +1515,31 @@ void HookInit(TARGETMAP *target, HWND hwnd) #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); + static ATOM aClass; + WNDCLASSEX WndClsEx; + HINSTANCE hinst=NULL; + hinst=GetModuleHandle(NULL); + WndClsEx.cbSize = sizeof(WNDCLASSEX); + WndClsEx.style = 0; + WndClsEx.lpfnWndProc = DefWindowProc; + WndClsEx.cbClsExtra = 0; + WndClsEx.cbWndExtra = 0; + WndClsEx.hIcon = LoadIcon(NULL, IDI_APPLICATION); + WndClsEx.hCursor = NULL; + WndClsEx.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); + //WndClsEx.hbrBackground = CreateSolidBrush(RGB(200,0,0)); + WndClsEx.lpszMenuName = NULL; + WndClsEx.lpszClassName = "dxwnd:desktop"; + WndClsEx.hInstance = hinst; + WndClsEx.hIconSm = LoadIcon(NULL, IDI_APPLICATION); + + aClass=RegisterClassEx(&WndClsEx); + + //HWND hParent = (*pGetDesktopWindow)(); + HWND hParent = GetDesktopWindow(); // not hooked yet ! + hDesktopWindow=CreateWindowEx(0, "dxwnd:desktop", "DxWnd Desktop", 0, 0, 0, 0, 0, hParent, NULL, hinst, NULL); if(hDesktopWindow){ + MoveWindow(hDesktopWindow, target->posx, target->posy, target->sizx, target->sizy, TRUE); OutTraceDW("created desktop emulation: hwnd=%x\n", hDesktopWindow); } else{ @@ -1555,6 +1576,7 @@ void HookInit(TARGETMAP *target, HWND hwnd) 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); + dxw.DumpDesktopStatus(); } if (SKIPIMEWINDOW) { @@ -1575,7 +1597,7 @@ void HookInit(TARGETMAP *target, HWND hwnd) #ifdef CREATEDESKTOP if(CREATEDESKTOP){ if (hDesktopWindow){ - OutTraceDW("HookInit: set new parent=%x\n", hDesktopWindow); + OutTraceDW("HookInit: set new parent=%x to main win=%x\n", hDesktopWindow, dxw.hChildWnd); SetParent(dxw.hChildWnd, hDesktopWindow); dxw.hParentWnd = hDesktopWindow; } diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 1688fe5..2bbc3dd 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -45,6 +45,10 @@ dxwCore::dxwCore() MustShowOverlay=FALSE; TimerEvent.dwTimerType = TIMER_TYPE_NONE; WinDBInit(); + // initialization of default vsync emulation array + iRefreshDelays[0]=16; + iRefreshDelays[1]=17; + iRefreshDelayCount=2; } dxwCore::~dxwCore() @@ -140,6 +144,53 @@ void dxwCore::SetScreenSize(int x, int y) } } +void dxwCore::DumpDesktopStatus() +{ + HDC hDC; + HWND hDesktop; + RECT desktop; + PIXELFORMATDESCRIPTOR pfd; + int iPixelFormat, iBPP; + char ColorMask[65]; // are there 64BPP cards? I bet no.... + + // get the current pixel format index + hDesktop = GetDesktopWindow(); + hDC = GetDC(hDesktop); + ::GetWindowRect(hDesktop, &desktop); + iBPP = GetDeviceCaps(hDC, BITSPIXEL); + iPixelFormat = GetPixelFormat(hDC); + if(!iPixelFormat) iPixelFormat=1; // why returns 0??? + // obtain a detailed description of that pixel format + if(!DescribePixelFormat(hDC, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd)){ + OutTrace("DescribePixelFormat ERROR: err=%d\n", GetLastError()); + return; + } + memset(ColorMask, ' ', 64); // blank fill + ColorMask[64] = 0; // terminate + for (int i=pfd.cRedShift; i 100)) return; + + gdwRefreshRate = RefreshRate; + if(!gdwRefreshRate) return; + iRefreshDelayCount=0; + Reminder=0; + do{ + iRefreshDelays[iRefreshDelayCount]=(1000+Reminder)/gdwRefreshRate; + Reminder=(1000+Reminder)-(iRefreshDelays[iRefreshDelayCount]*gdwRefreshRate); + iRefreshDelayCount++; + } while(Reminder && (iRefreshDelayCount 32) time = tmp; + (*pSleep)(time - tmp); + time += iRefreshDelays[step++]; + if(step >= iRefreshDelayCount) step=0; +} + + static float fMul[17]={2.14F, 1.95F, 1.77F, 1.61F, 1.46F, 1.33F, 1.21F, 1.10F, 1.00F, 0.91F, 0.83F, 0.75F, 0.68F, 0.62F, 0.56F, 0.51F, 0.46F}; //static float fMul[17]={0.46F, 0.51F, 0.56F, 0.62F, 0.68F, 0.75F, 0.83F, 0.91F, 1.00F, 1.10F, 1.21F, 1.33F, 1.46F, 1.61F, 1.77F, 1.95F, 2.14F}; @@ -1045,7 +1131,7 @@ void dxwCore::GetSystemTimeAsFileTime(LPFILETIME lpSystemTimeAsFileTime) static DWORD dwStartTick=0; static DWORD dwUpdateTick=0; static FILETIME StartFileTime; - extern DXWNDSTATUS *pStatus; +// extern DXWNDSTATUS *pStatus; if(dwStartTick==0) { SYSTEMTIME StartingTime; @@ -1080,7 +1166,7 @@ void dxwCore::GetSystemTime(LPSYSTEMTIME lpSystemTime) static DWORD dwStartTick=0; static DWORD dwUpdateTick=0; static FILETIME StartFileTime; - extern DXWNDSTATUS *pStatus; +// extern DXWNDSTATUS *pStatus; if(dwStartTick==0) { SYSTEMTIME StartingTime; @@ -1109,16 +1195,27 @@ void dxwCore::GetSystemTime(LPSYSTEMTIME lpSystemTime) void dxwCore::ShowOverlay() { - if (MustShowOverlay) this->ShowOverlay(GetDC(hWnd)); + if (MustShowOverlay) { + RECT rect; + (*pGetClientRect)(hWnd, &rect); + this->ShowOverlay(GetDC(hWnd), rect.right, rect.bottom); + } } void dxwCore::ShowOverlay(LPDIRECTDRAWSURFACE lpdds) { - HDC hdc; // the working dc if (MustShowOverlay) { + HDC hdc; // the working dc + int h, w; if(!lpdds) return; if (FAILED(lpdds->GetDC(&hdc))) return; - this->ShowOverlay(hdc); + w = this->GetScreenWidth(); + h = this->GetScreenHeight(); + if(this->dwFlags4 & BILINEARFILTER) { + w <<=1; + h <<=1; + } + this->ShowOverlay(hdc, w, h); lpdds->ReleaseDC(hdc); } } @@ -1126,28 +1223,23 @@ void dxwCore::ShowOverlay(LPDIRECTDRAWSURFACE lpdds) void dxwCore::ShowOverlay(HDC hdc) { if(!hdc) return; - if (dwFlags2 & SHOWFPSOVERLAY) ShowFPS(hdc); - if (dwFlags4 & SHOWTIMESTRETCH) ShowTimeStretching(hdc); + RECT rect; + (*pGetClientRect)(hWnd, &rect); + this->ShowOverlay(GetDC(hWnd), rect.right, rect.bottom); } -//void dxwCore::ShowFPS() -//{ -// this->ShowFPS(GetDC(hWnd)); -//} -// -//void dxwCore::ShowFPS(LPDIRECTDRAWSURFACE lpdds) -//{ -// HDC hdc; // the working dc -// if (FAILED(lpdds->GetDC(&hdc))) return; -// this->ShowFPS(hdc); -// lpdds->ReleaseDC(hdc); -//} +void dxwCore::ShowOverlay(HDC hdc, int w, int h) +{ + if(!hdc) return; + if (dwFlags2 & SHOWFPSOVERLAY) ShowFPS(hdc, w, h); + if (dwFlags4 & SHOWTIMESTRETCH) ShowTimeStretching(hdc, w, h); +} // nasty global to ensure that the corner is picked semi-random, but never overlapped // between FPS and TimeStretch (and, as a side effect, never twice the same!) static int LastCorner; -void dxwCore::ShowFPS(HDC xdc) +void dxwCore::ShowFPS(HDC xdc, int w, int h) { char sBuf[81]; static DWORD dwTimer = 0; @@ -1156,18 +1248,23 @@ void dxwCore::ShowFPS(HDC xdc) static DWORD color; if((*pGetTickCount)()-dwTimer > 6000){ - RECT rect; dwTimer = (*pGetTickCount)(); corner = dwTimer % 4; if(corner==LastCorner) corner = (corner+1) % 4; LastCorner = corner; color=0xFF0000; // blue - (*pGetClientRect)(hWnd, &rect); + //(*pGetClientRect)(hWnd, &rect); + //switch (corner) { + //case 0: x=10; y=10; break; + //case 1: x=rect.right-60; y=10; break; + //case 2: x=rect.right-60; y=rect.bottom-20; break; + //case 3: x=10; y=rect.bottom-20; break; + //} switch (corner) { case 0: x=10; y=10; break; - case 1: x=rect.right-60; y=10; break; - case 2: x=rect.right-60; y=rect.bottom-20; break; - case 3: x=10; y=rect.bottom-20; break; + case 1: x=w-60; y=10; break; + case 2: x=w-60; y=h-20; break; + case 3: x=10; y=h-20; break; } } @@ -1178,27 +1275,7 @@ void dxwCore::ShowFPS(HDC xdc) TextOut(xdc, x, y, sBuf, strlen(sBuf)); } -//void dxwCore::ShowTimeStretching() -//{ -// HDC hdc; -// hdc=GetDC(hWnd); -// if(hdc)this->ShowTimeStretching(hdc); -//} -// -//void dxwCore::ShowTimeStretching(LPDIRECTDRAWSURFACE lpdds) -//{ -// HDC hdc; // the working dc -// __try { -// if (FAILED(lpdds->GetDC(&hdc))) return; -// } -// __except(EXCEPTION_EXECUTE_HANDLER){ -// return; -// } -// if(hdc)this->ShowTimeStretching(hdc); -// lpdds->ReleaseDC(hdc); -//} - -void dxwCore::ShowTimeStretching(HDC xdc) +void dxwCore::ShowTimeStretching(HDC xdc, int w, int h) { char sBuf[81]; static DWORD dwTimer = 0; @@ -1208,7 +1285,6 @@ void dxwCore::ShowTimeStretching(HDC xdc) static int LastTimeShift = 1000; // any initial number different from -8 .. +8 if((*pGetTickCount)()-dwTimer > 4000){ - RECT rect; if(LastTimeShift==TimeShift) return; // after a while, stop the show dwTimer = (*pGetTickCount)(); LastTimeShift=TimeShift; @@ -1216,12 +1292,17 @@ void dxwCore::ShowTimeStretching(HDC xdc) if(corner==LastCorner) corner = (corner+1) % 4; LastCorner = corner; color=0x0000FF; // red - (*pGetClientRect)(hWnd, &rect); + //(*pGetClientRect)(hWnd, &rect); + //switch (corner) { + //case 0: x=10; y=10; break; + //case 1: x=rect.right-60; y=10; break; + //case 2: x=rect.right-60; y=rect.bottom-20; break; + //case 3: x=10; y=rect.bottom-20; break; switch (corner) { case 0: x=10; y=10; break; - case 1: x=rect.right-60; y=10; break; - case 2: x=rect.right-60; y=rect.bottom-20; break; - case 3: x=10; y=rect.bottom-20; break; + case 1: x=w-60; y=10; break; + case 2: x=w-60; y=h-20; break; + case 3: x=10; y=h-20; break; } } diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index fef7be7..95bc51d 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -92,6 +92,7 @@ public: // methods LARGE_INTEGER dxwCore::StretchCounter(LARGE_INTEGER); void ShowOverlay(); void ShowOverlay(HDC); + void ShowOverlay(HDC, int, int); void ShowOverlay(LPDIRECTDRAWSURFACE); char *GetTSCaption(void); char *GetTSCaption(int); @@ -119,6 +120,9 @@ public: // methods LARGE_INTEGER StretchLargeCounter(LARGE_INTEGER); UINT MapKeysConfig(UINT, LPARAM, WPARAM); void MapKeysInit(); + void SetVSyncDelays(UINT); + void VSyncWait(); + void DumpDesktopStatus(); public: // simple data variables BOOL Windowize; @@ -170,9 +174,13 @@ private: void UnmarkPrimarySurface(LPDIRECTDRAWSURFACE); void UnmarkBackBufferSurface(LPDIRECTDRAWSURFACE); BOOL MustShowOverlay; - void ShowFPS(HDC); - void ShowTimeStretching(HDC); + void ShowFPS(HDC, int, int); + void ShowTimeStretching(HDC, int, int); TimerEvent_Type TimerEvent; + DWORD gdwRefreshRate; + #define MAXREFRESHDELAYCOUNT 20 + int iRefreshDelays[MAXREFRESHDELAYCOUNT]; + int iRefreshDelayCount; }; extern dxwCore dxw; diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index c00f7ca..fb3db93 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.87" +#define VERSION "2.02.88" #define DDTHREADLOCK 1 @@ -93,6 +93,7 @@ int SetTarget(TARGETMAP *targets){ pStatus->TaskIdx=0; pStatus->hWnd=NULL; pStatus->ColorDepth=0; + memset((void *)&(pStatus->pfd), 0, sizeof(DDPIXELFORMAT)); pStatus->Height = pStatus->Width = 0; pStatus->DXVersion = 0; for(i = 0; targets[i].path[0]; i ++){ @@ -207,6 +208,7 @@ LRESULT CALLBACK HookProc(int ncode, WPARAM wparam, LPARAM lparam) pStatus->dwPid=GetProcessId(GetCurrentProcess()); pStatus->TimeShift=pMapping[i].InitTS; pStatus->CursorX = pStatus->CursorY = 0; + memset((void *)&(pStatus->pfd), 0, sizeof(DDPIXELFORMAT)); DxWndStatus = *pStatus; HookInit(&pMapping[i], hwnd); } diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 79d498c84579d557fc557ed84a7582033d0ed8d7..641653df840d365dde476b07078a7e93cc7e456a 100644 GIT binary patch delta 21417 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, pPresParam->BackBufferHeight); + dxw.SetVSyncDelays(mode.RefreshRate); GetHookInfo()->IsFullScreen = dxw.IsFullScreen(); GetHookInfo()->DXVersion=(short)dwD3DVersion; @@ -742,6 +743,7 @@ HRESULT WINAPI extPresent(void *pd3dd, CONST RECT *pSourceRect, CONST RECT *pDes OutTraceB("Present\n"); // frame counter handling.... if (dxw.HandleFPS()) return D3D_OK; + if (dxw.dwFlags1 & SAVELOAD) dxw.VSyncWait(); // proxy .... res=(*pPresent)(pd3dd, pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion); dxw.ShowOverlay(); @@ -763,6 +765,7 @@ HRESULT WINAPI extGetDisplayMode8(void *lpd3d, D3DDISPLAYMODE *pMode) pMode->Height = dxw.GetScreenHeight(); } OutTraceD3D("GetDisplayMode(8): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); + dxw.SetVSyncDelays(pMode->RefreshRate); return res; } @@ -781,6 +784,7 @@ HRESULT WINAPI extGetDisplayMode9(void *lpd3d, UINT iSwapChain, D3DDISPLAYMODE * pMode->Height = dxw.GetScreenHeight(); } OutTraceD3D("GetDisplayMode(9): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); + dxw.SetVSyncDelays(pMode->RefreshRate); return res; } @@ -817,6 +821,7 @@ HRESULT WINAPI extGetAdapterDisplayMode8(void *lpd3d, UINT Adapter, D3DDISPLAYMO pMode->Height = dxw.GetScreenHeight(); } OutTraceD3D("GetAdapterDisplayMode(8): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); + dxw.SetVSyncDelays(pMode->RefreshRate); return res; } @@ -835,6 +840,7 @@ HRESULT WINAPI extGetAdapterDisplayMode9(void *lpd3d, UINT Adapter, D3DDISPLAYMO pMode->Height = dxw.GetScreenHeight(); } OutTraceD3D("GetAdapterDisplayMode(9): fixed size=(%dx%d)\n", pMode->Width, pMode->Height); + dxw.SetVSyncDelays(pMode->RefreshRate); return res; } @@ -967,6 +973,8 @@ HRESULT WINAPI extCreateDevice(void *lpd3d, UINT adapter, D3DDEVTYPE devicetype, HookD3DDevice9(ppd3dd); } + dxw.SetVSyncDelays(mode.RefreshRate); + GetHookInfo()->IsFullScreen = dxw.IsFullScreen(); GetHookInfo()->DXVersion=(short)dwD3DVersion; GetHookInfo()->Height=(short)dxw.GetScreenHeight(); @@ -1049,6 +1057,8 @@ HRESULT WINAPI extCreateDeviceEx(void *lpd3d, UINT adapter, D3DDEVTYPE devicetyp HookD3DDevice9(ppd3dd); + dxw.SetVSyncDelays(mode.RefreshRate); + GetHookInfo()->IsFullScreen = dxw.IsFullScreen(); GetHookInfo()->DXVersion=(short)dwD3DVersion; GetHookInfo()->Height=(short)dxw.GetScreenHeight(); @@ -1182,6 +1192,7 @@ HRESULT WINAPI extCreateAdditionalSwapChain(void *lpd3dd, D3DPRESENT_PARAMETERS } (dwD3DVersion == 9) ? HookD3DDevice9(&lpd3dd) : HookD3DDevice8(&lpd3dd); + dxw.SetVSyncDelays(mode.RefreshRate); return res; } diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index f50e670..5a95757 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -863,7 +863,7 @@ HRESULT WINAPI extBeginScene2(void *d3dd) { HRESULT res; OutTraceD3D("BeginScene(2): d3dd=%x\n", d3dd); - if(dxw.dwFlags4 & ZBUFFERCLEAN){ + if((dxw.dwFlags4 & ZBUFFERCLEAN) || (dxw.dwFlags5 & CLEARTARGET)){ HRESULT res2; LPDIRECT3DVIEWPORT2 vp; D3DVIEWPORT vpd; @@ -877,7 +877,8 @@ HRESULT WINAPI extBeginScene2(void *d3dd) d3dRect.x2 = vpd.dwX + vpd.dwWidth; d3dRect.y2 = vpd.dwY + vpd.dwHeight; OutTraceD3D("d3dRect=(%d,%d)-(%d,%d)\n", d3dRect.x1, d3dRect.y1, d3dRect.x2, d3dRect.y2); - vp->Clear(1, &d3dRect, D3DCLEAR_ZBUFFER); + if(dxw.dwFlags4 & ZBUFFERCLEAN) vp->Clear(1, &d3dRect, D3DCLEAR_ZBUFFER); + if(dxw.dwFlags5 & CLEARTARGET) vp->Clear(1, &d3dRect, D3DCLEAR_TARGET); } } res=(*pBeginScene2)(d3dd); @@ -889,7 +890,7 @@ HRESULT WINAPI extBeginScene3(void *d3dd) { HRESULT res; OutTraceD3D("BeginScene(3): d3dd=%x\n", d3dd); - if(dxw.dwFlags4 & (ZBUFFERCLEAN|ZBUFFER0CLEAN)){ + if((dxw.dwFlags4 & (ZBUFFERCLEAN|ZBUFFER0CLEAN)) || (dxw.dwFlags5 & CLEARTARGET)){ HRESULT res2; LPDIRECT3DVIEWPORT3 vp; D3DVIEWPORT vpd; @@ -905,6 +906,7 @@ HRESULT WINAPI extBeginScene3(void *d3dd) OutTraceD3D("d3dRect=(%d,%d)-(%d,%d)\n", d3dRect.x1, d3dRect.y1, d3dRect.x2, d3dRect.y2); if(dxw.dwFlags4 & ZBUFFERCLEAN )vp->Clear2(1, &d3dRect, D3DCLEAR_ZBUFFER, 0, 1.0, 0); if(dxw.dwFlags4 & ZBUFFER0CLEAN)vp->Clear2(1, &d3dRect, D3DCLEAR_ZBUFFER, 0, 0.0, 0); + if(dxw.dwFlags5 & CLEARTARGET) vp->Clear(1, &d3dRect, D3DCLEAR_TARGET); } } res=(*pBeginScene3)(d3dd); diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index a3c7041..b46e976 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -10,8 +10,11 @@ //#undef IsTraceDW //#define IsTraceDW TRUE +BOOL WINAPI extCheckRemoteDebuggerPresent(HANDLE, PBOOL); + static HookEntry_Type Hooks[]={ {HOOK_IAT_CANDIDATE, "IsDebuggerPresent", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)extIsDebuggerPresent}, + {HOOK_IAT_CANDIDATE, "CheckRemoteDebuggerPresent", (FARPROC)NULL, (FARPROC *)NULL, (FARPROC)extCheckRemoteDebuggerPresent}, {HOOK_IAT_CANDIDATE, "GetProcAddress", (FARPROC)GetProcAddress, (FARPROC *)&pGetProcAddress, (FARPROC)extGetProcAddress}, {HOOK_IAT_CANDIDATE, "LoadLibraryA", (FARPROC)LoadLibraryA, (FARPROC *)&pLoadLibraryA, (FARPROC)extLoadLibraryA}, {HOOK_IAT_CANDIDATE, "LoadLibraryExA", (FARPROC)LoadLibraryExA, (FARPROC *)&pLoadLibraryExA, (FARPROC)extLoadLibraryExA}, @@ -628,7 +631,7 @@ DWORD WINAPI extGetLogicalDrives(void) DevBit = 0x1 << i; if(DevMask & DevBit){ char RootPathName[10]; - sprintf(RootPathName, "%c:\\", 'A'+i); + sprintf_s(RootPathName, 4, "%c:\\", 'A'+i); Vol = GetVolumeInformation(RootPathName, NULL, NULL, NULL, 0, 0, 0, 0); OutTrace("Vol=%s status=%x\n", RootPathName, Vol); if(!Vol) DevMask &= ~DevBit; @@ -722,3 +725,12 @@ BOOL WINAPI extCreateProcessA( OutTraceDW("CreateProcess: SUPPRESS ApplicationName=%s CommandLine=\"%s\"\n", lpApplicationName, lpCommandLine); return TRUE; } + +BOOL WINAPI extCheckRemoteDebuggerPresent(HANDLE hProcess, PBOOL pbDebuggerPresent) +{ + BOOL ret; + if(pbDebuggerPresent) *pbDebuggerPresent = FALSE; + ret= (hProcess==(HANDLE)0xFFFFFFFF) ? FALSE : TRUE; + OutTraceDW("CheckRemoteDebuggerPresent: hProcess=%x ret=%x\n", hProcess, ret); + return ret; +} diff --git a/host/DesktopDialog.cpp b/host/DesktopDialog.cpp new file mode 100644 index 0000000..88aa340 --- /dev/null +++ b/host/DesktopDialog.cpp @@ -0,0 +1,103 @@ +// DesktopDialog.cpp : implementation file +// + +#include "stdafx.h" +#include "dxwndhost.h" +#include "DesktopDialog.h" + +// CDesktopDialog dialog + +IMPLEMENT_DYNAMIC(CDesktopDialog, CDialog) + +CDesktopDialog::CDesktopDialog(CWnd* pParent /*=NULL*/) + : CDialog(CDesktopDialog::IDD, pParent) +{ +} + +CDesktopDialog::~CDesktopDialog() +{ +} + +void CDesktopDialog::DoDataExchange(CDataExchange* pDX) +{ + CDialog::DoDataExchange(pDX); +} + + +BEGIN_MESSAGE_MAP(CDesktopDialog, CDialog) + ON_WM_TIMER() +END_MESSAGE_MAP() + +#define IDDesktopTIMER 2 + +// CDesktopDialog message handlers + +void CDesktopDialog::OnTimer(UINT_PTR nIDEvent) +{ + char sMsg[1024]; + + CDialog::OnTimer(nIDEvent); + + RECT desktop; + HDC hDC; + // Get a handle to the desktop window + const CWnd *hDesktop = GetDesktopWindow(); + // Get the size of screen to the variable desktop + hDesktop->GetWindowRect(&desktop); + // The top left corner will have coordinates (0,0) + // and the bottom right corner will have coordinates + // (horizontal, vertical) + hDC = ::GetDC(::GetDesktopWindow()); + int iBPP = GetDeviceCaps(hDC, BITSPIXEL); + + PIXELFORMATDESCRIPTOR pfd; + int iPixelFormat; + // get the current pixel format index + iPixelFormat = ::GetPixelFormat(hDC); + if(!iPixelFormat) iPixelFormat=1; // why returns 0??? + if(iPixelFormat){ + // obtain a detailed description of that pixel format + ::DescribePixelFormat(hDC, iPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); + sprintf_s(sMsg, 1024, + "Desktop size (W x H)=(%d x %d)\n" + "Color depth = %d (color bits = %d)\n" + "Pixel format = %d\n" + "Color bits (RGBA)=(%d,%d,%d,%d)\n" + "Color shift (RGBA)=(%d,%d,%d,%d)\n" + , + desktop.right, desktop.bottom, + iBPP, pfd.cColorBits, + iPixelFormat, + pfd.cRedBits, pfd.cGreenBits, pfd.cBlueBits, pfd.cAlphaBits, + pfd.cRedShift, pfd.cGreenShift, pfd.cBlueShift, pfd.cAlphaShift + ); + } + else{ + sprintf_s(sMsg, 1024, "error %d", GetLastError()); + } + + + this->SetDlgItemTextA(IDC_DESKTOPINFO, sMsg); +} + +BOOL CDesktopDialog::OnInitDialog() +{ + CDialog::OnInitDialog(); + + SetTimer(IDDesktopTIMER, 1000, NULL); + + // TODO: Add extra initialization here + + return TRUE; // return TRUE unless you set the focus to a control + // EXCEPTION: OCX Property Pages should return FALSE +} + +void CDesktopDialog::OnOK() +{ + // TODO: Add your specialized code here and/or call the base class + + KillTimer(IDDesktopTIMER); + // stop timer + + CDialog::OnOK(); +} diff --git a/host/DesktopDialog.h b/host/DesktopDialog.h new file mode 100644 index 0000000..ca15fd3 --- /dev/null +++ b/host/DesktopDialog.h @@ -0,0 +1,27 @@ +#pragma once + + +// CDesktopDialog dialog + +class CDesktopDialog : public CDialog +{ + DECLARE_DYNAMIC(CDesktopDialog) + +public: + CDesktopDialog(CWnd* pParent = NULL); // standard constructor + virtual ~CDesktopDialog(); + + // Dialog Data + enum { IDD = IDD_DESKTOP }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnTimer(UINT_PTR nIDEvent); +public: + virtual BOOL OnInitDialog(); +protected: + virtual void OnOK(); +}; diff --git a/host/Resource.h b/host/Resource.h index e67e1891ffb659bca04e19bd9bbc91c57f221e91..3c5d6d151bf118b98462b5aed8461a9e920b882c 100644 GIT binary patch delta 170 zcmeBr#(3@-o3&zC#3nzn5u3cA QNMv$Ekflags2 & (SHOWFPS|SHOWFPSOVERLAY)){ - sprintf(sMsgBuf, "\nFPS = %d", DxWndStatus.FPSCount); - strcat(sMsg, sMsgBuf); + sprintf(sMsg2, "\nFPS = %d", DxWndStatus.FPSCount); + strcat(sMsg, sMsg2); } if(Target->flags2 & TIMESTRETCH){ if(DxWndStatus.TimeShift>=-8 && DxWndStatus.TimeShift<=8){ - sprintf(sMsgBuf, "\nTime speed %s", GetTSCaption(DxWndStatus.TimeShift)); - strcat(sMsg, sMsgBuf); + sprintf(sMsg2, "\nTime speed %s", GetTSCaption(DxWndStatus.TimeShift)); + strcat(sMsg, sMsg2); } } } diff --git a/host/TabCompat.cpp b/host/TabCompat.cpp index 9a3eb33..465a948 100644 --- a/host/TabCompat.cpp +++ b/host/TabCompat.cpp @@ -48,6 +48,7 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_NOTEXTURES, cTarget->m_NoTextures); DDX_Check(pDX, IDC_WIREFRAME, cTarget->m_WireFrame); DDX_Check(pDX, IDC_DISABLEFOGGING, cTarget->m_DisableFogging); + DDX_Check(pDX, IDC_CLEARTARGET, cTarget->m_ClearTarget); // Registry management DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 82be5c4..60538bf 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -40,7 +40,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_SuppressIME = FALSE; m_SuppressD3DExt = FALSE; m_SetCompatibility = TRUE; - m_DiabloTweak = TRUE; + m_DiabloTweak = FALSE; m_DisableHAL = FALSE; m_ForcesHEL = FALSE; m_ColorFix = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index d1a92a8..9a3111c 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -140,6 +140,7 @@ public: BOOL m_NoPower2Fix; BOOL m_NoPerfCounter; BOOL m_DisableFogging; + BOOL m_ClearTarget; BOOL m_SuppressIME; BOOL m_SetCompatibility; BOOL m_DiabloTweak; diff --git a/host/dxwnd.ini b/host/dxwnd.ini deleted file mode 100644 index 3608fe7..0000000 --- a/host/dxwnd.ini +++ /dev/null @@ -1,5 +0,0 @@ -[window] -posx=1213 -posy=261 -sizx=320 -sizy=200 diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 0934b42c33f50270356c5d561e858719955a8f10..564eb0c7fc0072a1742edc9455423e0516b7d70f 100644 GIT binary patch delta 11599 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 VkSU&qQ(cW+24AG$MWHdTzW_O_IhFtb delta 15872 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 delta 678 zcmaiyF=&%f5Xb+Qd`-z`k_MBeHnH}j25Gbv)25Yxg9WSk(ijCBD5cOuTeY=T(G0p( z5T_2-8=k0xWN?(gH)N=wg1ELrE5S)coD`%AqJ#AEl}HMT!#&>p@4a`wdw0(sHobY= zRL+L@X+US+Pal_$Xx8UYN#}*mFyGaKd^F;+GF@7<(}00)9K#H*VH)R9#2DhD^@<%v z%sO@aM?1gh()d@-uWk_etf~AxhqZC`<0W@L66iq^gS?a;;QW}zUyB}&t}MC}82n4* z_sSi2ANm?1;i}JCUClUoLG7`^>yC(|Dq9~m-tH1?z4FOJ`yA?i3zaJm+Guy2-0Ic< zwW+lf?UenO6dh2HOnRrfz4Sy%F$KSXIVq-qdAqQ>auYH2(xi4?bIvxK7{w4`{QO%h zk8AtATYg5a4s`Gqv z8mA>~{V$AUT)N&PgmHMGV=u1CToi=;vaE*8#}!P;oJ@*dQ>SHilIWM7#_AwJ6*6gb d$DGtQE2ri$p=M0#<-~VCyPPE(P%WOMLz}n7wLAa- diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 0ec922a24e072299ca5124331a1bd0eceb3b4f68..29f3b5b630526ef100ff45c59cffc9ce30a7df09 100644 GIT binary patch literal 66560 zcmeI52Y?hs_Qr=SqM)Fth_Fjm$xBXd0s%n~P!U%$2uPBwV!(VVo;jTX6%(ET4-@9B zcjlbVoIOwPyz|Zk|L@oRYNvL#r)PEnh5z~B+j{+Vbyw)BSFftWJpbJG?_IgN(ff%M z>6fUMShv1*qNc}Jm0rbdZu&dBc*iC35G!dE#IYO?` zOlU5&6gmp6gw{eEVRvB2sd{ZHLp&j`Bzmc}F0oVm>0R8_(AxFp+IJUXM zmrQ3nwg1D>|FI+30Qx_iZv$Na#};4%Qu{wP0UJR7FA(wt≈ek$??g8yn#Fe>iLa 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∾bGws;Zfl+;c?*!fjW3fA#16u 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 + + @@ -454,6 +458,10 @@ RelativePath=".\cdib.h" > + + @@ -547,6 +555,10 @@ RelativePath=".\res\bigicons.bmp" > + + diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 74b5d41..8fcf403 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -12,6 +12,7 @@ #include "TargetDlg.h" #include "SystemTray.h" #include "StatusDialog.h" +#include "DesktopDialog.h" #include "PaletteDialog.h" #include "TimeSliderDialog.h" @@ -63,6 +64,7 @@ BEGIN_MESSAGE_MAP(CDxwndhostView, CListView) ON_COMMAND(ID_RUN, OnRun) ON_COMMAND(ID_TRAY_RESTORE, OnTrayRestore) ON_COMMAND(ID_VIEW_STATUS, OnViewStatus) + ON_COMMAND(ID_VIEW_DESKTOP, OnViewDesktop) ON_COMMAND(ID_VIEW_PALETTE, OnViewPalette) ON_COMMAND(ID_VIEW_TIMESLIDER, OnViewTimeSlider) ON_COMMAND(ID_DESKTOPCOLORDEPTH_8BPP, OnDesktopcolordepth8bpp) @@ -177,6 +179,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_NoPower2Fix) t->flags4 |= NOPOWER2FIX; if(dlg->m_NoPerfCounter) t->flags4 |= NOPERFCOUNTER; if(dlg->m_DisableFogging) t->flags4 |= DISABLEFOGGING; + if(dlg->m_ClearTarget) t->flags5 |= CLEARTARGET; if(dlg->m_SuppressIME) t->flags2 |= SUPPRESSIME; if(dlg->m_SuppressD3DExt) t->flags3 |= SUPPRESSD3DEXT; if(dlg->m_SetCompatibility) t->flags2 |= SETCOMPATIBILITY; @@ -375,6 +378,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_NoPower2Fix = t->flags4 & NOPOWER2FIX ? 1 : 0; dlg->m_NoPerfCounter = t->flags4 & NOPERFCOUNTER ? 1 : 0; dlg->m_DisableFogging = t->flags4 & DISABLEFOGGING ? 1 : 0; + dlg->m_ClearTarget = t->flags5 & CLEARTARGET ? 1 : 0; dlg->m_SaveLoad = t->flags & SAVELOAD ? 1 : 0; dlg->m_SlowDown = t->flags & SLOWDOWN ? 1 : 0; dlg->m_BlitFromBackBuffer = t->flags & BLITFROMBACKBUFFER ? 1 : 0; @@ -1462,6 +1466,13 @@ void CDxwndhostView::OnViewStatus() pDlg->ShowWindow(SW_SHOW); } +void CDxwndhostView::OnViewDesktop() +{ + CDesktopDialog *pDlg = new CDesktopDialog(); + BOOL ret = pDlg->Create(CDesktopDialog::IDD, this); + pDlg->ShowWindow(SW_SHOW); +} + void CDxwndhostView::OnViewPalette() { CPaletteDialog *pDlg = new CPaletteDialog(); diff --git a/host/dxwndhostView.h b/host/dxwndhostView.h index c7ee42c..136a3b6 100644 --- a/host/dxwndhostView.h +++ b/host/dxwndhostView.h @@ -83,6 +83,7 @@ protected: afx_msg void OnHookStop(); afx_msg void OnTrayRestore(); afx_msg void OnViewStatus(); + afx_msg void OnViewDesktop(); afx_msg void OnViewPalette(); afx_msg void OnViewTimeSlider(); afx_msg void OnExit(); diff --git a/host/res/bigicons.bmp b/host/res/bigicons.bmp index 66dd6f42e868899755a47ef86bca6b7caff3043f..eb32d6114a881b87aa0a612258f1f7efd06c1b3f 100644 GIT binary patch literal 5174 zcmeI!F^(KJ5QX6~AYc_L&;c0w1d0pJ4PBv*Qb(!4@Hr~>85Hmcie(t9pTq4ba<<2b zrNGkk>^H^UH?!4bvw{8X_Yd#oa(s9r@+%`p!!PodcaC?nyngrjVfV{-#ydmFOvz6v zpa1%kKcp}av_PVZsGxy?8XSQ{7coJDf)jHD68)ubqbdxJK%$EG9DzjVA_WZ! zgCmgWBK$~iP#7G6L>Cn^f_&9RE5D2Nc6cR)~E`DBarBG zxx7&o21g*#=Tb(aDh!T5qR(Z{MpYObfkeOD0_}~eFgOB0w1B>LPY*{BMGBarBq zE#$pX6$VEj(IuIGN`u1S2#i;sTdOsy!r%xb`rLNfs0xE4kmz$uTB9lqjzFT%?dpxH zFgOB0w1B>LRu*{BMGBjoen&+-SKbN-&l^W{gLpT`Ki#;ewf&d#{M!EGd46;s zJAa?wI``u$)=#W+KdxfWtM@V5^Xh$!_WbBtb1+dG%aJl~>Po zRC)DWN0qN#Yh3x-wZ=2QclXDYj8ELV`{PPxUL9{oGp~-fqnWRB-p7yrkM)1-zxA2l z$KT@l8#`=&>W;JV*T-@14pe^o+|TpMZ=d^lUir~+ua)n!KF%tC^gmmHTAzPk|MMMi zeEZ%G*z?!@_x$x0?D>A@$Jw4A_q^(!|F`~Q1=gqF_W#3~uf5mqbA?3e8qU98YjB>| c8l30fv;Q%N(fM|6BOAxee%yS{@@ISh3L$!q$N&HU literal 9270 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 delta 640 zcmZpe!PIbrae@Y~Gy?-e1rURP@Mb}o)6C2d7(Q$kWO>g#S%HO*Q3A#k;AI3V0b`Ec ze;F6^N-#36n9L_BAz~h1T$CJ>lb@WJlNytp7sH_I=`wkOmFeVsNiIeZ%VzR6-nC$s zy$nOXf~B58Oqg>_Vo6SJ8c<(mk`eS}&KAus?t4d{dG%#%b|L|K4h7El=w#SFx( zK-uTajBJ|)RsJ(il3-!tXP)RN#>llD>zM0453o~Q!WJU`SM)S>L z7Fvuzw>Vmgg1rFp7CXC=g082662x=YEO&xs96}getYTa$!t+vM%8cR-jN&cOgT^|A zfC2`ff|QDKBoijD=aG^uElw@cEl9>HD{fUBpPZ+cmz>1F4fG^G(5GjaKwf5GPz8nw zC|In3Vx~aa2^0!QfPJE4#3UOQHjum%GcZ`bF)wle1-1mPz@99_GYJ?N>v>9;E^%&F v&Ard0Dg!jI4`d4zNCIh3pn>K<8Wam6K)iahrpI+=Mj>Db{}*4ZpuzzF*^Qw6 diff --git a/locale/cn/Resources_Cn.rc b/locale/cn/Resources_Cn.rc index c95d8534f63341e4c199f9586eb424a0e9bd27e8..b36a6a7e0ad23913fb36246e4a4107e369915425 100644 GIT binary patch delta 371 zcmZ4Un`PT4mJMuTlNAJISbQ>)rcVxF*PC1*FTn1?;K~rp;61sJQ+V>d4_uoC#FSRE z8!?zM=rCALb_}wfTyn69-I&1w&bK&J#cs%80_B@;{&0wmdGdnoTGKD^G4j}#FeEY* zF{Cr3GL$eVFqAQ50$Jq@1q}H>(GmtFpe|1a7Y1jBcp&xxTJ6XX#1H}|-GRK2$%(5X z*$qHuGnh?goTWMW#5capO2>+%CKtqV@Iu`R)Zot$Fj?`K;^bRK=Qu&$*;d4upfowq zCUtUviPdB?AHK=cOk5_{J>Rg|<>4)f$q!zNplN>iB6#wG*J~yVh;eP!_@%})`M__E z>9@2QTPFMc*|7bEKI0;`$=ftGZ2tGhMSJoOMxp5+tQa*We_~Xdo?yc$HC;#_C{$p} d$TK}kgYm@nCUeFJrpa8)^QMdGGxC8XYyjFFb*2CS delta 780 zcmdn?iDk`imJMuTo9o1MRx=wjm`pA_WIy@M!6s%C1~VXgC!^71!_~H%GY+#cPyW|0 zH(Bl%-{z|0MN*UXG&gLX_2ibsQOK(9Hom|Ge$m^0`Aonpwq%fQ8;%uv8k1Pr2dhFl=2z>v(4&yd293bd{OESd@o zI7CUWeT505#zZEAdV8Sv>>2!l*b|78fjAn7LC_J1LE_;+Yz)My zKn#O13{-+?)G`Q%IS}teO#a9y$(;j?u`FPa8Q`34-74c4?#Wyg+LJ4 kkLf_N28cmnkpmY=hlX}4(1;XZqD-62$h>^|8w*A+0Qk?Z2><{9 diff --git a/locale/cn/Resources_Cn.suo b/locale/cn/Resources_Cn.suo index 6bed9dea171325698fe243db608179fc0a1cf74d..cd88731ff75b385cc75aba53662e90c0ef24b743 100644 GIT binary patch delta 380 zcmZp$X|UPg!@?*!S&>DaO`xH=cJ`LZMJ$(i#2FYExPkaT5KO+vqB6OGgJp6BYXAo? zvY>+i%jO@f983c5<9hX0*48=o-dLQ>x8z6V%me%4i%`g94+)FO4Z<#9OGHq#2p2Jd9c;OIf!Jck$%naZCpSnO;o$=+ t;zw3kA{oHQBL);DaZGm%l(VA70i&!r4@G~$lumJIYAeelSMP+gW2g~FN)&LGc zWI+c3md!s{IhX`yL?-75OyO~Fu2(TXB*)`Cxsk(QvIEBoM)S!JWaKw) zBkL~V@}GQ|+i>z1t^giZpaeUzWCPIX3T_`}9#N<$+$CT5LMESJ(V1MrAHc%_l;lFv zw)qSH1tuOb3@t(-970ISCYJ~Y@Q4EiM34kGe-SQX0z24p^8&HOjFS)Z*-mbdI5PPN tx54HT$pA(kUZ83wBps8#Ncrm;hi3h`#^; diff --git a/locale/en/Resources_EN.rc b/locale/en/Resources_EN.rc index e90125b8e1ee4c3fb34d244e6acd3e3f1fe00832..71c03cf793b75a4c1b6dd434095b5bf91e750707 100644 GIT binary patch delta 448 zcmZusPbkA-7=FL~Z2Rqt-}tqDMbgYcW{1r-VT)-)*k++Dsf{Lyva~q3IBN%b58pw_ zK~4^eQ|amD2Qeib#(V_Z{EZp!hL?cT;yJ*8@l z-KspD*wW!s*v|b^`*WlP&k7L?6ta>V+VH$^A-TXKrjOs9k4u<5wd28w99#q|WMC2& zVFsoJv%(V03bqVsSP<6?*uVk(5P~2iM2Cg*ZWtEMzpzhiqxitb%wBK`T|2Z2bb%8$ zd<`sHMiid9dZ`iiPx# delta 678 zcmaiyF=&%f5Xb+Qd`-z`k_MBeHnH}j25Gbv)25Yxg9WSk(ijCBD5cOuTeY=T(G0p( z5T_2-8=k0xWN?(gH)N=wg1ELrE5S)coD`%AqJ#AEl}HMT!#&>p@4a`wdw0(sHobY= zRL+L@X+US+Pal_$Xx8UYN#}*mFyGaKd^F;+GF@7<(}00)9K#H*VH)R9#2DhD^@<%v z%sO@aM?1gh()d@-uWk_etf~AxhqZC`<0W@L66iq^gS?a;;QW}zUyB}&t}MC}82n4* z_sSi2ANm?1;i}JCUClUoLG7`^>yC(|Dq9~m-tH1?z4FOJ`yA?i3zaJm+Guy2-0Ic< zwW+lf?UenO6dh2HOnRrfz4Sy%F$KSXIVq-qdAqQ>auYH2(xi4?bIvxK7{w4`{QO%h zk8AtATYg5a4s`Gqv z8mA>~{V$AUT)N&PgmHMGV=u1CToi=;vaE*8#}!P;oJ@*dQ>SHilIWM7#_AwJ6*6gb d$DGtQE2ri$p=M0#<-~VCyPPE(P%WOMLz}n7wLAa- diff --git a/locale/en/Resources_En.ncb b/locale/en/Resources_En.ncb index 33ba46b796f06788be2896107b2bf71de6afb9bc..ebcee50b03981c36e37f4f646cafc02e9e300281 100644 GIT binary patch delta 527 zcmZp;!PszvaRVn0Q^Up0+&oN-j4vkh@k)qT#1|JO$K>QEC+4Kaq~^si=z6A1o?vA< zIiHt{5yY~Yyp4A)m}Sq(pz8>cRm#asVkj<6%uxs~DNV`DSFqGGhzWC!0SYTIa4;}1 z@G?){&!@&{F^2vx7?+Chyp)(Sqj&?OcnfszTc;3EzyMT` zQc;d%!sPWXQgX$q>FKEjIRz!gW=2?*h)>S57MQEC+4Kaq~^si=z6+Lo?vA< zIiHt{5yY~Yyp4A)m}M`+kgs5=XAl$S9Ftg*lbZ(Amzku*z|O$HaF%KEe?B!v^T`?f zij&>>6~L?+69XJJ39zt8JUDbMm=UPTuO;1iW&T8;r4@&>B^J-$xLHQz1ve8v^F&9n z%`yrvn1RgAj6O^PlLS~c^O$^LW-Ok}Xd%LAzFEvdixFs~qopX=B_P+avnwg+dMYSE z+<47$Cs@WIgu%rs#-$=WFD0hTDBi#*-U8i+)+q!OFaQ;#RFor`FnPU;lw@gfYLRY1 zGFDmf$(yZ3Rh^iDegp!LSI;srFjxWk{6MS<5&!~IAZDNF7%|C)g$*R<1oW-UH|9+a zc!FrMjLRgT&)2&&^X>p@=LO<8Am*BE@9NB21Y~hDaZNi5%t~pyK7qML85oKUt_zwk>FS4jiZs1^t(PHyUj(A26Ze(30T>iX_ zOh6G9WYI5N0X!fJ*^vbsfEHA6pJw7^1WEBANo_9S^JnB`m1UG*XE@EP|nEaAMesi0cEekJ$7*LiE ZNyX$ZQs;RY1)w4@(|Oc@0w6zu007rJi&_8x delta 332 zcmZp$Xt3De!@|fkS&>Datzq@k@HML@7qML8;b&lAU;*O)Krs0ti^}8%4wlIktN|Q? z$bt?6ESrC@axe+Zh)m8An8M@UT(4q&NRG#OawCVqWCxBFjOLqPa>O%o@F43d;qsq+ znA>pj7p?#vR-gnsvSb6$$O`V$Odu7TOZfa5dBJYrLQ=E&3%@@TFCzy~h#N_Ga*0p? zj~GyZ4_WYwPzZ+*vOtM&01q!vKm13r~w5)!2|*TLsER8 diff --git a/locale/it/Resources_IT.rc b/locale/it/Resources_IT.rc index 23f4d5964b631a2bdf991c637fa2b9fefbe7aa54..732076f8429023e8ec920932f0f0855d9403ca99 100644 GIT binary patch delta 417 zcmeyig7w~F)(!i_CQsnvn5@7l!t272%23RZ%}~OS&rmS=pp@xkJ~1w!s4GJ-gEvD6 zgFi#S=8a;k+>;;h$PlG?p<=$uW<9s6E@mSJv&m<-TTf0%VVP{xCN%lag;~tT3>GM2 zuP(MR8#0)H#SFIdZQgS!hxz_Xwb4DTkGKNf`^U4_tfQ~ByI#G#1hryGt{Nv*-iAjG!VTBYblNtZ~ zpKKt*wfznkqZ-rnC(evLli8S;ZU5lTxP}eHn%uz3wS5yW<07NUKNy9kGX*m`Oy*+Z jn;sL)C^!9+6Hq9@f$_@rDgKNROq02o=S|lMVe|q3kV<}d delta 564 zcmaixODIHP6vzLcd&gqr(RhyWn2bEiOlC$TDU~M0_pj@}Lu5Jo11*7%UJ*m?CvV~r*_mnDB zlNPP}*6wdM6c0SQ7Ts4UHdvs)-R0Tz%J)qxyP6}9siGty@@y5oUip+Na^$UFTvEt! zRA@&#duo_r0u5nyE&EnhP)=vcnyDTA@KK}cOExleafJ^7+Ez1vDY|+mZ_`Avv{=Nt zWY^sM|JqyShhH4TS$Gr8OfYG%EMm%F8Gs9&9A6~O2%yy7(gd6 zPoyPX93&bnw!hndkwkU_VkCj?l?hV^x_Qb*wWik1x2RwqHjY((uwe!{H zFviylvL08*d55*|!o$?MT1qjIA-nvdA!&vO32{*v!*a_noJkI@4fEe=Ops8H}ElM)66VC{xcld%*gSFnVEs%ACU2vc@hsNOT$G@ zrp3HGjEpZP^YKcESi~0>CCB9CCnx5l#$=YnFz9-wOrBt6Iys-0ixI@KnY@j6EtqA` z%Ao5AkyXmcOkyZ5P0UdUE-6jP%vZ3~Gl&UujsXfQF>nB#z{@;&Kc5<-#bgbB#mVga z3SicZO#&<|5?)!)gPDLz7Mq7XzOTdOK2KZ6qj8bS;mI;ClYq+ByA;blzr+dh2ZK5g zvjg!CAm#<)vp~!@+1=HcwFt=K-dyh5%cKhObsr;;fC5P%-3j!vIgn-nVi6$zFj><> znpFtMV%_ZNv7LF73=0dBKl4OKvCT3HFPMSM&5S-w0+R$-HuIQ#VP@PhnbAUo(PFch zg%%^wO^%kL;1B?X3Ol=!g08265+rP{S?&bOIIt@K!v-R18UYRl7poYTitxOYm@=by z1EY8g^pLhrA)tT(s34`H9LWS=;7G|8r>3W;7UUF^7@HYkRU$q)&ze_P6)8yCfx%G) z#HPRifB{}0-yeuU%Gf753Qw|OVFRgY2L^@AH|9kSERzISL4nV>;PR`@Jir7q5GiJo zfQTs82;Hpdah(|$UyxX2WZEpN@O(5LG2?NP$iU?|d0lB>`VjzPK_C_eVlg0=0Af&- aiUTnyM}qRFC=g3+bnIqklmTYM|Kb24?J-6G delta 664 zcmZpe!PIbrae@Y~Gy?-e1rURP@Mb}Q)6C2d7(Q$kWO>g#S%HO*Q3A#kn8d@$vf#yM z#>KomjEpNL^YKcEn8z0vCCB9CCnx5l#$=YnFz9-^OrBt6Iys-0ixI@KnY@j6Etq95 z!;r6Fsb>%q<{Xn)l9QVT)R&p0#J~=;_bk)o|9onU=94q{6(_s%D}Y%uCI&cc5@2Cb ztvGZom=UOIc7FG^#-w)+oBS5~&VA{n3UV|$NRPz448C>%h*6o{>WzIFon90~9P z`Ro%NBPQ9futDTEGs=8pUgW?sNrXiLS13=G5t#%GjP)YLs^5b+!N#crNl>)y0AgMs zJ`2QrKwJdG+>`A^jW<_`b}^~S0J(iIM*-QAK7-K3oW diff --git a/locale/it/Resources_It.suo b/locale/it/Resources_It.suo index 39d388b9c036076662943a66774b3a698fde0ee2..794fde155a78155a3680b39a385e06eb62e23516 100644 GIT binary patch delta 62 zcmV-E0Kxx&Jb*l~Yy<|-a(xt=w6k&qjspPx# delta 62 zcmV-E0Kxx&Jb*l~Yy<`nEFBuGs