📄 g2d.c
字号:
}
void G2D_IntDisSelectable(u32 uWhichInt)
{
rG2D_INTEN&=~(uWhichInt);//Disable Interrupt
}
void G2D_WaitForInterrupt(void)
{
while(!bG2dDone);
bG2dDone=0;
}
void __irq Isr_G2d(void)
//void Isr_G2d(void)
{
bG2dDone=1;
rINTMSK2|=BIT_2D;
rG2D_INTC_PEND= ((1<<31)|(1<<10));
rG2D_INTC_PEND= (u32)(1<<31); // Victor gave us a guidance such this line to clear pending.
ClearPending2(BIT_2D);
rINTMSK2&=~BIT_2D;
}
void __irq Isr_G2dProfile(void)
//void Isr_G2dProfile(void)
{
#ifdef PROFILE
volatile float uSpendTime; //msec
PWM_ReadTime(&uSpendTime);
//printf("%6f %10.6f\n", (float)(uSpendTime/1000000.), (float)(1/(uSpendTime/1000000.)));
printf("%10.6f\n", uSpendTime);
#endif
bG2dDone=1;
rG2D_INTC_PEND= ((1<<31)|(1<<9));
rG2D_INTC_PEND= (u32)(1<<31); // Victor gave us a guidance such this line to clear pending.
printf("done\n");
// INTC_ClearVectAddr(); // jcs
}
void Isr_G2dDe(void)
{
bG2dDone=1;
rINTMSK2|=BIT_2D;
rG2D_INTC_PEND= ((1<<31)|(7<<8)|(1<<0));
rG2D_INTC_PEND= (u32)(1<<31); // Victor gave us a guidance such this line to clear pending.
printf("Int\n");
ClearPending2(BIT_2D);
rINTMSK2|=BIT_2D;
}
void G2D_SetEndian(bool bEndian)
{
rG2D_ENDIAN=(rG2D_ENDIAN & ~(1<<4))|(bEndian<<4);
}
void G2D_DrawImage(CSPACE eBpp)
{
u32 i,j,k;
if(eBpp==RGB16) {
k=0;
for(j=0; j<320; j++)
for(i=0; i<240; i++)
// boaz.kim 070903
// G2D_PutPixel(i, j, sun320240_16bpp[k++]);
G2D_PutPixel(i, j, sun240320_16bpp[k++]);
}
else if(eBpp==RGB24) {
k=0;
for(j=0; j<320; j++)
for(i=0; i<240; i++)
// boaz.kim 070903
// G2D_PutPixel(i, j, sun320240_24bpp[k++]);
G2D_PutPixel(i, j, sun240320_24bpp[k++]);
} else;
}
void G2D_RopOperation(bool bSrcData, bool bDstData, bool bThirdData, u8 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 G2D_RopOut(u32 uSrcData, u32 uDstData, u32 uThirdData, u8 ucRopVal, CSPACE eBpp, u32 *uRopOut)
{
u32 i;
u32 uDataMask;
u32 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);
G2D_RopOperation(bSrcData, bDstData, bThirdData, ucRopVal, &bOutData);
*uRopOut |= (bOutData << i);
}
}
void G2D_ConvertEcolorToRaw(G2D_COLOR eColor, u32 *uRawColor)
{
*uRawColor=oG2d.m_uColorVal[eColor];
}
void G2D_GetFbData(u32 uX, u32 uY, u32 uG2dWidth, u32 uG2dFbAddr, CSPACE eBpp, u32 *uFbData)
{
switch(eBpp)
{
case RGB16:
case RGBA16:
case ARGB16:
*uFbData=(*(volatile unsigned short *)(uG2dFbAddr+(uY*uG2dWidth+uX)*2));
break;
case ARGB24:
case RGBA24:
case RGB24:
case RGBX24:
*uFbData=(*(volatile unsigned *)(uG2dFbAddr+(uY*uG2dWidth+uX)*4));
break;
default:
*uFbData=(*(volatile unsigned *)(uG2dFbAddr+(uY*uG2dWidth+uX)*4));
break;
}
}
void G2D_SetFbData(u32 uX, u32 uY, u32 uG2dWidth, u32 uG2dFbAddr, CSPACE eBpp, u32 uFbData)
{
switch(eBpp)
{
case RGB16:
case RGBA16:
case ARGB16:
*(volatile unsigned short*)(uG2dFbAddr+(uY*uG2dWidth+uX)*2)= uFbData;
break;
case ARGB24:
case RGBA24:
case RGB24:
case RGBX24:
*(volatile unsigned *)(uG2dFbAddr+(uY*uG2dWidth+uX)*4)= uFbData;
break;
default:
*(volatile unsigned *)(uG2dFbAddr+(uY*uG2dWidth+uX)*4)= uFbData;
break;
}
}
void G2D_GetPatternOffset(u8 *ucPatOffsetX, u8 *ucPatOffsetY)
{
*ucPatOffsetX=rG2D_PATOFF_X;
*ucPatOffsetY=rG2D_PATOFF_Y;
}
// It needs to be modified according to V2.0.
void G2D_ConvertPatternToRaw(u16 uThirdDataOrg, CSPACE eBpp, u32 *uThirdDataConverted)
{
u32 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;
}
}
#if 0
void G2D_BlendingOut(u32 uSrcData, u32 uDstData, u8 ucAlphaVal, bool bFading, u8 ucFadingOffset, u32 *uBlendingOut)
{
u32 uSrcRed, uSrcGreen, uSrcBlue;
u32 uDstRed, uDstGreen, uDstBlue;
u32 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;
}
#else
void G2D_BlendingOut(u32 uSrcData, u32 uDstData, u8 ucAlphaVal, bool bFading, u8 ucFadingOffset, u32 *uBlendingOut)
{
u32 uSrcRed, uSrcGreen, uSrcBlue;
u32 uDstRed, uDstGreen, uDstBlue;
u32 uBldRed, uBldGreen, uBldBlue;
/*
uSrcRed= uSrcData & 0x0000f800; // Mask R
uSrcGreen = uSrcData & 0x000007e0; // Mask G
uSrcBlue = uSrcData & 0x0000001f; // Mask B
uDstRed = uSrcData & 0x0000f800; // Mask R
uDstGreen = uSrcData & 0x000007e0; // Mask G
uDstBlue = uSrcData & 0x0000001f; // Mask B
*/
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))>>5) + ucFadingOffset; // R output
uBldGreen= ((uSrcGreen*(ucAlphaVal+1))>>6) + ucFadingOffset; // G output
uBldBlue= ((uSrcBlue*(ucAlphaVal+1)>>5)) + ucFadingOffset; // B output
*/
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*(255-ucAlphaVal)))>>8; // R output
uBldGreen= ((uSrcGreen*(ucAlphaVal+1)) + (uDstGreen*(255-ucAlphaVal)))>>8; // G output
uBldBlue= ((uSrcBlue*(ucAlphaVal+1)) + (uDstBlue*(255-ucAlphaVal)))>>8; // B output
}
// *uBlendingOut = uBldRed<<8 | uBldGreen<<5 | uBldBlue<<3;
*uBlendingOut = (uBldRed<<16) | (uBldGreen<<8) | uBldBlue;
}
#endif
void G2d_Convert24bpp(u32 uSrcData, CSPACE eBpp, u8 bSwap, u32 *uConvertedData)
{
u32 uRed, uGreen, uBlue;
#if 0
switch(eBpp) {
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 RGBA16: // 15 bit color mode
uRed = uSrcData & 0x0000f800; // R
uGreen = uSrcData & 0x000007c0; // G
uBlue = uSrcData & 0x0000003e; // B
*uConvertedData = uRed<<8 | uGreen<<5 | uBlue<<2; // SUM
break;
case ARGB16: // 15 bit color mode
uRed = uSrcData & 0x00007c00; // R
uGreen = uSrcData & 0x000003e0; // G
uBlue = uSrcData & 0x0000001f; // B
*uConvertedData = uRed<<9 | uGreen<<6 | uBlue<<3; // SUM
break;
case RGBA24 :
case ARGB24 :
case RGB24 :
case RGBX24 :
*uConvertedData = uSrcData;
break;
default:
*uConvertedData = uSrcData;
break;
}
#elif 1
switch(eBpp) {
case RGB16 : // 16 bit color mode
uRed = (uSrcData & 0x0000f800)>>8;
uGreen = (uSrcData & 0x000007e0)>>3;
uBlue = (uSrcData & 0x0000001f)<<3;
uRed = uRed|((uRed&0xe0)>>5);
uGreen = uGreen|((uGreen&0xc0)>>6);
uBlue = uBlue|((uBlue&0xe0)>>5);
*uConvertedData = uRed<<16 | uGreen<<8 | uBlue;
break;
case RGBA16: // 15 bit color mode
uRed = uSrcData & 0x0000f800; // R
uGreen = uSrcData & 0x000007c0; // G
uBlue = uSrcData & 0x0000003e; // B
*uConvertedData = uRed<<8 | uGreen<<5 | uBlue<<2; // SUM
break;
case ARGB16: // 15 bit color mode
uRed = uSrcData & 0x00007c00; // R
uGreen = uSrcData & 0x000003e0; // G
uBlue = uSrcData & 0x0000001f; // B
*uConvertedData = uRed<<9 | uGreen<<6 | uBlue<<3; // SUM
break;
case RGBA24 :
case ARGB24 :
case RGB24 :
case RGBX24 :
*uConvertedData = uSrcData;
break;
default:
*uConvertedData = uSrcData;
break;
}
#else
switch(eBpp) {
case RGB16 : // 16 bit color mode
uRed = (uSrcData >> 11) & 0x1f;
uGreen = (uSrcData >>5 ) & 0x3f;
uBlue = uSrcData & 0x1f;
uRed = (uRed&0x1) ? ((uRed<<3)|0x7) : (uRed<<3);
uGreen = (uGreen&0x1) ? ((uGreen<<2)|0x3) : (uGreen<<2);
uBlue = (uBlue&0x1) ? ((uBlue<<3)|0x7) : (uBlue<<3);
*uConvertedData = uRed<<16 | uGreen<<8 | uBlue;
break;
case RGBA16: // 15 bit color mode
uRed = uSrcData & 0x0000f800; // R
uGreen = uSrcData & 0x000007c0; // G
uBlue = uSrcData & 0x0000003e; // B
*uConvertedData = uRed<<8 | uGreen<<5 | uBlue<<2; // SUM
break;
case ARGB16: // 15 bit color mode
uRed = uSrcData & 0x00007c00; // R
uGreen = uSrcData & 0x000003e0; // G
uBlue = uSrcData & 0x0000001f; // B
*uConvertedData = uRed<<9 | uGreen<<6 | uBlue<<3; // SUM
break;
case RGBA24 :
case ARGB24 :
case RGB24 :
case RGBX24 :
*uConvertedData = uSrcData;
break;
default:
*uConvertedData = uSrcData;
break;
}
#endif
}
void G2d_Convert16bpp(u32 uSrcData, CSPACE eBpp, u8 bSwap, u32 *uConvertedData)
{
u32 uRed, uGreen, uBlue;
switch(eBpp) {
case RGB16 : // 16 bit color mode
uRed = (uSrcData & 0xff0000)>>16;
uGreen = (uSrcData & 0xff00)>>8;
uBlue = (uSrcData & 0xff);
uRed = uRed >>3;
uGreen = uGreen>>2;
uBlue= uBlue>>3;
*uConvertedData = uRed<<11 | uGreen<<5 | uBlue;
break;
case RGBA16: // 15 bit color mode
uRed = uSrcData & 0x0000f800; // R
uGreen = uSrcData & 0x000007c0; // G
uBlue = uSrcData & 0x0000003e; // B
*uConvertedData = uRed<<8 | uGreen<<5 | uBlue<<2; // SUM
break;
case ARGB16: // 15 bit color mode
uRed = uSrcData & 0x00007c00; // R
uGreen = uSrcData & 0x000003e0; // G
uBlue = uSrcData & 0x0000001f; // B
*uConvertedData = uRed<<9 | uGreen<<6 | uBlue<<3; // SUM
break;
case RGBA24 :
case ARGB24 :
case RGB24 :
case RGBX24 :
*uConvertedData = uSrcData;
break;
default:
*uConvertedData = uSrcData;
break;
}
}
void G2D_GetRotateCoordinate(u32 uDstX, u32 uDstY, u32 uOrgX, u32 uOrgY, u32 uRType, u32 *uRsltX, u32 *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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -