📄 osdbmark.c
字号:
#include "winav.h"#include "input.h"#include "utl.h"#include "osd.h"#include "hal.h"#include "cc.h"#include "infofilter.h"#include "linear.h"#include "navigate.h"#include "cell.h"#include "gdi.h"#include "fontindex.h" //++CoCo2.37P#include "osdbmark.h"#include "osdprgm.h"#include "osddsply.h"#include "osdnd.h"#include "setup.h"#include "disp.h"#include "notransl.h"#ifdef SUPPORT_BOOKMARK#ifndef NO_DISC_MODE //CoCo2.37p#define OSDBMARK_MAIN_FILE#include "OSDString\\strextrn.h"extern BYTE __bTimeHour;extern BYTE __bTimeMin;extern BYTE __bTimeSec;extern BYTE __bGoToTimeNO;// Need to add "extern" in the future, use OSDPRGM insteadly// Note : The number in seconde element must be the same as the osdstr.h/*extern WORD aTitle[][7];extern WORD aChapter[][10];extern WORD aClear[][8];*/extern WORD aTitle[];extern WORD aChapter[];extern WORD aClear[];extern WORD aColon[];extern WORD aPlayIcon[];extern WORD aArrowDown[];extern WORD aArrowUp[]; extern WORD aClearIcon[];extern PARM_FRAME _PRGM_FrameAttr;extern PARM_DRAW_STRING _PRGM_StrAttr;extern PARM_RECT _PRGM_RectAttr;//#define SUPPORT_PRGM_NUM_INPUT //Kevin1.06 //Kevin1.24, move to customer.h//#define SUPPORT_CLEARALL_IN_PROGRAM//#define SUPPORT_CIRCULAR_WRAP //Kevin1.05, add#ifdef SUPPORT_CLEARALL_IN_PROGRAM#define MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME 7#else#define MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME 7 #endif// Brian1.24, this value will offset the entire Program UI#define BOOMKARK_GLOBAL_OFFSET (20)#define ENTRY_HEIGHT 26 #define FRAME_THICKNESS 2 #define ARROW_HEIGHT 22 #ifdef PRESTOP_BEFORE_SETUP_AND_PROGRAM#define BOOKMARK_WIDTH 560 //#define BOOKMARK_HEIGHT 410#define BOOKMARK_HEIGHT 350#define BMARK_FRAME_X0 (BOOMKARK_GLOBAL_OFFSET) // Brian1.24//#define BMARK_FRAME_Y0 (0) #define BMARK_FRAME_Y0 (OSDND_UPPER_BACKGROUND_BOTTOM + (8 - OSDND_UPPER_BACKGROUND_BOTTOM%8))#define BMARK_FRAME_X1 (BOOKMARK_WIDTH + BMARK_FRAME_X0) #define BMARK_FRAME_Y1 (BOOKMARK_HEIGHT + BMARK_FRAME_Y0) #else#define BMARK_FRAME_X0 (50+BOOMKARK_GLOBAL_OFFSET) // Brian1.24#define BMARK_FRAME_Y0 (OSDND_UPPER_BACKGROUND_BOTTOM + 1) #define BMARK_FRAME_X1 (590+BOOMKARK_GLOBAL_OFFSET) // Brian1.24#define BMARK_FRAME_Y1 (OSDND_BOTTOM_BACKGROUND_START_V - 1) #endif#define CENTER_FRAME_X0 BMARK_FRAME_X0#define CENTER_FRAME_Y0 (BMARK_FRAME_Y0 + 41)#define CENTER_FRAME_X1 BMARK_FRAME_X1#define CENTER_FRAME_Y1 (BMARK_FRAME_Y1 - 41)#define FRAME_Y0 (BMARK_FRAME_Y0 + 3 * ENTRY_HEIGHT + 5)#define MAIN_FRAME_X0 (80+BOOMKARK_GLOBAL_OFFSET) // Brian1.24#define MAIN_FRAME_Y0 FRAME_Y0#define MAIN_FRAME_X1 (320+BOOMKARK_GLOBAL_OFFSET) // Brian1.24 //390#define MAIN_FRAME_Y1 MAIN_FRAME_Y0+MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME*ENTRY_HEIGHT+2*FRAME_THICKNESS #define CLEAR_HIGHLIGHT 0#define SET_HIGHLIGHT 1WORD _wOSDBOOKMARKString[8];WORD _wBookMark_Chapter[BOOKMARK_NO + 1];//Internal Functionsstatic void _ShowMainList(void);static void _ShowOneEntry(WORD wEntry);static void _ShowOneEntryNumber(WORD wNumber);static void _ShowTitleChapterTime(void);extern void _InitRect(PURECT pRect, WORD wLeft, WORD wTop, WORD wRight, WORD wBottom); //--CoCo1.20, reduce code size.static void _SetClearHighlight(BYTE bFlag);void _OSDBOOKMARK_ShowUI(void);void _OSDBOOKMARK_ClearUI(void);void _OSDBOOKMARK_DrawFrames(void);void _OSDBOOKMARK_InitPalette(void);void _OSDBOOKMARK_ProceedToNextMainEntry(void); //Kevin1.23DMTech//show entry fromextern BYTE _bMainStart; //current pos extern BYTE _bMainHighlightPos; extern BYTE __bTemp;BYTE _bOSDBOOKMARKTemp, _bOSDBOOKMARKTemp1; //for temp use// ****************************************************************************// Function : OSDBOOKMARK_Exit// Description : The OSD kernel will call this function to exit normally.// : This function can NOT send OSD_ChangeUI(xxx, OSD_EXIT_UI) to// : notify OSD kernel it exits.// Arguments : bExitMode// OSD_UI_EXIT_ALL : Exit control and clear the UI.// OSD_UI_EXIT_CONTROL_ONLY : Exit control only.// Return : // Side Effect :// ****************************************************************************void OSDBOOKMARK_Exit(BYTE bExitMode){ switch (bExitMode) { case OSD_UI_EXIT_ALL: _OSDBOOKMARK_ClearUI(); case OSD_UI_EXIT_CONTROL_ONLY: __wBookMark[0] = 0; __btBookMark = FALSE; break; default: break; }}// ****************************************************************************// Function : OSDBOOKMARK_ProcessKey// Description : Process the input key while in DVD/VCD Program mode// Arguments : // Return : KEY_NO_KEY , the input key is processed// : INVALID_KEY , the input key is not allowed under this mode// : KEY_xxx , main program needs to do more processing for the key.// Side Effect :// ****************************************************************************BYTE OSDBOOKMARK_ProcessKey(void){ BYTE bKeyStatus = INVALID_KEY; DWORD dwCheckStill; if ((__wDiscType & BOOK_PICTURECD) || (__bKeySource != KEY_FROM_ISR)) return KEY_BYPASS; if (! ((__bKey == KEY_BOOKMARK) || __btBookMark) ) { return KEY_BYPASS; } bKeyStatus = INVALID_KEY; switch (__bKey) { ///// Enter the following cases when in bookmark mode ///// case KEY_TVMODE: case KEY_MUTE: case KEY_VOL_UP: case KEY_VOL_DOWN: case KEY_KEYUP: case KEY_KEYDOWN: case KEY_PROGRAM: case KEY_GOTOTIME: case KEY_NO_KEY: bKeyStatus = KEY_BYPASS; break; case KEY_UP: __wBookMark[0]--; if (__wBookMark[0] <= BOOKMARK_NO && __wBookMark[0] >= 1) { _SetClearHighlight(CLEAR_HIGHLIGHT); if (_bMainHighlightPos>1) _bMainHighlightPos--; else {#ifdef SUPPORT_CLEARALL_IN_PROGRAM if (_bMainStart>0)#else if (_bMainStart>1)#endif { _bMainStart--; _ShowMainList(); } } _SetClearHighlight(SET_HIGHLIGHT); } if ( __wBookMark[0] >BOOKMARK_NO) __wBookMark[0]=BOOKMARK_NO; if ( __wBookMark[0] <1) __wBookMark[0]=1; _ShowTitleChapterTime(); bKeyStatus = KEY_NO_KEY; break; case KEY_DOWN: __wBookMark[0]++; if (__wBookMark[0] <= BOOKMARK_NO && __wBookMark[0] >= 1) { _SetClearHighlight(CLEAR_HIGHLIGHT); _OSDBOOKMARK_ProceedToNextMainEntry(); _SetClearHighlight(SET_HIGHLIGHT); } if ( __wBookMark[0] >BOOKMARK_NO) __wBookMark[0]=BOOKMARK_NO; if ( __wBookMark[0] <1) __wBookMark[0]=1; _ShowTitleChapterTime(); bKeyStatus = KEY_NO_KEY; break; //Kevin1.05-3, page down case KEY_NEXT: _SetClearHighlight(CLEAR_HIGHLIGHT); if (_bMainStart-1+2*MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME<=MAX_PROG_ITEM) //scroll down a whole page { _bMainStart += MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME; // __wBookMark[0] += MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME; //_bMainHighlightPos remains the same _ShowMainList(); } else if (_bMainStart+_bMainHighlightPos-1+MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME<=MAX_PROG_ITEM) //scroll down not a whole page { _bMainStart=MAX_PROG_ITEM-MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME+1; // _bMainHighlightPos remains the same //_bMainHighlightPos = _bMainStart+_bMainHighlightPos-1+MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME-_bMainStart+1; _ShowMainList(); } else if (_bMainStart+MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME-1<MAX_PROG_ITEM) //scroll down not a whole page { _bMainStart=MAX_PROG_ITEM-MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME+1; // _bMainHighlightPos remains the same //_bMainHighlightPos =MAX_PROG_ITEM-_bMainStart+1; //last one _ShowMainList(); } #ifdef SUPPORT_CIRCULAR_WRAP #ifdef SUPPORT_CLEARALL_IN_PROGRAM else if (_bMainStart!=0) //avoid unnecessary redraw { _bMainStart = 0; _bMainHighlightPos = 2; //highlight 1. __-__ #else else if (_bMainStart!=1) //avoid unnecessary redraw { _bMainStart = 1; _bMainHighlightPos = 1; //highlight 1. __-__ #endif _ShowMainList(); }#endif __wBookMark[0] = _bMainStart + _bMainHighlightPos - 1; _SetClearHighlight(SET_HIGHLIGHT); _ShowTitleChapterTime(); bKeyStatus = KEY_NO_KEY; break; //Kevin1.05-3, page up case KEY_PREV: _SetClearHighlight(CLEAR_HIGHLIGHT); if (_bMainStart>MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME) //scroll up a whole page { _bMainStart -= MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME; // __wBookMark[0] -= MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME; //_bMainHighlightPos remains the same _ShowMainList(); } else if (_bMainStart+_bMainHighlightPos-1>MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME) //scroll down not a whole page {#ifdef SUPPORT_CLEARALL_IN_PROGRAM _bMainStart=0;#else _bMainStart=1;#endif //_bMainHighlightPos = _bMainStart+_bMainHighlightPos-1-MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME; _ShowMainList(); } else if (_bMainStart!=1) //scroll down not a whole page {#ifdef SUPPORT_CLEARALL_IN_PROGRAM _bMainStart=0; _bMainHighlightPos=2; //first one#else _bMainStart=1; _bMainHighlightPos=1; //first one#endif _ShowMainList(); } #ifdef SUPPORT_CIRCULAR_WRAP else if (MAX_PROG_ITEM>MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME) { _bMainStart=MAX_PROG_ITEM-MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME+1; _bMainHighlightPos=MAX_ENTRY_NUM_SHOWN_IN_MAIN_FRAME; _ShowMainList(); }#endif __wBookMark[0] = _bMainStart + _bMainHighlightPos - 1; _SetClearHighlight(SET_HIGHLIGHT); _ShowTitleChapterTime(); bKeyStatus = KEY_NO_KEY; break; case KEY_LEFT: case KEY_RIGHT: break; case KEY_ENTER: //Kevin1.07, combine all the following keys case KEY_PLAY_PAUSE: //Kevin1.06, add case KEY_PLAY: //Kevin0.87, KEY_PLAY act as KEY_ENTER for some cases //playing time if (__wBookMark[__wBookMark[0]]!=0) //playing time { __bTimeHour= HIBYTE(__wBookMark[__wBookMark[0]]) /60 ; __bTimeMin= HIBYTE(__wBookMark[__wBookMark[0]]) %60 ; __bTimeSec= LOBYTE(__wBookMark[__wBookMark[0]]) ; __bTitle=__bBookMark_Title[__wBookMark[0]];#ifdef SUPPORT_STILLRSM //Aron2.38, prepare to bookmark to the still content if(__bBookMarkIsStill[__wBookMark[0]] ) { __bStillRSM = TRUE; __bModeCELLTimeSearch= CELL_TIME_VOBU; __dwTimeCELLTimeSearch= __dwBookMarkVOBU[__wBookMark[0]]; }#endif __bKey = KEY_GOTOTIME_VALUE; __btBookMark=FALSE; _OSDBOOKMARK_ClearUI(); OSD_ChangeUI(OSD_UI_BOOKMARK, OSD_EXIT_UI); bKeyStatus = KEY_TODO; } else //record time { if ( (__wDiscType & BOOK_DVD) ) { // DVD_099bMicky, must give title parameter for UOP query __bUOP_Parameter = __bTitle; // must check Time Search#ifdef SUPPORT_STILLRSM // Alex1.24, don't record bookmark time when non-title domain if ( ! NV_QueryUOP (UOP_CAN_TIME_SEARCH) || (__bDomain !=TT_DOM) )#else HAL_ReadInfo(HAL_INFO_STILL, &dwCheckStill); // Aron2.37, do not allow doing bookmark when playing still picture // Alex1.24, don't record bookmark time when non-title domain if ( ! NV_QueryUOP (UOP_CAN_TIME_SEARCH) || (__bDomain !=TT_DOM) || dwCheckStill )#endif { bKeyStatus = INVALID_KEY; break; } } // Alex1.24, don't record bookmark time when segment play item else if (__wPlayItem > 999 ) // segment playitem { bKeyStatus = INVALID_KEY; break; } _SetClearHighlight(CLEAR_HIGHLIGHT); //VCD ,CDDA only use ABSTime if (__wDiscType !=BOOK_DVD) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -