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

📄 psl_screen_layout.cpp

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

        /* Unselect all buttons */
        for (i = 0; i < pPSL->pSetupMenu->usNumberOfTabs; i++)
        {
            pPSL->pSetupMenu->pTab[i].fSelected = FALSE;

            for (j = 0; j < pPSL->pSetupMenu->pTab[i].usNumSubButtons; j++)
            {
                pPSL->pSetupMenu->pTab[i].pSubButton[j].fSelected = FALSE;

                for (k = 0; k < pPSL->pSetupMenu->pTab[i].pSubButton[j].usNumSubButtons; k++)
                {
                    pPSL->pSetupMenu->pTab[i].pSubButton[j].pSubButton[k].fSelected = FALSE;
                }
            }
        }

        /* Set the new active tab and select it */
        pPSL->pSetupMenu->pActiveTab            = &pPSL->pSetupMenu->pTab[0];
        pPSL->pSetupMenu->pActiveTab->fSelected = TRUE;

        /* Set the new active button and select it */
        pPSL->pSetupMenu->pActiveButton             = &pPSL->pSetupMenu->pTab[0].pSubButton[1];
        pPSL->pSetupMenu->pActiveButton->fSelected  = TRUE;
    }

    /* set rectangle dimensions for menu border */
    rect.usStartX       = 0;
    rect.usStartY       = 0;
    rect.usWidth        = 540;
    rect.usHeight       = 255;
    rect.tBuffer        = DEAL_BUFFER_DRAW;
    rect.usThickness    = 2;
    rect.ulColor        = 4;

    /* draw the border */
    if (DealDMDrawUnFilledRectangle(pPSL->pSetupMenu->hDeal, &rect) != DEAL_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawSetupMenu() -- failure drawing border\n"));
        return (PSL_FAILURE);
    }

    /* draw menu tabs */
    for (i = 0; i < pPSL->pSetupMenu->usNumberOfTabs; i++)
    {
        if (PslScreenLayoutDrawButton(&pPSL->pSetupMenu->pTab[i]) != PSL_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawSetupMenu() -- failure drawing button\n"));
            return (PSL_FAILURE);
        }
    }

    /* draw main menu buttons in active menu tab */
    for (i = 0; i < pPSL->pSetupMenu->pActiveTab->usNumSubButtons; i++)
    {
        if (PslScreenLayoutDrawButton(&pPSL->pSetupMenu->pActiveTab->pSubButton[i]) != PSL_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawSetupMenu() -- failure drawing button\n"));
            return (PSL_FAILURE);
        }
    }

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

    if (PslScreenLayoutIsSetupMenuActive(pPSL) == FALSE)
    {   
        /* show the menu surface */
        DealCMShow(pPSL->pSetupMenu->hDeal);

        /* set the setup menu active bit */
        pPSL->ulActiveInterface |= PSL_INTERFACE_SETUP;
    }

    return (PSL_SUCCESS);
}

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

    if (PslScreenLayoutIsSetupMenuActive(pPSL) == TRUE)
    {   
        /* hide the menu surface */
        DealCMHide(pPSL->pSetupMenu->hDeal);
    
        /* clear the menu surface */
        if (DealCMBufferClean(pPSL->pSetupMenu->hDeal, DEAL_BUFFER_BOTH) != DEAL_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutClearSetupMenu -- Failure clearing buffer\n"));
            return (PSL_FAILURE);
        }

        /* clear the setup menu active bit */
        pPSL->ulActiveInterface &= ~PSL_INTERFACE_SETUP;
    }
        
    return (PSL_SUCCESS);
}

/**
 * PslScreenLayoutDrawStatusMenu -- Draw the status menu
 *
 * @param
 *      pPSL    - handle to internal PSL data
 *
 * @retval
 *    PSL_SUCCESS if successful
 *    PSL_FAILURE if not successful
 */
PSL_STATUS  PslScreenLayoutDrawStatusMenu(PSL_HANDLE *pPSL)
{
    USHORT  i;
    USHORT  usButtonIndex;

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

    /* check for valid status menu data */
    if (pPSL->pStatusMenu == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawStatusMenu -- status menu not created\n"));
        return (PSL_FAILURE);
    }

    /* determine which buttons need drawn, according to the current status menu mode */
    switch (pPSL->pStatusMenu->tCurrentMode)
    {
    case PSL_STATUS_MODE_SUBTITLE:
        usButtonIndex = 0;
        break;
    case PSL_STATUS_MODE_REPEAT:
        usButtonIndex = 1;
        break;
    case PSL_STATUS_MODE_AUDIO:
        usButtonIndex = 2;
        break;
    case PSL_STATUS_MODE_ANGLE:
        usButtonIndex = 3;
        break;
    case PSL_STATUS_MODE_SEARCH_TITLE:
        usButtonIndex = 4;
        break;
    case PSL_STATUS_MODE_SEARCH_CHAPTER:
    case PSL_STATUS_MODE_CHAPTER_SKIP:
        usButtonIndex = 5;
        break;
    case PSL_STATUS_MODE_SEARCH_TIME_HOUR:
    case PSL_STATUS_MODE_SEARCH_TIME_MIN:
    case PSL_STATUS_MODE_SEARCH_TIME_SEC:
        usButtonIndex = 6;
        break;
    default:
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawStatusMenu() -- unknown status mode\n"));
        return (PSL_FAILURE);
        break;
    }

    /* clear the status menu surface */
    if (DealCMBufferClean(pPSL->pStatusMenu->hDeal, DEAL_BUFFER_DRAW) != DEAL_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawStatusMenu -- Failure clearing buffer\n"));
        return (PSL_FAILURE);
    }

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

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

    if (PslScreenLayoutIsStatusMenuActive(pPSL) == FALSE)
    {   
        /* show the menu surface */
        DealCMShow(pPSL->pStatusMenu->hDeal);

        /* set the status menu active bit */
        pPSL->ulActiveInterface |= PSL_INTERFACE_STATUS;
    }

    return (PSL_SUCCESS);
}

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

    /* check for valid status menu data */
    if (pPSL->pStatusMenu == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutClearStatusMenu -- status menu not created\n"));
        return (PSL_FAILURE);
    }

    if (PslScreenLayoutIsStatusMenuActive(pPSL) == TRUE)
    {   
        /* hide the menu surface */
        DealCMHide(pPSL->pStatusMenu->hDeal);
    
        /* clear the menu surface */
        if (DealCMBufferClean(pPSL->pStatusMenu->hDeal, DEAL_BUFFER_BOTH) != DEAL_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutClearStatusMenu -- Failure clearing buffer\n"));
            return (PSL_FAILURE);
        }

        /* Stop timer */
        if (OS_TimerStop(pPSL->pStatusMenu->Timer) != OS_OK)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutClearStatusMenu -- Timer stop FAILED\n"));
            return (PSL_FAILURE);
        }
                  
        /* clear status menu mode */
        pPSL->pStatusMenu->tCurrentMode = PSL_STATUS_MODE_NONE;

        /* clear the status menu active bit */
        pPSL->ulActiveInterface &= ~PSL_INTERFACE_STATUS;
    }
        
    return (PSL_SUCCESS);
}

/**
 * PslScreenLayoutDrawStatusDisplay -- Draw the status display
 *
 * @param
 *      pPSL    - handle to internal PSL data
 *
 * @retval
 *    PSL_SUCCESS if successful
 *    PSL_FAILURE if not successful
 */
PSL_STATUS  PslScreenLayoutDrawStatusDisplay(PSL_HANDLE *pPSL)
{
    PSL_BUTTON_DRAW_INFO    *pButtonDrawInfo = NULL;
    ULONG                   ulSetting;
    char                    cTmp[5];
    USHORT                  i;

    if ( (pPSL == NULL) || (pPSL->pStatusDisplay == NULL) )
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutDrawStatusDisplay() -- NULL pointer!\n"));
        return (PSL_FAILURE);
    }

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

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

    /* Get title number */
    pPSL->pStatusDisplay->StatusInfo.usTitle = (USHORT)(PslExternalGetCurrentTitle());

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

    /* Get the chapter setting button draw info */
    pButtonDrawInfo = (PSL_BUTTON_DRAW_INFO *)pPSL->pStatusDisplay->pButton[0][3].pvButtonDrawInfo;

    /* Get chapter number */
    pPSL->pStatusDisplay->StatusInfo.usChapter = (USHORT)(PslExternalGetCurrentChapter());

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

    /* Get the time setting button draw info */
    pButtonDrawInfo = (PSL_BUTTON_DRAW_INFO *)pPSL->pStatusDisplay->pButton[0][5].pvButtonDrawInfo;

    /* Get the play time */
    ulSetting = PslExternalGetTime(pPSL->pStatusDisplay->StatusInfo.tTimeMode);
    pPSL->pStatusDisplay->StatusInfo.ulTime = ulSetting;

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

    /* add hour to time setting string */
    strcpy(pButtonDrawInfo->cText, cTmp);
    strcat(pButtonDrawInfo->cText, " : ");

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

    /* add minute to time setting string */
    strcat(pButtonDrawInfo->cText, cTmp);

⌨️ 快捷键说明

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