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

📄 osdfm.c

📁 车载电子影音系统dvd播放系统原程序代码
💻 C
📖 第 1 页 / 共 5 页
字号:
                
                //scroll down. Bitmap copy.
                GDI_BITMAP_COPY((OSDFM_DISPLAY_VERTICAL_SEPARATE_FRAME_H+OSDFM_DISPLAY_VERTICAL_SEPARATE_FRAME_WIDTH+4), //left //for 4-bit mode (original "+1")
                    (OSDFM_DISPLAY_ICON_RIGHT_WINDOW_START_V-OSDFM_SELECT_FRAME_DISTANCE_V), //top
                    (OSDFM_DISPLAY_RIGHT_SCROLL_BAR_H-1), //right
                    (OSDFM_DISPLAY_ICON_RIGHT_WINDOW_START_V+(OSDFM_MAX_ITEM_IN_FILE_WINDOW-2)*OSDFM_DISPLAY_ITEM_HEIGHT + OSDFM_FILE_WINDOW_FONT_HEIGHT + OSDFM_SELECT_FRAME_DISTANCE_V), //bottom
                    (OSDFM_DISPLAY_VERTICAL_SEPARATE_FRAME_H+OSDFM_DISPLAY_VERTICAL_SEPARATE_FRAME_WIDTH+4), //X //for 4-bit mode (original "+1")
                    (OSDFM_DISPLAY_ICON_RIGHT_WINDOW_START_V+OSDFM_DISPLAY_ITEM_HEIGHT-OSDFM_SELECT_FRAME_DISTANCE_V), //Y
                    0, //source
                    0); //destination
                
                //Then clear the last dir in this page and re-draw it.
                _OSDFM_ClearItemRegionInFileWindow(OSDFM_RIGHT_FILE_WINDOW, 0);

                _OSDFM_UpdateRightScrollBar();
            }

            //Re-set the background's color.
            __GDIParm.u.RectParm.bColor = OSDFM_PALETTE_ENTRY_HIGHLIGHT_BACKGROUND;   
        }

        //CoCo1.10, fix the problem about critical "FM_MAX_FILE_NO_ONCE_TIME" issue.
        _OSDFM_PrepagePage();        

        if (__FMSelectCursor.wIndex < __pFMDirTree[__bFMActiveDir].bNoOfSubDir) //the cursor is at the folder.
        {
            _OSDFM_CopyDirString((BYTE)(__pFMDirTree[__bFMActiveDir].b1stSubDirID+(BYTE)__FMSelectCursor.wIndex), POS_FILE_LIST);
            _bOSDFMIconType = OSDFM_ICON_TYPE_FOLDER; 
        }
        else //the cursor is at the file.
        {
			if (__btProgram)
			{
				if (LINEAR_ProgramEntryOperation(LINEAR_QUERY_INDEX, 0, __bFMActiveDir, (WORD)(__FMSelectCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir+1)) != 0xFF)
				{
					//assign the file's index to _wFileIndex before calling _OSDFM_DrawSelectedFrame.
					//Thus _OSDFM_DrawSelectedFrame() can draw the selected frame according to the width of the file's name.
					_wFileIndex = (WORD)(__FMSelectCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir);
					
					//draw the selected frame
					_OSDFM_DrawSelectedFrame(UPDATE_FRAME_DRAW, (BYTE)((__FMSelectCursor.wIndex - __wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW));
				}
			}
			
            //CoCo1.01, for moving highlight when playing
            if ((__FMActiveCursor.wIndex == __FMSelectCursor.wIndex) && (__bFMActiveDir == __bFMPlayingDir)) //The active playing file is equal to the cursor's position
            { 
                GDI_SetTextColor(TEXT_FG_COLOR, OSDFM_PALETTE_ENTRY_ACTIVE_PLAYING_FILE);
            }
            
            _OSDFM_CopyFileString((WORD)(__FMSelectCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir), OSDFM_FILE_WINDOW_LETTER_INDEX);

            //Call this function to get correct _wTransformFileIndex
            _OSDFM_TransformFileIndex((WORD)(__FMSelectCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir));

            _OSDFM_GetIconType(__pFMFileRecord[_wTransformFileIndex].FileName.bExtID);
        }

		//Reset the __GDIParm.u.RectParm.bColor after draw the selected frame
        if (bUpdate == UPDATE_HIGHLIGHT_DRAW)
        {
            __GDIParm.u.RectParm.bColor = OSDFM_PALETTE_ENTRY_HIGHLIGHT_BACKGROUND;        
        }
        else if (bUpdate == UPDATE_HIGHLIGHT_CLEAR)
        {
            __GDIParm.u.RectParm.bColor = OSDFM_PALETTE_ENTRY_GENERAL_BACKGROUND;        
        }

#ifdef SUPPORT_DYNAMIC_FILE_LENGTH
#ifdef SUPPORT_UNICODE        
        //CoCo2.36, support UNICODE string
        _bOSDFMTemp3 = GDI_GetUnicodeStringMaxWidth(_wOSDFMMaxStringSpace);
#else
        _bOSDFMTemp3 = GDI_GetStringWidth();
#endif

		SET_RECT(__GDIParm.u.Frame.rect, 
			(OSDFM_DISPLAY_ICON_RIGHT_WINDOW_START_H-OSDFM_HIGHLIGHT_DISTANCE_H),
			(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT-OSDFM_HIGHLIGHT_DISTANCE_V),
			(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_H+_bOSDFMTemp3+OSDFM_HIGHLIGHT_DISTANCE_H),
			(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT+OSDFM_FILE_WINDOW_FONT_HEIGHT+OSDFM_HIGHLIGHT_DISTANCE_V));
#else
        //Set the rectange of highlight
        SET_RECT(__GDIParm.u.RectParm.rect, 
            (OSDFM_DISPLAY_ICON_RIGHT_WINDOW_START_H-OSDFM_HIGHLIGHT_DISTANCE_H), 
            (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT-OSDFM_HIGHLIGHT_DISTANCE_V), 
            (OSDFM_DISPLAY_ICON_RIGHT_WINDOW_START_H-OSDFM_HIGHLIGHT_DISTANCE_H+OSDFM_FILE_HIGHLIGHT_WIDTH), 
            (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT+OSDFM_FILE_WINDOW_FONT_HEIGHT+OSDFM_HIGHLIGHT_DISTANCE_V));
#endif
		//Draw the highlight in the file window.
		GDI_FillRect((PPARM_RECT)&__GDIParm);

#ifdef SUPPORT_UNICODE //CoCo2.36, support UNICODE string
        GDI_DRAW_UNICODE_STRING(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_H, (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT), _wOSDFMMaxStringSpace);
#else
        GDI_DRAW_STRING(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_H, (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT));
#endif
		
        //draw the file icon
        if (bUpdate == UPDATE_HIGHLIGHT_DRAW)
            _OSDFM_DrawRightFileWindowIcon((BYTE)((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW), TRUE);
        else
            _OSDFM_DrawRightFileWindowIcon((BYTE)((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW), FALSE);

        if (__FMSelectCursor.wIndex >= __pFMDirTree[__bFMActiveDir].bNoOfSubDir) //the cursor is at the file.
        {
            //draw serial number
            _OSDFM_NormalFileWindowStringPalette();  

            if ((__FMActiveCursor.wIndex == __FMSelectCursor.wIndex) && (__bFMActiveDir == __bFMPlayingDir)) //The active playing file is equal to the cursor's position
            { 
                GDI_SetTextColor(TEXT_FG_COLOR, OSDFM_PALETTE_ENTRY_ACTIVE_PLAYING_FILE);
            }

            OSD_OutputNum((WORD)(__FMSelectCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir+1), OSDFM_FILE_WINDOW_NUM_INDEX);
            GDI_DRAW_STRING((OSDFM_DISPLAY_SERIAL_NUM_START_H-GDI_GetStringWidth()), (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMSelectCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT));
        }
        break;
#ifdef SUPPORT_FM_BUTTONS
    case POS_BUTTON_LIST:        
        if (bUpdate == UPDATE_HIGHLIGHT_DRAW)
            OSDFM_DrawButton((BYTE)__FMSelectCursor.wIndex, TRUE);
        else if (bUpdate == UPDATE_HIGHLIGHT_CLEAR)
            OSDFM_DrawButton((BYTE)__FMSelectCursor.wIndex, FALSE);
        break;
#endif //SUPPORT_FM_BUTTONS
    default:
        break;
    }    
}

//CoCo1.01, for moving cursor when playing
//***************************************************************************
//  Function    :   _OSDFM_UpdateActivePlayingFile
//  Abstract    :   This function will update the color of the file.
//  Arguments   :   bUpdate: UPDATE_ACTIVE_PLAYING_FILE_DRAW
//              :            UPDATE_ACTIVE_PLAYING_FILE_CLEAR
//  Return		:   none.
//  Side Effect :   none.
//  Notes       :   
//***************************************************************************
void _OSDFM_UpdateActivePlayingFile(BYTE bUpdate)
{
    //The active playing cursor is not in the current page.
    if ((__FMActiveCursor.wIndex > (__wStartDrawItem+OSDFM_MAX_ITEM_IN_FILE_WINDOW-1)) || (__FMActiveCursor.wIndex < __wStartDrawItem))
    {
        return;
    }

    if (__bFMActiveDir != __bFMPlayingDir) //The active playing file is not equal to the cursor's position
        return;

    if (bUpdate == UPDATE_ACTIVE_PLAYING_FILE_CLEAR)
    {
        _OSDFMFlashCount = (OSDFM_FLASH_ACTIVE_FILE_COUNT << 1) - 1;
        _OSDFM_FlashPlayingFile(TRUE);
    }
    
    _OSDFM_NormalFileWindowStringPalette();        

    if (bUpdate == UPDATE_ACTIVE_PLAYING_FILE_DRAW)
    {
        if ((__FMActiveCursor.wIndex == __FMSelectCursor.wIndex) && (__FMSelectCursor.bPosition == POS_FILE_LIST))
        {
            GDI_SetTextColor(TEXT_BG_COLOR, OSDFM_PALETTE_ENTRY_HIGHLIGHT_BACKGROUND);
        }

        GDI_SetTextColor(TEXT_FG_COLOR, OSDFM_PALETTE_ENTRY_ACTIVE_PLAYING_FILE);
    }
    
    _OSDFM_CopyFileString((WORD)(__FMActiveCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir), OSDFM_FILE_WINDOW_LETTER_INDEX);
    
#ifdef SUPPORT_UNICODE //CoCo.236, support UNICODE string.
    GDI_DRAW_UNICODE_STRING(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_H, (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMActiveCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT), _wOSDFMMaxStringSpace);   
#else
    GDI_DRAW_STRING(OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_H, (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMActiveCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT));   
#endif

    //Recover to general background to prevent see a highlight background in the serial number.
    GDI_SetTextColor(TEXT_BG_COLOR, OSDFM_PALETTE_ENTRY_GENERAL_BACKGROUND);

    //CoCo1.10, change the color of serial number also.
    OSD_OutputNum((WORD)(__FMActiveCursor.wIndex - __pFMDirTree[__bFMActiveDir].bNoOfSubDir+1), OSDFM_FILE_WINDOW_NUM_INDEX);
    GDI_DRAW_STRING((OSDFM_DISPLAY_SERIAL_NUM_START_H-GDI_GetStringWidth()), (OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_V+((__FMActiveCursor.wIndex -__wStartDrawItem)%OSDFM_MAX_ITEM_IN_FILE_WINDOW)*OSDFM_DISPLAY_ITEM_HEIGHT));
}


//***************************************************************************
//  Function    :   _OSDFM_CopyDirString
//  Abstract    :   Copy the name of the directory to the GDI's array.
//  Arguments   :   bID: The ID of the directory.
//  Return		:   none.
//  Side Effect :   none.
//  Notes       :   
//***************************************************************************
void _OSDFM_CopyDirString(BYTE bID, BYTE bPos)
{
    _bOSDFMTemp = 0;

#ifdef SUPPORT_DYNAMIC_FILE_LENGTH
	if (bPos == POS_FILE_LIST)
	{
		__wTemp = OSDFM_DISPLAY_RIGHT_SCROLL_BAR_H - OSDFM_DISPLAY_ITEM_RIGHT_WINDOW_START_H - OSDFM_SERIALNUM_FILENAME_DISTANCE;
	}
	else //in the left file window
	{
        //CoCo1.10, Entend the number of characters for file string automatically.
        //Calculate the max width for file string.
        OSD_OutputNum((WORD)(bID+1), OSDFM_FILE_WINDOW_NUM_INDEX);	        
        __wTemp = OSDFM_DISPLAY_LEFT_SCROLL_BAR_H - OSDFM_DISPLAY_ITEM_LEFT_WINDOW_START_H - OSDFM_SERIALNUM_FILENAME_DISTANCE - GDI_GetStringWidth();

		//__wTemp = OSDFM_DISPLAY_LEFT_SCROLL_BAR_H - OSDFM_DISPLAY_ITEM_LEFT_WINDOW_START_H - OSDFM_SERIALNUM_FILENAME_DISTANCE;
	}
#endif

#ifdef SUPPORT_UNICODE //CoCo2.36, support UNICDE string.
    _wOSDFMMaxStringSpace = __wTemp;
    while (_bOSDFMTemp < FM_MAX_DIRNAME_LENGTH)
    {
        if (__bJolietTitle) //UNICODE
        {
            if ((__pFMDirNameList[bID].cName[_bOSDFMTemp] == '\0') && (__pFMDirNameList[bID].cName[_bOSDFMTemp+1] == '\0'))
                break;
            
            __wGDIString[_bOSDFMTemp/2+1] = MAKEWORD(__pFMDirNameList[bID].cName[_bOSDFMTemp+1], __pFMDirNameList[bID].cName[_bOSDFMTemp]);
            _bOSDFMTemp += 2;
        }
        else //ASCII
        {
            if (__pFMDirNameList[bID].cName[_bOSDFMTemp] == '\0')
                break;
            __wGDIString[_bOSDFMTemp+1] = __pFMDirNameList[bID].cName[_bOSDFMTemp];
            _bOSDFMTemp++;
        }
    }
    
    if (__bJolietTitle)
        __wGDIString[0] = (_bOSDFMTemp >> 1);    
    else
        __wGDIString[0] = _bOSDFMTemp;
#else
    while (__pFMDirNameList[bID].cName[_bOSDFMTemp] != '\0')
    {
        __wGDIString[_bOSDFMTemp+1] = OSD_TransformChar(__pFMDirNameList[bID].cName[_bOSDFMTemp], OSDFM_FILE_WINDOW_LETTER_INDEX);

#ifdef SUPPORT_DYNAMIC_FILE_LENGTH
		if (__wTemp >= ((__wGDIString[_bOSDFMTemp+1] & 0xF000) >> 10))
		{
			__wTemp -= ((__wGDIString[_bOSDFMTemp+1] & 0xF000) >> 10);
			_bOSDFMTemp++;
		}
		else
		{
			//Dont't increase _bOSDFMTemp because this charachter should not be added to the array.
			break;
		}
#else
		_bOSDFMTemp++;
#endif

        if (_bOSDFMTemp > OSDFM_MAX_DIRNAME_LENGTH)
        {
            _bOSDFMTemp = OSDFM_MAX_DIRNAME_LENGTH;
            break;
        }
    }

    __wGDIString[0] = _bOSDFMTemp;
#endif //SUPPORT_UNICODE
}

//***************************************************************************
//  Function    :   _OSDFM_CopyFileString
//  Abstract    :   This function will copy the name of the file to GDI's array.
//  Arguments   :   wFileIndex: The index of the file.
//  Return		:   none.
//  Side Effect :   none.
//  Notes       :   
//***************************************************************************
void _OSDFM_CopyFileString(WORD wFileIndex, BYTE bLetterIndex)
{
    _bOSDFMTemp = 0;

    //Call this function to get correct _wTransformFileIndex
    _OSDFM_TransformFileIndex(wFileIndex);
    
#ifdef SUPPORT_DYNAMIC_FILE_LENGTH

	//CoCo1.07, Entend the number of characters for file string automatically.
	//Calculate the max width 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -