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

DVD

开发平台:

C/C++

  1. /*
  2. ** FILE
  3. ** osd1.c
  4. **
  5. ** DESCRIPTION
  6. ** control OSD interface.
  7. **
  8. ** Maintain by all
  9. ** History :
  10. **      2003.03.10  terry  , check all function on disable osd mode
  11. **      2003/9/26 03:38PM, terry,define osdbuf replacement linebuf when debug mode
  12. **      2003-08-29 15:18, wangfeng For new setup menu
  13. **      2005-1-18 8:48, wanghaoying moved some code about OP_UI to a file in the folder "higui"
  14. ** Note : all functions must make the same function name to osd2.c
  15. **
  16. */
  17. #include "config.h"
  18. #include "regmap.h"
  19. #include "global.h"
  20. #include "memmap.h"
  21. #include "func.h"
  22. #include "stdlib.h"
  23. #include "cfont.h"
  24. #include "osd.h"
  25. #include "osdsup.h"
  26. #include "osdfont.h"
  27. #include "osd_str.h"
  28. #include "user_init.h"
  29. #include "endian.h"
  30. #include "user_if.h"
  31. #ifdef OSDISP
  32. #include "osd_1000isp.c"
  33. #else
  34. #include "vpp.h"//opened by liudan 2004-11-17 16:45
  35. #ifdef SOFT_MENU//Modifed by ChenZhao on 2004-9-6 21:47 WP
  36. #include "kernel.h"
  37. #include "setup_def.h"
  38. #endif//SOFT_MENU
  39. #ifdef NEWSTYLE_WINDOW      //xiongyuyue
  40. #include "kernel.h"
  41. #include "osd_arc.h"
  42. #include "vpp.h"
  43. #elif defined(SETUP_ADJUST_LOCATION_WHEN_PAL)
  44. #include "kernel.h"
  45. #endif
  46. #ifdef ROLL_SHOW_SETUP  //zhaoyanhua add 2003-8-18 11:42
  47. #include"memmap0.h"
  48. #endif
  49. #ifdef SUPPORT_REP_READ 
  50. #include "read.h"
  51. #endif
  52. #ifdef  SUPPORT_MP4
  53. #include "drm.h"
  54. #endif
  55. #ifdef SUPPORT_DISPLAY_MENU
  56. #include "setup_def.h"
  57. #endif
  58. #ifdef  ALWAYS_DISPLAY_OPEN//Jack 20041008
  59. #include "cd.h"
  60. #endif
  61. #ifdef DVB1000_OSD_MENU
  62. #include "dvbmenu.h"
  63. #endif
  64. #ifndef DVDRELEASE
  65. //#define OSD_DBG         1
  66. UINT8 osdbuf[100];//terry,2003/9/26 03:37PM
  67. #else
  68. #define osdbuf linebuf
  69. #endif
  70. #define osd_puts(s)         do {} while (0)
  71. #define osd_printf(s...)    do {} while (0)
  72. #ifdef OSD_DBG
  73. #undef  osd_puts
  74. #undef  osd_printf
  75. #include "emuio.h"
  76. #include "sio.h"
  77. UINT8   lbuf2[128];
  78. #define osd_puts(s)         io_write_wait(s)
  79. #define osd_printf(s...)    do {psprintf(lbuf2, ##s); osd_puts(lbuf2);} while (0)
  80. #endif
  81. #ifdef DIV_GOTO_DISPLAY
  82. extern BYTE  SearchPage;
  83. #endif
  84. #ifdef  NEW_STYLE_SETUP
  85. #define SETUP_REGION    1
  86. #else
  87. #define SETUP_REGION    0
  88. #endif
  89. #if !defined(OSD_PAL_16b) || defined(OSD_16b_BUG)
  90. #define OSD_CLUT_SIZE   4
  91. #else
  92. #define OSD_CLUT_SIZE   2
  93. #endif
  94. #ifdef SETUP_ON_OPEN_VALID      //dingzhy   12/26/2003 9:07PM
  95. extern BYTE OpenFlag;
  96. #endif
  97. #if defined(BBK_NEW_SETUP)&&defined(BBK_DV961_DVD)    //axel 2004/1/27 04:48
  98. #include "icon_bbk.h"
  99. #endif
  100. #ifdef  ZOOMOUT_JPEG_ROTATE_NOT_SHOW_ZOOM       //Maoyong 2004.02.25 for JPEG zoomout not show zoom 
  101. #include "jpegeffect.h"
  102. /*Maoyong 2004.02.25, when rotate to normal, we also can't show zoom state for a zoomout pic.
  103.   So use old_rotate_mode to compare 'rotate_mode'
  104. */
  105. BYTE old_rotate_mode = 0;
  106. extern UINT16 Is_JPEG_STATE(void);
  107. #endif
  108. //#ifdef NEWSTYLE_WINDOW             //xiongyuyue 
  109. //xlluo modify for midiplayer draw menurect 04-6-11
  110. #if (defined(NEWSTYLE_WINDOW)|defined(SUPPORT_MIDI_MENU_SEL))
  111. /*
  112. const BYTE arc_tableLT[16][16]={
  113.     {0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},
  114.     {0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,2},
  115.     {0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2},
  116.     {0,0,0,0,0,0,1,2,2,2,2,2,2,2,2,2},
  117.     {0,0,0,0,0,1,2,2,2,2,2,2,2,2,2,2},
  118.     {0,0,0,0,1,2,2,2,2,2,2,2,2,2,2,2},
  119.     {0,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2},
  120.     {0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2},
  121.     {0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2},
  122.     {0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
  123.     {0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
  124.     {0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
  125.     {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
  126.     {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
  127.     {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
  128.     {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}
  129. };    
  130. const BYTE arc_tableRT[16][16]=
  131. {
  132.     {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
  133.     {2,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0},
  134.     {2,2,2,2,2,2,2,1,1,0,0,0,0,0,0,0},
  135.     {2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0},
  136.     {2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0},
  137.     {2,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0},
  138.     {2,2,2,2,2,2,2,2,2,2,2,2,1,0,0,0},
  139.     {2,2,2,2,2,2,2,2,2,2,2,2,2,1,0,0},
  140.     {2,2,2,2,2,2,2,2,2,2,2,2,2,1,0,0},
  141.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0},
  142.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0},
  143.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0},
  144.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1},    
  145.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1},    
  146.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1},    
  147.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1}    
  148. };
  149. const BYTE arc_tableLB[16][16]=
  150. {
  151.     {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
  152.     {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
  153.     {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
  154.     {1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
  155.     {0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
  156.     {0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
  157.     {0,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
  158.     {0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2},
  159.     {0,0,1,2,2,2,2,2,2,2,2,2,2,2,2,2},
  160.     {0,0,0,1,2,2,2,2,2,2,2,2,2,2,2,2},
  161.     {0,0,0,0,1,2,2,2,2,2,2,2,2,2,2,2},
  162.     {0,0,0,0,0,1,2,2,2,2,2,2,2,2,2,2},
  163.     {0,0,0,0,0,0,1,2,2,2,2,2,2,2,2,2},
  164.     {0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2},
  165.     {0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,2},
  166.     {0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1}
  167. };
  168. const BYTE arc_tableRB[16][16]=
  169. {
  170.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1},
  171.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1},
  172.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1},
  173.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1},
  174.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0},
  175.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0},
  176.     {2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,0},
  177.     {2,2,2,2,2,2,2,2,2,2,2,2,2,1,0,0},
  178.     {2,2,2,2,2,2,2,2,2,2,2,2,2,1,0,0},
  179.     {2,2,2,2,2,2,2,2,2,2,2,2,1,0,0,0},
  180.     {2,2,2,2,2,2,2,2,2,2,2,1,0,0,0,0},
  181.     {2,2,2,2,2,2,2,2,2,2,1,0,0,0,0,0},
  182.     {2,2,2,2,2,2,2,2,2,1,0,0,0,0,0,0},
  183.     {2,2,2,2,2,2,2,1,1,0,0,0,0,0,0,0},
  184.     {2,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0},
  185.     {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0}
  186. };
  187. */
  188. const BYTE arc_tableLT[10][10]=
  189. {
  190.     {0,0,0,0,0,0,0,1,1,1},
  191.     {0,0,0,0,0,1,1,2,2,2},
  192.     {0,0,0,1,1,2,2,2,2,2},
  193.     {0,0,1,2,2,2,2,2,2,2},
  194.     {0,0,1,2,2,2,2,2,2,2},
  195.     {0,1,2,2,2,2,2,2,2,2},
  196.     {0,1,2,2,2,2,2,2,2,2},
  197.     {1,2,2,2,2,2,2,2,2,2},    
  198.     {1,2,2,2,2,2,2,2,2,2},    
  199.     {1,2,2,2,2,2,2,2,2,2},
  200. };
  201. const BYTE arc_tableRT[10][10]=
  202. {
  203.     {1,1,1,0,0,0,0,0,0,0},
  204.     {2,2,2,1,1,0,0,0,0,0},
  205.     {2,2,2,2,2,1,1,0,0,0},
  206.     {2,2,2,2,2,2,2,1,0,0},
  207.     {2,2,2,2,2,2,2,1,0,0},
  208.     {2,2,2,2,2,2,2,2,1,0},
  209.     {2,2,2,2,2,2,2,2,1,0},
  210.     {2,2,2,2,2,2,2,2,2,1},    
  211.     {2,2,2,2,2,2,2,2,2,1},    
  212.     {2,2,2,2,2,2,2,2,2,1},
  213. };
  214.     
  215. const BYTE arc_tableLB[10][10]=
  216. {
  217.     {1,2,2,2,2,2,2,2,2,2},    
  218.     {1,2,2,2,2,2,2,2,2,2},
  219.     {1,2,2,2,2,2,2,2,2,2},    
  220.     {0,1,2,2,2,2,2,2,2,2},
  221.     {0,1,2,2,2,2,2,2,2,2},
  222.     {0,0,1,2,2,2,2,2,2,2},
  223.     {0,0,1,2,2,2,2,2,2,2},
  224.     {0,0,0,1,1,2,2,2,2,2},
  225.     {0,0,0,0,0,1,1,2,2,2},
  226.     {0,0,0,0,0,0,0,1,1,1},
  227. };
  228. const BYTE arc_tableRB[10][10]=
  229. {
  230.     {2,2,2,2,2,2,2,2,2,1},
  231.     {2,2,2,2,2,2,2,2,2,1},    
  232.     {2,2,2,2,2,2,2,2,2,1},    
  233.     {2,2,2,2,2,2,2,2,1,0},
  234.     {2,2,2,2,2,2,2,2,1,0},
  235.     {2,2,2,2,2,2,2,1,0,0},
  236.     {2,2,2,2,2,2,2,1,0,0},
  237.     {2,2,2,2,2,1,1,0,0,0},
  238.     {2,2,2,1,1,0,0,0,0,0},
  239.     {1,1,1,0,0,0,0,0,0,0},
  240. };
  241. /*        
  242. const BYTE  arc_tableLT[6][6] = {
  243.                         {0,0,0,0,1,1},
  244.                                  {0,0,1,1,2,2},
  245.                               {0,1,1,2,2,2},
  246.                               {0,1,2,2,2,2},
  247.                               {1,2,2,2,2,2},
  248.                               {1,2,2,2,2,2},
  249.                             };
  250. const BYTE arc_tableRT[6][6] = {
  251.                               {1,1,0,0,0,0},
  252.                               {2,2,1,1,0,0},
  253.                               {2,2,2,1,1,0},
  254.                               {2,2,2,2,1,0},
  255.                               {2,2,2,2,2,1},
  256.                               {2,2,2,2,2,1},
  257.                             };
  258. const BYTE arc_tableLB[6][6] = {
  259.                               {1,2,2,2,2,2},
  260.                               {1,2,2,2,2,2},
  261.                               {0,1,2,2,2,2},
  262.                               {0,1,1,2,2,2},
  263.                               {0,0,1,1,2,2},
  264.                               {0,0,0,0,1,1},
  265.                              };
  266. const BYTE arc_tableRB[6][6] = {
  267.                               {2,2,2,2,2,1},
  268.                               {2,2,2,2,2,1},
  269.                               {2,2,2,2,1,0},
  270.                               {2,2,2,1,1,0},
  271.                               {2,2,1,1,0,0},
  272.                               {1,1,0,0,0,0},
  273.                              };     */
  274. /*
  275. const BYTE Arrow_UP[6][6]=
  276. {
  277.     {0, 0, 0, 0, 0, 0},
  278.     {0, 0, 0, 1, 0, 0},
  279.     {0, 0, 1, 1, 1, 0},
  280.     {0, 1, 1, 1, 1, 1},
  281.     {1, 1, 1, 1, 1, 1},
  282.     {0, 0, 0, 0, 0, 0}
  283. };
  284. const BYTE Arrow_DOWN[6][6]=
  285. {
  286.     {0, 0, 0, 0, 0, 0},
  287.     {1, 1, 1, 1, 1, 1},
  288.     {0, 1, 1, 1, 1, 1},
  289.     {0, 0, 1, 1, 1, 0},
  290.     {0, 0, 0, 1, 0, 0},
  291.     {0, 0, 0, 0, 0, 0}
  292. };
  293. const BYTE Arrow_Right[10][10]=
  294. {
  295.     {1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
  296.     {1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
  297.     {1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
  298.     {1, 1, 1, 1, 1, 1, 1, 0, 0, 0},
  299.     {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  300.     {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  301.     {1, 1, 1, 1, 1, 1, 1, 1, 0, 0},
  302.     {1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
  303.     {1, 1, 1, 0, 0, 0, 0, 0, 0, 0},
  304.     {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}
  305. };
  306. const BYTE Arrow_Left[10][10]=
  307. {
  308.     {0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
  309.     {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
  310.     {0, 0, 0, 0, 0, 1, 1, 1, 1, 1},
  311.     {0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
  312.     {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  313.     {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
  314.     {0, 0, 0, 1, 1, 1, 1, 1, 1, 1},
  315.     {0, 0, 0, 0, 0, 1, 1, 1, 1, 1},
  316.     {0, 0, 0, 0, 0, 0, 0, 1, 1, 1},
  317.     {0, 0, 0, 0, 0, 0, 0, 0, 0, 1}
  318. };
  319. */
  320. #endif
  321. /************************************************************
  322. Data
  323. ************************************************************/
  324. #include "osd_palette.h"
  325. void    osd_DrawLine(UINT32 xStart, UINT32 yStart, UINT32 xEnd, UINT32 yEnd, BYTE color, BYTE lineWidth);
  326. void    osd_DrawRegionLine(UINT32 xStart, UINT32 yStart, UINT32 xEnd, UINT32 yEnd, BYTE color, BYTE lineWidth, BYTE r);
  327. void    osd_print_region2(t_osd_region *p, const char *s0, BYTE y_start,BYTE x_start);
  328. void    osd_draw_rect(UINT32 xStart, UINT32 yStart, UINT32 xLen, UINT32 yLen, BYTE bkColor);
  329. void    osd_draw_region_rect(UINT32 xStart, UINT32 yStart, UINT32 xLen, UINT32 yLen, BYTE bkColor, BYTE r);
  330. extern  UINT8   decomp_fnTable[];
  331. extern  UINT8   osd_temp_buf[];
  332. //
  333. // get_font_entry
  334. //
  335. UINT8 *
  336. get_font_entry(int tbl, int entry)
  337. {
  338.     unsigned    u = 0;
  339.     // Modified by yltseng. If no initial value 0, when this entry doesn't exist in all tables,
  340.     // we will return what u contains( it may be any value ).
  341.     // When we call this function, we need to check if the return value is NULL or not.
  342.     if (tbl == 0)
  343.         u = (unsigned) font_table[entry];
  344.     else if (tbl == 1)
  345.         u = (unsigned) font_table2[entry];
  346.     else if (tbl == 2)
  347.         u = (unsigned) setup_icon[entry];
  348. #ifdef SUPPORT_PLAYBACK_ICON
  349.     else
  350.         u = (unsigned) play_icon[entry];
  351. #endif
  352. #ifdef OSD_FONT_COMPRESS            
  353.     return (BYTE *)(decomp_fnTable + u);
  354. #else
  355.     return (BYTE *)u;
  356. #endif
  357. }
  358. UINT8 *
  359. get_osdbuf_region_ptr(int _region, int _field)
  360. {
  361.     UINT8 *p = get_osdbuf_baseptr();
  362.     p = p + (region[_region].osd_header[_field] + OSD_DATA_OFFSET(region[_region].osd_format))*32;
  363.     return  p;
  364. }
  365. #if SUPPORT_OSD
  366. //
  367. // FUNCTION
  368. // reset_osd
  369. //
  370. inline void osd_disable(void)
  371. {
  372.     regs0->osd_en    = 0;
  373. }
  374. inline void osd_enable(void)
  375. {    
  376. #if(!defined(DVB_SETUP)||defined(SUPPORT_DVD_OSD))
  377.     regs0->osd_en    = 1;
  378. #endif
  379. }
  380. void
  381. reset_osd()
  382. {
  383.     osd_disable();
  384.     regs0->osd_tlink_addr = LINK_NULL;
  385.     regs0->osd_blink_addr = LINK_NULL;
  386. }
  387. void
  388. ENABLE_OSD(void)
  389. {
  390. #if(!defined(DVB_SETUP)||defined(SUPPORT_DVD_OSD))
  391.     regs0->osd_tlink_addr  = region[0].osd_header[0];
  392.     regs0->osd_blink_addr  = region[0].osd_header[1];
  393.     osd_enable();
  394. #endif
  395. }
  396. void
  397. DISABLE_OSD(void)
  398. {
  399.     osd_disable(); 
  400.     wait_v_blank();    //20020613 to avoid  noise when 3D_MENU  toggle .
  401. }
  402. void   
  403. __osd_init(void)
  404. {
  405.     int i;
  406.     osd_free = addr_vxvy(0,0);
  407.     header_id = NORMAL_HEADER;
  408.     DISABLE_OSD();
  409.     // reset OSD regions information
  410.     for (i=0;i<MAX_REGION;i++) timeout_osd[i] = 0;
  411.     osd_active_regions = 0;
  412. }
  413. void
  414. osd_init__(void)
  415. {
  416.     ClearOsdMsg(0);
  417.     ENABLE_OSD();        
  418. }
  419. //
  420. // FUNCTION
  421. // osd_init_regions
  422. // initialize OSD regions using _t_osd_hdr table
  423. //
  424. void 
  425. osd_init_regions(int n, const _t_osd_hdr *hdrp)
  426. {
  427.     int i, j;
  428.     void *rgnp;
  429.     __osd_init();        
  430.     rgnp = NULL;
  431.     for (i=0, j=n-1; i<n; i++, j--)
  432.     {
  433.         header_id       = hdrp[i].header_type;
  434.         region[j].osd_w = hdrp[i].width;
  435.         region[j].osd_h = hdrp[i].height;
  436.         osd_create_region1(&region[j],
  437.                 hdrp[i].x,  hdrp[i].y,
  438.                 rgnp,
  439.                 hdrp[i].format,
  440.                 hdrp[i].type
  441.         );
  442.         rgnp = &region[j];
  443.     }
  444.     osd_active_regions = n;
  445.     osd_init__();       
  446. }
  447. /***************************************************************
  448. **Function: osd_init_cardswitch()
  449. **Description: initialize the Switch interface.
  450. **Create: wuxiaofeng, 2003-9-01 
  451. ***************************************************************/
  452. /*const _t_osd_hdr  osd_cardswitch[] = {
  453.     {64*3, (OSD_FONT_HEIGHT+8)*8, 80, 72, SETUP_HEADER, OSD_FORMAT_16COLOR,  OSD_INTERLACED},       // 3
  454.     {64*3, (OSD_FONT_HEIGHT)*2, 80, 48, SETUP_HEADER, OSD_FORMAT_16COLOR,  OSD_INTERLACED},         // 2
  455.     {36*4, OSD_FONT_HEIGHT, 32, 34, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},             // 1
  456.     {38*8, OSD_FONT_HEIGHT,   26, 16+4,      SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},    // 0
  457. };
  458. void osd_init_cardswitch(void)
  459. {
  460.     osd_puts("osd_cardswitch()n");
  461.     osd_init_regions( sizeof(osd_cardswitch)/sizeof(osd_cardswitch[0]), (_t_osd_hdr *)&osd_cardswitch);
  462. }
  463. void osd_draw_button(BYTE xStart, BYTE yStart, BYTE xLen, BYTE color, BYTE bDown, BYTE r)
  464. {
  465.         BYTE       buttonC;
  466.         UINT32    xNew, yNew;
  467.     BYTE    region;
  468.     
  469.         buttonC = color;
  470.     region = r;
  471.         xNew = xStart * 16;
  472.         yNew = yStart * SETUP_BTN_HEIGHT+12;    
  473.         osd_draw_region_rect(xNew, yNew, (UINT32)(xLen*16), (UINT32)(SETUP_BTN_HEIGHT), buttonC, region);    
  474.         osd_draw_region_boarder(xNew, yNew, (UINT32)(xNew+xLen*16), (UINT32)(yNew+SETUP_BTN_HEIGHT-2), bDown, region);
  475. }
  476. #endif*/
  477. #if defined(FAT_Write_UI)||defined(FILE_MODE_WRITE)//sunzhh 20041120
  478. const   _t_osd_hdr osd_MediaswitchGUI[] = {
  479. #ifdef DISP_REGION_BOTTOM
  480.     {360, OSD_FONT_HEIGHT+8 , 10, 216, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},    // 8 for cdrom display region
  481. #endif
  482.     #ifdef CARD_SETUP_TYPE_3 
  483.     {64*2, (OSD_FONT_HEIGHT+8)*9, 50+65, 40, SETUP_HEADER, OSD_FORMAT_16COLOR,  OSD_INTERLACED},     // 3      
  484.     #else
  485.     {64*2, (OSD_FONT_HEIGHT+8)*9, 50+65, 25, SETUP_HEADER, OSD_FORMAT_16COLOR,  OSD_INTERLACED},     // 3
  486.     #endif
  487.     {64*3, (OSD_FONT_HEIGHT)*2,   80,    48, SETUP_HEADER, OSD_FORMAT_16COLOR,  OSD_INTERLACED},     // 2
  488.     {36*4, OSD_FONT_HEIGHT,       32,    34, NORMAL_HEADER,OSD_FORMAT_4COLOR,   OSD_INTERLACED},     // 1
  489. #ifndef OSD_BMP_DISPLAY
  490.     {38*8, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  491. #else
  492.     {360, OSD_FONT_HEIGHT+8 , 0, 20, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  493. #endif//OSD_BMP
  494. };
  495. void osd_init_MediaswitchGUI(void)
  496. {
  497. #ifdef OSDISP                     //2004/10/21 wjzhang , sphe1000B(stb-dvd): turn off the osd display in romcode
  498. return ;
  499. #endif
  500.     osd_puts("osd_init_keyn");
  501.     osd_init_regions( sizeof(osd_MediaswitchGUI)/sizeof(osd_MediaswitchGUI[0]), (_t_osd_hdr *)&osd_MediaswitchGUI);
  502. }
  503. #endif//#if defined(FAT_Write_UI)//sunzhh 20041120
  504. #if defined(CF_CARD_WRITE)||defined(FAT_Write_UI)||defined(FILE_MODE_WRITE)//liweihua add 2003-10-30 9:15
  505. const   _t_osd_hdr osd_periphGUI[] = {
  506. #ifdef DISP_REGION_BOTTOM
  507.     {360, OSD_FONT_HEIGHT+8 , 10, 216, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},    // 8 for cdrom display region
  508. #endif
  509.     {64*4, (OSD_FONT_HEIGHT+8)*9, 50, 72, SETUP_HEADER, OSD_FORMAT_16COLOR,  OSD_INTERLACED},       // 3
  510.     {64*3, (OSD_FONT_HEIGHT)*2, 80, 48, SETUP_HEADER, OSD_FORMAT_16COLOR,  OSD_INTERLACED},         // 2
  511.     {36*4, OSD_FONT_HEIGHT, 32, 34, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},             // 1
  512. #ifndef OSD_BMP_DISPLAY
  513.     {38*8, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  514. #else
  515.     {360, OSD_FONT_HEIGHT+8 , 0, 20, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  516. #endif//OSD_BMP
  517. };
  518. void osd_init_periphGUI(void)
  519. {
  520.     osd_puts("osd_init_keyn");
  521.     osd_init_regions( sizeof(osd_periphGUI)/sizeof(osd_periphGUI[0]), (_t_osd_hdr *)&osd_periphGUI);
  522. }
  523. #endif
  524. #ifdef SUPPORT_OSDID3//liweihua 2003-12-28
  525. const   _t_osd_hdr osd_OSDID3[] = {
  526. #ifdef DISP_REGION_BOTTOM
  527.     {360, OSD_FONT_HEIGHT+8 , 10, 216, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},    // 8 for cdrom display region
  528. #endif
  529.     {38*8, OSD_FONT_HEIGHT*5, 26, 134, SETUP_HEADER, OSD_FORMAT_16COLOR,  OSD_INTERLACED},  // 3//liweihua mod 2004-1-14 10:26
  530.     {36*4, OSD_FONT_HEIGHT, 32, 46, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 2
  531.     {36*4, OSD_FONT_HEIGHT, 32, 34, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 1
  532. #ifndef OSD_BMP_DISPLAY
  533.     {38*8, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  534. #else
  535.     {360, OSD_FONT_HEIGHT+8 , 0, 20, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  536. #endif//OSD_BMP
  537. };
  538. void osd_init_OSDID3(void)
  539. {
  540.     osd_puts("osd_init_keyn");
  541.     osd_init_regions( sizeof(osd_OSDID3)/sizeof(osd_OSDID3[0]), (_t_osd_hdr *)&osd_OSDID3);
  542.     SetOsdCol(3,3,0,__palette4F(85,125, 0, 0x80));
  543.     SetOsdCol(3,3,2,__palette4F(255, 132, 255, 0xff));
  544. }
  545. #endif
  546. #ifdef SWITCH_CD_CARD_USB //liweihua mod 2004-6-8 14:45
  547. const   _t_osd_hdr osd_switchGUI[] = {
  548. #ifdef DISP_REGION_BOTTOM
  549.     {360, OSD_FONT_HEIGHT+8 , 10, 216, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},    // 8 for cdrom display region
  550. #endif
  551.     {64*2, (OSD_FONT_HEIGHT+8)*9, 50+65, 72, SETUP_HEADER, OSD_FORMAT_16COLOR,  OSD_INTERLACED},    // 3
  552.     {64*3, (OSD_FONT_HEIGHT)*2, 80, 48, SETUP_HEADER, OSD_FORMAT_16COLOR,  OSD_INTERLACED},         // 2
  553.     {36*4, OSD_FONT_HEIGHT, 32, 34, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},             // 1
  554. #ifndef OSD_BMP_DISPLAY
  555.     {38*8, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  556. #else
  557.     {360, OSD_FONT_HEIGHT+8 , 0, 20, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  558. #endif//OSD_BMP_DISPLAY
  559. };
  560. void osd_init_switchGUI(void)
  561. {
  562.     osd_puts("osd_init_keyn");
  563.     osd_init_regions( sizeof(osd_switchGUI)/sizeof(osd_switchGUI[0]), (_t_osd_hdr *)&osd_switchGUI);
  564. }
  565. #endif
  566. //suqiaoli add 2004-3-17
  567. // 2004/09/03 yltseng
  568. #ifdef SUPPORT_OSDSRT
  569.     #ifndef SDRAM_16Mb_Mode
  570.         const   _t_osd_hdr osd_OSDSRT[] = {
  571. #ifdef DISP_REGION_BOTTOM
  572.     {360, OSD_FONT_HEIGHT+8 , 10, 216, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},    // last region for cdrom display region
  573. #endif
  574.             {38*8, (OSD_FONT_HEIGHT+10)*7, 26, 102, SETUP_HEADER, OSD_FORMAT_16COLOR,   OSD_INTERLACED},    // 3
  575. #ifdef OSD_BMP_REGION1
  576.     {36*4, OSD_FONT_HEIGHT, 32, 56, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},              // 2
  577.     {40*4, OSD_FONT_HEIGHT + 8 , 0, 37, BMP_REGION1_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 1
  578. #else
  579.     {36*4, OSD_FONT_HEIGHT, 32, 56, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},              // 2
  580.             {36*4, OSD_FONT_HEIGHT, 32, 34, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},             // 1
  581. #endif
  582. #ifndef OSD_BMP_DISPLAY
  583.             {38*8, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}              // 0
  584. #else
  585.     {360, OSD_FONT_HEIGHT+8 , 0, 20, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  586. #endif
  587.         };
  588.     #else
  589.         const   _t_osd_hdr osd_OSDSRT[] = {
  590.             {38*8, OSD_FONT_HEIGHT*2, 26, 182, SETUP_HEADER,  OSD_FORMAT_16COLOR,   OSD_INTERLACED},       // 3
  591.             {36*4, OSD_FONT_HEIGHT,   32, 46,  SETUP_HEADER,  OSD_FORMAT_16COLOR,  OSD_INTERLACED},             // 2
  592.             {18*4, OSD_FONT_HEIGHT,   32, 34,  NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},             // 1
  593.         #ifdef  NEW_DISPLAY_GOTO_OSD
  594.             {16*4, OSD_FONT_HEIGHT,   26, 20,  SETUP_HEADER,  OSD_FORMAT_4COLOR,  OSD_NONINTERLACED}           // 0
  595.             // 0 Temporarily set the last para as non-interlace. wuxiaofeng 2004-06-02
  596.         #else
  597.             {38*4, OSD_FONT_HEIGHT,   26, 20,  SETUP_HEADER,  OSD_FORMAT_4COLOR,  OSD_INTERLACED}              // 0
  598.         #endif
  599.         };
  600.     #endif
  601. void osd_init_OSDSRT(void)
  602. {
  603.     if( (full_scrn==0)||(full_scrn&GOTO)||(full_scrn&MARK)||(full_scrn&SCORE)////nono 4-7-26 10:37;
  604.         ||(full_scrn&PROGRAM) ||(full_scrn&SOUND))//feeling 05-01-06
  605. #if defined(DISP_REGION_BOTTOM) && defined(SUPPORT_FILE_SYSTEM_MODE)
  606. if(IsOtherStatePlayMode())
  607. #endif
  608.     {
  609.     osd_puts("osd_init_keyn");
  610.     osd_init_regions( sizeof(osd_OSDSRT)/sizeof(osd_OSDSRT[0]), (_t_osd_hdr *)&osd_OSDSRT);
  611.    
  612.     SetOsdCol(3,3,0,__palette4F(30,30, 30, 0));//background color is transparent
  613.     SetOsdCol(3,3,2,__palette4F(255, 132, 255, 0xff));//font color is near to white
  614.     }
  615. }
  616. #endif
  617. //
  618. // FUNCTION
  619. // osd_init()
  620. //
  621. #ifndef SDRAM_16Mb_Mode
  622. const   _t_osd_hdr osd_hdr_0[] = {
  623. #if defined(LARGE_SCORES_DISPLAY)//&& defined(GBM_DVD)
  624.     {24*4, (OSD_FONT_HEIGHT)*6, 120, 80, SETUP_HEADER, OSD_FORMAT_16COLOR,  OSD_INTERLACED},     // 3
  625. #endif
  626. #ifdef DIV_GOTO_DISPLAY    
  627.     {36*5+16, OSD_FONT_HEIGHT+6, 32, 46, SETUP_HEADER, OSD_FORMAT_16COLOR,  OSD_INTERLACED},     // 2//{36*4, OSD_FONT_HEIGHT*2, 32, 46+6, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 2
  628. #else
  629. #ifdef SUPPORT_GPIO_P_SCAN
  630.      {36*3, OSD_FONT_HEIGHT, 80, 46+OSD_FONT_HEIGHT+12+64+24+12, SETUP_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 7
  631.     {36*3, OSD_FONT_HEIGHT, 80, 46+OSD_FONT_HEIGHT+12+64+24, SETUP_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 6
  632.     {36*3, OSD_FONT_HEIGHT, 80, 46+OSD_FONT_HEIGHT+64+24, SETUP_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 5
  633.     {36*3, OSD_FONT_HEIGHT, 80, 46+OSD_FONT_HEIGHT+12+64, SETUP_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 4
  634.     {36*3, OSD_FONT_HEIGHT, 80, 46+OSD_FONT_HEIGHT+64, SETUP_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 3
  635. #endif //#ifdef SUPPORT_GPIO_P_SCAN
  636.     //{36*4, OSD_FONT_HEIGHT, 32, 46, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 2     //mark by liudan,2004-11-16 14:38
  637. #endif//DIV_GOTO_DISPLAY   
  638. #ifdef DISP_REGION_BOTTOM
  639.     {360, OSD_FONT_HEIGHT + 8 , 10, 216, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},      // 3 for cdrom display
  640. #ifdef SUPPORT_MP4
  641.     {38*8, OSD_FONT_HEIGHT * 6, 26, 134,    SETUP_HEADER,   OSD_FORMAT_16COLOR, OSD_NONINTERLACED},    // 3 for mp4 subtitle
  642. #endif
  643.     {36*4, OSD_FONT_HEIGHT + 8, 0, 56, BMP_REGION1_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 2     //liudan add it,2004-11-17 11:07
  644. #else    
  645.     {36*4, OSD_FONT_HEIGHT, 32, 46, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 2     //liudan add it,2004-11-17 11:07
  646. #endif
  647. #ifdef OSD_BMP_REGION1//libing modify 36*4=>>40*4  2004-11-26 21:19
  648.     {40*4, OSD_FONT_HEIGHT + 8 , 0, 37, BMP_REGION1_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 1
  649. #else
  650.     {36*4, OSD_FONT_HEIGHT, 32, 34, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 1
  651. #endif
  652. #ifndef OSD_BMP_DISPLAY
  653.     {38*8, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  654. #else
  655.     {360, OSD_FONT_HEIGHT+8 , 0, 20, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  656. #endif//OSD_BMP
  657. };
  658. #else
  659. // 16Mb small-memory mode
  660. const   _t_osd_hdr osd_hdr_0[] = {
  661.     // 2004/11/26 yltseng add region2, in order to show ANGLE
  662.     {4*4, OSD_FONT_HEIGHT, 32, 46, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},      // 2
  663.     {18*4, OSD_FONT_HEIGHT, 32, 34, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 1
  664. #ifdef  NEW_DISPLAY_GOTO_OSD
  665.     {16*4, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_4COLOR,  OSD_NONINTERLACED}      // 
  666.     // 0 Temporarily set the last para as non-interlace. wuxiaofeng 2004-06-02
  667. #else
  668.     {38*4, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_4COLOR,  OSD_INTERLACED}      // 0
  669. #endif
  670. };
  671. #endif
  672. void    osd_init(void)
  673. {
  674.     osd_puts("osd_init()n");
  675.     osd_init_regions( sizeof(osd_hdr_0)/sizeof(osd_hdr_0[0]), (_t_osd_hdr *)&osd_hdr_0);
  676. #ifdef DIV_GOTO_DISPLAY//zhaoyanhua add 03-10-22 13:17
  677.     SetOsdCol(2,2,0,0x1e1e1e00);//region 2 transent.
  678.     SetOsdCol(2,2,10,0x32323290);//REGION2 10 is black. Be same with REIGON1 black color.
  679.     #ifdef NINTAUS_OSD_STR    //2004-2-17 01:31张宇M
  680.     SetOsdCol(2,2,7,0xffffffff);
  681.     #else
  682.     SetOsdCol(2,2,7, 0xa22c8eff);//REGION2 7 is yellow. Be same with REGION1 yellow color. zhaoyanhua add 2003-12-24 11:07
  683.     #endif//SetOsdCol(2,2,7,0x1e1e1ea0);
  684. #endif//end DIV_GOTO_DISPLAY
  685. }
  686. #ifdef  RECORD_KEY//zhaoyanhua add 
  687. const   _t_osd_hdr osd_hdr_record[] = {
  688. #ifdef DISP_REGION_BOTTOM
  689.     {360, OSD_FONT_HEIGHT+8 , 10, 216, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},    // 8 for cdrom display region
  690. #endif
  691. #ifndef OSD_BMP_DISPLAY
  692.     {38*8, OSD_FONT_HEIGHT*4, 26, 20, SETUP_HEADER,  OSD_FORMAT_16COLOR,  OSD_INTERLACED}      // 0
  693. #else
  694.     {360, OSD_FONT_HEIGHT+8 , 0, 20, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  695. #endif//OSD_BMP
  696. };
  697. /*
  698.  * Function Description:
  699.  *    when the disc which has been recorded is distinguished,
  700.  *    before resume play ,show message.
  701.  */
  702. void osd_init_record()
  703. {
  704.     osd_puts("osd_init_record()n");
  705.     osd_init_regions( sizeof(osd_hdr_record)/sizeof(osd_hdr_record[0]), (_t_osd_hdr *)&osd_hdr_record);
  706.     //osd_draw_region_rect(0, 0, 20, 14, 6, 1);
  707.        SetOsdCol(0,0,0,0x1e1e1ef0);//3-11-21 9:25张宇P
  708. }   
  709. #endif
  710. //
  711. // FUNCTION
  712. // osd_init_prog()
  713. //
  714. const   _t_osd_hdr osd_hdr_prog[] = {
  715. #ifdef DISP_REGION_BOTTOM
  716.     {360, OSD_FONT_HEIGHT+8 , 10, 216, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},    // last region, for cdrom display region
  717. #endif
  718. #ifdef OSD_BMP_PROG
  719.     {37*8, 20,  31, 37+7+17+6+131,  BMP_REGION_F_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},   // 5
  720.     {37*8, 262, 31, 37+7+17+6,      BMP_REGION_E_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},   // 4
  721.     {37*8, 12,  31, 37+7+17,        BMP_REGION_D_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},   // 3
  722.     {37*8, 34,  31, 37+7,           BMP_REGION_B_HEADER,  OSD_FORMAT_16COLOR,   OSD_INTERLACED},    // 2
  723.     {37*8, 14,  31, 37,             BMP_REGION_A_HEADER,  OSD_FORMAT_16COLOR,   OSD_INTERLACED},    // 1
  724. #else    
  725.     {36*4, OSD_FONT_HEIGHT+8, 32, 150+4+4+4, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},    // 7
  726.     {36*4, OSD_FONT_HEIGHT*2, 32, 126+4+4+4, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},    // 6
  727.     {36*4, OSD_FONT_HEIGHT*2, 32, 102+4+4+4, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},    // 5
  728.     {36*4, OSD_FONT_HEIGHT*2, 32, 78+4+4+4,  NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},    // 4
  729.     {36*4, OSD_FONT_HEIGHT*2, 32, 54+4+4+4,  NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},    // 3
  730.     {36*4, OSD_FONT_HEIGHT+8, 32, 42+4+4,    NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},    // 2
  731.     {5*4,  OSD_FONT_HEIGHT+8, 32, 30+4,      NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},    // 1
  732. #endif
  733. #ifdef SDRAM_16Mb_Mode//terry,2003/12/10 03:34PM
  734.     {38*4, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_4COLOR,  OSD_INTERLACED}      // 0
  735. #elif defined(OSD_BMP_DISPLAY)
  736.     {360, OSD_FONT_HEIGHT+8 , 0, 20, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  737. #else
  738.     {38*8, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  739. #endif//#ifdef SDRAM_16Mb_Mode
  740. };
  741. void osd_init_prog(void)
  742. {
  743.     osd_puts("osd_init_prog()n");
  744.     osd_init_regions( sizeof(osd_hdr_prog)/sizeof(osd_hdr_prog[0]), (_t_osd_hdr *)&osd_hdr_prog);
  745. #ifdef CD_PLAYER        //liweihua add 2003-9-11
  746. if(cd_type_loaded == CDDA)
  747.     {
  748.         SetOsdCol(0,0,0,0x1e1e1e00);
  749.         SetOsdCol(0,0,5,__palette4F(128,64,255,0xff));
  750.         SetOsdCol(0,0,8,__palette4F(128,255,0,0xff));
  751.         SetOsdCol(0,0,9,__palette4F(128,255,0,0xff));
  752.     }
  753. #endif
  754. }
  755. //
  756. // FUNCTION
  757. // osd_init_music
  758. // 
  759. // DESCRIPTION
  760. // initialize (3dsound)osd-printing function
  761. //
  762. const   _t_osd_hdr osd_hdr_music[] = {
  763. #ifdef DISP_REGION_BOTTOM
  764.     {360, OSD_FONT_HEIGHT+8 , 10, 216, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},      // 6 for cdrom display
  765. #endif
  766. #ifdef OSD_BMP_SOUND
  767. {288, 20,  35, 58+7+17 +6+107, BMP_REGION_F_HEADER, OSD_FORMAT_16COLOR,OSD_INTERLACED}, // 5, used as bmp sound region E
  768. {288, 214, 35, 58+7+17 +6,     BMP_REGION_E_HEADER, OSD_FORMAT_16COLOR,OSD_INTERLACED}, // 4 ,used as bmp sound region D
  769. {288, 12,  35, 58+7+17,        BMP_REGION_D_HEADER, OSD_FORMAT_16COLOR,OSD_INTERLACED}, // 3 ,used as bmp sound region C
  770. {288, 34,  35, 58+7,           BMP_REGION_B_HEADER, OSD_FORMAT_16COLOR,OSD_INTERLACED}, // 2 ,used as bmp sound region B
  771. {288, 14,  35, 58,             BMP_REGION_A_HEADER, OSD_FORMAT_16COLOR,OSD_INTERLACED}, // 1 ,used as bmp sound region A
  772. #else//OSD_BMP_SOUND   
  773. #ifdef  DYNAMIC_SPECTRUM  //fengjl   add 3-11-30 17:34
  774.     {29*8,(OSD_FONT_HEIGHT+8)*7,64,  110,SETUP_HEADER, OSD_FORMAT_16COLOR,OSD_INTERLACED}, // 3
  775. #else
  776.     {29*8,(OSD_FONT_HEIGHT+8)*7,64,  64+4,SETUP_HEADER, OSD_FORMAT_16COLOR,OSD_INTERLACED}, // 3
  777. #endif
  778. #if  (defined DIV_GOTO_DISPLAY) && (defined BBK_DVD) //zhaoyanhua add 2003-11-10 11:52  
  779.     {36*5+16, OSD_FONT_HEIGHT+6, 32, 46, SETUP_HEADER, OSD_FORMAT_16COLOR,  OSD_INTERLACED},        // 2
  780. #else
  781.     {29*8,OSD_FONT_HEIGHT+12,   64,  46+4,SETUP_HEADER, OSD_FORMAT_16COLOR,OSD_INTERLACED}, // 2
  782. #endif
  783. #ifdef OSD_BMP_REGION1//libing modify 36*4=>>40*4 2004-11-26 21:19
  784.     {40*4, OSD_FONT_HEIGHT + 8 , 0, 37, BMP_REGION1_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 1
  785. #else
  786.     {36*4,OSD_FONT_HEIGHT,      32,  34,  NORMAL_HEADER,OSD_FORMAT_4COLOR,OSD_INTERLACED},  // 1
  787. #endif
  788. #endif//OSD_BMP_SOUND
  789. #ifndef OSD_BMP_DISPLAY
  790.     {38*8, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  791. #else
  792.     {360, OSD_FONT_HEIGHT+8 , 0, 20, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  793. #endif//OSD_BMP
  794. };
  795. void
  796. osd_init_music(void)
  797. {
  798.     osd_puts("osd_init_musicn");
  799.     osd_init_regions( sizeof(osd_hdr_music)/sizeof(osd_hdr_music[0]), (_t_osd_hdr *)&osd_hdr_music);
  800. #ifdef DIV_GOTO_DISPLAY//zhaoyanhua add 03-10-22 13:17
  801.     SetOsdCol(2,2,0,0x1e1e1e00);//region 2 transent.
  802.     SetOsdCol(2,2,10,0x1e1e1ee0);
  803.     //SetOsdCol(0,0,0,0x1e1e1ea0);
  804. #endif//end DIV_GOTO_DISPLAY
  805.     #ifdef CD_PLAYER    //liweihua add 2003-9-11
  806.     if(cd_type_loaded == CDDA)
  807.         {
  808.             SetOsdCol(0,1,0,0x1e1e1e00);
  809.             SetOsdCol(1,1,3,__palette4F(128,255,0,0xff));
  810.             SetOsdCol(0,0,5,__palette4F(128,64,255,0xff));
  811.             SetOsdCol(0,0,8,__palette4F(128,255,0,0xff));
  812.             SetOsdCol(0,0,9,__palette4F(128,255,0,0xff));
  813.         }
  814.     #endif
  815. }
  816. #ifdef DOUBLE_TITLE //susu add 2003-8-20 14:43
  817. const   _t_osd_hdr osd_hdr_double_title[] = {
  818. #ifdef DISP_REGION_BOTTOM
  819.     {360, OSD_FONT_HEIGHT+8 , 10, 216, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},    // 8 for cdrom display region
  820. #endif
  821.     {36*4*2,OSD_FONT_HEIGHT+5,32,34,  SETUP_HEADER, OSD_FORMAT_16COLOR,OSD_INTERLACED}, // 1
  822. #ifndef OSD_BMP_DISPLAY
  823.     {38*8, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  824. #else
  825.     {360, OSD_FONT_HEIGHT+8 , 0, 20, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  826. #endif//OSD_BMP
  827. };
  828. void osd_init_double_title(void)
  829. {
  830.     osd_puts("osd_init_double_titlen");
  831.     osd_init_regions( sizeof(osd_hdr_double_title)/sizeof(osd_hdr_double_title[0]), (_t_osd_hdr *)&osd_hdr_double_title);
  832.     
  833. }
  834. #endif
  835. #ifndef NES_USE_GRAPH
  836. #ifdef OSD_PAL_RGB_16b                
  837. void CreateNesOsd(int x,int y,int w,int h,UINT16 *pPalette)
  838. #else
  839. void CreateNesOsd(int x,int y,int w,int h,UINT32 *pPalette)
  840. #endif
  841. {    
  842.     osd_puts("osd_init_nesn");
  843.     __osd_init();
  844.     header_id = NES_HEADER;
  845.     osd__pal[header_id] = pPalette;
  846.     
  847.     //setup region 1    
  848.     region[1].osd_w = w;        
  849.     region[1].osd_h = h;    
  850.     osd_create_region1(&region[1], x, y, NULL, OSD_FORMAT_256COLOR, OSD_NONINTERLACED);
  851.     
  852.     //setup region 0    
  853.     region[0].osd_w = w;        
  854.     region[0].osd_h = h;    
  855.     osd_create_region1(&region[0], x, y, &region[1], OSD_FORMAT_256COLOR, OSD_NONINTERLACED);
  856.         
  857.     osd_active_regions = 2;
  858.     ENABLE_OSD();    
  859. }
  860. #endif
  861. #ifdef CD_PLAYER//liweihua 2003-9-3
  862. void osd_init_cdplayer(void)
  863. {
  864.     __osd_init();
  865.     #ifdef VIRTUAL_KEYBOARD
  866.     header_id = KEYBOARD_HEADER;
  867.     region[4].osd_w = 64*3;
  868.     region[4].osd_h = (OSD_FONT_HEIGHT+8)*6;
  869.     osd_create_region1(&region[4], 256, 168, NULL,OSD_FORMAT_256COLOR,OSD_INTERLACED);
  870.     #endif
  871.     
  872.     //setup region 2(for cd player setting)
  873.     header_id = EQ_HEADER;
  874.     region[3].osd_w = 38*4-44;
  875.     region[3].osd_h = (OSD_FONT_HEIGHT+8)*6;
  876.     osd_create_region1(&region[3], 32+60+37,  72, &region[4],OSD_FORMAT_16COLOR,OSD_INTERLACED);
  877.     //region2   
  878.     header_id = NORMAL_HEADER;
  879.     region[2].osd_w = 36*4;
  880.     region[2].osd_h = OSD_FONT_HEIGHT;
  881.     osd_create_region1(&region[2], 32,  42+4, &region[3],OSD_FORMAT_4COLOR,OSD_INTERLACED);
  882.    // setup region 1
  883.     header_id = NORMAL_HEADER;
  884.     region[1].osd_w = 36*4;
  885.     region[1].osd_h = OSD_FONT_HEIGHT;
  886.     osd_create_region1(&region[1], 32,  34, &region[2],OSD_FORMAT_4COLOR,OSD_INTERLACED);
  887.     SetOsdCol(1,1,3,__palette4F(128,255,0,0xff));
  888.         
  889.     // setup region 0
  890.     header_id = SETUP_HEADER;
  891.     region[0].osd_w = 38*8;
  892.     region[0].osd_h = OSD_FONT_HEIGHT;
  893.     osd_create_region1(&region[0], 24+2,  20, &region[1], OSD_FORMAT_16COLOR, OSD_INTERLACED);
  894.     SetOsdCol(0,4,0,0x1e1e1e00);
  895.     SetOsdCol(0,0,5,__palette4F(128,64,255,0xff));
  896.     SetOsdCol(0,0,8,__palette4F(128,255,0,0xff));
  897.     SetOsdCol(0,0,9,__palette4F(128,255,0,0xff));
  898.     
  899.     osd_init__();  
  900. }
  901. #endif
  902. #ifdef VIRTUAL_KEYBOARD //liweihua add 03-8-15
  903. const   _t_osd_hdr osd_keyboard[] = {
  904. #ifdef DISP_REGION_BOTTOM
  905.     {360, OSD_FONT_HEIGHT+8 , 10, 216, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED},    // 8 for cdrom display region
  906. #endif
  907.     //{64*3, (OSD_FONT_HEIGHT+8)*6,256,168, KEYBOARD_HEADER, OSD_FORMAT_256COLOR,OSD_INTERLACED},  // 4
  908.     #ifdef  NINTAUS_DVD //Maoyong 2004.03.11
  909.     {160, 140,256,154, KEYBOARD_HEADER, OSD_FORMAT_256COLOR,OSD_INTERLACED},  // 4//20040225
  910.     #else
  911.     {160, 140,256,168, KEYBOARD_HEADER, OSD_FORMAT_256COLOR,OSD_INTERLACED},  // 4//20040225
  912.     #endif
  913.     #ifdef CD_PLAYER
  914.     {38*4-44,(OSD_FONT_HEIGHT+8)*6,32+60+37,72, EQ_HEADER, OSD_FORMAT_16COLOR,OSD_INTERLACED},  // 3
  915.     #endif
  916.     {36*4, OSD_FONT_HEIGHT, 32, 46, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 2
  917.     {36*4, OSD_FONT_HEIGHT, 32, 34, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 1
  918. #ifndef OSD_BMP_DISPLAY
  919.     {38*8, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  920. #else
  921.     {360, OSD_FONT_HEIGHT+8 , 0, 20, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  922. #endif//OSD_BMP
  923. };
  924. void osd_init_keyboard(void)
  925. {
  926.     osd_puts("osd_init_keyn");
  927.     osd_init_regions( sizeof(osd_keyboard)/sizeof(osd_keyboard[0]), (_t_osd_hdr *)&osd_keyboard);
  928.     #ifdef CD_PLAYER
  929.     SetOsdCol(4,4,0,0x1e1e1e00);
  930.     #else
  931.     SetOsdCol(3,3,0,0x1e1e1e00);
  932.     #endif
  933. }
  934. #endif
  935. #ifdef PMP_UI//liweihua 204-12-28
  936. const   _t_osd_hdr osd_pmp[] = {
  937. {38*8,(OSD_FONT_HEIGHT+8)*10,32,46, EQ_HEADER, OSD_FORMAT_16COLOR,OSD_INTERLACED},  // 3
  938.     // 2
  939.     {36*4, OSD_FONT_HEIGHT, 32, 34, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 1
  940. #ifndef OSD_BMP
  941.     {38*8, OSD_FONT_HEIGHT, 26, 20, SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  942. #else
  943.     {360, OSD_FONT_HEIGHT+8 , 0, 20, BMP_DISPLAY_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  944. #endif//OSD_BMP    
  945. };
  946. void osd_init_pmp(void)
  947. {
  948. osd_puts("osd_init_pmpn");
  949.     osd_init_regions( sizeof(osd_pmp)/sizeof(osd_pmp[0]), (_t_osd_hdr *)&osd_pmp); 
  950.     SetOsdCol(2,2,0,0x1e1e1e00);   
  951. }
  952. #endif
  953. #ifdef REALCOLOR_SCREENSAVER
  954. const   _t_osd_hdr osd_screensaver[] = {
  955.     {60*3, (OSD_FONT_HEIGHT+9)*6,2,2, SCREENSAVER_HEADER, OSD_FORMAT_256COLOR,OSD_INTERLACED},  // 1
  956. };
  957. void osd_init_screensaver(void)
  958. {
  959.     osd_puts("osd_init_keyn");
  960.     osd_init_regions( sizeof(osd_screensaver)/sizeof(osd_screensaver[0]), (_t_osd_hdr *)&osd_screensaver);
  961.     SetOsdCol(0,0,0,0x000ff);
  962. }
  963. #endif
  964. /*
  965. * Draw BMP on osd region r with 256 colors.
  966. * The bmp image data and platte was made by image processing software.
  967. */
  968. void osd_draw_256color_bmp(int xStart, int yStart,BYTE* bmp, BYTE r)
  969. {
  970.     //BYTE    *pIcon;
  971.     UINT32  *pTopLine, *pBtmLine;
  972.     UINT32  iDispLoc;
  973.     
  974.     int     i, j, k;
  975.     int     iFontWidth, iFontHigh;
  976.     int     iRegionWidth = region[r].osd_w;
  977.     osd_tog_region(r, OSD_ON);
  978.     iRegionWidth = region[r].osd_w;
  979.     //initialize buffer start
  980.     pTopLine = (UINT32 *)get_osdbuf_region_ptr(r,0);   // region r top
  981.     pBtmLine = (UINT32 *)get_osdbuf_region_ptr(r,1);   // region r bot
  982.    
  983.     //skip n blank line on top(in pixel)
  984.     //for interlace mode, we will skip n/2 blank lines, for example 4/2=2
  985.     yStart+=2;
  986.     UINT32 pixel4;
  987.     UINT32 pos;
  988.     //get Keyboard bmp information
  989.     iFontWidth  = bmp[0];
  990.     iFontHigh   = bmp[1];
  991.     //start to process
  992.     pos = 2;    
  993.         
  994.     for (j=0; j<iFontHigh; j++)
  995.     {
  996.         int yy;
  997.         UINT32 *pp;
  998.         yy = (p_scan) ? yStart : yStart>>1;
  999.         pp = (yStart&1) ? pBtmLine : pTopLine;
  1000.         iDispLoc = (yy*iRegionWidth*2/8) + (xStart);
  1001.         for (i=0; i<(iFontWidth/4); i++) // every 4-bytes a time, every 1-pixel a byte
  1002.         {
  1003.             pixel4=0;
  1004.             // 0x12345678  ==>  0x78563412
  1005.             for (k=0;k<4;k++)
  1006.             {
  1007.                 unsigned curByte = bmp[pos++];
  1008.                 pixel4 = pixel4 | (curByte<<8*k);
  1009.             }
  1010.             pp[iDispLoc+i] =  pixel4;
  1011.         }
  1012.         yStart++;
  1013.     }//for key heigh
  1014.     timeout_osd[r] = 0;
  1015. }
  1016. #ifdef NEW_PARENTAL_GUI//zhaoyanhua add for BBK DVD 2003-11-28 10:49
  1017. const   _t_osd_hdr osd_hdr_parental[] = {
  1018.  //  {38*8, OSD_FONT_HEIGHT*4, 32,46 , SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED} ,     // 2
  1019.    //{36*4, OSD_FONT_HEIGHT, 32, 34, NORMAL_HEADER, OSD_FORMAT_4COLOR,  OSD_INTERLACED},     // 1
  1020.    {38*6, OSD_FONT_HEIGHT*6, 80, 67, SETUP_HEADER,  OSD_FORMAT_16COLOR, OSD_INTERLACED}      // 0
  1021. };
  1022. void osd_init_parental_gui(void)
  1023. {
  1024.     osd_init_regions( sizeof(osd_hdr_parental)/sizeof(osd_hdr_parental[0]), (_t_osd_hdr *)&osd_hdr_parental);
  1025.    
  1026. }
  1027. #endif
  1028. /*  freyman marked 2004-3-23 15:11 for no use
  1029. #ifdef SVA_SAMPLE
  1030. //
  1031. // FUNCTION
  1032. // osd_init_ampvol
  1033. // 
  1034. // DESCRIPTION
  1035. // initialize (3dsound)osd-printing function
  1036. //
  1037. void osd_init_ampvol(void)
  1038. {
  1039.     osd_puts("osd_init_ampvoln");
  1040.     __osd_init();    
  1041.     // setup region 7
  1042.     region[7].osd_w = 36*4;
  1043.     region[7].osd_h = OSD_FONT_HEIGHT+5;
  1044.     osd_create_region1(&region[7], 65,  114+4+40, NULL,OSD_FORMAT_4COLOR,OSD_INTERLACED);
  1045.     
  1046.     // setup region 6
  1047.     region[6].osd_w = 36*4;
  1048.     region[6].osd_h = OSD_FONT_HEIGHT+5;
  1049.     osd_create_region1(&region[6], 65,  100+4+40, &region[7],OSD_FORMAT_4COLOR,OSD_INTERLACED);
  1050.     
  1051.     // setup region 5
  1052.     region[5].osd_w = 36*4;
  1053.     region[5].osd_h = OSD_FONT_HEIGHT+5;
  1054.     osd_create_region1(&region[5], 65,  86+4+40, &region[6],OSD_FORMAT_4COLOR,OSD_INTERLACED);
  1055.     
  1056.     // setup region 4
  1057.     region[4].osd_w = 36*4;
  1058.     region[4].osd_h = OSD_FONT_HEIGHT+5;
  1059.     osd_create_region1(&region[4], 65,  72+4+40, &region[5],OSD_FORMAT_4COLOR,OSD_INTERLACED);
  1060.     
  1061.     // setup region 3
  1062.     region[3].osd_w = 36*4;
  1063.     region[3].osd_h = OSD_FONT_HEIGHT+5;
  1064.     osd_create_region1(&region[3], 65,  58+4+40, &region[4],OSD_FORMAT_4COLOR,OSD_INTERLACED);
  1065.     
  1066.     // setup region 2
  1067.     region[2].osd_w = 36*4;
  1068.     region[2].osd_h = OSD_FONT_HEIGHT+5;
  1069.     osd_create_region1(&region[2], 65,  44+4+40, &region[3],OSD_FORMAT_4COLOR,OSD_INTERLACED);
  1070.     
  1071.     // setup region 1
  1072.     region[1].osd_w = 36*4;
  1073.     region[1].osd_h = OSD_FONT_HEIGHT+5;
  1074.     osd_create_region1(&region[1], 65,  30+4+40, &region[2],OSD_FORMAT_4COLOR,OSD_INTERLACED);
  1075.     
  1076.     // setup region 0
  1077.     header_id = SETUP_HEADER
  1078.     region[0].osd_w = 38*8;
  1079.     region[0].osd_h = 1*(OSD_FONT_HEIGHT+2);
  1080.     osd_create_region1(&region[0], 26,  16+4, &region[1], OSD_FORMAT_16COLOR, OSD_INTERLACED);//nono 2-3-11 14:03 for yuxing
  1081.     
  1082.     osd_active_regions = 8;
  1083.     osd_init__();
  1084. }
  1085. #endif//SVA_SAMPLE
  1086. */
  1087. //zhaoyanhua add this function to set NEW osd region for NEW_STYLE SETUP. 3-7-14 17:35
  1088. #ifdef NEW_STYLE_SETUP
  1089. void    osd_init_hand_ICON_for_NTSC(void)//NTSC
  1090. {
  1091.     osd_puts("osd_init_hand_ICONn");
  1092.     __osd_init();
  1093.    #if 0
  1094.     //region 2
  1095.     header_id = SETUP_HEADER;
  1096.     region[2].osd_w = 160;//64;//40-8;                  //35 English Characters
  1097.     region[2].osd_h = 80;//40+14;//12 lines
  1098.     osd_create_region1(&region[2], 30, 210,  NULL, OSD_FORMAT_16COLOR, OSD_INTERLACED);
  1099.     //SetOsdCol(2,2,0,0x1e1e1e00);//Initial color index is 0,but not transparent. zhaoyanhua 3-7-11 13:41
  1100.    // osd_tog_region(2,OSD_OFF);
  1101.     #endif
  1102.     //setup menu
  1103.     header_id = SETUP_HEADER;
  1104.     region[1].osd_w = 38*8;//22*8;                  //35 English Characters
  1105.     region[1].osd_h = 11*SETUP_BTN_HEIGHT;//9*SETUP_BTN_HEIGHT+24 ;//9*SETUP_BTN_HEIGHT;//7*SETUP_BTN_HEIGHT;//6*SETUP_BTN_HEIGHT+8;   //12 lines
  1106.     osd_create_region1(&region[1], 26/*110,115*/, 62/*50*/, NULL,OSD_FORMAT_16COLOR, OSD_INTERLACED);//60//54
  1107.     SetOsdCol(1,1,0,0x1e1e1e00);//Initial color index is 0,but not transparent. zhaoyanhua 3-7-11 13:41
  1108.     //osd_tog_region(1,OSD_OFF);
  1109.     //region 0
  1110.     header_id = SETUP_HEADER;
  1111.     region[0].osd_w = 160;//64;//40-8;                  //35 English Characters
  1112.     region[0].osd_h = 76;//40+14;//12 lines
  1113.     osd_create_region1(&region[0], 130,  24, &region[1], OSD_FORMAT_16COLOR, OSD_INTERLACED);
  1114.     SetOsdCol(0,0,0,0x1e1e1e00);//Initial color index is 0,but not transparent. zhaoyanhua 3-7-11 13:41
  1115.     osd_tog_region(0,OSD_OFF);
  1116.     osd_active_regions = 2;
  1117.     osd_init__();
  1118. //  ENABLE_OSD();
  1119. }
  1120. void    osd_init_hand_ICON_for_PAL(void)//for PAL
  1121. {
  1122.     __osd_init();
  1123.    
  1124.     //setup menu
  1125.     header_id = SETUP_HEADER;
  1126.     region[1].osd_w = 38*8;//22*8;                  //35 English Characters
  1127. //gerry for DVD disc,maybe need test,2003-12-31 18:06
  1128. //    region[1].osd_h = 13*SETUP_BTN_HEIGHT+10;//9*SETUP_BTN_HEIGHT+24 ;//9*SETUP_BTN_HEIGHT;//7*SETUP_BTN_HEIGHT;//6*SETUP_BTN_HEIGHT+8;   //12 lines
  1129.     region[1].osd_h = 11*SETUP_BTN_HEIGHT;
  1130.     osd_create_region1(&region[1], 26/*110,115*/, 78-2-2/*50*/, NULL,OSD_FORMAT_16COLOR, OSD_INTERLACED);//60//54//nono 20030804
  1131.     SetOsdCol(1,1,0,0x1e1e1e00);//Initial color index is 0,but not transparent. zhaoyanhua 3-7-11 13:41
  1132.     //osd_tog_region(1,OSD_OFF);
  1133.     //region 0
  1134.     header_id = SETUP_HEADER;
  1135.     region[0].osd_w = 160;//64;//40-8;                  //35 English Characters
  1136.     region[0].osd_h = 76;//40+14;//12 lines
  1137.     osd_create_region1(&region[0], 130,  35-5, &region[1], OSD_FORMAT_16COLOR, OSD_INTERLACED);//nono 20030804
  1138.     SetOsdCol(0,0,0,0x1e1e1e00);//Initial color index is 0,but not transparent. zhaoyanhua 3-7-11 13:41
  1139.     osd_tog_region(0,OSD_OFF);
  1140.     osd_active_regions = 2;
  1141.     osd_init__();
  1142. //  ENABLE_OSD();
  1143. }
  1144. void
  1145. osd_init_setup(void)
  1146. {
  1147.     osd_puts("osd_init_setupn");
  1148.     __osd_init();
  1149.     
  1150.     header_id = SETUP_HEADER;
  1151.     
  1152.     region[1].osd_w = 35*8;                  //35 English Characters
  1153.     region[1].osd_h = 12*SETUP_BTN_HEIGHT;   //12 lines
  1154.     #ifdef SETUP_ADJUST_LOCATION_WHEN_PAL
  1155.     if(tv_format==MODE_PAL)                  //lizhx       2004/05/21
  1156.             osd_create_region1(&region[1], 45,  (23+22), NULL, OSD_FORMAT_16COLOR, OSD_INTERLACED);
  1157.     else
  1158.     #endif
  1159.     osd_create_region1(&region[1], 45,  23, NULL, OSD_FORMAT_16COLOR, OSD_INTERLACED);
  1160.     SetOsdCol(1,1,0,0x1e1e1e00);//Initial color index is 0,but not transparent. zhaoyanhua 3-7-11 13:41
  1161.     
  1162.     region[0].osd_w = 8;                  //35 English Characters
  1163.     region[0].osd_h = 8+4;   //12 lines
  1164.      #ifdef SETUP_ADJUST_LOCATION_WHEN_PAL
  1165.     if(tv_format==MODE_PAL)                  //lizhx       2004/05/21
  1166.             osd_create_region1(&region[0], 38,  (2+22), &region[1], OSD_FORMAT_16COLOR, OSD_INTERLACED);
  1167.     else
  1168.     #endif
  1169.             osd_create_region1(&region[0], 38,  2,&region[1], OSD_FORMAT_16COLOR, OSD_INTERLACED);
  1170.     osd_tog_region(0,OSD_OFF);
  1171.     
  1172.     osd_active_regions = 2;
  1173.     ENABLE_OSD();
  1174. }
  1175. #elif defined(SOFT_MENU)//Modifed by ChenZhao on 2004-9-2 14:23 WP
  1176. void
  1177. osd_init_setup(void)
  1178. {
  1179. UINT16 screen_h,screen_w;
  1180.     osd_puts("osd_init_setupn");
  1181.     __osd_init();
  1182.     header_id = SETUP_HEADER;
  1183.     region[SETUP_REGION].osd_w = SETUP_REGION_WIDTH;    //35 English Characters
  1184.     region[SETUP_REGION].osd_h = SETUP_REGION_HEIGHT;   //12 lines
  1185.     if(getVPP_TVsystem())//(TV_FORMAT_PAL==tv_format)//Modifed by chenzhao on 2004-11-16 24:50   
  1186.      {
  1187.      screen_h=288;
  1188. screen_w=352;
  1189.      }
  1190. else
  1191. {
  1192. screen_h=240;
  1193. screen_w=360;//Modifed by chenzhao on 2004-11-16 24:55   
  1194. }
  1195.     osd_create_region1(&region[SETUP_REGION],(screen_w-SETUP_REGION_WIDTH)/2,(screen_h-SETUP_REGION_HEIGHT/2)/2, NULL, OSD_FORMAT_16COLOR, OSD_INTERLACED);
  1196.     //osd_create_region1(&region[SETUP_REGION], SETUP_REGION_X,  SETUP_REGION_Y, NULL, OSD_FORMAT_16COLOR, OSD_INTERLACED);
  1197. osd_draw_rect(0,0,SETUP_REGION_WIDTH<<1,SETUP_REGION_HEIGHT,SETUP_BGCOLOR);
  1198. osd_active_regions = 1;
  1199. ENABLE_OSD();
  1200. }
  1201. #else
  1202. // for supporting 16_bit OSD
  1203. #ifdef SUPPORT_16BIT_OSD
  1204. #include "OSD_16BDC.c"
  1205. #endif
  1206. void
  1207. osd_init_setup(void)
  1208. {
  1209.     osd_puts("osd_init_setupn");
  1210.     __osd_init();
  1211. #ifdef QSI_SETUP_MENU_DESIGN//liweihua 2004-7-5 9:46
  1212.     header_id = QSI_SETUP_HEADER;
  1213. #else
  1214.     header_id = SETUP_HEADER;
  1215. #endif
  1216. #ifdef NEW_SETUP_OSD         // majinping 2002-05-02 for new setup menu
  1217.     region[0].osd_w = 37*8;                  //35 English Characters    
  1218.     region[0].osd_h = 13*SETUP_BTN_HEIGHT;   //13 lines
  1219.     #ifdef SETUP_ADJUST_LOCATION_WHEN_PAL
  1220.     if(tv_format==MODE_PAL) 
  1221.        osd_create_region1(&region[0], 30, (15+22), NULL, OSD_FORMAT_16COLOR, OSD_INTERLACED);    
  1222.     else
  1223.     #endif
  1224.     osd_create_region1(&region[0], 30, 15, NULL, OSD_FORMAT_16COLOR, OSD_INTERLACED);    
  1225. #else    
  1226.     #ifdef SUPPORT_FUNCTION_MENU
  1227.     #ifdef SUPPORT_DISPLAY_MENU
  1228.     if(In_Display_Menu())
  1229.     {
  1230.       region[0].osd_w = 20*8;                 //15 English Characters
  1231.       region[0].osd_h = 10*SETUP_BTN_HEIGHT;   //9 lines
  1232.       osd_create_region1(&region[0], 38,  32, NULL, OSD_FORMAT_16COLOR, OSD_INTERLACED);
  1233.     }
  1234.     else
  1235.     #endif
  1236.     if(full_scrn&SETUP_PLUS)
  1237.     {
  1238.       region[0].osd_w = 32*8;                 //32 English Characters
  1239.       region[0].osd_h = 6*SETUP_BTN_HEIGHT;   //5 lines
  1240.       osd_create_region1(&region[0], 38,  32, NULL, OSD_FORMAT_16COLOR, OSD_INTERLACED);
  1241.     }
  1242.     else
  1243.     {
  1244.     #endif
  1245.     region[0].osd_w = 35*8;                  //35 English Characters
  1246.     region[0].osd_h = 12*SETUP_BTN_HEIGHT;   //12 lines
  1247.     #ifdef SETUP_ADJUST_LOCATION_WHEN_PAL
  1248.     if(tv_format==MODE_PAL)                  //lizhx       2004/05/21
  1249.        osd_create_region1(&region[0], 38,  (24+22), NULL, OSD_FORMAT_16COLOR, OSD_INTERLACED);
  1250.     else
  1251.     #endif
  1252.     osd_create_region1(&region[0], 38,  24, NULL, OSD_FORMAT_16COLOR, OSD_INTERLACED);
  1253.     #ifdef SUPPORT_FUNCTION_MENU
  1254.     }
  1255.     #endif //end #ifdef SUPPORT_FUNCTION_MENU
  1256. #endif 
  1257.     osd_active_regions = 1;
  1258.     ENABLE_OSD();
  1259. }
  1260. #endif //end NEW_STYLE_SETUP
  1261. //fengjl add for bbk's new setup 3-11-10 16:57
  1262. #if defined(BBK_NEW_SETUP)&&defined(BBK_DV961_DVD)       
  1263. void osd_init_bbk_setup(void)  
  1264. {   
  1265.     #define SETUP_HL_COLOR      5
  1266.     
  1267.     osd_puts("osd_init_setupn");
  1268.     __osd_init();    
  1269.    
  1270.     header_id =SETUP_HEADER;
  1271.     region[1].osd_w = 32*8;                  //33 English Characters
  1272.     region[1].osd_h = 6*SETUP_BTN_HEIGHT;   //6 lines
  1273.     osd_create_region1(&region[1], 53, 4*SETUP_BTN_HEIGHT-9, NULL, OSD_FORMAT_16COLOR, OSD_INTERLACED);
  1274.     //SetOsdCol(1,1,0,0x1e1e1ef0);//black zhaoyanhua add 2003-12-2 14:21 
  1275.      SetOsdCol(1,1,0,0x757575f0);
  1276.     SetOsdCol(1,1,SETUP_HL_COLOR,0xa346ffff);
  1277.     //SetOsdCol(1,1,0,0x1e1e1ecd);//Initial color index is 0,but not transparent. zhaoyanhua 3-7-11 13:41
  1278.     
  1279.     header_id =BBK_SETUP_256HEADER;
  1280.     region[0].osd_w = 32*16;                  //33 English Characters
  1281.     region[0].osd_h = 5*SETUP_BTN_HEIGHT;   //6 lines
  1282.     osd_create_region1(&region[0], 53, 1*SETUP_BTN_HEIGHT+10, &region[1], OSD_FORMAT_256COLOR, OSD_INTERLACED);
  1283.     //SetOsdCol(0,0,0,0x1e1e1ecd);
  1284.     SetOsdCol(0,0,0,0x757575f0);// black zhaoyanhua add 2003-12-2 14:20
  1285.      
  1286.     osd_active_regions = 2;
  1287.     ENABLE_OSD(); 
  1288.     osd_init__();    
  1289.     
  1290.     osd_draw_icon_bbk(4,20,0);
  1291.     osd_draw_icon_bbk(68,23,1);         
  1292. }
  1293. void osd_draw_icon_bbk(int xStart, int yStart,int index)
  1294. {
  1295.     BYTE    *icon_bbk;
  1296.     UINT32  *pTopLine, *pBtmLine;
  1297.     UINT32  iDispLoc, iIconLoc;
  1298.     int     need_gray=0;
  1299.     int     i, j, k;
  1300.     int     iFontWidth, iFontHigh;
  1301.     int     iRegionWidth = region[0].osd_w;
  1302.     osd_tog_region(0, OSD_ON);  
  1303.     
  1304.     //initialize buffer start
  1305.     pTopLine = (UINT32 *)get_osdbuf_region_ptr(0,0);   // region 0 top
  1306.     pBtmLine = (UINT32 *)get_osdbuf_region_ptr(0,1);   // region 0 bot
  1307.     iIconLoc = 0;
  1308.     
  1309.     //skip n blank line on top(in pixel)
  1310.     //for interlace mode, we will skip n/2 blank lines, for example 4/2=2
  1311.     yStart+=2;
  1312.      
  1313.     {
  1314.         UINT32 pixel4;
  1315.         UINT32 pos;
  1316.         
  1317.         iIconLoc++;        
  1318.         icon_bbk = Pic_table[index];
  1319.        // icon_bbk = get_font_entry(2, index);
  1320.         //start to process
  1321.         pos = 2;
  1322.         
  1323.         //get icon information
  1324.                 
  1325.         iFontWidth  =(int) icon_bbk[0];
  1326.         iFontHigh   = (int)icon_bbk[1];
  1327.                
  1328.         for (j=0; j<iFontHigh; j++) 
  1329.         {
  1330.             int yy;
  1331.             UINT32 *pp;
  1332.             yy = (p_scan) ? yStart : yStart>>1;
  1333.             pp = (yStart&1) ? pBtmLine : pTopLine;
  1334.             
  1335.             iDispLoc = (yy*iRegionWidth*2/8) + (xStart);
  1336.             for (i=0; i<(iFontWidth/4); i++) // every 4-bytes a time, every 1-pixels a byte
  1337.             {
  1338.                 pixel4=0; 
  1339.                
  1340.                 for (k=0;k<4;k++)
  1341.                 {                    
  1342.                     unsigned curByte = icon_bbk[++pos];
  1343.                  
  1344.                     pixel4 = pixel4 | (curByte<<8*k);    
  1345.                 }
  1346.                 pp[iDispLoc+i] =  pixel4;
  1347.             }
  1348.             yStart++;
  1349.         }//for icon heigh  
  1350.     }
  1351.     timeout_osd[0] = 0;
  1352. }
  1353. #endif  // end bbk's new setup
  1354. #ifdef ROLL_SHOW_SETUP
  1355. /****************************************
  1356. FUNC:  similar to osd_draw_hline_region();
  1357.        difference: write button data to BUFFER not 
  1358.                     to SCREEN
  1359.         
  1360. Creator :zhaoyanhua 
  1361. Date:    2003-8-15 15:49
  1362. ****************************************/
  1363. void MoveRect2buf(int xStart, int xEnd, int yStart, unsigned color, int yLen, int r)
  1364. {
  1365.     UINT8   *buf;
  1366.     int  i, j;
  1367.     //UINT8   *pTopLine, *pBtmLine;
  1368.     int     iRegionWidth  = region[r].osd_w;
  1369.     int     iRegionHeight = region[r].osd_h;
  1370.     UINT32   iDispLoc = 0;  
  1371.     
  1372.     
  1373.      buf = (UINT8 *)(SDRAM_BASE + P_BIDIR_LUMA*1024 + yStart*iRegionWidth );
  1374.     // setup color pixel (only support 16-color here)
  1375.     color &= 0x0f;
  1376.     //ButtonC = (color | (color<<4) | (color<<8) |color<<12)| (color<<16)|(color<<20) |(color<<24) | (color<<28));
  1377.     color =(color | (color<<4));
  1378.     
  1379.     for (j = 0; j < yLen; j++ )
  1380.     { 
  1381.         iDispLoc = j * iRegionWidth  ;
  1382.         for (i = xStart/2; i< (xEnd/2); i++) //draw one line
  1383.             buf[iDispLoc + i]= color;
  1384.     }
  1385.      
  1386. }
  1387. /***************************************
  1388. FUNC: 
  1389.       write string data to BUFFER not to SCREEN
  1390. Creator: zhaoyanhua 
  1391. Date: 2003-8-18 11:46
  1392. ****************************************/
  1393. void MoveString2Buf(BYTE xStart, BYTE yStart,BYTE * str, BYTE fontColor, BYTE bkColor)
  1394. {
  1395.     BYTE    c;
  1396.     BYTE    *pFont;
  1397.     UINT32  *pTopLine, *pBtmLine;
  1398.     int     cc;
  1399.     UINT32  iStrLoc;
  1400.     int     iRegionWidth;
  1401.     UINT32  *buf;
  1402.     cc = xStart*16;//pixels.
  1403.     iRegionWidth = region[SETUP_REGION].osd_w;
  1404.     // initialize buffer start
  1405.     //pTopLine = (UINT32 *)get_osdbuf_region_ptr(SETUP_REGION, 0);
  1406.     //pBtmLine = (UINT32 *)get_osdbuf_region_ptr(SETUP_REGION, 1);
  1407.      buf= (UINT32 *)(SDRAM_BASE + P_BIDIR_LUMA*1024 + (yStart*SETUP_BTN_HEIGHT+4)*iRegionWidth+ xStart);     
  1408.     //process each charactor until string ending('')
  1409.     iStrLoc = 0;
  1410.     while ((c = ((BYTE *)str)[iStrLoc]) != '')
  1411.     {
  1412.         int     i, j, k;
  1413.         int     iFontWidth, iFontHigh;
  1414.         UINT32  pos;
  1415.         
  1416.         
  1417.         iStrLoc++;
  1418.         
  1419.         if (c == 'r') {                    //prefix characher: to use font_table2
  1420.             if ( (c = ((BYTE *)str)[iStrLoc])=='' ) break;
  1421.             iStrLoc++;
  1422.             if ((pFont = get_font_entry(1,c))==NULL) continue;
  1423.         } else {
  1424.             //get current char entry
  1425.             pFont = get_font_entry(0,c);
  1426.         }
  1427.         
  1428.         //start to process
  1429.         pos = 2;
  1430.         
  1431.         //get font information
  1432.         iFontWidth = (int)pFont[0];
  1433.         iFontHigh  = (int)pFont[1];
  1434.         
  1435.         //start this character
  1436.         for (j=0; j<iFontHigh; j++) {
  1437.             UINT32 *pp;
  1438.             int     yy;
  1439.             int     iDispLoc;
  1440.             yy  = j;
  1441.             iDispLoc = yy*(iRegionWidth/4) + (cc/8);
  1442.             
  1443.             //draw top line
  1444.             for (i=0; i<iFontWidth/8; i++) {
  1445.                 unsigned pat;
  1446.                 unsigned curByte;
  1447.                 UINT32 pixel8;
  1448.                 
  1449.                 pat = pFont[++pos];
  1450.                 curByte = ((pat&0xc0)>>6) | ((pat&0x30)>>2) | ((pat&0x0c)<<2) | ((pat&0x03)<<6);
  1451.                 pixel8 = 0;
  1452.                 for (k=0; k<8; k++) {       // for every-bit of pattern
  1453.                     if ( (1<<k) & curByte ) {          
  1454.                         pixel8 = pixel8 | (fontColor<<(k*4));
  1455.                     } else {
  1456.                         pixel8 = pixel8 | (bkColor<<(k*4));
  1457.                     }
  1458.                 }
  1459.               //pp[iDispLoc+i] = pixel8;
  1460.                buf[iDispLoc+i] = pixel8;
  1461.             }
  1462.         }
  1463.         cc+=iFontWidth; 
  1464.     }
  1465.     
  1466.     timeout_osd[SETUP_REGION] = 0;
  1467.     osd_tog_region(SETUP_REGION, OSD_ON);   
  1468. }
  1469. extern BYTE setupItemNum[3];
  1470. //
  1471. // Bytes/Line = 37*16*4/8 = 296
  1472. //
  1473. /****************************************
  1474. FUNC:  
  1475.         draw the data to the SCREEN from 
  1476.         BUFFER
  1477.         
  1478.         BUF: P_BIDIR_LUMA
  1479.         EFFECT MODE: h_window .
  1480.     INPUT: 
  1481.         xStart:
  1482.         xEnd  :  unit is char.
  1483.         
  1484. Creator :zhaoyanhua 
  1485. Date:    2003-8-18 11:51        
  1486. *****************************************/
  1487. void MoveBuf2OSD(UINT16 xStart, UINT16 xEnd)
  1488. {
  1489.     UINT32  *buf;
  1490.     UINT32  *pTopLine, *pBtmLine;
  1491.     BYTE    i,step;
  1492.     UINT32  j, k;   
  1493.     UINT16  ButtonHight;//one BUTTON HIGHT.
  1494.     
  1495.     osd_tog_region(SETUP_REGION, OSD_ON);  
  1496.     buf = (UINT32 *)(SDRAM_BASE + P_BIDIR_LUMA*1024 );    
  1497.     //buf = (UINT32 *)(osd_temp_buf);
  1498.     
  1499.     //initialize buffer start    
  1500.     pTopLine = (UINT32 *)get_osdbuf_region_ptr(SETUP_REGION,0);
  1501.     pBtmLine = (UINT32 *)get_osdbuf_region_ptr(SETUP_REGION,1);
  1502.     //end=iLine;
  1503.     ButtonHight = 32;
  1504.     step=1;
  1505.     if(p_scan==0)
  1506.     {
  1507.        
  1508.        ButtonHight = 16;
  1509.        step=2;
  1510.     }
  1511.     else
  1512.     {
  1513.         ButtonHight = 32;
  1514.         step=1;
  1515.         
  1516.     }
  1517.     #if 0 //2 BUTTON cocurrently display.
  1518.     int m;
  1519.     printf("setupItemNum=%dn",setupItemNum[1]);
  1520.     for (i = 0; i<ButtonHight; i++)//for (i = 0; i<32/2; i++)
  1521.     {
  1522.         delay_1ms(10);
  1523.         for (m =0; m < (setupItemNum[1]-1); m+=2)  
  1524.         {
  1525.            //NOTE:  
  1526.            //      xStart*16        : pixels
  1527.            //      xStart*16*4      : bits, one pixel 4 bits.
  1528.            //      (xStart*16*4)/8  : bytes.
  1529.            //      ((xStart*16*4)/8)/4  : bytes. unit is 4 BYTES.   
  1530.             for(j = ((xStart*16*4)/8)/4; j < ((xEnd*16*4)/8)/4; j++)//for(j = ((12)*16*4)/(8*4) ; j < ((12)*16*4)/(8*4)+((15)*16*4)/(8*4) ;j++)
  1531.             {// for (j=0; j<76; j++) {
  1532.        
  1533.                k = step * (m*ButtonHight +i);
  1534.                //top area
  1535.                pTopLine[76*(m*ButtonHight +i)+j] = buf[76*k + j];
  1536.                //bottom area
  1537.                pBtmLine[76*(m*ButtonHight +i)+j] = buf[76*(k+1) + j];            
  1538.             
  1539.             }            
  1540.         }
  1541.     }
  1542.     #endif
  1543.     
  1544.     #if 1 //1 BUTTON
  1545.     int m;
  1546.        //printf("setupItemNum=%dn",setupItemNum[1]);
  1547.     
  1548.     for (i = 0; i<ButtonHight; i++)//for (i = 0; i<32/2; i++)
  1549.     {
  1550.         delay_1ms(15);
  1551.         for (m =0; m < (setupItemNum[1]-1); m++)  
  1552.         {
  1553.             //NOTE:  
  1554.            //      xStart*16        : pixels
  1555.            //      xStart*16*4      : bits, one pixel 4 bits.
  1556.            //      (xStart*16*4)/8  : bytes.
  1557.            //      ((xStart*16*4)/8)/4  : bytes. unit is 4 BYTES.   
  1558.             for(j = ((xStart*16*4)/8)/4; j < ((xEnd*16*4)/8)/4; j++)//for(j = ((12)*16*4)/(8*4) ; j < ((12)*16*4)/(8*4)+((15)*16*4)/(8*4) ;j++)
  1559.             {// for (j=0; j<76; j++) 
  1560.                 k = step * (m*ButtonHight +i);
  1561.                //top area
  1562.                 pTopLine[76*(m*ButtonHight +i)+j] = buf[76*k + j];
  1563.                 //bottom area
  1564.                 pBtmLine[76*(m*ButtonHight +i)+j] = buf[76*(k+1) + j];            
  1565.             
  1566.             }            
  1567.         }
  1568.     }
  1569.     #endif
  1570.     
  1571.     #if 0//Roll display
  1572.     for (i=iStartLine; i<iEndLine; i++) 
  1573.     {
  1574.        // k = 24-iLine+step*i;
  1575.         k = step*i;
  1576.         //NOTE:  
  1577.            //      xStart*16        : pixels
  1578.            //      xStart*16*4      : bits, one pixel 4 bits.
  1579.            //      (xStart*16*4)/8  : bytes.
  1580.            //      ((xStart*16*4)/8)/4  : bytes. unit is 4 BYTES.   
  1581.         for(j = ((xStart*16*4)/8)/4; j < ((xEnd*16*4)/8)/4; j++)
  1582.         {// for (j=0; j<76; j++) {
  1583.             //top area
  1584.             pTopLine[76*i+j] = buf[76*k + j];
  1585.             //bottom area
  1586.             pBtmLine[76*i+j] = buf[76*(k+1) + j];
  1587.             
  1588.         }
  1589.     }
  1590.    #endif
  1591.     
  1592.     
  1593. }
  1594. #endif
  1595. //
  1596. // osd_DrawString
  1597. //
  1598. #ifdef SOFT_MENU//Modifed by ChenZhao on 2004-9-6 10:43 WP
  1599. void osd_DrawString(BYTE xStart, BYTE yStart, const BYTE *str, BYTE fontColor, BYTE bkColor)
  1600. {
  1601.     osd_DrawString_ori(xStart*8, (yStart*SETUP_BUTTON_HEIGHT), str, fontColor, bkColor);
  1602. }
  1603. #else
  1604. void osd_DrawString(BYTE xStart, BYTE yStart, const BYTE *str, BYTE fontColor, BYTE bkColor)
  1605. {
  1606.     osd_DrawString_ori(xStart, (yStart*SETUP_BTN_HEIGHT), str, fontColor, bkColor);
  1607. }
  1608. #endif//SOFT_MENU
  1609. #ifdef SETUPMENU_16Mb_NO_ICON
  1610. void osd_DrawSetupIconString(BYTE xStart, BYTE yStart, const BYTE *str, BYTE fontColor, BYTE bkColor)
  1611. {
  1612.     osd_DrawString_ori(xStart, yStart, str, fontColor, bkColor);
  1613. }
  1614. #endif//SETUPMENU_16Mb_NO_ICON
  1615. #ifdef SOFT_MENU//Modifed by ChenZhao on 2004-9-6 10:43 WP
  1616. #include"osd_SFM.c"
  1617. #elif defined(USE_SMALL_FONT)
  1618. //libing for small font 2005-1-5 20:52
  1619. void
  1620. osd_DrawString_ori(BYTE xStart, UINT32 yStart, const BYTE *str, BYTE fontColor, BYTE bkColor)
  1621. {
  1622. //libing modify it for zhe smaller font 2004-11-3 13:53
  1623.     BYTE    c;
  1624.     BYTE    *pFont;
  1625.     UINT16  *pTopLine, *pBtmLine;
  1626.     int     cc;
  1627.     UINT32  iStrLoc;
  1628.     int     iRegionWidth;
  1629.     iRegionWidth = region[SETUP_REGION].osd_w;
  1630.     pTopLine = (UINT16 *)get_osdbuf_region_ptr(SETUP_REGION, 0);
  1631.     pBtmLine = (UINT16 *)get_osdbuf_region_ptr(SETUP_REGION, 1);
  1632.     cc = xStart*16; 
  1633.     iStrLoc = 0;
  1634.     while ((c = ((BYTE *)str)[iStrLoc]) != '')
  1635.     {
  1636.         int     i, j, k;
  1637.         int     iFontWidth, iFontHigh;
  1638.         UINT32  pos;
  1639.         UINT8   fourbit;
  1640.         iStrLoc++;
  1641.         
  1642.         if (c == 'r') {                   
  1643.             if ( (c = ((BYTE *)str)[iStrLoc])=='' ) break;
  1644.             iStrLoc++;
  1645.             if ((pFont = get_font_entry(1,c))==NULL) continue;
  1646.         } else {
  1647.             pFont = get_font_entry(0,c);
  1648.         }
  1649.         pos = 2;
  1650.         iFontWidth = (int)pFont[0];
  1651.         iFontHigh  = (int)pFont[1];
  1652.         fourbit=1;
  1653.         //if(p_scan==0)    iFontHigh>>=1;
  1654.         for (j=0; j<iFontHigh; j++) {
  1655.             UINT16 *pp;
  1656.             int     yy;
  1657.             int     iDispLoc;
  1658.             yy  = 4 + yStart + j;
  1659.             pp  = (yy&1) ? pBtmLine : pTopLine;
  1660.             if (p_scan==0) yy>>=1;     
  1661.             iDispLoc = yy*(iRegionWidth/2) + (cc/4);
  1662.             {            
  1663.             for (i=0; i<iFontWidth/4; i++)
  1664.               {
  1665.                 unsigned pat;
  1666.                 unsigned curByte;
  1667.                 UINT16 pixel4;
  1668.                 if(fourbit)
  1669.                 {                    
  1670.                     pat = (pFont[++pos])&0xf0;
  1671.                     fourbit=0;
  1672.                 }
  1673.                 else
  1674.                 {                    
  1675.                     pat = (pFont[pos])<<4;
  1676.                     fourbit=1;
  1677.                 }
  1678.                 curByte = ((pat&0xc0)>>6) | ((pat&0x30)>>2);
  1679.                 pixel4 = 0;//pTopLine[iDispLoc+i];
  1680.                 for (k=0; k<4; k++) {       
  1681.                     if ((1<<k) & curByte)
  1682.                     {          
  1683.                         pixel4 = pixel4 | (fontColor<<(k*4));
  1684.                     } else {
  1685.                         pixel4 = pixel4 | (bkColor<<(k*4));
  1686.                     }
  1687.                 }
  1688.                 pp[iDispLoc+i] = pixel4;
  1689.              }
  1690.          }
  1691.     }   cc+=iFontWidth; 
  1692.     }
  1693.     timeout_osd[SETUP_REGION] = 0;
  1694.     osd_tog_region(SETUP_REGION, OSD_ON);  
  1695. }
  1696. #else
  1697. void
  1698. osd_DrawString_ori(BYTE xStart, UINT32 yStart, const BYTE *str, BYTE fontColor, BYTE bkColor)
  1699. {
  1700.     BYTE    c;
  1701.     BYTE    *pFont;
  1702.     UINT32  *pTopLine, *pBtmLine;
  1703.     int     cc;
  1704.     UINT32  iStrLoc;
  1705.     int     iRegionWidth;
  1706.     iRegionWidth = region[SETUP_REGION].osd_w;
  1707.     // initialize buffer start
  1708.     pTopLine = (UINT32 *)get_osdbuf_region_ptr(SETUP_REGION, 0);
  1709.     pBtmLine = (UINT32 *)get_osdbuf_region_ptr(SETUP_REGION, 1);
  1710.     
  1711.     // initialize start position
  1712.     cc = xStart*16; //pixels
  1713.     //process each charactor until string ending('')
  1714.     iStrLoc = 0;
  1715.     while ((c = ((BYTE *)str)[iStrLoc]) != '')
  1716.     {
  1717.         int     i, j, k;
  1718.         int     iFontWidth, iFontHigh;
  1719.         UINT32  pos;
  1720.         
  1721.         iStrLoc++;
  1722.         
  1723.         if (c == 'r') {                    //prefix characher: to use font_table2
  1724.             if ( (c = ((BYTE *)str)[iStrLoc])=='' ) break;
  1725.             iStrLoc++;
  1726.             if ((pFont = get_font_entry(1,c))==NULL) continue;
  1727.         } else {
  1728.             //get current char entry
  1729.             pFont = get_font_entry(0,c);
  1730.         }
  1731.         
  1732.         //start to process
  1733.         pos = 2;
  1734.         
  1735.         //get font information
  1736.         iFontWidth = (int)pFont[0];
  1737.         iFontHigh  = (int)pFont[1];
  1738.         
  1739.         //start this character
  1740.         for (j=0; j<iFontHigh; j++) {
  1741.             UINT32 *pp;
  1742.             int     yy;
  1743.             int     iDispLoc;
  1744. // #ifdef OP_UI//liwh add 2004-3-19 16:01
  1745. // #include "menu_def.h"
  1746. // yy  = 10 + yStart*(BUTTON_Y_DIFF) + j;
  1747. // #else
  1748.             //yy  = 4 + yStart*SETUP_BTN_HEIGHT + j;
  1749.             yy  = 4 + yStart + j;
  1750. //            #endif
  1751.             //For every string line = 1 blank line(in pixel) + OSD_FONT_HEIGHT-line strings + 1 blank line
  1752.             pp  = (yy&1) ? pBtmLine : pTopLine;
  1753.             if (p_scan==0) yy>>=1;      // p-scan
  1754.             //in fact,iDispLoc = (yy*iRegionWidth + cc/2)/4;
  1755.             //yy*iRegionWidth + cc/2 calculate the positon as the byte.
  1756.             //iDispLoc is 32bit.so must "/4".
  1757.             //zhaoyanhua note 2003-8-14 15:35
  1758.             iDispLoc = yy*(iRegionWidth/4) + (cc/8);
  1759.             
  1760.             //draw top line
  1761.             for (i=0; i<iFontWidth/8; i++) {
  1762.                 unsigned pat;
  1763.                 unsigned curByte;
  1764.                 UINT32 pixel8;
  1765.                 
  1766.                 pat = pFont[++pos];
  1767.                 curByte = ((pat&0xc0)>>6) | ((pat&0x30)>>2) | ((pat&0x0c)<<2) | ((pat&0x03)<<6);
  1768.                 pixel8 = 0;
  1769.                 for (k=0; k<8; k++) {       // for every-bit of pattern
  1770.                     if ( (1<<k) & curByte ) {          
  1771.                         pixel8 = pixel8 | (fontColor<<(k*4));
  1772.                     } else {
  1773.                         pixel8 = pixel8 | (bkColor<<(k*4));
  1774.                     }
  1775.                 }
  1776.                 pp[iDispLoc+i] = pixel8;
  1777.             }
  1778.         }
  1779.         cc+=iFontWidth; 
  1780.     }
  1781.     timeout_osd[SETUP_REGION] = 0;
  1782.     osd_tog_region(SETUP_REGION, OSD_ON);  
  1783. }
  1784. #endif /* SOFT_MENU */
  1785. void
  1786. osd_DrawStrings(const t_osd_str *p, BYTE fg, BYTE bg)
  1787. {
  1788.     int i;
  1789.     for (i=0; p[i].str!=NULL; i++)
  1790.     {
  1791.         osd_DrawString(p[i].xst, p[i].yst, p[i].str, fg, bg);
  1792.     }
  1793. }
  1794. #ifdef OSD_STR_LINE_WRAP  
  1795. /*
  1796.  * Description:
  1797.  *   Get next space position
  1798.  *
  1799.  * INPUT:
  1800.  *    str:  ---> string
  1801.  *    iStrLoc ---> initial position to search
  1802.  *
  1803.  *
  1804.  * RETURN:
  1805.  *    if Find next given letter, return its postion
  1806.  *    else if not find it, it means that the string will be end.
  1807.  *                         so return its total strlen.
  1808.  * zhaoyanhua 2004-4-22 9:49
  1809.  */
  1810. int FindNextLetter(const BYTE *str, int iStrLoc, BYTE c)
  1811. {
  1812.     int i = 0;
  1813.     int lenth = strlen(str);
  1814.     
  1815.     for (i = iStrLoc; i < lenth; i++)
  1816.     {
  1817.         if (str[i] == c) 
  1818.             return i;    
  1819.     }
  1820.     return lenth;
  1821. }
  1822. #endif//#ifdef OSD_STR_LINE_WRAP  
  1823.        
  1824.    
  1825. #if defined(USE_SMALL_FONT)
  1826. //libing for small font 2005-1-5 20:52
  1827. void
  1828. osd_DrawRegionString(BYTE xStart, BYTE yStart, const BYTE *str, BYTE fontColor, BYTE bkColor, BYTE r)
  1829. {
  1830.     BYTE    *pFont, c;//,div=4;
  1831.     UINT16  *pTopLine, *pBtmLine;
  1832.     UINT32   iStrLoc;
  1833.     UINT16   iDispLoc;
  1834.     int     cc;
  1835.     int     i, j, k;
  1836.     int     iFontWidth, iFontHigh;
  1837.     int     iRegionWidth = region[r].osd_w,iRegionHigh = region[r].osd_h;    
  1838.     osd_tog_region(r, OSD_ON);  
  1839.     pTopLine = (UINT16 *)get_osdbuf_region_ptr(r,0);
  1840.     pBtmLine = (UINT16 *)get_osdbuf_region_ptr(r,1); 
  1841.     cc = xStart*16;   
  1842.     iStrLoc = 0;
  1843.     while ( (c = ((BYTE *)str)[iStrLoc]) != '' ) 
  1844.     {
  1845.         BYTE curByte;
  1846.         UINT32 pos;  
  1847.         int fourbit=1;      
  1848.         iStrLoc++;        
  1849.         if (c == 'r') 
  1850.         { 
  1851.             if ( (c = ((BYTE *)str)[iStrLoc])=='' )
  1852.                 break;            
  1853.             iStrLoc++;
  1854.             if ((pFont = get_font_entry(1,c))==NULL) continue;
  1855.         }
  1856.         else 
  1857.         {
  1858.             pFont = get_font_entry(0,c);
  1859.         }
  1860.         pos = 2;
  1861.         iFontWidth = (int)pFont[0];
  1862.         iFontHigh = (int)pFont[1];            
  1863.         for (j=0; j<iFontHigh; j++) {
  1864.             UINT16 *pp;
  1865.             int     yy;                   
  1866.             if (iFontWidth==12)
  1867.             yy  = 4 + (yStart*4) + j +4;
  1868.             else
  1869.             yy  = 4 + (yStart*4) + j;
  1870.             pp  = (yy&1) ? pBtmLine : pTopLine;
  1871.             if (p_scan==0) yy>>=1;    
  1872.             iDispLoc = yy*(iRegionWidth/2) + (cc/4); 
  1873.             for (i=0; i<iFontWidth/4; i++) {
  1874.                 unsigned pat;
  1875.                 unsigned curByte;
  1876.                 UINT16 pixel4;
  1877.                 if(fourbit)
  1878.                 {                    
  1879.                     pat = (pFont[++pos])&0xf0;
  1880.                     fourbit=0;
  1881.                 }
  1882.                 else
  1883.                 {                    
  1884.                     pat = (pFont[pos])<<4;
  1885.                     fourbit=1;
  1886.                 }
  1887.                 curByte = ((pat&0xc0)>>6) | ((pat&0x30)>>2);
  1888.                 pixel4 = 0;//pTopLine[iDispLoc+i];
  1889.                 for (k=0; k<4; k++) {       
  1890.                     if ((1<<k) & curByte)
  1891.                     {          
  1892.                         pixel4 = pixel4 | (fontColor<<(k*4));
  1893.                     } else {
  1894.                         pixel4 = pixel4 | (bkColor<<(k*4));
  1895.                     }
  1896.                     }                
  1897.                 pp[iDispLoc+i] = pixel4; 
  1898.              }
  1899.         }    
  1900.                 cc+=iFontWidth;               
  1901.         }    
  1902.     timeout_osd[r] = 0;
  1903. }
  1904. #else
  1905. void
  1906. osd_DrawRegionString(BYTE xStart, BYTE yStart, const BYTE *str, BYTE fontColor, BYTE bkColor, BYTE r)
  1907. {
  1908.     BYTE    *pFont, c,div=4;
  1909.     UINT32  *pTopLine, *pBtmLine;
  1910.     UINT32  iDispLoc, iStrLoc;
  1911.     int     i, j, k;
  1912.     int     iFontWidth, iFontHigh;
  1913.     int     iRegionWidth = region[r].osd_w;
  1914.     
  1915.     osd_tog_region(r, OSD_ON);  
  1916.     
  1917.     //initialize buffer start
  1918.     pTopLine = (UINT32 *)get_osdbuf_region_ptr(r,0);
  1919.     pBtmLine = (UINT32 *)get_osdbuf_region_ptr(r,1);
  1920.     
  1921.     iStrLoc = 0;
  1922.     if(p_scan==0)
  1923.        div=8;
  1924.        
  1925.     if (p_scan==1)
  1926.     {
  1927. #ifdef NEWSTYLE_WINDOW   //xiongyuyue
  1928.         if(full_scrn&MESSAGE)
  1929.             iDispLoc = (yStart*iRegionWidth/*div*SETUP_BTN_HEIGHT*/) + (xStart);
  1930.         else
  1931. #endif
  1932.     
  1933.         iDispLoc = (yStart*iRegionWidth/*div*SETUP_BTN_HEIGHT*/) + (xStart*16/8)+(iRegionWidth/2);
  1934.     }
  1935.     else
  1936.     {
  1937. #ifdef NEWSTYLE_WINDOW   //xiongyuyue
  1938.     if(full_scrn&MESSAGE)
  1939.         iDispLoc = (yStart*iRegionWidth/2/*div*SETUP_BTN_HEIGHT*/) + (xStart);
  1940.     else
  1941. #endif
  1942.         iDispLoc = (yStart*iRegionWidth/2/*div*SETUP_BTN_HEIGHT*/) + (xStart*16/8);
  1943.     }
  1944.     //skip n blank line on top(in pixel)
  1945.     //for interlace mode, we will skip n/2 blank lines, for example 4/2=2
  1946.     iDispLoc += (iRegionWidth/4 * 2);
  1947.     
  1948.     //process each charactor until string ending('')
  1949.     while ( (c = ((BYTE *)str)[iStrLoc]) != '' ) {
  1950.         BYTE curByte;
  1951.         UINT32 pixel8;
  1952.         UINT32 pos;
  1953.         
  1954.         iStrLoc++;
  1955.         
  1956.         if (c == 'r') { //prefix characher:to use font_table2
  1957.             if ( (c = ((BYTE *)str)[iStrLoc])=='' )
  1958.                 break;
  1959.             
  1960.             iStrLoc++;
  1961.             if ((pFont = get_font_entry(1,c))==NULL) continue;
  1962.         }
  1963. #if defined(NEWSTYLE_WINDOW)||defined(NEW_STYLE_SETUP)  || defined(SUPPORT_REP_READ) || defined(DVB1000_OSD_MENU)//maoyong add 0915
  1964.         else if(c == 'a')
  1965.         {
  1966.             if ( (c=((BYTE *)str)[iStrLoc])=='' ) break;
  1967.             
  1968.             iStrLoc++;
  1969.             if ((pFont = get_font_entry(3,c))==NULL) continue;
  1970.         }
  1971. #endif 
  1972. #ifdef DVB1000_OSD_MENU //Maoyong 2004-10-26 16:08
  1973.         else if(c>='a' && c<='z')
  1974.         {
  1975.             if(IsOSDChinese())
  1976.                 pFont = get_font_entry(0, c);
  1977.             else                
  1978.             pFont=get_font_entry(0,c-'a'+0xc0);
  1979.             //printf("c=%c,c=%xn",c,c);
  1980.         }
  1981. #endif     
  1982.         else {
  1983.             //get current char entry
  1984.             pFont = get_font_entry(0,c);
  1985.         }
  1986.         
  1987.         //start to process
  1988.         pos = 2;
  1989.         
  1990.         //get font information
  1991.         iFontWidth = (int)pFont[0];
  1992.         iFontHigh = (int)pFont[1];
  1993.         
  1994.         if(p_scan==0)
  1995.           iFontHigh>>=1;
  1996.           
  1997.         //start to draw        
  1998.         for (j=0; j<iFontHigh; j++) {
  1999.             //For every string line = 1 blank line(in pixel) + OSD_FONT_HEIGHT-line strings + 1 blank line
  2000.             
  2001.             //draw top line
  2002.             for (i=0; i<iFontWidth/8; i++) {
  2003.                 BYTE c;
  2004.                 
  2005.                 c = pFont[++pos];
  2006.                 curByte = ((c&0xc0)>>6) | ((c&0x30)>>2) | ((c&0x0c)<<2) | ((c&0x03)<<6);
  2007.                 //NOTE:
  2008.                 //The previous mothod has a problem when show our radio button.
  2009.                 //When  write a char(smaller circle) in another char (bigger circle).
  2010.                 //smaller circle looks like not a circle but a rect!!!
  2011.                 //I modify the method to fill the fontcolor and bkcolor.  
  2012.                 //Please don't care about the changes will effect the funciton's original funcitons.
  2013.                 //zhaoyanhua add 2004-3-19 16:19
  2014.                 
  2015.                 //pixel8 = 0;//zhaoyanhua mask 2004-2-27 14:41
  2016.                 pixel8 = pTopLine[iDispLoc+i];//zhao add 2004-2-27 14:41
  2017.                 
  2018.                 for (k=0; k<8; k++) {          
  2019.                     if ( (1<<k) & curByte ) {          
  2020.                         
  2021.                         //pixel8 = pixel8 | (fontColor<<(k*4));//zhaoyanhua mask 2004-2-27 14:41
  2022.                         pixel8 = (pixel8 & (~( 0x0f<<k*4))) |(fontColor<<(k*4));//zhao add 2004-2-27 14:41
  2023.                     } else {
  2024.                         //pixel8 = pixel8 | (bkColor<<(k*4));//zhaoyanhua mask 2004-2-27 14:41
  2025.                         if(bkColor != 0)//if color index is 0, no need to change the vlaue fo pixel8
  2026.                             pixel8 = (pixel8 & (~( 0x0f<<k*4))) | (bkColor<<(k*4));//zhao add 2004-2-27 14:41
  2027.                         
  2028.                     }
  2029.                 }
  2030.                 
  2031.                 pTopLine[iDispLoc+i] = pixel8;
  2032.             }
  2033.             
  2034.             if(p_scan==0)
  2035.             {
  2036.                //draw bottom line
  2037.                for (i=0; i<iFontWidth/8; i++) {
  2038.                   BYTE c;
  2039.                 
  2040.                   c = pFont[++pos];
  2041.                   curByte = ((c&0xc0)>>6) | ((c&0x30)>>2) | ((c&0x0c)<<2) | ((c&0x03)<<6);
  2042.                    //pixel8 = 0;//zhaoyanhua mask 2004-2-27 14:41
  2043.                     pixel8 = pBtmLine[iDispLoc+i];//zhao add 2004-2-27 14:41
  2044.                 
  2045.                   for (k=0; k<8; k++) {          
  2046.                     if ( (1<<k) & curByte ) {
  2047.                        //pixel8 = pixel8 | (fontColor<<(k*4));//zhaoyanhua mask 2004-2-27 14:41
  2048.                         pixel8 = (pixel8 & (~( 0x0f<<k*4))) |(fontColor<<(k*4));//zhao add 2004-2-27 14:41
  2049.                     } else {
  2050.                         //pixel8 = pixel8 | (bkColor<<(k*4));//zhaoyanhua mask 2004-2-27 14:41
  2051.                         if(bkColor != 0)//if color index is 0, no need to change the vlaue fo pixel8
  2052.                             pixel8 = (pixel8 & (~( 0x0f<<k*4))) | (bkColor<<(k*4));//zhao add 2004-2-27 14:41
  2053.                         
  2054.                     }
  2055.                   }
  2056.                 
  2057.                   pBtmLine[iDispLoc+i] = pixel8;
  2058.                }
  2059.             }
  2060.             iDispLoc += (iRegionWidth/4);
  2061.             
  2062.         }//for charactor heigh  
  2063.         
  2064.         //move to next character and move up to first line of this string
  2065.         iDispLoc = iDispLoc + (iFontWidth/8) - (iRegionWidth/4*iFontHigh);
  2066.         
  2067.     } // end of while ( (c=((BYTE *)str)[unFontLoc])!='' )
  2068.     
  2069.     timeout_osd[r] = 0;
  2070. }
  2071. #endif //#if defined(USE_SMALL_FONT)
  2072. #include "audcodec.h"
  2073. #include "setup_def.h"
  2074. //#define MAX_SETUP_PAGE          6 
  2075. //#define MAX_CUSTM_SETUP_PAGE    1 
  2076. //#define MAX_PAGE_ITEM            8 
  2077. #ifdef SOFT_MENU//Modifed by ChenZhao on 2004-9-1 10:18 WP
  2078. #define AUDPAGE         2
  2079. #else
  2080. #define AUDPAGE         2
  2081. #endif
  2082. #ifdef NO_DIGIT_VIDEO_MENU
  2083. #define VIDEOPAGE       4
  2084. #define MULTISPKPAGE    3      //valid when AC3 or DTS
  2085. #else
  2086. #define VIDEOPAGE       3
  2087. #define MULTISPKPAGE    4      //valid when AC3 or DTS
  2088. #endif
  2089. #define SPDIFSIMULATE   2
  2090. #define AC3DIGITALPAGE  5 
  2091. #define SPDIFBITSTREAM  3
  2092. extern UINT8 setup_sel[MAX_SETUP_PAGE + MAX_CUSTM_SETUP_PAGE][MAX_PAGE_ITEM];
  2093. #define SETUP_SPDIF                 setup_sel[AUDPAGE][0]
  2094. #ifdef NEW_STYLE_SETUP //zhaoyanhua add 2003-07-22 22:21
  2095. void
  2096. osd_DrawIcon(int xStart, int yStart, unsigned index, unsigned page)
  2097. {
  2098.     BYTE    *pIcon;
  2099.     UINT32  *pTopLine, *pBtmLine;
  2100.     UINT32  iDispLoc, iIconLoc;
  2101.     int     need_gray=0;
  2102.     int     i, j, k;
  2103.     int     iFontWidth, iFontHigh;
  2104.     int     iRegionWidth = region[1].osd_w;
  2105.     osd_tog_region(1, OSD_ON);
  2106.     iRegionWidth = region[1].osd_w;
  2107.     //initialize buffer start
  2108.     pTopLine = (UINT32 *)get_osdbuf_region_ptr(1,0);   // region 0 top
  2109.     pBtmLine = (UINT32 *)get_osdbuf_region_ptr(1,1);   // region 0 bot
  2110.     need_gray = 0;
  2111.     iIconLoc = 0;
  2112.     //skip n blank line on top(in pixel)
  2113.     //for interlace mode, we will skip n/2 blank lines, for example 4/2=2
  2114.     yStart+=2;
  2115.     {
  2116.         UINT32 pixel8;
  2117.         UINT32 pos;
  2118.         iIconLoc++;
  2119.         pIcon = get_font_entry(2, index);
  2120.         //start to process
  2121.         pos = 2;
  2122.         //get icon information
  2123.         iFontWidth  = (int)pIcon[0];
  2124.         iFontHigh   = (int)pIcon[1];
  2125.         for (j=0; j<iFontHigh; j++)
  2126.         {
  2127.             int yy;
  2128.             UINT32 *pp;
  2129.             yy = (p_scan) ? yStart : yStart>>1;
  2130.             pp = (yStart&1) ? pBtmLine : pTopLine;
  2131.             iDispLoc = (yy*iRegionWidth*2/8) + (xStart);
  2132.             for (i=0; i<(iFontWidth/4/2); i++) // every 4-bytes a time, every 2-pixels a byte
  2133.             {
  2134.                 pixel8=0;
  2135.                 // 0x12345678  ==>  0x78563412
  2136.                 for (k=0;k<4;k++)
  2137.                 {
  2138.                     unsigned curByte = pIcon[++pos];
  2139.                     if (page!=index)
  2140.                     {
  2141.                         if ((curByte&0x0f)==0x04) curByte=(0x00|(curByte&0xf0));
  2142.                         if ((curByte&0xf0)==0x40) curByte=(0x00|(curByte&0x0f));
  2143.                         if ((curByte&0x0f)==0x0b) curByte=(0x0c|(curByte&0xf0));
  2144.                         if ((curByte&0xf0)==0xb0) curByte=(0xc0|(curByte&0x0f));
  2145.                     }
  2146.                     if (need_gray==1)
  2147.                     {
  2148.                         if ((curByte&0x0f)!=0x01) curByte=(0x0b|(curByte&0xf0));
  2149.                         if ((curByte&0xf0)!=0x10) curByte=(0xb0|(curByte&0x0f));
  2150.                     }
  2151.                     pixel8 = pixel8 | (curByte<<8*k);
  2152.                 }
  2153.                 pp[iDispLoc+i] =  pixel8;
  2154.             }
  2155.             yStart++;
  2156.         }//for icon heigh
  2157.     }
  2158.     timeout_osd[1] = 0;
  2159. }
  2160. #else //NORMAL setup MENU
  2161. void
  2162. osd_DrawIcon(int xStart, int yStart, unsigned index, unsigned page)
  2163. {
  2164.     BYTE    *pIcon;
  2165.     UINT32  *pTopLine, *pBtmLine;
  2166.     UINT32  iDispLoc, iIconLoc;
  2167.     int     need_gray=0;
  2168.     int     i, j, k;
  2169.     int     iFontWidth, iFontHigh;
  2170.     int     iRegionWidth = region[0].osd_w;
  2171. #ifdef NO_AUDIO_PAGE//liweihua add for syber 2003-12-30 22:01
  2172.     if((index>=2)&&(index<=4))index=index+1;
  2173. #endif
  2174. #ifdef DVB_MENU_SETUP_STYLE
  2175. if(system_state == SYSTEM_TS)
  2176. {
  2177. if(index==3)
  2178. index=index+2;
  2179. }
  2180. else
  2181. {
  2182. if((index>=0)&&(index<=5))
  2183. index+=2;
  2184. }
  2185. #endif
  2186. #ifdef EASTWIN_PORTABLE_DVD
  2187. #ifdef NO_SPEAK_ICON//tulijuan040910
  2188.     if((index>=4)&&(index<=5))index=index+1;
  2189. #endif
  2190. #endif
  2191. #ifndef SETUP_ALL_VALID        // alan, 2003/7/18 10:49