📄 osdnd.c
字号:
#include "winav.h"
#include "CTString.h"
#include "cc.h"
#include "cdinfo.h"
#include "hal.h"
#include "chips.h"
#include "navigate.h"
#include "setup.h"
#include "fmanager.h"
#include "osd.h"
#include "gdi.h"
#include "OSDND.h"
#include "thumb.h"
#include "Digest.h"
#include "linear.h"
#include "utl.h"
//***************************************************************************
//Note: Don't translate the following strings.
//The following messages are just for char transformation.
WORD code aNumbers[][10] = {{CHAR_0_26, CHAR_1_26, CHAR_2_26, CHAR_3_26, CHAR_4_26, CHAR_5_26, CHAR_6_26, CHAR_7_26, CHAR_8_26, CHAR_9_26},
{CHAR_0, CHAR_1, CHAR_2, CHAR_3, CHAR_4, CHAR_5, CHAR_6, CHAR_7, CHAR_8, CHAR_9}};
WORD code aUppercase[][26] = {{CHAR_A_26, CHAR_B_26, CHAR_C_26, CHAR_D_26, CHAR_E_26, CHAR_F_26, CHAR_G_26, CHAR_H_26, CHAR_I_26, CHAR_J_26, CHAR_K_26, CHAR_L_26, CHAR_M_26, CHAR_N_26, CHAR_O_26, CHAR_P_26, CHAR_Q_26, CHAR_R_26, CHAR_S_26, CHAR_T_26, CHAR_U_26, CHAR_V_26, CHAR_W_26, CHAR_X_26, CHAR_Y_26, CHAR_Z_26},
{CHAR_A, CHAR_B, CHAR_C, CHAR_D, CHAR_E, CHAR_F, CHAR_G, CHAR_H, CHAR_I, CHAR_J, CHAR_K, CHAR_L, CHAR_M, CHAR_N, CHAR_O, CHAR_P, CHAR_Q, CHAR_R, CHAR_S, CHAR_T, CHAR_U, CHAR_V, CHAR_W, CHAR_X, CHAR_Y, CHAR_Z}};
WORD code aLowercase[][26] = {{CHAR_aa_26, CHAR_bb_26, CHAR_cc_26, CHAR_dd_26, CHAR_ee_26, CHAR_ff_26, CHAR_gg_26, CHAR_hh_26, CHAR_ii_26, CHAR_jj_26, CHAR_kk_26, CHAR_ll_26, CHAR_mm_26, CHAR_nn_26, CHAR_oo_26, CHAR_pp_26, CHAR_qq_26, CHAR_rr_26, CHAR_ss_26, CHAR_tt_26, CHAR_uu_26, CHAR_vv_26, CHAR_ww_26, CHAR_xx_26, CHAR_yy_26, CHAR_zz_26},
{CHAR_aa, CHAR_bb, CHAR_cc, CHAR_dd, CHAR_ee, CHAR_ff, CHAR_gg, CHAR_hh, CHAR_ii, CHAR_jj, CHAR_kk, CHAR_ll, CHAR_mm, CHAR_nn, CHAR_oo, CHAR_pp, CHAR_qq, CHAR_rr, CHAR_ss, CHAR_tt, CHAR_uu, CHAR_vv, CHAR_ww, CHAR_xx, CHAR_yy, CHAR_zz}};
WORD code aUnderline[] = {CHAR_UNDER_26,CHAR_UNDERLIN};
WORD code aSlash[] = {CHAR_SLASH_26, CHAR_SLASH};
WORD code aDot[] = {CHAR_DOT_26, CHAR_DOT};
WORD code aDash[] = {CHAR_DASH_26, CHAR_DASH};
WORD code aPlus[] = {CHAR_PLUS_26, CHAR_PLUS};
WORD code aMouhow[] = {CHAR_MH_26, CHAR_MOUHOW};
WORD code aSpace[] = {CHAR_SPACE_26, CHAR_SPACE};
WORD code aRemain[][2] = {{1, CHAR_DASH_26},
{1, CHAR_DASH}};
WORD code a51Channel[][6] = {{5, CHAR_5_26, CHAR_DOT_26, CHAR_1_26, CHAR_C_26, CHAR_H_26},
{5, CHAR_5, CHAR_DOT, CHAR_1, CHAR_C, CHAR_H}};
WORD code a71Channel[][6] = {{5, CHAR_7_26, CHAR_DOT_26, CHAR_1_26, CHAR_C_26, CHAR_H_26},
{5, CHAR_7, CHAR_DOT, CHAR_1, CHAR_C, CHAR_H}};
WORD code a2Channel[][4] = {{3, CHAR_2_26, CHAR_C_26, CHAR_H_26},
{3, CHAR_2, CHAR_C, CHAR_H}};
WORD code aChannel[][3] = {{2, CHAR_C_26, CHAR_H_26},
{2, CHAR_C, CHAR_H}};
WORD code aMPEG[][5] = {{4, CHAR_M_26, CHAR_P_26, CHAR_E_26, CHAR_G_26},
{4, CHAR_M, CHAR_P, CHAR_E, CHAR_G}};
WORD code aAC3[][4] = {{3, CHAR_A_26, CHAR_C_26,CHAR_3_26},
{3, CHAR_A, CHAR_C,CHAR_3}};
WORD code aLPCM[][5] = {{4, CHAR_L_26, CHAR_P_26, CHAR_C_26, CHAR_M_26},
{4, CHAR_L, CHAR_P, CHAR_C, CHAR_M}};
WORD code aDTS[][4] = {{3, CHAR_D_26, CHAR_T_26, CHAR_S_26},
{3, CHAR_D, CHAR_T, CHAR_S}};
WORD code aSDDS[][5] = {{4, CHAR_S_26, CHAR_D_26, CHAR_D_26, CHAR_S_26},
{4, CHAR_S, CHAR_D, CHAR_D, CHAR_S}};
//show debug message
WORD code aVersion[] = {4, CHAR_V, CHAR_E, CHAR_R, CHAR_SPACE};
WORD code aError[] = {4, CHAR_E, CHAR_R, CHAR_R, CHAR_SPACE};
#ifdef SUPPORT_RISC_DETECT_ERROR
WORD code aDecodeError[] = {11, CHAR_D, CHAR_ee, CHAR_cc, CHAR_oo, CHAR_dd, CHAR_ee, CHAR_SPACE, CHAR_E, CHAR_rr, CHAR_rr, CHAR_MOUHOW};
#endif
WORD code aNDSlideTransitionTime[] = {2, CHAR_N_SCANF, CHAR_xx};
//CoCo1.22, add OSD_ERR_DATA and OSD_ERR_PARENTAL case for MSG_INVALID
WORD code aNDErrorData[] = {10, CHAR_E, CHAR_rr, CHAR_rr, CHAR_oo, CHAR_rr, CHAR_SPACE, CHAR_D, CHAR_aa, CHAR_tt, CHAR_aa};
WORD code aNDErrorParental[] = {14, CHAR_E, CHAR_rr, CHAR_rr, CHAR_oo, CHAR_rr, CHAR_SPACE, CHAR_P, CHAR_aa, CHAR_rr, CHAR_ee, CHAR_nn, CHAR_tt, CHAR_aa, CHAR_ll};
//CoCo1.21, support MSG_PROGRAM_PLAY, add this string here because we don't support multi-language verison for this string.
WORD code aNDProgramPlay[] = {12, CHAR_P, CHAR_rr, CHAR_oo, CHAR_gg, CHAR_rr, CHAR_aa, CHAR_mm, CHAR_SPACE, CHAR_P, CHAR_ll, CHAR_aa, CHAR_yy};
WORD code aNDIntro[] = {5, CHAR_I, CHAR_N, CHAR_T, CHAR_R, CHAR_O};
#ifndef SUPPORT_JPEG_EFFECT_NAME
WORD code aNDJPEGEffect[] = {7, CHAR_E, CHAR_ff, CHAR_ff, CHAR_ee, CHAR_cc, CHAR_tt, CHAR_SPACE};
#endif
//CoCo1.23, add new string for MSG_FULLSCREEN
WORD code aNDFullScreenOn[] = {14, CHAR_F, CHAR_uu, CHAR_ll, CHAR_ll, CHAR_SPACE, CHAR_S, CHAR_cc, CHAR_rr, CHAR_ee, CHAR_ee, CHAR_nn, CHAR_SPACE, CHAR_O, CHAR_nn};
WORD code aNDFullScreenOff[] = {14, CHAR_F, CHAR_uu, CHAR_ll, CHAR_ll, CHAR_SPACE, CHAR_S, CHAR_cc, CHAR_rr, CHAR_ee, CHAR_ee, CHAR_nn, CHAR_SPACE, CHAR_O, CHAR_ff, CHAR_ff};
//CoCo1.23, for MSG_AUDIO_OUTPUT_CTL
WORD code aNDAnalogOff[] = {10, CHAR_A, CHAR_nn, CHAR_aa, CHAR_ll, CHAR_oo, CHAR_gg, CHAR_SPACE, CHAR_O, CHAR_ff, CHAR_ff};
WORD code aNDSpeed[] = {1, CHAR_xx};
WORD code aNDSlash[] = {1, CHAR_SLASH};
WORD code aNDDash[] = {1, CHAR_DASH};
WORD code aNDPlus[] = {1, CHAR_PLUS};
//***************************************************************************
#ifdef COLOR_BAR // Xuli1.05
DWORD code PalVal_ColorBar[16]= // Xuli1.05 power-on color bar palette, blue
{
0x54e7ff,0x54d9ff,0x53cbff,0x52beff,
0x52adff,0x529fff,0x5290ff,0x5282ff,
0x5290ff,0x529fff,0x52adff,0x52beff,
0x53cbff,0x54d9ff,0x54e7ff,0
};
WORD _wColorCnt; //Xuli1.05 color bar color entry offset
#endif
//OSD global variables
BYTE __bOSDFg;
BYTE __bOSDBg;
WORD __wOSDUpVPos;
WORD __wOSDUpHPos;
WORD __wOSDBottomVPos;
WORD __wOSDBottomHPos;
extern BYTE __bSurround; // Record Surround kind //CoCo1.21
extern BYTE DATA _bOSDLang;
extern STATUS gcShowStatus;
extern BYTE _bSpeedFactor;
extern BYTE DATA _bOSDLang;
extern BYTE _bWaitingCnt;
extern BYTE _bVolDisplayed;
extern BYTE __bTotPageNO;
#ifdef SHOW_POWERON_BAR //Xuli1.05
extern WORD __wPwrOnTimer; //power-on bar trigger timer
#endif
#ifdef SHOW_6_DISPLAY_MODE
extern BYTE __bDiscHDCDType;
#endif
#ifdef SUPPORT_TUNE_DRAM_CLOCK_PHASE //CoCo2.32, add the code to support tuning the DRAM clock phase.
extern DWORD __dwDRAMClockPhaseValue;
#endif
//The following functions is for normal display
//***************************************************************************
// Function : OSDND_GetMessagePos
// Abstract : Call this function to get the type of the message.
// Arguments : bMessage: the message.
// Return : OSDND_UPPER_RIGHT_REGION: The upper right message.
// : OSDND_BOTTOM_REGION: The bottom message.
// : OSDND_UNKNOWN_REGION: unknown region.
// Side Effect : none.
// Notes :
//***************************************************************************
BYTE OSDND_GetMessagePos(BYTE bMessage)
{
switch (bMessage)
{
case MSG_DISCTYPE:
case MSG_WAITING:
case MSG_OPEN:
case MSG_NEXT:
case MSG_PREV:
case MSG_RETURN:
case MSG_PLAYING:
case MSG_STOP:
case MSG_PAUSE:
case MSG_FAST:
case MSG_STEP:
case MSG_FREEZE:
case MSG_REPEAT:
case MSG_REPEATAB:
case MSG_RANDOM:
case MSG_PBC:
case MSG_TVMODE:
case MSG_RESUME:
case MSG_MENU:
case MSG_ZOOM:
case MSG_ZOOMMOVE:
case MSG_VIDEO_OUTPUT:
case MSG_SCANFORWARD:
case MSG_SCANBACKWARD:
case MSG_SLOW:
case MSG_INVALID:
case MSG_TRACK:
case MSG_NUMBER:
case MSG_VOCAL:
case MSG_AUTOVOCAL:
case MSG_VOICECANCEL:
case MSG_KARAOKE:
case MSG_ROTATE:
case MSG_FLIP:
case MSG_JPEG_EFFECT:
case MSG_ABSTIME:
case MSG_RELTIME:
case MSG_REMAIN_ABSTIME:
case MSG_REMAIN_RELTIME:
case MSG_TITLE_TIME:
case MSG_REMAIN_TITLE_TIME:
case MSG_CHAPTER_TIME:
case MSG_REMAIN_CHAPTER_TIME:
case MSG_KEY10:
case MSG_PSCAN:
case MSG_STRING:
case MSG_VERSION:
case MSG_ERRCODE:
#ifdef SUPPORT_RISC_DETECT_ERROR
case MSG_DECODE_ERROR:
#endif
case MSG_ABNORMAL_DISC:
case MSG_SELECTIONLIST:
#ifdef SUPPORT_PROGRAM_PLAY_INFO //CoCo1.21
case MSG_PROGRAM_PLAY:
#endif //SUPPORT_PROGRAM_PLAY_INFO
case MSG_INTRO: //CoCo1.21
case MSG_FULLSCREEN:
return OSDND_UPPER_RIGHT_REGION;
//The bottom message
case MSG_AUDIO:
case MSG_VOLUME:
case MSG_MUTE:
case MSG_KEY: //CoCo1.00, OSD module just define one message for KEY_UP, KEY_DOWN and KEY_NORMAL
case MSG_ECHO:
case MSG_SURROUND:
#ifdef KARAOKE
case MSG_3D:
#endif
case MSG_ANGLE_CTL:
case MSG_SOUND_EFFECT:
case MSG_AST_CTL:
case MSG_SPST_CTL:
case MSG_AUDIO_OUTPUT_CTL: //CoCo1.21
return OSDND_BOTTOM_REGION;
default:
return OSDND_UNKNOWN_REGION;
}
}
//***************************************************************************
// Function : OSDND_Update
// Abstract : Call this function when you want to update the message for virtual panel.
// Arguments : bMessage: the message.
// : wParam: The parameter for the message.
// Return : TRUE: The message has been updated.
// : FALSE: The message is not supported in the virtual panel.
// Side Effect : none.
// Notes :
//***************************************************************************
BYTE OSDND_Update(BYTE bMessage, WORD wParam)
{
_bOSDMsg = bMessage;
_wOSDInfo = wParam;
GDI_LinkPseudoRegion(TRUE);
GDI_SetCurrentRegion(0); //use region 0
if (OSDND_GetMessagePos(bMessage) == OSDND_UPPER_RIGHT_REGION)
{
// Brian, Don't need to clear region
//_OSDND_ClearRegion(OSDND_UPPER_RIGHT_REGION);
GDI_SetTextColor(TEXT_BG_COLOR, __bOSDBg);
GDI_SetTextColor(TEXT_FG_COLOR, __bOSDFg);
//No shadow
GDI_SetTextColor(TEXT_SHADOW_COLOR_1, __bOSDBg);
GDI_SetTextColor(TEXT_SHADOW_COLOR_2, __bOSDBg);
_wOSDVPHPos = __wOSDUpHPos;
_OSDND_ShowUpperRightMessage();
}
else if (OSDND_GetMessagePos(bMessage) == OSDND_BOTTOM_REGION)
{
// Brian, Don't need to clear region
//_OSDND_ClearRegion(OSDND_BOTTOM_REGION);
//GDI_SetTextColor(TEXT_BG_COLOR, OSDND_PALETTE_ENTRY_BACKGROUND);
GDI_SetTextColor(TEXT_BG_COLOR, __bOSDBg);
GDI_SetTextColor(TEXT_FG_COLOR, OSDND_PALETTE_ENTRY_BOTTOM_STRING);
//No shadow
GDI_SetTextColor(TEXT_SHADOW_COLOR_1, __bOSDBg);
GDI_SetTextColor(TEXT_SHADOW_COLOR_2, __bOSDBg);
_wOSDVPHPos = __wOSDBottomHPos;
_OSDND_ShowBottomMessage();
}
else
{
switch (bMessage)
{
case MSG_DEFAULT_STATE:
_OSDND_DefaultState();
break;
#ifndef GDI_4_BIT_OSD
case MSG_INITIAL_PALETTE:
_OSDND_InitializeGDI();
break;
#endif
case MSG_CLEAR:
_OSDND_ClearRegion(OSDND_GetMessagePos((BYTE)_wOSDInfo));
break;
default:
GDI_LinkPseudoRegion(FALSE);
return FALSE;
}
}
GDI_ActivateRegion(); //open GDI
GDI_LinkPseudoRegion(FALSE);
return TRUE;
}
//***************************************************************************
// Function : _OSDND_ShowUpperRightMessage
// Abstract :
// Arguments :
// Return : none.
// Side Effect : none.
// Notes :
//***************************************************************************
void _OSDND_ShowUpperRightMessage(void)
{
switch (_bOSDMsg)
{
case MSG_DISCTYPE:
if (__wDiscType == NO_DISC_IN_DRIVE)
{
_OSDND_OutputTextEx(aNDNoDisc[_bOSDLang]);
return;
}
else
_OSDND_ShowDiscType();
break;
case MSG_WAITING:
_wOSDVPHPos -= _OSDND_ShowWaitingState();
GDI_DRAW_STRING(_wOSDVPHPos, __wOSDUpVPos);
_OSDND_OutputTextEx(aNDWait[_bOSDLang]);
return;
case MSG_OPEN:
case MSG_NEXT:
case MSG_PREV:
case MSG_RETURN:
case MSG_PLAYING:
case MSG_STOP:
case MSG_PAUSE:
case MSG_FAST:
case MSG_STEP:
case MSG_FREEZE:
case MSG_REPEAT:
case MSG_REPEATAB:
case MSG_RANDOM:
case MSG_PBC:
case MSG_TVMODE:
case MSG_RESUME:
case MSG_MENU:
case MSG_ZOOM:
case MSG_ZOOMMOVE:
case MSG_VIDEO_OUTPUT:
case MSG_VOCAL:
case MSG_AUTOVOCAL:
case MSG_VOICECANCEL:
case MSG_KARAOKE:
case MSG_INVALID:
case MSG_SCANFORWARD:
case MSG_SCANBACKWARD:
case MSG_SLOW:
case MSG_JPEG_EFFECT:
case MSG_ROTATE:
case MSG_FLIP:
case MSG_PSCAN:
case MSG_INTRO:
_OSDND_OutputKeyString();
return;
case MSG_ABNORMAL_DISC:
_OSDND_OutputErrorDisc();
return;
case MSG_KEY10:
_OSDND_Show10Plus();
break;
case MSG_TRACK:
case MSG_NUMBER:
OSD_OutputNum(_wOSDInfo, OSDND_FONT_INDEX);
break;
case MSG_SELECTIONLIST:
_OSDND_ShowSelection();
break;
//show time
case MSG_RELTIME:
case MSG_REMAIN_ABSTIME:
case MSG_REMAIN_RELTIME:
case MSG_TITLE_TIME:
case MSG_REMAIN_TITLE_TIME:
case MSG_CHAPTER_TIME:
case MSG_REMAIN_CHAPTER_TIME:
_OSDND_ShowTime();
break;
case MSG_STRING:
_OSDND_ShowString();
break;
case MSG_VERSION: // will show "VER xxxxx"
case MSG_ERRCODE: // will show "ERR xxx"
#ifdef SUPPORT_RISC_DETECT_ERROR
case MSG_DECODE_ERROR:
#endif
_OSDND_ShowDebugNum();
break;
//CoCo1.21, add this message to support "Program Play" string.
//For code reduction, will not support multi-language for this message.
#ifdef SUPPORT_PROGRAM_PLAY_INFO //CoCo1.21
case MSG_PROGRAM_PLAY:
_OSDND_OutputTextEx(aNDProgramPlay);
break;
#endif //SUPPORT_PROGRAM_PLAY_INFO
default:
return;
}
_OSDND_OutputUpString();
}
//***************************************************************************
// Function : _OSDND_ShowBottomMessage
// Abstract :
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -