?? showmp4osdtext.c
字號:
#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 ) )
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -