From bde179852cdaa596a0f40da60f20429afcc3a5ae Mon Sep 17 00:00:00 2001 From: gho tik Date: Sun, 11 May 2014 12:39:56 -0400 Subject: [PATCH] v2_02_97_src Former-commit-id: 825da04474b383bd6fe1649323fe622b6bb0a482 --- build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/readme-relnotes.txt | 6 +- dll/bilinear.cpp | 25 +- dll/ddraw.cpp | 82 ++---- dll/dinput.cpp | 15 - dll/dxemublt.cpp | 600 +++++++++++--------------------------- dll/dxhook.cpp | 4 - dll/dxwcore.hpp | 4 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 280576 -> 280576 bytes dll/hd3d7.cpp | 64 ++++ dll/user32.cpp | 71 ----- dll/winmm.cpp | 25 -- host/TargetDlg.cpp | 1 + host/dxwndhost.vs2008.suo | Bin 111104 -> 112128 bytes 16 files changed, 283 insertions(+), 622 deletions(-) diff --git a/build/dxwnd.dll b/build/dxwnd.dll index bc79458..3096175 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:322d82c850c81a6f45b224d9fe22ab45a18d9d725180702c6b1f2f41e5abcdb7 -size 534528 +oid sha256:5440c78286a678a28b71b54f938b0ff377b7811d6601f3d5b00aaffc39d7811a +size 531968 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index ff8d5a4..04c7c98 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:88397843c92ba22bd48b166a9964201ee90431f17e9c1212a3349b857c039159 +oid sha256:155274eb76f293c76375ddbf6fb233076d82307a6afd440a11417e3673ece4ad size 559104 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 6670631..a0fe1a0 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -631,4 +631,8 @@ fix: missing initialization of variables in screen size limit handling fix: processing of mouse messages fix: GetSystemMetrics and LoadLibrary* calls hooked by hot patching to fix "Wind Fantasy SP" movie problems fix: completed winmm multimedia api hooking to fix "Wind Fantasy SP" movie problems, and not only.... -fix: revised FPS control to assure more stable fps when a FPS limit delay is set \ No newline at end of file +fix: revised FPS control to assure more stable fps when a FPS limit delay is set + +v2.02.97 +fix: mouse black trails in "Deadlock II" +fix: missing default value for filter mode diff --git a/dll/bilinear.cpp b/dll/bilinear.cpp index 6c8cdef..7904458 100644 --- a/dll/bilinear.cpp +++ b/dll/bilinear.cpp @@ -94,15 +94,9 @@ void Resize_HQ_4ch( unsigned char* src, RECT *srcrect, int srcpitch, // *256 weight_y // *256 (16*16) maximum # of input pixels (x,y) - unless we cut the weights down... int weight_shift = 0; - float source_texels_per_out_pixel = ( (w1/(float)w2 + 1) - * (h1/(float)h2 + 1) - ); - float weight_per_pixel = source_texels_per_out_pixel * 256 * 256; //weight_x * weight_y - float accum_per_pixel = weight_per_pixel*256; //color value is 0-255 - float weight_div = accum_per_pixel / 4294967000.0f; - if (weight_div > 1) - weight_shift = (int)ceilf( logf((float)weight_div)/logf(2.0f) ); - weight_shift = min(15, weight_shift); // this could go to 15 and still be ok. + + //gsky916: weight_shift calculation in bUpsampleX && bUpsampleY cases are not necessary. + //Move to else block to reduce floating point calculations. float fh = 256*h1/(float)h2; float fw = 256*w1/(float)w2; @@ -128,6 +122,8 @@ void Resize_HQ_4ch( unsigned char* src, RECT *srcrect, int srcpitch, } // FOR EVERY OUTPUT PIXEL + // gsky916: Use OpenMP to speed up nested for loops (Enable OpenMP support in compiler). + #pragma omp parallel for schedule(dynamic) for (int y2=0; y2 1) + weight_shift = (int)ceilf( logf((float)weight_div)/logf(2.0f) ); + weight_shift = min(15, weight_shift); // this could go to 15 and still be ok. + // cache x1a, x1b for all the columns: // ...and your OS better have garbage collection on process exit :) if (g_px1ab_w < w2) diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index f0b170b..deea278 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -1781,25 +1781,6 @@ HRESULT WINAPI extQueryInterfaceS(void *lpdds, REFIID riid, LPVOID *obp) break; case 0x84e63de0: OutTraceDW("QueryInterface: IID_IDirect3DHALDevice\n"); -#ifdef COMMENTED_OUT - if (dxw.dwFlags3 & DISABLEHAL){ // IID_IDirect3DHALDevice - Dark Vengeance - // this is odd: this piece of code returns the very same error code returned by the actual - // QueryInterface call, but avoid a memory corruption and makes the game working.... - // there must be something wrong behind it. - - // SEEMS FIXED NOW, NO MORE CRASHES, THIS OPTION IS USELESS - - OutTraceDW("QueryInterface: suppress IID_IDirect3DHALDevice interface res=DDERR_GENERIC\n"); - return DDERR_GENERIC; - - //GUID IID_IDirect3DRGBDevice = {0xA4665C60,0x2673,0x11CF,0xA3,0x1A,0x00,0xAA,0x00,0xB9,0x33,0x56}; - //res = (*pQueryInterfaceS)(lpdds, IID_IDirect3DRGBDevice, obp); - //OutTraceDW("QueryInterface: redirect IID_IDirect3DHALDevice to RGB interface res=%x(%s)\n", res, ExplainDDError(res)); - //return res; - - //return DD_OK; - } -#endif break; case 0xA4665C60: // IID_IDirect3DRGBDevice OutTraceDW("QueryInterface: IID_IDirect3DRGBDevice\n"); @@ -2069,7 +2050,7 @@ HRESULT WINAPI extSetCooperativeLevel(void *lpdd, HWND hwnd, DWORD dwflags) return res; } - +#ifdef DXWND_ANALYTICMODE #define FIX_FLAGSMASK (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_PIXELFORMAT|DDSD_ZBUFFERBITDEPTH|DDSD_TEXTURESTAGE) void FixSurfaceCapsAnalytic(LPDDSURFACEDESC2 lpddsd, int dxversion) @@ -2202,9 +2183,6 @@ void FixSurfaceCapsAnalytic(LPDDSURFACEDESC2 lpddsd, int dxversion) // Airline Tycoon Evolution return; break; - //case DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY|DDSCAPS_3DDEVICE: - // OutTrace("FixSurfaceCaps: ??? (Dungeon Keeper D3D)\n"); - // break; } break; case DDSD_CAPS|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT: @@ -2337,6 +2315,7 @@ void FixSurfaceCapsAnalytic(LPDDSURFACEDESC2 lpddsd, int dxversion) MessageBox(0, sMsg, "FixSurfaceCaps unmanaged setting", MB_OK | MB_ICONEXCLAMATION); } } +#endif static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) { @@ -2359,7 +2338,9 @@ static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) OutTraceDW("FixSurfaceCaps: Flags=%x(%s) Caps=%x(%s)\n", lpddsd->dwFlags, ExplainFlags(lpddsd->dwFlags), lpddsd->ddsCaps.dwCaps, ExplainDDSCaps(lpddsd->ddsCaps.dwCaps)); +#ifdef DXWND_ANALYTICMODE if(dxw.dwFlags3 & ANALYTICMODE) return FixSurfaceCapsAnalytic(lpddsd, dxversion); +#endif if((lpddsd->dwFlags & (DDSD_WIDTH|DDSD_HEIGHT)) == DDSD_WIDTH) { // buffer surface - no changes @@ -2383,12 +2364,6 @@ static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) GetPixFmt(lpddsd); return; } - //// DDSCAPS_ALLOCONLOAD on VIDEOMEMORY can't be done when HAL is disabled - it returns DDERR_NODIRECTDRAWHW error - //if((lpddsd->dwFlags & DDSD_CAPS) && - // ((lpddsd->ddsCaps.dwCaps & (DDSCAPS_TEXTURE|DDSCAPS_ALLOCONLOAD))==(DDSCAPS_TEXTURE|DDSCAPS_ALLOCONLOAD))) { - // if (dxw.dwFlags3 & FORCESHEL) lpddsd->ddsCaps.dwCaps = (DDSCAPS_TEXTURE|DDSCAPS_SYSTEMMEMORY|DDSCAPS_ALLOCONLOAD); - // return; - //} // DDSCAPS_TEXTURE surfaces must be left untouched, unless you set FORCESHEL: in this case switch VIDEOMEMORY to SYSTEMMEMORY if((lpddsd->dwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_TEXTURE)){ if (dxw.dwFlags3 & FORCESHEL) { @@ -3020,14 +2995,6 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet else OutTraceDDRAW("GetAttachedSurface(%d): attached=%x\n", dxversion, *lplpddas); -#if 0 - // beware: ddraw 7 surfaces can be created with FLIP capability, hence could have a backbuffer ??? - if((res==DDERR_NOTFOUND) && (dxversion==7) && (!IsPrim) && (!IsBack)){ - *lplpddas = lpdds; - res = DD_OK; - } -#endif - return res; } @@ -3907,7 +3874,7 @@ HRESULT WINAPI extLock(LPDIRECTDRAWSURFACE lpdds, LPRECT lprect, LPDDSURFACEDESC IsPrim=dxw.IsAPrimarySurface(lpdds); CleanRect(&lprect, __LINE__); - if(IsTraceDDRAW){ + if(IsTraceDW){ OutTrace("Lock: lpdds=%x%s flags=%x(%s) lpDDSurfaceDesc=%x", lpdds, (IsPrim ? "(PRIM)":""), flags, ExplainLockFlags(flags), lpDDSurfaceDesc); if (lprect) @@ -4038,7 +4005,18 @@ HRESULT WINAPI extUnlock(int dxversion, Unlock4_Type pUnlock, LPDIRECTDRAWSURFAC res=(*pUnlock)(lpdds, lprect); if(res==DDERR_NOTLOCKED) res=DD_OK; // ignore not locked error if (res) OutTraceE("Unlock ERROR res=%x(%s) at %d\n",res, ExplainDDError(res), __LINE__); - if (IsPrim && res==DD_OK) sBlt("Unlock", lpdds, NULL, lpdds, NULL, NULL, 0, FALSE); + if (IsPrim && res==DD_OK) { + sBlt("Unlock", lpdds, NULL, lpdds, NULL, NULL, 0, FALSE); + // v2.02.97: set dirty rect to syncronize with gdi operations. See "Deadlock II" problems... + RECT dirty; + if(lprect){ + dirty = *lprect; + dxw.MapClient(&dirty); + lprect = &dirty; + } + (*pInvalidateRect)(dxw.GethWnd(), lprect, FALSE); + } + if(dxw.dwFlags1 & SUPPRESSDXERRORS) res=DD_OK; return res; } @@ -4869,32 +4847,6 @@ HRESULT WINAPI extGetSurfaceDesc(GetSurfaceDesc_Type pGetSurfaceDesc, LPDIRECTDR lpddsd->ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; } } - -#ifdef EXPERIMENTAL_1 - if(1) { - IsFixed=TRUE; - if(lpddsd->ddsCaps.dwCaps & DDSCAPS_BACKBUFFER){ - lpddsd->dwSize = sizeof(DDSURFACEDESC2); - lpddsd->ddsCaps.dwCaps |= DDSCAPS_RESERVED2; - ((LPDDSURFACEDESC2)lpddsd)->ddsCaps.dwCaps2 = DDSCAPS2_RESERVED2; - ((LPDDSURFACEDESC2)lpddsd)->ddsCaps.dwCaps3 = 0; - } - else - if(lpddsd->ddsCaps.dwCaps & DDSCAPS_BACKBUFFER){ - } - else { - lpddsd->ddsCaps.dwCaps |= DDSCAPS_RESERVED2; - ((LPDDSURFACEDESC2)lpddsd)->ddsCaps.dwCaps2 |= DDSCAPS2_RESERVED2; - } - } -#endif -#ifdef EXPERIMENTAL_2 - if(1) { - IsFixed=TRUE; - lpddsd->ddpfPixelFormat.dwFlags |= DDPF_ALPHAPIXELS; - lpddsd->ddsCaps.dwCaps |= DDSCAPS_3DDEVICE; - } -#endif if(IsFixed) LogSurfaceAttributes(lpddsd, "GetSurfaceDesc [FIXED]", __LINE__); diff --git a/dll/dinput.cpp b/dll/dinput.cpp index 9c6971f..3d78ea3 100644 --- a/dll/dinput.cpp +++ b/dll/dinput.cpp @@ -423,21 +423,6 @@ HRESULT WINAPI extDeviceProxy(LPCDIDEVICEINSTANCE dev, LPVOID arg) dev->dwSize, p, dev->guidInstance.Data1, dev->guidInstance.Data2, dev->guidInstance.Data3, dev->guidInstance.Data4, dev->dwDevType, dev->tszInstanceName, dev->tszProductName); -#if 0 - if(0){ - DIDEVICEINSTANCEW fixdev; - fixdev.dwSize=sizeof(DIDEVICEINSTANCEW); - fixdev.dwDevType=dev->dwDevType; - fixdev.guidInstance=dev->guidInstance; - fixdev.guidProduct=dev->guidProduct; - mbstowcs(fixdev.tszInstanceName, dev->tszInstanceName, strlen(dev->tszInstanceName)); - mbstowcs(fixdev.tszProductName, dev->tszProductName, strlen(dev->tszProductName)); - res = ((LPDIENUMDEVICESCALLBACKW)(((CallbackArg *)arg)->cb))(&fixdev, ((CallbackArg *)arg)->arg); - OutTraceDW("EnumDevices: CALLBACK ret=%x\n", res); - return res; - } -#endif - res = (*(((CallbackArg *)arg)->cb))(dev, ((CallbackArg *)arg)->arg); OutTraceDW("EnumDevices: CALLBACK ret=%x\n", res); return res; diff --git a/dll/dxemublt.cpp b/dll/dxemublt.cpp index fd1edb6..790ee32 100644 --- a/dll/dxemublt.cpp +++ b/dll/dxemublt.cpp @@ -5,6 +5,8 @@ #include "dxwcore.hpp" #include "hddraw.h" +//#define USEOPENMP + typedef HRESULT (WINAPI *Lock_Type)(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); typedef HRESULT (WINAPI *Unlock4_Type)(LPDIRECTDRAWSURFACE, LPRECT); typedef HRESULT (WINAPI *Unlock1_Type)(LPDIRECTDRAWSURFACE, LPVOID); @@ -24,7 +26,6 @@ extern int Set_dwSize_From_Surface(LPDIRECTDRAWSURFACE); #define MARKBLITCOLOR32 0x00FFFF00 #define MARKBLITCOLOR16 0x0FF0 EmuBlt_Type pEmuBlt; -RevBlt_Type pRevBlt; PrimaryBlt_Type pPrimaryBlt; extern Blt_Type pBlt; @@ -143,7 +144,7 @@ static HRESULT WINAPI EmuBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdest DWORD *dest, *dest0; DDSURFACEDESC2 ddsd_src, ddsd_dst; long srcpitch, destpitch; - DWORD x, y, w, h; + int x, y, w, h; w = lpdestrect->right - lpdestrect->left; h = lpdestrect->bottom - lpdestrect->top; @@ -210,11 +211,11 @@ static HRESULT WINAPI BilinearBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT l LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; - BYTE *src8; + BYTE *src8, *src0; DWORD *dest, *dest0; DDSURFACEDESC2 ddsd_src, ddsd_dst; long srcpitch, destpitch; - DWORD x, y, w, h; + int w, h; w = lpdestrect->right - lpdestrect->left; h = lpdestrect->bottom - lpdestrect->top; @@ -263,17 +264,29 @@ static HRESULT WINAPI BilinearBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT l src8 += (lpsrcrect->top >> 1)*ddsd_src.lPitch; src8 += (lpsrcrect->left >> 1); srcpitch = ddsd_src.lPitch - w; + src0 = src8; // 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 .... +#ifdef USEOPENMP +#pragma omp parallel for schedule(static) +#endif + for(int y = 0; y < h; y ++){ register DWORD Q1, Q2, Q3, Q4, Q5; + src8 = src0 + (y * ddsd_src.lPitch); + dest = dest0 + ((y * ddsd_dst.lPitch) << 1); Q5 = Melt32(PaletteEntries[*(src8)], PaletteEntries[*(src8+ddsd_src.lPitch)]); - for(x = 0; x < w; x ++){ + for(int 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); + if(y == h-1){ + Q3 = Q1; + Q4 = Q2; + } + else{ + 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; @@ -282,21 +295,7 @@ static HRESULT WINAPI BilinearBlt_8_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT l 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 = 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, 2*w, 2*h, destpitch); @@ -385,11 +384,11 @@ static HRESULT WINAPI BilinearBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; - WORD *src16; + WORD *src16, *src0; DWORD *dest, *dest0; DDSURFACEDESC2 ddsd_src, ddsd_dst; long srcpitch, destpitch; - DWORD x, y, w, h; + int w, h; w = lpdestrect->right - lpdestrect->left; h = lpdestrect->bottom - lpdestrect->top; @@ -439,20 +438,31 @@ static HRESULT WINAPI BilinearBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT src16 += (lpsrcrect->top >> 1)*ddsd_src.lPitch; src16 += (lpsrcrect->left >> 1); srcpitch = ddsd_src.lPitch - w; + src0 = src16; 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 .... +#ifdef USEOPENMP +#pragma omp parallel for schedule(static) +#endif + for(int y = 0; y < h; y ++){ register DWORD Q1, Q2, Q3, Q4, Q5; + src16 = src0 + (y * ddsd_src.lPitch); + dest = dest0 + ((y * ddsd_dst.lPitch) << 1); Q5 = Melt32(Palette16BPP[*(src16)], Palette16BPP[*(src16+ddsd_src.lPitch)]); - for(x = 0; x < w; x ++){ + for(int 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); - + if(y == h-1){ + Q3 = Q1; + Q4 = Q2; + } + else{ + 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; @@ -460,21 +470,7 @@ static HRESULT WINAPI BilinearBlt_16_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT 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, 2*w, 2*h, destpitch); @@ -710,11 +706,11 @@ static HRESULT WINAPI BilinearBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT l LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; - BYTE *src8; + BYTE *src8, *src0; SHORT *dest, *dest0; DDSURFACEDESC2 ddsd_src, ddsd_dst; long srcpitch, destpitch; - DWORD x, y, w, h; + int w, h; typedef DWORD (*Melt16_Type)(DWORD, DWORD); Melt16_Type Melt16; @@ -767,18 +763,29 @@ static HRESULT WINAPI BilinearBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT l src8 += (lpsrcrect->top >> 1)*ddsd_src.lPitch; src8 += (lpsrcrect->left >> 1); srcpitch = ddsd_src.lPitch - w; + src0 = src8; // 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 .... +#ifdef USEOPENMP +#pragma omp parallel for schedule(static) +#endif + for(int y = 0; y < h; y ++){ register DWORD Q1, Q2, Q3, Q4, Q5; + src8 = src0 + (y * ddsd_src.lPitch); + dest = dest0 + ((y * ddsd_dst.lPitch) << 1); Q5 = Melt16(PaletteEntries[*(src8)], PaletteEntries[*(src8+ddsd_src.lPitch)]); - for(x = 0; x < w; x ++){ + for(int 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); - + if(y == h-1){ + Q3 = Q1; + Q4 = Q2; + } + else{ + 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; @@ -786,21 +793,7 @@ static HRESULT WINAPI BilinearBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT l 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, 2*w, 2*h, destpitch); @@ -814,23 +807,117 @@ static HRESULT WINAPI BilinearBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT l static HRESULT WINAPI EmuBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { -#ifdef DXWNDDIRECTBLITTING +#if 0 return (*pBlt)(lpddsdst, lpdestrect, lpddssrc, lpsrcrect, dwflags, NULL); -#else - OutTraceDW("EmuBlt_16_to_16: UNSUPPORTED\n"); - return -1; #endif + HRESULT res; + SHORT *src16; + SHORT *dest, *dest0; + DDSURFACEDESC2 ddsd_src, ddsd_dst; + long srcpitch, destpitch; + DWORD x, y, w, h; + BOOL is555src, is555dst; + + w = lpdestrect->right - lpdestrect->left; + h = lpdestrect->bottom - lpdestrect->top; + + 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("EmuBlt16_16: 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("EmuBlt16_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("EmuBlt16_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 - w; + dest0 = dest; + is555dst = (ddsd_dst.ddpfPixelFormat.dwGBitMask == 0x3E0); + + ddsd_src.lPitch >>= 1; + src16 = (SHORT *)lpsurface; + src16 += lpsrcrect->top*ddsd_src.lPitch; + src16 += lpsrcrect->left; + srcpitch = ddsd_src.lPitch - w; + is555src = (ddsd_dst.ddpfPixelFormat.dwGBitMask == 0x3E0); + + // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src8,dest,srcpitch,destpitch); + if (is555dst == is555src){ + for(y = 0; y < h; y ++){ + // copy one whole pixel line at a time.... + memcpy(dest, src16, w<<1); + dest += (w + destpitch); + src16 += (w + srcpitch); + } + } + else { + if(is555dst){ + for(y = 0; y < h; y ++){ + for(x = 0; x < w; x ++){ + SHORT pi; + pi = *(src16 ++); + pi = (pi & 0x1F) | (pi & 0x7C0)>>1 | (pi & 0xF800)>>1; + *(dest ++) = pi; + } + dest += destpitch; + src16 += srcpitch; + } + } + else { + for(y = 0; y < h; y ++){ + for(x = 0; x < w; x ++){ + SHORT pi; + pi = *(src16 ++); + pi = (pi & 0x1F) | (pi & 0x3E0)<<1 | (pi & 0x7C00)<<1; + *(dest ++) = pi; + } + dest += destpitch; + src16 += srcpitch; + } + } + } + + if(dxw.dwFlags3 & MARKBLIT) MarkRect16(dest0, w, h, destpitch); + + res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); + if (res) OutTraceE("EmuBlt16_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); + res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); + if (res) OutTraceE("EmuBlt16_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); + return res; } static HRESULT WINAPI BilinearBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) { HRESULT res; - WORD *src16; + WORD *src16, *src0; WORD *dest, *dest0; DDSURFACEDESC2 ddsd_src, ddsd_dst; long srcpitch, destpitch; - DWORD x, y, w, h; + int w, h; typedef DWORD (*Melt16_Type)(DWORD, DWORD); Melt16_Type Melt16; @@ -884,18 +971,29 @@ static HRESULT WINAPI BilinearBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT src16 += (lpsrcrect->top >> 1)*ddsd_src.lPitch; src16 += (lpsrcrect->left >> 1); srcpitch = ddsd_src.lPitch - w; + src0 = src16; // 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 .... +#ifdef USEOPENMP +#pragma omp parallel for schedule(static) +#endif + for(int y = 0; y < h; y ++){ register DWORD Q1, Q2, Q3, Q4, Q5; + src16 = src0 + (y * ddsd_src.lPitch); + dest = dest0 + ((y * ddsd_dst.lPitch) << 1); Q5 = Melt16(*(src16), *(src16+ddsd_src.lPitch)); - for(x = 0; x < w; x ++){ + for(int 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); - + if(y == h-1){ + Q3 = Q1; + Q4 = Q2; + } + else{ + 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; @@ -903,21 +1001,7 @@ static HRESULT WINAPI BilinearBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT 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, 2*w, 2*h, destpitch); @@ -1131,7 +1215,7 @@ static HRESULT WINAPI BilinearBlt_32_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT 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 ++){ register DWORD Q1, Q2, Q3, Q4, Q5; Q5 = Melt32(*(src32), *(src32+ddsd_src.lPitch)); for(x = 0; x < w; x ++){ @@ -1182,335 +1266,6 @@ static HRESULT WINAPI EmuBlt_Null(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrec return -1; } -//--------------------------------------------------------------------------------------------// -// Reverse blitting procedure: fills a 8BPP paletized surface from the content of a 32BPP one. -//--------------------------------------------------------------------------------------------// -#define REVPAL32SIZE 0x01000000 -#define REVPAL32MASK 0x00FFFFFF -#define REVPAL16SIZE 0x00010000 -#define REVPAL16MASK 0x0000FFFF - -// GetMatchingPaletteEntry: retrieves the best matching palette entry close to the given -// input color crColor by using a minimum quadratic distance algorithm on each of the 3 -// RGB color components. - -static int GetMatchingPaletteEntry32(DWORD crColor) -{ - int iDistance, iMinDistance; - int iColorIndex, iComponentIndex, iMinColorIndex; - DWORD PalColor, TargetColor; - - iMinDistance=0xFFFFFF; - iMinColorIndex=0; - - // for each palette entry - for(iColorIndex=0; iColorIndex<256; iColorIndex++){ - int iDist; - iDistance=0; - PalColor=PaletteEntries[iColorIndex]; - TargetColor=crColor; - // for each of the R,G,B color components - for (iComponentIndex=0; iComponentIndex<3; iComponentIndex++){ - iDist = (TargetColor & 0xFF) - (PalColor & 0xFF); - iDist *= iDist; - iDistance += iDist; - PalColor >>= 8; - TargetColor >>= 8; - } - - if (iDistance < iMinDistance) { - iMinDistance = iDistance; - iMinColorIndex = iColorIndex; - } - - if (iMinDistance==0) break; // got the perfect match! - } - OutTraceDW("GetMatchingPaletteEntry32: color=%x matched with palette[%d]=%x dist=%d\n", - crColor, iMinColorIndex, PaletteEntries[iMinColorIndex], iDistance); - - return iMinColorIndex; -} - -static int GetMatchingPaletteEntry16(DWORD crColor) -{ - int iDistance, iMinDistance; - int iColorIndex, iComponentIndex, iMinColorIndex; - DWORD PalColor, TargetColor; - - iMinDistance=0xFFFFFF; - iMinColorIndex=0; - - // for each palette entry - for(iColorIndex=0; iColorIndex<256; iColorIndex++){ - int iDist; - iDistance=0; - PalColor=PaletteEntries[iColorIndex]; - TargetColor=crColor; - // for each of the R,G,B color components - for (iComponentIndex=0; iComponentIndex<3; iComponentIndex++){ - iDist = (TargetColor & 0x1F) - (PalColor & 0x1F); - iDist *= iDist; - iDistance += iDist; - PalColor >>= 5; - TargetColor >>= 5; - } - - if (iDistance < iMinDistance) { - iMinDistance = iDistance; - iMinColorIndex = iColorIndex; - } - - if (iMinDistance==0) break; // got the perfect match! - } - OutTraceDW("GetMatchingPaletteEntry: color=%x matched with palette[%d]=%x dist=%d\n", - crColor, iMinColorIndex, PaletteEntries[iMinColorIndex], iDistance); - - return iMinColorIndex; -} - -// this is a real trick: since all 256 possible values of each PaletteRev32BPP entry are valid, -// there is no way to tell whether the entry is valid or not. In theory, you should add a separate -// status field to track this thing, but that would at least double the used space (REVPAL32SIZE bytes). -// So an alternate solution is to pretend that a particular (random) value means the entry in unassigned: -// this implies thet even if the entry is properly set, the RevBlt procedure will search for a -// matching color anyway. So better avoid for this purpose any frequently used value: I would suggest to -// eliminate 0x00 and 0xFF. 0xF0 seems a god candidate, but any other randomly chosen value would -// probably be. - -#define PALENTRY_FREE 0x1 -#define PALENTRY_BUSY 0x0 -//#define RANDOMENTRY 0xAA - -static HRESULT WINAPI RevBlt_32_to_8(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) -{ - HRESULT res; - BYTE *src8; - DWORD *dest; - DDSURFACEDESC2 ddsd_src, ddsd_dst; - long srcpitch, destpitch; - DWORD x, y, w, h; - static BYTE *PaletteRev32BPP = NULL; - static BYTE *PaletteFlags = NULL; - int pi; - - OutTraceDW("RevBlt32_8: src=%x dst=%d\n", lpddssrc, lpddsdst); - - w = lpdestrect->right - lpdestrect->left; - h = lpdestrect->bottom - lpdestrect->top; - - 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("RevBlt32_8: 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(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ - OutTraceE("RevBlt32_8: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - - ddsd_dst.lPitch >>= 2; - dest = (DWORD *)ddsd_dst.lpSurface; - dest += lpdestrect->top*ddsd_dst.lPitch; - dest += lpdestrect->left; - destpitch = ddsd_dst.lPitch - w; - - src8 = (BYTE *)ddsd_src.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); - if (!PaletteRev32BPP) { // first time through ..... - PaletteRev32BPP = (BYTE *)malloc(REVPAL32SIZE); - PaletteFlags = (BYTE *)malloc(REVPAL32SIZE); - } - - extern BOOL isPaletteUpdated; - if (isPaletteUpdated){ - isPaletteUpdated=FALSE; // do this just once per palette - memset(PaletteFlags, PALENTRY_FREE, REVPAL32SIZE); // necessary in build->release mode - for (pi=0; pi<256; pi++){ - int RevIndex=PaletteEntries[pi] & REVPAL32MASK; - PaletteRev32BPP[RevIndex]=pi; - PaletteFlags[RevIndex]=PALENTRY_BUSY; - } - } - - for(y = 0; y < h; y ++){ - for(x = 0; x < w; x ++){ - int RevIndex = *dest++ & REVPAL32MASK; - if(PaletteFlags[RevIndex]==PALENTRY_FREE){ - PaletteRev32BPP[RevIndex]=GetMatchingPaletteEntry32(RevIndex); - PaletteFlags[RevIndex]=PALENTRY_BUSY; - } - *(src8 ++)= (BYTE)PaletteRev32BPP[RevIndex]; - } - dest += destpitch; - src8 += srcpitch; - } - - res=(*pUnlockMethod(lpddsdst))(lpddsdst,lpdestrect); - if (res) OutTraceE("RevBlt32_8: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); - if (res) OutTraceE("RevBlt32_8: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); - return res; -} - -static HRESULT WINAPI RevBlt_32_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) -{ - HRESULT res; - WORD *src16; - DWORD *dest; - DDSURFACEDESC2 ddsd_src, ddsd_dst; - long srcpitch, destpitch; - DWORD x, y, w, h; - - OutTraceDW("RevBlt32_16: src=%x dst=%d\n", lpddssrc, lpddsdst); - - w = lpdestrect->right - lpdestrect->left; - h = lpdestrect->bottom - lpdestrect->top; - - 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("RevBlt32_16: 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(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ - OutTraceE("RevBlt32_16: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - - ddsd_dst.lPitch >>= 2; - dest = (DWORD *)ddsd_dst.lpSurface; - dest += lpdestrect->top*ddsd_dst.lPitch; - dest += lpdestrect->left; - destpitch = ddsd_dst.lPitch - w; - - ddsd_src.lPitch >>= 1; - src16 = (WORD *)ddsd_src.lpSurface; - src16 += lpsrcrect->top*ddsd_src.lPitch; - src16 += lpsrcrect->left; - srcpitch = ddsd_src.lPitch - w; - - for(y = 0; y < h; y ++){ - for(x = 0; x < w; x ++){ - *(src16 ++)= (WORD)*(dest++) & 0xFFFF; // wrong, but visible..... - } - dest += destpitch; - src16 += srcpitch; - } - - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - if (res) OutTraceE("RevBlt32_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); - if (res) OutTraceE("RevBlt32_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); - return res; -} - -static HRESULT WINAPI RevBlt_16_to_8(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) -{ - HRESULT res; - BYTE *src8; - USHORT *dest16; - DDSURFACEDESC2 ddsd_src, ddsd_dst; - long srcpitch, destpitch; - DWORD x, y, w, h; - static BYTE *PaletteRev16BPP = NULL; - static BYTE *PaletteFlags = NULL; - int pi; - - OutTraceDW("RevBlt16_8: src=%x dst=%d\n", lpddssrc, lpddsdst); - - w = lpdestrect->right - lpdestrect->left; - h = lpdestrect->bottom - lpdestrect->top; - - 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("RevBlt16_8: 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(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_WRITEONLY|DDLOCK_WAIT, 0)){ - OutTraceE("RevBlt16_8: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - - ddsd_dst.lPitch >>= 1; - dest16 = (USHORT *)ddsd_dst.lpSurface; - dest16 += lpdestrect->top*ddsd_dst.lPitch; - dest16 += lpdestrect->left; - destpitch = ddsd_dst.lPitch - w; - - src8 = (BYTE *)ddsd_src.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); - if (!PaletteRev16BPP) { // first time through ..... - PaletteRev16BPP = (BYTE *)malloc(REVPAL16SIZE); - PaletteFlags = (BYTE *)malloc(REVPAL16SIZE); - } - - extern BOOL isPaletteUpdated; - if (isPaletteUpdated){ - isPaletteUpdated=FALSE; // do this just once per palette - memset(PaletteRev16BPP, PALENTRY_FREE, REVPAL16SIZE); // necessary in build->release mode - for (pi=0; pi<256; pi++){ - int RevIndex=PaletteEntries[pi] & REVPAL16MASK; - PaletteRev16BPP[RevIndex]=pi; - PaletteFlags[RevIndex]=PALENTRY_BUSY; - } - } - - for(y = 0; y < h; y ++){ - for(x = 0; x < w; x ++){ - int RevIndex = *dest16++ & REVPAL16MASK; - if(PaletteFlags[RevIndex]==PALENTRY_FREE){ - PaletteRev16BPP[RevIndex]=GetMatchingPaletteEntry16(RevIndex); - PaletteFlags[RevIndex]=PALENTRY_BUSY; - } - *(src8 ++)= (BYTE)PaletteRev16BPP[RevIndex]; - } - dest16 += destpitch; - src8 += srcpitch; - } - - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - if (res) OutTraceE("RevBlt16_8: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); - if (res) OutTraceE("RevBlt16_8: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); - return res; -} - -static HRESULT WINAPI RevBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) -{ - return (*pBlt)(lpddsdst, lpdestrect, lpddssrc, lpsrcrect, 0, NULL); -} - -static HRESULT WINAPI RevBlt_Null(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect) -{ - OutTraceE("EmuBlt: undefined color depth\n"); - return -1; -} - //--------------------------------------------------------------------------------------------// // exported methods //--------------------------------------------------------------------------------------------// @@ -1521,26 +1276,22 @@ void SetBltTransformations() dxw.VirtualPixelFormat.dwRGBBitCount, dxw.ActualPixelFormat.dwRGBBitCount); /* default (bad) setting */ - pRevBlt=RevBlt_Null; pEmuBlt=EmuBlt_Null; switch (dxw.ActualPixelFormat.dwRGBBitCount){ case 32: switch(dxw.VirtualPixelFormat.dwRGBBitCount){ case 8: - pRevBlt=RevBlt_32_to_8; pEmuBlt=EmuBlt_8_to_32; if(dxw.dwFlags4 & BILINEAR2XFILTER) pEmuBlt=BilinearBlt_8_to_32; OutTraceDW("set color transformation 8<->32\n"); break; case 16: - pRevBlt=RevBlt_32_to_16; pEmuBlt=EmuBlt_16_to_32; if(dxw.dwFlags4 & BILINEAR2XFILTER) pEmuBlt=BilinearBlt_16_to_32; OutTraceDW("set color transformation 16<->32\n"); break; case 24: - //pRevBlt=RevBlt_24_to_32; pEmuBlt=EmuBlt_24_to_32; OutTraceDW("set color transformation 24->32\n"); break; @@ -1557,19 +1308,16 @@ void SetBltTransformations() case 16: switch(dxw.VirtualPixelFormat.dwRGBBitCount){ case 8: - pRevBlt=RevBlt_16_to_8; pEmuBlt=EmuBlt_8_to_16; if(dxw.dwFlags4 & BILINEAR2XFILTER) 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 & BILINEAR2XFILTER) pEmuBlt=BilinearBlt_16_to_16; OutTraceDW("set color transformation 16<->16\n"); break; case 24: - //pRevBlt=RevBlt_24_to_16; pEmuBlt=EmuBlt_24_to_16; OutTraceDW("set color transformation 24<->16\n"); break; diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 49de4e2..befd72d 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -1776,7 +1776,6 @@ void HookLibrary(HMODULE hModule, HookEntry_Type *Hooks, char *DLLName) ((dxw.dwFlags4 & HOTPATCHALWAYS) && (Hooks->HookStatus != HOOK_HOT_LINKED))) // force hot patch and not already hooked && Hooks->StoreAddress){ // and save ptr available -#if 1 // Hot Patch - beware! This way yo're likely to hook unneeded libraries. if(!Hooks->OriginalAddress) { if(!hDLL) { @@ -1792,9 +1791,6 @@ void HookLibrary(HMODULE hModule, HookEntry_Type *Hooks, char *DLLName) continue; } } -#else - if(!Hooks->OriginalAddress) continue; -#endif remapped_addr = HotPatch(Hooks->OriginalAddress, Hooks->APIName, Hooks->HookerAddress); if(remapped_addr == (void *)1) { // should never go here ... Hooks->HookStatus = HOOK_HOT_LINKED; diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 0c3cb76..e79b926 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -50,9 +50,9 @@ public: // methods void FixNCHITCursorPos(LPPOINT); void SetClipCursor(void); void EraseClipCursor(void); - RECT MapWindowRect(LPRECT lpRect); + RECT MapWindowRect(LPRECT); RECT MapWindowRect(void); - RECT MapClientRect(LPRECT lpRect); + RECT MapClientRect(LPRECT); void MapClient(LPPOINT); void MapClient(LPRECT); void MapClient(int *, int *, int *, int *); diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 6e04000..6b2252a 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.96" +#define VERSION "2.02.97" #define DXWACTIVATESINGLETASK 1 // comment to allow multiple task activations #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index b25e8f2e053c7acfc675d65d5e48999bbb2aa950..4fa8bd309135345414c6883a3218f749a3b53b8a 100644 GIT binary patch delta 22280 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 Rk6{(`|MWE`CAhKe{{mD4Zn*#e delta 14921 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 diff --git a/dll/hd3d7.cpp b/dll/hd3d7.cpp index ab93e1f..d5c45b0 100644 --- a/dll/hd3d7.cpp +++ b/dll/hd3d7.cpp @@ -101,6 +101,8 @@ SetTexture7_Type pSetTexture7 = NULL; typedef HRESULT (WINAPI *InitializeVP_Type)(void *, LPDIRECT3D); typedef HRESULT (WINAPI *SetViewport_Type)(void *, LPD3DVIEWPORT); +typedef HRESULT (WINAPI *SetMaterial_Type)(void *, LPD3DMATERIAL); +typedef HRESULT (WINAPI *GetMaterial_Type)(void *, LPD3DMATERIAL); typedef HRESULT (WINAPI *GetViewport_Type)(void *, LPD3DVIEWPORT); typedef HRESULT (WINAPI *GetViewport2_Type)(void *, LPD3DVIEWPORT); typedef HRESULT (WINAPI *SetViewport2_Type)(void *, LPD3DVIEWPORT); @@ -115,6 +117,8 @@ typedef HRESULT (WINAPI *NextViewport2_Type)(void *, LPDIRECT3DVIEWPORT2, LPDIRE InitializeVP_Type pInitializeVP = NULL; SetViewport_Type pSetViewport = NULL; +SetMaterial_Type pSetMaterial = NULL; +GetMaterial_Type pGetMaterial = NULL; GetViewport_Type pGetViewport = NULL; GetViewport2_Type pGetViewport2 = NULL; SetViewport2_Type pSetViewport2 = NULL; @@ -148,6 +152,8 @@ HRESULT WINAPI extNextViewport2(void *, LPDIRECT3DVIEWPORT2, LPDIRECT3DVIEWPORT2 HRESULT WINAPI extInitializeVP(void *, LPDIRECT3D); HRESULT WINAPI extSetViewport(void *, LPD3DVIEWPORT); HRESULT WINAPI extGetViewport(void *, LPD3DVIEWPORT); +HRESULT WINAPI extSetMaterial(void *, LPD3DMATERIAL); +HRESULT WINAPI extGetMaterial(void *, LPD3DMATERIAL); HRESULT WINAPI extQueryInterfaceD3(void *, REFIID, LPVOID *); HRESULT WINAPI extD3DInitialize(void *, LPDIRECT3D , LPGUID, LPD3DDEVICEDESC); @@ -185,6 +191,7 @@ HRESULT WINAPI extSetTexture3(void *, DWORD, LPDIRECT3DTEXTURE2); HRESULT WINAPI extSetTexture7(void *, DWORD, LPDIRECTDRAWSURFACE7); extern char *ExplainDDError(DWORD); +int GD3DDeviceVersion; int HookDirect3D7(HMODULE module, int version){ void *tmp; @@ -288,6 +295,7 @@ void HookDirect3DSession(LPDIRECTDRAW *lplpdd, int d3dversion) void HookDirect3DDevice(void **lpd3ddev, int d3dversion) { OutTraceD3D("HookDirect3DDevice: d3ddev=%x d3dversion=%d\n", lpd3ddev, d3dversion); + GD3DDeviceVersion = d3dversion; switch(d3dversion){ case 1: @@ -425,6 +433,22 @@ void HookViewport(LPDIRECT3DVIEWPORT *lpViewport, int d3dversion) } } +void HookMaterial(LPDIRECT3DMATERIAL *lpMaterial, int d3dversion) +{ + OutTraceD3D("HookMaterial: Material=%x d3dversion=%d\n", *lpMaterial, d3dversion); + + switch(d3dversion){ + case 1: + SetHook((void *)(**(DWORD **)lpMaterial + 16), extSetMaterial, (void **)&pSetMaterial, "SetMaterial"); + SetHook((void *)(**(DWORD **)lpMaterial + 20), extGetMaterial, (void **)&pGetMaterial, "GetMaterial"); + break; + default: + SetHook((void *)(**(DWORD **)lpMaterial + 12), extSetMaterial, (void **)&pSetMaterial, "SetMaterial"); + SetHook((void *)(**(DWORD **)lpMaterial + 16), extGetMaterial, (void **)&pGetMaterial, "GetMaterial"); + break; + } +} + HRESULT WINAPI extQueryInterfaceD3(void *lpd3d, REFIID riid, LPVOID *ppvObj) { HRESULT res; @@ -605,6 +629,7 @@ HRESULT WINAPI extCreateMaterial(void *lpd3d, LPDIRECT3DMATERIAL *lpMaterial, IU res=(*pCreateMaterial)(lpd3d, lpMaterial, p0); if(res) OutTraceE("CreateMaterial ERROR: err=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); else OutTraceD3D("CreateMaterial: OK\n"); + HookMaterial(lpMaterial, GD3DDeviceVersion); return res; } @@ -1240,3 +1265,42 @@ HRESULT WINAPI extSetTexture7(void *d3dd, DWORD flags, LPDIRECTDRAWSURFACE7 lpte OutTraceD3D("SetTexture7: d3dd=%x, flags=%x, tex=%x res=%x\n", d3dd, flags, lptex, res); return res; } + +HRESULT WINAPI extSetMaterial(void *d3dd, LPD3DMATERIAL lpMaterial) +{ + HRESULT res; + + OutTraceD3D("SetMaterial: d3dd=%x, material=%x\n", d3dd, lpMaterial); + if(lpMaterial && IsDebug){ + OutTraceD3D("Material: Size=%d Texture=%x diffuse=(%f,%f,%f,%f) ambient=(%f,%f,%f,%f) specular=(%f,%f,%f,%f) emissive=(%f,%f,%f,%f) power=%f\n", + lpMaterial->dwSize, lpMaterial->hTexture, + lpMaterial->diffuse.a, lpMaterial->diffuse.r, lpMaterial->diffuse.g, lpMaterial->diffuse.b, + lpMaterial->ambient.a, lpMaterial->ambient.r, lpMaterial->ambient.g, lpMaterial->ambient.b, + lpMaterial->specular.a, lpMaterial->specular.r, lpMaterial->specular.g, lpMaterial->specular.b, + lpMaterial->emissive.a, lpMaterial->emissive.r, lpMaterial->emissive.g, lpMaterial->emissive.b, + lpMaterial->power + ); + } + res=(*pSetMaterial)(d3dd, lpMaterial); + if(res) OutTraceD3D("SetMaterial: ERROR res=%x\n", res); + return res; +} + +HRESULT WINAPI extGetMaterial(void *d3dd, LPD3DMATERIAL lpMaterial) +{ + HRESULT res; + + res=(*pGetMaterial)(d3dd, lpMaterial); + OutTraceD3D("GetMaterial: d3dd=%x, material=%x res=%x\n", d3dd, lpMaterial, res); + if(lpMaterial && IsDebug && (res==DD_OK)){ + OutTraceD3D("Material: Size=%d diffuse=(%f,%f,%f,%f) ambient=(%f,%f,%f,%f) specular=(%f,%f,%f,%f) emissive=(%f,%f,%f,%f) power=%f\n", + lpMaterial->dwSize, + lpMaterial->diffuse.a, lpMaterial->diffuse.r, lpMaterial->diffuse.g, lpMaterial->diffuse.b, + lpMaterial->ambient.a, lpMaterial->ambient.r, lpMaterial->ambient.g, lpMaterial->ambient.b, + lpMaterial->specular.a, lpMaterial->specular.r, lpMaterial->specular.g, lpMaterial->specular.b, + lpMaterial->emissive.a, lpMaterial->emissive.r, lpMaterial->emissive.g, lpMaterial->emissive.b, + lpMaterial->power + ); + } + return res; +} diff --git a/dll/user32.cpp b/dll/user32.cpp index 5c6e848..46141d7 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -590,17 +590,7 @@ LONG WINAPI extSetWindowLong(HWND hwnd, int nIndex, LONG dwNewLong, SetWindowLon if(dxw.dwFlags1 & LOCKWINSTYLE){ if(nIndex==GWL_STYLE){ OutTraceDW("SetWindowLong: Lock GWL_STYLE=%x\n", dwNewLong); -#if 1 return (*pGetWindowLongA)(hwnd, nIndex); -#else - dwNewLong = (*pGetWindowLongA)(hwnd, nIndex); - if ((dxw.dwFlags1 & FIXWINFRAME) && !(dwNewLong & WS_CHILD) /*&& dxw.IsDesktop(hwnd)*/){ - OutTraceDW("SetWindowLong: GWL_STYLE %x force OVERLAPPEDWINDOW\n", dwNewLong); - dwNewLong |= WS_OVERLAPPEDWINDOW; - dwNewLong &= ~WS_CLIPSIBLINGS; - } - return dwNewLong; -#endif } if(nIndex==GWL_EXSTYLE){ OutTraceDW("SetWindowLong: Lock GWL_EXSTYLE=%x\n", dwNewLong); @@ -833,21 +823,6 @@ BOOL WINAPI extGetCursorPos(LPPOINT lppoint) *lppoint=dxw.ScreenToClient(*lppoint); *lppoint=dxw.FixCursorPos(*lppoint); -#if 0 - if(dxw.dwFlags4 & FRAMECOMPENSATION){ - static int dx, dy, todo=TRUE; - if (todo){ - 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; - } -#endif - GetHookInfo()->CursorX=(short)lppoint->x; GetHookInfo()->CursorY=(short)lppoint->y; OutTraceC("GetCursorPos: FIXED pos=(%d,%d)->(%d,%d)\n", prev.x, prev.y, lppoint->x, lppoint->y); @@ -919,46 +894,6 @@ BOOL WINAPI extPeekMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT wMsg { BOOL res; -#if 0 - UINT bRemoveMsg = (wRemoveMsg & 0x000F); - UINT message; - - do{ - res=(*pPeekMessage)(lpMsg, hwnd, 0, 0, bRemoveMsg); - if(!res) break; // no message available - - OutTraceW("PeekMessage: GOT lpmsg=%x hwnd=%x filter=(%x-%x) remove=%x(%s) msg=%x(%s) wparam=%x, lparam=%x pt=(%d,%d) res=%x\n", - lpMsg, lpMsg->hwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg), - lpMsg->message, ExplainWinMessage(lpMsg->message & 0xFFFF), - lpMsg->wParam, lpMsg->lParam, lpMsg->pt.x, lpMsg->pt.y, res); - - message = lpMsg->message; - if(res &&(dxw.dwFlags3 & FILTERMESSAGES)){ // filter offending messages - switch(message){ - case WM_NCMOUSEMOVE: - case WM_NCLBUTTONDOWN: - case WM_NCLBUTTONUP: - case WM_NCLBUTTONDBLCLK: - case WM_NCRBUTTONDOWN: - case WM_NCRBUTTONUP: - case WM_NCRBUTTONDBLCLK: - case WM_NCMBUTTONDOWN: - case WM_NCMBUTTONUP: - case WM_NCMBUTTONDBLCLK: - OutTraceDW("WindowProc[%x]: SUPPRESS WinMsg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), lpMsg->wParam, lpMsg->lParam); - if(!bRemoveMsg) (*pPeekMessage)(lpMsg, hwnd, message, message, TRUE); - continue; - } - } - if((wMsgFilterMin==0) && (wMsgFilterMax == 0)) break; // no filtering, everything is good - if((message < wMsgFilterMin) || (message > wMsgFilterMax)){ - OutTraceDW("WindowProc[%x]: SUPPRESS WinMsg=[0x%x]%s(%x,%x)\n", hwnd, message, ExplainWinMessage(message), lpMsg->wParam, lpMsg->lParam); - if(!bRemoveMsg) (*pPeekMessage)(lpMsg, hwnd, message, message, TRUE); - continue; // skip this one .... - } - } while(FALSE); -#endif - if((wMsgFilterMin==0) && (wMsgFilterMax == 0)){ // no filtering, everything is good res=(*pPeekMessage)(lpMsg, hwnd, wMsgFilterMin, wMsgFilterMax, (wRemoveMsg & 0x000F)); @@ -972,12 +907,6 @@ BOOL WINAPI extPeekMessage(LPMSG lpMsg, HWND hwnd, UINT wMsgFilterMin, UINT wMsg if(wMsgFilterMaxhwnd, wMsgFilterMin, wMsgFilterMax, wRemoveMsg, ExplainPeekRemoveMsg(wRemoveMsg), diff --git a/dll/winmm.cpp b/dll/winmm.cpp index c23e5ed..d7923b4 100644 --- a/dll/winmm.cpp +++ b/dll/winmm.cpp @@ -157,18 +157,6 @@ MCIERROR WINAPI extmciSendStringA(LPCTSTR lpszCommand, LPTSTR lpszReturnString, MCIERROR ret; if(IsWithinMCICall) return(*pmciSendStringA)(lpszCommand, lpszReturnString, cchReturn, hwndCallback); // just proxy ... OutTraceDW("mciSendStringA: Command=\"%s\" Return=%x Callback=%x\n", lpszCommand, cchReturn, hwndCallback); -#ifdef WFSPONLY - char *target="put movie destination at "; - if(!strncmp(lpszCommand, target, strlen(target))) { - char NewCommand[256]; - RECT rect; - sscanf(&lpszCommand[strlen(target)], "%ld %ld %ld %ld", &(rect.left), &(rect.top), &(rect.right), &(rect.bottom)); - rect=dxw.MapClientRect(&rect); - sprintf(NewCommand, "put movie destination at %d %d %d %d", rect.left, rect.top, rect.right, rect.bottom); - lpszCommand=NewCommand; - OutTraceDW("mciSendStringA: replaced Command=\"%s\"\n", lpszCommand); - } -#else char sMovieNickName[81]; RECT rect; if (sscanf(lpszCommand, "put %s destination at %ld %ld %ld %ld", @@ -179,7 +167,6 @@ MCIERROR WINAPI extmciSendStringA(LPCTSTR lpszCommand, LPTSTR lpszReturnString, lpszCommand=NewCommand; OutTraceDW("mciSendStringA: replaced Command=\"%s\"\n", lpszCommand); } -#endif IsWithinMCICall=TRUE; ret=(*pmciSendStringA)(lpszCommand, lpszReturnString, cchReturn, hwndCallback); IsWithinMCICall=FALSE; @@ -194,17 +181,6 @@ MCIERROR WINAPI extmciSendStringW(LPCWSTR lpszCommand, LPWSTR lpszReturnString, WCHAR *target=L"put movie destination at "; if(IsWithinMCICall) return(*pmciSendStringW)(lpszCommand, lpszReturnString, cchReturn, hwndCallback); // just proxy ... OutTraceDW("mciSendStringW: Command=\"%ls\" Return=%x Callback=%x\n", lpszCommand, cchReturn, hwndCallback); -#ifdef WFSPONLY - if(!wcsncmp(lpszCommand, target, wcslen(target))) { - WCHAR NewCommand[256]; - RECT rect; - swscanf(&lpszCommand[wcslen(target)], L"%ld %ld %ld %ld", &(rect.left), &(rect.top), &(rect.right), &(rect.bottom)); - rect=dxw.MapClientRect(&rect); - swprintf(NewCommand, L"put movie destination at %d %d %d %d", rect.left, rect.top, rect.right, rect.bottom); - lpszCommand=NewCommand; - OutTraceDW("mciSendStringA: replaced Command=\"%ls\"\n", lpszCommand); - } -#else WCHAR sMovieNickName[81]; RECT rect; if (swscanf(lpszCommand, L"put %ls destination at %ld %ld %ld %ld", @@ -215,7 +191,6 @@ MCIERROR WINAPI extmciSendStringW(LPCWSTR lpszCommand, LPWSTR lpszReturnString, lpszCommand=NewCommand; OutTraceDW("mciSendStringW: replaced Command=\"%ls\"\n", lpszCommand); } -#endif IsWithinMCICall=TRUE; ret=(*pmciSendStringW)(lpszCommand, lpszReturnString, cchReturn, hwndCallback); IsWithinMCICall=FALSE; diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index 888c77d..55f7971 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -23,6 +23,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_DXVersion = 0; m_Coordinates = 0; m_DxEmulationMode = 4; // default: AUTOMATIC + m_DxFilterMode = 0; // default: ddraw filtering m_DCEmulationMode = 0; // default: no emulation m_HookDI = FALSE; m_ModifyMouse = TRUE; // default true !! diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index ad01564803a88a936a653d06f97d9c1a6baadeaf..cab0a082563e6a9994a7418f90d07a0dc161b2d2 100644 GIT binary patch delta 3159 zcmb7{4{+4Q70378zl0=U2;q$JJT7-6!~{rkiIzZsL};6Yiv$Q#VN{F|M~B7`(+V@n zoffLL5hZI_tpSs0Lsjae{-`%YJDN^t>vRf}s?`v|N{C98YNutUN-OF2-Myn%+Nskw z^Uc2f?At%@_uJjyB{JcPoOKO`?6lTuu+Jjb#(Vx8S@F5m?pRH!GnG=4Fx^;CsE1M= z`ZH&f;}15atVY+UO^zoz3|Cof_uSu+)KGfSr?{#mGtn8#a1M98`++6>hsfg z&?akp);x!9zOl#}ac?8@T0hNo`Z0jAw&&Dik-Ok#CRX9qN2}>8 zJFei~dc^I?=We-bjk-&HOSP-p)Mn*VUsHFeE%5H6&n!_OJ6=Lt(qqMKjPLC9z2B+|Fs2 zo8=YcHzV^XXxVz6r*=_qmPcqXP1n#sbPQ^NT54@2;C>ZV1wa{uc{V+Eg2!%pI}udp8B6gXQ!ry)?SK zX!t4LxDj+UNi^m@jO!)G-QTs_o>NavWYP?>)CZHQ>NR<9=$@tq*4E&ckkV z<{HfEYoKj9RFWI*s-;%akw7+)$=gl&+V5T1b+CXl_v-3(?r3X>y2y+?N?9f=LKD&J zen>@5)6q#jWPNK>3AO3__H2mm%%eivz1sWo|UL zlg4Z>KSn7In~(I!Wuva z%QB@;(2ira=fQcxUR? zb=gV#cN8m4l-WE0s9STiCF$0e^}?ottq^~`luN*F zmbgvAxbJ3REyDOk-Y)E(ut2VN;SXn|g>m3EZh#$5Vm}jhT$m5-W5Pa3VxJ0g;4W7^0*#g31`Og-ZFOU~eAnZnAT)h*2u0**-ST+3h+yL7tj1S8$Vco(wk-fqOgz+2) z94a=y`jx=hfWMZ&abX^?)5215SU3|Na0(wBSdlQ!u2|RtVZ3K5h1Chm2dfvh*;x`F zkau;9z}}?5K4Gs4%QLH%(5&!pr5ZrDqZ0ClFwWskVPi?`9bu=0%|YC_urtE=q5M(U zXTlbPeJ*SPegz_bTm$Zv$<0BPlMHh#{d8T delta 1350 zcmZ8hZERCj7(UPK?OoYMEn6w2?xS?G%)(~ZjjkhPHrrfacAptS3?_)W1cSQF{TMn~ z(P5m?3A}6vNcUBxEV7Vgci|?4n9gZp3>rYA{L)JJ;SYmj*$=b8=DD4n;yHQmIp_U8 z@B5q^{zD1hRi;7)oK+hP`B3INW_LbVP&?&TnEDxGD`HTyyNKc@nf@}i$;*PFHY>L! zKJX-LYSp?EpgFmeyn{lX{;YyZVP&H6J=t{7ZKtk`CS9y9W_&O0k{H0)1EF9P>nmdY z?oxTypUd}FbpEg6JTJ)lKmMSQU4Xi5eg+ECgwUAsu69}aAk9g%wBZ=a)uUO(axyCl z|7=xn*t&s@DOICO7|QBVdp(ror7S6lvR6prMe5S#=W^wC5ld~WIJSAs58bfkWC#tG z$67_oZ&H3sF8{F%0p76#CNo?BJPs4pjhUxMc458Vu$vNN`uYR?HkyB`qni?=&eOvsMa#5@Z z()8_G57qiDXyAJ#T*TM>p@gTCb>Tq+a`?*zL{4>>Vlr~5dY@IZdSHhZ-iEM5Q@322 z%ZFbK6dzakNe^s%ek*dcz;1j4K0kmWevM$)f+57ggJoqnl6vhnrLKrTdsKoZ< zrFq;1SyM`|WZ<1H0g1$<6Vaa}GG9Hz&p2U^`H@9mwsuqKDTh|I1+ODk4~eQp<&vg_ z1^68l-kGQ6HR4Vwm&TFB^Pa$6o;U|5&m4z|dp^RQ*tRDaCauR7W z^0?&!MpN*yZ|h+_>}?ic)vQc>eg9A~^NYP#P%$eNvsO@XY!C*1Xb-I1c@BwWFwHau z8CT9@F8Rtrmqa5YDZm7TvkKv)SkUUMOLBGyZl!SPWA7wYH?nZrRYSUtp#S2N2P23V zK8jKuv1_PJ#c`}%$-^HGqlV|jV9|mj2*cnjE2sO71-yML9D2rI@V*&QkE(vSjU~cC zoFDGTzM&6cqXU6L^2!QDhjXZ7+(sqC=AkHR6uc+&-cLP8-W5d~?Y3{{i%~Qi6(LJc z$+WIdkqI<&e1-}gpX*O9_I{$LslN@zUyPvaQ5J28Wb?3Fq$|1MG5(7