📄 mqcpat.blt
字号:
#if defined( CHECK_8BPP ) || defined( CHECK_16BPP )
SCODE MQGC::CPATBlt( GPEBltParms *pBltParms )
{
DEBUGMSG(GPE_ZONE_MQEMUL1,(TEXT("CPBlt\r\n")));
ROTATE_PARAMS(pBltParms);
geINIT( pBltParms->pDst );
ULONG wh, ulCmd;
m_ulDestXY = (pBltParms->prclDst->top << 16) | pBltParms->prclDst->left;
wh = ((pBltParms->prclDst->bottom << 16) | pBltParms->prclDst->right)
- m_ulDestXY;
m_ulDestXY += ((MQGCSurf *)(pBltParms->pDst))->m_ulTopLeft;
ulCmd = m_ulRop3 | DO_BITBLT;
m_lpPattern = (PULONG)m_pBrush->Buffer(); // set pattern buffer pointer
(this->*m_pPatternSetup)(pBltParms,&ulCmd); // load mono pattern and adjust
// offset
geWAITCMDFIFO( 3 );
geREG(WIDTH_HEIGHT, wh);
geREG(DEST_XY, m_ulDestXY);
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, ulCmd);
geTERMINATE();
ROTATE_PARAMS_BACK(pBltParms);
RETURN_CPATBLT;
}
#endif //CHECK_s
#if 0
SCODE MQGC::CPATBlt24( GPEBltParms *pBltParms )
{
// Does not supported in the GE
DEBUGMSG(GPE_ZONE_MQEMUL1,(TEXT("CPBlt24-E\r\n")));
RETURN_CPATBLT24;
}
#endif
#ifdef CHECK_24BPP
SCODE MQGC::CPATBlt32( GPEBltParms *pBltParms )
{
DEBUGMSG(GPE_ZONE_MQEMUL1,(TEXT("CPBlt32\r\n")));
ROTATE_PARAMS(pBltParms);
geINIT( pBltParms->pDst );
ULONG height, ulCmd, WH, destXY, i;
m_ulDestXY = (pBltParms->prclDst->top << 16) | pBltParms->prclDst->left;
m_ulWidthHeight = ((pBltParms->prclDst->bottom << 16)
| pBltParms->prclDst->right) - m_ulDestXY;
m_ulDestXY += ((MQGCSurf *)(pBltParms->pDst))->m_ulTopLeft;
ulCmd = m_ulRop3 | DO_BITBLT;
m_lpPattern = (PULONG)m_pBrush->Buffer();
height = m_ulWidthHeight >> 16;
if (height > 4)
{
if (m_ulRop3 == 0xF0UL)
{
// ONLY handle (single ROP) Pattern Blt
// Do pattern blt at width x 8 lines first
ULONG width = m_ulWidthHeight & 0xFFFF;
destXY = m_ulDestXY;
WH = (width | 0x40000UL);
for (i=2; i > 0; i--)
{
PatternSetup16BPP(pBltParms,&ulCmd);
geWAITCMDFIFO( 3 );
geREG(WIDTH_HEIGHT, WH);
geREG(DEST_XY, destXY);
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, ulCmd);
destXY += 0x40000UL;
if (height <= 8)
WH = m_ulWidthHeight - 0x40000UL;
}
// Do SRCCOPY using width x 8 lines pattern
if (height > 8)
{
geWAITCMDFIFO( 3 );
geREG(SRC_XY, m_ulDestXY);
geREG(CLIP_LeftT, m_ulDestXY);
geREG(CLIP_RightB, (m_ulDestXY + m_ulWidthHeight - 0x10001UL));
// SRCCOPY from first line until last line is filled
WH = 0x80000UL;
for( i=0x80000UL;
(int)i < (int)(m_ulWidthHeight & 0xFFFF0000UL); )
{
geWAITCMDFIFO( 3 );
geREG(WIDTH_HEIGHT, (WH | width));
geREG(DEST_XY, (m_ulDestXY + i));
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, (DO_BITBLT | CLIP_ENABLE | 0xCCUL));
i += WH;
WH <<= 1;
}
}
}
else // Do pattern blt at width x 4 lines at a time.
{
// Set Pattern Offset
m_ulDestXY |=
((((m_ulDestXY & 0x0FFFUL) - pBltParms->pptlBrush->x)
& 0x7UL) << 13)
| (((((m_ulDestXY >> 16) & 0x0FFFUL) - pBltParms->pptlBrush->y)
& 0x7UL) << 29);
// Start color pattern blt
for (i = 2; i > 0; i-- )
{
destXY = m_ulDestXY;
(this->*m_pPatternSetup)( pBltParms, &ulCmd );
for (WH = m_ulWidthHeight; TRUE; destXY += 0x80000UL)
{
geWAITCMDFIFO( 3 );
if ((WH >> 16) > 0x4UL)
geREG(WIDTH_HEIGHT, (0x40000UL | (WH & 0xFFFFUL)));
else
geREG(WIDTH_HEIGHT, WH);
// Execute pattern blt
geREG(DEST_XY, destXY);
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, ulCmd);
if ((WH >> 16) > 0x8UL)
WH -= 0x80000UL;
else
break;
}
m_ulDestXY += 0x40000UL;
m_ulWidthHeight -= 0x40000UL;
}
}
geTERMINATE();
ROTATE_PARAMS_BACK(pBltParms);
RETURN_CPATBLT32;
}
PatternSetup16BPP(pBltParms,&ulCmd);
geWAITCMDFIFO( 3 );
geREG(WIDTH_HEIGHT, m_ulWidthHeight);
geREG(DEST_XY, m_ulDestXY);
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, ulCmd);
geTERMINATE();
ROTATE_PARAMS_BACK(pBltParms);
RETURN_CPATBLT32;
}
#endif //CHECK_24BPP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -