halsurf.cpp

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

CPP
533
字号

    lpgfsd->ddRVal = DD_OK;

    // NOTE: DDGBS_CANFLIP always return DD_OK
    // Actually second flip request in same display frame is blocked to next frame

    return DDHAL_DRIVER_HANDLED;
}

DWORD WINAPI HalUpdateOverlay(LPDDHAL_UPDATEOVERLAYDATA lpuod)
{
    DEBUGENTER( HalUpdateOverlay );
    /*
    typedef struct _DDHAL_UPDATEOVERLAYDATA {
          LPDDRAWI_DIRECTDRAW_GBL lpDD;
          LPDDRAWI_DDRAWSURFACE_LCL lpDDDestSurface;
          RECT rDest;
          LPDDRAWI_DDRAWSURFACE_LCL lpDDSrcSurface;
          RECT rSrc;
          DWORD dwFlags;
          DDOVERLAYFX overlayFX;
          HRESULT ddRVal;
    } DDHAL_UPDATEOVERLAYDATA;
    */

    S3C6410Disp    *pDDGPE;
    S3C6410Surf    *pSrcSurf;
    S3C6410Surf    *pDestSurf;
    LPDDRAWI_DDRAWSURFACE_LCL lpSrcLCL;
    LPDDRAWI_DDRAWSURFACE_LCL lpDestLCL;

    BOOL bEnableOverlay = FALSE;

    /* 'Source' is the overlay surface, 'destination' is the surface to
    * be overlayed:
    */

    lpSrcLCL = lpuod->lpDDSrcSurface;
    lpDestLCL = lpuod->lpDDDestSurface;

    pDDGPE = (S3C6410Disp *)GetDDGPE();
    pSrcSurf = (S3C6410Surf *)DDGPESurf::GetDDGPESurf(lpSrcLCL);
    pDestSurf = (S3C6410Surf *)DDGPESurf::GetDDGPESurf(lpDestLCL);

    if (lpuod->dwFlags & DDOVER_HIDE)
    {
        // If overlay surface is valid, Turn off overlay
        if (pSrcSurf->OffsetInVideoMemory() != NULL)
        {
            if ( (pSrcSurf == pDDGPE->GetCurrentOverlaySurf())
                || (pSrcSurf == pDDGPE->GetPreviousOverlaySurf()) )
            {
                pDDGPE->OverlayDisable();
            }

            lpuod->ddRVal = DD_OK;
        }
        else
        {
            RETAILMSG(DISP_ZONE_ERROR, (_T("[DDHAL:ERR] HalUpdateOverlay() : pSrcSurf->OffsetInVideoMemory() = NULL\n\r")));
            lpuod->ddRVal = DDERR_INVALIDPARAMS;
        }

        return (DDHAL_DRIVER_HANDLED);
    }
    else if (lpuod->dwFlags & DDOVER_SHOW)
    {
        if (pSrcSurf->OffsetInVideoMemory() != NULL)
        {
            if ( (pSrcSurf != pDDGPE->GetCurrentOverlaySurf())
                && (pSrcSurf != pDDGPE->GetPreviousOverlaySurf())
                && (pDDGPE->GetCurrentOverlaySurf() != NULL))
            {
                // Some other overlay surface is already visible:
                RETAILMSG(DISP_ZONE_ERROR, (_T("[DDHAL:ERR] HalUpdateOverlay() : Overlay is already in use by another surface\n\r")));

                lpuod->ddRVal = DDERR_OUTOFCAPS;

                return (DDHAL_DRIVER_HANDLED);
            }
            else
            {
                // Initialize Overlay
                if (pDDGPE->OverlayInitialize(pSrcSurf, &lpuod->rSrc, &lpuod->rDest) == FALSE)
                {
                    RETAILMSG(DISP_ZONE_ERROR, (_T("[DDHAL:ERR] HalUpdateOverlay() : OverlayInitialize() Failed\n\r")));

                    lpuod->ddRVal = DDERR_OUTOFCAPS;

                    return (DDHAL_DRIVER_HANDLED);
                }

                // Enable Overlay below... after set up blending
                bEnableOverlay = TRUE;
            }
        }
        else
        {
            RETAILMSG(DISP_ZONE_ERROR, (_T("[DDHAL:ERR] HalUpdateOverlay() : pSrcSurf->OffsetInVideoMemory() = NULL\n\r")));

            lpuod->ddRVal = DDERR_INVALIDPARAMS;
            return (DDHAL_DRIVER_HANDLED);
        }
    }
    else
    {
        // If overlay surface is not visiable,  Nothing to do
        lpuod->ddRVal = DD_OK;

        return (DDHAL_DRIVER_HANDLED);
    }

    if ((lpuod->dwFlags & (DDOVER_KEYSRC|DDOVER_KEYSRCOVERRIDE|DDOVER_KEYDEST|DDOVER_KEYDESTOVERRIDE))
        && (lpuod->dwFlags & (DDOVER_ALPHASRC|DDOVER_ALPHACONSTOVERRIDE)))
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DDHAL:ERR] HalUpdateOverlay() : Driver Not Support ColorKey & Alpha at the same time (dwFlags = 0x%08x)\n\r"), lpuod->dwFlags));
    }

    // Source Color Key
    if ((lpuod->dwFlags & (DDOVER_KEYSRCOVERRIDE | DDOVER_KEYSRC))
        ||(lpSrcLCL->dwFlags & DDRAWISURF_HASCKEYSRCOVERLAY)
        )
    {
        DWORD dwColorKey;

        if (lpuod->dwFlags & DDOVER_KEYSRCOVERRIDE)
        {
            dwColorKey = lpuod->overlayFX.dckSrcColorkey.dwColorSpaceLowValue;
        }
        else
        {
            dwColorKey = lpSrcLCL->ddckCKSrcOverlay.dwColorSpaceLowValue;
        }

        pDDGPE->OverlaySetColorKey(TRUE, pSrcSurf->PixelFormat(), dwColorKey);
    }
    // Destination Color Key
    else if ((lpuod->dwFlags & (DDOVER_KEYDESTOVERRIDE | DDOVER_KEYDEST))
        ||(lpSrcLCL->dwFlags & DDRAWISURF_HASCKEYDESTOVERLAY)
        )
    {
        DWORD dwColorKey;

        if (lpuod->dwFlags & DDOVER_KEYDESTOVERRIDE)
        {
            dwColorKey = lpuod->overlayFX.dckDestColorkey.dwColorSpaceLowValue;
        }
        else if(lpuod->dwFlags & DDOVER_KEYDEST)
        {
            dwColorKey = lpDestLCL->ddckCKDestOverlay.dwColorSpaceLowValue;
        }
        else
        {
            dwColorKey = lpSrcLCL->ddckCKDestOverlay.dwColorSpaceLowValue;
        }

        pDDGPE->OverlaySetColorKey(FALSE, pDestSurf->PixelFormat(), dwColorKey);
    }
    // Alpha Blending
    else if ((lpuod->dwFlags & DDOVER_ALPHASRC)
        || (lpuod->dwFlags & DDOVER_ALPHACONSTOVERRIDE))
    {
        if (lpuod->dwFlags & DDOVER_ALPHACONSTOVERRIDE)    // Per Plane Alpha Blending
        {
            pDDGPE->OverlaySetAlpha(FALSE, lpuod->overlayFX.dwAlphaConst);
        }
        else
        {
            pDDGPE->OverlaySetAlpha(TRUE, lpuod->overlayFX.dwAlphaConst);
        }
    }
    // No Blending Effect
    else
    {
        pDDGPE->OverlayBlendDisable();
    }

    // Enable Overlay after set up blending
    if (bEnableOverlay) pDDGPE->OverlayEnable();

    lpuod->ddRVal = DD_OK;

    return (DDHAL_DRIVER_HANDLED);
}

DWORD WINAPI HalSetOverlayPosition(LPDDHAL_SETOVERLAYPOSITIONDATA lpsopd)
{
    DEBUGENTER( HalSetOverlayPosition );
    /*
    typedef struct _DDHAL_SETOVERLAYPOSITIONDATA
    {
        LPDDRAWI_DIRECTDRAW_GBL lpDD;
        LPDDRAWI_DDRAWSURFACE_LCL lpDDSrcSurface;
        LPDDRAWI_DDRAWSURFACE_LCL lpDDDestSurface;
        LONG lXPos;
        LONG lYPos;
        HRESULT ddRVal;
    } DDHAL_SETOVERLAYPOSITIONDATA;
    */

    S3C6410Disp    *pDDGPE;

    pDDGPE = (S3C6410Disp *)GetDDGPE();

    pDDGPE->OverlaySetPosition((unsigned int)lpsopd->lXPos, (unsigned int)lpsopd->lYPos);
    lpsopd->ddRVal = DD_OK;

    return DDHAL_DRIVER_HANDLED;
}

DWORD WINAPI HalSetColorKey(LPDDHAL_SETCOLORKEYDATA lpdsckd)
{
    DEBUGENTER(HalSetColorKey);
    /*
    typedef struct _DDHAL_SETCOLORKEYDATA
    {
        LPDDRAWI_DIRECTDRAW_GBL lpDD;
        LPDDRAWI_DDRAWSURFACE_LCL lpDDSurface;
        DWORD dwFlags;
        DDCOLORKEY ckNew;
        HRESULT ddRVal;
    } DDHAL_SETCOLORKEYDATA;
    */

    DDGPESurf* pSurf = DDGPESurf::GetDDGPESurf(lpdsckd->lpDDSurface);
    if (pSurf != NULL)
    {
        if (lpdsckd->dwFlags == DDCKEY_COLORSPACE)
        {
            RETAILMSG(DISP_ZONE_ERROR, (_T("[DDHAL:ERR] HalSetColorKey() : Color Space CKEY is Not Supported\n\r")));
            lpdsckd->ddRVal = DDERR_NOCOLORKEYHW;
        }
        else if ((lpdsckd->dwFlags == DDCKEY_SRCBLT)
            || (lpdsckd->dwFlags == DDCKEY_DESTBLT))
        {
            // NOTE: Currently our driver do not support HW CKEY BLT but CETK DDraw Test #210, #310 trying to use
            RETAILMSG(DISP_ZONE_ERROR, (_T("[DDHAL:ERR] HalSetColorKey() : Color Space CKEY or CKEY BLT is Not Supported\n\r")));

            pSurf->SetColorKeyLow(lpdsckd->ckNew.dwColorSpaceLowValue);
            pSurf->SetColorKeyHigh(lpdsckd->ckNew.dwColorSpaceHighValue);
            lpdsckd->ddRVal = DD_OK;
        }
        else     if ((lpdsckd->dwFlags == DDCKEY_SRCOVERLAY)
            || (lpdsckd->dwFlags == DDCKEY_DESTOVERLAY))
        {
            pSurf->SetColorKeyLow(lpdsckd->ckNew.dwColorSpaceLowValue);
            pSurf->SetColorKeyHigh(lpdsckd->ckNew.dwColorSpaceHighValue);
            lpdsckd->ddRVal = DD_OK;
        }
        else
        {
            RETAILMSG(DISP_ZONE_ERROR,(_T("[DDHAL:ERR] HalSetColorKey() : Invalid dwFlags = 0x%08x\n\r"), lpdsckd->dwFlags));
            lpdsckd->ddRVal = DDERR_INVALIDOBJECT;
        }
    }
    else
    {
        RETAILMSG(DISP_ZONE_ERROR, (_T("[DDHAL:ERR] HalSetColorKey() : Surface Object is Null\n\r")));
        lpdsckd->ddRVal = DDERR_INVALIDOBJECT;
    }

    DEBUGLEAVE(HalSetColorKey);

    return DDHAL_DRIVER_HANDLED;
}

⌨️ 快捷键说明

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