📄 o_ssaver.c
字号:
/* **************************************************************************************
* Copyright (c) 2004 ZORAN Corporation, All Rights Reserved
* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
*
* File: $Workfile: o_ssaver.c $
*
* Description:
* ============
* Project definition of the MSO_SCREEN_SAVER functions
*
****************************************************************************************************/
#include "Config.h" // Global Configuration - do not remove!
#ifdef DEBUG_UI_TRACE
#undef IFTRACE
#define IFTRACE if (gTraceUI)
#include "Debug\DbgMain.h"
#endif //DEBUG_UI_TRACE
#include "Include\SysDefs.h"
/****************************************************************************************************
* INCLUDE FILES
****************************************************************************************************/
// Include C Standard
#include <stdio.h>
#include <string.h>
// Include project specific
#include "include\math-macro.h"
#ifdef D_GINGER_I86
#include "Decoder\osdlayou.h"
#endif //D_GINGER_I86
#ifdef D_GINGER_I96
#include "Osdlayou.h"
#endif //D_GINGER_I96
#include "CoreAPI\CoreAPI.h"
#include "Playcore\Coremain\CoreGDef.h"
#include "GUI\Menu_system\ms_object.h"
#include "GUI\menu_system\osd_rendering.h"
#include "GUI\menu_system\ms_container.h"
#include "GUI\menu_system\ms_display.h"
#include "GUI\Menu_system\ms_menu.h"
#include "GUI\Menu_system\ms_screen.h"
#include "GUI\menu_system\ms_send_op.h"
#include "GUI\Resource\Bitmap\bitmap.h"
#include "Components\Screen_saver\o_ssaver.h"
#include "Components\Screen_saver\o_ssaver_config.h"
#include "Components\Custom\Screen_saver\o_ssaver_custom.h"
#ifndef DEBUG_UI_TRACE
#undef dbg_printf(sMsg)
#define dbg_printf(sMsg)
#undef dbgm_printf(sMsg, mode)
#define dbgm_printf(sMsg, mode)
#endif
/****************************************************************************************************
* DEFINITION: Public (global) variables
****************************************************************************************************/
/****************************************************************************************************
* DEFINITION: Private (static) variables
****************************************************************************************************/
/****************************************************************************************************
* DECLARATION: Private (static) functions
****************************************************************************************************/
STATIC BOOL _FillOsdSeg(MSO_OBJECT __NEAR* pThis, MS_AREA __NEAR* pAbsArea);
STATIC MS_OP _Operation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam);
STATIC BOOL _Layout(void);
#include "Components\Custom\Screen_saver\o_ssaver_custom.c"
#include "Components\Screen_saver\o_ssaver_config.c"
/****************************************************************************************************
* DEFINITION: Public functions
****************************************************************************************************/
/**************************************************************************
* Function : _FillOsdSeg
*
* In : pThis : Pointer to Title object.
* pAbsArea : Absolute area of pThis object.
*
* Out : None.
*
* Return : None.
*
* Desc : Display function of the screensaver object.
*
****************************************************************************/
#pragma argsused
STATIC BOOL _FillOsdSeg(MSO_OBJECT __NEAR* pThis, MS_AREA __NEAR* pAbsArea)
{
return OSDR_FillOsdSegBitmap(BITMAP,
pAbsArea,
0,
0,
ALIGN_H_LEFT,
ALIGN_V_TOP,
NULL_EXPANSION,
NULL_EXPANSION);
}
/**************************************************************************
* Function : _Layout
*
* In : None
*
* Out : None
*
* Return : TRUE always
*
* Desc : Defines the layout area of the screensaver object
*
***************************************************************************/
STATIC BOOL _Layout(void)
{
#ifdef D_GINGER_I96
go_CurrentLayout.m_bBigMemMap = OSD_LAYOUT_MEM_MAP_LARGE;
#endif //D_GINGER_I96
#ifdef D_CD_GRAPHIC_ENABLED
go_CurrentLayout.m_bOSDBufferNum = OSD_BUFFER_0;
#endif//D_CD_GRAPHIC_ENABLED
OSDClearArea();
OSDAddArea((OSD_LAYOUT_AREA*)&OsdLayoutArea);
OSDSetLayout();
OSDAdaptPixResolutionToProgressive();
OSDAdaptDisplayRangeToVideoStandard();
return (TRUE);
}
/**************************************************************************
* Function : _OnTickMoveObject
*
* In : None
*
* Out : None
*
* Return : None
*
* Desc : This function moves the bitmap in the screensaver at 45 degree angle to
* the sides of the rectangle in which it is positioned
*
***************************************************************************/
STATIC void _OnTickMoveObject(MSO_SCREEN_SAVER __NEAR* pThis)
{
//step increments/decrements
if(SCREEN_SAVER_MOVE_NW_TO_SE == pThis->moParam.mbDirection)
{
pThis->moParam.mXPosition += SSAVER_BM_MOVE_STEP;
pThis->moParam.mYPosition += SSAVER_BM_MOVE_STEP;
}
else if(SCREEN_SAVER_MOVE_NE_TO_SW == pThis->moParam.mbDirection)
{
pThis->moParam.mXPosition -=SSAVER_BM_MOVE_STEP;
pThis->moParam.mYPosition += SSAVER_BM_MOVE_STEP;
}
else if (SCREEN_SAVER_MOVE_SE_TO_NW == pThis->moParam.mbDirection)
{
pThis->moParam.mXPosition -=SSAVER_BM_MOVE_STEP;
pThis->moParam.mYPosition -= SSAVER_BM_MOVE_STEP;
}
else //if (SCREEN_SAVER_MOVE_SW_TO_NE == pDescriptorSSaver->moParam.mbDirection)
{
pThis->moParam.mXPosition +=SSAVER_BM_MOVE_STEP;
pThis->moParam.mYPosition -=SSAVER_BM_MOVE_STEP;
}
//limitation checks
if(pThis->moParam.mXPosition > (AREA_SCREEN_SAVER_W + AREA_SCREEN_SAVER_X - BMWIDTH))
{
pThis->moParam.mXPosition =(AREA_SCREEN_SAVER_W + AREA_SCREEN_SAVER_X - BMWIDTH);
if(SCREEN_SAVER_MOVE_NW_TO_SE == pThis->moParam.mbDirection)
pThis->moParam.mbDirection = SCREEN_SAVER_MOVE_NE_TO_SW;
else
pThis->moParam.mbDirection = SCREEN_SAVER_MOVE_SE_TO_NW;
}
if(pThis->moParam.mYPosition > (AREA_SCREEN_SAVER_H + AREA_SCREEN_SAVER_Y - BMHEIGHT))
{
pThis->moParam.mYPosition = (AREA_SCREEN_SAVER_H + AREA_SCREEN_SAVER_Y - BMHEIGHT);
if(SCREEN_SAVER_MOVE_NW_TO_SE == pThis->moParam.mbDirection)
pThis->moParam.mbDirection = SCREEN_SAVER_MOVE_SW_TO_NE;
else
pThis->moParam.mbDirection = SCREEN_SAVER_MOVE_SE_TO_NW;
}
if(pThis->moParam.mXPosition < (AREA_SCREEN_SAVER_X))
{
pThis->moParam.mXPosition = (AREA_SCREEN_SAVER_X);
if(SCREEN_SAVER_MOVE_SE_TO_NW == pThis->moParam.mbDirection)
pThis->moParam.mbDirection = SCREEN_SAVER_MOVE_SW_TO_NE;
else
pThis->moParam.mbDirection = SCREEN_SAVER_MOVE_NW_TO_SE;
}
if(pThis->moParam.mYPosition < (AREA_SCREEN_SAVER_Y))
{
pThis->moParam.mYPosition = AREA_SCREEN_SAVER_Y;
if(SCREEN_SAVER_MOVE_SE_TO_NW == pThis->moParam.mbDirection)
pThis->moParam.mbDirection = SCREEN_SAVER_MOVE_NE_TO_SW;
else
pThis->moParam.mbDirection = SCREEN_SAVER_MOVE_NW_TO_SE;
}
//resize the layout area
//go_CurrentLayout.m_oArea[0].m_wStartX = pThis->moParam.mXPosition;
//go_CurrentLayout.m_oArea[0].m_wEndX = OSD_AREA_END_X(pThis->moParam.mXPosition, BMWIDTH);
go_CurrentLayout.m_oArea[0].m_wStartY = pThis->moParam.mYPosition;
go_CurrentLayout.m_oArea[0].m_wEndY = OSD_AREA_END_Y(pThis->moParam.mYPosition, BMHEIGHT);
MS_ObjectMove((MSO_OBJECT __NEAR*)pThis, pThis->moParam.mXPosition, pThis->moParam.mYPosition);
}
/**************************************************************************
* Function : _Operation
*
* In : pThis : Pointer to the screensaver object
*
* MsOp : Operation ID.
*
* lParam : Parameter associated with an MS_OP if any.
*
* Out : None
*
* Return : ID of the operation that is to be propagated once processing is done,
* otherwise MS_OP_NONE.
*
* Desc : This function is the operation function of the screen saver object
*
***************************************************************************/
#pragma argsused
STATIC MS_OP _Operation(MSO_OBJECT __NEAR* pThis, MS_OP MsOp, UINT32 lParam)
{
MS_AREA oArea;
UINT16 i;
switch (MsOp)
{
#ifdef D_AUTO_SHUTDOWN_AFTER_SCREEN_SAVER
case MS_OP_INIT:
{
MSO_SCREEN_SAVER __NEAR* pScreensaver = (MSO_SCREEN_SAVER __NEAR*)pThis;
pScreensaver->moParam.mwAutoShutdownTimeout = UI_AUTO_SHUTDOWN_AFTER_SCREEN_SAVER_TIMEOUT_MINUTES * 600;
}
break;
#endif
case MS_OP_TICK:
for(i = 0; i<SSAVER_BM_STEPS_IN_TICK; i++)
{
_OnTickMoveObject((MSO_SCREEN_SAVER __NEAR*)pThis);
OSDAdaptDisplayRangeToVideoStandard();
memcpy((MS_AREA __NEAR*)&oArea, (MS_AREA __NEAR*)(&pThis->moArea), sizeof(MS_AREA));
if (oArea.msX >= (SSAVER_BM_MOVE_STEP))
oArea.msX -= SSAVER_BM_MOVE_STEP;
else
oArea.msX =0;
// Compensate on the left and on the right
oArea.mwW += SSAVER_BM_MOVE_STEP << 1;
MS_DisplayArea((MS_AREA __NEAR*)&oArea);
}
#ifdef D_AUTO_SHUTDOWN_AFTER_SCREEN_SAVER
{
MSO_SCREEN_SAVER __NEAR* pScreensaver = (MSO_SCREEN_SAVER __NEAR*)pThis;
if (pScreensaver->moParam.mwAutoShutdownTimeout)
{
pScreensaver->moParam.mwAutoShutdownTimeout--;
if (0 == pScreensaver->moParam.mwAutoShutdownTimeout)
{
CoreAPI_PowerControl(FALSE);
}
}
}
#endif
break;
}
return MsOp;
}
/**************************************************************************
* Function : OSCREEN_SAVER_Start
*
* In : None
*
* Out : None
*
* Return : None
*
* Desc : This function will initialise and run the screensaver
*
***************************************************************************/
void OSCREEN_SAVER_Start(void)
{
MSO_OBJECT __NEAR* pObject;
MS_DESCRIPTOR_SCREENSAVER* pDescriptorSSaver;
MS_MenuFreeze();
pObject = MS_CreateAndAddObject((MS_DESCRIPTOR *)&ScreenSaverDescriptor, (MSO_CONTAINER __NEAR*)gpScreen);
MS_SendOperation(pObject, MS_OP_INIT, 0);
// The OSD layout for the screen saver
pDescriptorSSaver = (MS_DESCRIPTOR_SCREENSAVER*)(pObject->mpDescriptor);
pDescriptorSSaver->mpfLayout();
// Display the screen saver bitmap
MS_DisplayObject(pObject);
//Display a black background
CoreAPI_DisplayLogo(eBackground);
#ifdef D_GINGER_I86
OSDTurnOn();
#endif //D_GINGER_I86
#ifdef D_GINGER_I96
VPU_SetOSDStatus(VPU_OSD_STATUS_START_E);
#endif //D_GINGER_I96
}
/**************************************************************************
* Function : OSCREEN_SAVER_Stop
*
* In : None
*
* Out : None
*
* Return : None
*
* Desc : This function closes the screensaver by removing the screensaver object
* and reinstating the previous state of the layout and background
*
***************************************************************************/
void OSCREEN_SAVER_Stop(void)
{
MSO_OBJECT __NEAR* pObject = MS_FindObjectFromDescriptor((MSO_CONTAINER __NEAR*)gpScreen, (MS_DESCRIPTOR *)&ScreenSaverDescriptor);
OSDTurnOff();
MS_SEND_OP(MS_OP_REMOVE, pObject);
CoreAPI_DisplayLogo(eFrame);
MS_SEND_OP(MS_OP_OPEN, MS_MenuGetPrevFrozen());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -