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

📄 blt.cpp

📁 WinCE 3.0 BSP, 包含Inter SA1110, Intel_815E, Advantech_PCM9574 等
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	if (pBltParms->pLookup)
	{
		color0 = (unsigned short) pBltParms->pLookup[0];
		color1 = (unsigned short) pBltParms->pLookup[1];
	}
	else if (pBltParms->pConvert)
	{
		color0 = (unsigned short)(pBltParms->pColorConverter->*(pBltParms->pConvert))(0);
;	
		color1 = (unsigned short)(pBltParms->pColorConverter->*(pBltParms->pConvert))(1);
;	
	}
	else
	{
		color0 = 0x0000;
		color1 = 0xFFFF;
	}

	if (pBltParms->pSrc->Format() == gpe1Bpp)
	{

		RETAILMSG( 0, ( TEXT(" start color expansion CTS - hrhr\n") ) );
		gfx_set_solid_pattern(0);
		gfx_set_mono_source(color0,color1,0);
		gfx_set_raster_operation((unsigned char) pBltParms->rop4);
		gfx_mono_bitmap_to_screen_blt(srcX,srcY,x1,y1,x2 - x1,y2 - y1,lineptr,stride);
		RETAILMSG( 0, ( TEXT(" End color expansion CTS - hrhr\n") ) );
	} 
	else // if (Display_BPP >= 8)
	{
		RETAILMSG( 0, ( TEXT(" Solid CTS - hrhr\n") ) );
		if (pBltParms->bltFlags & BLT_TRANSPARENT) {

            RETAILMSG(1,(TEXT("Durango BmpToScrxBlt\r\n")));
			gfx_set_solid_pattern(0);
			gfx_set_raster_operation((unsigned char) pBltParms->rop4);//0xcc);
			gfx_color_bitmap_to_screen_xblt(srcX, srcY, x1, y1, x2 - x1, y2 - y1,
				lineptr, stride, color0);
		} else {
			gfx_set_solid_pattern(0);
			gfx_set_mono_source(color0,color1,0);
			gfx_set_raster_operation((unsigned char) pBltParms->rop4);
			gfx_color_bitmap_to_screen_blt(srcX,srcY,x1,y1,x2 - x1,y2 - y1,
				lineptr,stride);
		}
	}

#else

	//Get a valid data pointer
	//ASSERT(lineptr != 0);

	// SET PARAMETERS FOR ALL SCANLINES

	WAIT_PENDING(GXregisters);
	WRITE_REG32(GXregisters, GP_DST_XCOOR, (y1 << 16) | x1);
	WRITE_REG32(GXregisters, GP_WIDTH, 0x10000 | width);
	WRITE_REG16(GXregisters, GP_RASTER_MODE, pBltParms->rop4 & 0x00FF);

	// DETERMINE BLT MODE

	blit_mode = BM_READ_SRC_BB0;
	if ((pBltParms->rop4 & 0x00FF) != 0x00CC)
		blit_mode |= BM_READ_DST_FB1;

	// CHECK SOURCE COLOR DEPTH

	if (pBltParms->pSrc->Format() == gpe1Bpp)
	{
		unsigned short color0, color1;

		// MONOCHROME SOURCE
		DEBUGMSG(0,(TEXT("MONOCHROME SOURCE %X %X\n"), pBltParms->pLookup, pBltParms->pConvert));

		//SET THE START X POSITION
		WRITE_REG16(GXregisters, GP_SRC_XCOOR, srcX & 7);

		width_bytes = (width + (srcX & 0x7) + 7) >> 3;
		lineptr += (srcY * stride) + (srcX >> 3);
		blit_mode |= BM_SOURCE_EXPAND;

		// GET SOURCE EXPANSION COLORS
		// If no lookup pointer then default to 0x0000 and 0xFFFF.
		
		if (pBltParms->pLookup)
		{
			color0 = (unsigned short) pBltParms->pLookup[0];
			color1 = (unsigned short) pBltParms->pLookup[1];
		}
		else if (pBltParms->pConvert)
		{
			color0 = (unsigned short)(pBltParms->pColorConverter->*(pBltParms->pConvert))(0);
;
			color1 = (unsigned short)(pBltParms->pColorConverter->*(pBltParms->pConvert))(1);
;
		}
		else
		{
			color0 = 0x0000;
			color1 = 0xFFFF;
		}

		// DUPLICATE COLORS IF 8 BPP

		if (Display_BPP == 8) 
		{
			color0 &= 0x00FF;
			color0 |= (color0 << 8);
			color1 &= 0x00FF;
			color1 |= (color1 << 8);
		}

		// LOAD COLORS INTO HARDWARE

		WRITE_REG32(GXregisters, GP_SRC_COLOR_0, (color1 << 16) | color0);
	}
	else if (Display_BPP == 8)
	{
 	// 8 BPP COLOR SOURCE

		width_bytes = width;
		lineptr += (srcY * stride) + srcX;
	}
	else
	{
 		// 16 BPP COLOR SOURCE

		width_bytes = width << 1;
		lineptr += (srcY * stride) + (srcX << 1);
	}

	// REPEAT FOR EACH SCANLINE

	unsigned long widthWBytes = width_bytes >> 2;
	width_bytes &= 0x3;
	memInit();

	for (i = 0; i < height; i++)
	{
		// COPY CURRENT POINTER TO A DWORD POINTER

		dataptr = lineptr;
		spadAddr = BB0_Base_Address;

		// COPY ALL THE DATA FOR THE CURRENT LINE INTO THE SCRATCHPAD
		// Must wait for the pipeline to be idle before loading the 
		// new data into the BLT buffer. 
		memCopy(dataptr,  spadAddr, widthWBytes, width_bytes);
		WRITE_REG16(GXregisters, GP_BLIT_MODE, blit_mode);

		// ADJUST SOURCE OFFSET FOR NEXT SCANLINE
		lineptr += stride;
	}
