[PATCH 3/5] wined3d: Merge source rectangle operations into a single block in IWineD3DBaseSurfaceImpl_Blt().
Henri Verbeet
hverbeet at codeweavers.com
Thu May 20 02:12:20 CDT 2010
---
dlls/wined3d/surface_base.c | 76 +++++++++++++++++++++---------------------
1 files changed, 38 insertions(+), 38 deletions(-)
diff --git a/dlls/wined3d/surface_base.c b/dlls/wined3d/surface_base.c
index 43642de..4e964da 100644
--- a/dlls/wined3d/surface_base.c
+++ b/dlls/wined3d/surface_base.c
@@ -993,19 +993,46 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D
FIXME("Filters not supported in software blit\n");
}
- /* First check for the validity of source / destination rectangles. This was
- * verified using a test application + by MSDN.
- */
- if ((Src != NULL) && (SrcRect != NULL) &&
- ((SrcRect->bottom > Src->currentDesc.Height)||(SrcRect->bottom < 0) ||
- (SrcRect->top > Src->currentDesc.Height)||(SrcRect->top < 0) ||
- (SrcRect->left > Src->currentDesc.Width) ||(SrcRect->left < 0) ||
- (SrcRect->right > Src->currentDesc.Width) ||(SrcRect->right < 0) ||
- (SrcRect->right < SrcRect->left) ||(SrcRect->bottom < SrcRect->top)))
+ /* First check for the validity of source / destination rectangles.
+ * This was verified using a test application + by MSDN. */
+
+ if (SrcRect)
{
- WARN("Application gave us bad source rectangle for Blt.\n");
- return WINEDDERR_INVALIDRECT;
+ if (Src)
+ {
+ if (SrcRect->right < SrcRect->left || SrcRect->bottom < SrcRect->top
+ || SrcRect->left > Src->currentDesc.Width || SrcRect->left < 0
+ || SrcRect->top > Src->currentDesc.Height || SrcRect->top < 0
+ || SrcRect->right > Src->currentDesc.Width || SrcRect->right < 0
+ || SrcRect->bottom > Src->currentDesc.Height || SrcRect->bottom < 0)
+ {
+ WARN("Application gave us bad source rectangle for Blt.\n");
+ return WINEDDERR_INVALIDRECT;
+ }
+
+ if (!SrcRect->right || !SrcRect->bottom
+ || SrcRect->left == (int)Src->currentDesc.Width
+ || SrcRect->top == (int)Src->currentDesc.Height)
+ {
+ TRACE("Nothing to be done.\n");
+ return WINED3D_OK;
+ }
+ }
+
+ xsrc = *SrcRect;
+ }
+ else if (Src)
+ {
+ xsrc.left = 0;
+ xsrc.top = 0;
+ xsrc.right = Src->currentDesc.Width;
+ xsrc.bottom = Src->currentDesc.Height;
}
+ else
+ {
+ memset(&xsrc, 0, sizeof(xsrc));
+ }
+
/* For the Destination rect, it can be out of bounds on the condition that a clipper
* is set for the given surface.
*/
@@ -1032,14 +1059,6 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D
return WINED3D_OK;
}
- if (Src && SrcRect && (SrcRect->bottom <= 0 || SrcRect->right <= 0
- || SrcRect->top >= (int)Src->currentDesc.Height
- || SrcRect->left >= (int)Src->currentDesc.Width))
- {
- TRACE("Nothing to be done.\n");
- return WINED3D_OK;
- }
-
if (DestRect)
{
xdst = *DestRect;
@@ -1052,25 +1071,6 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D
xdst.right = This->currentDesc.Width;
}
- if (SrcRect)
- {
- xsrc = *SrcRect;
- }
- else
- {
- if (Src)
- {
- xsrc.top = 0;
- xsrc.bottom = Src->currentDesc.Height;
- xsrc.left = 0;
- xsrc.right = Src->currentDesc.Width;
- }
- else
- {
- memset(&xsrc,0,sizeof(xsrc));
- }
- }
-
/* The easy case : the source-less blits.... */
if (Src == NULL && DestRect)
{
--
1.6.4.4
More information about the wine-patches
mailing list