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

📄 mqcm2slk.blt

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 BLT
📖 第 1 页 / 共 2 页
字号:
		   ulByteShift = ulOffset >> 3;  // byte offset
			pSrcBits = (PBYTE)((ULONG)pSrcBits & ~0x03UL) +
							ulByteShift;  // add byte offset
			ulByteShift = (ulOffset & 0x07UL) >> 1; // 2 bits offset (always aligned)
			// Now calculate based on destination byte/dword counts
			ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY;
			ulByteSpace = (ulByteShift + width) << 1; // width + offset in bytes 
			ulDWords = (ulByteSpace + 0x3UL) >> 2; // num of DWORDS per line  
			// Calculate Extra bits to pad data up to 128-bit aligned 
			ulDWords += (0x04UL - (ulDWords & 0x03UL)) & 0x03UL;									
			ulOffset = (ulByteShift << 29); // word offset 
			ulExtras = 0;					
	}
	else
#endif 
	if (m_eFormat == gpe4Bpp)
	{
			// SRC read size = DWORD
			pSrcBits += (pBltParms->prclSrc->left >> 1); 					
			ulByteShift = (ULONG)pSrcBits & 0x03UL;	
			pSrcBits -= ulByteShift;
		   ulOffset = (ULONG)(pBltParms->prclSrc->left & 0x01UL);
			// Now calculate based on destination byte/dword counts
			ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY;
			ulByteSpace = (ulOffset + width) << 1; // width + offset in bytes 
			ulDWords = (ulByteSpace + 0x3UL) >> 2; // num of DWORDS per line  
			// Calculate Extra bits to pad data up to 128-bit aligned 
			ulDWords += (0x04UL - (ulDWords & 0x03UL)) & 0x03UL;									
			ulOffset <<= 29; // word offset 
			ulExtras = 0;					
	}
	else if (m_eFormat == gpe8Bpp)
	{		
			// SRC reads size = DWORD 
			pSrcBits += pBltParms->prclSrc->left; // add line offset
			ulByteShift = (ULONG)pSrcBits & 0x03UL;
			pSrcBits -= ulByteShift;
			// Now calculate based on destination byte/dword counts
			ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY | PACKED_MODE;
			ulDWords = width << 1;  // no of bytes
			ulByteSpace = ((0x04UL - (ulDWords & 0x03UL)) & 0x03UL); 
			ulDWords = (ulDWords + ulByteSpace) >> 2; // num of DWORDS per line					
			// Calculate Extra bits to pad data up to 128-bit aligned     
			ulExtras = ((0x04UL - ((ulDWords*height) & 0x03UL)) & 0x03UL);									
			ulOffset = (ulByteSpace << 28);
	}
	else
	{
		return	S_FALSE;
	}
	// Calculate SRC FIFO parameters
	m_ulDestXY = (pBltParms->prclDst->top << 16) + pBltParms->prclDst->left
				+ ((MQGCSurf *)(pBltParms->pDst))->m_ulTopLeft;
	
	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->pLookup)[pBltParms->solidColor]);
	}
#endif

	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);

	switch (m_eFormat)
	{
		case gpe4Bpp:
			{ 
				PUMP_PACKED_SRCFIFO_LOOKUP4_16BPP(pSrcBits, ulDWords, ulExtras,
						ulByteShift, lSrcStride, height, (pBltParms->pLookup))
			}
			break;
		case gpe8Bpp:
			{
				PUMP_PACKED_SRCFIFO_LOOKUP8_16BPP(pSrcBits, ulDWords, ulExtras, 
						ulByteShift, lSrcStride, height, (pBltParms->pLookup))
			}
			break;
#ifdef CM2SLK_EXCLUDED_CASE
		case gpe2Bpp:
			{ 
				PUMP_PACKED_SRCFIFO_LOOKUP2_16BPP(pSrcBits, ulDWords, ulExtras,
						ulByteShift, lSrcStride, height, (pBltParms->pLookup))
			}
			break;
		case gpe24Bpp:
			{
				PUMP_PACKED_SRCFIFO_LOOKUP24_16BPP(pSrcBits, ulDWords, ulExtras,
						ulByteShift, lSrcStride, height, (pBltParms->pLookup))
			}
			break;
		case gpe32Bpp:
			{
				PUMP_PACKED_SRCFIFO_LOOKUP32_16BPP(pSrcBits, ulDWords, ulExtras,
						ulByteShift, lSrcStride, height, (pBltParms->pLookup))
			}
			break;
#endif	//CM2SLK_EXCLUDED_CASE
	}			
	geTERMINATE();	
	
	ROTATE_PARAMS_BACK(pBltParms);
	
	RETURN_CM2SLKBLT16;
}
#endif	//HSUTEST
#endif	//CHECK_16BPP

