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

DVD

开发平台:

C/C++

  1. /*************************************************************
  2. ** FILE
  3. ** osd_show_font.c
  4. **
  5. ** DESCRIPTION
  6. ** This file contains main functions for show font on OSD.
  7. **
  8. ** NOTE:Now use OSDShowFont.c to replace this file... 20050124
  9. **
  10. ** Create:   liweihua 2004-03-19
  11. ** Update:   suqiaoli 2004-03-26
  12. ** Update:   suqiaoli 2004-04-02  
  13. **           add new function:srt title can display many Europe languages  
  14. ** Update:   suqiaoli 2004-4-28 
  15. **           add new function:display lower letter in OSD_FONT_API;
  16. **                            not to cut off a long word,it can move next line;  
  17. **                            only display Russian language not Chinese,in order to reduce code.
  18. ** Update:   suqiaoli add new function:Support Japanese font
  19. **************************************************************/
  20. #include "config.h"
  21. #include "regmap.h"
  22. #include "global.h"
  23. #include "memmap.h"
  24. #include "func.h"
  25. #include "stdlib.h"
  26. #include "user_init.h"
  27. #if defined( OSD_FONT_API ) && !defined( SUPPORT_FONT_UTIL )    // 2004/09/10 yltseng
  28. #include "font_lowercase.c" //display lower letter ,suqiaoli add 2004-4-28
  29. extern void osd_draw_gbfont(BYTE vid, BYTE pFont[], int xStart, int yStart, unsigned int  fwidth, unsigned int  fhight, BYTE fontcolor,BYTE number);
  30. extern const unsigned char LOWERCASE_FONT_BITMAP[];
  31. #define  lowercase_table LOWERCASE_FONT_BITMAP
  32. #if defined( USE_BIG5_FONT )
  33. extern const unsigned char JMT_BIG5_12X12_FONT_BITMAP[];
  34. #define  big5font_table     JMT_BIG5_12X12_FONT_BITMAP
  35. #elif defined( USE_BIG5_COMMON_FONT )
  36. extern const unsigned char JMT_BIG5_12X12_FONT_BITMAP_COMMON[];
  37. #define  big5font_table     JMT_BIG5_12X12_FONT_BITMAP_COMMON
  38. #elif defined USE_GB2312_FONT
  39. extern const unsigned char GUO_GB2312_12X12_FONT_BITMAP[];
  40. #define  hzfont_table     GUO_GB2312_12X12_FONT_BITMAP
  41. #endif
  42. #if defined USE_RUSSIAN_LANGUAGE
  43. extern const unsigned char GUO_GB2312_Russian_12X12_FONT_BITMAP[];
  44. #define  Russian_font_table GUO_GB2312_Russian_12X12_FONT_BITMAP
  45. #endif
  46. #if defined EUROPE_FOREIGN_LANGUAGES //suqiaoli add 2004-4-2
  47. extern const unsigned char ISO_8859_1_12X24_FONT_BITMAP[];
  48. #define  isofont_table ISO_8859_1_12X24_FONT_BITMAP
  49. #endif
  50. #if defined MIDDLE_EUROPE_LANGUAGES //suqiaoli add 2004-7-13
  51. extern const unsigned char ISO_8859_2_12X24_FONT_BITMAP[];
  52. #define  isofont_table ISO_8859_2_12X24_FONT_BITMAP
  53. #endif
  54. #if defined SUPPORT_TURKISH_LANGUAGES //suqiaoli add 2004-9-1
  55. extern const unsigned char ISO_8859_9_12X24_FONT_BITMAP[];
  56. #define  isofont_table ISO_8859_9_12X24_FONT_BITMAP
  57. #endif
  58. #if defined USE_JAPANESE_FONT
  59. extern const unsigned char  JP_JISX0213_12X12_FONT_BITMAP[];
  60. #define Japanfont_table JP_JISX0213_12X12_FONT_BITMAP
  61. #endif
  62. #if defined USE_KOREAN_FONT
  63. extern const unsigned char  KO_KSC_12X12_FONT_BITMAP[];
  64. #define Koreanfont_table KO_KSC_12X12_FONT_BITMAP
  65. #endif
  66. #if defined(EUROPE_FOREIGN_LANGUAGES) || defined(MIDDLE_EUROPE_LANGUAGES) || defined (SUPPORT_TURKISH_LANGUAGES)
  67.     #define  FONT_LEN 6
  68. #else
  69.     #define  FONT_LEN 9
  70. #endif
  71. extern void EnlargeFontSizeToDouble( UINT8 *pDest, const UINT8 *pSrc, BYTE uiWidth, BYTE uiHeight );
  72. #if defined(USE_GB2312_FONT)||defined(USE_RUSSIAN_LANGUAGE)
  73. void OSD_GBShowChar(int x, int y, BYTE c, BYTE c1, BYTE fontcolor,BYTE r)
  74. {
  75. int index, i,i4x = 0;
  76.     UINT8 font1[24];
  77.     UINT8 font2[24*2*2];
  78. BYTE width,height;
  79.     width=16;
  80.     height=12;
  81. index = 18 * ((c - 161) * 94 + c1 - 161);
  82. //draw a character
  83. for (i = 0; i < 12; i++)
  84. {
  85. BYTE cc1, cc2;
  86. if(i % 2)
  87. {
  88. i4x = i4x + 2;
  89. #if defined(USE_GB2312_FONT)
  90. cc1 = hzfont_table[index + i4x];
  91. cc2 = hzfont_table[index + i4x - 1] & 0x0f;
  92. #elif  defined(USE_RUSSIAN_LANGUAGE)
  93.             cc1 = Russian_font_table[index + i4x];
  94. cc2 = Russian_font_table[index + i4x - 1] & 0x0f;
  95. #endif
  96.             font1[i*2]=cc1;
  97.             font1[i*2+1]=(cc2<<4);
  98. }
  99. else
  100. {
  101. i4x = i * 3 / 2;
  102. #if defined(USE_GB2312_FONT)
  103. cc1 = hzfont_table[index + i4x];
  104. cc2 = hzfont_table[index + i4x + 1] & 0xf0;
  105. #elif  defined(USE_RUSSIAN_LANGUAGE)
  106. cc1 = Russian_font_table[index + i4x];
  107. cc2 = Russian_font_table[index + i4x + 1] & 0xf0;
  108. #endif
  109.             font1[i*2]=cc1;
  110.             font1[i*2+1]=(cc2);
  111. }
  112. }
  113.     // 2004/07/21 yltseng
  114.     //mutiply the 12*12 size font to 24*24 size font
  115.     EnlargeFontSizeToDouble( (UINT8 *)font2, (UINT8 *)font1, width, height );
  116.     osd_draw_gbfont( 0, (UINT8 *)font2, x, y, width*2, height*2, fontcolor, r );
  117. }
  118. #endif
  119. #if defined( USE_BIG5_FONT ) || defined( USE_BIG5_COMMON_FONT )
  120. void OSD_Big5ShowChar(int x, int y, BYTE c, BYTE c1, BYTE fontcolor,BYTE r)
  121. {
  122.     // 2004/09/10 yltseng
  123. int index, i, i4x = 0;
  124.     UINT8 font1[24];
  125. int seq;
  126. BYTE CL, CH;
  127.     UINT8 font2[24*2*2];
  128. BYTE width,height;
  129.     width=16;
  130.     height=12;
  131. CL = c1;
  132. CH = c;
  133. seq = 0;
  134. CL -= (CL < 127 ? 64 : 98);
  135.     seq = ( CH - 161 ) * 157 + CL;
  136. index = seq * 18;
  137.    
  138. //draw a character
  139. for (i = 0; i < 12; i++)
  140. {
  141. BYTE cc1, cc2;
  142. if(i % 2)
  143. {
  144. i4x = i4x + 2;
  145. cc1 = big5font_table[index + i4x];
  146. cc2 = big5font_table[index + i4x - 1] & 0x0f;
  147.             font1[i*2]=cc1;
  148.             font1[i*2+1]=(cc2<<4);
  149. }
  150. else
  151. {
  152. i4x = i * 3 / 2;
  153. cc1 = big5font_table[index + i4x];
  154. cc2 = big5font_table[index + i4x+1] & 0xf0;
  155.             font1[i*2]=cc1;
  156.             font1[i*2+1]=(cc2);
  157. }
  158.     }
  159.     // 2004/07/21 yltseng
  160.     //mutiply the 12*12 size font to 24*24 size font
  161.     EnlargeFontSizeToDouble( (UINT8 *)font2, (UINT8 *)font1, width, height );
  162.     osd_draw_gbfont( 0, (UINT8 *)font2, x, y, width*2, height*2, fontcolor, r );
  163. }
  164. #endif
  165. #ifdef USE_JAPANESE_FONT
  166. void OSD_JISShowChar(int x, int y, BYTE c, BYTE c1, BYTE fontcolor,BYTE r)
  167. {
  168.     // 2004/07/21 yltseng
  169. int     i       = 0;
  170.     int     i4x     = 0;
  171.     BYTE    width   = 16;
  172.     BYTE    height  = 12;
  173.     UINT8   font1[ 24 ];
  174. UINT8   font2[ 24 * 2 * 2 ];
  175.    
  176.     if(c >= 0xE0) c = c - 0x40;
  177.     
  178.     if(c1 >= 0x80) c1 = c1-1;
  179.     
  180.     i4x = 18 * ((c-0x81 )* 188 + c1-0x40);
  181.     for( i = 0; i < 12; i++ )
  182.     {
  183. if( i % 2 )
  184. {
  185.             font1[ i * 2 ]      = Japanfont_table[ i4x ];
  186.             font1[ i * 2 + 1 ]  = ( ( Japanfont_table[ i4x - 1 ] & 0x0f ) << 4 );
  187.             i4x += 1;
  188. }
  189. else
  190. {
  191.             font1[ i * 2 ]      = Japanfont_table[ i4x ];
  192.             font1[ i * 2 + 1 ]  = Japanfont_table[ i4x + 1 ] & 0xf0;
  193.             i4x += 2;
  194. }   
  195.     }
  196.     //mutiply the 12*12 size font to 24*24 size font
  197.     EnlargeFontSizeToDouble( (UINT8 *)font2, (UINT8 *)font1, width, height );
  198.     osd_draw_gbfont( 0,(UINT8 *)font2, x, y, width * 2, height * 2, fontcolor, r );
  199. }
  200.     
  201. #endif
  202. #ifdef USE_KOREAN_FONT
  203. void OSD_KSCShowChar(int x, int y, BYTE c, BYTE c1, BYTE fontcolor,BYTE r)
  204. {
  205.     // 2004/07/21 yltseng
  206. int     i       = 0;
  207.     int     i4x     = 0;
  208.     BYTE    width   = 16;
  209.     BYTE    height  = 12;
  210.     UINT8   font1[ 24 ];
  211. UINT8   font2[ 24 * 2 * 2 ];
  212.    
  213.     if ((c1 >= 0x41) && (c1 <= 0x5A)) 
  214.         i4x = 18 * ((c-0x81 )* 178 + (c1-0x41));
  215.     else if ((c1 >= 0x61) && (c1 <= 0x7A))
  216.         i4x = 18 * ((c-0x81 )* 178 + (c1-0x61+26));
  217.     else if ((c1 >= 0x81) && (c1 <= 0xFE))
  218.         i4x = 18 * ((c-0x81 )* 178 + (c1-0x81+52));
  219.     for( i = 0; i < 12; i++ )
  220.     {
  221. if( i % 2 )
  222. {
  223.             font1[ i * 2 ]      = Koreanfont_table[ i4x ];
  224.             font1[ i * 2 + 1 ]  = ( ( Koreanfont_table[ i4x - 1 ] & 0x0f ) << 4 );
  225.             i4x += 1;
  226. }
  227. else
  228. {
  229.             font1[ i * 2 ]      = Koreanfont_table[ i4x ];
  230.             font1[ i * 2 + 1 ]  = Koreanfont_table[ i4x + 1 ] & 0xf0;
  231.             i4x += 2;
  232. }   
  233.     }
  234.     //mutiply the 12*12 size font to 24*24 size font
  235.     EnlargeFontSizeToDouble( (UINT8 *)font2, (UINT8 *)font1, width, height );
  236.     osd_draw_gbfont( 0, (UINT8 *)font2, x, y, width * 2, height * 2, fontcolor, r );
  237. }
  238. #endif
  239. #if defined(EUROPE_FOREIGN_LANGUAGES) || defined(MIDDLE_EUROPE_LANGUAGES) || defined (SUPPORT_TURKISH_LANGUAGES)
  240. void OSD_ISOShowChar(int x, int y, BYTE c, BYTE fontcolor,BYTE r)
  241. {
  242.     BYTE  width   = 16;
  243.     BYTE    height  = 24;
  244.     int     i4x     = 0;
  245.     int     i       = 0;
  246.     UINT8   font1[48];
  247.     
  248.     if ( ( c >= 32 ) && ( c <= 126 ) ) 
  249.      i4x = 36 * ( c - 32 );
  250.     else if( ( c >= 160 ) && ( c <= 255 ) )
  251.      i4x = 36 * ( c - 65 );
  252. for( ; i < 24; i++ )
  253. {
  254. if( i % 2 )
  255. {
  256.             font1[ i * 2 ]      = isofont_table[ i4x ];
  257.             font1[ i * 2 + 1 ]  = ( ( isofont_table[ i4x - 1 ] & 0x0f ) << 4 );
  258.             i4x += 1;
  259. }
  260. else
  261. {
  262.             font1[ i * 2 ]      = isofont_table[ i4x ];
  263.             font1[ i * 2 + 1 ]  = isofont_table[ i4x + 1 ] & 0xf0;
  264.             i4x += 2;
  265. }   
  266.     }
  267.     osd_draw_gbfont( 0, (UINT8 *)font1, x, y, width, height, fontcolor, r );
  268. }
  269. #endif
  270. void OSD_ShowChar(int x, int y, BYTE c, BYTE fontcolor,BYTE r) 
  271. {
  272. BYTE    *pFont;
  273.     BYTE width,height;
  274.     UINT8 font1[48];
  275.     int   index;
  276.     int i;
  277.     
  278.     if ((c >= 'a') && (c <= 'z'))//litter case 
  279.     { 
  280.         width = 16;
  281.         height = 24;
  282.         index = 48 * (c - 97);
  283.         
  284.         //draw a character
  285.      for (i = 0; i < 24; i++)
  286.      {
  287.      UINT8 cc1,cc2;
  288.     
  289.      cc1=lowercase_table[index+i*2];
  290.      cc2=lowercase_table[index+i*2+1];
  291.     
  292.      font1[i*2]=cc1;
  293.      font1[i*2+1]=cc2;
  294.     
  295.      }
  296.      osd_draw_gbfont( 0, (UINT8 *)font1, x, y, width, height, fontcolor, r );
  297.     }
  298.     
  299.     else
  300.     {
  301.      pFont = get_font_entry(0,c);
  302.         width = pFont[0];
  303.         height = pFont[1];
  304.         osd_draw_gbfont( 1, (UINT8 *)pFont, x, y, width, height, fontcolor, r );
  305.     }
  306. }
  307. void OSD_ShowString(int x, int y, const char *s, BYTE fontcolor, BYTE r)
  308. {
  309. int i = 0;
  310. BYTE* p = (BYTE *)s;
  311. //sometime may exceed 25 chinese
  312. unsigned char ss[50];
  313. unsigned char* ss_ptr = ss;
  314. strcpy(ss_ptr, p);
  315. while (*p)
  316. {
  317. BYTE    c;
  318. BYTE    c1;
  319. int     iRes = 0;
  320.         
  321. //  which character
  322. c = *p;
  323. c1 = *(p + 1);
  324. #if defined(USE_KOREAN_FONT)
  325.         if(((c >= 0x81) && (c <= 0xFE)) && ((c1 >= 0x41 && c1 <= 0x5A) || (c1 >= 0x61 && c1 <= 0x7A)|| (c1 >= 0x81 && c1 <= 0xFE))) 
  326.         {
  327.             //KSC code
  328. iRes = 5;
  329.         }
  330.         else  
  331. #endif
  332.             
  333. #if defined(USE_JAPANESE_FONT)
  334.         if (((c >= 0x81 && c <= 0x9F)||(c >= 0xE0 && c <= 0xFC)) && ((c1 >= 0x40) && (c1 <= 0xFC)))  //JIS code           
  335.         {
  336.             iRes = 4;
  337.         }
  338.         else  
  339. #endif
  340. #if defined(USE_GB2312_FONT)||defined(USE_RUSSIAN_LANGUAGE)
  341. if (((c >= 0xA1) && (c <= 0xF8)) && ((c1 >= 0xA1) && (c1 < 0xFF))) // GB code            
  342.  {
  343. iRes = 3;
  344.  }
  345.  else  
  346. #endif
  347. #if defined( USE_BIG5_FONT ) || defined( USE_BIG5_COMMON_FONT )
  348. if(((c >= 0xA1) && (c <= 0xF9)) && ((c1 >= 0x40 && c1 <= 0x7E) || (c1 >= 0xA1 && c1 <= 0xFE))) // Big5 code
  349. {
  350. iRes = 2;
  351. }
  352. else 
  353. #endif
  354. #if defined(EUROPE_FOREIGN_LANGUAGES) || defined(MIDDLE_EUROPE_LANGUAGES) || defined (SUPPORT_TURKISH_LANGUAGES)
  355. if ((c >= 32) && (c <= 255)) // ISO 8859-1 code
  356. {
  357. iRes = 1;
  358. }
  359. #else
  360. if ((c >= 32) && (c <= 126)) // ASC code( before 127)
  361. {
  362. iRes = 1;
  363. }
  364. #endif
  365. else //other
  366. {
  367. iRes = 0;
  368. c = '_';
  369. }
  370. if ((iRes == 0) || (iRes == 1))
  371. {
  372.             p++;     
  373.    
  374. #if !defined(EUROPE_FOREIGN_LANGUAGES) && !defined(MIDDLE_EUROPE_LANGUAGES) && !defined (SUPPORT_TURKISH_LANGUAGES)
  375.             i += 9;
  376.     #if defined(SUPPORT_CHINESE_FONT)||defined(USE_RUSSIAN_LANGUAGE)||defined(USE_JAPANESE_FONT)||defined(USE_KOREAN_FONT)// Clead
  377. if ((c == '!') || (c == '"') || (c == '#') || (c == '$') ||
  378. (c == '&') || (c == ''') || (c == '(') || (c == ')') ||
  379. (c == ',') || (c == ';') || (c == '=') || (c == '^'))
  380.         #if defined(USE_GB2312_FONT)||defined(USE_RUSSIAN_LANGUAGE)
  381. {
  382. c1 = 0x03 + 0xa0;
  383. c = c + 0x80;
  384. OSD_GBShowChar((x+i), y, c1, c, fontcolor, r);
  385. }
  386. else
  387.         #elif defined( USE_BIG5_FONT ) || defined( USE_BIG5_COMMON_FONT )
  388. {
  389. if(c < 114)
  390. {
  391. c1 = 0xa2;
  392. c = c + 0x8e;
  393. }
  394. else
  395. {
  396. c1 = 0xa3;
  397. c = c - 113 + 0x40;
  398. }
  399. OSD_Big5ShowChar((x+i), y, c1, c, fontcolor, r);
  400. }
  401. else
  402.     #elif defined(USE_JAPANESE_FONT)
  403.             {
  404.                 if (c == '!') c =0x49; 
  405.                 else if (c == '#') c =0x94;
  406.                 else if (c == '$') c =0x90;
  407.                 else if (c == '(') c =0x69;
  408.                 else if (c == ')') c =0x6A;
  409.                 else if (c == ',') c =0x43;
  410.                 else if (c == ';') c =0x47;
  411.                 else if (c == '=') c =0x81;
  412.                 else if (c == '^') c =0xC8;
  413.                 else if (c == '&') c =0x95;
  414.                 
  415.                 c1 = 0x81;
  416.                 
  417.                 OSD_JISShowChar((x+i), y, c1,c, fontcolor, r);
  418.             }
  419.             else
  420.         #elif defined(USE_KOREAN_FONT)
  421.             {
  422.                 if (c == '!') c =0x49; 
  423.                 else if (c == '#') c =0x94;
  424.                 else if (c == '$') c =0x90;
  425.                 else if (c == '(') c =0x69;
  426.                 else if (c == ')') c =0x6A;
  427.                 else if (c == ',') c =0x43;
  428.                 else if (c == ';') c =0x47;
  429.                 else if (c == '=') c =0x81;
  430.                 else if (c == '^') c =0xC8;
  431.                 else if (c == '&') c =0x95;
  432.                 
  433.                 c1 = 0x81;
  434.                 
  435.                 OSD_KSCShowChar((x+i), y, c1,c, fontcolor, r);
  436.             }
  437.             else
  438.         #endif
  439.     
  440.     #endif
  441. OSD_ShowChar((x+i), y, c, fontcolor, r);
  442.     
  443. #else//#ifndef EUROPE_FOREIGN_LANGUAGES
  444.         i += 6;
  445.      OSD_ISOShowChar((x+i), y, c, fontcolor, r);
  446.     
  447. #endif//#ifndef EUROPE_FOREIGN_LANGUAGES
  448.     
  449. }
  450. #if defined( USE_BIG5_FONT ) || defined( USE_BIG5_COMMON_FONT )
  451. else if(iRes == 2)  //BIG5 code
  452. {
  453. OSD_Big5ShowChar( (x+i), y, c, c1, fontcolor, r);
  454. i += 14;
  455. p += 2;
  456. }
  457. #endif
  458. #if  defined(USE_GB2312_FONT)||defined(USE_RUSSIAN_LANGUAGE)
  459. else if (iRes == 3) //GB code
  460. {
  461. OSD_GBShowChar((x+i), y, c, c1, fontcolor, r);
  462. i += 14;
  463. p += 2;
  464. #endif
  465. #ifdef USE_JAPANESE_FONT
  466. else if(iRes == 4)  //JIS code
  467. {
  468. OSD_JISShowChar( (x+i), y, c, c1, fontcolor, r);
  469. i += 14;
  470. p += 2;
  471. }
  472. #endif
  473. #ifdef USE_KOREAN_FONT
  474. else if(iRes == 5)  //KSC code
  475. {
  476. OSD_KSCShowChar( (x+i), y, c, c1, fontcolor, r);
  477. i += 14;
  478. p += 2;
  479. }
  480. #endif
  481.         // for limiting the length of OSD_ShowString
  482.         // the following number 14 is for limiting display half of chinese font
  483. if (i > (region[r].osd_w-x-14)) 
  484. break; 
  485. }
  486. }
  487. #ifdef SUPPORT_OSDSRT
  488. /*
  489.  *Function:display text to osd,display max line:7,display max chinese font in a line:19
  490.  *Parameter:*p:input string
  491.  *           Size:length of string
  492.  *Return:none      
  493.  *Creator:suqiaoli
  494.  *Date:2004-3-17
  495.  *Date:2004/09/10 yltseng modify
  496. */
  497. void ShowOSDText(const char *p,  UINT16 size)
  498. {
  499.     // 2004/09/03 yltseng
  500.     #define MAX_WORD    50
  501. #ifdef SDRAM_16Mb_Mode
  502.     #define MAX_LINE    2
  503. #else
  504. #define MAX_LINE 7
  505. #endif
  506. BYTE*pStr = (BYTE *)p;
  507. BYTE c,c1;
  508. BYTE *old_pStr;
  509. int old_i_len;
  510. int  show_line = -1;
  511. int  show_word = 0;
  512. UINT16  nsize=0;
  513. int  i_len;
  514. int xstart,ystart;
  515. int len[MAX_LINE];
  516. int i;
  517. int count;//ASCII count in a line
  518. int    width;
  519. int    height;
  520. width=(int) region[3].osd_w;
  521. height=(int) region[3].osd_h/MAX_LINE;  // 2004/09/03 yltseng
  522. //All char will be put into this str array
  523. //if string long,it will newline
  524. BYTE str[MAX_LINE][MAX_WORD];
  525. osd_tog_region(3,OSD_ON);
  526. //Read and parse each char,display them on osd
  527. //include function:display more lines,newline,
  528. //when string length>276,it will newline
  529. while(nsize<size)
  530. {
  531. show_word = 0;
  532. i_len = 0;
  533. count = 0;
  534. show_line++;
  535.         if( show_line > MAX_LINE - 1 )//most displayed line is 7 line
  536.         {
  537.             show_line = MAX_LINE - 1;
  538.             break;
  539.         }
  540. //read string to string buffer,except "return","next line"
  541. while(((*pStr) != 'r')&& ((*pStr)!='n') ) 
  542. {
  543. c = *pStr;
  544. c1 = *(pStr + 1);
  545. //Double ASCII code
  546. #if defined(USE_GB2312_FONT) || defined(USE_RUSSIAN_LANGUAGE)||defined(USE_BIG5_FONT)||defined(USE_BIG5_COMMON_FONT)||defined(USE_JAPANESE_FONT)||defined(USE_KOREAN_FONT)
  547.     #if defined(USE_GB2312_FONT) || defined(USE_RUSSIAN_LANGUAGE)
  548. if (((c >= 0xA1) && (c <= 0xF8)) && ((c1 >= 0xA1) && (c1 < 0xFF)))  //gb2312
  549.     #elif defined(USE_BIG5_FONT) || defined( USE_BIG5_COMMON_FONT )
  550. if(((c >= 0xA1) && (c <= 0xF9)) && ((c1 >= 0x40 && c1 <= 0x7E) || (c1 >= 0xA1 && c1 <= 0xFE))) // big5 
  551.     #elif defined(USE_JAPANESE_FONT)
  552.             if (((c >= 0x81 && c <= 0x9F)||(c >= 0xE0 && c <= 0xFC)) && ((c1 >= 0x40) && (c1 <= 0xFC)))             
  553.     #elif defined(USE_KOREAN_FONT)
  554.             if(((c >= 0x81) && (c <= 0xFE)) && ((c1 >= 0x41 && c1 <= 0x5A) || (c1 >= 0x61 && c1 <= 0x7A)|| (c1 >= 0x81 && c1 <= 0xFE)))                 
  555.     #endif
  556. {
  557. str[show_line][show_word]=c;
  558. str[show_line][show_word+1]=c1;
  559. show_word+= 2;
  560. i_len+= 14;
  561. nsize+= 2;
  562. pStr += 2;
  563. if((((i_len-count*9)%2==0)&&(i_len>275))||(((i_len-count*9)%2==0)&&(i_len>276)))
  564. break;
  565. }
  566. else
  567. #endif
  568. //Single ASCII code
  569. #if defined(EUROPE_FOREIGN_LANGUAGES) || defined(MIDDLE_EUROPE_LANGUAGES) || defined (SUPPORT_TURKISH_LANGUAGES)
  570. if (((c >= 32) && (c <= 126)) ||((c >= 160) && (c <= 255)))// ISO 8859-1 code
  571. #else
  572.             if ((c >= 32) && (c <= 126))
  573. #endif
  574. {
  575. old_pStr = pStr;
  576.     old_i_len = i_len;
  577. str[show_line][show_word]=c;
  578. show_word += 1;
  579. i_len += FONT_LEN;//len
  580. nsize += 1;
  581. pStr += 1;
  582. if(c == 32) //not to cut off a long word,according to space's position
  583. {
  584.          do
  585.          {
  586.              old_pStr ++;
  587.              old_i_len += FONT_LEN;//len
  588.              if((*old_pStr == 32)|| (*old_pStr == 'r')||(old_i_len > 276))
  589.                  break;
  590.          
  591.          }while(1);
  592.     
  593.          if (old_i_len > 276)
  594.              break;
  595. }
  596. else
  597. {
  598.     count++;
  599.     if (i_len>276)
  600.     break;
  601.     }
  602. }
  603. //other code
  604. else
  605. {
  606. c = '_';
  607. str[show_line][show_word]=c;
  608. show_word+= 1;
  609. nsize+= 1;
  610. i_len+= 9;
  611. pStr += 1;
  612. count++;
  613. if (i_len>276)
  614. break;
  615. }
  616. }//while(((*pStr) != 'r')&& ((*pStr)!='n') )
  617. if(((*pStr) == 'r')||((*pStr) == 'n'))//count nsize,'r':when "return",'n':next line is blank
  618. {
  619. pStr++;
  620. nsize++;
  621. }
  622. len[show_line]=i_len;
  623. str[show_line][show_word]='';
  624. if( show_word <= 0 )//if blank line,string line will skip
  625. show_line--;
  626. }//while(nsize<size)
  627.     for(i=show_line;i>=0;i--)//display each line srt title
  628.     {
  629.         xstart=(width-len[i])/2;
  630.         ystart=height*(MAX_LINE-(show_line-i)-1);
  631.         OSD_ShowString(xstart,ystart,str[i],2,3);
  632.     }
  633. }
  634. #endif //#ifdef SUPPORT_OSDSRT
  635. #endif//#ifdef OSD_FONT_API