[YAROTOWS] Reintegrate the branch. For a brighter future.
[reactos.git] / reactos / subsystems / win32 / win32k / eng / copybits.c
index 2b79efd..afb2f16 100644 (file)
@@ -12,9 +12,9 @@
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  *  GNU General Public License for more details.
  *
- *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *  You should have received a copy of the GNU General Public License along
+ *  with this program; if not, write to the Free Software Foundation, Inc.,
+ *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 /*
  * COPYRIGHT:        See COPYING in the top level directory
@@ -26,7 +26,7 @@
  *        8/18/1999: Created
  */
 
-#include <w32k.h>
+#include <win32k.h>
 
 #define NDEBUG
 #include <debug.h>
  */
 BOOL APIENTRY
 EngCopyBits(SURFOBJ *psoDest,
-           SURFOBJ *psoSource,
-           CLIPOBJ *Clip,
-           XLATEOBJ *ColorTranslation,
-           RECTL *DestRect,
-           POINTL *SourcePoint)
+            SURFOBJ *psoSource,
+            CLIPOBJ *Clip,
+            XLATEOBJ *ColorTranslation,
+            RECTL *DestRect,
+            POINTL *SourcePoint)
 {
-  BOOLEAN   ret;
-  BYTE      clippingType;
-  RECT_ENUM RectEnum;
-  BOOL      EnumMore;
-  BLTINFO   BltInfo;
-  SURFACE *psurfDest;
-  SURFACE *psurfSource;
-
-  ASSERT(psoDest != NULL && psoSource != NULL && DestRect != NULL && SourcePoint != NULL);
-
-  psurfSource = CONTAINING_RECORD(psoSource, SURFACE, SurfObj);
-  SURFACE_LockBitmapBits(psurfSource);
-
-  psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj);
-  if (psoDest != psoSource)
-  {
-    SURFACE_LockBitmapBits(psurfDest);
-  }
-
-  // FIXME: Don't punt to the driver's DrvCopyBits immediately. Instead,
-  //        mark the copy block function to be DrvCopyBits instead of the
-  //        GDI's copy bit function so as to remove clipping from the
-  //        driver's responsibility
-
-  // If one of the surfaces isn't managed by the GDI
-  if((psoDest->iType!=STYPE_BITMAP) || (psoSource->iType!=STYPE_BITMAP))
-  {
-    // Destination surface is device managed
-    if(psoDest->iType!=STYPE_BITMAP)
+    BOOL      ret;
+    BYTE      clippingType;
+    RECT_ENUM RectEnum;
+    BOOL      EnumMore;
+    BLTINFO   BltInfo;
+    SURFACE *psurfDest;
+    SURFACE *psurfSource;
+
+    ASSERT(psoDest != NULL && psoSource != NULL && DestRect != NULL && SourcePoint != NULL);
+
+    psurfSource = CONTAINING_RECORD(psoSource, SURFACE, SurfObj);
+    psurfDest = CONTAINING_RECORD(psoDest, SURFACE, SurfObj);
+
+    // FIXME: Don't punt to the driver's DrvCopyBits immediately. Instead,
+    //        mark the copy block function to be DrvCopyBits instead of the
+    //        GDI's copy bit function so as to remove clipping from the
+    //        driver's responsibility
+
+    // If one of the surfaces isn't managed by the GDI
+    if ((psoDest->iType!=STYPE_BITMAP) || (psoSource->iType!=STYPE_BITMAP))
     {
-      /* FIXME: Eng* functions shouldn't call Drv* functions. ? */
-      if (psurfDest->flHooks & HOOK_COPYBITS)
-      {
-        ret = GDIDEVFUNCS(psoDest).CopyBits(
-          psoDest, psoSource, Clip, ColorTranslation, DestRect, SourcePoint);
-
-        if (psoDest != psoSource)
+        // Destination surface is device managed
+        if (psoDest->iType!=STYPE_BITMAP)
         {
-          SURFACE_UnlockBitmapBits(psurfDest);
-        }
-        SURFACE_UnlockBitmapBits(psurfSource);
-
-        return ret;
-      }
-    }
+            /* FIXME: Eng* functions shouldn't call Drv* functions. ? */
+            if (psurfDest->flags & HOOK_COPYBITS)
+            {
+                ret = GDIDEVFUNCS(psoDest).CopyBits(
+                          psoDest, psoSource, Clip, ColorTranslation, DestRect, SourcePoint);
 
-    // Source surface is device managed
-    if(psoSource->iType!=STYPE_BITMAP)
-    {
-      /* FIXME: Eng* functions shouldn't call Drv* functions. ? */
-      if (psurfSource->flHooks & HOOK_COPYBITS)
-      {
-        ret = GDIDEVFUNCS(psoSource).CopyBits(
-          psoDest, psoSource, Clip, ColorTranslation, DestRect, SourcePoint);
+                goto cleanup;
+            }
+        }
 
-        if (psoDest != psoSource)
+        // Source surface is device managed
+        if (psoSource->iType!=STYPE_BITMAP)
         {
-          SURFACE_UnlockBitmapBits(psurfDest);
+            /* FIXME: Eng* functions shouldn't call Drv* functions. ? */
+            if (psurfSource->flags & HOOK_COPYBITS)
+            {
+                ret = GDIDEVFUNCS(psoSource).CopyBits(
+                          psoDest, psoSource, Clip, ColorTranslation, DestRect, SourcePoint);
+
+                goto cleanup;
+            }
         }
-        SURFACE_UnlockBitmapBits(psurfSource);
 
-        return ret;
-      }
-    }
+        // If CopyBits wasn't hooked, BitBlt must be
+        ret = IntEngBitBlt(psoDest, psoSource,
+                           NULL, Clip, ColorTranslation, DestRect, SourcePoint,
+                           NULL, NULL, NULL, ROP3_TO_ROP4(SRCCOPY));
 
