📄 mqcm2s.blt
字号:
#ifdef CHECK_8BPP
SCODE MQGC::CM2SBlt_O( GPEBltParms *pBltParms )
{
DEBUGMSG(GPE_ZONE_MQEMUL1,(TEXT("CM2SBlt\r\n")));
ROTATE_PARAMS(pBltParms);
geINIT( pBltParms->pDst );
PBYTE pSrcBits;
ULONG width, height;
ULONG ulCmd, ulOffset, ulDWords, ulExtras, ulByteSpace;
#ifndef BEN_OPTIMIZED
ULONG ulSrcStride;
#endif
ULONG ulDWordsTotal;
long lSrcStride;
ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY | PACKED_MODE;
m_ulDestXY = (pBltParms->prclDst->top << 16) + pBltParms->prclDst->left
+ ((MQGCSurf *)(pBltParms->pDst))->m_ulTopLeft;
width = pBltParms->prclDst->right - pBltParms->prclDst->left;
height = pBltParms->prclDst->bottom - pBltParms->prclDst->top;
lSrcStride = m_pSrc->Stride();
pSrcBits = (PBYTE)(m_pSrc->Buffer())
+ (pBltParms->prclSrc->top * lSrcStride)
+ pBltParms->prclSrc->left; //source rectangle offset from base
ulOffset = (ULONG)pSrcBits & 0x03UL; //leading byte offset
pSrcBits -= ulOffset;
#ifdef BEN_OPTIMIZED // BENTEST
ulByteSpace = ((4UL - ((width + ulOffset) & 0x03UL)) & 0x03UL) + ulOffset;
ulDWords = (width + ulByteSpace) >> 2; //num of 16 bytes (128 bits)
ulDWordsTotal = ulDWords * height;
#else
ulSrcStride = abs( lSrcStride );
ulDWords = (width + ulOffset + 0x03UL) >> 2; //num of 16 bytes (128 bits)
ulByteSpace = ((ulSrcStride - (pBltParms->prclSrc->left + width)) & 0x03UL)
+ ulOffset;
ulDWordsTotal = (ulOffset + ((width + ulByteSpace) * (height - 1))
+ width + 3UL) >> 2; //total 16 bytes to pump
#endif
ulExtras = (4UL - (ulDWordsTotal & 0x03UL)) & 0x03UL;
//last 128-bit byte(s) pad
ulOffset = (ulByteSpace << 28) | (ulOffset << 3);
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->solidColor);
}
#endif //CM2SBLT_TRANSPARENT
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);
if ( pBltParms->pLookup )
{
PUMP_PACKED_SRCFIFO_LOOKUP8BPP(pSrcBits, ulDWords, ulExtras,
ulDWordsTotal, lSrcStride, height, (pBltParms->pLookup))
}
else
{
PUMP_PACKED_SRCFIFO(pSrcBits, ulDWords, ulExtras, ulDWordsTotal,
lSrcStride, height)
}
geTERMINATE();
ROTATE_PARAMS_BACK(pBltParms);
RETURN_CM2SBLT;
}
#ifndef SUPPORT_ROTATE
SCODE MQGC::CM2SBlt( GPEBltParms *pBltParms )
{
return CM2SBlt_O(pBltParms);
}
#else
SCODE MQGC::CM2SBlt( GPEBltParms *pBltParms )
{
DEBUGMSG(GPE_ZONE_MQEMUL1,(TEXT("CM2SBlt\r\n")));
geINIT( pBltParms->pDst );
PBYTE pSrcBits;
ULONG width, height;
ULONG ulCmd, ulOffset, ulDWords, ulExtras, ulByteSpace;
#ifndef BEN_OPTIMIZED
ULONG ulSrcStride;
#endif
ULONG ulDWordsTotal;
long lSrcStride;
ULONG ulTmp;
LONG PixelInc,LineInc;
if ( m_pPatternSetup != NullPatternSetup )
{
return CM2SBlt_O(pBltParms);
}
ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY | PACKED_MODE;
m_ulDestXY = (pBltParms->prclDst->top << 16) + pBltParms->prclDst->left
+ ((MQGCSurf *)(pBltParms->pDst))->m_ulTopLeft;
width = pBltParms->prclDst->right - pBltParms->prclDst->left;
height = pBltParms->prclDst->bottom - pBltParms->prclDst->top;
lSrcStride = m_pSrc->Stride();
switch(m_nRotate)
{
case R_180:
HW_ROTATE_XY180(&m_ulDestXY);
m_ulDestXY -= ((width-1) & 0x0000FFFF);
break;
case R_90:
m_ulDestXY += ((height-1)<<16);
HW_ROTATE_XY90(&m_ulDestXY);
break;
case R_270:
m_ulDestXY += ((width -1) & 0x0000FFFF);
HW_ROTATE_XY270(&m_ulDestXY);
break;
}
pSrcBits = (PBYTE)(m_pSrc->Buffer())
+ (pBltParms->prclSrc->top * lSrcStride)
+ pBltParms->prclSrc->left; //source rectangle offset from base
switch(m_nRotate)
{
case R_0:
ulOffset = (ULONG)pSrcBits & 0x03UL; //leading byte offset
pSrcBits -= ulOffset;
ulByteSpace = ((4UL - ((width + ulOffset) & 0x03UL)) & 0x03UL) + ulOffset;
ulDWords = (width + ulByteSpace) >> 2; //num of 16 bytes (128 bits)
ulDWordsTotal = ulDWords * height;
ulExtras = (4UL - (ulDWordsTotal & 0x03UL)) & 0x03UL;
//last 128-bit byte(s) pad
break;
case R_180:
ulByteSpace = (ULONG)pSrcBits & 0x03UL;
ulOffset = (3UL - ((ULONG)pSrcBits+width-1) & 0x03UL);
pSrcBits = (PBYTE)(((ULONG)(pSrcBits+width-1)>>2)<<2) ; // reajust the pSrcBits to end of double word.
ulByteSpace += ulOffset;
ulDWords = (width + ulByteSpace) >> 2; //num of 16 bytes (128 bits)
ulDWordsTotal = ulDWords * height;
ulExtras = (4UL - (ulDWordsTotal & 0x03UL)) & 0x03UL;
//last 128-bit byte(s) pad
ulCmd |= Y_DIR;
break;
case R_90:
ulOffset = 0L;
ulByteSpace = (4UL -(height&0x03UL))&03L;
pSrcBits += (height -1)*lSrcStride;
ulExtras = (4L - (((height + 3L)>>2)*width)& 3L )& 3L;
PixelInc = -lSrcStride;
LineInc = 1L;
ulTmp = height;
height = width;
width = ulTmp;
ulDWordsTotal = (height * ((width + 0x03UL)>>2))+ulExtras;\
break;
case R_270:
ulOffset = 0L;
ulByteSpace = (4UL -(height&0x03UL))&03L;
pSrcBits += (width-1);
ulExtras = (4L - (((height + 3L)>>2)*width)&3L )& 3L;
PixelInc = lSrcStride;
LineInc = -1L;
ulTmp = height;
height = width;
width = ulTmp;
ulDWordsTotal = (height * ((width + 0x03UL)>>2))+ulExtras;\
break;
}
ulOffset = (ulByteSpace << 28) | (ulOffset << 3);
if ( m_pPatternSetup != NullPatternSetup )
{
DEBUGMSG(GPE_ZONE_INIT, (TEXT("MQCM2S.BLT: Need PatternSetup\r\n")));
if ( m_pBrush )
{
m_lpPattern = (PULONG)m_pBrush->Buffer();
DEBUGMSG(GPE_ZONE_INIT, (TEXT("MQCM2S.BLT: m_pBursh Exists.\r\n")));
}
(this->*m_pPatternSetup)( pBltParms, &ulCmd );
}
#ifdef CM2SBLT_TRANSPARENT
if ( pBltParms->bltFlags & BLT_TRANSPARENT )
{
ulCmd |= TRANS_COLOR;
geWAITCMDFIFO( 1 );
geREG(COLOR_COMPARE, pBltParms->solidColor);
}
#endif //CM2SBLT_TRANSPARENT
geWAITCMDFIFO( 4 );
geWAITSRCFIFO1(ulDWordsTotal);
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);
if ( pBltParms->pLookup )
{
if(m_nRotate == R_0)
{
PUMP_PACKED_SRCFIFO_LOOKUP8BPP(pSrcBits, ulDWords, ulExtras,
ulDWordsTotal, lSrcStride, height, (pBltParms->pLookup))
}else{
if(m_nRotate == R_180)
{
PUMP_PACKED_SRCFIFO_LOOKUP8BPP180(pSrcBits, ulDWords, ulExtras,
ulDWordsTotal, lSrcStride, height, (pBltParms->pLookup))
}else{
PUMP_PACKED_SRCFIFO_LOOKUP8BPP90_270(pSrcBits, width, height,
LineInc, PixelInc, ulExtras, (pBltParms->pLookup) )
}
}
}
else
{
if(m_nRotate == R_0)
{
PUMP_PACKED_SRCFIFO(pSrcBits, ulDWords, ulExtras,
ulDWordsTotal, lSrcStride, height)
}else{
if(m_nRotate == R_180)
{
PUMP_PACKED_SRCFIFO180(pSrcBits, ulDWords, ulExtras,
ulDWordsTotal, lSrcStride, height)
}else{ // R_90 or R_270
PUMP_PACKED_SRCFIFO90_270(pSrcBits, width, height, LineInc,
PixelInc,ulExtras)
}
}
}
geTERMINATE();
RETURN_CM2SBLT;
}
#endif //SUPPORT_ROTATE
#endif //CHECK_8BPP
#ifdef CHECK_16BPP
SCODE MQGC::CM2SBlt16_O( GPEBltParms *pBltParms )
{
DEBUGMSG(GPE_ZONE_MQEMUL1,(TEXT("CM2SBlt16\r\n")));
ROTATE_PARAMS(pBltParms);
geINIT( pBltParms->pDst );
PBYTE pSrcBits;
ULONG width, height;
ULONG ulCmd, ulOffset, ulSrcBytes, ulDWords, ulExtras, ulByteSpace;
#ifndef BEN_OPTIMIZED
ULONG ulSrcLeftBytes;
ULONG ulSrcStride;
#endif
ULONG ulDWordsTotal;
long lSrcStride;
ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY | PACKED_MODE;
m_ulDestXY = (pBltParms->prclDst->top << 16) + pBltParms->prclDst->left
+ ((MQGCSurf *)(pBltParms->pDst))->m_ulTopLeft;
width = pBltParms->prclDst->right - pBltParms->prclDst->left;
height = pBltParms->prclDst->bottom - pBltParms->prclDst->top;
lSrcStride = m_pSrc->Stride();
#ifndef BEN_OPTIMIZED
ulSrcLeftBytes = pBltParms->prclSrc->left << m_ulBPPShift;
//get exact bytes count from left
pSrcBits = (PBYTE)(m_pSrc->Buffer())
+ (pBltParms->prclSrc->top * lSrcStride)
+ ulSrcLeftBytes; //source rectangle offset from base
#else
pSrcBits = (PBYTE)(m_pSrc->Buffer())
+ (pBltParms->prclSrc->top * lSrcStride)
+ (pBltParms->prclSrc->left << m_ulBPPShift); //src rect offset
#endif
ulOffset = (ULONG)pSrcBits & 0x03UL; //leading byte offset
pSrcBits -= ulOffset;
ulSrcBytes = width << m_ulBPPShift; //get exact bytes count
#ifdef BEN_OPTIMIZED // BENTEST
ulByteSpace = ((4UL - ((ulSrcBytes + ulOffset) & 0x03UL)) & 0x03UL) + ulOffset;
ulDWords = (ulSrcBytes + ulByteSpace) >> 2; //num of 16 bytes (128 bits)
ulDWordsTotal = ulDWords * height;
#else
ulSrcStride = abs( lSrcStride );
ulDWords = (ulSrcBytes + ulOffset + 0x03UL) >> 2; //num of 16 bytes (128 bits)
ulByteSpace = ((ulSrcStride - (ulSrcLeftBytes + ulSrcBytes))
& 0x03UL) + ulOffset;
ulDWordsTotal = (ulOffset + ((ulSrcBytes + ulByteSpace) * (height - 1))
+ ulSrcBytes + 3UL) >> 2; //total 16 bytes to pump
#endif
ulExtras = (4UL - (ulDWordsTotal & 0x03UL)) & 0x03UL;
//last 128-bit byte(s) pad
ulOffset = (ulOffset << 3) | (ulByteSpace << 28);
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->solidColor);
}
#endif //CM2SBLT_TRANSPARENT
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);
if ( pBltParms->pLookup )
{
PUMP_PACKED_SRCFIFO_LOOKUP16BPP(pSrcBits, ulDWords, ulExtras,
ulDWordsTotal, lSrcStride, height, (pBltParms->pLookup))
}
else
{
PUMP_PACKED_SRCFIFO(pSrcBits, ulDWords, ulExtras, ulDWordsTotal,
lSrcStride, height)
}
geTERMINATE();
ROTATE_PARAMS_BACK(pBltParms);
RETURN_CM2SBLT16;
}
#ifndef SUPPORT_ROTATE
SCODE MQGC::CM2SBlt16( GPEBltParms *pBltParms )
{
return CM2SBlt16_O(pBltParms);
}
#else
SCODE MQGC::CM2SBlt16( GPEBltParms *pBltParms )
{
DEBUGMSG(GPE_ZONE_MQEMUL1,(TEXT("CM2SBlt16\r\n")));
geINIT( pBltParms->pDst );
PBYTE pSrcBits;
ULONG width, height;
ULONG ulCmd, ulOffset, ulSrcBytes, ulDWords, ulExtras, ulByteSpace;
#ifndef BEN_OPTIMIZED
ULONG ulSrcLeftBytes;
ULONG ulSrcStride;
#endif
ULONG ulDWordsTotal;
long lSrcStride;
ULONG ulTmp;
LONG PixelInc,LineInc;
if ( m_pPatternSetup != NullPatternSetup )
{
return CM2SBlt16_O(pBltParms);
}
ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY | PACKED_MODE;
m_ulDestXY = (pBltParms->prclDst->top << 16) + pBltParms->prclDst->left
+ ((MQGCSurf *)(pBltParms->pDst))->m_ulTopLeft;
width = pBltParms->prclDst->right - pBltParms->prclDst->left;
height = pBltParms->prclDst->bottom - pBltParms->prclDst->top;
lSrcStride = m_pSrc->Stride();
switch(m_nRotate)
{
case R_180:
HW_ROTATE_XY180(&m_ulDestXY);
m_ulDestXY -= ((width-1) & 0x0000FFFF);
break;
case R_90:
m_ulDestXY += ((height-1)<<16);
HW_ROTATE_XY90(&m_ulDestXY);
break;
case R_270:
HW_ROTATE_XY270(&m_ulDestXY);
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -