ddoverlay.cpp

来自「6410BSP3」· C++ 代码 · 共 936 行 · 第 1/3 页

CPP
936
字号
    if (m_OverlayCtxt.uiDstWidth+m_OverlayCtxt.uiDstOffsetX > (unsigned int)m_dwDeviceScreenWidth)
    {
        //m_OverlayCtxt.uiDstWidth = m_dwDeviceScreenWidth - m_OverlayCtxt.uiDstOffsetX;    // Adjust Width
        m_OverlayCtxt.uiDstOffsetX = m_dwDeviceScreenWidth - m_OverlayCtxt.uiDstWidth;        // Adjust Offset
    }

    if (m_OverlayCtxt.uiDstHeight+m_OverlayCtxt.uiDstOffsetY  > (unsigned int)m_dwDeviceScreenHeight)
    {
        //m_OverlayCtxt.uiDstHeight = m_dwDeviceScreenHeight - m_OverlayCtxt.uiDstOffsetY;    // Adjust Height
        m_OverlayCtxt.uiDstOffsetY  = m_dwDeviceScreenHeight - m_OverlayCtxt.uiDstHeight;    // Adjust Offset
    }

    // Update TV DMA Context
    if (m_eTVDMAMode == TV_DMA_OVERLAY)
    {
        DevUpdateTVDMAContext();
    }

    DevOverlayInitialize();

CleanUp:

    LeaveCriticalSection(&m_csDevice);

    return bRet;
}


void
S3C6410Disp::OverlaySetPosition(UINT32 uiOffsetX, UINT32 uiOffsetY)
{
    RETAILMSG(DISP_ZONE_ENTER, (_T("OverlaySetPosition(%d,%d)\n\r"), uiOffsetX, uiOffsetY));

    EnterCriticalSection(&m_csDevice);

    switch(m_iRotate)
    {
    case DMDO_0:
    default:
        m_OverlayCtxt.uiDstOffsetX = uiOffsetX;
        m_OverlayCtxt.uiDstOffsetY = uiOffsetY;
        break;
    case DMDO_90:
        m_OverlayCtxt.uiDstOffsetX = uiOffsetY;
        m_OverlayCtxt.uiDstOffsetY = m_pPrimarySurface->ScreenHeight()
                                        - m_OverlayCtxt.uiDstHeight - uiOffsetX;
        break;
    case DMDO_180:
        m_OverlayCtxt.uiDstOffsetX = m_pPrimarySurface->ScreenWidth()
                                        - m_OverlayCtxt.uiDstWidth - uiOffsetX;
        m_OverlayCtxt.uiDstOffsetY = m_pPrimarySurface->ScreenHeight()
                                        - m_OverlayCtxt.uiDstHeight - uiOffsetY;
        break;
    case DMDO_270:
        m_OverlayCtxt.uiDstOffsetX = m_pPrimarySurface->ScreenWidth()
                                        - m_OverlayCtxt.uiDstWidth - uiOffsetY;
        m_OverlayCtxt.uiDstOffsetY = uiOffsetX;
        break;
    }

    // Adjust for Post Processor and FIMD restriction
    if (m_OverlayCtxt.pSurface->PixelFormat() == ddgpePixelFormat_565)
    {
        m_OverlayCtxt.uiDstOffsetX = m_OverlayCtxt.uiDstOffsetX-m_OverlayCtxt.uiDstOffsetX%2;
    }

    // Adjust for Overlay Window Position
    if (m_OverlayCtxt.uiDstWidth+m_OverlayCtxt.uiDstOffsetX > (unsigned int)m_dwDeviceScreenWidth)
    {
        //m_OverlayCtxt.uiDstWidth = m_dwDeviceScreenWidth - m_OverlayCtxt.uiDstOffsetX;    // Adjust Width
        m_OverlayCtxt.uiDstOffsetX = m_dwDeviceScreenWidth - m_OverlayCtxt.uiDstWidth;        // Adjust Offset
    }

    if (m_OverlayCtxt.uiDstHeight+m_OverlayCtxt.uiDstOffsetY  > (unsigned int)m_dwDeviceScreenHeight)
    {
        //m_OverlayCtxt.uiDstHeight = m_dwDeviceScreenHeight - m_OverlayCtxt.uiDstOffsetY;    // Adjust Height
        m_OverlayCtxt.uiDstOffsetY  = m_dwDeviceScreenHeight - m_OverlayCtxt.uiDstHeight;    // Adjust Offset
    }

    DevOverlaySetPosition();

    LeaveCriticalSection(&m_csDevice);
}


void
S3C6410Disp::OverlayEnable(void)
{
    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] %s()\n\r"), _T(__FUNCTION__)));

    EnterCriticalSection(&m_csDevice);

    m_OverlayCtxt.bShow = TRUE;

    DevOverlayEnable();

    if (m_eTVDMAMode == TV_DMA_OVERLAY)
    {
        DevOutputEnableTVDMA();
    }

    LeaveCriticalSection(&m_csDevice);
}


void
S3C6410Disp::OverlayDisable(void)
{
    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] %s()\n\r"), _T(__FUNCTION__)));

    m_OverlayCtxt.pSurface = NULL;
    m_OverlayCtxt.pPrevSurface = NULL;

    m_OverlayCtxt.bShow = FALSE;

    EnterCriticalSection(&m_csDevice);

    DevOverlayDisable();

    // Update TV DMA Context
    if (m_eTVDMAMode == TV_DMA_OVERLAY)
    {
        DevOutputDisableTVDMA();
    }

    LeaveCriticalSection(&m_csDevice);

    // Release H/W Resource for Overlay to Video Engine Driver
    OverlayReleaseResource(m_OverlayCtxt.bLocalPath);
}


void
S3C6410Disp::OverlayBlendDisable()
{
    m_OverlayCtxt.bBlendOn = FALSE;
    DevOverlayBlendDisable();
}


void
S3C6410Disp::OverlaySetColorKey(BOOL bSrcCKey, EDDGPEPixelFormat Format, DWORD ColorKey)
{
    m_OverlayCtxt.bBlendOn = TRUE;
    m_OverlayCtxt.bColorKey = TRUE;
    m_OverlayCtxt.bSrcCKey = bSrcCKey;

    if (Format == ddgpePixelFormat_565)    // RGB565
    {
        m_OverlayCtxt.ColorKey =
                    (((ColorKey&0xF800)>>11)<<19) |    // R bit
                    (((ColorKey&0x07E0)>>5)<<10) |    // G bit
                    ((ColorKey&0x001F)<<3);            // B bit
        m_OverlayCtxt.CompareKey = 0x00070307;
    }
    else    // if (Format == ddgpePixelFormat_8888)    // RGB888
    {
        m_OverlayCtxt.ColorKey = ColorKey;
        m_OverlayCtxt.CompareKey = 0x00000000;
    }

    DevOverlaySetColorKey();
}

void
S3C6410Disp::OverlaySetAlpha(BOOL bUsePixelBlend, DWORD Alpha)
{
    m_OverlayCtxt.bBlendOn = TRUE;
    m_OverlayCtxt.bColorKey = FALSE;
    m_OverlayCtxt.bUsePixelBlend = bUsePixelBlend;
    m_OverlayCtxt.Alpha = Alpha;

    DevOverlaySetAlpha();
}


void
S3C6410Disp::InitalizeOverlayContext(void)
{
    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++InitalizeOverlayContext()\n\r")));

    m_OverlayCtxt.pSurface = NULL;            // Current Overlay Surface
    m_OverlayCtxt.pPrevSurface = NULL;

    m_OverlayCtxt.bLocalPath = FALSE;
    m_OverlayCtxt.uiSrcWidth = 0;
    m_OverlayCtxt.uiSrcHeight = 0;
    m_OverlayCtxt.uiSrcOffsetX = 0;
    m_OverlayCtxt.uiSrcOffsetY = 0;
    m_OverlayCtxt.uiDstWidth = 0;
    m_OverlayCtxt.uiDstHeight = 0;
    m_OverlayCtxt.uiDstOffsetX = 0;
    m_OverlayCtxt.uiDstOffsetY = 0;
    m_OverlayCtxt.bEnabled = FALSE;
    m_OverlayCtxt.bShow = FALSE;

    m_OverlayCtxt.bBlendOn = FALSE;
    m_OverlayCtxt.bColorKey = 0x0;
    m_OverlayCtxt.bSrcCKey = FALSE;
    m_OverlayCtxt.CompareKey = 0x0;
    m_OverlayCtxt.ColorKey = 0x0;
    m_OverlayCtxt.bUsePixelBlend = FALSE;
    m_OverlayCtxt.Alpha = 0x0;

    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] --InitalizeOverlayContext()\n\r")));
}


S3C6410Surf*
S3C6410Disp::GetCurrentOverlaySurf(void)
{
    return m_OverlayCtxt.pSurface;
}


S3C6410Surf*
S3C6410Disp::GetPreviousOverlaySurf(void)
{
    return m_OverlayCtxt.pPrevSurface;
}

void
S3C6410Disp::DevSetVisibleSurface(S3C6410Surf *pSurf, BOOL bWaitForVBlank)
{
    unsigned int uiBuffer;
    BOOL bRetry = TRUE;
    DWORD dwBytes;

    if (!pSurf)
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] %s() : pSurf is NULL\r\n"),_T(__FUNCTION__)));
        return;
    }

    if (pSurf->IsOverlay() == TRUE)
    {
        if (m_OverlayCtxt.bLocalPath)
        {
            SVEARG_POST_BUFFER tParam;

            tParam.dwBufferRGBY = m_OverlayCtxt.pSurface->OffsetInVideoMemory() + m_VideoMemoryPhysicalBase;
            tParam.dwBufferCb = tParam.dwBufferRGBY+m_OverlayCtxt.pSurface->m_uiOffsetCb;
            tParam.dwBufferCr = tParam.dwBufferRGBY+m_OverlayCtxt.pSurface->m_uiOffsetCr;
            tParam.bWaitForVSync = bWaitForVBlank;

            if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_POST_SET_NEXT_SOURCE_BUFFER, &tParam, sizeof(SVEARG_POST_BUFFER), NULL, 0, &dwBytes, NULL) )
            {
                RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevOverlayInitialize() : IOCTL_SVE_POST_SET_NEXT_SOURCE_BUFFER Failed\n\r")));
            }
        }
        else
        {
            SVEARG_FIMD_WIN_FRAMEBUFFER tParam;

            // Change Frame Buffer
            tParam.dwWinNum = OVERLAY_WINDOW;
            tParam.dwFrameBuffer = pSurf->OffsetInVideoMemory() + m_VideoMemoryPhysicalBase;
            tParam.bWaitForVSync = bWaitForVBlank;
            if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_FRAMEBUFFER, &tParam, sizeof(SVEARG_FIMD_WIN_FRAMEBUFFER), NULL, 0, &dwBytes, NULL) )
            {
                RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] %s() : IOCTL_SVE_FIMD_SET_WINDOW_FRAMEBUFFER Failed\n\r"), _T(__FUNCTION__)));
            }
        }

        //---------------
        // For TV Out DMA
        //---------------
        if (m_eTVDMAMode == TV_DMA_OVERLAY)
        {
            uiBuffer = (unsigned int)(pSurf->OffsetInVideoMemory() + m_VideoMemoryPhysicalBase);
            DevSetTVDMABuffer(uiBuffer, uiBuffer+pSurf->m_uiOffsetCb, uiBuffer+pSurf->m_uiOffsetCr, bWaitForVBlank);
        }
    }
    else
    {
        SVEARG_FIMD_WIN_FRAMEBUFFER tParam;

        // Change Frame Buffer
        tParam.dwWinNum = PRIMARY_WINDOW;
        tParam.dwFrameBuffer = pSurf->OffsetInVideoMemory() + m_VideoMemoryPhysicalBase;
        tParam.bWaitForVSync = bWaitForVBlank;
        if ( !DeviceIoControl(m_hVideoDrv, IOCTL_SVE_FIMD_SET_WINDOW_FRAMEBUFFER, &tParam, sizeof(SVEARG_FIMD_WIN_FRAMEBUFFER), NULL, 0, &dwBytes, NULL) )
        {
            RETAILMSG(DISP_ZONE_ERROR, (_T("[DISPDRV:ERR] DevSetVisibleSurface() : IOCTL_SVE_FIMD_SET_WINDOW_FRAMEBUFFER Failed\n\r")));
        }

        //---------------
        // For TV Out DMA
        //---------------
        if (m_eTVDMAMode == TV_DMA_PRIMARY)
        {
            uiBuffer = (unsigned int)(pSurf->OffsetInVideoMemory() + m_VideoMemoryPhysicalBase);
            DevSetTVDMABuffer(uiBuffer, uiBuffer+pSurf->m_uiOffsetCb, uiBuffer+pSurf->m_uiOffsetCr, bWaitForVBlank);
        }
    }
}


void
S3C6410Disp::DevOverlayInitialize(void)
{
    RETAILMSG(DISP_ZONE_ENTER, (_T("[DISPDRV] ++DevOverlayInitialize()\n\r")));

    DWORD dwBytes;

    // Display Overlay Window
    if (m_OverlayCtxt.bEnabled)
    {
        RETAILMSG(DISP_ZONE_TEMP, (_T("[DDHAL] DevOverlayInitialize() : Disable Overlay\n\r")));
        DevOverlayDisable();
    }

⌨️ 快捷键说明

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