From daa49a0521379aa0b60a4a7893225bb76b81834d Mon Sep 17 00:00:00 2001 From: gho tik Date: Thu, 17 Jul 2014 12:39:35 -0400 Subject: [PATCH] v2_02_86_src Former-commit-id: 6f9b278f3743db566eb25a165a8fb8b01938f5de --- Include/dxwnd.h | 3 +- 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 | 56 +--------------- build/readme-relnotes.txt | 6 +- dll/ddraw.cpp | 6 ++ dll/dxemublt.cpp | 132 ++++++++++++++++++++++++++++++------- dll/dxhook.cpp | 2 +- dll/dxwcore.cpp | 84 +++++++++++------------ dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 178176 -> 186880 bytes dll/syslibs.h | 6 ++ dll/user32.cpp | 33 +++++++++- host/Resource.h | Bin 29256 -> 29328 bytes host/TargetDlg.cpp | 1 + host/TargetDlg.h | 1 + host/dxwndhost.aps | Bin 153852 -> 154008 bytes host/dxwndhost.rc | Bin 85682 -> 85894 bytes host/dxwndhost.vs2008.suo | Bin 26624 -> 31232 bytes host/dxwndhostView.cpp | 9 +++ locale/cn/Resources_Cn.ncb | Bin 27648 -> 35840 bytes locale/cn/Resources_Cn.rc | Bin 80934 -> 81116 bytes locale/cn/Resources_Cn.suo | Bin 7680 -> 7680 bytes locale/en/Resources_EN.rc | Bin 85682 -> 85894 bytes locale/en/Resources_En.ncb | Bin 35840 -> 27648 bytes locale/en/Resources_En.suo | Bin 7168 -> 7168 bytes locale/it/Resources_IT.rc | Bin 86746 -> 86950 bytes locale/it/Resources_It.ncb | Bin 27648 -> 35840 bytes locale/it/Resources_It.suo | Bin 7680 -> 7680 bytes 32 files changed, 220 insertions(+), 133 deletions(-) diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 44f23fe..6593552 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -123,7 +123,7 @@ #define DISABLEFOGGING 0x00000080 // Disable D3D fogging #define NOPOWER2FIX 0x00000100 // Handle textures whose size is not a power of 2 (32, 64, 128 ...) #define NOPERFCOUNTER 0x00000200 // Disables the GetPerfCounter performance metrics API,as if it was not supported.... -//#define ADDPROXYLIBS 0x00000400 // Add proxy libs to otherwise hook-resilient system libraries (e.g. d3d9.dll) +#define BILINEARFILTER 0x00000400 // attempt to smooth low-res graphic by applying biulinear filtering in emulation mode #define INTERCEPTRDTSC 0x00000800 // Intercapts RDTSC opcodes to hook at assembly level #define LIMITSCREENRES 0x00001000 // Limit available screen resolution up to defined maximum #define NOFILLRECT 0x00002000 // Suppress FillRect calls @@ -258,7 +258,6 @@ LRESULT CALLBACK extDialogWindowProc(HWND, UINT, WPARAM, LPARAM); #define IsAssertEnabled (dxw.dwTFlags & ASSERTDIALOG) #define STEP OutTrace("STEP at %s:%d\n", __FILE__, __LINE__) -extern void WinDBPut(HWND, WNDPROC, int, int); extern BOOL WinDBGetSize(HWND, int *, int *); extern WNDPROC WinDBGetProc(HWND); extern void WinDBPutProc(HWND, WNDPROC); diff --git a/build/Resources_CN.dll b/build/Resources_CN.dll index 97de0a0..107b622 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:f4ebe7bb2d5b4f0c2e01945a42c267f0cf4ed997b613467bb6d6765c7e8bd509 +oid sha256:c6ce831ba912fd0a77ada82ff268cc3c5cc5b143ceba47afa5e0788624735db6 size 125952 diff --git a/build/Resources_EN.dll b/build/Resources_EN.dll index cc10c2c..2db050a 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:a7877cda228843a7292dcc2ef71b5137b271f8b9e179d9c23e28ed8d2f4312b3 +oid sha256:e39bc9f35955a42e51eccb033dbb72b802e4e0a91c62191beef0052f7f1d3d22 size 131072 diff --git a/build/Resources_IT.dll b/build/Resources_IT.dll index 76e348d..29f7e48 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:7ef79c84347b104980862e150366e8b8a0115714151f066e4374a9bc11bb2e76 +oid sha256:e4a8fde842a309899161df48662be08b6bf37c06b73f603cd9d199224e09ff82 size 132096 diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 9f9b368..1e41ea6 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:44bc7151507fb71f758117713d02a61e84ee848a109920a5e8c6820e4cfe79a2 -size 493568 +oid sha256:560b196fd41dbbde675f2e6704d3c54299dd975d272960a9cee2b7ce33ea7dc8 +size 495616 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 781ca07..2a8f0da 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b5570bd89772f420d0608463f52afa594fcd539e13d51ea017829fbc0d63ed28 +oid sha256:c4f935425138f4ca43dedf590f0e046ccea571fc42e7620b6673226b6f2179f9 size 549376 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index 4df1801..d060f11 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -1,59 +1,7 @@ [window] -posx=1074 -posy=334 sizx=320 sizy=200 lang=automatic +posx=50 +posy=50 [target] -title0=MetroLL.exe -path0=D:\Games\Metro Last Light\MetroLL.exe -launchpath0= -module0= -opengllib0= -ver0=10 -coord0=0 -flag0=679477792 -flagg0=1207959552 -flagh0=20 -flagi0=205520900 -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=MC.EXE -path1=D:\Games\Moonchld\MC.EXE -launchpath1= -module1= -opengllib1= -ver1=0 -coord1=0 -flag1=134218336 -flagg1=1207959552 -flagh1=2068 -flagi1=-2009071612 -tflag1=6147 -initx1=0 -inity1=0 -minx1=0 -miny1=0 -maxx1=0 -maxy1=0 -posx1=50 -posy1=50 -sizx1=800 -sizy1=600 -maxfps1=0 -initts1=0 -winver1=0 -maxres1=-1 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 91a90c1..1aca786 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -552,4 +552,8 @@ fix: removed extra reference to ddraw session causing window movements on fullsc v2.02.85 fix: revised handling of d3d D3DFORMAT field: fixes "Call of Cthulhu DCotE" color problems -fix: added recovery for rounded child win coordinates: fixes blitting problems in Diablo when win size is not an exact multiple of native resolution. \ No newline at end of file +fix: added recovery for rounded child win coordinates: fixes blitting problems in Diablo when win size is not an exact multiple of native resolution. + +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 diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index d6df995..fe3c3af 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -2488,6 +2488,11 @@ static HRESULT BuildPrimaryEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; ddsd.dwWidth = dxw.GetScreenWidth(); ddsd.dwHeight = dxw.GetScreenHeight(); + if(dxw.dwFlags4 & BILINEARFILTER){ + // double backbuffer size + ddsd.dwWidth = dxw.GetScreenWidth() << 1; + ddsd.dwHeight = dxw.GetScreenHeight() << 1; + } DumpSurfaceAttributes((LPDDSURFACEDESC)&ddsd, "[EmuBack]" , __LINE__); res=(*pCreateSurface)(lpdd, &ddsd, &lpDDSEmu_Back, 0); @@ -3709,6 +3714,7 @@ HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC } if(res) OutTraceE("Lock ERROR: ret=%x(%s)\n", res, ExplainDDError(res)); DumpSurfaceAttributes(lpDDSurfaceDesc, "[Locked]" , __LINE__); + OutTraceB("Lock: lPitch=%d lpSurface=%x\n", lpDDSurfaceDesc->lPitch, lpDDSurfaceDesc->lpSurface); if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; // shouldn't happen.... if hooked to non primary surface, just call regular method. diff --git a/dll/dxemublt.cpp b/dll/dxemublt.cpp index 1cf9fec..6c049c7 100644 --- a/dll/dxemublt.cpp +++ b/dll/dxemublt.cpp @@ -126,31 +126,6 @@ static HRESULT WINAPI EmuBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest } if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, w, h, destpitch); -#if 0 - if(1 && IsTraceDDRAW) { - DWORD dwStats[256]; - src8 = (BYTE *)lpsurface; - src8 += lpsrcrect->top*ddsd_src.lPitch; - src8 += lpsrcrect->left; - for(x = 0; x < 256; x ++) dwStats[x]=0; - for(y = 0; y < h; y ++){ - for(x = 0; x < w; x ++){ - dwStats[*(src8 ++)]++; - } - src8 += srcpitch; - } - OutTrace("Colors: "); - for(x = 0; x < 256; x ++) { - char sElement[8]; - if (dwStats[x]) - sprintf(sElement,"%x,", dwStats[x]); - else - strcpy(sElement, "_,"); - OutTrace(sElement); - } - OutTrace("\n"); - } -#endif res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); if (res) OutTraceE("EmuBlt8_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); @@ -159,6 +134,112 @@ 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) +{ + HRESULT res; + BYTE *src8; + 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("BilBlt8_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("BilBlt8_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, 0)) { + (*pUnlockMethod(lpddsdst))(lpddsdst,0); + OutTraceE("BilBlt8_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return 0; + } + 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; + + 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; y ++){ + BYTE *begin = src8; + for(x = 0; x < w; x ++){ + *(dest ++) = PaletteEntries[*(src8)]; + *(dest ++) = Melt(PaletteEntries[*(src8)], PaletteEntries[*(src8+1)]); + 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; + } + + if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, w, h, destpitch); + + res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + if (res) OutTraceE("BilBlt8_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); + res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + if (res) OutTraceE("BilBlt8_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); + return res; +} + static HRESULT WINAPI EmuBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { @@ -999,6 +1080,7 @@ void SetBltTransformations() case 8: pRevBlt=RevBlt_32_to_8; pEmuBlt=EmuBlt_8_to_32; + if(dxw.dwFlags4 & BILINEARFILTER) pEmuBlt=BilinearBlt_8_to_32; OutTraceDW("set color transformation 8<->32\n"); break; case 16: diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 38b7f79..5797968 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -82,7 +82,7 @@ static char *Flag3Names[32]={ static char *Flag4Names[32]={ "NOALPHACHANNEL", "SUPPRESSCHILD", "FIXREFCOUNTER", "SHOWTIMESTRETCH", "ZBUFFERCLEAN", "ZBUFFER0CLEAN", "ZBUFFERALWAYS", "DISABLEFOGGING", - "NOPOWER2FIX", "NOPERFCOUNTER", "ADDPROXYLIBS", "INTERCEPTRDTSC", + "NOPOWER2FIX", "NOPERFCOUNTER", "BILINEARFILTER", "INTERCEPTRDTSC", "LIMITSCREENRES", "NOFILLRECT", "HOOKGLIDE", "HIDEDESKTOP", "STRETCHTIMERS", "NOFLIPEMULATION", "NOTEXTURES", "RETURNNULLREF", "FINETIMING", "NATIVERES", "SUPPORTSVGA", "SUPPORTHDTV", diff --git a/dll/dxwcore.cpp b/dll/dxwcore.cpp index 157f238..f23fd4a 100644 --- a/dll/dxwcore.cpp +++ b/dll/dxwcore.cpp @@ -594,8 +594,8 @@ POINT dxwCore::FixMessagePt(HWND hwnd, POINT point) if (curr.y < 0) curr.y=0; if (curr.x > rect.right) curr.x=rect.right; if (curr.y > rect.bottom) curr.y=rect.bottom; - if (rect.right) curr.x = (curr.x * dxw.GetScreenWidth()) / rect.right; - if (rect.bottom) curr.y = (curr.y * dxw.GetScreenHeight()) / rect.bottom; + if (rect.right) curr.x = ((curr.x * dxw.GetScreenWidth()) + (rect.right >> 1)) / rect.right; + if (rect.bottom) curr.y = ((curr.y * dxw.GetScreenHeight()) + (rect.bottom >> 1)) / rect.bottom; return curr; } @@ -607,10 +607,10 @@ void dxwCore::MapClient(LPRECT rect) if(!(*pGetClientRect)(hWnd, &client)) return; w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; - rect->left= rect->left * w / (int)dwScreenWidth; - rect->top= rect->top * h / (int)dwScreenHeight; - rect->right= rect->right * w / (int)dwScreenWidth; - rect->bottom= rect->bottom * h / (int)dwScreenHeight; + rect->left= ((rect->left * w)+(dwScreenWidth >> 1)) / (int)dwScreenWidth; + rect->top= ((rect->top * h)+(dwScreenHeight >> 1)) / (int)dwScreenHeight; + rect->right= ((rect->right * w)+(dwScreenWidth >> 1)) / (int)dwScreenWidth; + rect->bottom= ((rect->bottom * h)+(dwScreenHeight >> 1)) / (int)dwScreenHeight; } void dxwCore::MapClient(int *nXDest, int *nYDest, int *nWDest, int *nHDest) @@ -620,10 +620,10 @@ void dxwCore::MapClient(int *nXDest, int *nYDest, int *nWDest, int *nHDest) if(!(*pGetClientRect)(hWnd, &client)) return; w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; - *nXDest= *nXDest * w / (int)dwScreenWidth; - *nYDest= *nYDest * h / (int)dwScreenHeight; - *nWDest= *nWDest * w / (int)dwScreenWidth; - *nHDest= *nHDest * h / (int)dwScreenHeight; + *nXDest= ((*nXDest * w)+(dwScreenWidth >> 1)) / (int)dwScreenWidth; + *nYDest= ((*nYDest * h)+(dwScreenHeight >> 1)) / (int)dwScreenHeight; + *nWDest= ((*nWDest * w)+(dwScreenWidth >> 1)) / (int)dwScreenWidth; + *nHDest= ((*nHDest * h)+(dwScreenHeight >> 1)) / (int)dwScreenHeight; } void dxwCore::MapClient(LPPOINT lppoint) @@ -633,8 +633,8 @@ void dxwCore::MapClient(LPPOINT lppoint) if(!(*pGetClientRect)(hWnd, &client)) return; w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; - lppoint->x = (lppoint->x * w) / (int)dwScreenWidth; - lppoint->y = (lppoint->y * h) / (int)dwScreenHeight; + lppoint->x= ((lppoint->x * w)+(dwScreenWidth >> 1)) / (int)dwScreenWidth; + lppoint->y= ((lppoint->y * h)+(dwScreenHeight >> 1)) / (int)dwScreenHeight; } void dxwCore::MapClient(int *nXDest, int *nYDest) @@ -644,8 +644,8 @@ void dxwCore::MapClient(int *nXDest, int *nYDest) if(!(*pGetClientRect)(hWnd, &client)) return; w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; - *nXDest= *nXDest * w / (int)dwScreenWidth; - *nYDest= *nYDest * h / (int)dwScreenHeight; + *nXDest= ((*nXDest * w)+(dwScreenWidth >> 1)) / (int)dwScreenWidth; + *nYDest= ((*nYDest * h)+(dwScreenHeight >> 1)) / (int)dwScreenHeight; } void dxwCore::UnmapClient(LPPOINT lppoint) @@ -655,8 +655,8 @@ void dxwCore::UnmapClient(LPPOINT lppoint) if(!(*pGetClientRect)(hWnd, &client)) return; w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; - if(w) lppoint->x = (lppoint->x * (int)dwScreenWidth) / w; - if(h) lppoint->y = (lppoint->y * (int)dwScreenHeight) / h; + if(w) lppoint->x = ((lppoint->x * (int)dwScreenWidth) + (w >> 1)) / w; + if(h) lppoint->y = ((lppoint->y * (int)dwScreenHeight) + (h >> 1)) / h; } void dxwCore::UnmapClient(int *nXDest, int *nYDest) @@ -666,8 +666,8 @@ void dxwCore::UnmapClient(int *nXDest, int *nYDest) if(!(*pGetClientRect)(hWnd, &client)) return; w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; - if(w) *nXDest= *nXDest * (int)dwScreenWidth / w; - if(h) *nYDest= *nYDest * (int)dwScreenHeight / h; + if(w) *nXDest = ((*nXDest * (int)dwScreenWidth) + (w >> 1)) / w; + if(h) *nYDest = ((*nYDest * (int)dwScreenHeight) + (h >> 1)) / h; } void dxwCore::UnmapClient(LPRECT lpRect) @@ -678,12 +678,12 @@ void dxwCore::UnmapClient(LPRECT lpRect) w = client.right ? client.right : iSizX; h = client.bottom ? client.bottom : iSizY; if(w) { - lpRect->left = (lpRect->left * (int)dwScreenWidth) / w; - lpRect->right = (lpRect->right * (int)dwScreenWidth) / w; + lpRect->left = ((lpRect->left * (int)dwScreenWidth) + (w >> 1)) / w; + lpRect->right = ((lpRect->right * (int)dwScreenWidth) + (w >> 1)) / w; } if(h) { - lpRect->top = (lpRect->top * (int)dwScreenHeight) / h; - lpRect->bottom = (lpRect->bottom * (int)dwScreenHeight) / h; + lpRect->top = ((lpRect->top * (int)dwScreenHeight) + (h >> 1)) / h; + lpRect->bottom = ((lpRect->bottom * (int)dwScreenHeight) + (h >> 1)) / h; } } @@ -693,10 +693,10 @@ void dxwCore::MapWindow(LPRECT rect) POINT upleft = {0,0}; if(!(*pGetClientRect)(hWnd, &client)) return; (*pClientToScreen)(hWnd, &upleft); - rect->left= upleft.x + ((rect->left * client.right) / (int)dwScreenWidth); - rect->top= upleft.y + ((rect->top * client.bottom) / (int)dwScreenHeight); - rect->right= upleft.x + ((rect->right * client.right) / (int)dwScreenWidth); - rect->bottom= upleft.y + ((rect->bottom * client.bottom) / (int)dwScreenHeight); + rect->left= upleft.x + (((rect->left * client.right) + (dwScreenWidth >> 1)) / (int)dwScreenWidth); + rect->top= upleft.y + (((rect->top * client.bottom) + (dwScreenHeight >> 1)) / (int)dwScreenHeight); + rect->right= upleft.x + (((rect->right * client.right) + (dwScreenWidth >> 1)) / (int)dwScreenWidth); + rect->bottom= upleft.y + (((rect->bottom * client.bottom) + (dwScreenHeight >> 1)) / (int)dwScreenHeight); } void dxwCore::MapWindow(int *nXDest, int *nYDest, int *nWDest, int *nHDest) @@ -705,10 +705,10 @@ void dxwCore::MapWindow(int *nXDest, int *nYDest, int *nWDest, int *nHDest) POINT upleft = {0,0}; if(!(*pGetClientRect)(hWnd, &client)) return; (*pClientToScreen)(hWnd, &upleft); - *nXDest= upleft.x + ((*nXDest * client.right) / (int)dwScreenWidth); - *nYDest= upleft.y + ((*nYDest * client.bottom) / (int)dwScreenHeight); - *nWDest= (*nWDest * client.right) / (int)dwScreenWidth; - *nHDest= (*nHDest * client.bottom) / (int)dwScreenHeight; + *nXDest= upleft.x + (((*nXDest * client.right) + (dwScreenWidth >> 1)) / (int)dwScreenWidth); + *nYDest= upleft.y + (((*nYDest * client.bottom) + (dwScreenHeight >> 1)) / (int)dwScreenHeight); + *nWDest= ((*nWDest * client.right) + (dwScreenWidth >> 1)) / (int)dwScreenWidth; + *nHDest= ((*nHDest * client.bottom) + (dwScreenHeight >> 1)) / (int)dwScreenHeight; } void dxwCore::MapWindow(LPPOINT lppoint) @@ -717,8 +717,8 @@ void dxwCore::MapWindow(LPPOINT lppoint) POINT upleft = {0,0}; if(!(*pGetClientRect)(hWnd, &client)) return; (*pClientToScreen)(hWnd, &upleft); - lppoint->x = upleft.x + ((lppoint->x * client.right) / dwScreenWidth); - lppoint->y = upleft.y + ((lppoint->y * client.bottom) / dwScreenHeight); + lppoint->x = upleft.x + (((lppoint->x * client.right) + (dwScreenWidth >> 1)) / dwScreenWidth); + lppoint->y = upleft.y + (((lppoint->y * client.bottom) + (dwScreenHeight >> 1)) / dwScreenHeight); } POINT dxwCore::ClientOffset(HWND hwnd) @@ -736,8 +736,8 @@ POINT dxwCore::ClientOffset(HWND hwnd) upleft.x = upleft.y = 0; (*pClientToScreen)(hWnd, &upleft); desk0 = upleft; - if (desktop.right) ret.x = ((win0.x - desk0.x) * (LONG)dwScreenWidth) / desktop.right; - if (desktop.bottom) ret.y = ((win0.y - desk0.y) * (LONG)dwScreenHeight) / desktop.bottom; + if (desktop.right) ret.x = (((win0.x - desk0.x) * (LONG)dwScreenWidth) + (desktop.right >> 1)) / desktop.right; + if (desktop.bottom) ret.y = (((win0.y - desk0.y) * (LONG)dwScreenHeight) + (desktop.bottom >> 1)) / desktop.bottom; OutTraceB("ClientOffset: hwnd=%x offset=(%d,%d)\n", hwnd, ret.x, ret.y); return ret; } @@ -753,10 +753,10 @@ RECT dxwCore::GetWindowRect(RECT win) if(!desktop.right || !desktop.bottom) return win; - win.left = ((win.left - desk0.x) * (LONG)dwScreenWidth) / desktop.right; - win.top = ((win.top - desk0.y) * (LONG)dwScreenHeight) / desktop.bottom; - win.right = ((win.right - desk0.x) * (LONG)dwScreenWidth) / desktop.right; - win.bottom = ((win.bottom - desk0.y) * (LONG)dwScreenHeight) / desktop.bottom; + win.left = (((win.left - desk0.x) * (LONG)dwScreenWidth) + (desktop.right >> 1)) / desktop.right; + win.top = (((win.top - desk0.y) * (LONG)dwScreenHeight) + (desktop.bottom >> 1)) / desktop.bottom; + win.right = (((win.right - desk0.x) * (LONG)dwScreenWidth) + (desktop.right >> 1)) / desktop.right; + win.bottom = (((win.bottom - desk0.y) * (LONG)dwScreenHeight) + (desktop.bottom >> 1)) / desktop.bottom; return win; } @@ -768,10 +768,10 @@ RECT dxwCore::GetClientRect(RECT win) if(!desktop.right || !desktop.bottom) return win; - win.left = (win.left * dwScreenWidth) / desktop.right; - win.top = (win.top * dwScreenHeight) / desktop.bottom; - win.right = (win.right * dwScreenWidth) / desktop.right; - win.bottom = (win.bottom * dwScreenHeight) / desktop.bottom; + win.left = ((win.left * dwScreenWidth) + (desktop.right >> 1)) / desktop.right; + win.top = ((win.top * dwScreenHeight) + (desktop.bottom >> 1)) / desktop.bottom; + win.right = ((win.right * dwScreenWidth) + (desktop.right >> 1)) / desktop.right; + win.bottom = ((win.bottom * dwScreenHeight) + (desktop.bottom >> 1)) / desktop.bottom; return win; } diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index d0635d9..f297218 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.85" +#define VERSION "2.02.86" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 61209d371e59f189670b07c3574567ac6b806f1b..de13caba4d1eb0db88e7347474d26713bfd69cb5 100644 GIT binary patch delta 8072 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 OR&TRpxW|khk^XN-P9x+1 delta 2904 zcmZuze^6A{6~5>00t+s<0+P)(g~v}3VY_G~U>vh16b%J}2EnE}Zd)=nW`RX9B2lv% zrd87_`l`oCGqBZ`X=A36uH&1gO^2v|7_o`AX{Y%kbg`Xj|7gKUowhQC?RVc}iDr6t z&fEL$J@4Lgzw@1QZusJY@SU`g20Nwb`S!ewSl91A8XEkNY(j|9qG+GJ)kdk&TPdH~ zl4%fQ8Tu{Xvgq9fJr$=yGCR7j=G#fDQv{I^PRy1-RQt{OM>D5pC*x}TkX?w^A@XzM zN-tYP*F5o#lig&4FFADEf_cIW~GLy0<=_B%KuPYwn}uzu>!( zlIZk?>)xbZ^uJ(P6#m;m`XzrN>4IEIe9T7mG{Ya;s8Ie`7_&AyQE2~bk|FtbJ7op8 zoS|}#rOSLyFQtv@B&U4RUA0f_6EBNu@uXOR=khtJ5LM{=AQhq#zgkEI=BmYG7_DgF zwFjxfm@K7dX|)d{>Q`sZu7pMn^p}hMFtl>H5Q~K}B29>Rd_)SMW47x3PXQqQVUUVX zjmm7kGfUaV^)hP7*8`3s9%vvZ|0qZW?C+KycC}Fk#~R7bS0_l*1Lrl}pX#C|ykVRQ z+0{tP`QjvLti3|z^cB9NnG+EMC(=KI=2B zld|b+51x=ucTkb8t=IH$laqhmMMbQY;XtE4Cq2X8>!c$m$6M%OWpptI2)JMsw>leu zxJFKW@@Ot>etQzruK%Jp*@fwkTFJ{=2VMt5l%^mmuuM46O&)sI1WAwdVbkgidW7Gb zph^z3l7lgytG+gmk_m za)q?X3@0OWGj)Gu2CpJn#DR~gj6w=N6&P*~jZreaY(mDNp*g5izl>#7Mq6Mi^37f_ z9bEG&E~PPo#?DPa>Ewb>z^cHIEajVx2&DSG6yg3cxWtTzrOL5|dSs=~hJ?%U5^99c zv2~^1d06AJ z-@#uq=ja()#d&R?r9pdoyVxndF7^nofG3Uk6!oOeencKB=fIl5c|lm4!->-q@zH8IiEy_ zV@FXUo>aZazwt>>8Ncbi{1A*;$)p?pSVK%-}m{G;dX_BZH6$UXdhnarKz2wT()CyzO$Cl88f9G33e<32CnMwLpC!^LSoke77-W&i0bq#4>9@*Jg#V_0l1*DiPt zr#TBjh_c?0dpHt$F^xJgy1I}$SR3Q=W*Bl4Q0AuD;Glg;{7yU)0L zPBtU~NTKah6-V-$>9Q?>xrso|yq{bNKP4P6&(left < 0) lpRect->left=0; +// if(lpRect->left > (LONG)dxw.GetScreenWidth()) lpRect->left=dxw.GetScreenWidth(); +// if(lpRect->right < 0) lpRect->right=0; if(lpRect->right > (LONG)dxw.GetScreenWidth()) lpRect->right=dxw.GetScreenWidth(); if(lpRect->top < 0) lpRect->top=0; +// if(lpRect->top > (LONG)dxw.GetScreenHeight()) lpRect->top=dxw.GetScreenHeight(); +// if(lpRect->bottom < 0) lpRect->bottom=0; if(lpRect->bottom > (LONG)dxw.GetScreenHeight()) lpRect->bottom=dxw.GetScreenHeight(); OutTraceB("GetWindowRect: fixed rect=(%d,%d)-(%d,%d)\n", lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); @@ -1983,7 +1989,8 @@ HDC WINAPI extBeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) // on CLIENTREMAPPING, resize the paint area to virtual screen size if(dxw.dwFlags1 & CLIENTREMAPPING) lpPaint->rcPaint=dxw.GetScreenRect(); - OutTraceDW("GDI.BeginPaint: hdc=%x\n", hdc); + OutTraceDW("GDI.BeginPaint: hdc=%x rcPaint=(%d,%d)-(%d,%d)\n", + hdc, lpPaint->rcPaint.left, lpPaint->rcPaint.top, lpPaint->rcPaint.right, lpPaint->rcPaint.bottom); return hdc; } @@ -2434,6 +2441,13 @@ BOOL WINAPI extUpdateWindow(HWND hwnd) return ret; } +BOOL WINAPI extRedrawWindow(HWND hWnd, const RECT *lprcUpdate, HRGN hrgnUpdate, UINT flags) +{ + OutTraceDW("RedrawWindow: hwnd=%x flags=%x\n", hWnd, flags); + return (*pRedrawWindow)(hWnd, lprcUpdate, hrgnUpdate, flags); +} + + BOOL WINAPI extGetWindowPlacement(HWND hwnd, WINDOWPLACEMENT *lpwndpl) { BOOL ret; @@ -2691,3 +2705,20 @@ BOOL WINAPI extGetMonitorInfoW(HMONITOR hMonitor, LPMONITORINFO lpmi) { return extGetMonitorInfo(hMonitor, lpmi, pGetMonitorInfoW); } + +int WINAPI extGetUpdateRgn(HWND hWnd, HRGN hRgn, BOOL bErase) +{ + int regionType; + RECT rc; + regionType=(*pGetUpdateRgn)(hWnd, hRgn, bErase); + if( regionType == SIMPLEREGION ){ + regionType = GetRgnBox( hRgn, &rc ); + if( regionType == SIMPLEREGION ){ + dxw.UnmapClient(&rc); + if( SetRectRgn( hRgn, rc.left, rc.top, rc.right, rc.bottom ) ){ + ; // success + } + } + } + return regionType; +} \ No newline at end of file diff --git a/host/Resource.h b/host/Resource.h index c346f1b77adc6de18408e6c1d34196b5735f2fba..8ebc3a6755dbb784d9911ebdcfb21d32ef77d73e 100644 GIT binary patch delta 68 zcmX@{gmJ=C#tktdnobO!3_d{Y$KcA~$PmQf2IhwVc|i=EP-w_tz+gC;QBZzzjELRj NLp*YucZf`g1ppFo4<7&k delta 25 hcmbR6l<~w9#tktdlO5F9Ca)5)nA|2Jw@GwDEC7n63CjQg diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 70096ab..752f061 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -21,6 +21,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) { //{{AFX_DATA_INIT(CTargetDlg) m_DXVersion = 0; + m_BilinearFilter = 0; m_Coordinates = 0; m_DxEmulationMode = 4; // default: AUTOMATIC m_DCEmulationMode = 0; // default: no emulation diff --git a/host/TargetDlg.h b/host/TargetDlg.h index ed98333..0b43c81 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -28,6 +28,7 @@ public: int m_Coordinates; int m_DxEmulationMode; int m_DCEmulationMode; + BOOL m_BilinearFilter; BOOL m_HookDI; BOOL m_ModifyMouse; BOOL m_OutProxyTrace; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index df724c30aef7fcfa2be75f5f0e115599d0445be7..74a40fb0ff89d5ef9d44280a53923aebf2d5b865 100644 GIT binary patch delta 1744 zcmZXTeN59w7{~9PmJKL_;s718u@@?!sO7B?#X?8XuywT1BF$haOVGH9q>wQgNVa8( z@ntIJH}{}3FcV0+%*85fKb=h7W+EAyK{k^G5w<_r5@IGKGa zC9S%o<)8n=r|{%0em7IgDp?b2X1iDnYiBJqdx!0#@g8NGnEV}7+ei7iwAZcfI*-#; zQ(3jcQ)#tTFq6?(kjG4%MF_Q3w#qjuT@}`Vn$L~CPrlVtZm)9H*lkXh%eLYA zS)R_#_}VOgk(c6LL1lP!mZx!x>YL?drT9+<*trRd3{c3exX%EC!EjhTyAG_tYw@ov z*g+0)PPHr>078IoZh&)g{%j6(V(bP;z#}zhN$SPvjc{6$4|_I+3-e1j zzX`TV?R&IthEYj(RD%)PQwFPWp z^$Xlz0_#H}odqpLQ1RV1xD;OSBaWHjZ@K(8^_NoE9u^;9wgt>mT*8kmBnB^v58#X? zT$&H!%dbLaNQ-_;lfjmka|^IP2VRj2T5)j2!rO3mg>a@Ebhx=3(n4l@-b#sFi6zd0M9Pel0`|jVN3eV)2L)JCce$v=R=C zC{;8M7_E1t@#&y3Zd#eXA2jM5(^8Da8Bt};LuKyY;7a}{7P=r^jJH2 zk!Vbi-w9E%t9hu2IK1wJ6nddJmPz8cu$E+TOvoY%^l@{e^u`DJ(0pp<=rNNlTGox5 zrJR8M)QP6o&T+3@*1Ap9FDOvURV&Sj!CGm%IX>J)vglFQxLeAr0;kgSHdC!;k^}eJ z*ezsnuL^$Xgk;@7AR+EDDd=xL&aw2k+^wKrmP^4>7q#~I0>@u3knG<{$F%u5ru&J; z1uYVd37RM3E_}2z@aHDi(M^^N(S;0==BOj*o?(t#hl#v`4yhdLRiYjudUU76f|1J{ zPh6(txUh^|CAvy9FD#AtNLZq;alH2fC5>*f_=vi$5jlt~+Mh+^Ptowji`N?Y`lpC* g-je!PPv{35NXJud`trPZ#SQ6Ewd)w$gZF9rKh_)nrT_o{ delta 1273 zcmZ9~T}V@57zgn8ecU87W1~V+%T?N^=4Kz*GM#Pq0b|?oqp}8*km$y05oLEmUKl7i zl>U}bNkv^GbSOF%6|#%+qJjlMLD5ATk!TGh41{{0=9$ug!|y!L|9Q{H%jv(LHKS+s z_?8s~Nwm1bzP5uWTEb_`BhK zy>r<~9GO?0!ho07&aOkAmlooSmkP|rVQ#GQ%{8ugDI3i`$~PxIaO3K~#w8!E#>cr# zo`tQJip`fghrqn5&FHG7sjNKp`~7zmi9dh%#Bh*0TP9r${gzNHULLKcMiy#Vmlv_z`6~5KC1$(}M(a2ua2P`$5GwxR?rP%qXIa2Qg+C zIxQWK&0+C8jFUIqR+;RO$TRs^<}qeV2BXRSS@M(P`t&BB%1)ZRD9dbf zPXZU`nrog8&+Ls-Zd1JZK~o3e_N=4=sQeiZ!ozSJ&`vdrQ*! z#}-|5?R(vd0}ph_HoHk0QYxjww&kYXYNg2Drb*H@C0qL4t!@{b+)*;*g^#<#dmPkQ z#z=>!#y$@_xYP4Zmo-Op0Sir<-?LvP!_;~%xh5DB3Vp%FS2?NX{#sj2<6r04(X#OvuW?#{M;4R{ojp{Y z_R+}oP=x1!ael^fKUivTNphS^PTCdHpV}%XODa5*fD;nrR%)}A5b3Hr9q?rEt7&C+ zc)*g_o-XGz{i&PGQcU(b{61>#GY=SF(8_AC+{N(Eh}8BJp=4XKExSoh*p zy#@UmdK-EN`VDjmx(vMwU4gDb?-@+M`!GI$K7_78e}aAou~F)uYX2GeU!d#IN6=rP zkDcn9B%p;QD-Zy`|Q#m^9u;r7kHQ#aCoFT8YcHsCKGfD}p z9vZXhyb|ban9lnD^Jvpo6-D2WliZDCW-}I}56jVS)}ZGb{=a#>(K$K+>2mhIwd0&S zV`E9ayDAb0;ge zE7S&!>}oqYP=I-g{W3j-@;05jSe^vthxmDlh{oO76O383{i^nQ~*No9eJuMzH4X8YVg2O$JyWEch8M$3tXw8#0ccIj; z@LH7-m-u4zA`=RG%nf_EZFdDwS=4J9Jb1Q;z2;~;)yXr#N63-zRhNww1=8ism**R2 zS{V3Z1`hyS?KY8@y z%P&Ao{M?aMLC(}5zY38ty%)~RACMzN#+?r?qy^oF~clN&vP@3>H0>p0XB?RZ7Y z%(5~xkfM!cBj*bkCppS$l(9HpzEnQnikY8*m)d{)ET6Czqmy^JiI5FNy2|?#TVvFb zQAZ#j#A#u94s;Y^PmVzmzaiM{)yvBGJP~q1uOb#5N7&AlVk7d?5GyxBk;FO29EHN+ zRqce=P`2&nFlR-BumaU;Sk(#U8uhA&W%Nr?n+G=^(~mY2Z-6xE$FrO^&v485!;UO4@lbcxCS1g? zbXEAV%SS_*do_ImuOVnJrFN?9X-Y?|XT}}@`TzY0=w7?|!YKW7|#OK;uXJ?Qt)P>Kr#+)gcpFUHb+;w6#I^Y{%;Nq5GiXmagqZkYj4*y6nO;-20rqKSIam>zLRPc z>C2hsA-ohnlaVj8@qWU3sG3iZ)~jPa> zIRASTmcZVtj{B7rgB?)zgBZW(l^szw6@EWbc2pT>=9se6$`*m0QI>$q@c>86G!X@+ zB;;f~os-p0)0_cKn<-rxm%IUX3-YBg>q*j4`C3ABuFH==XiK_+cVM>4t4QH(9dahuIzY<=*o< z=iGbGedpYm1#bS#Fa9VgJH=vg=Tc%HUy;wa)8D0Ddh`4ZZet{eu_(tdrVk(@%h-|) zuH*AqBhq0%a*Clek&jYkRyFcbl3Hm!S`$fiNEV8WJb48^%S2fPG zQ=G%#byX(kG!%*}Y8A#RI5(svaU`}`I$0BY&(p=ZI&o}2OR=Zf0-ItlvnGqTjB&+7w5^h` z8X_ν{1z_dc=Gx+P`o)}7W{5(*t5qyw9fTMlAmVg%R5!g3vX!EzpdO_GY+4gLt*GOA$AC0g3t+%M6W6SkwDZ z=t^>DPS>C$x#CZ2y}IOrw{=1KrcuDU*M5 zO%CO7(KMp&T?7r!WxG?A+!+(?Cv2j*1sHpQono)B*QqJ{*=uZ`7~fUjIbjjCEyjrW zAsHr!SRwn%13M_%^F{auyrAb!7iIzR=C}pmeD*J`(j?GQ(-=Q_C7<5J>SXx7Q2~4t zbI^nAw#>OT8{b>)saz(GALIcPGI5o4(H_0`O!IM-KTK3#g|Z6s?@Bz4vkOP>ox%u5 Nu)Hw-KLq_V{0rm*$`1el diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index 7e63ad8..3ad4c81 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -128,6 +128,10 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) case 2: t->flags |= LOCKEDSURFACE; break; case 3: t->flags |= EMULATESURFACE; break; case 4: t->flags |= AUTOMATIC; break; + case 5: + t->flags |= EMULATESURFACE; + t->flags4 |= BILINEARFILTER; + break; } t->flags2 &= ~GDISTRETCHED; t->flags &= ~MAPGDITOPRIMARY; @@ -300,10 +304,15 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_PeekAllMessages = t->flags3 & PEEKALLMESSAGES ? 1 : 0; dlg->m_DxEmulationMode = 0; + dlg->m_BilinearFilter = FALSE; if(t->flags & EMULATEBUFFER) dlg->m_DxEmulationMode = 1; if(t->flags & LOCKEDSURFACE) dlg->m_DxEmulationMode = 2; if(t->flags & EMULATESURFACE) dlg->m_DxEmulationMode = 3; if(t->flags & AUTOMATIC) dlg->m_DxEmulationMode = 4; + if(t->flags4 & BILINEARFILTER) { + dlg->m_DxEmulationMode = 5; + dlg->m_BilinearFilter = TRUE; + } dlg->m_DCEmulationMode = 0; if(t->flags2 & GDISTRETCHED) dlg->m_DCEmulationMode = 1; diff --git a/locale/cn/Resources_Cn.ncb b/locale/cn/Resources_Cn.ncb index 3e9eff4856408d059f3a5c07c96c9a755a8c24b5..48bdd41c6c18d947ce8e30d34358edac599d73e0 100644 GIT binary patch delta 621 zcmZp;!Pqc^X@Ul?G6Mrc1rURP>}ElM)66VC{xcld%*gSFnVEs%ACU2vc@hsNv%>?n z%{)9(jErWR)p_>;smU7rij&#-6@UU7{C8L+63k8nGXYK6zQ4fQ?%*Ydopbwo&ffRU zn=Iop38;F#O9|tp$ttdPyib9O_<^_xh`BfCyG~_dteDK|Vb3ZA6ky%#>9L)8lZ>bg z&|EPKEs%YVmJ1l2&EkuTl4El6lM{1NW0Lb?tW&IFTq?rzQew)C;th=AEzlJ(02QQE zlp`qsxdIS%w|TP|Kb4E6`~CQ delta 388 zcmZpe!PIbrae@Y~Gy?-e1rURP@Mb}Q)6C2d7(Q$kWO>g#S%HO*Q3A#kn8d@$%(2^b zGY^jxBct(Vb>4kIYO)5u;$(Jy1)zWi{~Z?9wADL<8G%NeCjdw&#ha@JUU z0GkgaKyr*gYpyd(vH+PNYyreDzzk%t0;QibZ;}y}0U9c1p#`$c(Q*N!vvGWJQF2U9 zesW??YD{uojCG1tj7vp$UP?@vQM`dsyal=f2B3nJigF|clh=z#O}4X^06KiVi1_3@ zYhFnwpq;89X92-kCI$w6Am0jzO(!#&2s5%zbc|SJ!!b#OMFN-CCd-IS0-IOD7&Tc% r)Q-0ZXc9LNKLuj`&H18JnOJ3j%)ZT>9^aW6g*G#m{1;!WpuzzFY=mUS diff --git a/locale/cn/Resources_Cn.rc b/locale/cn/Resources_Cn.rc index aa1e0d2f6927a1f284b28bbb576e274173fb02ac..ee71530d5afd67da3c715f2ce326b6cb4d873d28 100644 GIT binary patch delta 121 zcmZ4XgXPXomJJngljGc!CMTtDVYXy2nk<LZ?aaV*W{ukz0I@YmT^qJkf@}6 zCU}3HdcyJkCwWQ?It-o+E)32L@eEEtmJbm7F}N}~G6XTWf%uajdO1(tkjTPn$Y8-> XFu5_!esWyKyvYaLls3=H?6?E~fx9XZ delta 63 zcmccflV#ZtmJJnglNDwwO`ed+vRNu&5y#{>H>Jt5;MR|BiQD5f|}Wio&J=hEDQ1JQdIHq6Gj2J>eNG>=8wX z^nn>A6D{=}%( zI#Kifi=YLLC=bSt(Bn>n3|2zwgBUfH${l6}D}GHq*ym=(spAqJ-~#UX-N7~2DV)O% gOyCi2DeMfYt0n=;9q)ssI20 delta 398 zcmZp$X|UPg!@|fpS&>Dax8a0>Yv|1LjLZxS3=WekS-d76<};jZz``>52a6An2vC#_ zi2nn@LVF8NrARAD^7r?`XrgZWbpddH8U`oVZLNl19B!!cI0#i1tt$j7zQRcau`f@5MbNPCi9CC E0FR}g^#A|> diff --git a/locale/en/Resources_EN.rc b/locale/en/Resources_EN.rc index cf95ace736a9eca018645d71af53c60cbf7530c4..65943347a60fb2701557f26333babed7dabc2bcc 100644 GIT binary patch delta 147 zcmdlqm$hv^>xQWK&0+C8jFUIqR+;RO$TRs^<}qeV2BXRSS@M(P`t&BB%1)ZRD9dbf zPXZU`g#S%HO*Q3A#kn8d@)@|@9> zVKTqVFGkhL|9NB>%{I&MPGe*|J9(d*I-}WSS$@UIfA|!@tQ(sISXfjinw1Os*G^nrv(>0pzb25w|LiPtDWIOHN|ohFW=+3Bqs!Sq%hMK$;(jK@J50RUpF@ zNV89LjF@D@!UmFe0=h-!8}lLumPsNk61coPSw>_M*wzxJAl}KUqQ1QBKyz4uxCn^3 iH`j}{GBL_bW-U=>T)kP-<2o~=5YUVNg%>NR@BjcT>134v delta 1173 zcmds$&ubGw6vuaVCZ<0Uvu)EfO}1rC32pt+HI34ZDYc=SHUU$mwNznYso7`_{bkc= z1i@a4H)%2;9)m|kq}_vfXb-)KH$B*YKrABCgNjJCzS%^ODkymK!FT8FytnM`=R0p{ z3oYH_SGt@X9LL=Rv1m6Ngy)!i-s6@`RI`gQ$9;q3D=sWda|56Jg;Uh<*#UCncQ4{A)U$T z@zI|7G^@;2DjKAQmC{EJKT6VPj((d5-shurP7#I8PUl^OHtEK}P86nHu0z!BlB{g2 zc&>g;AjCWV@aZ@YPn=GAUry}a7+im#Eyu6E-=U&fg3ib4BLAY62IDE`0(8}b>>!(Y zE56JJ3y|JHaH&QstOJ0c4^{$lgUYl!;kPwHW;2tCCwNUHgeSNd^O&NvjUhGB8D1y} z#B`kafKiqr#SL%vD8WWUl2s{SVGCHPPA8OsBO^1CMNYEFNsOEXi4ZE_);bkYbTC8Vc*Vg|s$3m!6u=Xqj0pYMj#4!sM)>UF+44_v*_2 z1`ZmG!u6jT0G5vqM7HJ(|NQ@8 zM=gygJ0W(2|JIf)SW&YY%i(>#l-&O|IH*8vi4J~+(8G!LkO*HSfEqweAU42W5HryS XY5}qNVbjzM@~_5jW7Gy?v)A+;WX>No diff --git a/locale/en/Resources_En.suo b/locale/en/Resources_En.suo index 4545e7a057dd947d9d61079816d1f50b0adb7744..5133e7445a05ec0e0cf824bff3f64bb30d896347 100644 GIT binary patch delta 324 zcmZp$Xt3Cj!@?%uR$k1oXmSzDH4Zig28RDYF!>^j%H#$PmdO>YK0IPTK~ZE02LYDN zKUhC7F`8|D$q~)S!w!_>MpjV5iWatUwtSWZ4D*pt;=MAQhXxaQidy zGJ>q+K~_@27r?_06@a_v3tzzGBP<4!OZfeH899KmTu53rf8qCMntYhsaB_)I0FNMs zUZD#-;y^(r6fMF8d5C{MO DVmo;B delta 336 zcmZp$Xt3Cj!@~AqfzPJUnUjlHu5qw1FfjZFg2@+IR3FAk*2AMH>Wwws3n-c9yW+#N*5~ z*;&YNatU7m4;NGs+&N!>g5v0cCH(#%9h<-K`!n$}asZ{dkqs{q3g8h#*Yic_0uLWh zkO@iU<}boUK>tjB$sxbFO>8dT$+&I33AFq6k(ACr!4@{=B* VB9l6&5|bKZT$8v)Dzl<)1m&SR97q5F diff --git a/locale/it/Resources_It.ncb b/locale/it/Resources_It.ncb index d8288be0ab6bb2a90419058ac0f4e802bb5f48ff..c36d64fe954bf66a07d80d7fd3da7ffc0c25d0af 100644 GIT binary patch delta 577 zcmZp;!Pqc^X@Ul?G6Mrc1rURP>}ElM)66VC{xcld%*gSFnVEs%ACU2vc@hsN3&-xK zjGK9RBpDgaHmmdQ15%SU_!TF!^D6)aH2CkZNGvlu5zGWMX2s)a((5Kf`7K-Fb^GUr zFZUFaQ;#RFoqrn7rOaYOg#S%HO*Q3A#kn8d@$((sIh zX)`a6BqO8AW_8|uKx(oEzv5(eeg&X_2LBxv)yB{Jf*FBkHTtg6_~X#vyC&(}-ZFbm z9k2yJ0wl)>wC6grBnyxU!WKXb1I$1MD^U75^ClTl8K9wJ7Fr<794!|xI-A577bVB! zTQq{d{H#8{_T#kf?2=cUAy8O0kI#ao~&U;rvesVGNMFnPU*)MPtr382H*i-=Fo zv*uNTSq*ZTDv&S*(pErs@B{H#CI$v4=FM}hlQ|}dut?zY++-P%NkB)g7YSu%l>ut+ V+sx_lotaT+Gh@kr@x=-%8~`3pTqytm diff --git a/locale/it/Resources_It.suo b/locale/it/Resources_It.suo index f2bfdbbe2568725ad2357f435d9667f6fbcc7ac0..92db4c49bd36c9d371f70a9753d4a00e3d19c4bd 100644 GIT binary patch delta 210 zcmZp$X|UOl!@_G2spH4E=sY7c0|Uc>$(1bUIoN=#|3EPLB8$r81`d|Z6|4%3n@yN9 z7$p{P4r3^02w}(v!W@PqAX&i>%#g}Z#8AeNIa!`tak2pm%j5$> ZEIhnW(_pS+RRapJOb(Rto_s`R4*=ciMfLyy delta 167 zcmZp$X|UOl!@{c&HP^6u&Ur>=1_p+P$(1bUIaq)bT%t