#endif
	return S_OK;
}

//BPP=1
static unsigned char bit_mask[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
static unsigned char bit_shift[8] = {7,6,5,4,3,2,1,0};
//BPP=2
static unsigned char bit2_mask[4] = {0xC0, 0x30, 0x0C, 0x03};
static unsigned char bit2_shift[4] = {6,4,2,0};
//BPP=4
static unsigned char nibble_mask[2] = {0xF0, 0x0F};
static unsigned char nibble_shift[2] = {4, 0};

#define GETBIT(Data, bit) \
                (unsigned char)(((Data) & bit_mask[(bit)]) >> bit_shift[(bit)])

#define GET2BIT(Data, bit) \
                (unsigned char)(((Data) & bit2_mask[(bit)]) >> bit2_shift[(bit)])

#define GETNIBBLE(Data, bit) \
				(unsigned char)(((Data) & nibble_mask[(bit)]) >> nibble_shift[(bit)])

#define DataConversion1_2_8(_srcDataPtr, _sXOffset, _dataLen, _LUT, _SAddr) \
{                                                                           \
	/* Loop thru the scan data and do color conversion */                   \
	for (xInit=_sXOffset, cntr = 0; cntr < _dataLen; cntr++, xInit++) {     \
		_tmpData = GETBIT(_srcDataPtr[xInit>>3], (xInit&0x7));              \
		_tmpData = _LUT[_tmpData];                                          \
		WRITE_REG8(GXregisters, _SAddr, _tmpData);                          \
		_SAddr ++;                                                          \
	}                                                                       \
}
																     
#define DataConversion2_2_8(_srcDataPtr,_sXOffset,  _dataLen, _LUT, _SAddr) \
{                                                                           \
	/* Loop thru the scan data and do color conversion */                   \
	for (xInit=_sXOffset, cntr = 0; cntr < _dataLen; cntr++, xInit++) {     \
		_tmpData = GET2BIT(_srcDataPtr[xInit>>2], (xInit&0x3));             \
		_tmpData = _LUT[_tmpData];                                          \
		WRITE_REG8(GXregisters, _SAddr, _tmpData);                          \
		_SAddr ++;                                                          \
	}                                                                       \
}

#define DataConversion4_2_8(_srcDataPtr, _sXOffset, _dataLen, _LUT, _SAddr) \
{                                                                           \
	/* Loop thru the scan data and do color conversion */                   \
	for (xInit=_sXOffset, cntr = 0; cntr < _dataLen; cntr++, xInit++) {     \
		_tmpData = GETNIBBLE(_srcDataPtr[xInit>>1], (xInit&0x1));           \
		_tmpData = _LUT[_tmpData];                                          \
		WRITE_REG8(GXregisters, _SAddr, _tmpData);                          \
		_SAddr ++;                                                          \
	}                                                                       \
}

#define DataConversion8_2_8(_srcDataPtr, _dataLen, _LUT, _SAddr)            \
{                                                                           \
	/* Loop thru the scan data and do color conversion */                   \
	for (cntr = 0; cntr < _dataLen; cntr++) {                               \
		_tmpData = _LUT[_srcDataPtr[cntr]];                                 \
		WRITE_REG8(GXregisters, _SAddr, _tmpData);                          \
		_SAddr ++;                                                          \
	}                                                                       \
}

#define DataConversion24_2_8(_srcDataPtr, _dataLen, _pFunc, _pConv, _SAddr) \
{                                                                           \
	/* Loop thru the scan data and do color conversion */                   \
	for (cntr = 0; cntr < _dataLen; cntr ++) {                              \
		_tmpData = cntr * 3;                                                \
		_tmpData = (_srcDataPtr[_tmpData] << 16) |                          \
					(_srcDataPtr[_tmpData + 1] << 8) |                      \
					(_srcDataPtr[_tmpData + 2] );                           \
		WRITE_REG8(GXregisters, _SAddr, ((_pConv)->*((_pFunc)))(_tmpData)); \
		_SAddr ++;                                                          \
	}                                                                       \
}

#define DataConversion1_2_16(_srcDataPtr, _sXOffset, _dataLen, _LUT, _SAddr) \
{                                                                            \
	/* Loop thru the scan data and do color conversion */                    \
	for (xInit=_sXOffset, cntr = 0; cntr < _dataLen; cntr++, xInit++) {      \
		_tmpData = GETBIT(_srcDataPtr[xInit>>3], (xInit&0x7));               \
		_tmpData = _LUT[_tmpData];                                           \
		WRITE_REG16(GXregisters, _SAddr, _tmpData);                          \
		_SAddr += 2;                                                         \
	}                                                                        \
}

#define DataConversion2_2_16(_srcDataPtr, _sXOffset, _dataLen, _LUT, _SAddr) \
{                                                                            \
	/* Loop thru the scan data and do color conversion */                    \
	for (xInit=_sXOffset, cntr = 0; cntr < _dataLen; cntr++, xInit++) {      \
		_tmpData = GET2BIT(_srcDataPtr[xInit>>2], (xInit&0x3));              \
		_tmpData = _LUT[_tmpData];                                           \
		WRITE_REG16(GXregisters, _SAddr, _tmpData);                          \
		_SAddr += 2;                                                         \
	}                                                                        \
}

#define DataConversion4_2_16(_srcDataPtr, _sXOffset, _dataLen, _LUT, _SAddr) \
{                                                                            \
	/* Loop thru the scan data and do color conversion */                    \
	for (xInit=_sXOffset, cntr = 0; cntr < _dataLen; cntr++, xInit++) {      \
		_tmpData = GETNIBBLE(_srcDataPtr[xInit>>1], (xInit&0x1));            \
		_tmpData = _LUT[_tmpData];                                           \
		WRITE_REG16(GXregisters, _SAddr, _tmpData);                          \
		_SAddr += 2;                                                         \
	}                                                                        \
}																    

#define DataConversion8_2_16(_srcDataPtr, _dataLen, _LUT, _SAddr)            \
{                                                                            \
	/* Loop thru the scan data and do color conversion */                    \
	for (cntr = 0; cntr < _dataLen; cntr++) {                                \
		_tmpData = _LUT[_srcDataPtr[cntr]];                                  \
		WRITE_REG16(GXregisters, _SAddr, _tmpData);                          \
		_SAddr += 2;                                                         \
	}                                                                        \
}

#define DataConversion24_2_16(_srcDataPtr, _dataLen, _pFunc, _pConv, _SAddr) \
{                                                                            \
	/* Loop thru the scan data and do color conversion */                    \
	for (cntr = 0; cntr < _dataLen; cntr++) {                                \
		_tmpData = cntr * 3;                                                 \
		_tmpData = (_srcDataPtr[_tmpData] << 16) |                           \
					(_srcDataPtr[_tmpData + 1] << 8) |                       \
					(_srcDataPtr[_tmpData + 2] );                            \
		WRITE_REG16(GXregisters, _SAddr, ((_pConv)->*((_pFunc)))(_tmpData)); \
		_SAddr += 2;                                                         \
	}                                                                        \
}


//----------------------------------------------------------------------------
// AcceleratedBitmapScreenLookupBlt
//
// This routine is called to perform a bitmap to screen BLT with color conversion. 
//
// For GX, the source data is loaded into BB0 and the graphics pipeline 
// reads the destination data, if required, into BB1. 
//
// POSSIBLE OPTIMIZATIONS:
//   - Check to see if the bitmap is small enough to fit entirely in the 
//     BLT buffer.
//   - Change the data load routine to use DWORDS.
//----------------------------------------------------------------------------

SCODE GxVideo::AcceleratedBitmapScreenLookupBlt( GPEBltParms *pBltParms )
{
	DEBUGMSG(0,(TEXT("AcceleratedBitmapScreenLookupBlt\n")));

	GxVideoSurf *dst = (GxVideoSurf *)(pBltParms->pDst);
	int left = dst->Left();
	int top = dst->Top();
	int x1 = pBltParms->prclDst->left   + left;
	int y1 = pBltParms->prclDst->top    + top;
	int x2 = pBltParms->prclDst->right  + left;
	int y2 = pBltParms->prclDst->bottom + top;
	int srcX, srcY, srcDepth, sXOffset;
	unsigned long spadAddr, i, width, height, width_bytes, remainingBytes, *lookup; 
	int stride;
	unsigned char *dataptr, *lineptr;
	unsigned short blit_mode=0;
	ColorConverter	*clrConverter;

	// GET BLT PARAMETERS

	width = x2 - x1;
    height = y2 - y1;

	// Caller assures a well-ordered, non-empty rect
	//ASSERT(width > 0 && height > 0);

	stride = pBltParms->pSrc->Stride();
	srcX = pBltParms->prclSrc->left;
	srcY = pBltParms->prclSrc->top;
	lineptr = (unsigned char *) pBltParms->pSrc->Buffer();
	srcDepth = EGPEFormatToBpp[pBltParms->pSrc->Format()];

	DEBUGMSG(0,(TEXT("AcceleratedBitmapScreenLookupBlt=%d %d %d %d %d %d %d 0x%X 0x%X 0x%X %d %d\n"), 
		x1, y1, x2, y2, width, height, stride, srcX, srcY, 
		Display_BPP,pBltParms->pSrc->Format(), srcDepth));

	//Get a valid data pointer
	//ASSERT(lineptr != 0);

	// SET PARAMETERS FOR ALL SCANLINES

	WAIT_PENDING(GXregisters);
	WRITE_REG32(GXregisters, GP_DST_XCOOR, (y1 << 16) | x1);
	WRITE_REG32(GXregisters, GP_WIDTH, 0x10000 | width);
	WRITE_REG16(GXregisters, GP_RASTER_MODE, pBltParms->rop4 & 0x00FF);

	// DETERMINE BLT MODE

	blit_mode = BM_READ_SRC_BB0;
	if ((pBltParms->rop4 & 0x00FF) != 0x00CC)
		blit_mode |= BM_READ_DST_FB1;

	//Make a copy of the color lookup table
	lookup = pBltParms->pLookup;
	clrConverter = pBltParms->pColorConverter;
		 
	sXOffset = 0; //Init the start x offset

	// CHECK SOURCE COLOR DEPTH
	switch(srcDepth)
	{
		case 1:
			lineptr += (srcY * stride) + (srcX >> 3);
			sXOffset = (srcX & 0x7);
			break;
		case 2:
			lineptr += (srcY * stride) + (srcX >> 2);
			sXOffset = srcX & 0x3;
			break;
		case 4:
			lineptr += (srcY * stride) + (srcX >> 1);
			sXOffset = srcX & 0x1;
			break;
		case 8:
			lineptr += (srcY * stride) + srcX;
			break;
		case 16:
			lineptr += (srcY * stride) + (srcX << 1);
			break;
		case 24:
			DEBUGMSG(0,(TEXT("24\n")));
			lineptr += (srcY * stride) + (srcX << 2);
			break;
		default: //* 8 bit depth
			lineptr += (srcY * stride) + srcX;
			break;
	}

	width_bytes = (Display_BPP == 8) ? width : (width << 1);

	// REPEAT FOR EACH SCANLINE

	unsigned long widthWBytes = width_bytes >> 2;
	remainingBytes = width_bytes & 0x3;

	unsigned long cntr, xInit, _tmpData=0;

⌨️ 快捷键说明

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