Use ANGLE's rect instead of D3D's in blitFramebuffer.

TRAC #22093

Signed-off-by: Geoff Lang
Signed-off-by: Daniel Koch

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1443 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index c711404..6c3c4fe 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -3592,146 +3592,157 @@
     int drawBufferWidth = drawFramebuffer->getColorbuffer()->getWidth();
     int drawBufferHeight = drawFramebuffer->getColorbuffer()->getHeight();
 
-    RECT sourceRect;
-    RECT destRect;
+    Rectangle sourceRect;
+    Rectangle destRect;
 
     if (srcX0 < srcX1)
     {
-        sourceRect.left = srcX0;
-        sourceRect.right = srcX1;
-        destRect.left = dstX0;
-        destRect.right = dstX1;
+        sourceRect.x = srcX0;
+        destRect.x = dstX0;
+        sourceRect.width = srcX1 - srcX0;
+        destRect.width = dstX1 - dstX0;
     }
     else
     {
-        sourceRect.left = srcX1;
-        destRect.left = dstX1;
-        sourceRect.right = srcX0;
-        destRect.right = dstX0;
+        sourceRect.x = srcX1;
+        destRect.x = dstX1;
+        sourceRect.width = srcX0 - srcX1;
+        destRect.width = dstX0 - dstX1;
     }
 
     if (srcY0 < srcY1)
     {
-        sourceRect.bottom = srcY1;
-        destRect.bottom = dstY1;
-        sourceRect.top = srcY0;
-        destRect.top = dstY0;
+        sourceRect.height = srcY1 - srcY0;
+        destRect.height = dstY1 - dstY0;
+        sourceRect.y = srcY0;
+        destRect.y = dstY0;
     }
     else
     {
-        sourceRect.bottom = srcY0;
-        destRect.bottom = dstY0;
-        sourceRect.top = srcY1;
-        destRect.top = dstY1;
+        sourceRect.height = srcY0 - srcY1;
+        destRect.height = dstY0 - srcY1;
+        sourceRect.y = srcY1;
+        destRect.y = dstY1;
     }
 
-    RECT sourceScissoredRect = sourceRect;
-    RECT destScissoredRect = destRect;
+    Rectangle sourceScissoredRect = sourceRect;
+    Rectangle destScissoredRect = destRect;
 
     if (mState.rasterizer.scissorTest)
     {
-        // Only write to parts of the destination framebuffer which pass the scissor test
-        // Please note: the destRect is now in D3D-style coordinates, so the *top* of the
-        // rect will be checked against scissorY, rather than the bottom.
-        if (destRect.left < mState.scissor.x)
+        // Only write to parts of the destination framebuffer which pass the scissor test.
+        if (destRect.x < mState.scissor.x)
         {
-            int xDiff = mState.scissor.x - destRect.left;
-            destScissoredRect.left = mState.scissor.x;
-            sourceScissoredRect.left += xDiff;
+            int xDiff = mState.scissor.x - destRect.x;
+            destScissoredRect.x = mState.scissor.x;
+            destScissoredRect.width -= xDiff;
+            sourceScissoredRect.x += xDiff;
+            sourceScissoredRect.width -= xDiff;
+
         }
 
-        if (destRect.right > mState.scissor.x + mState.scissor.width)
+        if (destRect.x + destRect.width > mState.scissor.x + mState.scissor.width)
         {
-            int xDiff = destRect.right - (mState.scissor.x + mState.scissor.width);
-            destScissoredRect.right = mState.scissor.x + mState.scissor.width;
-            sourceScissoredRect.right -= xDiff;
+            int xDiff = (destRect.x + destRect.width) - (mState.scissor.x + mState.scissor.width);
+            destScissoredRect.width -= xDiff;
+            sourceScissoredRect.width -= xDiff;
         }
 
-        if (destRect.top < mState.scissor.y)
+        if (destRect.y < mState.scissor.y)
         {
-            int yDiff = mState.scissor.y - destRect.top;
-            destScissoredRect.top = mState.scissor.y;
-            sourceScissoredRect.top += yDiff;
+            int yDiff = mState.scissor.y - destRect.y;
+            destScissoredRect.y = mState.scissor.y;
+            destScissoredRect.height -= yDiff;
+            sourceScissoredRect.y += yDiff;
+            sourceScissoredRect.height -= yDiff;
         }
 
-        if (destRect.bottom > mState.scissor.y + mState.scissor.height)
+        if (destRect.y + destRect.height > mState.scissor.y + mState.scissor.height)
         {
-            int yDiff = destRect.bottom - (mState.scissor.y + mState.scissor.height);
-            destScissoredRect.bottom = mState.scissor.y + mState.scissor.height;
-            sourceScissoredRect.bottom -= yDiff;
+            int yDiff = (destRect.y + destRect.height) - (mState.scissor.y + mState.scissor.height);
+            destScissoredRect.height  -= yDiff;
+            sourceScissoredRect.height -= yDiff;
         }
     }
 
     bool blitRenderTarget = false;
     bool blitDepthStencil = false;
 
-    RECT sourceTrimmedRect = sourceScissoredRect;
-    RECT destTrimmedRect = destScissoredRect;
+    Rectangle sourceTrimmedRect = sourceScissoredRect;
+    Rectangle destTrimmedRect = destScissoredRect;
 
     // The source & destination rectangles also may need to be trimmed if they fall out of the bounds of 
     // the actual draw and read surfaces.
-    if (sourceTrimmedRect.left < 0)
+    if (sourceTrimmedRect.x < 0)
     {
-        int xDiff = 0 - sourceTrimmedRect.left;
-        sourceTrimmedRect.left = 0;
-        destTrimmedRect.left += xDiff;
+        int xDiff = 0 - sourceTrimmedRect.x;
+        sourceTrimmedRect.x = 0;
+        sourceTrimmedRect.width -= xDiff;
+        destTrimmedRect.x += xDiff;
+        destTrimmedRect.width -= xDiff;
     }
 
-    if (sourceTrimmedRect.right > readBufferWidth)
+    if (sourceTrimmedRect.x + sourceTrimmedRect.width > readBufferWidth)
     {
-        int xDiff = sourceTrimmedRect.right - readBufferWidth;
-        sourceTrimmedRect.right = readBufferWidth;
-        destTrimmedRect.right -= xDiff;
+        int xDiff = (sourceTrimmedRect.x + sourceTrimmedRect.width) - readBufferWidth;
+        sourceTrimmedRect.width -= xDiff;
+        destTrimmedRect.width -= xDiff;
     }
 
-    if (sourceTrimmedRect.top < 0)
+    if (sourceTrimmedRect.y < 0)
     {
-        int yDiff = 0 - sourceTrimmedRect.top;
-        sourceTrimmedRect.top = 0;
-        destTrimmedRect.top += yDiff;
+        int yDiff = 0 - sourceTrimmedRect.y;
+        sourceTrimmedRect.y = 0;
+        sourceTrimmedRect.height -= yDiff;
+        destTrimmedRect.y += yDiff;
+        destTrimmedRect.height -= yDiff;
     }
 
-    if (sourceTrimmedRect.bottom > readBufferHeight)
+    if (sourceTrimmedRect.y + sourceTrimmedRect.height > readBufferHeight)
     {
-        int yDiff = sourceTrimmedRect.bottom - readBufferHeight;
-        sourceTrimmedRect.bottom = readBufferHeight;
-        destTrimmedRect.bottom -= yDiff;
+        int yDiff = (sourceTrimmedRect.y + sourceTrimmedRect.height) - readBufferHeight;
+        sourceTrimmedRect.height -= yDiff;
+        destTrimmedRect.height -= yDiff;
     }
 
-    if (destTrimmedRect.left < 0)
+    if (destTrimmedRect.x < 0)
     {
-        int xDiff = 0 - destTrimmedRect.left;
-        destTrimmedRect.left = 0;
-        sourceTrimmedRect.left += xDiff;
+        int xDiff = 0 - destTrimmedRect.x;
+        destTrimmedRect.x = 0;
+        destTrimmedRect.width -= xDiff;
+        sourceTrimmedRect.x += xDiff;
+        sourceTrimmedRect.width -= xDiff;
     }
 
-    if (destTrimmedRect.right > drawBufferWidth)
+    if (destTrimmedRect.x + destTrimmedRect.width > drawBufferWidth)
     {
-        int xDiff = destTrimmedRect.right - drawBufferWidth;
-        destTrimmedRect.right = drawBufferWidth;
-        sourceTrimmedRect.right -= xDiff;
+        int xDiff = (destTrimmedRect.x + destTrimmedRect.width) - drawBufferWidth;
+        destTrimmedRect.width -= xDiff;
+        sourceTrimmedRect.width -= xDiff;
     }
 
-    if (destTrimmedRect.top < 0)
+    if (destTrimmedRect.y < 0)
     {
-        int yDiff = 0 - destTrimmedRect.top;
-        destTrimmedRect.top = 0;
-        sourceTrimmedRect.top += yDiff;
+        int yDiff = 0 - destTrimmedRect.y;
+        destTrimmedRect.y = 0;
+        destTrimmedRect.height -= yDiff;
+        sourceTrimmedRect.y += yDiff;
+        sourceTrimmedRect.height -= yDiff;
     }
 
-    if (destTrimmedRect.bottom > drawBufferHeight)
+    if (destTrimmedRect.y + destTrimmedRect.height > drawBufferHeight)
     {
-        int yDiff = destTrimmedRect.bottom - drawBufferHeight;
-        destTrimmedRect.bottom = drawBufferHeight;
-        sourceTrimmedRect.bottom -= yDiff;
+        int yDiff = (destTrimmedRect.y + destTrimmedRect.height) - drawBufferHeight;
+        destTrimmedRect.height -= yDiff;
+        sourceTrimmedRect.height -= yDiff;
     }
 
     bool partialBufferCopy = false;
-    if (sourceTrimmedRect.bottom - sourceTrimmedRect.top < readBufferHeight ||
-        sourceTrimmedRect.right - sourceTrimmedRect.left < readBufferWidth || 
-        destTrimmedRect.bottom - destTrimmedRect.top < drawBufferHeight ||
-        destTrimmedRect.right - destTrimmedRect.left < drawBufferWidth ||
-        sourceTrimmedRect.top != 0 || destTrimmedRect.top != 0 || sourceTrimmedRect.left != 0 || destTrimmedRect.left != 0)
+    if (sourceTrimmedRect.height < readBufferHeight ||
+        sourceTrimmedRect.width < readBufferWidth || 
+        destTrimmedRect.height < drawBufferHeight ||
+        destTrimmedRect.width < drawBufferWidth ||
+        sourceTrimmedRect.y != 0 || destTrimmedRect.y != 0 || sourceTrimmedRect.x != 0 || destTrimmedRect.x != 0)
     {
         partialBufferCopy = true;
     }
@@ -3820,8 +3831,19 @@
             IDirect3DSurface9* readRenderTarget = readFramebuffer->getRenderTarget();
             IDirect3DSurface9* drawRenderTarget = drawFramebuffer->getRenderTarget();
 
-            HRESULT result = mDevice->StretchRect(readRenderTarget, &sourceTrimmedRect, 
-                                                  drawRenderTarget, &destTrimmedRect, D3DTEXF_NONE);
+            RECT finalSrcRect, finalDstRect; // TEMPORARY
+            finalSrcRect.left = sourceTrimmedRect.x;
+            finalSrcRect.right = sourceTrimmedRect.x + sourceTrimmedRect.width;
+            finalSrcRect.top = sourceTrimmedRect.y;
+            finalSrcRect.bottom = sourceTrimmedRect.y + sourceTrimmedRect.height;
+
+            finalDstRect.left = destTrimmedRect.x;
+            finalDstRect.right = destTrimmedRect.x + destTrimmedRect.width;
+            finalDstRect.top = destTrimmedRect.y;
+            finalDstRect.bottom = destTrimmedRect.y + destTrimmedRect.height;
+
+            HRESULT result = mDevice->StretchRect(readRenderTarget, &finalSrcRect, 
+                                                  drawRenderTarget, &finalDstRect, D3DTEXF_NONE);
 
             readRenderTarget->Release();
             drawRenderTarget->Release();