Alexander Dorofeyev : ddraw: Temporarily activate viewport when clearing.

Alexandre Julliard julliard at winehq.org
Fri Apr 11 06:28:41 CDT 2008


Module: wine
Branch: master
Commit: 44143a97c7b30f402112e93aa868ae4e0bb66f2b
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=44143a97c7b30f402112e93aa868ae4e0bb66f2b

Author: Alexander Dorofeyev <alexd4 at inbox.lv>
Date:   Thu Apr 10 23:12:13 2008 +0300

ddraw: Temporarily activate viewport when clearing.

---

 dlls/ddraw/viewport.c |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/dlls/ddraw/viewport.c b/dlls/ddraw/viewport.c
index 90054ee..bb71955 100644
--- a/dlls/ddraw/viewport.c
+++ b/dlls/ddraw/viewport.c
@@ -667,6 +667,7 @@ IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
     ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
     DWORD color = 0x00000000;
     HRESULT hr;
+    LPDIRECT3DVIEWPORT3 current_viewport;
 
     TRACE("(%p/%p)->(%08x,%p,%08x)\n", This, iface, dwCount, lpRects, dwFlags);
     if (This->active_device == NULL) {
@@ -687,6 +688,10 @@ IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
 	}
     }
 
+    /* Need to temporarily activate viewport to clear it. Previously active one will be restored
+        afterwards. */
+    This->activate(This, TRUE);
+
     hr = IDirect3DDevice7_Clear(ICOM_INTERFACE(This->active_device, IDirect3DDevice7),
                                 dwCount,
                                 lpRects,
@@ -694,6 +699,14 @@ IDirect3DViewportImpl_Clear(IDirect3DViewport3 *iface,
                                 color,
                                 1.0,
                                 0x00000000);
+
+    IDirect3DDevice3_GetCurrentViewport(ICOM_INTERFACE(This->active_device, IDirect3DDevice3), &current_viewport);
+    if(current_viewport) {
+        IDirect3DViewportImpl *vp = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, current_viewport);
+        vp->activate(vp, TRUE);
+        IDirect3DViewport3_Release(current_viewport);
+    }
+
     LeaveCriticalSection(&ddraw_cs);
     return hr;
 }
@@ -989,6 +1002,7 @@ IDirect3DViewportImpl_Clear2(IDirect3DViewport3 *iface,
 {
     ICOM_THIS_FROM(IDirect3DViewportImpl, IDirect3DViewport3, iface);
     HRESULT hr;
+    LPDIRECT3DVIEWPORT3 current_viewport;
     TRACE("(%p)->(%08x,%p,%08x,%08x,%f,%08x)\n", This, dwCount, lpRects, dwFlags, dwColor, dvZ, dwStencil);
 
     EnterCriticalSection(&ddraw_cs);
@@ -997,6 +1011,10 @@ IDirect3DViewportImpl_Clear2(IDirect3DViewport3 *iface,
         LeaveCriticalSection(&ddraw_cs);
         return D3DERR_VIEWPORTHASNODEVICE;
     }
+    /* Need to temporarily activate viewport to clear it. Previously active one will be restored
+        afterwards. */
+    This->activate(This, TRUE);
+
     hr = IDirect3DDevice7_Clear(ICOM_INTERFACE(This->active_device, IDirect3DDevice7),
                                 dwCount,
                                 lpRects,
@@ -1004,6 +1022,12 @@ IDirect3DViewportImpl_Clear2(IDirect3DViewport3 *iface,
                                 dwColor,
                                 dvZ,
                                 dwStencil);
+    IDirect3DDevice3_GetCurrentViewport(ICOM_INTERFACE(This->active_device, IDirect3DDevice3), &current_viewport);
+    if(current_viewport) {
+        IDirect3DViewportImpl *vp = ICOM_OBJECT(IDirect3DViewportImpl, IDirect3DViewport3, current_viewport);
+        vp->activate(vp, TRUE);
+        IDirect3DViewport3_Release(current_viewport);
+    }
     LeaveCriticalSection(&ddraw_cs);
     return hr;
 }




More information about the wine-cvs mailing list