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

📄 fimgse2d.cpp

📁 Samsung公司S3C6400芯片的BSP源码包
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			m_uFontWidth = 8;
			m_uFontHeight = 15;
			*uFontWidth=8;
			*uFontHeight=15;			
			break;
		case 3:
			m_upFontType = (BYTE *)chr_font8X16;
			m_uFontWidth = 8;
			m_uFontHeight = 16;
			*uFontWidth=8;
			*uFontHeight=16;			
			break;	
		default:
			m_upFontType = (BYTE *)chr_font8X8;
			m_uFontWidth = 8;
			m_uFontHeight = 8;
			*uFontWidth=8;
			*uFontHeight=8;			
			break;
	}
}

void FIMGSE2D::FillMemoryForTextDrawing(DWORD uFontType, DWORD uTextDrawingFbAddr)
{
	BYTE* ucOneLetter;	
	DWORD uHostData = 0x0;
	DWORD uTempData = 0x0;
	DWORD i,j,k;
	
	DWORD uTotalSizeOfFont;
	DWORD uAddressOffset;

	switch(uFontType) {
		case 0:
			m_upFontType = (BYTE *)chr_font8X8;
			m_uFontWidth = 8;
			m_uFontHeight = 8;
			uTotalSizeOfFont=sizeof(chr_font8X8);
			break;
		case 1:
			m_upFontType = (BYTE *)font8x15;
			m_uFontWidth = 8;
			m_uFontHeight = 15;
			uTotalSizeOfFont=sizeof(font8x15);
			break;
		case 2:
			m_upFontType = (BYTE *)chr_font8X16T;
			m_uFontWidth = 8;
			m_uFontHeight = 15;
			uTotalSizeOfFont=sizeof(chr_font8X16T);		
			break;
		case 3:
			m_upFontType = (BYTE *)chr_font8X16;
			m_uFontWidth = 8;
			m_uFontHeight = 16;		
			uTotalSizeOfFont=sizeof(chr_font8X16);
			break;	
		default:
			m_upFontType = (BYTE *)chr_font8X8;
			m_uFontWidth = 8;
			m_uFontHeight = 8;
			uTotalSizeOfFont=sizeof(chr_font8X8);	
			break;			
	}

//	*uFontSize = m_uFontHeight;

#if 0
	for(i=0; i< uTotalSizeOfFont/4; i++) {
		ucOneLetter = m_upFontType + i*4; // get start address of chosen letter in font8x15
		for (j=0; j<4; j++) // Generate 1-word of data!!
		{
			uTempData = (DWORD)ucOneLetter[j];
			uHostData |= (uTempData << (24 - 8*j));
		}
		*(unsigned int *)(uTextDrawingFbAddr+i*4)=uHostData;
		uHostData=0;
	}	
#endif

	// m_ufontWidth might be multiple of 8.
	uAddressOffset=((m_uFontWidth/8*m_uFontHeight+3)/4)*4;
	for(i=0; i< (uTotalSizeOfFont)/(m_uFontWidth/8*m_uFontHeight); i++) {
		ucOneLetter = m_upFontType + i*m_uFontWidth/8*m_uFontHeight; 
		for (j=0; j<(m_uFontWidth/8*m_uFontHeight+3)/4; j++) // Generate 1-word of data!!
		{
			for (k=0; k<4; k++) // Generate 1-word of data!!
			{
				uTempData = (DWORD)ucOneLetter[j*4+k];
				uHostData |= (uTempData << (24 - 8*k));
			}
			*(unsigned int *)(uTextDrawingFbAddr+i*uAddressOffset+j*4)=uHostData;
			uHostData=0;
		}

	}

}
*/
void FIMGSE2D::SetCoordinateSrcBlock(DWORD uStartX, DWORD uStartY, DWORD uEndX, DWORD uEndY)
{
//	CheckFifo(17);
	m_pG2DReg->COORD0_X = uStartX;
	m_pG2DReg->COORD0_Y = uStartY;
	m_pG2DReg->COORD1_X = uEndX;
	m_pG2DReg->COORD1_Y = uEndY;	
}

void FIMGSE2D::SetCoordinateDstBlock(DWORD uStartX, DWORD uStartY, DWORD uEndX, DWORD uEndY)
{
//	CheckFifo(17);
	m_pG2DReg->COORD2_X = uStartX;
	m_pG2DReg->COORD2_Y = uStartY;
	m_pG2DReg->COORD3_X = uEndX;
	m_pG2DReg->COORD3_Y = uEndY;	
}

void FIMGSE2D::SetFirstBitBLTData(DWORD uFirstData)
{
	CheckFifo(17);

	m_pG2DReg->CMDR2 = uFirstData;
}

void FIMGSE2D::SetNextBitBLTData(DWORD uNextData)
{
	CheckFifo(17);

	m_pG2DReg->CMDR3 = uNextData;
}

void FIMGSE2D::SetStencilKey(DWORD uIsColorKeyOn, DWORD uIsInverseOn, DWORD uIsSwapOn)
{	
	m_pG2DReg->COLORKEY_CNTL = ((uIsColorKeyOn&1)<<31)|((uIsInverseOn&1)<<23)|(uIsSwapOn&1);
}

void FIMGSE2D::SetStencilMinMax(DWORD uRedMin, DWORD uRedMax, DWORD uGreenMin, DWORD uGreenMax, DWORD uBlueMin, DWORD uBlueMax)
{
	m_pG2DReg->COLORKEY_DR_MIN = ((uRedMin&0xff)<<16)|((uGreenMin&0xff)<<8)|(uBlueMin&0xff);
	m_pG2DReg->COLORKEY_DR_MAX = ((0xffU<<24)|(uRedMax&0xff)<<16)|((uGreenMax&0xff)<<8)|(uBlueMax&0xff);	
}

void FIMGSE2D::GetFrmSz(DWORD *uG2dWidth, DWORD *uG2dHeight)
{
	DWORD uMaxScreenVal;

	uMaxScreenVal = m_pG2DReg->SC_WINDOW;
	*uG2dWidth = (uMaxScreenVal&0x7ff)+1;
	*uG2dHeight = ((uMaxScreenVal>>16)&0x7ff)+1;
}

void FIMGSE2D::GetFbAddr(DWORD *uG2dFbAddr)
{
	*uG2dFbAddr = m_pG2DReg->FB_BA;
}

void FIMGSE2D::GetBppMode(CSPACE *eBpp)
{
	DWORD uBppVal;

	uBppVal = m_pG2DReg->COLOR_MODE;
	switch(uBppVal&0xf) {
		case 1:
			*eBpp=ARGB8; //15-bpp
			break;
		case 2:
			*eBpp=RGB16; //16-bpp
			break;
		case 4:
			*eBpp=RGB18; // 18-bpp
			break;
		case 8:
			*eBpp=RGB24; // 24-bpp
			break; 
		default:
			*eBpp=RGB16; //16-bpp
			break;
	}		
}

void FIMGSE2D::SetColorExpansionMethod(bool bIsScr2Scr)
{
	m_bIsScr2Scr  = (bIsScr2Scr) ? 1 :	0;
}
/*
void FIMGSE2D::SetFontAddr(DWORD uFontAddr)
{
	m_uFontAddr= uFontAddr;
}
*/
void FIMGSE2D::InterruptEnable(void)
{
	m_pG2DReg->INTEN = (0x1<<9);// + (0x1<<8) + (0x1);				//Enable Interrupt
	m_pG2DReg->INTC_PEND = 0x80000000;		//

	bG2dDone=0;
}

void FIMGSE2D::InterruptDisable(void)
{
	m_pG2DReg->INTEN &= ~((1<<9) /*+(1<<8) + 1*/);//Disable Interrupt
}

void FIMGSE2D::InterruptPendingClear(void)
{
	m_pG2DReg->INTC_PEND = 0x80000400;//0x80000701;		// Level Interrupt (Interupt Clear Enable)
	m_pG2DReg->INTC_PEND = 0x80000000;		// Level Interrupt (Interupt Clear Enable)	
}

void FIMGSE2D::SetEndian(bool bEndian)
{
	m_pG2DReg->ENDIAN_READSIZE = ( (m_pG2DReg->ENDIAN_READSIZE) & ~(1<<4)) | (bEndian<<4);
}
void FIMGSE2D::SetReadSize(BYTE ucReadSize)
{
	m_pG2DReg->ENDIAN_READSIZE = ( (m_pG2DReg->ENDIAN_READSIZE) & ~(3<<0) ) | ucReadSize ;
}

