Пример #1
0
/* rc1 and rc2 are the rectangles where we want to draw or
 * from where we take pixels. */
VOID
FASTCALL
DC_vPrepareDCsForBlit(
    PDC pdcDest,
    const RECT* rcDest,
    PDC pdcSrc,
    const RECT* rcSrc)
{
    PDC pdcFirst, pdcSecond;
    const RECT *prcFirst, *prcSecond;

    /* Update brushes */
    if (pdcDest->pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
        DC_vUpdateFillBrush(pdcDest);
    if (pdcDest->pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY))
        DC_vUpdateLineBrush(pdcDest);
    if(pdcDest->pdcattr->ulDirty_ & DIRTY_TEXT)
        DC_vUpdateTextBrush(pdcDest);

    /* Lock them in good order */
    if(pdcSrc)
    {
        if((ULONG_PTR)pdcDest->ppdev->hsemDevLock >= (ULONG_PTR)pdcSrc->ppdev->hsemDevLock)
        {
            pdcFirst = pdcDest;
            prcFirst = rcDest;
            pdcSecond = pdcSrc;
            prcSecond = rcSrc;
        }
        else
        {
            pdcFirst = pdcSrc;
            prcFirst = rcSrc;
            pdcSecond = pdcDest;
            prcSecond = rcDest;
        }
    }
    else
    {
        pdcFirst = pdcDest ;
        prcFirst = rcDest;
        pdcSecond = NULL;
        prcSecond = NULL;
    }

    /* Update clipping of dest DC if needed */
    if (pdcDest->dctype == DCTYPE_DIRECT)
    {
        DCE* dce = DceGetDceFromDC(pdcDest->BaseObject.hHmgr);
        if (dce)
            DceUpdateVisRgn(dce, dce->pwndOrg, dce->DCXFlags);
    }

    if (pdcDest->fs & DC_FLAG_DIRTY_RAO)
        CLIPPING_UpdateGCRegion(pdcDest);

    /* Lock and update first DC */
    if(pdcFirst->dctype == DCTYPE_DIRECT)
    {
        EngAcquireSemaphore(pdcFirst->ppdev->hsemDevLock);
        /* Update surface if needed */
        if(pdcFirst->ppdev->pSurface != pdcFirst->dclevel.pSurface)
        {
            DC_vUpdateDC(pdcFirst);
        }
    }

    if(pdcFirst->dctype == DCTYPE_DIRECT)
    {
        if (!prcFirst)
            prcFirst = &pdcFirst->erclClip;

        MouseSafetyOnDrawStart(pdcFirst->ppdev,
                               prcFirst->left,
                               prcFirst->top,
                               prcFirst->right,
                               prcFirst->bottom) ;
    }

    if (!pdcSecond)
        return;

    /* Lock and update second DC */
    if(pdcSecond->dctype == DCTYPE_DIRECT)
    {
        EngAcquireSemaphore(pdcSecond->ppdev->hsemDevLock);
        /* Update surface if needed */
        if(pdcSecond->ppdev->pSurface != pdcSecond->dclevel.pSurface)
        {
            DC_vUpdateDC(pdcSecond);
        }
    }

    if(pdcSecond->dctype == DCTYPE_DIRECT)
    {
        if (!prcSecond)
            prcSecond = &pdcSecond->erclClip;
        MouseSafetyOnDrawStart(pdcSecond->ppdev,
                               prcSecond->left,
                               prcSecond->top,
                               prcSecond->right,
                               prcSecond->bottom) ;
    }
}
Пример #2
0
/* rc1 and rc2 are the rectangles where we want to draw or
 * from where we take pixels. */
VOID
FASTCALL
DC_vPrepareDCsForBlit(PDC pdc1,
                      RECT rc1,
                      PDC pdc2,
                      RECT rc2)
{
    PDC pdcFirst, pdcSecond;
    PRECT prcFirst, prcSecond;

    /* Update brushes */
    if (pdc1->pdcattr->ulDirty_ & (DIRTY_FILL | DC_BRUSH_DIRTY))
        DC_vUpdateFillBrush(pdc1);
    if (pdc1->pdcattr->ulDirty_ & (DIRTY_LINE | DC_PEN_DIRTY))
        DC_vUpdateLineBrush(pdc1);
    if(pdc1->pdcattr->ulDirty_ & DIRTY_TEXT)
        DC_vUpdateTextBrush(pdc1);

    /* Lock them in good order */
    if(pdc2)
    {
        if((ULONG_PTR)pdc1->ppdev->hsemDevLock >= (ULONG_PTR)pdc2->ppdev->hsemDevLock)
        {
            pdcFirst = pdc1;
            prcFirst = &rc1;
            pdcSecond = pdc2;
            prcSecond = &rc2;
        }
        else
        {
            pdcFirst = pdc2;
            prcFirst = &rc2;
            pdcSecond = pdc1;
            prcSecond = &rc1;
        }
    }
    else
    {
        pdcFirst = pdc1 ;
        prcFirst = &rc1;
        pdcSecond = NULL;
        prcSecond = NULL;
    }

    if(pdcFirst && pdcFirst->dctype == DCTYPE_DIRECT)
    {
        EngAcquireSemaphore(pdcFirst->ppdev->hsemDevLock);
        MouseSafetyOnDrawStart(pdcFirst->ppdev,
                                    prcFirst->left,
                                    prcFirst->top,
                                    prcFirst->right,
                                    prcFirst->bottom) ;
        /* Update surface if needed */
        if(pdcFirst->ppdev->pSurface != pdcFirst->dclevel.pSurface)
        {
            DC_vUpdateDC(pdcFirst);
        }
    }
    if(pdcSecond && pdcSecond->dctype == DCTYPE_DIRECT)
    {
        EngAcquireSemaphore(pdcSecond->ppdev->hsemDevLock);
        MouseSafetyOnDrawStart(pdcSecond->ppdev,
                                    prcSecond->left,
                                    prcSecond->top,
                                    prcSecond->right,
                                    prcSecond->bottom) ;
        /* Update surface if needed */
        if(pdcSecond->ppdev->pSurface != pdcSecond->dclevel.pSurface)
        {
            DC_vUpdateDC(pdcSecond);
        }
    }
}