Preparation for StretchBlt pattern support:
authorGregor Schneider <grschneider@gmail.com>
Sun, 8 Feb 2009 20:28:20 +0000 (20:28 +0000)
committerGregor Schneider <grschneider@gmail.com>
Sun, 8 Feb 2009 20:28:20 +0000 (20:28 +0000)
- Supply BrushObj and BrushOrigin to IntStretchBlt
- Implement EngStretchBltROP to do the work, let EngStretchBlt call it (this allows ROP support for real now)

svn path=/trunk/; revision=39501

reactos/subsystems/win32/win32k/eng/bitblt.c
reactos/subsystems/win32/win32k/objects/bitblt.c
reactos/subsystems/win32/win32k/stubs/stubs.c

index 51eaabc..86dbc49 100644 (file)
@@ -771,8 +771,7 @@ NtGdiEngStretchBlt(
     IN RECTL  *prclDest,
     IN RECTL  *prclSrc,
     IN POINTL  *MaskOrigin,
-    IN ULONG  Mode
-)
+    IN ULONG  Mode)
 {
     COLORADJUSTMENT  ca;
     POINTL  lBrushOrigin;
@@ -807,9 +806,12 @@ NtGdiEngStretchBlt(
     return EngStretchBlt(psoDest, psoSource, Mask, ClipRegion, ColorTranslation, &ca, &lBrushOrigin, &rclDest, &rclSrc, &lMaskOrigin, Mode);
 }
 
+/*
+ * @implemented
+ */
 BOOL
 APIENTRY
-EngStretchBlt(
+EngStretchBltROP(
     IN SURFOBJ  *psoDest,
     IN SURFOBJ  *psoSource,
     IN SURFOBJ  *Mask,
@@ -820,11 +822,10 @@ EngStretchBlt(
     IN RECTL  *prclDest,
     IN RECTL  *prclSrc,
     IN POINTL  *MaskOrigin,
-    IN ULONG  Mode
-)
+    IN ULONG  Mode,
+    IN BRUSHOBJ *Brush,
+    IN DWORD ROP4)
 {
-    // www.osr.com/ddk/graphics/gdifncs_0bs7.htm
-
     RECTL              InputRect;
     RECTL              OutputRect;
     POINTL             Translate;
@@ -835,9 +836,9 @@ EngStretchBlt(
     PSTRETCHRECTFUNC   BltRectFunc;
     BOOLEAN            Ret;
     POINTL             AdjustedBrushOrigin;
-    BOOL               UsesSource = ROP4_USES_SOURCE(Mode);
+    BOOL               UsesSource = ROP4_USES_SOURCE(ROP4);
 
-    if (Mode == R4_NOOP)
+    if (ROP4 == R4_NOOP)
     {
         /* Copy destination onto itself: nop */
         return TRUE;
@@ -964,7 +965,7 @@ EngStretchBlt(
 
     Ret = (*BltRectFunc)(psoOutput, psoInput, Mask, ClipRegion,
                          ColorTranslation, &OutputRect, &InputRect, MaskOrigin,
-                         &AdjustedBrushOrigin, Mode);
+                         &AdjustedBrushOrigin, ROP4);
 
     IntEngLeave(&EnterLeaveDest);
     if (UsesSource)
@@ -975,6 +976,40 @@ EngStretchBlt(
     return Ret;
 }
 
+/*
+ * @implemented
+ */
+BOOL
+APIENTRY
+EngStretchBlt(
+    IN SURFOBJ  *psoDest,
+    IN SURFOBJ  *psoSource,
+    IN SURFOBJ  *Mask,
+    IN CLIPOBJ  *ClipRegion,
+    IN XLATEOBJ  *ColorTranslation,
+    IN COLORADJUSTMENT  *pca,
+    IN POINTL  *BrushOrigin,
+    IN RECTL  *prclDest,
+    IN RECTL  *prclSrc,
+    IN POINTL  *MaskOrigin,
+    IN ULONG  Mode)
+{
+    return EngStretchBltROP(
+        psoDest,
+        psoSource,
+        Mask,
+        ClipRegion,
+        ColorTranslation,
+        pca,
+        BrushOrigin,
+        prclDest,
+        prclSrc,
+        MaskOrigin,
+        Mode,
+        NULL,
+        SRCCOPY);
+}
+
 BOOL APIENTRY
 IntEngStretchBlt(SURFOBJ *psoDest,
                  SURFOBJ *psoSource,
@@ -1104,8 +1139,8 @@ IntEngStretchBlt(SURFOBJ *psoDest,
     if (! ret)
     {
         // FIXME: see previous fixme
-        ret = EngStretchBlt(psoDest, psoSource, MaskSurf, ClipRegion, ColorTranslation,
-                            &ca, BrushOrigin, &OutputRect, &InputRect, NULL, ROP);
+        ret = EngStretchBltROP(psoDest, psoSource, MaskSurf, ClipRegion, ColorTranslation,
+                            &ca, BrushOrigin, &OutputRect, &InputRect, NULL, COLORONCOLOR, Brush, ROP);
     }
 
     if (UsesSource)
index 4473962..4e9809d 100644 (file)
@@ -756,7 +756,9 @@ NtGdiStretchBlt(
     RECTL SourceRect;
     BOOL Status = FALSE;
     XLATEOBJ *XlateObj = NULL;
+    POINTL BrushOrigin;
     PGDIBRUSHOBJ BrushObj = NULL;
+    GDIBRUSHINST BrushInst;
     BOOL UsesSource = ROP3_USES_SOURCE(ROP);
     BOOL UsesPattern = ROP3_USES_PATTERN(ROP);
 
@@ -835,6 +837,9 @@ NtGdiStretchBlt(
         IntLPtoDP(DCSrc, (LPPOINT)&SourceRect, 2);
     }
 
+    BrushOrigin.x = 0;
+    BrushOrigin.y = 0;
+
     /* Determine surfaces to be used in the bitblt */
     BitmapDest = SURFACE_LockSurface(DCDest->w.hBitmap);
     if (BitmapDest == NULL)
@@ -920,13 +925,16 @@ NtGdiStretchBlt(
             SetLastWin32Error(ERROR_INVALID_HANDLE);
             goto failed;
         }
+        BrushOrigin = *((PPOINTL)&BrushObj->ptOrigin);
+        IntGdiInitBrushInstance(&BrushInst, BrushObj, DCDest->XlateBrush);
     }
 
     /* Perform the bitblt operation */
     Status = IntEngStretchBlt(&BitmapDest->SurfObj, &BitmapSrc->SurfObj,
         NULL, DCDest->CombinedClip, XlateObj,
-        &DestRect, &SourceRect, NULL, NULL, NULL,
-        ROP3_TO_ROP4(ROP));
+        &DestRect, &SourceRect, NULL, 
+        BrushObj ? &BrushInst.BrushObject : NULL,
+        &BrushOrigin, ROP3_TO_ROP4(ROP));
 
 failed:
     if (XlateObj)
index 96f0736..de53f46 100644 (file)
@@ -938,26 +938,6 @@ EngReadStateEvent(
    UNIMPLEMENTED;
    return 0;
 }
-BOOL APIENTRY
-EngStretchBltROP(
-   IN SURFOBJ *Dest,
-   IN SURFOBJ *Source,
-   IN SURFOBJ *Mask,
-   IN CLIPOBJ *Clip,
-   IN XLATEOBJ *Xlate,
-   IN COLORADJUSTMENT *ColorAdjustment,
-   IN POINTL *BrushOrigin,
-   IN RECTL *DestRect,
-   IN RECTL *SourceRect,
-   IN POINTL *MaskPoint,
-   IN ULONG Mode,
-   IN BRUSHOBJ *BrushObj,
-   IN DWORD ROP4)
-{
-   UNIMPLEMENTED;
-   return FALSE;
-}
-
 
 /*
  * @unimplemented