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

📄 menu_new_ntsc.c

📁 lcd tv : MST9E19A原代码
💻 C
📖 第 1 页 / 共 4 页
字号:
    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 + -