d3d9: Enforce ColorFill restrictions.
authorStefan Dösinger <stefan@codeweavers.com>
Fri, 4 Apr 2008 17:47:38 +0000 (19:47 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 7 Apr 2008 09:48:26 +0000 (11:48 +0200)
dlls/d3d9/device.c

index 5f9ef00d3ca2fc515b2ba98abf7e91bf359ec945..d69149d61cfdebe454a4f4773ed716223064ef0b 100644 (file)
@@ -624,9 +624,28 @@ static HRESULT  WINAPI  IDirect3DDevice9Impl_StretchRect(LPDIRECT3DDEVICE9EX ifa
 static HRESULT  WINAPI  IDirect3DDevice9Impl_ColorFill(LPDIRECT3DDEVICE9EX iface, IDirect3DSurface9* pSurface, CONST RECT* pRect, D3DCOLOR color) {
     IDirect3DDevice9Impl *This = (IDirect3DDevice9Impl *)iface;
     IDirect3DSurface9Impl *surface = (IDirect3DSurface9Impl *)pSurface;
+    WINED3DPOOL pool;
+    WINED3DRESOURCETYPE restype;
+    DWORD usage;
+    WINED3DSURFACE_DESC desc;
     HRESULT hr;
     TRACE("(%p) Relay\n" , This);
 
+    memset(&desc, 0, sizeof(desc));
+    desc.Usage = &usage;
+    desc.Pool = &pool;
+    desc.Type = &restype;
+    IWineD3DSurface_GetDesc(surface->wineD3DSurface, &desc);
+
+    /* This method is only allowed with surfaces that are render targets, or offscreen plain surfaces
+     * in D3DPOOL_DEFAULT
+     */
+    if(!(usage & WINED3DUSAGE_RENDERTARGET) && (pool != D3DPOOL_DEFAULT || restype != D3DRTYPE_SURFACE)) {
+        WARN("Surface is not a render target, or not a stand-alone D3DPOOL_DEFAULT surface\n");
+        return D3DERR_INVALIDCALL;
+    }
+
+    /* Colorfill can only be used on rendertarget surfaces, or offscreen plain surfaces in D3DPOOL_DEFAULT */
     /* Note: D3DRECT is compatible with WINED3DRECT */
     EnterCriticalSection(&d3d9_cs);
     hr = IWineD3DDevice_ColorFill(This->WineD3DDevice, surface->wineD3DSurface, (CONST WINED3DRECT*)pRect, color);