OSDShowFont.c
上传用户:caisangzi8
上传日期:2013-10-25
资源大小:15756k
文件大小:8k
源码类别:

DVD

开发平台:

C/C++

  1. #include "global.h"
  2. #include "func.h"
  3. #include "user_init.h"
  4. #if defined( OSD_FONT_API ) && defined( SUPPORT_FONT_UTIL )
  5. #include "LanguageUtil.h"
  6. #include "font_lowercase.c" //display lower letter ,suqiaoli add 2004-4-28
  7. extern void osd_draw_gbfont(BYTE vid, BYTE pFont[], int xStart, int yStart, unsigned int  fwidth, unsigned int  fhight, BYTE fontcolor,BYTE number);
  8. extern const unsigned char LOWERCASE_FONT_BITMAP[];
  9. #define  lowercase_table LOWERCASE_FONT_BITMAP
  10. #define FONT_LEN_EXTERNAL_TWO_BYTE  14
  11. #define FONT_LEN_INTERNAL_OSD       9
  12. #if defined(EUROPE_FOREIGN_LANGUAGES) || defined(MIDDLE_EUROPE_LANGUAGES) || defined (SUPPORT_TURKISH_LANGUAGES) || defined ( USE_CYRILLIC_FONT )
  13.     #define FONT_LEN_EXTERNAL_ONE_BYTE  6
  14. #else
  15.     #define FONT_LEN_EXTERNAL_ONE_BYTE  FONT_LEN_INTERNAL_OSD
  16. #endif
  17. extern void EnlargeFontSizeToDouble( UINT8 *pDest, const UINT8 *pSrc, BYTE uiWidth, BYTE uiHeight );
  18. extern void ResampleWidthFrom12PixelTo16Pixel( UINT8* pDest, const UINT8* pSrc, UINT32 uiHeight );
  19. UINT32 OSD_ShowChar(int x, int y, BYTE c, BYTE fontcolor,BYTE r) 
  20. {
  21. BYTE    *pFont;
  22.     BYTE width,height;
  23.     UINT8 font1[48];
  24.     int   index;
  25.     int i;
  26.     
  27.     if ((c >= 'a') && (c <= 'z'))//litter case 
  28.     { 
  29.         width   = 16;
  30.         height  = 24;
  31.         index   = 48 * (c - 97);
  32.         
  33.         //draw a character
  34.      for (i = 0; i < 24; i++)
  35.      {
  36.      UINT8 cc1,cc2;
  37.     
  38.      cc1 = lowercase_table[index+i*2];
  39.      cc2 = lowercase_table[index+i*2+1];
  40.     
  41.      font1[i*2]=cc1;
  42.      font1[i*2+1]=cc2;
  43.     
  44.      }
  45.      osd_draw_gbfont( 0, (UINT8 *)font1, x, y, width, height, fontcolor, r );
  46.     }
  47.     
  48.     else
  49.     {
  50.      pFont = get_font_entry(0,c);
  51.         width = pFont[0];
  52.         height = pFont[1];
  53.         osd_draw_gbfont( 1, (UINT8 *)pFont, x, y, width, height, fontcolor, r );
  54.     }
  55.     return FONT_LEN_INTERNAL_OSD;
  56. }
  57. UINT32 OSD_FontShowChar(int x, int y, const BYTE* pBmp, BYTE fontcolor,BYTE r )
  58. {   // 2004/09/23 yltseng
  59.     UINT8   aFont1[ 24 ];
  60.     UINT8   aFont2[ 96 ];    // 24 * 2 * 2
  61.     ENUM_FONT_TYPE enType = GetFontType();
  62.     if( enType == FONT_BIG5   || enType == FONT_BIG5_COMMON || 
  63.         enType == FONT_GB2312 || enType == FONT_JIS || 
  64.         enType == FONT_KSC    || enType == FONT_RUSSIAN )
  65.     {
  66.         ResampleWidthFrom12PixelTo16Pixel( aFont1, pBmp, 12 );
  67.         EnlargeFontSizeToDouble( (UINT8 *)aFont2, (UINT8 *)aFont1, 16, 12 );
  68.         osd_draw_gbfont( 0, (UINT8 *)aFont2, x, y, 32, 24, fontcolor, r );
  69.         
  70.         return FONT_LEN_EXTERNAL_TWO_BYTE;
  71.     }
  72.     else if( enType == FONT_ISO_8859_1 || enType == FONT_ISO_8859_2 || enType == FONT_ISO_8859_5|| enType == FONT_ISO_8859_9 )
  73.     {
  74.         ResampleWidthFrom12PixelTo16Pixel( aFont2, pBmp, 24 );
  75.         osd_draw_gbfont( 0, (UINT8 *)aFont2, x, y, 16, 24, fontcolor, r );
  76.         
  77.         return FONT_LEN_EXTERNAL_ONE_BYTE;
  78.     }
  79.     return 0;
  80.     //wanghaoying add from 'else' sequence 2005-1-5 15:33
  81.     //for this function did nothing while enType = FONT_NONE
  82.     //such satuation will happen if undef SUPPORT_FONT_UTIL
  83.     //NOTICE: I don't know wheather should return 0
  84. }
  85. void OSD_ShowString( int x, int y, const char *s, BYTE fontcolor, BYTE r )
  86. {
  87.     const BYTE* p   = s;
  88. while( *p )
  89. {
  90.         const UINT8* pBmp   = NULL;
  91.         UINT32 uiRtnVal     = GetCharacterBmp( p, &pBmp );
  92.         
  93.         if( uiRtnVal != FONT_NOT_IN_RANGE )
  94.         {
  95.             x += OSD_FontShowChar( x, y, pBmp, fontcolor, r );  // 2004/09/23 yltseng
  96.             if( uiRtnVal == FONT_ONE_BYTE )
  97.                 p++;
  98.             else 
  99.                 p += 2;
  100.         }
  101.         else
  102.         {
  103.     BYTE    c   = *p;
  104.             if ( (c < 32) || (c > 126) )
  105.                 c = '_';
  106.             x += OSD_ShowChar( x, y, c, fontcolor, r);
  107.             p++;
  108.         }
  109. if( x > region[r].osd_w ) 
  110. break;
  111. }
  112. }
  113.     #ifdef SUPPORT_OSDSRT
  114. /*
  115.  *Function:display text to osd,display max line:7,display max chinese font in a line:19
  116.  *Parameter:*p:input string
  117.  *           Size:length of string
  118.  *Return:none      
  119.  *Creator:suqiaoli
  120.  *Date:2004-3-17
  121.  *Date:2004/09/06 yltseng modify
  122. */
  123. void ShowOSDText(const char *p,  UINT16 size)
  124. {
  125.     // 2004/09/03 yltseng
  126.     #define MAX_WORD    50
  127. #ifdef SDRAM_16Mb_Mode
  128.     #define MAX_LINE    2
  129. #else
  130. #define MAX_LINE 7
  131. #endif
  132. BYTE*pStr = (BYTE *)p;
  133. BYTE c,c1;
  134. BYTE *old_pStr;
  135. int old_i_len;
  136. int  show_line = -1;
  137. int  show_word = 0;
  138. UINT16  nsize=0;
  139. int  i_len;
  140. int len[MAX_LINE];
  141. int i;
  142. int count;
  143. //All char will be put into this str array
  144. //if string long,it will newline
  145. BYTE str[MAX_LINE][MAX_WORD];
  146. osd_tog_region( 3, OSD_ON );
  147. //Read and parse each char,display them on osd
  148. //include function:display more lines,newline,
  149. //when string length>276,it will newline
  150. while(nsize<size)
  151. {
  152. show_word = 0;
  153. i_len = 0;
  154. count = 0;
  155. show_line++;
  156.         if( show_line > MAX_LINE - 1 )//most displayed line is 7 line
  157.         {
  158.             show_line = MAX_LINE - 1;
  159.             break;
  160.         }
  161.         
  162. //read string to string buffer,except "return","next line"
  163. while(((*pStr) != 'r')/*&& ((*pStr)!='n')*/ ) 
  164. {
  165. c = *pStr;
  166. c1 = *(pStr + 1);
  167.     
  168.             UINT32 uiRtnVal = IsInCharacterSet( pStr );
  169.            if(c=='n')//wangap add 2005/1/25 
  170.             {          //if 'n' not jump next line just continue
  171.               pStr++;
  172.   nsize++;
  173.   continue;
  174. }
  175.             if( uiRtnVal == FONT_NOT_IN_RANGE )
  176.             {
  177.                 if ((c >= 32) && (c <= 126))
  178.                     uiRtnVal = FONT_ONE_BYTE;
  179.             }
  180.             if( uiRtnVal == FONT_TWO_BYTE )
  181. {
  182. str[show_line][show_word]=c;
  183. str[show_line][show_word+1]=c1;
  184. show_word+= 2;
  185. i_len+= FONT_LEN_EXTERNAL_TWO_BYTE;
  186. nsize+= 2;
  187. pStr += 2;
  188. if((((i_len-count*9)%2==0)&&(i_len>275))||(((i_len-count*9)%2==0)&&(i_len>276)))
  189. break;
  190. }
  191. else if( uiRtnVal == FONT_ONE_BYTE )
  192.             {
  193. old_pStr = pStr;
  194.     old_i_len = i_len;
  195. str[show_line][show_word]=c;
  196. show_word += 1;
  197. i_len += FONT_LEN_EXTERNAL_ONE_BYTE;//len
  198. nsize += 1;
  199. pStr += 1;
  200. if(c == 32) //not to cut off a long word,according to space's position
  201. {
  202.          do
  203.          {
  204.              old_pStr ++;
  205.              old_i_len += FONT_LEN_EXTERNAL_ONE_BYTE;//len
  206.              if((*old_pStr == 32)|| (*old_pStr == 'r')||(old_i_len > 276))
  207.                  break;
  208.          
  209.          }while(1);
  210.     
  211.          if (old_i_len > 276)
  212.              break;
  213. }
  214. else
  215. {
  216.     count++;
  217.     if (i_len>276)
  218.     break;
  219.     }
  220.             }
  221.             else
  222.             {
  223. c = '?';
  224. str[show_line][show_word]=c;
  225. show_word+= 1;
  226. nsize+= 1;
  227. i_len+= FONT_LEN_INTERNAL_OSD;
  228. pStr += 1;
  229. count++;
  230. if (i_len>276)
  231. break;
  232.             }
  233.        
  234. }//while(((*pStr) != 'r')&& ((*pStr)!='n') )
  235.        
  236. if(((*pStr) == 'r')/*||((*pStr) == 'n')*/)//count nsize,'r':when "return",'n':next line is blank
  237. {                  //'n' just count nsize not jump next line wangap add 2005/1/25
  238. pStr++;
  239. nsize++;
  240. }
  241. len[show_line]=i_len;
  242. str[show_line][show_word]='';
  243. if( show_word <= 0 )//if blank line,string line will skip
  244. show_line--;
  245.         
  246.     } //while(nsize<size)
  247. int    width    = (int) region[3].osd_w;
  248. int    height   = (int) region[3].osd_h/MAX_LINE;
  249.     for( i = show_line; i >= 0; i-- )//display each line srt title
  250.     {
  251.         int xstart = ( width - len[i] ) / 2;
  252.         int ystart = height * ( MAX_LINE - ( show_line - i ) - 1 );
  253.         OSD_ShowString( xstart, ystart, str[i], 2, 3 );
  254.     }
  255. }
  256.     #endif //#ifdefSUPPORT_OSDSRT
  257. #endif //#if defined( OSD_FONT_API ) && defined( SUPPORT_FONT_UTIL )