📄 fimgse2d.cpp
字号:
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 + -