⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mqcm2s.blt

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 BLT
📖 第 1 页 / 共 2 页
字号:
#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 + -