⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 psl_screen_layout.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
    strcat(pButtonDrawInfo->cText, " : ");

    /* convert second string */
    ulSetting   = ulSetting % 60;
    cTmp[0] = (char)((ulSetting / 10) + '0');
    cTmp[1] = (char)((ulSetting % 10) + '0');
    cTmp[2] = '\0';

    /* add second to time setting string */
    strcat(pButtonDrawInfo->cText, cTmp);
 
    /* draw status display buttons */
    for (i = 0; i < pPSL->pStatusDisplay->pusNumButtons[pPSL->pStatusDisplay->usCurrentDisplay]; i++)
    {
        if (PslScreenLayoutDrawButton(&pPSL->pStatusDisplay->pButton[pPSL->pStatusDisplay->usCurrentDisplay][i]) != PSL_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawStatusDisplay() -- failure drawing button\n"));
            return (PSL_FAILURE);
        }
    }

    /* copy draw buffer to display buffer */
    DealCMBufferCopy(pPSL->pStatusDisplay->hDeal, DEAL_BUFFER_DRAW, DEAL_BUFFER_DISPLAY);

    if (PslScreenLayoutIsStatusDisplayActive(pPSL) == FALSE)
    {   
        /* Set timer to repeat every 1/4 second */
        if (OS_TimerSetRepeatMsec(pPSL->pStatusDisplay->Timer, 250) != OS_OK)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawStatusDisplay -- Timer set FAILED\n"));
            return (PSL_FAILURE);
        }
                  
        /* If icon is not already active, draw the icon */
        if (PslScreenLayoutIsIconActive(pPSL) == FALSE)
        {
            ULONG ulNavState = PslExternalGetNavStatus();

            /* get appropriate icon based on navigator state */
            switch (ulNavState)
            {
            case PSL_STATUS_PAUSE:
                pPSL->pIconData->pActiveIcon = PslBitmapGetPauseIcon();
                break;
            case PSL_STATUS_STOP:
                pPSL->pIconData->pActiveIcon = PslBitmapGetStopIcon();
                break;
            case PSL_STATUS_PLAY:
                pPSL->pIconData->pActiveIcon = PslBitmapGetPlayIcon();
                break;
            case PSL_STATUS_SLOW_FWD:
                pPSL->pIconData->pActiveIcon = PslBitmapGetSlowFIcon();
                break;
            case PSL_STATUS_FAST_FWD:
                pPSL->pIconData->pActiveIcon = PslBitmapGetFFIcon();
                break;
            case PSL_STATUS_FAST_RWD:
                pPSL->pIconData->pActiveIcon = PslBitmapGetFRIcon();
                break;
            default:
                DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawStatusDisplay() -- invalid play state\n"));
                return (PSL_FAILURE);
                break;
            }

            /* draw the icon */
            if (PslScreenLayoutDrawIcon(pPSL, pPSL->pIconData->pActiveIcon) != PSL_SUCCESS)
            {
                DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawStatusDisplay: Failed to draw icon!\n"));
                return (PSL_FAILURE);
            }
        }
        else if (pPSL->pIconData->pActiveIcon != PslBitmapGetProhibitedIcon() )
        {
            /* stop the icon timer */
            if (OS_TimerStop(pPSL->pIconData->Timer) != OS_OK)
            {
                DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawStatusDisplay -- Timer stop FAILED\n"));
                return (PSL_FAILURE);
            }
        }

        /* show the display surface */
        DealCMShow(pPSL->pStatusDisplay->hDeal);

        /* set the status display active bit */
        pPSL->ulActiveInterface |= PSL_INTERFACE_TIMEDISPLAY;
    }

    return (PSL_SUCCESS);
}

/**
 * PslScreenLayoutClearStatusDisplay -- Clear the status display
 *
 * @param
 *      pPSL    - handle to internal PSL data
 *
 * @retval
 *    PSL_SUCCESS if successful
 *    PSL_FAILURE if not successful
 */
PSL_STATUS  PslScreenLayoutClearStatusDisplay(PSL_HANDLE *pPSL)
{
    if ( (pPSL == NULL) || (pPSL->pStatusDisplay == NULL) )
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutClearStatusDisplay() -- NULL pointer!\n"));
        return (PSL_FAILURE);
    }

    if (PslScreenLayoutIsStatusDisplayActive(pPSL) == TRUE)
    {   
        /* hide the display surface */
        DealCMHide(pPSL->pStatusDisplay->hDeal);

        /* clear the icon */
        if (PslScreenLayoutClearIcon(pPSL, pPSL->pIconData->pActiveIcon) != PSL_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutClearStatusDisplay -- Failure clearing icon!\n"));
            return (PSL_FAILURE);
        }
        
        /* clear the display surface */
        if (DealCMBufferClean(pPSL->pStatusDisplay->hDeal, DEAL_BUFFER_BOTH) != DEAL_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutClearStatusDisplay -- Failure clearing buffer\n"));
            return (PSL_FAILURE);
        }

        /* Stop timer */
        if (OS_TimerStop(pPSL->pStatusDisplay->Timer) != OS_OK)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutClearStatusDisplay -- Timer stop FAILED\n"));
            return (PSL_FAILURE);
        }
                  
        /* clear the status display active bit */
        pPSL->ulActiveInterface &= ~PSL_INTERFACE_TIMEDISPLAY;
    }
        
    return (PSL_SUCCESS);
}

/**
 * PslScreenLayoutDrawCDDAInterface -- Draw the CDDA display
 *
 * @param
 *      pPSL    - handle to internal PSL data
 *
 * @retval
 *    PSL_SUCCESS if successful
 *    PSL_FAILURE if not successful
 */
PSL_STATUS  PslScreenLayoutDrawCDDAInterface(PSL_HANDLE *pPSL)
{
    PSL_BUTTON_DRAW_INFO    *pButtonDrawInfo = NULL;
    USHORT                  i;

    if (pPSL == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawCDDAInterface() -- NULL psl handle!\n"));
        return (PSL_NULL_POINTER);
    }

    if (pPSL->pCddaGui == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawCDDAInterface() -- cdda interface not created\n"));
        return (PSL_FAILURE);
    }

    /* Set initial display */
    pPSL->pCddaGui->usCurrentDisplay = 0;

    /* Get the title setting button draw info */
    pButtonDrawInfo = (PSL_BUTTON_DRAW_INFO *)pPSL->pCddaGui->pButton[0][1].pvButtonDrawInfo;

    /* Get cd track number */
    pPSL->pCddaGui->StatusInfo.usChapter = (USHORT)(PslExternalGetCurrentChapter());

    /* Conver track number to a string */
    if (pPSL->pCddaGui->StatusInfo.usChapter < 10)
    {
        pButtonDrawInfo->cText[0] = pPSL->pCddaGui->StatusInfo.usChapter + '0';
        pButtonDrawInfo->cText[1] = '\0';
    }
    else
    {
        pButtonDrawInfo->cText[0] = (pPSL->pCddaGui->StatusInfo.usChapter / 10) + '0';
        pButtonDrawInfo->cText[1] = (pPSL->pCddaGui->StatusInfo.usChapter % 10) + '0';
        pButtonDrawInfo->cText[2] = '\0';
    }

    /* draw cdda interface buttons */
    for (i = 0; i < pPSL->pCddaGui->pusNumButtons[pPSL->pCddaGui->usCurrentDisplay]; i++)
    {
        if (PslScreenLayoutDrawButton(&pPSL->pCddaGui->pButton[pPSL->pCddaGui->usCurrentDisplay][i]) != PSL_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawCDDAInterface() -- failure drawing button\n"));
            return (PSL_FAILURE);
        }
    }

    /* copy draw buffer to display buffer */
    DealCMBufferCopy(pPSL->pCddaGui->hDeal, DEAL_BUFFER_DRAW, DEAL_BUFFER_DISPLAY);

    if (PslScreenLayoutIsCDDAActive(pPSL) == FALSE)
    {   
        /* Set timer to repeat every second */
        if (OS_TimerSetRepeatMsec(pPSL->pCddaGui->Timer, 1000) != OS_OK)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawCDDAInterface -- Timer set FAILED\n"));
            return (PSL_FAILURE);
        }
                  
        /* If icon is not already active, draw the icon */
        if (PslScreenLayoutIsIconActive(pPSL) == FALSE)
        {
            /*
             * Initialize gui to display stop state.
             */
                       
            /* Get the stop icon */    
            pPSL->pIconData->pActiveIcon = PslBitmapGetStopIcon();

            /* draw the icon */
            if (PslScreenLayoutDrawIcon(pPSL, pPSL->pIconData->pActiveIcon) != PSL_SUCCESS)
            {
                DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawCDDAInterface: Failed to draw icon!\n"));
                return (PSL_FAILURE);
            }
        }
        else
        {
            /* stop the icon timer */
            if (OS_TimerStop(pPSL->pIconData->Timer) != OS_OK)
            {
                DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawCDDAInterface -- Timer stop FAILED\n"));
                return (PSL_FAILURE);
            }
        }

        /* show the cdda gui surface */
        DealCMShow(pPSL->pCddaGui->hDeal);

        /* set the cdda gui active bit */
        pPSL->ulActiveInterface |= PSL_INTERFACE_CDDA;
    }

    return (PSL_SUCCESS);
}

/**
 * PslScreenLayoutClearCDDAInterface -- Clear the CDDA display
 *
 * @param
 *      pPSL    - handle to internal PSL data
 *
 * @retval
 *    PSL_SUCCESS if successful
 *    PSL_FAILURE if not successful
 */
PSL_STATUS  PslScreenLayoutClearCDDAInterface(PSL_HANDLE *pPSL)
{
    if ( (pPSL == NULL) || (pPSL->pStatusDisplay == NULL) )
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutClearCDDAInterface() -- NULL pointer!\n"));
        return (PSL_FAILURE);
    }

    if (PslScreenLayoutIsCDDAActive(pPSL) == TRUE)
    {   
        /* hide the cdda gui surface */
        DealCMHide(pPSL->pCddaGui->hDeal);

        /* Stop timer */
        if (OS_TimerStop(pPSL->pCddaGui->Timer) != OS_OK)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutClearCDDAInterface -- Timer stop FAILED\n"));
            return (PSL_FAILURE);
        }
                  
        /* clear the icon */
        if (PslScreenLayoutClearIcon(pPSL, pPSL->pIconData->pActiveIcon) != PSL_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutClearCDDAInterface -- Failure clearing icon!\n"));
            return (PSL_FAILURE);
        }
        
        /* clear the cdda gui surface */
        if (DealCMBufferClean(pPSL->pCddaGui->hDeal, DEAL_BUFFER_BOTH) != DEAL_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutClearCDDAInterface -- Failure clearing buffer\n"));
            return (PSL_FAILURE);
        }

        /* clear the cdda gui active bit */
        pPSL->ulActiveInterface &= ~PSL_INTERFACE_CDDA;
    }
        
    return (PSL_SUCCESS);
}

/**
 * PslScreenLayoutDrawGeneric -- Draw the generic osd graphics plane
 *
 * @param
 *      pPSL            - handle to internal PSL data
 *      ulStatusEvent   - status event to draw message for
 *      ulData          - data associated with status event
 *
 * @retval
 *    PSL_SUCCESS if successful
 *    PSL_FAILURE if not successful
 */
PSL_STATUS  PslScreenLayoutDrawGeneric(PSL_HANDLE *pPSL, ULONG ulStatusEvent, ULONG ulData)
{
    DEAL_FDRAW_STRUCT   text        = {67, 133, 3, 15, DEAL_BUFFER_DRAW, (DEAL_FONT *)&tLARGEFONT};
    DEAL_RDRAW_STRUCT   rect        = {65, 130, 0, 0, 15, DEAL_BUFFER_DRAW, 0};
    ULONG               ulWidth     = 0;
    BOOLEAN             fDisplay    = TRUE;

    if (pPSL == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawGeneric: NULL psl handle!\n"));
        return (PSL_NULL_POINTER);
    }

    /* If generic osd is active, clear it before drawing new message */
    if (PslScreenLayoutIsGenericActive(pPSL) == TRUE)
    {
        if (DealCMBufferClean(pPSL->hDeal, DEAL_BUFFER_DRAW) != DEAL_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawGeneric: failed to clean draw buffer!\n"));
            return (PSL_FAILURE);
        }
    }

    switch (ulStatusEvent)
    {
    case PSL_STATUS_STOP:
        /* Get string width to determine how wide to draw the background rectangle */
        if (DealDMStringWidthGet(pPSL->hDeal, "To start from the beginning, press", 
                                 (DEAL_FONT *)&tLARGEFONT, &ulWidth) != DEAL_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawGeneric: failed to get string width!\n"));
            return (PSL_FAILURE);
        }
    
        /* Set background rectangle dimensions */
        rect.usWidth    = (USHORT)(ulWidth + 4);
        rect.usHeight   = 91;

⌨️ 快捷键说明

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