fimgse2d.cpp
来自「6410BSP3」· C++ 代码 · 共 1,270 行 · 第 1/4 页
CPP
1,270 行
{
nIncr = nIncr | 1;
uHSz -= uVSz;
}
}
nIncr = (nIncr + 1) >> 1;
if (usPosX1 > usPosX2)
{
nIncr = (~nIncr) + 1; // 2's complement
}
RETAILMSG(DISP_ZONE_LINE, (TEXT("XINCR: %x "), nIncr ));
}
m_pG2DReg->FG_COLOR = uColor;
uCmdRegVal = 0;
SetAlphaMode(G2D_NO_ALPHA_MODE); //< Constant Alpha
SetAlphaValue(0xff);
if(nMajorCoordX)
{
SetYIncr(nIncr);
uCmdRegVal =
(bIsDrawLastPoint == true) ? (G2D_REND_LINE_BIT | G2D_MAJOR_COORD_X_BIT & G2D_DRAW_LAST_POINT_BIT) :
(G2D_REND_LINE_BIT | G2D_MAJOR_COORD_X_BIT | G2D_NOT_DRAW_LAST_POINT_BIT);
RETAILMSG(DISP_ZONE_LINE,(TEXT("m_pG2DReg:0x%x, CMD: %x, XINCR: %x, YINCR: %x\n"), m_pG2DReg, uCmdRegVal, m_pG2DReg->X_INCR, m_pG2DReg->Y_INCR ));
}
else
{
SetXIncr(nIncr);
uCmdRegVal =
(bIsDrawLastPoint == true) ? (G2D_REND_LINE_BIT | G2D_MAJOR_COORD_Y_BIT & G2D_DRAW_LAST_POINT_BIT) :
(G2D_REND_LINE_BIT | G2D_MAJOR_COORD_Y_BIT | G2D_NOT_DRAW_LAST_POINT_BIT);
RETAILMSG(DISP_ZONE_LINE,(TEXT("CMD: %x, XINCR: %x, YINCR: %x\n"), uCmdRegVal, m_pG2DReg->X_INCR, m_pG2DReg->Y_INCR ));
}
DoCmd(&(m_pG2DReg->CMDR0), uCmdRegVal, G2D_FASTRETURN);
}
/**
* @fn FIMGSE2D::DoCmd(DWORD *CmdRegister, DWORD CmdValue, DWORD CmdType)
* @note Submit the 2D Processing Command
* @note 3 processing return Style is supported
* Asynchornous Return -> Not Recommended for all GDI call, very small transfer or just with DDraw
* Synchornous Wait for interrupt -> Recommended for most case, Big Transfer
* Synchrnous polling -> Recommended for very short process time, ex) LineDrawing, under tick(1 millisecond)
*/
BOOL FIMGSE2D::DoCmd(volatile UINT32 *CmdReg, DWORD CmdValue, G2D_CMDPROCESSING_TYPE eCmdType)
{
DWORD bRetVal = 0;
switch(eCmdType)
{
case G2D_FASTRETURN:
DispPerfBeginWait();
WaitForEmptyFifo(); //< This is check fully empty command fifo.
DispPerfEndWait();
*CmdReg = CmdValue;
break;
case G2D_INTERRUPT:
RequestEmptyFifo(1);
IntEnable();
*CmdReg = CmdValue;
DispPerfBeginWait();
bRetVal = WaitForSingleObject(m_hInterrupt2D, 10000L); //< Set Timeout as 10seconds.
DispPerfEndWait();
if(bRetVal == WAIT_TIMEOUT)
{
RETAILMSG(DISP_ZONE_ERROR, (TEXT("2D Command take too long time. This command cannot be processed properly\r\n")));
}
IntDisable();
IntPendingClear();
InterruptDone(m_dwSysIntr2D);
break;
case G2D_BUSYWAITING:
RequestEmptyFifo(1);
IntDisable();
*CmdReg = CmdValue;
DispPerfBeginWait();
// while(!WaitForFinish());
WaitForIdleStatus(); // Polling Style
DispPerfEndWait();
// IntDisable();
break;
default:
RETAILMSG(DISP_ZONE_ERROR,(TEXT("CMDPROCESSING TYPE is invalid : %d\n"), eCmdType));
return FALSE;
}
return TRUE;
}
/**
* @fn FIMGSE2D::SetRopEtype(G2D_ROP_TYPE eRopType)
* @note Set Ternary Raster Operation
* @note Only support 7 raster operation (most used Rop)
*/
void FIMGSE2D::SetRopEtype(G2D_ROP_TYPE eRopType)
{
DWORD uRopVal;
uRopVal =
(eRopType == ROP_SRC_ONLY) ? G2D_ROP_SRC_ONLY :
(eRopType == ROP_DST_ONLY) ? G2D_ROP_DST_ONLY :
(eRopType == ROP_PAT_ONLY) ? G2D_ROP_PAT_ONLY :
(eRopType == ROP_SRC_AND_DST) ? G2D_ROP_SRC_AND_DST:
(eRopType == ROP_SRC_AND_PAT) ? G2D_ROP_SRC_AND_PAT :
(eRopType == ROP_DST_AND_PAT) ? G2D_ROP_DST_AND_PAT :
(eRopType == ROP_SRC_OR_DST) ? G2D_ROP_SRC_OR_DST :
(eRopType == ROP_SRC_OR_PAT) ? G2D_ROP_SRC_OR_PAT :
(eRopType == ROP_DST_OR_PAT) ? G2D_ROP_DST_OR_PAT :
(eRopType == ROP_SRC_XOR_DST) ? G2D_ROP_SRC_XOR_DST :
(eRopType == ROP_SRC_XOR_PAT) ? G2D_ROP_SRC_XOR_PAT :
(eRopType == ROP_DST_XOR_PAT) ? G2D_ROP_DST_XOR_PAT :
G2D_ROP_SRC_ONLY;
SetRopValue(uRopVal);
}
void FIMGSE2D::SetStencilKey(DWORD uIsColorKeyOn, DWORD uIsInverseOn, DWORD uIsSwapOn)
{
RequestEmptyFifo(1);
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)
{
RequestEmptyFifo(2);
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::SetColorExpansionMethod(bool bIsScr2Scr)
{
m_bIsScr2Scr = bIsScr2Scr;
}
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, EGPEFormat eBpp, bool bSwap, DWORD *uConvertedData)
{
DWORD uRed, uGreen, uBlue;
switch(eBpp) {
case gpe8Bpp: // 15 bit color mode(ARGB:1555)
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 gpe16Bpp : // 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 gpe32Bpp : // 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 :
RETAILMSG(DISP_ZONE_ERROR, (TEXT("Invalid Rotation Type : %d"), uRType));
break;
}
}
BOOL FIMGSE2D::InitializeInterrupt(void)
{
DWORD dwIRQ;
dwIRQ = IRQ_2D; // 2D Accelerator IRQ
m_dwSysIntr2D = SYSINTR_UNDEFINED;
m_hInterrupt2D = NULL;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwIRQ, sizeof(DWORD), &m_dwSysIntr2D, sizeof(DWORD), NULL))
{
m_dwSysIntr2D = SYSINTR_UNDEFINED;
return FALSE;
}
RETAILMSG(DISP_ZONE_INIT, (TEXT("2D Sysintr : %d\r\n"),m_dwSysIntr2D));
m_hInterrupt2D = CreateEvent(NULL, FALSE, FALSE, NULL);
if(NULL == m_hInterrupt2D)
{
return FALSE;
}
if (!(InterruptInitialize(m_dwSysIntr2D, m_hInterrupt2D, 0, 0)))
{
return FALSE;
}
return TRUE;
}
void FIMGSE2D::DeinitInterrupt(void)
{
if (m_dwSysIntr2D != SYSINTR_UNDEFINED)
{
InterruptDisable(m_dwSysIntr2D);
}
if (m_hInterrupt2D != NULL)
{
CloseHandle(m_hInterrupt2D);
}
if (m_dwSysIntr2D != SYSINTR_UNDEFINED)
{
KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR, &m_dwSysIntr2D, sizeof(DWORD), NULL, 0, NULL);
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?