📄 ddi_if.cpp
字号:
CLIPOBJ *pco,
XLATEOBJ *pxlo,
RECTL *prclDest,
POINTL *pptlSrc)
{
DEBUGMSG(GPE_ZONE_ERROR,(TEXT("Entering DrvCopyBits! - SHOULD ONLY BE USED BY PRINTER DRIVER \r\n")));
ASSERT(0);
return FALSE;
}
BOOL APIENTRY DrvAnyBlt(
SURFOBJ *psoDest,
SURFOBJ *psoSrc,
SURFOBJ *psoMask,
CLIPOBJ *pco,
XLATEOBJ *pxlo,
POINTL *pptlHTOrg, // Halftone brush origin
RECTL *prclDest,
RECTL *prclSrc,
POINTL *pptlMask,
BRUSHOBJ *pbo,
POINTL *pptlBrush,
ROP4 rop4,
ULONG iMode, // DrvStretchBlt iMode: eg, COLORONCOLOR, HALFTONE
ULONG bltFlags)
{
DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvAnyBlt\r\n")));
return AnyBlt(psoDest, psoSrc, psoMask, pco, pxlo, prclDest, prclSrc,
pptlMask, pbo, pptlBrush, rop4, bltFlags );
}
BOOL APIENTRY DrvTransparentBlt(
SURFOBJ *psoDest,
SURFOBJ *psoSrc,
CLIPOBJ *pco,
XLATEOBJ *pxlo,
RECTL *prclDest,
RECTL *prclSrc,
ULONG TransColor)
{
DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvTransparentBlt\r\n")));
unsigned long bltFlags = BLT_TRANSPARENT;
BRUSHOBJ bo;
bo.iSolidColor = TransColor;
// Since this may be called with an actual stretch or a 1:1, check
// the actual dimensions.
return AnyBlt(psoDest, psoSrc, NULL, pco, pxlo, prclDest, prclSrc,
NULL, &bo, (POINTL *)NULL, 0xCCCC, bltFlags );
}
BOOL APIENTRY DrvBitBlt(
SURFOBJ *psoTrg,
SURFOBJ *psoSrc,
SURFOBJ *psoMask,
CLIPOBJ *pco,
XLATEOBJ *pxlo,
RECTL *prclTrg,
POINTL *pptlSrc,
POINTL *pptlMask,
BRUSHOBJ *pbo,
POINTL *pptlBrush,
ROP4 rop4)
{
DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Entering DrvBitBlt\r\n")));
RECTL rclSrc;
if( pptlSrc )
{
rclSrc.top = pptlSrc->y;
rclSrc.left = pptlSrc->x;
}
else
{
rclSrc.top = 0;
rclSrc.left = 0;
}
rclSrc.bottom = rclSrc.top + prclTrg->bottom - prclTrg->top;
rclSrc.right = rclSrc.left + prclTrg->right - prclTrg->left;
return AnyBlt( psoTrg, psoSrc, psoMask, pco, pxlo, prclTrg, &rclSrc,
pptlMask, pbo, pptlBrush, rop4, 0 );
}
SCODE ClipBlt( GPE *pGPE, GPEBltParms *pBltParms );
// The AnyBlt function can handle any stretching, color translation, masking, etc
// and services all of the other DrvBlt style functions
BOOL APIENTRY AnyBlt(
SURFOBJ *psoTrg,
SURFOBJ *psoSrc,
SURFOBJ *psoMask,
CLIPOBJ *pco,
XLATEOBJ *pxlo,
RECTL *prclTrg,
RECTL *prclSrc,
POINTL *pptlMask,
BRUSHOBJ *pbo,
POINTL *pptlBrush,
ROP4 rop4,
unsigned long bltFlags)
{
// if( pbo && (pbo->iSolidColor == 0xffffffff ) && !(GPE_ZONE_BLT_HI) )
// {
// DebugBreak();
// ulong oldSettings = dpCurSettings.ulZoneMask;
// dpCurSettings.ulZoneMask |= 0x0034; // enter, exit & blt hi and lo
// BOOL v = DrvBitBlt(psoTrg,psoSrc,psoMask,pco,pxlo,prclTrg,pptlSrc,pptlMask,pbo,pptlBrush,rop4);
// dpCurSettings.ulZoneMask = oldSettings;
// return v;
// }
DEBUGMSG(GPE_ZONE_ENTER,(TEXT("AnyBlt (rop4 = 0x%04x) rclTrg=t:%d,l:%d,b:%d,r:%d\r\n"),
rop4, prclTrg->top, prclTrg->left, prclTrg->bottom, prclTrg->right ));
GPE *pGPE = SurfobjToGPE(psoTrg);
RECTL *prclCurr;
GPEBltParms parms;
TmpGPESurf pDst(psoTrg);
TmpGPESurf pSrc(psoSrc,psoTrg,&pDst);
TmpGPESurf pMask(psoMask);
RECTL rclMask;
int moreClipLists;
SCODE sc1=0;
SCODE sc2;
if( pptlMask )
{
rclMask.top = pptlMask->y;
rclMask.left = pptlMask->x;
rclMask.bottom = pptlMask->y + prclTrg->bottom - prclTrg->top;
rclMask.right = pptlMask->x + prclTrg->right - prclTrg->left;
}
else
rclMask = *prclSrc;
parms.pDst = pDst;
parms.prclDst = prclTrg;
parms.xPositive = 1;
parms.yPositive = 1;
parms.rop4 = rop4;
parms.pLookup = (unsigned long *)NULL;
parms.pConvert = NULL;
parms.pBrush = (GPESurf *)NULL;
parms.solidColor = 0xffffffff;
// See if source matters
if( ( rop4 ^ ( rop4 >> 2 ) ) & 0x3333 )
{
parms.prclSrc = prclSrc;
parms.pSrc = pSrc;
if( !prclTrg || !prclSrc )
return 0;
if( (prclTrg->right - prclTrg->left != prclSrc->right - prclSrc->left )
|| ( prclTrg->bottom - prclTrg->top != prclSrc->bottom - prclSrc->top ))
bltFlags |= BLT_STRETCH;
}
else
{
parms.prclSrc = (RECTL *)NULL;
parms.pSrc = (GPESurf *)NULL;
bltFlags &= ~BLT_STRETCH;
}
parms.bltFlags = bltFlags;
// See if pattern matters
if( ( rop4 ^ ( rop4 >> 4 ) ) & 0x0F0F )
{
parms.pptlBrush = pptlBrush;
if( pbo )
{
if( pbo->iSolidColor == 0xffffffff )
{
if( pbo->pvRbrush == NULL )
parms.pBrush = (GPESurf *)( BRUSHOBJ_pvGetRbrush( pbo ) );
else
parms.pBrush = (GPESurf *)( pbo->pvRbrush );
}
else
{
parms.solidColor = pbo->iSolidColor;
parms.pptlBrush = (POINTL *)NULL;
}
}
else
{
DEBUGMSG(GPE_ZONE_ERROR,(TEXT("Blt w/ rop4=0x%04x and pbo==NULL !\r\n"),rop4));
return FALSE;
}
}
else
{
parms.pptlBrush = (POINTL *)NULL;
if( pbo )
parms.solidColor = pbo->iSolidColor; // This is used as the transparent color
}
// See if mask matters
if( ( rop4 ^ ( rop4 >> 8 ) ) & 0x00FF )
{
parms.prclMask = &rclMask;
parms.pMask = pMask;
}
else
{
parms.prclMask = (RECTL *)NULL;
parms.pMask = (GPESurf *)NULL;
}
ULONG iDir = CD_ANY; // default to clip enumeration in any order
if( (GPESurf *)(parms.pDst) == (GPESurf *)(parms.pSrc) ) // <-- Won't happen on stretch Blts
{
// Check for overlap since source and dest surfaces are the same
if( prclSrc->bottom > prclTrg->top
&& prclSrc->top < prclTrg->bottom
&& prclSrc->right > prclTrg->left
&& prclSrc->left < prclTrg->right )
{
if( prclSrc->top == prclTrg->top )
{
// Horizontal blt, just set xPositive appropriately
parms.xPositive = prclSrc->left >= prclTrg->left;
}
else
// Non horizontal blts, just set yPositive appropriately
parms.yPositive = prclSrc->top >= prclTrg->top;
// In case we enumerate cliprects - determine the order to use
if( prclSrc->top > prclTrg->top )
iDir = ( prclSrc->left > prclTrg->left ) ? CD_RIGHTDOWN : CD_LEFTDOWN;
else
iDir = ( prclSrc->left > prclTrg->left ) ? CD_RIGHTUP : CD_LEFTUP;
}
}
else if ( parms.pSrc )
{
ColorConverter::InitConverter(
pxlo,
&parms.pColorConverter,
(unsigned long (ColorConverter::** )(unsigned long))&parms.pConvert,
&parms.pLookup );
}
parms.prclClip = (RECTL *)NULL;
if( pco )
if( pco->iDComplexity == DC_RECT )
parms.prclClip = &(pco->rclBounds);
if( FAILED(pGPE->BltPrepare( &parms ) ) )
{
DEBUGMSG(GPE_ZONE_ERROR,(TEXT("failed to prepare blt\r\n")));
DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvBitBlt\r\n")));
return FALSE;
}
if( pco && pco->iDComplexity == DC_COMPLEX )
{
// Non-trivial clipping - set up the Blt, then iterate through the cliprects & complete the blt
CLIPENUM ce;
// Request cliprects in a specific order to handle overlaps
CLIPOBJ_cEnumStart( pco, TRUE, CT_RECTANGLES, iDir, 0 ); // don't need to count
for( ce.c = 0, moreClipLists=1; ce.c || moreClipLists; )
{
if( ce.c == 0 )
{
// Get next list of cliprects from clipobj
moreClipLists = CLIPOBJ_bEnum( pco, sizeof(ce), (ULONG *)&ce );
prclCurr = ce.arcl;
if( !ce.c )
continue;
}
parms.prclClip = prclCurr++;
ce.c--;
DEBUGMSG(GPE_ZONE_BLT_HI,(TEXT("Calling GPE::Blt with complex cliprect\r\n")));
//#define ALLOW_MODIFY_BLTPARMS_IN_CLIP_BLT
#ifdef ALLOW_MODIFY_BLTPARMS_IN_CLIP_BLT
GPEBltParms parmsCopy = parms;
if( FAILED( sc1 = ClipBlt( pGPE, &parmsCopy ) ) )
#else
if( FAILED( sc1 = ClipBlt( pGPE, &parms ) ) )
#endif
{
DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvBitBlt\r\n")));
break;
}
}
}
else
sc1 = ClipBlt( pGPE, &parms );
sc2 = pGPE->BltComplete( &parms );
DEBUGMSG(GPE_ZONE_ENTER,(TEXT("Leaving DrvBitBlt\r\n")));
return !FAILED(sc1) && !FAILED(sc2);
}
SCODE ClipBlt(
GPE *pGPE,
GPEBltParms *pBltParms )
{
DEBUGMSG(GPE_ZONE_BLT_LO,(TEXT("ClipBlt continue phase\r\n")));
#ifdef ALLOW_MODIFY_BLTPARMS_IN_CLIP_BLT
if( pBltParms->prclClip && !( pBltParms->bltFlags & BLT_STRETCH ) )
{
RECTL rclDst = *(pBltParms->prclDst);
RECTL &rclClip = *(pBltParms->prclClip);
if( rclDst.left < rclClip.left )
rclDst.left = rclClip.left;
if( rclDst.top < rclClip.top )
rclDst.top = rclClip.top;
if( rclDst.bottom > rclClip.bottom )
rclDst.bottom = rclClip.bottom;
if( rclDst.right > rclClip.right )
rclDst.right = rclClip.right;
if( rclDst.right <= rclDst.left || rclDst.bottom <= rclDst.top )
return S_OK; // the clipping left nothing to do
int OffLeft = rclDst.left - pBltParms->prclDst->left;
int OffTop = rclDst.top - pBltParms->prclDst->top;
int OffRight = rclDst.right - pBltParms->prclDst->right;
int OffBottom = rclDst.bottom - pBltParms->prclDst->bottom;
pBltParms->prclDst = &rclDst;
if (OffLeft || OffTop || OffRight || OffBottom)
{
if( pBltParms->prclSrc )
{
register RECTL * const prclSrc = pBltParms->prclSrc;
prclSrc->left += OffLeft;
prclSrc->right += OffRight;
prclSrc->top += OffTop;
prclSrc->bottom += OffBottom;
}
if( pBltParms->prclMask )
{
register RECTL * const prclMask = pBltParms->prclMask;
prclMask->left += OffLeft;
prclMask->right += OffRight;
prclMask->top += OffTop;
prclMask->bottom += OffBottom;
}
}
pBltParms->prclClip = (RECTL *)NULL;
// Perform actual Blt
return (pGPE->*(pBltParms->pBlt))( pBltParms );
}
else
// Perform actual Blt
return (pGPE->*(pBltParms->pBlt))( pBltParms );
#else // !ALLOW_MODIFY_BLTPARMS_IN_CLIP_BLT
if( pBltParms->prclClip && !( pBltParms->bltFlags & BLT_STRETCH ) )
{
RECTL rclDst;
RECTL rclSrc;
RECTL rclMask;
RECTL rclClip = *(pBltParms->prclClip);
GPEBltParms parms = *pBltParms;
parms.prclDst = &rclDst;
rclDst = *(pBltParms->prclDst);
if( rclDst.left < rclClip.left )
rclDst.left = rclClip.left;
if( rclDst.top < rclClip.top )
rclDst.top = rclClip.top;
if( rclDst.bottom > rclClip.bottom )
rclDst.bottom = rclClip.bottom;
if( rclDst.right > rclClip.right )
rclDst.right = rclClip.right;
if( rclDst.right <= rclDst.left || rclDst.bottom <= rclDst.top )
return S_OK; // the clipping left nothing to do
int OffLeft = rclDst.left - pBltParms->prclDst->left;
int OffTop = rclDst.top - pBltParms->prclDst->top;
int OffRight = rclDst.right - pBltParms->prclDst->right;
int OffBottom = rclDst.bottom - pBltParms->prclDst->bottom;
if (OffLeft || OffTop || OffRight || OffBottom)
{
if( parms.prclSrc )
{
rclSrc = *(parms.prclSrc);
parms.prclSrc = &rclSrc;
rclSrc.left += OffLeft;
rclSrc.right += OffRight;
rclSrc.top += OffTop;
rclSrc.bottom += OffBottom;
}
if( parms.prclMask )
{
rclMask = *(parms.prclMask);
parms.prclMask = &rclMask;
rclMask.left += OffLeft;
rclMask.right += OffRight;
rclMask.top += OffTop;
rclMask.bottom += OffBottom;
}
}
parms.prclClip = (RECTL *)NULL;
// Perform actual Blt
return (pGPE->*(pBltParms->pBlt))( &parms );
}
else
// Perform actual Blt
return (pGPE->*(pBltParms->pBlt))( pBltParms );
#endif // !ALLOW_MODIFY_BLTPARMS_IN_CLIP_BLT
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -