📄 mqmm2s.blt
字号:
#if defined( CHECK_8BPP ) || defined( CHECK_16BPP )
SCODE MQGC::MM2SBlt( GPEBltParms *pBltParms )
{
PULONG pulSrc;
long srcX, srcY, width, height;
long lDWords, lBitSpace, lSpace, i;
long lSrcStride, lOffset, lExtras;
#ifdef CHECK_SRCFIFO
long lExtras2;
#endif //CHECK_SRCFIFO
ULONG ulCmd;
DEBUGMSG(GPE_ZONE_MQEMUL1,(TEXT("MM2SBlt\r\n")));
ROTATE_PARAMS(pBltParms);
geINIT( pBltParms->pDst );
m_pLookup = pBltParms->pLookup;
m_ulDestXY = (pBltParms->prclDst->top << 16) + pBltParms->prclDst->left
+((MQGCSurf *)(pBltParms->pDst))->m_ulTopLeft;
//ulCmd = m_ulRop3 | DO_BITBLT | MONO_SRC | SRC_IS_MEMORY | PACKED_MODE;
ulCmd = (pBltParms->rop4 & 0xFF)
| DO_BITBLT | MONO_SRC | SRC_IS_MEMORY | PACKED_MODE;
if ( m_pPatternSetup != NullPatternSetup )
{
if ( m_pBrush )
m_lpPattern = (PULONG)m_pBrush->Buffer();
(this->*m_pPatternSetup)( pBltParms, &ulCmd );
}
lSrcStride = pBltParms->pSrc->Stride();
srcX = pBltParms->prclSrc->left;
srcY = pBltParms->prclSrc->top;
width = pBltParms->prclSrc->right - srcX;
height = pBltParms->prclSrc->bottom - srcY;
#if 1
i = (long)(pBltParms->pSrc->Buffer()) + (srcY * lSrcStride);
lOffset = ((((i & 0x03L) << 3) + srcX) & 0x1fL);
pulSrc = (PULONG)((i + (srcX >> 3)) & ~0x03UL);
#else
i = (long)(pBltParms->pSrc->Buffer()) + (srcY * lSrcStride);
lOffset = ((i & 0x03L) << 3) + srcX;
pulSrc = (PULONG)(((i & ~0x03L) + (lOffset >> 3)) & ~0x03UL);
//aligned to dword
lOffset &= 0x01FUL;
#endif
//Compute bit space.
lSrcStride = lSrcStride << 3; //Get Src Stride bits
if ( lSrcStride > 0 && (lSpace = lSrcStride - width) < 64 )
{
#ifdef BUG_MONO_READ_MISS
i = (height << 16) | width;
#ifdef MM2SBLT_TRANSPARENT
if ( pBltParms->bltFlags & BLT_TRANSPARENT )
{
geWAITCMDFIFO( 7 );
geREG(WIDTH_HEIGHT, (i + lSpace));
geREG(DEST_XY, m_ulDestXY);
geREG(CLIP_LeftT, m_ulDestXY);
geREG(CLIP_RightB, (m_ulDestXY + i - 0x00010001L));
geREG(FG_COLOR, *(m_pLookup+1));
//geREG(FG_COLOR, *(pBltParms->pLookup+1));
geREG(SRC_STRIDE_OFFSET, lOffset);
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, (ulCmd | TRANS_MONO | CLIP_ENABLE));
}
else
#endif //MM2SBLT_TRANSPRENT
{
geWAITCMDFIFO( 8 );
geREG(WIDTH_HEIGHT, (i + lSpace));
geREG(DEST_XY, m_ulDestXY);
geREG(CLIP_LeftT, m_ulDestXY);
geREG(CLIP_RightB, (m_ulDestXY + i - 0x00010001L));
//geREG(BG_COLOR, *(pBltParms->pLookup));
geREG(BG_COLOR, *m_pLookup++);
geREG(FG_COLOR, *m_pLookup);
//geREG(FG_COLOR, *(pBltParms->pLookup+1));
geREG(SRC_STRIDE_OFFSET, lOffset);
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, (ulCmd | CLIP_ENABLE));
}
lDWords = (((width + lSpace) * height) + lOffset + 31L) >> 5;
#else //BUG_MONO_READ_MISS
#ifdef MM2SBLT_TRANSPARENT
if ( pBltParms->bltFlags & BLT_TRANSPARENT )
{
#ifdef _USE_MQEMUL //emulation is not doing a good job on
//trans_mono. bg_color is required.
geWAITCMDFIFO( 6 );
geREG(WIDTH_HEIGHT, ((height << 16) | width));
geREG(DEST_XY, m_ulDestXY);
geREG(FG_COLOR, *(m_pLookup+1));
geREG(BG_COLOR, ~(*(m_pLookup+1)));
//geREG(FG_COLOR, *(pBltParms->pLookup+1));
//geREG(BG_COLOR, ~(*(pBltParms->pLookup+1)));
#else
geWAITCMDFIFO( 5 );
geREG(WIDTH_HEIGHT, ((height << 16) | width));
geREG(DEST_XY, m_ulDestXY);
geREG(FG_COLOR, *(m_pLookup+1));
//geREG(FG_COLOR, *(pBltParms->pLookup+1));
#endif
geREG(SRC_STRIDE_OFFSET, (lOffset | (lSpace << 25)));
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, (ulCmd | TRANS_MONO));
}
else
#endif //MM2SBLT_TRANSPRENT
{
//Don't change the sequence below unless ask HSU first!!!!
geWAITCMDFIFO( 6 );
geREG(DEST_XY, m_ulDestXY);
SET_GE_DEST_STRIDE(m_ulDestStride);
//geREG(BG_COLOR, *(pBltParms->pLookup));
geREG(BG_COLOR, *m_pLookup++);
geREG(FG_COLOR, *m_pLookup);
geREG(WIDTH_HEIGHT, ((height << 16) | width));
//geREG(FG_COLOR, *(pBltParms->pLookup+1));
geREG(SRC_STRIDE_OFFSET, (lOffset | (lSpace << 25)));
geREG(DRAW_CMD, ulCmd);
}
lDWords = (((width + lSpace) * height) - lSpace + lOffset + 31L) >> 5;
#endif //BUG_MONO_READ_MISS
//Really Packed
#ifdef CHECK_SRCFIFO
lExtras = lDWords & 0x1FUL;
lExtras2 = -lExtras & 0x03;
lDWords = lDWords >> 5; //number of 32 dwords;
while( lDWords-- )
{
i = 32;
geWAITSRCFIFO( 32 );
while( i-- )
geSID( (*pulSrc++) );
}
if ( lExtras )
{
geWAITSRCFIFO( lExtras );
while ( lExtras-- )
geSID( (*pulSrc++) );
while ( lExtras2-- )
geSID( 0UL );
}
#else //CHECK_SRCFIFO
lExtras = -lDWords & 0x3UL;
while( lDWords-- )
geSID( (*pulSrc++) );
while( lExtras-- )
geSID( 0UL );
#endif //CHECK_SRCFIFO
//PUMP_REALLY_PACKED_SRCFIFO(pulSrc, ulDWords, lExtras)
}
else
{
if ( lSrcStride > 0 )
{
lBitSpace = (-(srcX+width) & 0x1F) + ((lSrcStride + srcX) & 0x1FUL);
if ( lBitSpace < 32 )
lBitSpace += 32;
}
else
{
lSpace = -lSrcStride - width;
if ( lSpace < 64 )
lBitSpace = lSpace;
else
{
lBitSpace = (-(srcX+width) & 0x1F)
+ ((-lSrcStride + srcX) & 0x1FUL);
if ( lBitSpace < 32 )
lBitSpace += 32;
}
}
#ifdef BUG_MONO_READ_MISS
i = (height << 16) | width;
#ifdef MM2SBLT_TRANSPARENT
if ( pBltParms->bltFlags & BLT_TRANSPARENT )
{
geWAITCMDFIFO( 5 );
geREG(WIDTH_HEIGHT, (i + lBitSpace));
geREG(DEST_XY, m_ulDestXY);
geREG(CLIP_LeftT, m_ulDestXY);
geREG(CLIP_RightB, (m_ulDestXY + i - 0x00010001L));
geREG(FG_COLOR, *(m_pLookup+1));
//geREG(FG_COLOR, *(pBltParms->pLookup+1));
geREG(SRC_STRIDE_OFFSET, lOffset);
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, (ulCmd | TRANS_MONO | CLIP_ENABLE));
}
else
#endif //MM2SBLT_TRANSPRENT
{
geWAITCMDFIFO( 8 );
geREG(WIDTH_HEIGHT, (i + lBitSpace));
geREG(DEST_XY, m_ulDestXY);
geREG(CLIP_LeftT, m_ulDestXY);
geREG(CLIP_RightB, (m_ulDestXY + i - 0x00010001L));
//geREG(FG_COLOR, *(pBltParms->pLookup+1));
//geREG(BG_COLOR, *(pBltParms->pLookup));
geREG(BG_COLOR, *m_pLookup++);
geREG(FG_COLOR, *m_pLookup);
geREG(SRC_STRIDE_OFFSET, lOffset);
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, (ulCmd | CLIP_ENABLE));
}
width += lBitSpace;
lBitSpace = width; //bitSpace is becoming 0 actually
#else //BUG_MONO_READ_MISS
#ifdef MM2SBLT_TRANSPARENT
if ( pBltParms->bltFlags & BLT_TRANSPARENT )
{
#ifdef _USE_MQEMUL //emulation is not doing a good job on trans_mono.
//bg_color is required
geWAITCMDFIFO( 6 );
geREG(WIDTH_HEIGHT, ((height << 16) | width));
geREG(DEST_XY, m_ulDestXY);
geREG(FG_COLOR, *(m_pLookup+1));
geREG(BG_COLOR, ~(*(m_pLookup+1)));
//geREG(FG_COLOR, *(pBltParms->pLookup+1));
//geREG(BG_COLOR, ~(*(pBltParms->pLookup+1)));
#else
geWAITCMDFIFO( 5 );
geREG(WIDTH_HEIGHT, ((height << 16) | width));
geREG(DEST_XY, m_ulDestXY);
geREG(FG_COLOR, *(m_pLookup+1));
//geREG(FG_COLOR, *(pBltParms->pLookup+1));
#endif
geREG(SRC_STRIDE_OFFSET, (lOffset | (lBitSpace << 25)));
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, (ulCmd | TRANS_MONO));
}
else
#endif //MM2SBLT_TRANSPRENT
{
geWAITCMDFIFO( 6 );
geREG(WIDTH_HEIGHT, ((height << 16) | width));
geREG(DEST_XY, m_ulDestXY);
//geREG(FG_COLOR, *(pBltParms->pLookup+1));
//geREG(BG_COLOR, *(pBltParms->pLookup));
geREG(BG_COLOR, *m_pLookup++);
geREG(FG_COLOR, *m_pLookup);
geREG(SRC_STRIDE_OFFSET, (lOffset | (lBitSpace << 25)));
SET_GE_DEST_STRIDE(m_ulDestStride);
geREG(DRAW_CMD, ulCmd);
}
lBitSpace += width; //Added width
#endif //BUG_MONO_READ_MISS
lExtras = 0;
while( height-- )
{
lSpace = (long)pulSrc; //Use lSpace as temp var
if ( height > 0 )
lDWords = (lOffset + lBitSpace) >> 5;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -