📄 mqcm2slk.blt
字号:
ulByteShift = ulOffset >> 3; // byte offset
pSrcBits = (PBYTE)((ULONG)pSrcBits & ~0x03UL) +
ulByteShift; // add byte offset
ulByteShift = (ulOffset & 0x07UL) >> 1; // 2 bits offset (always aligned)
// Now calculate based on destination byte/dword counts
ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY;
ulByteSpace = (ulByteShift + width) << 1; // width + offset in bytes
ulDWords = (ulByteSpace + 0x3UL) >> 2; // num of DWORDS per line
// Calculate Extra bits to pad data up to 128-bit aligned
ulDWords += (0x04UL - (ulDWords & 0x03UL)) & 0x03UL;
ulOffset = (ulByteShift << 29); // word offset
ulExtras = 0;
}
else
#endif
if (m_eFormat == gpe4Bpp)
{
// SRC read size = DWORD
pSrcBits += (pBltParms->prclSrc->left >> 1);
ulByteShift = (ULONG)pSrcBits & 0x03UL;
pSrcBits -= ulByteShift;
ulOffset = (ULONG)(pBltParms->prclSrc->left & 0x01UL);
// Now calculate based on destination byte/dword counts
ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY;
ulByteSpace = (ulOffset + width) << 1; // width + offset in bytes
ulDWords = (ulByteSpace + 0x3UL) >> 2; // num of DWORDS per line
// Calculate Extra bits to pad data up to 128-bit aligned
ulDWords += (0x04UL - (ulDWords & 0x03UL)) & 0x03UL;
ulOffset <<= 29; // word offset
ulExtras = 0;
}
else if (m_eFormat == gpe8Bpp)
{
// SRC reads size = DWORD
pSrcBits += pBltParms->prclSrc->left; // add line offset
ulByteShift = (ULONG)pSrcBits & 0x03UL;
pSrcBits -= ulByteShift;
// Now calculate based on destination byte/dword counts
ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY | PACKED_MODE;
ulDWords = width << 1; // no of bytes
ulByteSpace = ((0x04UL - (ulDWords & 0x03UL)) & 0x03UL);
ulDWords = (ulDWords + ulByteSpace) >> 2; // num of DWORDS per line
// Calculate Extra bits to pad data up to 128-bit aligned
ulExtras = ((0x04UL - ((ulDWords*height) & 0x03UL)) & 0x03UL);
ulOffset = (ulByteSpace << 28);
}
else
{
return S_FALSE;
}
// Calculate SRC FIFO parameters
m_ulDestXY = (pBltParms->prclDst->top << 16) + pBltParms->prclDst->left
+ ((MQGCSurf *)(pBltParms->pDst))->m_ulTopLeft;
if ( m_pPatternSetup != NullPatternSetup )
{
if ( m_pBrush )
m_lpPattern = (PULONG)m_pBrush->Buffer();
(this->*m_pPatternSetup)( pBltParms, &ulCmd );
}
#ifdef CM2SBLT_TRANSPARENT
if ( pBltParms->bltFlags & BLT_TRANSPARENT )
{
ulCmd |= TRANS_COLOR;
geWAITCMDFIFO( 1 );
geREG(COLOR_COMPARE, (pBltParms->pLookup)[pBltParms->solidColor]);
}
#endif
geWAITCMDFIFO( 4 );
geREG(WIDTH_HEIGHT, ((height << 16) | width));
geREG(DEST_XY, m_ulDestXY);
geREG(SRC_STRIDE_OFFSET, ulOffset);
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, ulCmd);
switch (m_eFormat)
{
case gpe4Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP4_16BPP(pSrcBits, ulDWords, ulExtras,
ulByteShift, lSrcStride, height, (pBltParms->pLookup))
}
break;
case gpe8Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP8_16BPP(pSrcBits, ulDWords, ulExtras,
ulByteShift, lSrcStride, height, (pBltParms->pLookup))
}
break;
#ifdef CM2SLK_EXCLUDED_CASE
case gpe2Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP2_16BPP(pSrcBits, ulDWords, ulExtras,
ulByteShift, lSrcStride, height, (pBltParms->pLookup))
}
break;
case gpe24Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP24_16BPP(pSrcBits, ulDWords, ulExtras,
ulByteShift, lSrcStride, height, (pBltParms->pLookup))
}
break;
case gpe32Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP32_16BPP(pSrcBits, ulDWords, ulExtras,
ulByteShift, lSrcStride, height, (pBltParms->pLookup))
}
break;
#endif //CM2SLK_EXCLUDED_CASE
}
geTERMINATE();
ROTATE_PARAMS_BACK(pBltParms);
RETURN_CM2SLKBLT16;
}
#endif //HSUTEST
#endif //CHECK_16BPP
#ifdef CHECK_32BPP
SCODE MQGC::CM2SLKBlt32( GPEBltParms *pBltParms )
{
DEBUGMSG(GPE_ZONE_MQEMUL1,(TEXT("CM2SLKBlt32\r\n")));
PBYTE pSrcBits;
ULONG width, height;
ULONG ulCmd, ulOffset, ulDWords, ulByteShift, ulExtras;
long lSrcStride;
ROTATE_PARAMS(pBltParms);
geINIT( pBltParms->pDst );
width = pBltParms->prclDst->right - pBltParms->prclDst->left;
height = pBltParms->prclDst->bottom - pBltParms->prclDst->top;
//Calculate the PROGRAMMABLE parameters for 32BPP Destination
//32BPP Source should be handled by CM2SBlt32() which source and
//destination color depth are the same (w or w/o lookup table).
lSrcStride = m_pSrc->Stride();
pSrcBits = (PBYTE)(m_pSrc->Buffer()) +
(pBltParms->prclSrc->top * lSrcStride);
#ifdef CM2SLK_EXCLUDED_CASE
if (m_eFormat == gpe2Bpp)
{
ulPixelOffset = (pBltParms->prclSrc->left);
pSrcBits += (ulPixelOffset >> 2);
ulByteShift = (ULONG)(ulPixelOffset & 0x03UL);
// Now calculate based on destination byte/dword counts
ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY;
ulDWords = ulByteShift+width; // num of DWORDS per line
// Calculate Extra bits to pad data up to 128-bit aligned
ulDWords += (4UL - (ulDWords & 0x03UL)) & 0x03UL;
ulOffset = ulByteShift << 30; // can only handle 1 pixel offset
}
else
#endif
if (m_eFormat == gpe4Bpp)
{
// SRC reads = DWORD
pSrcBits += (pBltParms->prclSrc->left >> 1);
ulByteShift = (ULONG)pSrcBits & 0x03UL;
pSrcBits -= ulByteShift;
ulOffset = (ULONG)(pBltParms->prclSrc->left & 0x01UL);
// Now calculate based on destination byte/dword counts
ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY;
ulDWords = ulOffset+width; // num of DWORDS per line
// Calculate Extra bits to pad data up to 128-bit aligned
ulDWords += (4UL - (ulDWords & 0x03UL)) & 0x03UL;
ulOffset <<= 30;
}
else if (m_eFormat == gpe8Bpp)
{
// SRC reads = DWORD
pSrcBits += pBltParms->prclSrc->left;
ulByteShift = (ULONG)pSrcBits & 0x03UL;
pSrcBits -= ulByteShift;
// Now calculate based on destination byte/dword counts
ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY | PACKED_MODE;
ulDWords = width;
// Calculate Extra bits to pad data up to 128-bit aligned
// PUMP Macro will take care initial offset
ulOffset = 0;
}
else
{
return S_FALSE;
}
// Calculate SRC FIFO parameters
m_ulDestXY = (pBltParms->prclDst->top << 16) + pBltParms->prclDst->left
+ ((MQGCSurf *)(pBltParms->pDst))->m_ulTopLeft;
#ifdef CM2SBLT_TRANSPARENT
if ( pBltParms->bltFlags & BLT_TRANSPARENT )
{
ulCmd |= TRANS_COLOR;
geWAITCMDFIFO( 1 );
geREG(COLOR_COMPARE, (pBltParms->pLookup)[pBltParms->solidColor]);
}
#endif
if ( m_pPatternSetup != NullPatternSetup )
{
PBYTE pSB;
ULONG dstxy,i,j,hloop,ulExt;
if ( m_pBrush )
m_lpPattern = (PULONG)m_pBrush->Buffer();
// Set Pattern Offset
m_ulDestXY |=
((((m_ulDestXY & 0x0FFFUL) - pBltParms->pptlBrush->x)
& 0x7UL) << 13)
| (((((m_ulDestXY >> 16) & 0x0FFFUL) - pBltParms->pptlBrush->y)
& 0x7UL) << 29);
if (height > 0x4UL)
{
// Calculate total DWORDS and Extras DWORDs to pump for FOUR LINES
// ONLY Height=4 is set through the MACRO calls below
// Calculate Extra 128-bit pads for 4 lines only (PACKED MODE)
if (ulCmd & PACKED_MODE)
ulExtras = (4UL - ((ulDWords * 0x04UL) & 0x03UL)) & 0x03UL;
else
ulExtras = 0;
geWAITCMDFIFO( 1 );
geREG(SRC_STRIDE_OFFSET, ulOffset);
// Start loading color pattern 4 lines at a time
for (i = 2; i > 0; i-- )
{
pSB = pSrcBits;
dstxy = m_ulDestXY;
(this->*m_pPatternSetup)( pBltParms, &ulCmd );
// Execute ROP3 command 4 lines at a time
for (j=0; j < height; dstxy += 0x80000UL)
{
if ((height-j) < 0x04UL)
{
hloop = height - j;
// Calculate Extra bits to pad data up to 128-bit aligned
// FOR PACKED MODE ONLY
if (ulCmd & PACKED_MODE)
ulExt = (4UL - ((ulDWords * hloop) & 0x03UL)) & 0x03UL;
else
ulExt = ulExtras;
}
else
{
hloop = 0x04UL;
ulExt = ulExtras;
}
// Execute pattern blt
geWAITCMDFIFO( 3 );
geREG(WIDTH_HEIGHT, ((hloop << 16) | width));
geREG(DEST_XY, dstxy);
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, ulCmd);
// Pump SRC FIFO with pattern
switch (m_eFormat)
{
case gpe4Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP4_32BPP(pSB, ulDWords,
ulExtras, ulByteShift, lSrcStride,
hloop, (pBltParms->pLookup))
}
break;
case gpe8Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP8_32BPP(pSB, ulDWords,
ulExtras, ulByteShift, lSrcStride,
hloop, (pBltParms->pLookup))
}
break;
#ifdef CM2SLK_EXCLUDED_CASE
case gpe2Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP2_32BPP(pSB, ulDWords,
ulExtras, ulByteShift, lSrcStride,
hloop, (pBltParms->pLookup))
}
break;
case gpe16Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP16_32BPP(pSB, ulDWords,
ulExtras, ulByteShift, lSrcStride,
hloop, (pBltParms->pLookup))
}
break;
case gpe24Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP24_32BPP(pSB, ulDWords,
ulExtras, ulByteShift, lSrcStride,
hloop, (pBltParms->pLookup))
}
break;
#endif //CM2SLK_EXCLUDED_CASE
}
j += 0x08UL;
pSB += (0x04UL * lSrcStride);
}
m_ulDestXY += 0x40000UL;
pSrcBits += (0x04UL * lSrcStride);
}
geTERMINATE();
ROTATE_PARAMS_BACK(pBltParms);
RETURN_CM2SBLT32;
}
else
(this->*m_pPatternSetup)( pBltParms, &ulCmd );
}
// Calculate Extra bits to pad data up to 128-bit aligned
if (ulCmd & PACKED_MODE)
ulExtras = (4UL - ((ulDWords * height) & 0x03UL)) & 0x03UL;
else
ulExtras = 0;
#ifdef CM2SBLT_TRANSPARENT
if ( pBltParms->bltFlags & BLT_TRANSPARENT )
{
ulCmd |= TRANS_COLOR;
geWAITCMDFIFO( 1 );
geREG(COLOR_COMPARE, (pBltParms->pLookup)[pBltParms->solidColor]);
}
#endif
geWAITCMDFIFO( 4 );
geREG(WIDTH_HEIGHT, ((height << 16) | width));
geREG(DEST_XY, m_ulDestXY);
geREG(SRC_STRIDE_OFFSET, ulOffset);
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, ulCmd);
switch (m_eFormat)
{
case gpe4Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP4_32BPP(pSrcBits, ulDWords, ulExtras,
ulByteShift, lSrcStride, height, (pBltParms->pLookup))
}
break;
case gpe8Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP8_32BPP(pSrcBits, ulDWords, ulExtras,
ulByteShift, lSrcStride, height, (pBltParms->pLookup))
}
break;
#ifdef CM2SLK_EXCLUDED_CASE
case gpe2Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP2_32BPP(pSrcBits, ulDWords, ulExtras,
ulByteShift, lSrcStride, height, (pBltParms->pLookup))
}
break;
case gpe16Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP16_32BPP(pSrcBits, ulDWords, ulExtras,
ulByteShift, lSrcStride, height, (pBltParms->pLookup))
}
break;
case gpe24Bpp:
{
PUMP_PACKED_SRCFIFO_LOOKUP24_32BPP(pSrcBits, ulDWords, ulExtras,
ulByteShift, lSrcStride, height, (pBltParms->pLookup))
}
break;
#endif //CM2SLK_EXCLUDED_CASE
}
geTERMINATE();
ROTATE_PARAMS_BACK(pBltParms);
RETURN_CM2SLKBLT32;
}
#endif //CHECK_32BPP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -