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

📄 showmp4osdtext.c

📁 dvd里面的一个文件系统的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "user_init.h"

// 2005/08/29 yltseng, modify draw subtitle function from byte base to pixel base
// 2005/09/12 yltseng, Add new structure for font
// 2005/09/22 yltseng, add support for unix format new line

#if defined( OSD_FONT_API ) && defined( SUPPORT_OSDSRT )

//This is only for Nero Digital Certification (Temp solution)
#ifdef SUPPORT_QUICKTIME
    #include "File_def.h"
    #include "File_if.h"
#endif //SUPPORT_QUICKTIME

#ifdef NEW_OSD_DRIVER

#include "global.h"
#include "func.h"
#include "LanguageUtil.h"

#ifdef SUBTITLE_SUPPORT_ALL_FORMAT
static inline void ModifyStringForTMPlayer( const UINT8* pStr, UINT16 uiStrLen )
{   //suxin,2005-07-29,for support subtitle of TMPlayer(*.txt)
	int     i, j;
	UINT8*  pTmpStr = (UINT8*) pStr;

	for( i = 0; i <= (uiStrLen+11); i++ )
	{
		if( (pTmpStr[i  ] == ',') && 
		    (pTmpStr[i+1] == '2') && 
		    (pTmpStr[i+2] == '=') )
		{	
			UINT16 uiLen = uiStrLen - i + 11;
			i -= 8;
			for( j = 0; j <= uiLen; j++ )
			{
				pTmpStr[i] = pTmpStr[ i + 11 ];
				i++;
			}
			break;
		}
	}//for(i = 0;i<=(size+11);i++)
}
#else
#define ModifyStringForTMPlayer(...)
#endif

#ifdef SWITCH_SUB_DIRECTION // 2005/09/30 yltseng, libing 2005-7-15 14:43
#define redirect_subtitle()                                             \
    if( subtitle_ratate_flag )                                          \
    {                                                                   \
        uiStart_x = ( uiRegionWidth + uiLineLen ) >> 1;                 \
        UINT8   uiChar;                                                 \
        UINT8*  pStrPtr     = &aLineBuf[0];                             \
        UINT8*  pNumStart   = NULL;                                     \
        while( TRUE )                                                   \
        {                                                               \
            uiChar = *pStrPtr;                                          \
            if( !pNumStart )                                            \
            {                                                           \
                if( uiChar >= '0' && uiChar <= '9' )                    \
                    pNumStart = pStrPtr;                                \
            }                                                           \
            else                                                        \
            {                                                           \
                if( uiChar < '0' || uiChar > '9' )                      \
                {                                                       \
                    UINT8* pNumEnd = pStrPtr - 1;                       \
                    while( (UINT32) pNumStart < (UINT32) pNumEnd )      \
                    {                                                   \
                        UINT8 uiTmp = *pNumEnd;                         \
                        *pNumEnd    = *pNumStart;                       \
                        *pNumStart  = uiTmp;                            \
                        pNumStart++;                                    \
                        pNumEnd--;                                      \
                    }                                                   \
                    pNumStart = NULL;                                   \
                }                                                       \
            }                                                           \
            if( uiChar == 0 ) break;                                    \
            pStrPtr++;                                                  \
        }                                                               \
    }
#else
#define redirect_subtitle()
#endif

#if defined (SUPPORT_SMI_MultiLanguage)//libing 2006/3/16
extern int strncmpIgnoreCase(char *a,char *b,unsigned i);
extern UINT8  SmiSupType;
extern BYTE nowSupLang;
extern BYTE lang_temp[][15];
extern BYTE lang_num;
#define MAX_Para   3
#endif

void ShowOSDText( const UINT8* pStr,  UINT16 uiStrLen )
{
    // get font width & height
#ifdef	SUPPORT_FONT_OUTLINE  // 2006-02-24, mimitsai add for adjusting the subtitle string lenth when with subtitle_frame
    #define FONT_WIDTH_INTERNAL_OSD         (18+8-6+1)	// 8: add 4bits for left and right(if width%8=0).
    													// (if width%8!=0, add 4bits for left and right )
#else
    #define FONT_WIDTH_INTERNAL_OSD         18
#endif
    #define FONT_HEIGHT_INTERNAL_OSD        24
    #define OSD_EXTERNAL_SUBTITLE_REGION    3
    #ifdef OSD_SUPPORT_2_COLOR
    #ifdef ALCO_DVD_UI//shenyj add 2006-9-7 08:39下午
    #define FONT_COLOR_INDEX                2       
    #else
    #define FONT_COLOR_INDEX                1       // 2005/12/28 yltseng
    #endif
    #else
    #define FONT_COLOR_INDEX                2
   #endif    

    #ifdef ADJUST_SPACE_BETWEEN_FONT //denghg  add 2006-1-6 06:00     
    #include "osd_AppAPI.h"    
    const UINT8* pBmp   = NULL;
    UINT8  uiFONTRealWidth = 0;
    UINT8  uiDrawWidth     = 0;
    UINT8  uiDrawHeight    = 0;
    #endif
    
    UINT8   uiFontWidth     = FONT_WIDTH_INTERNAL_OSD; 
    UINT8   uiFontHeight    = FONT_HEIGHT_INTERNAL_OSD;

#ifdef	SUPPORT_FONT_OUTLINE
	Mp4Subtitle_flag=1;
#endif

#if defined (SUPPORT_SMI_MultiLanguage)//libing 2006/3/16
	UINT8 Para_num=0;
	UINT8 nPara_num;
	UINT32 Para_addr[MAX_Para];
	UINT8  Para_size[MAX_Para];
	BYTE ParaCntFlg=0;
#endif

    if( langGetSupportedFontNum() )
    {
        UINT8 uiHeight;
        if( !langGetFontSize( &uiFontWidth, &uiHeight ) )
            return;

        UINT8 uiScaleX, uiScaleY;
        langGetScale( &uiScaleX, &uiScaleY );
        uiFontWidth     *= uiScaleX;

        uiHeight    *= uiScaleY;
        uiFontHeight = ( uiHeight     >= uiFontHeight) ? uiHeight : uiFontHeight;
    }

    // get region width & height
    dimension diSize;
    if( !osd_get_original_region_size( OSD_EXTERNAL_SUBTITLE_REGION, &diSize ) )
        return;

    UINT16  uiRegionWidth   = diSize.x_length;
    UINT16  uiRegionHeight  = diSize.y_length;

    // calc max line for subtitle region
    UINT8   uiMaxLine   = uiRegionHeight / uiFontHeight;
    
    // modify string for TMPlayer subtitle
    ModifyStringForTMPlayer( pStr, uiStrLen );
    
    UINT8*  pStrEnd     = (UINT8*) (pStr + uiStrLen);
    UINT8   uiLineCnt   = 0;
    
    //osd_tog_region( OSD_EXTERNAL_SUBTITLE_REGION, OSD_OFF );

#ifdef	SUPPORT_FONT_OUTLINE // 2006-02-24, mimitsai add for adjusting the subtitle string lenth when with subtitle_frame
    uiFontWidth = uiFontWidth+8-6+1;// 8: add 4bits for left and right(if width%8=0).
    								// (if width%8!=0, add 4bits for left and right )
#endif
    

#ifdef SUPPORT_SMI_MultiLanguage//libing 2006/3/16
UINT8   CorrectWordCnt = 0;
	if(SmiSupType)
    {
    	while( (UINT32) pStr < (UINT32) pStrEnd )
    	{
    		if( (*pStr) == '<' && (*(pStr+1) == 'P' || *(pStr+1) == 'p' ) )
    		{
    			if(ParaCntFlg)
			    {   
			       Para_size[Para_num]=CorrectWordCnt;
			       Para_num++;
		        }
		        
    			ParaCntFlg=0;
    			
    			if(lang_num>1)
	    		{
	    			while(*pStr!='='&&(UINT32) pStr < (UINT32) pStrEnd)
	                {
	                   pStr++;
	                }      			
	    		    pStr++;
	    		    if(strncmpIgnoreCase( (BYTE*)pStr,lang_temp[nowSupLang], strlen((const char*)lang_temp[nowSupLang]) )==0)
	    		    {        		       
	    		       while(*pStr!='>')
	    		       {
	    		    	  pStr++;   		       	     		         
	    		       }  
	    		       pStr++;
	    		       Para_addr[Para_num]=(UINT32) pStr;
	    		       CorrectWordCnt=0;
	    		       ParaCntFlg=1;
	       		    }
    		    }
    		    else
    		    {
    		       while(*pStr!='>')
    		       {  
    		    	  pStr++;   		       	     		         
    		       }  
    		       pStr++;
    		       Para_addr[Para_num]=(UINT32) pStr;
    		       CorrectWordCnt=0;
    		       ParaCntFlg=1;    		    
    		    }
    		}
    	    
    		pStr++;
       	    if(ParaCntFlg)
       	      CorrectWordCnt++;       	    
       	}
	    if(ParaCntFlg) 
	    {   
	       Para_size[Para_num]=CorrectWordCnt;
	       Para_num++;
        }
	}
	if(!SmiSupType)
    {      
        Para_num=1;
    }
	nPara_num=0;
    			
#endif  
#if defined (SUPPORT_SMI_MultiLanguage)//libing 2006/3/16
	while(nPara_num<Para_num)
	{   
		if(SmiSupType)
        {          	
            pStr=(BYTE *)Para_addr[nPara_num];
            pStrEnd = (BYTE*) (pStr + Para_size[nPara_num]);
        }
#endif
      
    while( (UINT32) pStr < (UINT32) pStrEnd )
    {
        BYTE    aLineBuf[60];
        UINT8   uiWordCnt   = 0;
        UINT16  uiLineLen   = 0;

        while( ( (*pStr) != '\n' ) && ( (UINT32) pStr < (UINT32) pStrEnd ) )
		{
		    UINT8   uiCurChar   = *pStr;
		    
            if( uiCurChar == '\r' )   //if '\n' not jump next line just continue
            {
                pStr++;
                continue;
            }

            UINT32 uiRtnVal = langIsInCharacterSet( pStr );
            
            if( uiRtnVal == FONT_TWO_BYTE )
			{
                if( uiLineLen + uiFontWidth > uiRegionWidth )
                {
                    break;
                }
                    			    
			    aLineBuf[ uiWordCnt     ] = uiCurChar;
			    aLineBuf[ uiWordCnt + 1 ] = *(pStr+1);
			    
			    #ifdef ADJUST_SPACE_BETWEEN_FONT  //denghg add for FONT_TWO_BYTE 2006-9-25 13:25 
		        ftGetDrawFontSize(pStr, &uiDrawWidth, &uiDrawHeight);
                GetDrawFontBmp(pStr, &pBmp);		    
			    uiFONTRealWidth = Cnt_font_Realwidth( pBmp,uiDrawWidth, uiDrawHeight );
			    uiLineLen      += uiFONTRealWidth;
			    #else			    
			    uiLineLen   += uiFontWidth;
			    #endif
			    
			    uiWordCnt   += 2;
			    pStr        += 2;
			}
			else
            {


                if( uiRtnVal == FONT_NOT_IN_RANGE )
                {
                    #ifndef ADJUST_SPACE_BETWEEN_FONT //DENGHG ADD 2006-1-6 06:04     
                    if( uiLineLen + FONT_WIDTH_INTERNAL_OSD > uiRegionWidth )
                    #else
                    if( uiLineLen + uiFontWidth > uiRegionWidth )   //denghg modify 2006-3-15 9:10
                    #endif                    
                    {                   
                        break;
                    }

                    if( ( uiCurChar < 32 ) || ( uiCurChar > 126 ) )
                    {
    //This is only for Nero Digital Certification (Temp solution)
    #ifdef SUPPORT_QUICKTIME
                        if (GET_FILE_TYPE()==FILE_TYPE_ND)
                            return;
    #endif //SUPPORT_QUICKTIME
                        
                        uiCurChar = '?';
                        ///denghg modify for FONT_NOT_IN_RANGE
                        #ifdef ADJUST_SPACE_BETWEEN_FONT //DENGHG ADD 2006-1-6 06:04     
		    	        ftGetDrawFontSize(&uiCurChar, &uiDrawWidth, &uiDrawHeight);
                        GetDrawFontBmp(&uiCurChar, &pBmp);
		    	        uiFONTRealWidth = Cnt_font_Realwidth( pBmp, uiDrawWidth, uiDrawHeight );
                        #endif
                    }
                    #ifdef ADJUST_SPACE_BETWEEN_FONT //denghg add for FONT_NOT_IN_RANGE and use OSD font 2006-9-25 14:16
                    else
                    {
                        ftGetDrawFontSize(&uiCurChar, &uiDrawWidth, &uiDrawHeight);
                        GetDrawFontBmp(&uiCurChar, &pBmp);
                        uiFONTRealWidth = Cnt_font_Realwidth(pBmp, uiDrawWidth, uiDrawHeight);  
                    }
                    #endif

                    #ifndef ADJUST_SPACE_BETWEEN_FONT     //DENGHG ADD 2006-1-6 06:04                         
                    uiLineLen += FONT_WIDTH_INTERNAL_OSD;
                    #else
                    uiLineLen += uiFONTRealWidth;
                 	#endif
                }
                else
                {
                   
                    #ifdef ADJUST_SPACE_BETWEEN_FONT //DENGHG ADD 2006-1-6 06:04     
		    	    ftGetDrawFontSize(pStr, &uiDrawWidth, &uiDrawHeight);
                    GetDrawFontBmp(pStr, &pBmp);		    
		    		uiFONTRealWidth = Cnt_font_Realwidth(pBmp, uiDrawWidth, uiDrawHeight);
		    	    if (uiLineLen + /*uiFONTRealWidth*/uiDrawWidth > uiRegionWidth) //denghg ADD uiFontWidth for  first font is eaten 2006-3-3 16:51
                    {
                        break;
                    }
                    uiLineLen += uiFONTRealWidth;
                    #else
                    if( uiLineLen + uiFontWidth > uiRegionWidth )
                        break;

                    uiLineLen += uiFontWidth;
                    #endif 
                   
                   
                }

                const UINT8* pTmpStr    = pStr;
                UINT16 uiTmpLineLen      = uiLineLen;
                
                aLineBuf[ uiWordCnt ] = uiCurChar;
                uiWordCnt++;
                pStr++;

                if( uiCurChar == ' ' )
                {
    			    do
    			    {
    			        pTmpStr++;
    			        #ifdef ADJUST_SPACE_BETWEEN_FONT //DENGHG 2006-1-6 06:05     
		    			langGetCharacterBmp( pTmpStr, &pBmp );
		    			uiFONTRealWidth = Cnt_font_Realwidth(pBmp,uiFontWidth, uiFontHeight);
		    			uiTmpLineLen += uiFONTRealWidth;    			        
    			        #else
    			        uiTmpLineLen += uiFontWidth;
    			        #endif
    			        
    			        if( uiTmpLineLen > uiRegionWidth  )
    			            goto PARSE_LINE_END;
    			        else if( ( *pTmpStr == ' ' ) || ( *pTmpStr == '\n' ) )
    			            break;
    			    }while( TRUE );			    
                }
            }
        }

PARSE_LINE_END:
       
        // count uiCurStrLen,'\r':when "return",'\n':next line is blank
        // '\n' just count uiCurStrLen not jump next line wangap add 2005/1/25
        if( (*pStr) == '\n' )
            pStr++;

        if( uiWordCnt > 0 )
        {
            aLineBuf[ uiWordCnt ] = '\0';
            
        	UINT32  uiStart_x = ( uiRegionWidth - uiLineLen ) >> 1;
            UINT32  uiStart_y = uiLineCnt * uiFontHeight;
            redirect_subtitle();    // 2005/09/28 yltseng
            
            #ifdef DIRECT_ACCESS_MEDIA//added by wangwei, 2006-5-16 10:23(for show swith GUI no show MP4 subtitle).
            if(!(full_scrn & SW_MEDIA))
            #endif//DIRECT_ACCESS_MEDIA
            OSD_ShowString( uiStart_x, uiStart_y, aLineBuf, FONT_COLOR_INDEX, OSD_EXTERNAL_SUBTITLE_REGION );

            osd_tog_region( OSD_EXTERNAL_SUBTITLE_REGION, OSD_OFF );

            uiLineCnt++;
            if( uiLineCnt >= uiMaxLine )
                break;
        }        
    }
#if defined (SUPPORT_SMI_MultiLanguage)//libing 2006/3/16       
        nPara_num++;
    }
#endif    
    
    if( uiLineCnt > 0 )
    {
        coordinate coPos;
        if( osd_get_original_region_position( OSD_EXTERNAL_SUBTITLE_REGION, &coPos ) )
        {

⌨️ 快捷键说明

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