[ros-diffs] [tkreuzer] 56224: [WIN32K] - Fix right-to-left support the new EngBitBlt code - Remove an ASSERT that we don't support - Fix clipping in IntEngBitBlt by bailing out when the target rect got empty -...

tkreuzer at svn.reactos.org tkreuzer at svn.reactos.org
Sat Mar 24 21:07:47 UTC 2012


Author: tkreuzer
Date: Sat Mar 24 21:07:46 2012
New Revision: 56224

URL: http://svn.reactos.org/svn/reactos?rev=56224&view=rev
Log:
[WIN32K]
- Fix right-to-left support the new EngBitBlt code
- Remove an ASSERT that we don't support
- Fix clipping in IntEngBitBlt by bailing out when the target rect got empty
- Delete obsolete file
You can use the code now, but there is a bug in the clipping code somewhere, sometimes causing the taskbar to be overwritten

Removed:
    trunk/reactos/subsystems/win32/win32k/diblib/engbitblt.c
Modified:
    trunk/reactos/subsystems/win32/win32k/eng/bitblt_new.c

Removed: trunk/reactos/subsystems/win32/win32k/diblib/engbitblt.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/diblib/engbitblt.c?rev=56223&view=auto
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/diblib/engbitblt.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/diblib/engbitblt.c (removed)
@@ -1,282 +1,0 @@
-
-#include "DibLib.h"
-
-#define ROP4_FGND(Rop4)    ((Rop4) & 0x00FF)
-#define ROP4_BKGND(Rop4)    (((Rop4) & 0xFF00) >> 8)
-
-#define ROP4_USES_SOURCE(Rop4)  (((((Rop4) & 0xCC00) >> 2) != ((Rop4) & 0x3300)) || ((((Rop4) & 0xCC) >> 2) != ((Rop4) & 0x33)))
-#define ROP4_USES_MASK(Rop4)    (((Rop4) & 0xFF00) != (((Rop4) & 0xff) << 8))
-#define ROP4_USES_DEST(Rop4)    (((((Rop4) & 0xAA) >> 1) != ((Rop4) & 0x55)) || ((((Rop4) & 0xAA00) >> 1) != ((Rop4) & 0x5500)))
-#define ROP4_USES_PATTERN(Rop4) (((((Rop4) & 0xF0) >> 4) != ((Rop4) & 0x0F)) || ((((Rop4) & 0xF000) >> 4) != ((Rop4) & 0x0F00)))
-
-
-typedef struct
-{
-    ULONG c;
-    RECTL arcl[5];
-} RECT_ENUM;
-
-static
-VOID
-AdjustOffsetAndSize(
-    _Out_ PPOINTL pptOffset,
-    _Out_ PSIZEL psizTrg,
-    _In_ PPOINTL pptlSrc,
-    _In_ PSIZEL psizSrc)
-{
-    ULONG x, y, cxMax, cyMax;
-
-    x = pptlSrc->x + pptOffset->x;
-    if (x < 0) pptOffset->x -= x, x = 0;
-
-    cxMax = psizSrc->cx - x;
-    if (psizTrg->cx > cxMax) psizTrg->cx= cxMax;
-
-    y = pptlSrc->y + pptOffset->y;
-    if (y < 0) pptOffset->y -= y, y = 0;
-
-    cyMax = psizSrc->cy - y;
-    if (psizTrg->cy > cyMax) psizTrg->cy = cyMax;
-}
-
-BOOL
-APIENTRY
-EngBitBlt(
-    _Inout_ SURFOBJ *psoTrg,
-    _In_opt_ SURFOBJ *psoSrc,
-    _In_opt_ SURFOBJ *psoMask,
-    _In_opt_ CLIPOBJ *pco,
-    _In_opt_ XLATEOBJ *pxlo,
-    _In_ RECTL *prclTrg,
-    _When_(psoSrc, _In_) POINTL *pptlSrc,
-    _When_(psoMask, _In_) POINTL *pptlMask,
-    _In_opt_ BRUSHOBJ *pbo,
-    _When_(pbo, _In_) POINTL *pptlBrush,
-    _In_ ROP4 rop4)
-{
-    BLTDATA bltdata;
-    ULONG i, iDComplexity, iDirection, rop3Fg, iFunctionIndex;
-    RECTL rcTrg;
-    POINTL ptOffset, ptSrc, ptMask;
-    SIZEL sizTrg;
-    PFN_DIBFUNCTION pfnBitBlt;
-    BOOL bEnumMore;
-    RECT_ENUM rcenum;
-
-    /* Clip the target rect to the extents of the target surface */
-    rcTrg.left = min(prclTrg->left, 0);
-    rcTrg.top = min(prclTrg->top, 0);
-    rcTrg.right = min(prclTrg->right, psoTrg->sizlBitmap.cx);
-    rcTrg.bottom = min(prclTrg->bottom, psoTrg->sizlBitmap.cy);
-
-    /* Check if there is a clipping region */
-    iDComplexity = pco ? pco->iDComplexity : DC_TRIVIAL;
-    if (iDComplexity != DC_TRIVIAL)
-    {
-        /* Clip the target rect to the bounds of the clipping region */
-        RECTL_bIntersectRect(&rcTrg, prclTrg, &pco->rclBounds);
-    }
-
-    /* Calculate initial offset and size */
-    ptOffset.x = rcTrg.left - prclTrg->left;
-    ptOffset.y = rcTrg.top - prclTrg->top;
-    sizTrg.cx = rcTrg.right - rcTrg.left;
-    sizTrg.cy = rcTrg.bottom - rcTrg.top;
-
-    /* Check if the ROP uses a source */
-    if (ROP4_USES_SOURCE(rop4))
-    {
-        /* Must have a source surface and point */
-        if (!psoSrc || !pptlSrc) return FALSE;
-
-        /* Get the source point */
-        ptSrc = *pptlSrc;
-
-        /* Clip against the extents of the source surface */
-        AdjustOffsetAndSize(&ptOffset, &sizTrg, &ptSrc, &psoSrc->sizlBitmap);
-
-        /* Check if source and target are equal */
-        if (psoSrc == psoTrg)
-        {
-            /* Use 0 to mark source as equal to target */
-            bltdata.siSrc.iFormat = 0;
-
-        }
-        else
-        {
-            bltdata.siSrc.iFormat = psoSrc->iBitmapFormat;
-        }
-        bltdata.siSrc.pjBase = psoSrc->pvScan0;
-        bltdata.siSrc.lDelta = psoSrc->lDelta;
-    }
-    else
-    {
-        ptSrc.x = 0;
-        ptSrc.y = 0;
-    }
-
-    /* Check if the ROP uses a mask */
-    if (ROP4_USES_MASK(rop4))
-    {
-        /* Must have a mask surface and point */
-        if (!psoMask || !pptlMask) return FALSE;
-
-        /* Get the mask point */
-        ptMask = *pptlMask;
-
-        /* Clip against the extents of the mask surface */
-        AdjustOffsetAndSize(&ptOffset, &sizTrg, &ptMask, &psoMask->sizlBitmap);
-
-        bltdata.siMsk.iFormat = psoMask->iBitmapFormat;
-        bltdata.siMsk.pjBase = psoMask->pvScan0;
-        bltdata.siMsk.lDelta = psoMask->lDelta;
-    }
-    else
-    {
-        ptMask.x = 0;
-        ptMask.y = 0;
-    }
-
-    /* Adjust the points */
-    ptSrc.x += ptOffset.x;
-    ptSrc.y += ptOffset.y;
-    ptMask.x += ptOffset.x;
-    ptMask.y += ptOffset.y;
-
-    /* Recalculate the target rect */
-    rcTrg.left = prclTrg->left + ptOffset.x;
-    rcTrg.top = prclTrg->top + ptOffset.y;
-    rcTrg.right = rcTrg.left + sizTrg.cx;
-    rcTrg.bottom = rcTrg.top + sizTrg.cy;
-
-    bltdata.ulWidth = prclTrg->right - prclTrg->left;
-    bltdata.ulHeight = prclTrg->bottom - prclTrg->top;
-    bltdata.pxlo = pxlo;
-    bltdata.rop4 = rop4;
-
-    bltdata.siDst.iFormat = psoTrg->iBitmapFormat;
-    bltdata.siDst.pjBase = psoTrg->pvScan0;
-    bltdata.siDst.lDelta = psoTrg->lDelta;
-    bltdata.siDst.ptOrig.x = prclTrg->left;
-    bltdata.siDst.ptOrig.y = prclTrg->top;
-
-
-    /* Check of the ROP uses a pattern / brush */
-    if (ROP4_USES_PATTERN(rop4))
-    {
-        /* Must have a brush */
-        if (!pbo) return FALSE;
-
-        /* Copy the solid color */
-        bltdata.ulSolidColor = pbo->iSolidColor;
-
-        /* Check if this is a pattern brush */
-        if (pbo->iSolidColor == 0xFFFFFFFF)
-        {
-            // FIXME: use EBRUSHOBJ
-
-            bltdata.siPat.iFormat = 0;//psoPat->iBitmapFormat;
-            bltdata.siPat.pjBase = 0;//psoPat->pvScan0;
-            bltdata.siPat.lDelta = 0;//psoPat->lDelta;
-            bltdata.siPat.ptOrig = *pptlBrush;
-
-            bltdata.ulPatWidth = 0;
-            bltdata.ulPatHeight = 0;
-        }
-    }
-
-    /* Analyze the copying direction */
-    if (psoTrg == psoSrc)
-    {
-        if (rcTrg.top < ptSrc.y)
-            iDirection = rcTrg.left < ptSrc.x ? CD_RIGHTDOWN : CD_LEFTDOWN;
-        else
-            iDirection = rcTrg.left < ptSrc.x ? CD_RIGHTUP : CD_LEFTUP;
-    }
-    else
-        iDirection = CD_ANY;
-
-    /* Check if this is a masking ROP */
-    if (ROP4_USES_MASK(rop4))
-    {
-        bltdata.apfnDoRop[0] = gapfnRop[ROP4_BKGND(rop4)];
-        bltdata.apfnDoRop[1] = gapfnRop[ROP4_FGND(rop4)];
-    }
-
-    /* Get the foreground ROP index */
-    rop3Fg = ROP4_FGND(rop4);
-
-    /* Get the function index */
-    iFunctionIndex = aiIndexPerRop[rop3Fg];
-
-    /* Get the dib function */
-    pfnBitBlt = apfnDibFunction[iFunctionIndex];
-
-    /* Check if we need to enumerate rects */
-    if (iDComplexity == DC_COMPLEX)
-    {
-        /* Start the enumeration of the clip object */
-        CLIPOBJ_cEnumStart(pco, FALSE, CT_RECTANGLES, iDirection, 0);
-        do
-        {
-            /* Enumerate a set of rectangles */
-            bEnumMore = CLIPOBJ_bEnum(pco, sizeof(rcenum), (ULONG*)&rcenum);
-
-            /* Loop all rectangles we got */
-            for (i = 0; i < rcenum.c; i++)
-            {
-                /* Intersect this rect with the already calculated bounds rect */
-                if (!RECTL_bIntersectRect(&rcenum.arcl[i], &rcenum.arcl[i], &rcTrg))
-                {
-                    /* This rect is outside the valid bounds, continue */
-                    continue;
-                }
-
-                /* Copy the target start point */
-                bltdata.siDst.ptOrig.x = rcenum.arcl[i].left;
-                bltdata.siDst.ptOrig.x = rcenum.arcl[i].top;
-
-                /* Calculate width and height of this rect */
-                bltdata.ulWidth = rcenum.arcl[i].right - rcenum.arcl[i].left;
-                bltdata.ulHeight = rcenum.arcl[i].bottom - rcenum.arcl[i].top;
-
-                /* Calculate the offset of this rect from the original coordinates */
-                ptOffset.x = rcenum.arcl[i].left - prclTrg->left;
-                ptOffset.y = rcenum.arcl[i].top - prclTrg->top;
-
-                /* Calculate current origin for source and mask */
-                bltdata.siSrc.ptOrig.x = pptlSrc->x + ptOffset.x;
-                bltdata.siSrc.ptOrig.y = pptlSrc->y + ptOffset.y;
-                bltdata.siMsk.ptOrig.x = pptlMask->x + ptOffset.x;
-                bltdata.siMsk.ptOrig.y = pptlMask->y + ptOffset.y;
-
-                //bltdata.siPat.ptOrig.x = (pptlMask->x + ptOffset.x) % psoMask->sizlBitmap.cx;
-                //bltdata.siPat.ptOrig.y = (pptlMask->y + ptOffset.y) % psoMask->sizlBitmap.cx;
-
-            }
-        }
-        while (bEnumMore);
-    }
-    else
-    {
-        /* Call the dib function */
-        pfnBitBlt(&bltdata);
-    }
-
-    return TRUE;
-}
-
-ULONG
-NTAPI
-XLATEOBJ_iXlate(XLATEOBJ *pxlo, ULONG ulColor)
-{
-    return ulColor;
-}
-
-BOOL
-//__fastcall
-RECTL_bIntersectRect(RECTL* prclDst, const RECTL* prcl1, const RECTL* prcl2)
-{
-    return TRUE;
-}
-

Modified: trunk/reactos/subsystems/win32/win32k/eng/bitblt_new.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/eng/bitblt_new.c?rev=56224&r1=56223&r2=56224&view=diff
==============================================================================
--- trunk/reactos/subsystems/win32/win32k/eng/bitblt_new.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/win32/win32k/eng/bitblt_new.c [iso-8859-1] Sat Mar 24 21:07:46 2012
@@ -27,8 +27,13 @@
     pbltdata->ulWidth = prclClipped->right - prclClipped->left;
     pbltdata->ulHeight = prclClipped->bottom - prclClipped->top;
 
-    /* Calculate the offset to the origin coordinates */
-    cx = (prclClipped->left - prclOrg->left);
+    /* Calculate the x offset to the origin coordinates */
+    if (pbltdata->siDst.iFormat == 0)
+        cx = (prclClipped->right - 1 - prclOrg->left);
+    else
+        cx = (prclClipped->left - prclOrg->left);
+
+    /* Calculate the y offset to the origin coordinates */
     if (pbltdata->dy < 0)
         cy = (prclClipped->bottom - 1 - prclOrg->top);
     else
@@ -43,14 +48,11 @@
     pbltdata->siDst.pjBase += pbltdata->siDst.ptOrig.y * pbltdata->siDst.lDelta;
     pbltdata->siDst.pjBase += pbltdata->siDst.ptOrig.x * pbltdata->siDst.jBpp / 8;
 
-
     if (pptlSrc)
     {
-        /* Calculate current origin for the source */
+        /* Calculate start point and bitpointer for source */
         pbltdata->siSrc.ptOrig.x = pptlSrc->x + cx;
         pbltdata->siSrc.ptOrig.y = pptlSrc->y + cy;
-
-        /* Calculate start position for source */
         pbltdata->siSrc.pjBase = pbltdata->siSrc.pvScan0;
         pbltdata->siSrc.pjBase += pbltdata->siSrc.ptOrig.y * pbltdata->siSrc.lDelta;
         pbltdata->siSrc.pjBase += pbltdata->siSrc.ptOrig.x * pbltdata->siSrc.jBpp / 8;
@@ -58,10 +60,9 @@
 
     if (pptlMask)
     {
+        /* Calculate start point and bitpointer for mask */
         pbltdata->siMsk.ptOrig.x = pptlMask->x + cx;
         pbltdata->siMsk.ptOrig.y = pptlMask->y + cy;
-
-        /* Calculate start position for mask */
         pbltdata->siMsk.pjBase = pbltdata->siMsk.pvScan0;
         pbltdata->siMsk.pjBase += pbltdata->siMsk.ptOrig.y * pbltdata->siMsk.lDelta;
         pbltdata->siMsk.pjBase += pbltdata->siMsk.ptOrig.x * pbltdata->siMsk.jBpp / 8;
@@ -69,10 +70,9 @@
 
     if (pptlPat)
     {
+        /* Calculate start point and bitpointer for pattern */
         pbltdata->siPat.ptOrig.x = (pptlPat->x + cx) % psizlPat->cx;
         pbltdata->siPat.ptOrig.y = (pptlPat->x + cy) % psizlPat->cy;
-
-        /* Calculate start position for pattern */
         pbltdata->siPat.pjBase = pbltdata->siPat.pvScan0;
         pbltdata->siPat.pjBase += pbltdata->siPat.ptOrig.y * pbltdata->siPat.lDelta;
         pbltdata->siPat.pjBase += pbltdata->siPat.ptOrig.x * pbltdata->siPat.jBpp / 8;
@@ -158,7 +158,7 @@
                 /* Use 0 as target format to get special right to left versions */
                 bltdata.siDst.iFormat = 0;
                 bltdata.siSrc.iFormat = psoSrc->iBitmapFormat;
-                __debugbreak();
+                //__debugbreak();
             }
             else
             {
@@ -241,8 +241,9 @@
         ASSERT(psoMask);
         ASSERT(pptlMask);
 
-        __debugbreak();
-
+        //__debugbreak();
+
+        /* Set the mask format info */
         bltdata.siMsk.iFormat = psoMask->iBitmapFormat;
         bltdata.siMsk.pvScan0 = psoMask->pvScan0;
         bltdata.siMsk.lDelta = psoMask->lDelta;
@@ -342,7 +343,7 @@
     if (x < 0) pptOffset->x -= x, x = 0;
 
     cxMax = psizSrc->cx - x;
-    if (psizTrg->cx > cxMax) psizTrg->cx= cxMax;
+    if (psizTrg->cx > cxMax) psizTrg->cx = cxMax;
 
     y = pptlSrc->y + pptOffset->y;
     if (y < 0) pptOffset->y -= y, y = 0;
@@ -380,7 +381,6 @@
     ASSERT(psoTrg->iBitmapFormat >= BMF_1BPP);
     ASSERT(psoTrg->iBitmapFormat <= BMF_32BPP);
     ASSERT(prclTrg);
-    ASSERT(RECTL_bIsWellOrdered(prclTrg));
 
     /* Clip the target rect to the extents of the target surface */
     rcClipped.left = max(prclTrg->left, 0);
@@ -395,11 +395,15 @@
     if (pco->iDComplexity != DC_TRIVIAL)
     {
         /* Clip the target rect to the bounds of the clipping region */
-        RECTL_bIntersectRect(&rcClipped, &rcClipped, &pco->rclBounds);
+        if (!RECTL_bIntersectRect(&rcClipped, &rcClipped, &pco->rclBounds))
+        {
+            /* Nothing left */
+            return TRUE;
+        }
     }
 
     /* Don't pass a clip object with a single rectangle */
-//    if (pco->iDComplexity == DC_RECT) pco = (CLIPOBJ*)&gxcoTrivial;
+    if (pco->iDComplexity == DC_RECT) pco = (CLIPOBJ*)&gxcoTrivial;
 
     /* Calculate initial offset and size */
     ptOffset.x = rcClipped.left - prclTrg->left;
@@ -446,6 +450,10 @@
         ptMask.x = 0;
         ptMask.y = 0;
     }
+
+    /* Check if all has been clipped away */
+    if ((sizTrg.cx <= 0) || (sizTrg.cy <= 0))
+        return TRUE;
 
     /* Adjust the points */
     ptSrc.x += ptOffset.x;
@@ -628,3 +636,16 @@
     /* Forward to the driver */
     return pfnCopyBits(psoTrg, psoSrc, pco, pxlo, prclTrg, pptlSrc);
 }
+
+BOOL
+APIENTRY
+IntEngCopyBits(
+    SURFOBJ *psoTrg,
+    SURFOBJ *psoSrc,
+    CLIPOBJ *pco,
+    XLATEOBJ *pxlo,
+    RECTL *prclTrg,
+    POINTL *pptlSrc)
+{
+    return EngCopyBits(psoTrg, psoSrc, pco, pxlo, prclTrg, pptlSrc);
+}




More information about the Ros-diffs mailing list