#ifdef	CHECK_32BPP
SCODE MQGC::CM2SLKBlt32( GPEBltParms *pBltParms )
{
	DEBUGMSG(GPE_ZONE_MQEMUL1,(TEXT("CM2SLKBlt32\r\n")));

	PBYTE	pSrcBits;
	ULONG	width, height;
	ULONG	ulCmd, ulOffset, ulDWords, ulByteShift, ulExtras;
	long	lSrcStride;

	ROTATE_PARAMS(pBltParms);
	
	geINIT( pBltParms->pDst );
	width = pBltParms->prclDst->right - pBltParms->prclDst->left;
	height = pBltParms->prclDst->bottom - pBltParms->prclDst->top;
	
	//Calculate the PROGRAMMABLE parameters for 32BPP Destination 
	//32BPP Source should be handled by CM2SBlt32() which source and 
	//destination color depth are the same (w or w/o lookup table).
	lSrcStride = m_pSrc->Stride();
	pSrcBits = (PBYTE)(m_pSrc->Buffer()) + 
			(pBltParms->prclSrc->top * lSrcStride);
			
#ifdef CM2SLK_EXCLUDED_CASE
	if (m_eFormat == gpe2Bpp)
	{
			ulPixelOffset = (pBltParms->prclSrc->left);
			pSrcBits += (ulPixelOffset >> 2);
			ulByteShift = (ULONG)(ulPixelOffset & 0x03UL);
			// Now calculate based on destination byte/dword counts
			ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY;
			ulDWords = ulByteShift+width; // num of DWORDS per line
			// Calculate Extra bits to pad data up to 128-bit aligned 
			ulDWords += (4UL - (ulDWords & 0x03UL)) & 0x03UL;									
			ulOffset = ulByteShift << 30; // can only handle 1 pixel offset
	}
	else
#endif
   if (m_eFormat == gpe4Bpp)
	{
			// SRC reads = DWORD
			pSrcBits += (pBltParms->prclSrc->left >> 1); 					
			ulByteShift = (ULONG)pSrcBits & 0x03UL;	
			pSrcBits -= ulByteShift;
		   ulOffset = (ULONG)(pBltParms->prclSrc->left & 0x01UL);
			// Now calculate based on destination byte/dword counts
			ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY;
			ulDWords = ulOffset+width; // num of DWORDS per line
			// Calculate Extra bits to pad data up to 128-bit aligned 
			ulDWords += (4UL - (ulDWords & 0x03UL)) & 0x03UL;									
			ulOffset <<= 30;
	}
	else if (m_eFormat == gpe8Bpp)
	{		
			// SRC reads = DWORD
			pSrcBits += pBltParms->prclSrc->left;
			ulByteShift = (ULONG)pSrcBits & 0x03UL;
			pSrcBits -= ulByteShift;
			// Now calculate based on destination byte/dword counts
			ulCmd = m_ulRop3 | DO_BITBLT | SRC_IS_MEMORY | PACKED_MODE;
			ulDWords = width;
			// Calculate Extra bits to pad data up to 128-bit aligned     
			// PUMP Macro will take care initial offset
			ulOffset = 0;
	}
	else
	{
		return	S_FALSE;
	}
	// Calculate SRC FIFO parameters
	m_ulDestXY = (pBltParms->prclDst->top << 16) + pBltParms->prclDst->left
				+ ((MQGCSurf *)(pBltParms->pDst))->m_ulTopLeft;
				
#ifdef	CM2SBLT_TRANSPARENT
	if ( pBltParms->bltFlags & BLT_TRANSPARENT )
	{
		ulCmd |= TRANS_COLOR;
		geWAITCMDFIFO( 1 );
		geREG(COLOR_COMPARE, (pBltParms->pLookup)[pBltParms->solidColor]);
	}
#endif
		
	if ( m_pPatternSetup != NullPatternSetup )
	{
		PBYTE pSB;
		ULONG dstxy,i,j,hloop,ulExt;
		
		if ( m_pBrush )
			m_lpPattern = (PULONG)m_pBrush->Buffer();
		// Set Pattern Offset
		m_ulDestXY |=
				((((m_ulDestXY & 0x0FFFUL) - pBltParms->pptlBrush->x)
					& 0x7UL) << 13)
				| (((((m_ulDestXY >> 16) & 0x0FFFUL) - pBltParms->pptlBrush->y)
					& 0x7UL) << 29);
		
		if (height > 0x4UL)
		{
			// Calculate total DWORDS and Extras DWORDs to pump for FOUR LINES
			// ONLY Height=4 is set through the MACRO calls below
			// Calculate Extra 128-bit pads for 4 lines only (PACKED MODE)
			if (ulCmd & PACKED_MODE)
				ulExtras = (4UL - ((ulDWords * 0x04UL) & 0x03UL)) & 0x03UL;
			else
				ulExtras = 0;				

			geWAITCMDFIFO( 1 );
			geREG(SRC_STRIDE_OFFSET,	ulOffset);
			// Start loading color pattern 4 lines at a time
			for (i = 2; i > 0; i-- )
			{
			   pSB = pSrcBits;
				dstxy = m_ulDestXY;
				(this->*m_pPatternSetup)( pBltParms, &ulCmd );
				// Execute ROP3 command 4 lines at a time
				for (j=0; j < height; dstxy += 0x80000UL)
				{
					if ((height-j) < 0x04UL)
					{
						hloop = height - j;
						// Calculate Extra bits to pad data up to 128-bit aligned
						// FOR PACKED MODE ONLY
						if (ulCmd & PACKED_MODE)
						   ulExt = (4UL - ((ulDWords * hloop) & 0x03UL)) & 0x03UL;
						else
							ulExt = ulExtras;
					}
					else
					{
						hloop = 0x04UL;
						ulExt = ulExtras;
					}
					
					// Execute pattern blt
					geWAITCMDFIFO( 3 );
					geREG(WIDTH_HEIGHT, ((hloop << 16) | width));
					geREG(DEST_XY, 		dstxy);
					SET_GE_DEST_STRIDE(m_ulDestStride);
					geREG(DRAW_CMD,		ulCmd);

					// Pump SRC FIFO with pattern
					switch (m_eFormat)
					{
						case gpe4Bpp:
							{ 
								PUMP_PACKED_SRCFIFO_LOOKUP4_32BPP(pSB, ulDWords,
											ulExtras, ulByteShift, lSrcStride, 
											hloop,	(pBltParms->pLookup))
							}
							break;
		
						case gpe8Bpp:
							{ 
								PUMP_PACKED_SRCFIFO_LOOKUP8_32BPP(pSB, ulDWords,
											ulExtras, ulByteShift, lSrcStride, 
											hloop, (pBltParms->pLookup))
							}
							break;

#ifdef CM2SLK_EXCLUDED_CASE
						case gpe2Bpp:
							{ 
								PUMP_PACKED_SRCFIFO_LOOKUP2_32BPP(pSB, ulDWords,
											ulExtras, ulByteShift, lSrcStride, 
											hloop,	(pBltParms->pLookup))
							}
							break;
							
						case gpe16Bpp:
							{ 
								PUMP_PACKED_SRCFIFO_LOOKUP16_32BPP(pSB, ulDWords,
											ulExtras, ulByteShift, lSrcStride,
											hloop, (pBltParms->pLookup))
							}
							break;
							
						case gpe24Bpp:
							{ 
								PUMP_PACKED_SRCFIFO_LOOKUP24_32BPP(pSB, ulDWords,
											ulExtras, ulByteShift, lSrcStride,
											hloop, (pBltParms->pLookup))
							}
							break;
#endif	//CM2SLK_EXCLUDED_CASE
					}			
					j += 0x08UL;
					pSB += (0x04UL * lSrcStride);
				}
				m_ulDestXY += 0x40000UL;		
				pSrcBits += (0x04UL * lSrcStride);
			}
			geTERMINATE();

			ROTATE_PARAMS_BACK(pBltParms);
			
			RETURN_CM2SBLT32;
		}
		else
			(this->*m_pPatternSetup)( pBltParms, &ulCmd );
	}
	// Calculate Extra bits to pad data up to 128-bit aligned
	if (ulCmd & PACKED_MODE)
		ulExtras = (4UL - ((ulDWords * height) & 0x03UL)) & 0x03UL;
   else
	   ulExtras = 0;
		
#ifdef	CM2SBLT_TRANSPARENT
	if ( pBltParms->bltFlags & BLT_TRANSPARENT )
	{
		ulCmd |= TRANS_COLOR;
		geWAITCMDFIFO( 1 );
		geREG(COLOR_COMPARE, (pBltParms->pLookup)[pBltParms->solidColor]);
	}
#endif

	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);

	switch (m_eFormat)
	{
		case gpe4Bpp:
			{ 
				PUMP_PACKED_SRCFIFO_LOOKUP4_32BPP(pSrcBits, ulDWords, ulExtras,
						ulByteShift, lSrcStride, height, (pBltParms->pLookup))
			}
			break;
		case gpe8Bpp:
			{ 
				PUMP_PACKED_SRCFIFO_LOOKUP8_32BPP(pSrcBits, ulDWords, ulExtras,
						ulByteShift, lSrcStride, height, (pBltParms->pLookup))
			}
			break;
#ifdef CM2SLK_EXCLUDED_CASE
		case gpe2Bpp:
			{ 
				PUMP_PACKED_SRCFIFO_LOOKUP2_32BPP(pSrcBits, ulDWords, ulExtras,
						ulByteShift, lSrcStride, height, (pBltParms->pLookup))
			}
			break;
		case gpe16Bpp:
			{ 
				PUMP_PACKED_SRCFIFO_LOOKUP16_32BPP(pSrcBits, ulDWords, ulExtras,
						ulByteShift, lSrcStride, height, (pBltParms->pLookup))
			}
			break;
		case gpe24Bpp:
			{ 
				PUMP_PACKED_SRCFIFO_LOOKUP24_32BPP(pSrcBits, ulDWords, ulExtras,
						ulByteShift, lSrcStride, height, (pBltParms->pLookup))
			}
			break;
#endif	//CM2SLK_EXCLUDED_CASE
	}			
	geTERMINATE();	
	
	ROTATE_PARAMS_BACK(pBltParms);
	
	RETURN_CM2SLKBLT32;
}
#endif	//CHECK_32BPP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -