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

📄 psl_screen_layout.cpp

📁 这是DVD中伺服部分的核心代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*****************************************************************************
******************************************************************************
**                                                                          **
**  Copyright (c) 2002 Videon Central, Inc.                                 **
**  All rights reserved.                                                    **
**                                                                          **
**  The computer program contained herein contains proprietary information  **
**  which is the property of Videon Central, Inc.  The program may be used  **
**  and/or copied only with the written permission of Videon Central, Inc.  **
**  or in accordance with the terms and conditions stipulated in the        **
**  agreement/contract under which the programs have been supplied.         **
**                                                                          **
******************************************************************************
*****************************************************************************/
/**
 * @file psl_screen_layout.cpp
 *
 * $Revision: 1.14 $ 
 *
 * Screen Layout Module of the PSL.
 * 
 */

#include <string.h>
#include "vdvd_types.h"
#include "psl_screen_layout.h"
#include "psl_interface.h"
#include "psl_types.h"
#include "psl_data_bank.h"
#include "psl_external_interface.h"
#include "psl_bitmap_bank.h"
#include "psl_fonts.h"
#include "deal_general.h"
#include "deal_control.h"
#include "deal_draw.h"
#include "osapi.h"
#include "dbgprint.h"
#ifdef DMALLOC
#include "dmalloc.h"
#endif

/* Debug macros */
#define DBG_PSL_SCREEN  DBG_ERROR
#define DBG_ON(x)       (DBG_PSL_SCREEN >= x)

/* ARGB colors */
#define ARGB_COLOR_CLEAR    0x00000000
#define ARGB_COLOR_WHITE    0xFFFFFFFF
#define ARGB_COLOR_LT_GRAY  0xFFD0D0D0
#define ARGB_COLOR_GRAY     0xFFA0A0A0
#define ARGB_COLOR_GRAY_T   0x60A0A0A0
#define ARGB_COLOR_DK_GRAY  0xFF707070
#define ARGB_COLOR_BLACK    0xFF000000
#define ARGB_COLOR_BLACK_T  0x80000000
#define ARGB_COLOR_YELLOW   0xFFFFFF00
#define ARGB_COLOR_GOLD     0xFFFFCC33
#define ARGB_COLOR_BLUE     0xFFA0D0FF
#define ARGB_COLOR_DK_BLUE  0xFF000080
#define ARGB_COLOR_CYAN     0xFF00FFFF
#define ARGB_COLOR_BROWN    0xFF800000
#define ARGB_COLOR_RED      0xFFFF0000
#define ARGB_COLOR_MAGENTA  0xFFFF00FF
#define ARGB_COLOR_GREEN    0xFF00FF00

/* Button drawing information */
typedef struct tagPSL_BUTTON_DRAW_INFO
{
    ULONG               ulWidth;
    ULONG               ulHeight;
    ULONG               ulColorU;
    ULONG               ulColorS;
    ULONG               ulTextColorU;
    ULONG               ulTextColorS;
    ULONG               ulBorderWidth;
    ULONG               ulBorderColor;
    char                cText[50];
    DEAL_HANDLE         *pDeal;
} PSL_BUTTON_DRAW_INFO;

/**
 * Local functions.
 */
static PSL_STATUS   InitializeSetupMenu(PSL_SETUP_MENU *pSetupMenu);
static void         UninitializeSetupMenu(PSL_SETUP_MENU *pSetupMenu);
static PSL_STATUS   InitializeStatusDisplay(PSL_STATUS_DISPLAY *pDisplay);
static void         UninitializeStatusDisplay(PSL_STATUS_DISPLAY *pDisplay);
static PSL_STATUS   InitializeIconData(PSL_ICON_DATA *pIconData);
static void         UninitializeIconData(PSL_ICON_DATA *pIconData);
static PSL_STATUS   InitializeStatusMenu(PSL_STATUS_MENU *pStatusMenu);
static void         UninitializeStatusMenu(PSL_STATUS_MENU *pStatusMenu);
static PSL_STATUS   InitializeParentalControl(PSL_HANDLE *pPSL);
static void         UninitializeParentalControl(PSL_HANDLE *pPSL);
static PSL_STATUS   InitializeCDDAGui(PSL_STATUS_DISPLAY *pCddaGui);
static void         UninitializeCDDAGui(PSL_STATUS_DISPLAY *pCddaGui);
static void         StatusDisplayTimerCallback(PVOID pvParam);
static void         IconTimerCallback(PVOID pvParam);
static void         StatusMenuTimerCallback(PVOID pvParam);
static void         GenericTimerCallback(PVOID pvParam);

/**
 * PslScreenLayoutInitialize -- Create all menus and define the layout of each menu.
 *
 * @param
 *      pPSL    - handle to internal PSL data
 *
 * @retval
 *    PSL_SUCCESS if successful
 *    PSL_FAILURE if not successful
 */
PSL_STATUS  PslScreenLayoutInitialize(PSL_HANDLE *pPSL)
{
    /* Check for a valid psl handle */
    if (pPSL == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: NULL handle!\n"));
        return (PSL_FAILURE);
    }

    /* Create DEAL for generic osd */
    pPSL->hDeal = DealCMCreate();
    if (pPSL->hDeal == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: failed to create deal!\n"));
        goto errout;
    }
    else
    {
        DEAL_SURFACE_SETTINGS surface_settings;

        /* Set the surface settings */
        surface_settings.usPlaneOrder = 1;
        surface_settings.ulX          = 0;
        surface_settings.ulY          = 0;
        surface_settings.ulWidth      = 720;
        surface_settings.ulHeight     = 576;
        surface_settings.ulColorKey   = 12;

        /* Initialize DEAL */
        if (DealCMInitialize(pPSL->hDeal, surface_settings, DEAL_PIXEL_FORMAT_PALETTE4) != DEAL_SUCCESS)
        {
            DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: failed to initialize deal!\n"));
            goto errout;
        }
        else
        {
            DEAL_PALETTE palette;
            palette.aPalette = NULL;

            /* Set the color palette */
            palette.ulLength = 16;
            palette.aPalette = (ULONG *)OS_MemAlloc(sizeof(ULONG) * palette.ulLength);
            if (palette.aPalette == NULL)
            {
                DBGPRINT(DBG_ON(DBG_ERROR), ("%s: %u -- OS_MemAlloc Failed!\n", __FILE__, __LINE__));
                goto errout;
            }
            palette.aPalette[0]  = ARGB_COLOR_BLACK_T;
            palette.aPalette[1]  = ARGB_COLOR_GOLD;
            palette.aPalette[2]  = ARGB_COLOR_BLUE;
            palette.aPalette[3]  = ARGB_COLOR_BLACK;
            palette.aPalette[4]  = ARGB_COLOR_CYAN;
            palette.aPalette[5]  = ARGB_COLOR_WHITE;
            palette.aPalette[6]  = ARGB_COLOR_BLACK;
            palette.aPalette[7]  = ARGB_COLOR_YELLOW;
            palette.aPalette[8]  = ARGB_COLOR_YELLOW;
            palette.aPalette[9]  = ARGB_COLOR_BROWN;
            palette.aPalette[10] = ARGB_COLOR_RED;
            palette.aPalette[11] = ARGB_COLOR_MAGENTA;
            palette.aPalette[12] = ARGB_COLOR_CLEAR;
            palette.aPalette[13] = ARGB_COLOR_GREEN;
            palette.aPalette[14] = ARGB_COLOR_DK_GRAY;
            palette.aPalette[15] = ARGB_COLOR_GRAY;

            /* Load the color palette */
            if (DealCMSetPalette(pPSL->hDeal, palette) != DEAL_SUCCESS)
            {
                DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: failed to load color palette!\n"));
                OS_MemFree(palette.aPalette);
                goto errout;
            }
            else
            {
                /* Clean the buffer */
                if (DealCMBufferClean(pPSL->hDeal, DEAL_BUFFER_BOTH) != DEAL_SUCCESS)
                {
                    DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: failed to clean buffer!\n"));
                    OS_MemFree(palette.aPalette);
                    goto errout;
                }
            }
            OS_MemFree(palette.aPalette);
        }
    }

    /* create timer for generic osd */
    if (OS_TimerCreateParam(&pPSL->Timer, (OS_FUNCPTR_PARAM)GenericTimerCallback, NULL) != OS_OK)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: Failure creating timer!\n"));
        goto errout;
    }

    /* Allocate the setup menu */
    pPSL->pSetupMenu = (PSL_SETUP_MENU *)OS_MemAlloc(sizeof(PSL_SETUP_MENU) );
    if (pPSL->pSetupMenu == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: Failure allocating setup menu!\n"));
        goto errout;
    }
    
    /* Initialize the setup menu */
    if (InitializeSetupMenu(pPSL->pSetupMenu) != PSL_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: Failure initializing setup menu!\n"));
        goto errout;
    }

    /* Allocate the status display */
    pPSL->pStatusDisplay = (PSL_STATUS_DISPLAY *)OS_MemAlloc(sizeof(PSL_STATUS_DISPLAY) );
    if (pPSL->pStatusDisplay == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: Failure allocating status display!\n"));
        goto errout;
    }
    
    /* Initialize the status display */
    if (InitializeStatusDisplay(pPSL->pStatusDisplay) != PSL_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: Failure initializing status display!\n"));
        goto errout;
    }

    /* Allocate the icon data */
    pPSL->pIconData = (PSL_ICON_DATA *)OS_MemAlloc(sizeof(PSL_ICON_DATA) );
    if (pPSL->pIconData == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: Failure allocating icon data!\n"));
        goto errout;
    }
    
    /* Initialize the icon data */
    if (InitializeIconData(pPSL->pIconData) != PSL_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: Failure initializing icon data!\n"));
        goto errout;
    }

    /* Allocate the status menu */
    pPSL->pStatusMenu = (PSL_STATUS_MENU *)OS_MemAlloc(sizeof(PSL_STATUS_MENU) );
    if (pPSL->pStatusMenu == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: Failure allocating status menu!\n"));
        goto errout;
    }
    
    /* Initialize the status menu data */
    if (InitializeStatusMenu(pPSL->pStatusMenu) != PSL_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: Failure initializing status menu data!\n"));
        goto errout;
    }

    /* Allocate the parental control */
    pPSL->pParentalControl = (PSL_PARENTAL_CONTROL *)OS_MemAlloc(sizeof(PSL_PARENTAL_CONTROL) );
    if (pPSL->pParentalControl == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: Failure allocating parental control!\n"));
        goto errout;
    }
    
    /* Initialize the parental control data */
    if (InitializeParentalControl(pPSL) != PSL_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: Failure initializing parental control data!\n"));
        goto errout;
    }

    /* Allocate the cdda gui */
    pPSL->pCddaGui = (PSL_STATUS_DISPLAY *)OS_MemAlloc(sizeof(PSL_STATUS_DISPLAY) );
    if (pPSL->pCddaGui == NULL)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: Failure allocating cdda gui!\n"));
        goto errout;
    }
    
    /* Initialize the cdd gui */
    if (InitializeCDDAGui(pPSL->pCddaGui) != PSL_SUCCESS)
    {
        DBGPRINT(DBG_ON(DBG_ERROR), ("PslScreenLayoutInitialize: Failure initializing cdda gui!\n"));
        goto errout;
    }

    return (PSL_SUCCESS);

errout:

    /* delete cdda gui */
    if (pPSL->pCddaGui != NULL)
    {
        /* uninitialize the cdda gui */
        UninitializeCDDAGui(pPSL->pCddaGui);

        /* de-allocate cdda gui */
        OS_MemFree(pPSL->pCddaGui);
        pPSL->pCddaGui = NULL;
    }

    /* delete parental control */
    if (pPSL->pParentalControl != NULL)
    {
        /* uninitialize the parental control */
        UninitializeParentalControl(pPSL);

        /* de-allocate parental control */
        OS_MemFree(pPSL->pParentalControl);
        pPSL->pParentalControl = NULL;
    }

    /* delete status menu */
    if (pPSL->pStatusMenu != NULL)
    {
        /* uninitialize the status menu */
        UninitializeStatusMenu(pPSL->pStatusMenu);

        /* de-allocate status menu */
        OS_MemFree(pPSL->pStatusMenu);
        pPSL->pStatusMenu = NULL;
    }

    /* delete icon data */
    if (pPSL->pIconData != NULL)
    {
        /* uninitialize the icon data */
        UninitializeIconData(pPSL->pIconData);

        /* de-allocate icon data */
        OS_MemFree(pPSL->pIconData);
        pPSL->pIconData = NULL;
    }

    /* delete status display */
    if (pPSL->pSetupMenu != NULL)
    {
        /* uninitialize the status display */
        UninitializeStatusDisplay(pPSL->pStatusDisplay);

        /* de-allocate status display */
        OS_MemFree(pPSL->pStatusDisplay);
        pPSL->pStatusDisplay = NULL;
    }

    /* delete setup menu */
    if (pPSL->pSetupMenu != NULL)

⌨️ 快捷键说明

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