[PATCH 1/5] d3d8: Implement CopyRects() on top of wined3d_surface_blt().

Henri Verbeet hverbeet at codeweavers.com
Sun Oct 30 12:06:32 CDT 2011


---
 dlls/d3d8/device.c |   25 +++++++++++++++++++------
 1 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 2a78117..1ead518 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -931,6 +931,7 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(IDirect3DDevice8 *iface,
     enum wined3d_format_id srcFormat, destFormat;
     struct wined3d_resource_desc wined3d_desc;
     struct wined3d_resource *wined3d_resource;
+    UINT src_w, src_h;
 
     TRACE("iface %p, src_surface %p, src_rects %p, rect_count %u, dst_surface %p, dst_points %p.\n",
             iface, pSourceSurface, pSourceRects, cRects, pDestinationSurface, pDestPoints);
@@ -942,6 +943,8 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(IDirect3DDevice8 *iface,
     wined3d_resource = wined3d_surface_get_resource(Source->wined3d_surface);
     wined3d_resource_get_desc(wined3d_resource, &wined3d_desc);
     srcFormat = wined3d_desc.format;
+    src_w = wined3d_desc.width;
+    src_h = wined3d_desc.height;
 
     wined3d_resource = wined3d_surface_get_resource(Dest->wined3d_surface);
     wined3d_resource_get_desc(wined3d_resource, &wined3d_desc);
@@ -964,8 +967,9 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(IDirect3DDevice8 *iface,
     /* Quick if complete copy ... */
     if (!cRects && !pSourceRects && !pDestPoints)
     {
-        wined3d_surface_bltfast(Dest->wined3d_surface, 0, 0,
-                Source->wined3d_surface, NULL, WINEDDBLTFAST_NOCOLORKEY);
+        RECT rect = {0, 0, src_w, src_h};
+        wined3d_surface_blt(Dest->wined3d_surface, &rect,
+                Source->wined3d_surface, &rect, 0, NULL, WINED3DTEXF_POINT);
     }
     else
     {
@@ -975,16 +979,25 @@ static HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(IDirect3DDevice8 *iface,
         {
             for (i = 0; i < cRects; ++i)
             {
-                wined3d_surface_bltfast(Dest->wined3d_surface, pDestPoints[i].x, pDestPoints[i].y,
-                        Source->wined3d_surface, &pSourceRects[i], WINEDDBLTFAST_NOCOLORKEY);
+                UINT w = pSourceRects[i].right - pSourceRects[i].left;
+                UINT h = pSourceRects[i].bottom - pSourceRects[i].top;
+                RECT dst_rect = {pDestPoints[i].x, pDestPoints[i].y,
+                        pDestPoints[i].x + w, pDestPoints[i].y + h};
+
+                wined3d_surface_blt(Dest->wined3d_surface, &dst_rect,
+                        Source->wined3d_surface, &pSourceRects[i], 0, NULL, WINED3DTEXF_POINT);
             }
         }
         else
         {
             for (i = 0; i < cRects; ++i)
             {
-                wined3d_surface_bltfast(Dest->wined3d_surface, 0, 0,
-                        Source->wined3d_surface, &pSourceRects[i], WINEDDBLTFAST_NOCOLORKEY);
+                UINT w = pSourceRects[i].right - pSourceRects[i].left;
+                UINT h = pSourceRects[i].bottom - pSourceRects[i].top;
+                RECT dst_rect = {0, 0, w, h};
+
+                wined3d_surface_blt(Dest->wined3d_surface, &dst_rect,
+                        Source->wined3d_surface, &pSourceRects[i], 0, NULL, WINED3DTEXF_POINT);
             }
         }
     }
-- 
1.7.3.4




More information about the wine-patches mailing list