void FIMGSE2D::RopOperation(bool bSrcData, bool bDstData, bool bThirdData, BYTE ucRopVal, bool *bOut)
{
	if((bSrcData==0) && (bDstData==0) && (bThirdData ==0)) *bOut=(bool)((ucRopVal>>0)&0x1);
	else if((bSrcData==0 )&& (bDstData==0) && (bThirdData ==1)) *bOut=(bool)((ucRopVal>>1)&0x1);
	else if((bSrcData==0) && (bDstData==1) && (bThirdData ==0)) *bOut=(bool)((ucRopVal>>2)&0x1);
	else if((bSrcData==0) && (bDstData==1) && (bThirdData ==1)) *bOut=(bool)((ucRopVal>>3)&0x1);
	else if((bSrcData==1) && (bDstData==0) && (bThirdData ==0)) *bOut=(bool)((ucRopVal>>4)&0x1);
	else if((bSrcData==1) && (bDstData==0) && (bThirdData ==1)) *bOut=(bool)((ucRopVal>>5)&0x1);
	else if((bSrcData==1) && (bDstData==1) && (bThirdData ==0)) *bOut=(bool)((ucRopVal>>6)&0x1);
	else if((bSrcData==1) && (bDstData==1) && (bThirdData ==1)) *bOut=(bool)((ucRopVal>>7)&0x1);
	else Assert(0);
}

void FIMGSE2D::RopOut(DWORD uSrcData, DWORD uDstData, DWORD uThirdData, BYTE ucRopVal, CSPACE eBpp, DWORD *uRopOut)
{

	DWORD i;
	DWORD uDataMask;
	DWORD uDataSize;
	bool bSrcData, bDstData, bThirdData, bOutData;
	
	if(eBpp==RGB16) {
		uDataMask=0xffff;	
		uDataSize=16;
	}
	else if(eBpp==RGB18) {
		uDataMask=0x3ffff;
		uDataSize=18;		
	}
	else if(eBpp==RGB24) {
		uDataMask=0xffffff;
		uDataSize=24;
	}
	else Assert(0);

	*uRopOut = 0;
	for(i=0; i<uDataSize; i++) {
		bSrcData=(bool)(((uSrcData&uDataMask)>>i)&1);
		bDstData=(bool)(((uDstData&uDataMask)>>i)&1);
		bThirdData=(bool)(((uThirdData&uDataMask)>>i)&1);
		RopOperation(bSrcData, bDstData, bThirdData, ucRopVal, &bOutData);
		*uRopOut |= (bOutData << i);
	}
}

void FIMGSE2D::ConvertEcolorToRaw(G2D_COLOR eColor, DWORD *uRawColor) 
{
	*uRawColor=m_uColorVal[eColor];
}

void FIMGSE2D::GetFbData(DWORD uX, DWORD uY, DWORD uG2dWidth, DWORD uG2dFbAddr, CSPACE eBpp, DWORD *uFbData)
	 
{
	if(eBpp==RGB24 || eBpp==RGB18)
		*uFbData = *(DWORD *)(uG2dFbAddr+(uY*uG2dWidth+uX)*4);
	else
		*uFbData = *(WORD *)(uG2dFbAddr+(uY*uG2dWidth+uX)*2) & 0xFFFF;
}

void FIMGSE2D::SetFbData(DWORD uX, DWORD uY, DWORD uG2dWidth, DWORD uG2dFbAddr, CSPACE eBpp, DWORD uFbData)
	 
{
	if(eBpp==RGB24 || eBpp==RGB18)
		*(DWORD *)(uG2dFbAddr+(uY*uG2dWidth+uX)*4) = uFbData;
	else
		*(WORD *)(uG2dFbAddr+(uY*uG2dWidth+uX)*2) = (WORD)uFbData;
}

/* G2D_PAT_OFF_X, G2D_PAT_OFF_Y write only
void FIMGSE2D::GetPatternOffset(BYTE *ucPatOffsetX, BYTE *ucPatOffsetY)
{
	*ucPatOffsetX=Inp32(rG2D_PAT_OFF_X);
	*ucPatOffsetY=Inp32(rG2D_PAT_OFF_Y);
}
*/
void FIMGSE2D::ConvertPatternToRaw(WORD uThirdDataOrg, CSPACE eBpp, DWORD *uThirdDataConverted)
{
	DWORD uRed, uGreen, uBlue;
	switch(eBpp) {
		case RGB16:
			*uThirdDataConverted=uThirdDataOrg;
			break;
		case RGB18:
			uRed=(((uThirdDataOrg>>11)&0x1f)<<(12+1));
			uGreen=(((uThirdDataOrg>>5)&0x3f)<<6);
			uBlue=((uThirdDataOrg&0x1f)<<(0+1));
			*uThirdDataConverted=(uRed|uGreen|uBlue);
			if(*uThirdDataConverted&0x02000) *uThirdDataConverted|=0x01000;
			if(*uThirdDataConverted&0x00040) *uThirdDataConverted=*uThirdDataConverted;
			if(*uThirdDataConverted&0x00002) *uThirdDataConverted|=0x1;			
			break;
		case RGB24:
			uRed=(((uThirdDataOrg>>11)&0x1f)<<(16+3));
			uGreen=(((uThirdDataOrg>>5)&0x3f)<<(8+2));
			uBlue=((uThirdDataOrg&0x1f)<<(0+3));
			*uThirdDataConverted=(uRed|uGreen|uBlue);
			if(*uThirdDataConverted&0x00080000) *uThirdDataConverted|=0x00070000;
			if(*uThirdDataConverted&0x00000400) *uThirdDataConverted|=0x00000300;
			if(*uThirdDataConverted&0x00000008) *uThirdDataConverted|=0x00000007;			
			break;
		default:
			*uThirdDataConverted=uThirdDataOrg;
			break;

	}

}


void FIMGSE2D::BlendingOut(DWORD uSrcData, DWORD uDstData, BYTE ucAlphaVal, bool bFading, BYTE ucFadingOffset, DWORD *uBlendingOut)
{

	DWORD uSrcRed, uSrcGreen, uSrcBlue;
	DWORD uDstRed, uDstGreen, uDstBlue;
	DWORD uBldRed, uBldGreen, uBldBlue;	
	
	uSrcRed= (uSrcData & 0x00ff0000)>>16;  // Mask R
	uSrcGreen = (uSrcData & 0x0000ff00)>>8;	 // Mask G
	uSrcBlue = uSrcData & 0x000000ff;		 // Mask B

	uDstRed = (uDstData & 0x00ff0000)>>16; // Mask R
	uDstGreen = (uDstData & 0x0000ff00)>>8;  // Mask G
	uDstBlue = uDstData & 0x000000ff;		 // Mask B

	if(bFading) {
		uBldRed= ((uSrcRed*(ucAlphaVal+1))>>8) + ucFadingOffset; // R output
		uBldGreen= ((uSrcGreen*(ucAlphaVal+1))>>8) + ucFadingOffset; // G output
		uBldBlue= ((uSrcBlue*(ucAlphaVal+1)>>8)) + ucFadingOffset; // B output
		if(uBldRed>=256) uBldRed=255;
		if(uBldGreen>=256) uBldGreen=255;
		if(uBldBlue>=256) uBldBlue=255;
	}
	else {
		uBldRed= ((uSrcRed*(ucAlphaVal+1)) + (uDstRed*(256-ucAlphaVal)))>>8; // R output
		uBldGreen= ((uSrcGreen*(ucAlphaVal+1)) + (uDstGreen*(256-ucAlphaVal)))>>8; // G output
		uBldBlue= ((uSrcBlue*(ucAlphaVal+1)) + (uDstBlue*(256-ucAlphaVal)))>>8; // B output
	}

	*uBlendingOut = (uBldRed<<16) | (uBldGreen<<8) | uBldBlue;
}


void FIMGSE2D::Convert24bpp(DWORD uSrcData, CSPACE eBpp, bool bSwap, DWORD *uConvertedData)
{

	DWORD uRed, uGreen, uBlue;
	
	switch(eBpp) {
		case  ARGB8: // 15 bit color mode
			if(bSwap == 1) {  // pde_state == 2(BitBlt)
				uRed = uSrcData & 0x00007c00;  // R
				uGreen = uSrcData & 0x000003e0;  // G
				uBlue = uSrcData & 0x0000001f;  // B
			
				*uConvertedData = uRed<<9 | uGreen<<6 | uBlue<<3; // SUM
			}
			else { //hsel = 0
				uRed = uSrcData & 0x7c000000;
				uGreen = uSrcData & 0x03e00000;
				uBlue = uSrcData & 0x001f0000;

				*uConvertedData = uRed>>7 | uGreen>>10 | uBlue>>13;
			} 
			break;
		case RGB16 : // 16 bit color mode
			if(bSwap == 1) {
				uRed = uSrcData & 0x0000f800;
				uGreen = uSrcData & 0x000007e0;
				uBlue = uSrcData & 0x0000001f;

				*uConvertedData = uRed<<8 | uGreen<<5 | uBlue<<3;
			}
			else {
				uRed = uSrcData & 0xf8000000;
				uGreen = uSrcData & 0x07e00000;
				uBlue = uSrcData & 0x001f0000;

				*uConvertedData = uRed>>8 | uGreen>>11 | uBlue>>13;
			}
			break;	

		case RGB18 : // 18 bit color mode
			uRed = uSrcData & 0x0003f000;
			uGreen = uSrcData & 0x00000fc0;
			uBlue = uSrcData & 0x0000003f;
	
			*uConvertedData = uRed<<6 | uGreen<<4 | uBlue<<2;
			break;

		case RGB24 : // 24 bit color mode
			*uConvertedData = uSrcData;
			break;
	} // End of switch
} // End of g2d_cvt24bpp function


void FIMGSE2D::GetRotateCoordinate(DWORD uDstX, DWORD uDstY, DWORD uOrgX, DWORD uOrgY, DWORD uRType, DWORD *uRsltX, DWORD *uRsltY) 
{

	switch(uRType) {
		case  1 : // No Rotate. bypass.
			*uRsltX = uDstX;
			*uRsltY = uDstY;
			break;
		case  2 : // 90 degree Rotation
			*uRsltX = uOrgX + uOrgY - uDstY;
			*uRsltY = uDstX - uOrgX + uOrgY;			
			break;
		case  4 : // 180 degree Rotation
			*uRsltX = 2*uOrgX - uDstX;
			*uRsltY = 2*uOrgY - uDstY;
			break;
		case  8 : // 270 degree Rotation
			*uRsltX = uDstY + uOrgX - uOrgY;
			*uRsltY = uOrgX + uOrgY - uDstX;
			break;
		case 16 : // X-flip
			*uRsltX = uDstX;
			*uRsltY = 2*uOrgY - uDstY;
			break;
		case 32 : // Y-flip
			*uRsltX = 2*uOrgX - uDstX;
			*uRsltY = uDstY;		
			break;
		default :
			Assert(0);
			break;
	}
}

void FIMGSE2D::IntEnableForDeEngineFinish(void)
{
	uIntCnt=0; bG2dDone=0;
	m_pG2DReg->INTEN = (m_pG2DReg->INTEN)&~(0x7<<8) | (1<<10);
	m_pG2DReg->INTC_PEND = (0x80000000|(7<<8));
	m_pG2DReg->INTC_PEND = 0x80000000;
}
void FIMGSE2D::IntEnableForCmdFinish(void)
{
	uIntCnt=0; bG2dDone=0;
	m_pG2DReg->INTEN = ((m_pG2DReg->INTEN)&~(0x7<<8)) | (1<<9);
	m_pG2DReg->INTC_PEND = 0x80000000;
}
void FIMGSE2D::IntEnableForOverflow(bool bFifo, BYTE ucFifoLevel)
{
	uIntCnt=0;
	if(bFifo) {
//		m_pG2DReg->INTEN = ((m_pG2DReg->INTEN)&~(0x7<<8))|(1<<8)|1;
		m_pG2DReg->INTEN = ((m_pG2DReg->INTEN)&~(0x7<<8))|1;
		m_pG2DReg->FIFO_INTC = ucFifoLevel;
	}	
	else
		m_pG2DReg->INTEN = ((m_pG2DReg->INTEN)&~(0x7<<8))|(1<<8);
	m_pG2DReg->INTC_PEND = 0x80000000;
}
void FIMGSE2D::InterruptDisAll(void)
{
//	printf("The total number of interrupts occured:[Expected:%d], [Real:%d]\n",  (m_uMaxDx+1)*(m_uMaxDy+1),uIntCnt);
	uIntCnt=0;
	m_pG2DReg->INTEN = (m_pG2DReg->INTEN)&~((3<<8)|1);
	
}


⌨️ 快捷键说明

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