-    // If CopyBits wasn't hooked, BitBlt must be
-    ret = IntEngBitBlt(psoDest, psoSource,
-                       NULL, Clip, ColorTranslation, DestRect, SourcePoint,
-                       NULL, NULL, NULL, ROP3_TO_ROP4(SRCCOPY));
+        goto cleanup;
+    }
 
-    if (psoDest != psoSource)
+    // Determine clipping type
+    if (!Clip)
     {
-      SURFACE_UnlockBitmapBits(psurfDest);
+        clippingType = DC_TRIVIAL;
     }
-    SURFACE_UnlockBitmapBits(psurfSource);
-
-    return ret;
-  }
-
-  // Determine clipping type
-  if (Clip == (CLIPOBJ *) NULL)
-  {
-    clippingType = DC_TRIVIAL;
-  } else {
-    clippingType = Clip->iDComplexity;
-  }
-
-  BltInfo.DestSurface = psoDest;
-  BltInfo.SourceSurface = psoSource;
-  BltInfo.PatternSurface = NULL;
-  BltInfo.XlateSourceToDest = ColorTranslation;
-  BltInfo.Rop4 = SRCCOPY;
-
-  switch(clippingType)
+    else
     {
-      case DC_TRIVIAL:
-        BltInfo.DestRect = *DestRect;
-        BltInfo.SourcePoint = *SourcePoint;
-
-        DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_BitBltSrcCopy(&BltInfo);
-
-        MouseSafetyOnDrawEnd(psoDest);
-        if (psoDest != psoSource)
-        {
-          SURFACE_UnlockBitmapBits(psurfDest);
-        }
-        SURFACE_UnlockBitmapBits(psurfSource);
-
-        return(TRUE);
+        clippingType = Clip->iDComplexity;
+    }
 
-      case DC_RECT:
-        // Clip the blt to the clip rectangle
-        RECTL_bIntersectRect(&BltInfo.DestRect, DestRect, &Clip->rclBounds);
+    BltInfo.DestSurface = psoDest;
+    BltInfo.SourceSurface = psoSource;
+    BltInfo.PatternSurface = NULL;
+    BltInfo.XlateSourceToDest = ColorTranslation;
+    BltInfo.Rop4 = SRCCOPY;
 
-        BltInfo.SourcePoint.x = SourcePoint->x + BltInfo.DestRect.left - DestRect->left;
-        BltInfo.SourcePoint.y = SourcePoint->y + BltInfo.DestRect.top  - DestRect->top;
+    switch (clippingType)
+    {
+        case DC_TRIVIAL:
+            BltInfo.DestRect = *DestRect;
+            BltInfo.SourcePoint = *SourcePoint;
 
-        DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_BitBltSrcCopy(&BltInfo);
+            ret = DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_BitBltSrcCopy(&BltInfo);
+            break;
 
-        if (psoDest != psoSource)
-        {
-          SURFACE_UnlockBitmapBits(psurfDest);
-        }
-        SURFACE_UnlockBitmapBits(psurfSource);
+        case DC_RECT:
+            // Clip the blt to the clip rectangle
+            RECTL_bIntersectRect(&BltInfo.DestRect, DestRect, &Clip->rclBounds);
 
-        return(TRUE);
+            BltInfo.SourcePoint.x = SourcePoint->x + BltInfo.DestRect.left - DestRect->left;
+            BltInfo.SourcePoint.y = SourcePoint->y + BltInfo.DestRect.top  - DestRect->top;
 
-      case DC_COMPLEX:
+            ret = DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_BitBltSrcCopy(&BltInfo);
+            break;
 
-        CLIPOBJ_cEnumStart(Clip, FALSE, CT_RECTANGLES, CD_ANY, 0);
+        case DC_COMPLEX:
 
-        do {
-          EnumMore = CLIPOBJ_bEnum(Clip,(ULONG) sizeof(RectEnum), (PVOID) &RectEnum);
+            CLIPOBJ_cEnumStart(Clip, FALSE, CT_RECTANGLES, CD_ANY, 0);
 
-          if (RectEnum.c > 0)
-          {
-            RECTL* prclEnd = &RectEnum.arcl[RectEnum.c];
-            RECTL* prcl    = &RectEnum.arcl[0];
+            do
+            {
+                EnumMore = CLIPOBJ_bEnum(Clip,(ULONG) sizeof(RectEnum), (PVOID) &RectEnum);
 
-            do {
-              RECTL_bIntersectRect(&BltInfo.DestRect, prcl, DestRect);
+                if (RectEnum.c > 0)
+                {
+                    RECTL* prclEnd = &RectEnum.arcl[RectEnum.c];
+                    RECTL* prcl    = &RectEnum.arcl[0];
 
-              BltInfo.SourcePoint.x = SourcePoint->x + prcl->left - DestRect->left;
-              BltInfo.SourcePoint.y = SourcePoint->y + prcl->top - DestRect->top;
+                    do
+                    {
+                        RECTL_bIntersectRect(&BltInfo.DestRect, prcl, DestRect);
 
-              if(!DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_BitBltSrcCopy(&BltInfo))
-                return FALSE;
+                        BltInfo.SourcePoint.x = SourcePoint->x + prcl->left - DestRect->left;
+                        BltInfo.SourcePoint.y = SourcePoint->y + prcl->top - DestRect->top;
 
-              prcl++;
+                        if (!DibFunctionsForBitmapFormat[psoDest->iBitmapFormat].DIB_BitBltSrcCopy(&BltInfo))
+                        {
+                            ret = FALSE;
+                            goto cleanup;
+                        }
 
-              } while (prcl < prclEnd);
-            }
+                        prcl++;
 
-          } while(EnumMore);
+                    } while (prcl < prclEnd);
+                }
 
-          if (psoDest != psoSource)
-          {
-            SURFACE_UnlockBitmapBits(psurfDest);
-          }
-          SURFACE_UnlockBitmapBits(psurfSource);
+            } while (EnumMore);
+            ret = TRUE;
+            break;
 
-          return(TRUE);
+        default:
+            ASSERT(FALSE);
+            ret = FALSE;
+            break;
     }
 
-  if (psoDest != psoSource)
-  {
-    SURFACE_UnlockBitmapBits(psurfDest);
-  }
-  SURFACE_UnlockBitmapBits(psurfSource);
-
-  return FALSE;
+cleanup:
+    return ret;
 }
 
 BOOL APIENTRY
@@ -224,20 +186,7 @@ IntEngCopyBits(
     RECTL *prclDest,
     POINTL *ptlSource)
 {
-    BOOL bResult;
-
-    MouseSafetyOnDrawStart(psoSource, ptlSource->x, ptlSource->y,
-                         (ptlSource->x + abs(prclDest->right - prclDest->left)),
-                         (ptlSource->y + abs(prclDest->bottom - prclDest->top)));
-
-    MouseSafetyOnDrawStart(psoDest, prclDest->left, prclDest->top, prclDest->right, prclDest->bottom);
-
-    bResult = EngCopyBits(psoDest, psoSource, pco, pxlo, prclDest, ptlSource);
-
-    MouseSafetyOnDrawEnd(psoDest);
-    MouseSafetyOnDrawEnd(psoSource);
-
-    return bResult;
+    return EngCopyBits(psoDest, psoSource, pco, pxlo, prclDest, ptlSource);
 }