From 54275fe7671e5657defe7e5036ecb8013245d430 Mon Sep 17 00:00:00 2001 From: gho tik Date: Fri, 4 Apr 2014 12:39:03 -0400 Subject: [PATCH] v2_02_68_src Former-commit-id: c8ffc4ffec494a3b2a136d9db7f1b2081caf11ad --- Include/dxwnd.h | 3 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- build/exports/Final Odyssey.dxw | 26 - build/exports/Flying Heroes.dxw | 26 - build/exports/Forsaken (HW).dxw | 26 - build/exports/Genocide (REMIXED VERSION).dxw | 26 - build/exports/House of the Dead 2.dxw | 26 - build/exports/Hydro Thunder.dxw | 26 - build/exports/Jazz Jackrabbit 2.dxw | 26 - build/exports/Vangers.dxw | 12 +- build/exports/dxwnd.ini | 5 + build/readme-relnotes.txt | 3 + dll/ddraw.cpp | 97 +- dll/dxemublt.bak.cpp | 995 ------------------- dll/dxhook.cpp | 2 +- dll/dxwnd.cpp | 2 +- dll/dxwnd.vs2008.suo | Bin 217600 -> 224256 bytes host/Resource.h | 5 +- host/TabCompat.cpp | 5 + host/TabWindow.cpp | 6 +- host/TargetDlg.h | 1 + host/dxwndhost.aps | Bin 171368 -> 171668 bytes host/dxwndhost.rc | 31 +- host/dxwndhost.vs2008.suo | Bin 123392 -> 132608 bytes host/dxwndhostView.cpp | 10 + 26 files changed, 137 insertions(+), 1230 deletions(-) delete mode 100644 build/exports/Final Odyssey.dxw delete mode 100644 build/exports/Flying Heroes.dxw delete mode 100644 build/exports/Forsaken (HW).dxw delete mode 100644 build/exports/Genocide (REMIXED VERSION).dxw delete mode 100644 build/exports/House of the Dead 2.dxw delete mode 100644 build/exports/Hydro Thunder.dxw delete mode 100644 build/exports/Jazz Jackrabbit 2.dxw create mode 100644 build/exports/dxwnd.ini delete mode 100644 dll/dxemublt.bak.cpp diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 999e08b..964fb1c 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -134,6 +134,9 @@ #define NOTEXTURES 0x00040000 // Disabled (whitened) textures #define RETURNNULLREF 0x00080000 // IDirectDraw::Release and IDDrawSurface::Release will always return 0 ref. counter #define FINETIMING 0x00100000 // Fine timeslider coarse, by 10% steps ranging from about :2 to x2 +#define NATIVERES 0x00200000 // Supports hardware native resolutions (depending on your PC) +#define SUPPORTSVGA 0x00400000 // Supports SVGA standard resolutions +#define SUPPORTHDTV 0x00800000 // Supports HDTV standard resolutions // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 512a48b..4421b84 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2f553d6e224444a5db27c57f3c5fb947c1b89decb352a231d2a5f0dda299cd5f -size 468480 +oid sha256:92c5b76a318057e79899b97495911e8dff4065bbdbabb3c1b6bf4cab149fd4aa +size 469504 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index d36685a..4fe63f0 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b1ab56aec078a3b4123d5d7fe8319b0c9baea51b7e987f61dfe5c61b47c1c56d -size 535552 +oid sha256:d3ce05096cb9020cf4b2c5ade4ca3fa8bf2bf80773b8bd709d6c4c50e1fc653d +size 536064 diff --git a/build/exports/Final Odyssey.dxw b/build/exports/Final Odyssey.dxw deleted file mode 100644 index 9686a8a..0000000 --- a/build/exports/Final Odyssey.dxw +++ /dev/null @@ -1,26 +0,0 @@ -[target] -title0=Final Odyssey -path0=D:\Games\Final odyssey\FinalOdy.exe -module0= -opengllib0= -ver0=0 -coord0=0 -flag0=134267425 -flagg0=134217728 -flagh0=20 -flagi0=4 -tflag0=6146 -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 diff --git a/build/exports/Flying Heroes.dxw b/build/exports/Flying Heroes.dxw deleted file mode 100644 index 1ac1a59..0000000 --- a/build/exports/Flying Heroes.dxw +++ /dev/null @@ -1,26 +0,0 @@ -[target] -title0=Flying Heroes -path0=D:\Games\Flying_Heroes\fh.exe -module0= -opengllib0= -ver0=0 -coord0=0 -flag0=151011364 -flagg0=1207959552 -flagh0=20 -flagi0=4 -tflag0=0 -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 diff --git a/build/exports/Forsaken (HW).dxw b/build/exports/Forsaken (HW).dxw deleted file mode 100644 index 025c461..0000000 --- a/build/exports/Forsaken (HW).dxw +++ /dev/null @@ -1,26 +0,0 @@ -[target] -title0=Forsaken (HW) -path0=D:\Games\Forsaken\ForsakenHW.exe -module0= -opengllib0= -ver0=0 -coord0=0 -flag0=411058208 -flagg0=1207959808 -flagh0=20 -flagi0=4 -tflag0=0 -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 diff --git a/build/exports/Genocide (REMIXED VERSION).dxw b/build/exports/Genocide (REMIXED VERSION).dxw deleted file mode 100644 index 796cbf1..0000000 --- a/build/exports/Genocide (REMIXED VERSION).dxw +++ /dev/null @@ -1,26 +0,0 @@ -[target] -title0=Genocide (REMIXED VERSION) -path0=D:\Games\genocide\remixed version (1999)\genocide\genocide.exe -module0= -opengllib0= -ver0=0 -coord0=0 -flag0=134218272 -flagg0=1207959552 -flagh0=20 -flagi0=4 -tflag0=6402 -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 diff --git a/build/exports/House of the Dead 2.dxw b/build/exports/House of the Dead 2.dxw deleted file mode 100644 index aadf8b6..0000000 --- a/build/exports/House of the Dead 2.dxw +++ /dev/null @@ -1,26 +0,0 @@ -[target] -title0=House of the Dead 2 -path0=D:\Games\HOD2\Hod2.exe -module0= -opengllib0= -ver0=0 -coord0=0 -flag0=738197536 -flagg0=1207959552 -flagh0=20 -flagi0=4 -tflag0=0 -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 diff --git a/build/exports/Hydro Thunder.dxw b/build/exports/Hydro Thunder.dxw deleted file mode 100644 index 3210cd5..0000000 --- a/build/exports/Hydro Thunder.dxw +++ /dev/null @@ -1,26 +0,0 @@ -[target] -title0=Hydro Thunder -path0=D:\Games\Hydro Thunder\hydro.exe -module0= -opengllib0= -ver0=0 -coord0=0 -flag0=704643104 -flagg0=1207959552 -flagh0=20 -flagi0=4 -tflag0=0 -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 diff --git a/build/exports/Jazz Jackrabbit 2.dxw b/build/exports/Jazz Jackrabbit 2.dxw deleted file mode 100644 index a01a21a..0000000 --- a/build/exports/Jazz Jackrabbit 2.dxw +++ /dev/null @@ -1,26 +0,0 @@ -[target] -title0=Jazz Jackrabbit 2 -path0=D:\Games\Jazz Jackrabbit 2\JAZZ2.EXE -module0= -opengllib0= -ver0=0 -coord0=0 -flag0=671097376 -flagg0=1207959552 -flagh0=20 -flagi0=4 -tflag0=0 -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 diff --git a/build/exports/Vangers.dxw b/build/exports/Vangers.dxw index e1db5cd..d7459f7 100644 --- a/build/exports/Vangers.dxw +++ b/build/exports/Vangers.dxw @@ -3,13 +3,13 @@ title0=Vangers path0=D:\Games\Vangers\road.exe module0= opengllib0= -ver0=1 +ver0=0 coord0=0 -flag0=136315424 -flagg0=1207959552 +flag0=402653219 +flagg0=671088640 flagh0=20 -flagi0=524288 -tflag0=0 +flagi0=0 +tflag0=67 initx0=0 inity0=0 minx0=0 @@ -22,5 +22,3 @@ sizx0=800 sizy0=600 maxfps0=0 initts0=0 -winver0=0 -maxres0=-1 diff --git a/build/exports/dxwnd.ini b/build/exports/dxwnd.ini new file mode 100644 index 0000000..df58168 --- /dev/null +++ b/build/exports/dxwnd.ini @@ -0,0 +1,5 @@ +[window] +posx=1423 +posy=111 +sizx=320 +sizy=826 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index 5ea0d10..7c58451 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -442,3 +442,6 @@ fixed log for D3D CreateDevice method, missing in some D3D interface versions added wildcarded program path: now you needn't set the full pathname, but it is sufficient to specify the rightmost part, e.g. the executable filename. added emulated mode color conversion from 32BPP to 16BPP. Despite the fact that the best way to run a 32BPP game is against a 32BPP desktop, now it is possible to downgrade 32BPP colors to 16BPP. This fixed the fact that 32BPP games run on a 16BPP desktop showed simply black screens (e.g. Baldur's Gate II) fixed logic for EnumDisplayModes implementation: now screen resolutions and, for emulated mode only, also color depth, are generated by DxWnd and not derived directly from the real ones. This make it possible to fake support for very low screen resolutions (e.g. 320x200) on modern screens that support them no longer. This make "Genocide" running on both supported resolutions 320x200 and 320x240. + +v2.02.68 +added screen resolution choice: either a set of SVGA resolutions (mostly for 3:4 monitors), HDTV resolutions (mostly for 16:9 monitors) or the native set of resolutions offered by your monitor / video card. diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index c92a1be..26f08b5 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -3917,22 +3917,59 @@ typedef struct { DWORD dwHeight; } NewContext_Type; -static struct { +typedef struct { int w; int h; -}SupportedRes[7]= { +} SupportedRes_Type; + +static SupportedRes_Type SupportedSVGARes[9]= { {320,200}, {320,240}, {640,400}, {640,480}, + {720,480}, {800,600}, - {1024,768}, + {1024,768}, // XGA + {1280,800}, // WXGA {0,0} }; +static SupportedRes_Type SupportedHDTVRes[10]= { + {640,360}, // nHD + {720,480}, // DVD + {720,576}, // DV-PAL + {960,540}, // qHD + {1176,1000}, + {1280,720}, // HD + {1440,960}, + {1600,900}, // HD+ + {1920,1080}, // FHD + {0,0} +}; + +static BOOL CheckResolutionLimit(LPDDSURFACEDESC lpDDSurfaceDesc) +{ + #define HUGE 100000 + DWORD maxw, maxh; + switch(dxw.MaxScreenRes){ + case DXW_NO_LIMIT: maxw=HUGE; maxh=HUGE; break; + case DXW_LIMIT_320x200: maxw=320; maxh=200; break; + case DXW_LIMIT_640x480: maxw=640; maxh=480; break; + case DXW_LIMIT_800x600: maxw=800; maxh=600; break; + case DXW_LIMIT_1024x768: maxw=1024; maxh=768; break; + case DXW_LIMIT_1280x960: maxw=1280; maxh=960; break; + } + if((lpDDSurfaceDesc->dwWidth > maxw) || (lpDDSurfaceDesc->dwHeight > maxh)){ + OutTraceDW("EnumDisplaySettings: hide device mode=(%d,%d)\n", maxw, maxh); + return TRUE; + } + return FALSE; +} + HRESULT WINAPI myEnumModesFilterDirect(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext) { HRESULT res; + SupportedRes_Type *SupportedRes; if ((((NewContext_Type *)lpContext)->dwHeight != lpDDSurfaceDesc->dwHeight) || (((NewContext_Type *)lpContext)->dwWidth != lpDDSurfaceDesc->dwWidth)) return DDENUMRET_OK; @@ -3951,25 +3988,12 @@ HRESULT WINAPI myEnumModesFilterDirect(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID l // tricky part: for each color depth related to current video resolution, fake each of the // supported resolutions, unless is greater than maximum allowed + SupportedRes = (dxw.dwFlags4 & SUPPORTHDTV) ? &SupportedHDTVRes[0] : &SupportedSVGARes[0]; + for (int ResIdx=0; SupportedRes[ResIdx].h; ResIdx++){ lpDDSurfaceDesc->dwHeight=SupportedRes[ResIdx].h; lpDDSurfaceDesc->dwWidth=SupportedRes[ResIdx].w; - if(dxw.dwFlags4 & LIMITSCREENRES){ - #define HUGE 100000 - DWORD maxw, maxh; - switch(dxw.MaxScreenRes){ - case DXW_NO_LIMIT: maxw=HUGE; maxh=HUGE; break; - case DXW_LIMIT_320x200: maxw=320; maxh=200; break; - case DXW_LIMIT_640x480: maxw=640; maxh=480; break; - case DXW_LIMIT_800x600: maxw=800; maxh=600; break; - case DXW_LIMIT_1024x768: maxw=1024; maxh=768; break; - case DXW_LIMIT_1280x960: maxw=1280; maxh=960; break; - } - if((lpDDSurfaceDesc->dwWidth > maxw) || (lpDDSurfaceDesc->dwHeight > maxh)){ - OutTraceDW("EnumDisplaySettings: hide device mode=(%d,%d)\n", maxw, maxh); - return DDENUMRET_OK; - } - } + if((dxw.dwFlags4 & LIMITSCREENRES) && CheckResolutionLimit(lpDDSurfaceDesc)) return DDENUMRET_OK; res=(*((NewContext_Type *)lpContext)->lpCallback)(lpDDSurfaceDesc, ((NewContext_Type *)lpContext)->lpContext); OutTraceDW("EnumDisplayModes(D): proposed size[%d]=(%d,%d) res=%x\n", ResIdx, SupportedRes[ResIdx].w, SupportedRes[ResIdx].h, res); if(res==DDENUMRET_CANCEL) break; @@ -3977,16 +4001,48 @@ HRESULT WINAPI myEnumModesFilterDirect(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID l return res; } +HRESULT WINAPI myEnumModesFilterNative(LPDDSURFACEDESC lpDDSurfaceDesc, LPVOID lpContext) +{ + HRESULT res; + + if (IsDebug) EnumModesCallbackDumper(lpDDSurfaceDesc, NULL); + + if (dxw.dwFlags1 & PREVENTMAXIMIZE){ + // if PREVENTMAXIMIZE is set, don't let the caller know about forbidden screen settings. + if((lpDDSurfaceDesc->dwHeight > dxw.GetScreenHeight()) || + (lpDDSurfaceDesc->dwWidth > dxw.GetScreenWidth())){ + OutTraceDW("EnumDisplayModes: skipping screen size=(%d,%d)\n", lpDDSurfaceDesc->dwHeight, lpDDSurfaceDesc->dwWidth); + return DDENUMRET_OK; + } + } + + if((dxw.dwFlags4 & LIMITSCREENRES) && CheckResolutionLimit(lpDDSurfaceDesc)) return DDENUMRET_OK; + res=(*((NewContext_Type *)lpContext)->lpCallback)(lpDDSurfaceDesc, ((NewContext_Type *)lpContext)->lpContext); + OutTraceDW("EnumDisplayModes(D): proposed size=(%d,%d) res=%x\n", lpDDSurfaceDesc->dwWidth, lpDDSurfaceDesc->dwHeight, res); + return res; +} + HRESULT WINAPI extEnumDisplayModes(EnumDisplayModes1_Type pEnumDisplayModes, LPDIRECTDRAW lpdd, DWORD dwflags, LPDDSURFACEDESC lpddsd, LPVOID lpContext, LPDDENUMMODESCALLBACK cb) { HRESULT res; + SupportedRes_Type *SupportedRes; + NewContext_Type NewContext; OutTraceDDRAW("EnumDisplayModes(D): lpdd=%x flags=%x lpddsd=%x callback=%x\n", lpdd, dwflags, lpddsd, cb); + if((dxw.dwFlags4 & NATIVERES)){ + NewContext.dwWidth = 0; + NewContext.dwHeight = 0; + NewContext.lpContext=lpContext; + NewContext.lpCallback=cb; + res=(*pEnumDisplayModes)(lpdd, dwflags, lpddsd, &NewContext, myEnumModesFilterNative); + if(res) OutTraceE("EnumDisplayModes(D): ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); + return res; + } + // note: extEnumDisplayModes serves both the EnumDisplayModes and EnumDisplayModes2 interfaces: // they differ for the lpddsd argument that should point to either DDSURFACEDESC or DDSURFACEDESC2 // structures, but unification is possible if the lpddsd->dwSize is properly set and is left untouched. - if((dxw.dwFlags1 & EMULATESURFACE)){ int SupportedDepths[5]={8,16,24,32,0}; int ResIdx, DepthIdx; @@ -3997,6 +4053,7 @@ HRESULT WINAPI extEnumDisplayModes(EnumDisplayModes1_Type pEnumDisplayModes, LPD if (lpddsd) EmuDesc.dwSize=lpddsd->dwSize; // sizeof either DDSURFACEDESC or DDSURFACEDESC2 !!! else EmuDesc.dwSize = sizeof(DDSURFACEDESC2); EmuDesc.dwFlags=DDSD_PIXELFORMAT|DDSD_REFRESHRATE|DDSD_WIDTH|DDSD_HEIGHT|DDSD_PITCH; + SupportedRes = (dxw.dwFlags4 & SUPPORTHDTV) ? &SupportedHDTVRes[0] : &SupportedSVGARes[0]; for (ResIdx=0; SupportedRes[ResIdx].h; ResIdx++){ EmuDesc.dwHeight=SupportedRes[ResIdx].h; EmuDesc.dwWidth=SupportedRes[ResIdx].w; diff --git a/dll/dxemublt.bak.cpp b/dll/dxemublt.bak.cpp deleted file mode 100644 index 67d47c1..0000000 --- a/dll/dxemublt.bak.cpp +++ /dev/null @@ -1,995 +0,0 @@ -#include -#include -#include -#include "dxwnd.h" -#include "dxwcore.hpp" -#include "hddraw.h" - -typedef HRESULT (WINAPI *Lock_Type)(LPDIRECTDRAWSURFACE, LPRECT, LPDDSURFACEDESC, DWORD, HANDLE); -typedef HRESULT (WINAPI *Unlock4_Type)(LPDIRECTDRAWSURFACE, LPRECT); -typedef HRESULT (WINAPI *Unlock1_Type)(LPDIRECTDRAWSURFACE, LPVOID); - -extern Lock_Type pLock; -extern Unlock4_Type pUnlockMethod(LPDIRECTDRAWSURFACE); - -extern DWORD PaletteEntries[256]; -extern DWORD *Palette16BPP; -extern char *ExplainDDError(DWORD); -extern int Set_dwSize_From_Surface(LPDIRECTDRAWSURFACE); - -// just in case .... -#define SwitchdwSize(s) s.dwSize=(s.dwSize==sizeof(DDSURFACEDESC))?sizeof(DDSURFACEDESC2):sizeof(DDSURFACEDESC) - -#define DXWNDDIRECTBLITTING 1 -#define MARKBLITCOLOR32 0x00FFFF00 -#define MARKBLITCOLOR16 0x0FF0 -extern Blt_Type pBlt; -EmuBlt_Type pEmuBlt; -RevBlt_Type pRevBlt; - -//--------------------------------------------------------------------------------------------// -// Emulated blitting procedures: fills a 32BPP surface from the content of 8BPP or 16BPP ones. -//--------------------------------------------------------------------------------------------// - -static void MarkRect32(DWORD *dest, int w, int h, int destpitch) -{ - int x, y; - - for(x = 0; x < w; x ++) *(dest ++) = MARKBLITCOLOR32; - dest += destpitch; - for(y = 0; y < h-2; y ++){ - *dest = MARKBLITCOLOR32; - dest += w-1; - *dest = MARKBLITCOLOR32; - dest += destpitch + 1; - } - for(x = 0; x < w; x ++) *(dest ++) = MARKBLITCOLOR32; - return; -} - -static void MarkRect16(SHORT *dest, int w, int h, int destpitch) -{ - int x, y; - - for(x = 0; x < w; x ++) *(dest ++) = MARKBLITCOLOR16; - dest += destpitch; - for(y = 0; y < h-2; y ++){ - *dest = MARKBLITCOLOR16; - dest += w-1; - *dest = MARKBLITCOLOR16; - dest += destpitch + 1; - } - for(x = 0; x < w; x ++) *(dest ++) = MARKBLITCOLOR16; - return; -} - -static HRESULT WINAPI EmuBlt_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; - - 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("EmuBlt8_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("EmuBlt8_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("EmuBlt8_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 - 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 ++){ - for(x = 0; x < w; x ++){ - *(dest ++) = PaletteEntries[*(src8 ++)]; - } - dest += destpitch; - src8 += srcpitch; - } - - 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__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); - if (res) OutTraceE("EmuBlt8_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) -{ - HRESULT res; - WORD *src16; - DWORD *dest, *dest0; - DDSURFACEDESC2 ddsd_src, ddsd_dst; - long srcpitch, destpitch; - DWORD x, y, w, h; - - w = lpdestrect->right - lpdestrect->left; - h = lpdestrect->bottom - lpdestrect->top; - - 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_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("EmuBlt16_32: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); - return 0; - } - } - else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY|DDLOCK_WAIT, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); - OutTraceE("EmuBlt16_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - lpsurface=ddsd_src.lpSurface; - } - - ddsd_dst.lPitch >>= 2; - dest = (DWORD *)ddsd_dst.lpSurface; - dest += lpdestrect->top*ddsd_dst.lPitch; - dest += lpdestrect->left; - destpitch = ddsd_dst.lPitch - w; - dest0 = dest; - - ddsd_src.lPitch >>= 1; - src16 = (WORD *)(lpsurface ? lpsurface:ddsd_src.lpSurface); - src16 += lpsrcrect->top*ddsd_src.lPitch; - src16 += lpsrcrect->left; - srcpitch = ddsd_src.lPitch - w; - - // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src16,dest,srcpitch,destpitch); - if (!Palette16BPP) { // first time through ..... - unsigned int pi; - Palette16BPP = (DWORD *)malloc(0x10000 * sizeof(DWORD)); - if (dxw.dwFlags3 & BLACKWHITE){ - // actually, it should be like this: R/G/B = (red * 0.30) + (green * 0.59) + (blue * 0.11) - // (http://www.codeproject.com/Articles/66253/Converting-Colors-to-Gray-Shades) - DWORD grey; - if (dxw.dwFlags1 & USERGB565){ - for (pi=0; pi<0x10000; pi++) { - //grey = ((((pi & 0x1F)<<3) + ((pi & 0x7E0)>>3) + ((pi & 0xF800)>>8)) / 3) & 0xFF; - grey = (((((pi & 0x1F)<<3) * 30) + (((pi & 0x7E0)>>3) * 59) + (((pi & 0xF800)>>8) * 11)) / 100) & 0xFF; - Palette16BPP[pi] = (grey) + (grey<<8) + (grey<<16); - } - } - else { - for (pi=0; pi<0x10000; pi++) { - //grey = ((((pi & 0x1F)<<3) + ((pi & 0x3E0)>>2) + ((pi & 0x7C00)>>7)) / 3) & 0xFF; - grey = (((((pi & 0x1F)<<3) * 30) + (((pi & 0x3E0)>>2) * 59) + (((pi & 0x7C00)>>7) * 11)) / 100) & 0xFF; - Palette16BPP[pi] = grey + (grey<<8) + (grey<<16); - } - } - } - else { - if (dxw.dwFlags1 & USERGB565){ - for (pi=0; pi<0x10000; pi++) { - Palette16BPP[pi]=(pi & 0x1F)<<3 | (pi & 0x7E0)<<5 | (pi & 0xF800)<<8; // RGB565 - } - } - else { - for (pi=0; pi<0x10000; pi++) { - Palette16BPP[pi]=(pi & 0x1F)<<3 | (pi & 0x3E0)<<6 | (pi & 0x7C00)<<9; // RGB555 - } - } - } - } - for(y = 0; y < h; y ++){ - for(x = 0; x < w; x ++){ - //if (!(*src16 & 0x8000)) // try implement alpha bit - *(dest ++) = Palette16BPP[*(src16 ++)]; - } - dest += destpitch; - src16 += srcpitch; - } - - if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, w, h, destpitch); - - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - if (res) OutTraceE("EmuBlt16_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); - if (res) OutTraceE("EmuBlt16_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); - return res; -} - -static HRESULT WINAPI EmuBlt_24_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, - LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) -{ - HRESULT res; - BYTE *src24; - 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; - - 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("EmuBlt24_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("EmuBlt24_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("EmuBlt24_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - lpsurface=ddsd_src.lpSurface; - } - - ddsd_dst.lPitch >>= 2; - dest = (DWORD *)ddsd_dst.lpSurface; - dest += lpdestrect->top*ddsd_dst.lPitch; - dest += lpdestrect->left; - destpitch = ddsd_dst.lPitch - w; - dest0 = dest; - - src24 = (BYTE *)lpsurface; - src24 += lpsrcrect->top*ddsd_src.lPitch; - src24 += lpsrcrect->left; - srcpitch = ddsd_src.lPitch - 3*w; - - for(y = 0; y < h; y ++){ - for(x = 0; x < w; x ++){ - DWORD dwPixel; - dwPixel=0; - memcpy((void *)&dwPixel, (void *)src24, 3); - *(dest ++) = dwPixel; - src24 += 3; // 3 bytes = 24 bits - } - dest += destpitch; - src24 += srcpitch; - } - - if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, w, h, destpitch); - - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - if (res) OutTraceE("EmuBlt24_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); - if (res) OutTraceE("EmuBlt24_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); - return res; -} - - -static HRESULT WINAPI EmuBlt_32_to_32(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, - LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) -{ -#ifdef DXWNDDIRECTBLITTING - return (*pBlt)(lpddsdst, lpdestrect, lpddssrc, lpsrcrect, dwflags, NULL); -#else - DWORD x, y, w, h; - long srcpitch, destpitch; - HRESULT res; - DWORD *src32; - DWORD *dest, *dest0; - DDSURFACEDESC2 ddsd_src, ddsd_dst; - - 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("EmuBlt32_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("EmuBlt32_32: GetSurfaceDesc ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - (*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - (*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); - return res; - } - } - else { - if(res=(*pLock)(lpddssrc, 0, (LPDDSURFACEDESC)&ddsd_src, DDLOCK_SURFACEMEMORYPTR|DDLOCK_READONLY, 0)) { - (*pUnlockMethod(lpddsdst))(lpddsdst,0); - OutTraceE("EmuBlt32_32: Lock ERROR res=%x(%s) at %d\n", res, ExplainDDError(res), __LINE__); - return res; - } - lpsurface=ddsd_src.lpSurface; - } - - ddsd_dst.lPitch >>= 2; - dest = (DWORD *)ddsd_dst.lpSurface; - dest += lpdestrect->top*ddsd_dst.lPitch; - dest += lpdestrect->left; - destpitch = ddsd_dst.lPitch - w; - dest0 = dest; - - ddsd_src.lPitch >>= 2; - src32 = (DWORD *)(lpsurface ? lpsurface:ddsd_src.lpSurface); - src32 += lpsrcrect->top*ddsd_src.lPitch; - src32 += lpsrcrect->left; - srcpitch = ddsd_src.lPitch - w; - - // OutTraceDW("DEBUG: h=%d w=%d src=%x dst=%x spitch=%d dpitch=%d\n",h,w,src32,dest,srcpitch,destpitch); - for(y = 0; y < h; y ++){ - for(x = 0; x < w; x ++) - *(dest ++) = *(src32 ++); - dest += destpitch; - src32 += srcpitch; - } - - if(dxw.dwFlags3 & MARKBLIT) MarkRect32(dest0, w, h, destpitch); - - res=(*pUnlockMethod(lpddsdst))(lpddsdst,lpdestrect); - if (res) OutTraceE("EmuBlt32_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); - if (res) OutTraceE("EmuBlt32_32: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); - return res; -#endif -} - -static HRESULT WINAPI EmuBlt_8_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, - LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) -{ - HRESULT res; - BYTE *src8; - SHORT *dest, *dest0; - DDSURFACEDESC2 ddsd_src, ddsd_dst; - long srcpitch, destpitch; - DWORD x, y, w, h; - - 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("EmuBlt8_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("EmuBlt8_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("EmuBlt8_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; - - 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 ++){ - for(x = 0; x < w; x ++){ - *(dest ++) = (SHORT)PaletteEntries[*(src8 ++)]; - } - dest += destpitch; - src8 += srcpitch; - } - - if(dxw.dwFlags3 & MARKBLIT) MarkRect16(dest0, w, h, destpitch); - - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - if (res) OutTraceE("EmuBlt8_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); - if (res) OutTraceE("EmuBlt8_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); - return res; -} - - -static HRESULT WINAPI EmuBlt_16_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, - LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) -{ -#ifdef DXWNDDIRECTBLITTING - return (*pBlt)(lpddsdst, lpdestrect, lpddssrc, lpsrcrect, dwflags, NULL); -#else - OutTraceDW("EmuBlt_16_to_16: UNSUPPORTED\n"); - return -1; -#endif -} - -static HRESULT WINAPI EmuBlt_24_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, - LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) -{ - HRESULT res; - BYTE *src24; - SHORT *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; - - 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("EmuBlt24_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("EmuBlt24_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("EmuBlt24_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; - - src24 = (BYTE *)lpsurface; - src24 += lpsrcrect->top*ddsd_src.lPitch; - src24 += lpsrcrect->left; - srcpitch = ddsd_src.lPitch - 3*w; - - for(y = 0; y < h; y ++){ - for(x = 0; x < w; x ++){ - *(dest ++) = (*(src24+2) & 0xF8)<<8 | (*(src24+1) & 0xFC)<<3 | (*(src24+0) & 0xF8)>>3; - src24 += 3; // 3 bytes = 24 bits - } - dest += destpitch; - src24 += srcpitch; - } - - if(dxw.dwFlags3 & MARKBLIT) MarkRect16(dest0, w, h, destpitch); - - res=(*pUnlockMethod(lpddsdst))(lpddsdst, lpdestrect); - if (res) OutTraceE("EmuBlt24_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddsdst, res, ExplainDDError(res), __LINE__); - res=(*pUnlockMethod(lpddssrc))(lpddssrc, lpsrcrect); - if (res) OutTraceE("EmuBlt24_16: Unlock ERROR dds=%x res=%x(%s) at %d\n", lpddssrc, res, ExplainDDError(res), __LINE__); - return res; -} - - - -static HRESULT WINAPI EmuBlt_32_to_16(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, - LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) -{ - char *sMsg="EmuBlt32_16: CURRENTLY UNSUPPORTED\n"; - OutTraceE(sMsg); - if(IsAssertEnabled) MessageBox(0, sMsg, "EmuBlt", MB_OK | MB_ICONEXCLAMATION); - return -1; -} - -static HRESULT WINAPI EmuBlt_Null(LPDIRECTDRAWSURFACE lpddsdst, LPRECT lpdestrect, - LPDIRECTDRAWSURFACE lpddssrc, LPRECT lpsrcrect, DWORD dwflags, LPVOID lpsurface) -{ - char *sMsg="EmuBlt: undefined color depth\n"; - OutTraceE(sMsg); - if(IsAssertEnabled) MessageBox(0, sMsg, "EmuBlt", MB_OK | MB_ICONEXCLAMATION); - 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 -//--------------------------------------------------------------------------------------------// - -void SetBltTransformations() -{ - OutTraceDW("SetBltTransformations: color transformation %d->%d\n", - 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; - OutTraceDW("set color transformation 8<->32\n"); - break; - case 16: - pRevBlt=RevBlt_32_to_16; - pEmuBlt=EmuBlt_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; - case 32: - pEmuBlt=EmuBlt_32_to_32; - OutTraceDW("set color transformation 32->32\n"); - break; - default: - OutTraceDW("unsupported color transformation %d->32\n", dxw.VirtualPixelFormat.dwRGBBitCount); - break; - } - break; - case 16: - switch(dxw.VirtualPixelFormat.dwRGBBitCount){ - case 8: - pRevBlt=RevBlt_16_to_8; - pEmuBlt=EmuBlt_8_to_16; - OutTraceDW("set color transformation 8<->16\n"); - break; - case 16: - pRevBlt=RevBlt_16_to_16; - pEmuBlt=EmuBlt_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; - case 32: - pEmuBlt=EmuBlt_32_to_16; - break; - default: - OutTraceDW("unsupported color transformation %d->16\n", dxw.VirtualPixelFormat.dwRGBBitCount); - break; - } - break; - default: - OutTraceDW("unsupported color transformation %d->%d\n", - dxw.VirtualPixelFormat.dwRGBBitCount, - dxw.ActualPixelFormat.dwRGBBitCount); - break; - } - return; -} diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index 4f32445..4749200 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -73,7 +73,7 @@ static char *Flag4Names[32]={ "NOPOWER2FIX", "NOPERFCOUNTER", "ADDPROXYLIBS", "INTERCEPTRDTSC", "LIMITSCREENRES", "NOFILLRECT", "HOOKGLIDE", "HIDEDESKTOP", "STRETCHTIMERS", "NOFLIPEMULATION", "NOTEXTURES", "RETURNNULLREF", - "FINETIMING", "", "", "", + "FINETIMING", "NATIVERES", "SUPPORTSVGA", "SUPPORTHDTV", "", "", "", "", "", "", "", "", }; diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index 25390a8..2e43788 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.67" +#define VERSION "2.02.68" #define DDTHREADLOCK 1 diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 1c692b09b8bd0ef10df61be3f55acd76c7349f8c..e56b738e5657eabf3a005731f8b3fea99f6fe79e 100644 GIT binary patch delta 4962 zcmeH~dvMg%6~}+){&r)C$!4>J7%{-+g@IDC$%G6qV+hD2r6fd3E%FFKtsOx~V1!aj zR`l^(n=%_`~@7XJQ!N(Iu`GP>_*wxN_nAR zysK@6JCA5a+qSq#CR8&cwe3>;y>aySwjU=~m}10Q1LP0NiD!#^f4h9Ho5-?8;(0=Z zew|MNyUl95obrLqHO1uTUAcBfTUOesBzFMKEZ%m&jNv^Q`O@X?0!t31%|UH%0QI$*titnJfhe&v+>&fr zFTiZ4Hj|zj#WM;hi)&hG7`1b2vdQJ$2TdwBY^MHPeJgF{^+l-9I!t-=qSR-Hp7y74 ziP!XZrp+cFh3AsV;)~lTohvtyhfB|pi?;LQMU*QqnnxWxy#P9}nG(5u4wY>jL0-oj zBtzlVG&b?u-Z;xjf%#y4VVCg}^n*`>T?0#pT?^|EyWBdTi5s58U_mla%HX*b~;VXXDP1vG+I?xCT#o=k>_VoJil>< zQk}vN=yh^@AJaKXDaICovmqCZPHGuVa5e>N` z2X8X`6FSLvPo*>`&10T%apx>7_+@#sk^=HM<*6oot<&K%rNsV5ax+Yk{v8% z@;^$ zD0o)_Cmb<%gkLiaM1PiFcrm}xWU{f_hw@FwOcCFA%#`xD6DGfx7jevSlSRD+l>EjN z(p9>8PW=fp#Z7PaV6qR!OSxO|RAkxY2(242kB=J2onI!|G>?}>QiC2$6 zc8w;QMEmghFG7!B*N>al;QA=L#{S%{_aL$Y*Q2a*m3o=GXekSoje}mKtX`S42|-KU zdSyR=4r<)?81@TgjxuR`G})?;?33dPe+jrx11~9i1neti-dNWA<`9Cc&!oO=c<+z6x5lxLfNIwQez3lCsgtCW4JoT@u4?R9zOs#;4%Ak^v?v zlnG2yT^_@}11+UOnY39BeG~jjW#59X)VTYEVM!k2j{W3E#>zZQLwddtoSIU*EAjt# zUu5a!2>(yseaIwo_eFR9e`$C3wz=zjj@-YsyD@o51|GB=1d|x*x+oY@?*qhLj zv(6}6flO{~*1!)GqTc#Y*~iLefc;gOg_I~qZze4AzZ!hs7?vt26J@Y6x!JB)R-|kh z*a%^={^Jzh4_&5#70P7bN@equ{Sd5LS*^0UV0FrVqHG@6y~=*3>?yDZmF eYt?|g>V<`&r5sSU0Q#V^SA1M~iz!5ct@$S*L|^0p delta 3282 zcma*qeNa@_6#(#e&f6sfg$YHTdzz8Z)hpmZS|$J1s)b**y}* znJ~RGckX$=cR${{d*6L;+Xge+4rIQ*)|M4`vD*9Vx&bf^!)SXhvf0+3evZR2PF=^q z7imkk#Wvb~0NY~SX%8ZOb^_h8k@T%;a3i+KQIB`uNE5y@UX zjhx3IH|-=JuBnV|p4;&!7>?W;EripNd&hodf06y4v2$bVW|bm`6Nk-YDBwK%4zF++ z#-p64SnFrOzWZp{iA7ZX7P=|42lD8R$6&9RC$item)Z__*3c?&0kt_Wm;8SPH}ufT zQkYHq+n_Gq1XvUqc6#aNljtOGJ6xeqH{?=o2rk4spla%|mJozn%Hf0sJ75f=oq$x< z4kfg}Y35ipyWnkzcCo$j5_m1|Zn$Dn+fK;0^7q5X5Z%jXYP{g1Up@mKtF{N;1oC8K z7Bw$Hm*q)70-^_?DtaBT>l)Yad;|%5^b>B?;)NWtg<*uw9>roB41?QRd=riXHNOD) zH1syQ=;E)ai!;tI2^qw)g@J0QEIO5sgYm)urIFmb)>24+R$D5h_2y zlh(5H_L=Qfm;q5gPNlvDn4i2g>RW=iq!I zDX~k^=p?p~a~Tw;p1}Z` zD$@#9#* zGq}tSIKCTM!{;&Ao+&F*a)@VZG`xByl@HhZ8qCkwS?L{wySE{yi(=z$~e39dCOH>z;=(CCuPB80CCbE#bJ5V@Z#zRdd{=)~Y7`$wryWrEHXPEd7N!uH>@QZWJU@ek|EpC3R~>-tmkc z+R_U%gC8j^W4fl*KAm8nsg0;T&-HGp-JO;iS1f~LNjYi~&rmB-o5eO??ctOyGwx?> zP~4~$=df*3+pQ*x>1DOo)E2WHR@-6rQO#6y8wJ4pGxb*So4nsN7wKy>!)%4P&FrvK zpVSFWFTMg30yq4Xse8r3_MjhshxIYU{M@WP65VNk38h8OJ|W zBQ;qk`#64p%l&GN9Phd-xn%i{6}^lXIhOQywZ}OAhuRlvTiO1l_FuJcvW=+83YWX> z;0&_bIoZ{UIZjh^1Qoj&or(o&bJz;iO4Mev%~xBj*34F^_Mn;!Qmgie+ETVh)qbpI zGSXP4c^X{f`#cS2nGNvAFOORtW_{$Hxn)!MH|UYM0Y2etb%Fq zEbV(0<|aS?Y5P^27wK@i37xozoV)oGb$PM55vU`dAJrY@{Pl2_Ke(-*`^*i~<8|g2 WaC=!%xSYSh`QL=kS{^Xt+5ZD~@n>iN diff --git a/host/Resource.h b/host/Resource.h index a2f1f49..23d957d 100644 --- a/host/Resource.h +++ b/host/Resource.h @@ -208,6 +208,9 @@ #define IDC_LIMITSCREENRES 1167 #define IDC_SHOWTIMESTRETCH 1168 #define IDC_FINETIMING 1169 +#define IDC_SUPPORTSVGA 1170 +#define IDC_SUPPORTHDMI 1171 +#define IDC_NATIVERES 1172 #define ID_MODIFY 32771 #define ID_DELETE 32772 #define ID_ADD 32773 @@ -261,7 +264,7 @@ #define _APS_3D_CONTROLS 1 #define _APS_NEXT_RESOURCE_VALUE 159 #define _APS_NEXT_COMMAND_VALUE 32830 -#define _APS_NEXT_CONTROL_VALUE 1099 +#define _APS_NEXT_CONTROL_VALUE 1100 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif diff --git a/host/TabCompat.cpp b/host/TabCompat.cpp index edd70bf..7515921 100644 --- a/host/TabCompat.cpp +++ b/host/TabCompat.cpp @@ -41,6 +41,11 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_ZBUFFER0CLEAN, cTarget->m_ZBuffer0Clean); DDX_Check(pDX, IDC_NOPOWER2FIX, cTarget->m_NoPower2Fix); DDX_Check(pDX, IDC_NOPERFCOUNTER, cTarget->m_NoPerfCounter); + + // 3D management + DDX_Check(pDX, IDC_NOTEXTURES, cTarget->m_NoTextures); + DDX_Check(pDX, IDC_WIREFRAME, cTarget->m_WireFrame); + DDX_Check(pDX, IDC_DISABLEFOGGING, cTarget->m_DisableFogging); } BEGIN_MESSAGE_MAP(CTabCompat, CDialog) diff --git a/host/TabWindow.cpp b/host/TabWindow.cpp index eb17c8e..813f0ae 100644 --- a/host/TabWindow.cpp +++ b/host/TabWindow.cpp @@ -58,11 +58,7 @@ void CTabWindow::DoDataExchange(CDataExchange* pDX) // screen resolution management DDX_Check(pDX, IDC_LIMITSCREENRES, cTarget->m_LimitScreenRes); DDX_LBIndex(pDX, IDC_LISTRES, cTarget->m_MaxScreenRes); - - // 3D management - 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_Radio(pDX, IDC_SUPPORTSVGA, cTarget->m_ResTypes); } static char *Resolutions[]={ diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 8e20f1c..9ee3898 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -166,6 +166,7 @@ public: int m_InitTS; int m_FakeVersionId; int m_MaxScreenRes; + int m_ResTypes; //}}AFX_DATA diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index d3a62db00e421c511093a5eb8c7000aa883c5f12..2d9f5aaa5b0f3f02c06ee6c239abc4cb4fc5d7ae 100644 GIT binary patch delta 1864 zcmajdZBUd|6ae6J?k*p@(8{uiDF}p+hR((kLkgL$g0Kq9>LO@RV62nt&>|n1qcqZl z-$}dP#Y1FDW@9>r$oqq)Y{q7slE!wNM$0B`NXrbFRm&eT>CnB)3zPln{qvlA&OPV8 zUpGI~`@hh8^C!po8Mtz*@;6m@TvZ#hsxz~ybLR5pt|>^T8hET}arF|Ly`aoiVzU>5 z#ga1*zUwo^P=R|%r&uUcn@ZQEK-qM(;&I*dv=Zy*KYEDxWADLLK7prHR zWX;!<%3ljb^5azVV@>Jmi8cK9iFgf9ZywLTtkgC)hx5yu^To@XzNKG_BmC0V891bj zY@HN^CPlaBdo7yy;5&T@@(nsyIvk}d%ADneRP3zJLWH@()$c59ifykJFvQ|_^h?+HZ5E4jYT$as5cS;4BZm1Fgs91xQcOkC5o z(Da|LCx0>}ud8gnQ3FO`U;-_~fd(c6CuI(TD~xL=ZeIiFI0UKmlMXF0 z5#m8Q#P{@$54^9(j0iK-h?g;y)7Y3yCI$`qtUXX&4~SNMt0&&B(iWe zlQ}B*w2Gv#$|nGh&>Ni1U};K)h#5P@{rBc^*9=J9w zJXf?u|4O@MYTXSwF2oZwAUb5fq?>g6S+eE~V8?8n8r~WSP^_h;`^Cm#a_?seVXiQd zqFrJayAVsqMTJGj(>Kxs2{a^~n@D;RrX*7au|=$S26^P#Ur6oJE2Y#UO>8x5ZbPBVZ$t-=)N_J`FKJrK}9Hw^Z6@_}FN6u0}T6c+p(zY99cvpCOn9S0156Lcd zXvib2ilcVvs&wj+4rWk5I-EyAY1$$(bO|$^WR~8qCA;)YGkK(Q%Bfv?r-^!`XMGfq zb}AHhV+r)eX$<)ky)tmb4I26*wlXj)0{dK delta 1722 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 |= GDIEMULATEDC; break; case 3: t->flags |= MAPGDITOPRIMARY; break; } + switch(dlg->m_ResTypes){ + case 0: t->flags4 |= SUPPORTSVGA; break; + case 1: t->flags4 |= SUPPORTHDTV; break; + case 2: t->flags4 |= NATIVERES; break; + } if(dlg->m_HookDI) t->flags |= HOOKDI; if(dlg->m_ModifyMouse) t->flags |= MODIFYMOUSE; if(dlg->m_OutProxyTrace) t->tflags |= OUTPROXYTRACE; @@ -299,6 +304,11 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) if(t->flags3 & GDIEMULATEDC) dlg->m_DCEmulationMode = 2; if(t->flags & MAPGDITOPRIMARY) dlg->m_DCEmulationMode = 3; + dlg->m_ResTypes = 0; + if(t->flags4 & SUPPORTSVGA) dlg->m_ResTypes = 0; + if(t->flags4 & SUPPORTHDTV) dlg->m_ResTypes = 1; + if(t->flags4 & NATIVERES) dlg->m_ResTypes = 2; + dlg->m_HookDI = t->flags & HOOKDI ? 1 : 0; dlg->m_ModifyMouse = t->flags & MODIFYMOUSE ? 1 : 0; dlg->m_OutProxyTrace = t->tflags & OUTPROXYTRACE ? 1 : 0;