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

📄 mqmm2s.blt

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