📄 menu_new_ntsc.c
字号:
MenuItemType* menuItem;
menuItem = &menupage->MenuItems[ucItem];
msOsdDisableSubWinAll();
// draw selected color bar of menu item
ucSubWinLen = menupage->ItemSelLength;
if (ucSubWinLen)
{
ucX = menuItem->XPos;
ucY = menuItem->YPos;
ucColorType = menuItem->SelColorType;
msOsdDrawSubWin(OSD_SUBWIN0, ucX, ucY, ucSubWinLen, ucColorType);
}
// draw selected color bar of menu item sub group
if (menuItem->DrawSubMenuGroup)
{
ucSubWinLen = menupage->ItemSubGroupSelLength;
if (ucSubWinLen)
{
ucX = menuItem->DrawSubMenuGroup->XPos;
ucY = menuItem->DrawSubMenuGroup->YPos;
ucColorType = menuItem->DrawSubMenuGroup->SelColorType;
msOsdDrawSubWin(OSD_SUBWIN1, ucX, ucY, ucSubWinLen, ucColorType);
}
}
}
///////////////////////////////////////////////////////////////////////////
void DrawOsdStr1_M(BYTE ucX, BYTE ucY, WORD wStr)
{
BYTE* pStr;
if(wStr==MainFrame1())
pStr=MainFrame1_M();
else if(wStr==MainFrame2())
pStr=MainFrame2_M();
else
pStr=MainFrame1_M();
msOsdDrawStr1(ucX,ucY,pStr);
}
void DrawOsdColorIcon_M(BYTE ucX, BYTE ucY, WORD wStr, BYTE ucFlag )
{
BYTE* pStr = NULL;
WORD wAddress;
BYTE ucWidth, ucHeight;
BYTE ucHWPaleGroupIdx, ucAttr = 0;
BYTE ucBorderAttr = 0;
BYTE ucBank;
StuFontInfo* pFontInfo;
if(wStr==PictureIcon())
pStr=PictureIcon_M();
else if(wStr==SoundIcon())
pStr=SoundIcon_M();
else if(wStr==ChannelIcon())
pStr=ChannelIcon_M();
else if(wStr==FunctionIcon())
pStr=FunctionIcon_M();
else if(wStr==PcIcon())
pStr=PcIcon_M();
else if(wStr==OsdIcon())
pStr=OsdIcon_M();
else if(wStr==LogoIcon())
pStr=LogoIcon_M();
else
pStr=PictureIcon_M();
if( NULL == pStr )
return;
ucBank = msReadByte(BK0_00);
msWriteByte(BK0_00, REG_BANK_SCALER);
ucWidth = HINIBBLE(pStr[0]);
ucHeight = LONIBBLE(pStr[0]);
// Get the correct icon information
if( ucFlag > 0 )
{
pStr += (3 + ucWidth*ucHeight)*ucFlag;
ucWidth = HINIBBLE(pStr[0]);
ucHeight = LONIBBLE(pStr[0]);
}
//===========================================================
// Get Border color information
pFontInfo = &(g_tFontInfoTbl[pStr[2]]);
if( plttGetTblVar(pFontInfo->ucPaletteIdx, PALETTE_SIZE)&1 )
ucBorderAttr |= 1;
ucHWPaleGroupIdx = pFontInfo->ucHWPaletteIdx&0x7F;
ucBorderAttr |= (ucHWPaleGroupIdx << 4);
//==========================================================
// Get font information
pFontInfo = &(g_tFontInfoTbl[pStr[1]]);
// Use tranparent color
if( plttGetTblVar(pFontInfo->ucPaletteIdx, PALETTE_SIZE)&1 )
ucAttr |= 1;
// Use HW palette
ucHWPaleGroupIdx = pFontInfo->ucHWPaletteIdx&0x7F;
ucAttr |= (ucHWPaleGroupIdx << 4);
// Check if the icon need downloading dynamic palette
if( DOWNLOAD_PALETTE&pFontInfo->ucHWPaletteIdx )
{
// Download pallette
msOsdLoadColor( ucHWPaleGroupIdx, pFontInfo->ucPaletteIdx, PALETTE_SIZE);
}
// Check if the icon need downloading dynamic font
if( NULL != pFontInfo->pcFontData )
{
// Download font
msOsdLoadFont(DRAM_COLOR_FONT_BUS|COMPRESS_DATA, pFontInfo->ucFontAddr, pFontInfo->pcFontData, pFontInfo->fpGetFontSize() );
}
// Set color font
msWriteByte(BK0_AE, msReadByte(BK0_AE) | _BIT3);
// Write OSD
pStr += 3;
wAddress = (WORD)(ucY * g_ucOsdWindowWidth) + ucX; // get real address
for (ucY=0; ucY!=ucHeight; ucY++)
{
if(*(pStr)>0xFF)
msWriteBit(BK0_AE, _ENABLE, _BIT0);
else
msWriteBit(BK0_AE, _DISABLE, _BIT0);
msWrite2Bytes(BK0_A5, wAddress);
// Write code
msOsdSetIoAccess(DRAM_CODE_BUS | OSD_IO_BURST_MODE | OSD_IO_AUTO_INCREASE); // OSD code bus enable
msOsdChkFifoFull(); // wait buffer not full
for (ucX=0; ucX!=ucWidth; ucX++)
msWriteByte(BK0_A7, *(pStr++));
msOsdSetIoAccess(OSD_IO_WRITE_END | OSD_IO_BURST_MODE | OSD_IO_AUTO_INCREASE); // write end
msOsdChkFifoEmpty(); // wait buffer empty
// Write attr
msWrite2Bytes(BK0_A8, wAddress);
msOsdSetIoAccess(DRAM_ATTRIBUTE_BUS | OSD_IO_BURST_MODE | OSD_IO_AUTO_INCREASE); // OSD code bus enable
msOsdChkFifoFull(); // wait buffer not full
if(ucY==0 || ucY==(ucHeight-1))//draw top and bottom border
{
for (ucX=0; ucX!=ucWidth; ucX++)
msWriteByte(BK0_AA, ucBorderAttr );
}
else
{
for (ucX=0; ucX!=ucWidth; ucX++)
{
if(ucX==0 || ucX==(ucWidth-1))//draw left and right border
msWriteByte(BK0_AA, ucBorderAttr );
else
msWriteByte(BK0_AA, ucAttr );//draw icon
}
}
msOsdSetIoAccess(OSD_IO_WRITE_END | OSD_IO_BURST_MODE | OSD_IO_AUTO_INCREASE); // write end
msOsdChkFifoEmpty(); // wait buffer empty
wAddress += g_ucOsdWindowWidth; // next address
} // for
msWriteBit(BK0_AE, _DISABLE, _BIT0); //Disable bit8
msWriteByte(BK0_00, ucBank);
}
//============================================================================
BYTE GetMenuDeep( BYTE ucMenuIdx )
{
switch( ucMenuIdx )
{
case MENU_MAIN:
return 1;
case MENU_PICTURE:
case MENU_SOUND:
case MENU_CHANNEL:
case MENU_FUNCTION:
case MENU_PC:
case MENU_PC_GEOMETRY:
case MENU_OSD:
case MENU_OSD_INFORMATION:
case MENU_PC_COLORMODE:
#if( ENABLE_CC_VCHIP )
case MENU_PARENT_CTL:
case MENU_TV_RATING:
#endif
return 2;
}
return 3;
}
BOOL IsItemSelectable( BYTE ucItemFlag )
{
BOOL bRet=FALSE;
switch(ucItemFlag)
{
case MI_SELECTABLE:
bRet = TRUE;
break;
case MI_PC_ONLY:
if( SrcTypeIsPC() )
bRet = TRUE;
break;
case MI_VGA_ONLY:
if( SRC_TYPE_IS_VGA() )
bRet = TRUE;
break;
case MI_VIDEO_ONLY:
if( SrcTypeIsVideo() )
bRet = TRUE;
break;
case MI_TV_ONLY:
if( SRC_TYPE_IS_TV() )
bRet = TRUE;
break;
case MI_NTSC_ONLY:
if( ( SrcTypeIsVideo() && g_SrcInfo.ucVideoSystem == SIG_NTSC ) &&
( g_VideoSetting.VideoPictureMode == PICTURE_MODE_USER ) )
bRet = TRUE;
break;
case MI_SCART_FUNC_ONLY:
if( IsScartInUse() )
bRet = TRUE;
break;
case MI_VIDEO_NONE_TV_ONLY:
if( IsVideoInUse() && !IsTVInUse())
bRet = TRUE;
break;
case MI_3D_ONLY:
if(IS_SRC_USE_3DDI())
bRet = TRUE;
break;
case MI_ADC_ONLY:
if (IsSrcUseAdcPort())
bRet = TRUE;
break;
case MI_DYNAMIC0:
if (g_VideoSetting.VideoPictureMode == PICTURE_MODE_USER)
bRet = TRUE;
break;
case MI_DYNAMIC1:
if (g_SoundSetting.SoundMode == SOUND_MODE_USER)
bRet = TRUE;
break;
case MI_DYNAMIC2:
if (g_PCColorSetting.ColorTempIndex == PC_COLOR_TEMP_USER)
bRet = TRUE;
break;
}
return bRet;
}
void DrawOsdMenu(void)
{
XDATA BYTE ucBank;
BOOL bRedraw;
if(g_ucMenuPageIndex<MENU_FACTORY)
g_ucFactoryFlag&=0x7F;//EXIT FACTORY MODE
//printf("\r\nPageD=%x",g_ucMenuPageIndex);
//printf("\r\nItemD=%x",g_ucMenuItemIndex);
ucBank = msReadByte( BK0_00 );
msWriteByte( BK0_00, REG_BANK_SCALER);
if(CURRENT_MENU.Flags & MP_INVISIBLE)
{
msOsdHide();
#if (VBI_FUNC_SEL==SW_PARSER)
if (g_SysSetting.PowerOn)
cx_on();
#endif
}
else
{
#if (VBI_FUNC_SEL==SW_PARSER)
cx_off();
#endif
// setup osd window & position
bRedraw = FALSE;
if(CURRENT_MENU.XSize != g_ucOsdWindowWidth || CURRENT_MENU.YSize != g_ucOsdWindowHeight ||
!(msOsdReadByte(OSD_0C) & _BIT0) || g_ucMenuPageIndex==MENU_INPUT_MESSAGE
||(g_ucMenuPageIndex>=MENU_PICTURE_MODE && g_ucMenuPageIndex<=MENU_SOUND_MODE)
|| g_ucMenuPageIndex>=MENU_FACTORY)
bRedraw = TRUE;
if(bRedraw)
{
msOsdHide();
msOsdSetWindowSize(CURRENT_MENU.XSize, CURRENT_MENU.YSize);
msDynamicLoadLanguage();
msClearFbBlock(CP_BLACKCOLOR, WRITECODEBASE, CURRENT_MENU.XSize, CURRENT_MENU.YSize); // Clear code
if (g_ucMenuPageIndex==MENU_INPUT_MESSAGE)
msClearFbBlock(CP_TRANSPARENT, WRITEATTRBASE, CURRENT_MENU.XSize, CURRENT_MENU.YSize); // Clear attribute
else
msClearFbBlock(CP_BLEND, WRITEATTRBASE, CURRENT_MENU.XSize, CURRENT_MENU.YSize); // Clear attribute
if (g_ucMenuPageIndex == MENU_INPUT_MESSAGE)
SetOsdMainMenuSpace();
else
msOsdSetWindowSpace(0,0,0,0);
// OSD Position
if(g_ucMenuPageIndex<MENU_ROOT)
SetOsdMenuPos(50, 50);
else if((g_ucMenuPageIndex >= MENU_PICTURE_SUB_CONTRAST) && (g_ucMenuPageIndex <= MENU_OSD_SUB_HALFTONE))
SetOsdMenuPos(50, 94);
else if(g_ucMenuPageIndex==MENU_VOLUME)
SetOsdMenuPos(50, 94);
else if (g_ucMenuPageIndex == MENU_SOURCE)
SetOsdMenuPos( 0, 0 );
else if (g_ucMenuPageIndex == MENU_INPUT_MESSAGE)
SetOsdMenuPos(0, 0);
else if ((g_ucMenuPageIndex > MENU_INPUT_MESSAGE)&&(g_ucMenuPageIndex < MENU_PICTURE_MODE))
SetOsdMenuPos(50, 50);
else if ((g_ucMenuPageIndex >= MENU_PICTURE_MODE)&&(g_ucMenuPageIndex < MENU_FACTORY))
SetOsdMenuPos(50, 94);
else if(g_ucMenuPageIndex == MENU_CHANNEL_AUTO_SCAN)
SetOsdMenuPos(50, 91);
else if(g_ucMenuPageIndex >= MENU_FACTORY)
SetOsdMenuPos(0, 0);
else
SetOsdMenuPos(g_SysSetting.OSDHPos, g_SysSetting.OSDVPos);
// Level 3 menu ==> MENU_MAIN ==> level 2 menu
if( GetMenuDeep( g_ucPrevMenuPageIndex ) == 3 && GetMenuDeep( g_ucMenuPageIndex ) == 2 )
{
BYTE uc;
BYTE ucPage,ucItem;
ucPage = g_ucMenuPageIndex;
ucItem = g_ucMenuItemIndex;
msOsdDisableSubWinAll();
DrawOsdMainFrame();
g_ucMenuItemIndex = GetMenuItemIndex(MENU_MAIN, g_ucMenuPageIndex);
g_ucMenuPageIndex = MENU_MAIN;
for(uc = 0; uc < tblMenus[MENU_MAIN].MenuItemCount; uc++)
{
DrawOsdMenuItemText(MENU_MAIN, uc);
}
DrawOsdSubMenuGroup(MENU_MAIN, g_ucMenuItemIndex);
g_ucMenuPageIndex = ucPage;
g_ucMenuItemIndex = ucItem;
// Redraw the Items
DrawOsdMenuPage(g_ucMenuPageIndex);
// Draw level 2 menu
DrawOsdItemSelect(&CURRENT_MENU, g_ucMenuItemIndex);
}
else
{
if (g_ucMenuPageIndex == MENU_MAIN)
{
BYTE uc;
msOsdDisableSubWinAll();
DrawOsdMainFrame();
for(uc = 0; uc < tblMenus[MENU_MAIN].MenuItemCount; uc++)
{
DrawOsdMenuItemText(MENU_MAIN, uc);
}
DrawOsdSubMenuGroup(MENU_MAIN, g_ucMenuItemIndex);
DrawOsdMenuPage(MENU_MAIN+g_ucMenuItemIndex+1);
}
else
{
DrawOsdMenuPage(g_ucMenuPageIndex);
DrawOsdItemSelect(&CURRENT_MENU, g_ucMenuItemIndex);
}
}
}
else
{
if( GetMenuDeep( g_ucPrevMenuPageIndex ) == 2 && GetMenuDeep( g_ucMenuPageIndex ) == 2 )
{
msOsdDisableSubWinAll();
msClearFbBlock(CP_BLACKCOLOR, WRITECODEBASE+MAIN_MENU_H_SIZE*SUB_AREA_Y+SUB_AREA_X, SUB_AREA_WIDTH, SUB_AREA_HEIGHT); // Clear code
msClearFbBlock(CP_BLEND, WRITEATTRBASE+MAIN_MENU_H_SIZE*SUB_AREA_Y+SUB_AREA_X, SUB_AREA_WIDTH, SUB_AREA_HEIGHT); // Clear attribute
DrawOsdMenuPage(g_ucMenuPageIndex);
DrawOsdItemSelect(&CURRENT_MENU, g_ucMenuItemIndex);
}
else
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -