diff --git a/build/dxwnd.dll b/build/dxwnd.dll
index 37e8849..763a8a5 100644
--- a/build/dxwnd.dll
+++ b/build/dxwnd.dll
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8448e58dc97c4a242f28a3c94cd1e3837f13fd9cb48d6c3342f84df91fccbbf3
-size 779264
+oid sha256:8f543c951f150e29ae64f702c21bceeaa46d3bda294913e9b03346aa6aa276ea
+size 781312
diff --git a/build/dxwnd.exe b/build/dxwnd.exe
index 07ebb26..470de73 100644
--- a/build/dxwnd.exe
+++ b/build/dxwnd.exe
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:41137464c3c599b09e720882a36a3e1c939081fa477027447459c269fdb15971
+oid sha256:864a303e49a88b3bee7353573304b29f4b64852f8fae83b8ac33502099c46a08
size 673280
diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp
index f3355a4..95c04fe 100644
--- a/dll/dxwnd.cpp
+++ b/dll/dxwnd.cpp
@@ -27,7 +27,7 @@ along with this program. If not, see .
#include "TlHelp32.h"
-#define VERSION "2.04.06"
+#define VERSION "2.04.06.fx2"
#define DDTHREADLOCK 1
diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo
index 233884c..459a95f 100644
Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ
diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp
index 1dcc8e5..004b292 100644
--- a/dll/gdi32.cpp
+++ b/dll/gdi32.cpp
@@ -3134,18 +3134,125 @@ BOOL WINAPI extGdiAlphaBlend(HDC hdcDest, int xoriginDest, int yoriginDest, int
return ret;
}
+static char *sGradientMode(ULONG mode)
+{
+ char *s;
+ switch(mode){
+ case GRADIENT_FILL_RECT_H: s="RECT_H"; break;
+ case GRADIENT_FILL_RECT_V: s="RECT_V"; break;
+ case GRADIENT_FILL_TRIANGLE: s="TRIANGLE"; break;
+ default: s="???"; break;
+ }
+ return s;
+}
+
BOOL WINAPI extGdiGradientFill(HDC hdc, PTRIVERTEX pVertex, ULONG nVertex, PVOID pMesh, ULONG nMesh, ULONG ulMode)
{
- _Warn("GdiGradientFill");
+ // v2.04.06.fx2: found in RHEM when DirectX emulation is off (?).
+ // temporary version - doesn't scale nor return error
+ BOOL ret;
+ OutTraceDW("GDI.GdiGradientFill: HDC=%x nVertex=%d nMesh=%d mode=%x(%s)\n",
+ hdc, nVertex, nMesh, ulMode, sGradientMode(ulMode));
+
+ ret = (*pGdiGradientFill)(hdc, pVertex, nVertex, pMesh, nMesh, ulMode);
+ if(!ret) OutTraceE("GDI.GdiGradientFill ERROR: err=%d\n", GetLastError());
return TRUE;
}
-BOOL WINAPI extGdiTransparentBlt(HDC hdcDest, int xoriginDest, int yoriginDest, int wDest, int hDest,
- HDC hdcSrc, int xoriginSrc, int yoriginSrc, int wSrc, int hSrc, UINT crTransparent)
+BOOL WINAPI extGdiTransparentBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight,
+ HDC hdcSrc, int nXSrc, int nYSrc, int nWSrc, int nHSrc, UINT crTransparent)
{
- // to be handled the 4 flux cases .....
- _Warn("GdiTransparentBlt");
- return TRUE;
+ BOOL res;
+ BOOL IsToScreen;
+ BOOL IsFromScreen;
+ BOOL IsDCLeakageSrc = FALSE;
+ BOOL IsDCLeakageDest = FALSE;
+ int Flux;
+
+ OutTraceDW("GDI.GdiTransparentBlt: HDC=%x nXDest=%d nYDest=%d nWidth=%d nHeight=%d hdcSrc=%x nXSrc=%d nYSrc=%d nWSrc=%d nHSrc=%d transp=%x\n",
+ hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWSrc, nHSrc, crTransparent);
+
+ OutTraceB("GDI.GdiTransparentBlt: DEBUG FullScreen=%x target hdctype=%x(%s) hwnd=%x\n",
+ dxw.IsFullScreen(), (*pGetObjectType)(hdcDest), ExplainDCType((*pGetObjectType)(hdcDest)), WindowFromDC(hdcDest));
+
+ if(dxw.GDIEmulationMode == GDIMODE_EMULATED){
+ if (hdcDest==dxw.RealHDC) hdcDest=dxw.VirtualHDC;
+ OutTraceB("GDI.GdiTransparentBlt: DEBUG emulated hdc dest=%x->%x\n", dxw.RealHDC, hdcDest);
+ }
+
+ if(hdcDest == NULL){
+ // happens in Reah, hdc is NULL despite the fact that BeginPaint returns a valid DC. Too bad, we recover here ...
+ hdcDest = (*pGDIGetDC)(dxw.GethWnd());
+ OutTraceB("GDI.GdiTransparentBlt: DEBUG hdc dest=NULL->%x\n", hdcDest);
+ IsDCLeakageDest = TRUE;
+ }
+ if(hdcSrc == NULL){
+ hdcSrc = (*pGDIGetDC)(dxw.GethWnd());
+ OutTraceB("GDI.GdiTransparentBlt: DEBUG hdc src=NULL->%x\n", hdcSrc);
+ IsDCLeakageSrc = TRUE;
+ }
+
+ IsToScreen=(OBJ_DC == (*pGetObjectType)(hdcDest));
+ IsFromScreen=(OBJ_DC == (*pGetObjectType)(hdcSrc));
+ Flux = (IsToScreen ? 1 : 0) + (IsFromScreen ? 2 : 0);
+ if (IsToScreen && (dxw.dwFlags3 & NOGDIBLT)) return TRUE;
+
+ if(dxw.IsToRemap(hdcDest) && (hdcDest != hdcSrc)){
+ switch(dxw.GDIEmulationMode){
+ case GDIMODE_SHAREDDC:
+ switch(Flux){
+ case 0: // memory to memory
+ res=(*pGdiTransparentBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWSrc, nHSrc, crTransparent);
+ break;
+ case 1: // memory to screen
+ case 3: // screen to screen
+ sdc.GetPrimaryDC(hdcDest);
+ res=(*pGdiTransparentBlt)(sdc.GetHdc(), nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWSrc, nHSrc, crTransparent);
+ sdc.PutPrimaryDC(hdcDest, TRUE, nXDest, nYDest, nWidth, nHeight);
+ break;
+ case 2: // screen to memory using virtual screen
+ sdc.GetPrimaryDC(hdcSrc);
+ res=(*pGdiTransparentBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, sdc.GetHdc(), nXSrc, nYSrc, nWSrc, nHSrc, crTransparent);
+ sdc.PutPrimaryDC(hdcSrc, FALSE, nXSrc, nYSrc, nWSrc, nHSrc);
+ break;
+ }
+ break;
+ case GDIMODE_STRETCHED: {
+ int nWDest, nHDest;
+ nWDest= nWidth;
+ nHDest= nHeight;
+ switch(Flux){
+ case 1: // memory to screen
+ dxw.MapClient(&nXDest, &nYDest, &nWDest, &nHDest);
+ break;
+ case 2: // screen to memory
+ dxw.MapClient(&nXSrc, &nYSrc, &nWidth, &nHeight);
+ break;
+ default:
+ break;
+ }
+ res=(*pGdiTransparentBlt)(hdcDest, nXDest, nYDest, nWDest, nHDest, hdcSrc, nXSrc, nYSrc, nWSrc, nHSrc, crTransparent);
+ OutTraceB("GDI.GdiTransparentBlt: DEBUG DC dest=(%d,%d) size=(%d,%d)\n", nXDest, nYDest, nWDest, nHDest);
+ }
+ break;
+ case GDIMODE_EMULATED:
+ default:
+ res=(*pGdiTransparentBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWSrc, nHSrc, crTransparent);
+ break;
+ }
+ }
+ else {
+ res=(*pGdiTransparentBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWSrc, nHSrc, crTransparent);
+ }
+
+ if(IsDCLeakageSrc) (*pGDIReleaseDC)(dxw.GethWnd(), hdcSrc);
+ if(IsDCLeakageDest) (*pGDIReleaseDC)(dxw.GethWnd(), hdcDest);
+ if(res && IsToScreen) {
+ dxw.ShowOverlay(hdcDest);
+ if(dxw.dwFlags8 & MARKGDI32) dxw.Mark(hdcDest, FALSE, RGB(255, 255, 255), nXDest, nYDest, nWidth, nHeight);
+ }
+ if(!res) OutTraceE("GDI.GdiTransparentBlt: ERROR err=%d at %d\n", GetLastError(), __LINE__);
+ return res;
}
BOOL WINAPI extPie(HDC hdc, int nLeftRect, int nTopRect, int nRightRect, int nBottomRect, int nXRadial1, int nYRadial1, int nXRadial2, int nYRadial2)
diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps
index 57ee12d..ac4a258 100644
Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ
diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc
index 384e7d9..6508883 100644
Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ
diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo
index d566e26..bd88006 100644
Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ
diff --git a/host/dxwndhost.vs2008.vcproj.DESKTOP-Q3RE27J.user.user b/host/dxwndhost.vs2008.vcproj.DESKTOP-Q3RE27J.user.user
new file mode 100644
index 0000000..723bba8
--- /dev/null
+++ b/host/dxwndhost.vs2008.vcproj.DESKTOP-Q3RE27J.user.user
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+