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

DVD

开发平台:

C/C++

  1. //--------------------------------------
  2. //created by ouyang 2004.08.16
  3. //For MIDI UI
  4. //--------------------------------------
  5. /*
  6. ** FILE
  7. ** osd_midi.c
  8. **
  9. ** DESCRIPTION
  10. ** control MIDI UI  interface.
  11. */
  12. //*************************************************
  13. //************For Midi OSD Lyric***********************
  14. //*************************************************
  15. #ifdef SUPPORT_OSDLYRIC
  16. #include "fsmidi.h"
  17.     #ifdef SUPPORT_MIDI_MENU_SEL  //by dtb in 20040225
  18.     #include "fsMidiUI.h"
  19.     #endif
  20. #ifdef SUPPORT_PINYINGDELAY     //xlluo add 04-11-15
  21. inline int SetPinyingDelay(void)
  22. {
  23.     return MIDI_PINYINGINPUT_DELAY;  //about 1.5 s
  24. }
  25. #endif
  26. #ifdef SUPPORT_SANJING_SCORE        //xlluo for sanjin score 04-10-23
  27. int ScoreDelay(void)
  28. {
  29.     //TODO: add your code here 
  30.     //this func will be calling when score start
  31.     return (10000);        //default is 2.5 second,unit millisec
  32. }
  33. char * SetScoreGalaStr(int score)
  34. {
  35.     //TODO: add your code to replase inhere 
  36.     //this func would call when show score num
  37.     //[out]: the return value would be use disp str
  38.     //below scorenum and flush right 
  39.     //max strlen is 12 chinese characters
  40.     //return NULL to show nothing 
  41.     //[in]score :the num of score would be display on screen,max is 100
  42.     char * str[] ={"唱得不错嘛",};
  43.     printf("cur score %dn",score);
  44.     return str[0];
  45. }
  46. //special score mode relase to sanjin                           //xlluo add for custormer request
  47.                                                                                       //2004-11-06
  48. //use macro GETSCOREMODE() to get the score mode
  49. //you can all your code which get new score and refresh 
  50. //display item in func. "char * SetScoreGalaStr(int score)"
  51. //I would call the func DrawLTSUI or DrawDKSUI decording to you control.
  52. //when you select the selection "open DKS" or "open LTS"
  53. //I will do that
  54. //          first: enable the score mode
  55. //     second: call the func. below by your selection
  56. //         thrid: set the score mode
  57. //      at last: refresh the menu
  58. void DrawLTSUI()
  59. {
  60.     //disp the title of LTSUI
  61.     //TODO: you should rewrite or modify the ui drawfunc.
  62.     int dispX[] ={
  63.                         10,105,         //left column
  64.                         200,400,       //mid column
  65.                         400,470,       //right column
  66. };
  67.     draw_midi_bitmap_HZnew(Score_Str_LTS[0], dispX[2]+10, 10, 6, 0, 2, 2, 0);
  68.     draw_midi_bitmap_HZnew(Score_Str_LTS[1], dispX[2]+50+10, 10, 6, 0, 2, 2, 0);
  69.     draw_midi_bitmap_HZnew(Score_Str_LTS[2], dispX[2]+100+10, 10, 6, 0, 2, 2, 0);
  70.     //TODO: add initial draw code here
  71. }
  72. void DrawDKSUI()
  73. {
  74.     //disp the title of DKSUI
  75.     //TODO: you should rewrite or modify the ui drawfunc.
  76.     int dispX[] ={
  77.                         20,85,          //left column
  78.                         200,400,      //mid column
  79.                         400,470,      //right column
  80.                         };
  81.     draw_midi_bitmap_HZnew(Score_Str_DKS[0], dispX[2]-15+24, 0, 6, 0, 2, 2, 0);
  82.     draw_midi_bitmap_HZnew(Score_Str_DKS[1], dispX[2]-15+50+24, 0, 6, 0, 2, 2, 0);
  83.     draw_midi_bitmap_HZnew(Score_Str_DKS[2], dispX[2]-15+100+24, 0, 6, 0, 2, 2, 0);
  84.     //TODO: add initial draw code here
  85. }
  86. //++++++++++++++++++++++++++++++++++++++++++++++++++
  87. //IF THERE IS ANY QUESTION.PLEASE CALL ME OR SEND A MAIL FOR ME 
  88. //                                       SUNMEDIA  XLLUO
  89. //                                       86-028-87848688-5816
  90. //                                       MAIL: xlluo@sunplus.com.cn
  91. //++++++++++++++++++++++++++++++++++++++++++++++++++
  92. #endif
  93. //BYTE LyricFontcolor, LyricBgcolor, LyricRevcolour, LyricFigureColor;
  94. #ifdef SUPPORT_REPREGIONCOL     //ouyang 2004.07.31
  95. void osd_updataRegion_Color(BYTE R,BYTE G,BYTE B,BYTE A,BYTE code,BYTE regNum)
  96. {
  97.     int i =0;
  98.     BYTE *osdhead[2];
  99.     BYTE *obase;
  100.     UINT32 repCol = __palette4F(G, B, R, A);
  101. //    osd_tog_region(regNum,OSD_OFF);
  102.     if(osd_active_regions<=regNum) return;//error
  103.     osdhead[0] =(UINT16*)(get_osdbuf_baseptr() + region[regNum].osd_header[0] * 32);//get osd head pos //ouyang 2004.07.31
  104.     if (((((*(osdhead[0]))>>BIT_MD)&0x07) ==OSD_FORMAT_16COLOR)//get color format
  105.         &&((((*(osdhead[0]+2))>>BIT_CLUT_TYPE)&0x03) ==OSDV2_CLUT_32b))//for 32 bit clut
  106.     {
  107.         for (i =0;i<2;i++)
  108.         {
  109.             osdhead[i] =(UINT16*)(get_osdbuf_baseptr() + region[regNum].osd_header[i] * 32);//get osd head pos
  110.             obase =osdhead[i]+HEADER_SIZE;
  111.             while (code)                    //code is base 0, colour clut index
  112.             {   
  113.                 code --;
  114.                 obase += OSD_CLUT_SIZE;                
  115.             }    
  116.             wbe32(obase,repCol);                
  117.         }//__palette4F(130,130,130,130)
  118.     }
  119. }
  120. #endif
  121. #ifdef SUPPORT_REGION2_DOT
  122. void osd_midi_init(void)
  123. {
  124.       int i;
  125.     __osd_init();
  126. #define MIDI_HEADER 4
  127.     //setup region 3
  128.     header_id = MIDI_HEADER;
  129.     region[3].osd_w = MIDI_LYRIC_REGION >> 1;
  130.     region[3].osd_h = MIDI_LYRIC_HEIGHT;
  131.     osd_create_region1(&region[3], 20, 150 + 30, NULL, OSD_FORMAT_16COLOR,
  132.         OSD_INTERLACED);   
  133.     
  134.     //setup region 2
  135.     header_id = MIDI_HEADER;
  136.     region[2].osd_w = MIDI_MENU_REGION >> 1;              
  137.     region[2].osd_h = MIDI_MENU_HEIGHT;  
  138.     osd_create_region1(&region[2], 20/* 50*/, 60, &region[3],
  139.         OSD_FORMAT_16COLOR, OSD_INTERLACED);  
  140.     //setup region 1 
  141.     header_id = NORMAL_HEADER;
  142.     region[1].osd_w = 36 * 4;
  143.     region[1].osd_h = OSD_FONT_HEIGHT;
  144.     osd_create_region1(&region[1], 32, 45, &region[2], OSD_FORMAT_4COLOR,
  145.         OSD_INTERLACED);
  146.     //setup region 0
  147.     header_id = MIDI_HEADER;
  148.     region[0].osd_w = 320;
  149.     region[0].osd_h = 60;
  150.     osd_create_region1(&region[0], 26, 15, &region[1], OSD_FORMAT_16COLOR,
  151.         OSD_INTERLACED);
  152.     osd_active_regions = 4;
  153. #ifdef SUPPORT_SCANMODE_SWITCH
  154.     SwitchRegionTVformat();//xlluo add 04-6-14 
  155. #endif
  156. #ifdef SUPPORT_REPREGIONCOL
  157.  //   osd_updataRegion_Color(130,130,130,130,0,REGION0);
  158. #endif
  159.     osd_init__();
  160. }
  161. #else  //#ifdef SUPPORT_REGION2_DOT
  162. //xlluo 03-7-2
  163. void osd_midi_init(void)
  164. {
  165.     __osd_init();
  166. #define MIDI_HEADER 3///4
  167. /*    //setup region 3
  168.     header_id = MIDI_HEADER;
  169.     region[3].osd_w = 320;
  170.     region[3].osd_h = 140;
  171.     osd_create_region1(&region[3], 20, 150, NULL, OSD_FORMAT_16COLOR,
  172.         OSD_INTERLACED);  */
  173.     //setup region 2
  174.     header_id = MIDI_HEADER;
  175.     region[2].osd_w = 200;              
  176.     region[2].osd_h = 190; 
  177.     osd_create_region1(&region[2], 78, 60, &region[3], OSD_FORMAT_16COLOR,
  178.         OSD_INTERLACED);  
  179.     //setup region 1 
  180.     header_id = NORMAL_HEADER;
  181.     region[1].osd_w = 36 * 4;
  182.     region[1].osd_h = OSD_FONT_HEIGHT;
  183.     osd_create_region1(&region[1], 32, 45, &region[2], OSD_FORMAT_4COLOR,
  184.         OSD_INTERLACED);
  185.     //setup region 0
  186.     header_id = MIDI_HEADER;
  187.     region[0].osd_w = 320;
  188.     region[0].osd_h = 60;
  189.     osd_create_region1(&region[0], 26, 15, &region[1], OSD_FORMAT_16COLOR,
  190.         OSD_INTERLACED);
  191.     osd_active_regions = MIDI_HEADER;
  192.     osd_init__();
  193. }
  194. #endif //end #ifdef SUPPORT_REGION2_DOT
  195. #ifdef HDD_MODIFY_INDEX_TEST
  196. void osd_copy_vcd_init(void)
  197. {
  198.     __osd_init();
  199. #define MIDI_HEADER 4
  200.     //setup region 1
  201.     header_id = MIDI_HEADER;
  202.     region[1].osd_w = 100;
  203.     region[1].osd_h = 90;
  204.     osd_create_region1(&region[1], 20, 185, NULL, OSD_FORMAT_16COLOR,OSD_INTERLACED);  
  205.     //setup region 0
  206.     header_id = MIDI_HEADER;
  207.     region[0].osd_w = 220;  
  208.     region[0].osd_h = 200; 
  209.     osd_create_region1(&region[0], 50, 40, &region[1], OSD_FORMAT_16COLOR,OSD_INTERLACED);  
  210.     osd_active_regions =2;
  211.     osd_init__();
  212. }
  213. #endif
  214. void LyricSetColor(BYTE color, BYTE revercolour)
  215. {
  216.     LyricFontcolor = color;
  217.     LyricBgcolor = FONT_BACKGROUND_COLOUR;
  218.     if (LyricFontcolor == LYRIC_INIT_COLOUR)
  219.         LyricFigureColor = FONT_FIGURE_COLOUR;
  220.     else
  221.         LyricFigureColor = FONT_FIGURE_REV_COLOUR;
  222.     LyricRevcolour = revercolour;
  223. }
  224. /****************************************
  225.  *** function :draw the font bitmap ;
  226.  *** pFont: the pointer of the font bitmap data
  227.  *** xStart,yStart: the coordinate
  228.  *** fontcolor: the font color 
  229.  *** bgcolor : the background color of the font 
  230.  *** FigureColor: the figure color of the font
  231.  *** FontType : the font type 
  232.  *** number: the OSD region NO.
  233.  ****************************************/
  234. void draw_midi_bitmap_HZnew(const UINT8* pFont, int xStart, int yStart,
  235.     BYTE fontcolor, BYTE bgcolor, BYTE  FigureColor, BYTE FontType,
  236.     BYTE number)
  237. {
  238.     BYTE CurrentByte, CurrentByte1, CurrentBit, CurrentBit1;
  239.     BYTE NewFormatFlag,bDispHalfByte;
  240.     UINT8* p1Font;
  241.     UINT8* pTopLine, * pBtmLine, * pLine;
  242.     UINT32 iDispLoc, disploc = 0;
  243.     int iRegionWidth = region[number].osd_w ;
  244.     int osd_format = region[number].osd_format;
  245.     unsigned int     fwidth,fhight,fbit=0;
  246.     unsigned int     i, j, Bperpixel,shift_num,tempi;
  247.     pTopLine = (BYTE *)(((BYTE *) get_osdbuf_baseptr()) +
  248.         (region[number].osd_header[0] + OSD_DATA_OFFSET(region[number].osd_format)) * 32);
  249.     pBtmLine = (BYTE *)(((BYTE *) get_osdbuf_baseptr()) +
  250.         (region[number].osd_header[1] + OSD_DATA_OFFSET(region[number].osd_format)) * 32);
  251.     yStart = (p_scan) ? yStart : yStart>>1;
  252.     iDispLoc = (yStart ) * iRegionWidth  + xStart;
  253.     bDispHalfByte = iDispLoc & 0x01;
  254.     iDispLoc = (((yStart - ((yStart) & 0x01)) * iRegionWidth ) + (xStart))>>1;
  255.     switch (osd_format)
  256.     {
  257.     case OSD_FORMAT_4COLOR:
  258.         Bperpixel = 2; // 4
  259.         shift_num = 2;
  260.         break;
  261.     case OSD_FORMAT_256COLOR:
  262.         Bperpixel = 0; // 1
  263.         shift_num = 8;
  264.         break;
  265.     case OSD_FORMAT_16COLOR:
  266.         Bperpixel = 1; // 2
  267.         shift_num = 4;
  268.         break;
  269.     default:
  270.         Bperpixel = 1; // 2
  271.         shift_num = 4;
  272.         break;
  273.     }
  274.     //judge the format
  275.     NewFormatFlag = pFont[0];
  276.     if (NewFormatFlag != 0xff)
  277.     {
  278.         fwidth = pFont[0];
  279.         fhight = pFont[1];
  280.     }
  281.     else
  282.     {
  283.         fhight = (pFont[4] << 8) | pFont[3];
  284.         fwidth = (pFont[6] << 8) | pFont[5];
  285.         fbit = fwidth * fhight;
  286.     }
  287.     if (NewFormatFlag != 0xff)
  288.     {
  289.         disploc = 0;
  290.         for (i = 0; i < fhight; i++)
  291.         {
  292.             if (((i + yStart) & 0x01)||(p_scan ==1))
  293.                     pLine = pBtmLine;
  294.                 else
  295.                     pLine = pTopLine;
  296.             for (j = 0; j < fwidth; j++)
  297.             {
  298.                 tempi = (j+bDispHalfByte) >> Bperpixel;
  299.                 if (pFont[((j + disploc) >> 3) + 3] & (0x80 >>
  300.                     ((j + disploc) & 0x07)))
  301.                     pLine[iDispLoc + tempi] = (pLine[iDispLoc + tempi] <<
  302.                         shift_num) |
  303.                         fontcolor;
  304.                 else
  305.                     pLine[iDispLoc + tempi] = (pLine[iDispLoc + tempi] <<
  306.                         shift_num) |
  307.                         bgcolor;
  308.             }
  309.             disploc += fwidth ;        
  310.             if (((i + yStart) & 0x01)||(p_scan ==1))
  311.                     iDispLoc += iRegionWidth;
  312.             }
  313.         }
  314.     else
  315.     {
  316.         switch(FontType)
  317.         {
  318.             case 0:
  319.                 fontcolor=bgcolor;
  320.                 break;
  321.             case 1:
  322.                 FigureColor=bgcolor;
  323.                 break;
  324.             case 2:
  325.             //  FigureColor = 11;
  326.                 break;
  327.             default:
  328.                 break;
  329.         }
  330.         if (fbit & 0x07)
  331.         {
  332.             p1Font = (UINT8 *)pFont + (fbit >> 3) + 1;
  333.         }
  334.         else
  335.         {
  336.             p1Font = (UINT8 *)pFont + (fbit >> 3);
  337.         }
  338.         disploc = 0;
  339.         for (i = 0; i < fhight; i++)
  340.         {
  341.             if (((i + yStart) & 0x01)||(p_scan ==1))
  342.                     pLine = pBtmLine;
  343.                 else
  344.                     pLine = pTopLine;
  345.             for (j = 0; j < fwidth; j++)
  346.             {
  347.                 CurrentByte = pFont[((j + disploc) >> 3) + 10];
  348.                 CurrentByte1 = p1Font[((j + disploc) >> 3) + 10];
  349.                 CurrentBit = CurrentByte & (0x80 >> ((j + disploc) & 0x07));
  350.                 CurrentBit1 = CurrentByte1 & (0x80 >> ((j + disploc) & 0x07));
  351.                 tempi = (j+bDispHalfByte) >> Bperpixel;
  352.                 if (CurrentBit != 0 && CurrentBit1 != 0)
  353.                 {
  354.                     pLine[iDispLoc + tempi] = ((pLine[iDispLoc + tempi] <<
  355.                         shift_num) & 0xf0) |
  356.                         fontcolor; //0x02;//
  357.                 }
  358.                 else if (CurrentBit == 0 && CurrentBit1 != 0)
  359.                 {
  360.                     pLine[iDispLoc + tempi] = ((pLine[iDispLoc + tempi] <<
  361.                         shift_num) & 0xf0) |
  362.                         FigureColor;//0x0b;//
  363.                 }
  364.                 else
  365.                 {
  366.                     pLine[iDispLoc + tempi] = ((pLine[iDispLoc + tempi] <<
  367.                         shift_num) & 0xf0) |
  368.                         bgcolor; // 0x00;//
  369.                 }
  370.             }
  371.             disploc += fwidth ;  
  372.             if (((i + yStart) & 0x01)||(p_scan ==1))
  373.                     iDispLoc += iRegionWidth;
  374.             }
  375.         }
  376.    // osd_tog_region(number, OSD_ON);
  377.     osd_tog_region(number, OSD_ON); //ouyang 2004.07.31
  378. }
  379. #ifdef SUPPORT_ABSTRACT_FONT
  380. /*****************************************************************************
  381.   *** function :draw the font bitmap of the GB1 and GB2 ;support the new GB font.
  382.       after abstracting the Font bitmap  from CD-ROM, call it to draw the respoding HZ
  383.   ** xStart,yStart: the coordinate
  384.   ** c: GB code
  385.   ** fontcolor: the font color 
  386.   ** bgcolor : the background color of the font 
  387.   ** FigureColor: the figure color of the font
  388.   ** FontType : the font type 
  389.   ** number: the OSD region NO.
  390.   ** FontBaseNo: the font database NO.
  391.  ******************************************************************************/
  392. void osd_midi_DrawHZ_Mem(int xStart, int yStart, UINT16 c, BYTE fontcolor,
  393.     BYTE bgcolor, BYTE FigureColor, BYTE FontType, BYTE number,
  394.     BYTE FontBaseNo)  //BYTE fontcolor, BYTE bgcolor,BYTE FigureColor,
  395. {
  396.     BYTE CurrentByte, CurrentByte1, CurrentBit, CurrentBit1;
  397.     BYTE NewFormatFlag = 0,bDispHalfByte;
  398.     BYTE* p1Font, * pFont = (void*) (0);
  399.     BYTE* pTopLine, * pBtmLine, * pLine; 
  400.     UINT32 iDispLoc, disploc;
  401.     int iRegionWidth = region[number].osd_w ; //>>bIsMenuFont;
  402.     int osd_format = region[number].osd_format;
  403.     unsigned int     fwidth = 0,fhight = 0,fbit;
  404.     unsigned int      i, j, Bperpixel,shift_num,tempi;
  405.     ST_GBPos* GBPos;
  406.     BYTE* pTemp;
  407.     pTopLine = (BYTE *)(((BYTE *) get_osdbuf_baseptr()) +
  408.         (region[number].osd_header[0] + OSD_DATA_OFFSET(region[number].osd_format)) * 32);
  409.     pBtmLine = (BYTE *)(((BYTE *) get_osdbuf_baseptr()) +
  410.         (region[number].osd_header[1] + OSD_DATA_OFFSET(region[number].osd_format)) * 32);   
  411.     iDispLoc = (yStart ) * iRegionWidth  + xStart;
  412.     bDispHalfByte = iDispLoc & 0x01;
  413.     iDispLoc = (((yStart - ((yStart) & 0x01)) * iRegionWidth ) + (xStart))>>1;
  414.     switch (osd_format)
  415.     {
  416.     case OSD_FORMAT_4COLOR:
  417.         Bperpixel = 2; // 4
  418.         shift_num = 2;
  419.         break;
  420.     case OSD_FORMAT_256COLOR:
  421.         Bperpixel = 0; // 1
  422.         shift_num = 8;
  423.         break;
  424.     case OSD_FORMAT_16COLOR:
  425.         Bperpixel = 1; // 2
  426.         shift_num = 4;
  427.         break;
  428.     default:
  429.         Bperpixel = 1; // 2
  430.         shift_num = 4;
  431.         break;
  432.     }
  433.     pTemp = (BYTE *) (LYRIC_FONT_HZ_INDEX);
  434.     GBPos = (ST_GBPos *) pTemp; 
  435.     tempi = 0;
  436.     while ((GBPos[tempi].uGBCode != c)) 
  437.     {
  438.         if ((GBPos[tempi].uBitmapPos == 0))
  439.             return ;
  440.         tempi++;
  441.     }
  442.     pFont = (UINT8 *) (MIDI_OSDFONT_ADDR);
  443.     NewFormatFlag = pFont[0];   
  444.     if (NewFormatFlag != 0xff)
  445.     {
  446.         fwidth = pFont[0];
  447.         fhight = pFont[1];
  448.         pFont = GBPos[tempi].uBitmapPos;
  449.         
  450.         disploc = 0;
  451.         for (i = 0; i < fhight; i++)
  452.         {
  453.             if ((i + yStart) & 0x01)
  454.                 pLine = pBtmLine;
  455.             else
  456.                 pLine = pTopLine;
  457.             for (j = 0; j < fwidth; j++)
  458.             {
  459.                 tempi = (j+bDispHalfByte) >> Bperpixel;
  460.                 if (pFont[((j + disploc) >> 3) + 3] & (0x80 >>
  461.                     ((j + disploc) & 0x07)))
  462.                     pLine[iDispLoc + tempi] = (pLine[iDispLoc + tempi] <<
  463.                         shift_num) |
  464.                         fontcolor;
  465.                 else
  466.                     pLine[iDispLoc + tempi] = (pLine[iDispLoc + tempi] <<
  467.                         shift_num) |
  468.                         bgcolor;
  469.             }
  470.             disploc += fwidth ;      
  471.             if ((i + yStart) & 0x01)
  472.                 iDispLoc += iRegionWidth;
  473.         }
  474.     }
  475.     else
  476.     {
  477. #if 0
  478.     switch(FontType)
  479.     {
  480.         case 0:
  481.             fontcolor=bgcolor;
  482.             break;
  483.         case 1:
  484.             FigureColor=bgcolor;
  485.             break;
  486.         case 2:
  487.         //  FigureColor = 11;
  488.             break;
  489.         default:
  490.             break;
  491.     }
  492. #endif  
  493.         fhight = (pFont[4] << 8) | pFont[3];
  494.         fwidth = (pFont[6] << 8) | pFont[5];
  495.         fbit = fwidth * fhight;
  496.         pFont = GBPos[tempi].uBitmapPos;
  497.         if (fbit & 0x07)
  498.         {
  499.             p1Font = pFont + (fbit >> 3) + 1;
  500.         }
  501.         else
  502.         {
  503.             p1Font = pFont + (fbit >> 3);
  504.         }
  505.         disploc = 0;
  506.         for (i = 0; i < fhight; i++)
  507.         {
  508.             if ((i + yStart) & 0x01)
  509.                 pLine = pBtmLine;
  510.             else
  511.                 pLine = pTopLine;
  512.             for (j = 0; j < fwidth; j++)
  513.             {
  514.                 CurrentByte = pFont[((j + disploc) >> 3)];
  515.                 CurrentByte1 = p1Font[((j + disploc) >> 3)];
  516.                 CurrentBit = CurrentByte & (0x80 >> ((j + disploc) & 0x07));
  517.                 CurrentBit1 = CurrentByte1 & (0x80 >> ((j + disploc) & 0x07));
  518.                 tempi = (j+bDispHalfByte) >> Bperpixel;
  519.                 if (CurrentBit != 0 && CurrentBit1 != 0)
  520.                 {
  521.                     pLine[iDispLoc + tempi] |= ((pLine[iDispLoc + tempi] <<
  522.                         shift_num) & 0xf0) |
  523.                         fontcolor; //0x02;//
  524.                 }
  525.                 else if (CurrentBit == 0 && CurrentBit1 != 0)
  526.                 {
  527.                     pLine[iDispLoc + tempi] |= ((pLine[iDispLoc + tempi] <<
  528.                         shift_num) & 0xf0) |
  529.                         FigureColor;  //0x0b;//
  530.                 }
  531.                 else
  532.                 {
  533.                     pLine[iDispLoc + tempi] |= ((pLine[iDispLoc + tempi] <<
  534.                         shift_num) & 0xf0) |
  535.                         bgcolor; //0x00;//
  536.                 }
  537.             }
  538.             disploc += fwidth;
  539.             if ((i + yStart) & 0x01)
  540.                 iDispLoc += iRegionWidth;
  541.         }
  542.     }
  543. }
  544. #else  //#ifdef SUPPORT_ABSTRACT_FONT
  545. /*********************************************************************
  546. //   ** function :draw the font bitmap of the GB1 and GB2 ;support the new GB font.
  547. //   ** xStart,yStart: the X&Y start position of the coordinate
  548. //   ** c: GB code
  549. //   ** fontcolor: the font color 
  550. //   ** bgcolor : the background color of the font 
  551. //   ** FigureColor: the figure color of the font
  552. //   ** FontType : the font type 
  553. //   ** number: the OSD region NO.
  554. //   ** FontBaseNo: the font database NO.
  555.  ***********************************************************************/
  556. void osd_midi_DrawHZ_Mem(int xStart, int yStart, UINT16 c, BYTE fontcolor,
  557.     BYTE bgcolor, BYTE FigureColor, BYTE FontType, BYTE number,
  558.     BYTE FontBaseNo) 
  559. {
  560.     BYTE CurrentByte, CurrentByte1, CurrentBit, CurrentBit1;
  561.     BYTE NewFormatFlag = 0,bDispHalfByte; //ByteLow,ByteHi;
  562.     BYTE* p1Font, * pFont = (void*) (0), * pFont1;
  563.     BYTE* pTopLine, * pBtmLine, * pLine; 
  564.     BYTE* pGB1Font = (void*) (0), * pGB2Font =(void*) (0);
  565.     UINT32 iDispLoc, disploc; //, uiDispHalfByte
  566.     int iRegionWidth = region[number].osd_w ; //>>bIsMenuFont;
  567.     int osd_format = region[number].osd_format;
  568.     unsigned int     fwidth = 0,fhight = 0,fbit = 0;
  569.     unsigned int      i, j, Bperpixel,shift_num,tempi;
  570.     int CH = ( c >> 8), CL = (c& 0xFF);
  571.     int Hgbcode;
  572.     if (p_scan ==1)
  573.     {
  574.         yStart<<=1;
  575.     }
  576.     pTopLine = (BYTE *) (((BYTE *) get_osdbuf_baseptr()) +
  577.         (region[number].osd_header[0] + OSD_DATA_OFFSET(region[number].osd_format)) * 32);
  578.     pBtmLine = (BYTE *)(((BYTE *) get_osdbuf_baseptr()) +
  579.         (region[number].osd_header[1] + OSD_DATA_OFFSET(region[number].osd_format)) * 32);   
  580.     iDispLoc = (yStart ) * iRegionWidth  + xStart;
  581.     bDispHalfByte = iDispLoc & 0x01;
  582.     iDispLoc = (((yStart - ((yStart) & 0x01)) * iRegionWidth ) + (xStart))>>1;
  583.     if (FontBaseNo == MIDI_LYRIC_FONTDEBASE)
  584.     {
  585.         pGB1Font = (BYTE *) (MIDI_OSDFONT_ADDR);
  586.         pGB2Font = (UINT8 *) upMidiGB2FontAddr;
  587.     }
  588. #ifdef MIDI_MENU_FONT
  589.     else if (FontBaseNo == MIDI_MENU_FONTDEBASE)
  590.     {
  591.         pGB1Font = (BYTE *) (upMenuGB1FontAddr);
  592.         pGB2Font = (UINT8 *) upMenuGB2FontAddr;
  593.     }
  594. #endif
  595.     switch (osd_format)
  596.     {
  597.     case OSD_FORMAT_4COLOR:
  598.         Bperpixel = 2; // 4
  599.         shift_num = 2;
  600.         break;
  601.     case OSD_FORMAT_256COLOR:
  602.         Bperpixel = 0; // 1
  603.         shift_num = 8;
  604.         break;
  605.     case OSD_FORMAT_16COLOR:
  606.         Bperpixel = 1; // 2
  607.         shift_num = 4;
  608.         break;
  609.     default:
  610.         Bperpixel = 1; // 2
  611.         shift_num = 4;
  612.         break;
  613.     }
  614.     //get the font bitmap addr
  615.     if ((CH >= 0xA1 && CH < 0xD7 && CL >= 0xA1 && CL < 0xFF) ||
  616.         (CH == 0xD7 && CL >= 0xA1 && CL < 0xFa))
  617.     {
  618.         //the following is GB1 font     
  619.         if (CH > 0xA9)
  620.         {
  621.             Hgbcode = 0xA7;
  622.         }
  623.         else
  624.         {
  625.             Hgbcode = 0xA1;
  626.         }
  627.         pFont1 = pGB1Font;  //(BYTE *)(MIDI_OSDFONT_ADDR); 
  628.         NewFormatFlag = pFont1[0];
  629.         if (NewFormatFlag != 0xff)
  630.         {
  631.             fwidth = pFont1[0];
  632.             fhight = pFont1[1];
  633.             fbit = fwidth * fhight;
  634.             if (fbit & 0x07)
  635.             {
  636.                 pFont = (BYTE *)
  637.                     (pGB1Font +
  638.                     ((CH - Hgbcode) * 94 + (CL - 0xA1)) * ((fbit >> 3) + 1)); //MIDI_OSDFONT_ADDR
  639.             }
  640.             else
  641.             {
  642.                 pFont = (BYTE *)
  643.                     (pGB1Font +
  644.                     ((CH - Hgbcode) * 94 + (CL - 0xA1)) * (fbit >> 3)); //MIDI_OSDFONT_ADDR
  645.             }
  646.         }
  647.         else
  648.         {
  649.             fhight = (pFont1[4] << 8) | pFont1[3];
  650.             fwidth = (pFont1[6] << 8) | pFont1[5];
  651.             fbit = fwidth * fhight;
  652.             if (fbit & 0x07)
  653.             {
  654.                 pFont = (BYTE *)
  655.                     (pGB1Font +
  656.                     ((CH - Hgbcode) * 94 + (CL - 0xA1)) * ((fbit >> 3) + 1) * 2); //MIDI_OSDFONT_ADDR
  657.             }
  658.             else
  659.             {
  660.                 pFont = (BYTE *)
  661.                     (pGB1Font +
  662.                     ((CH - Hgbcode) * 94 + (CL - 0xA1)) * (fbit >> 3) * 2); //MIDI_OSDFONT_ADDR
  663.             }
  664.         }
  665.     }
  666.     else if (CH >= 0xD8 && CH < 0xF8 && CL >= 0xA1 && CL < 0xFF)
  667.     {
  668.         pFont1 = (UINT8 *) pGB2Font; //upMidiGB2FontAddr;
  669.         NewFormatFlag = pFont1[0];
  670.         if (NewFormatFlag != 0xff)
  671.         {
  672.             fwidth = pFont1[0];
  673.             fhight = pFont1[1];
  674.             fbit = fwidth * fhight;
  675.             if (fbit & 0x07)
  676.             {
  677.                 //upMidiGB2FontAddr
  678.                 pFont = (BYTE *)
  679.                     (pGB2Font +
  680.                     ((CH - 0xd8) * 94 + (CL - 0xA1)) * ((fbit >> 3) + 1));
  681.             }
  682.             else
  683.             {
  684.                 //upMidiGB2FontAddr
  685.                 pFont = (BYTE *)
  686.                     (pGB2Font + ((CH - 0xd8) * 94 + (CL - 0xA1)) * (fbit >> 3));
  687.             }
  688.         }
  689.         else
  690.         {
  691.             fhight = (pFont1[4] << 8) | pFont1[3];
  692.             fwidth = (pFont1[6] << 8) | pFont1[5];
  693.             fbit = fwidth * fhight;
  694.             if (fbit & 0x07)
  695.             {
  696.                 //upMidiGB2FontAddr
  697.                 pFont = (BYTE *)
  698.                     (pGB2Font +
  699.                     ((CH - 0xd8) * 94 + (CL - 0xA1)) * ((fbit >> 3) + 1) * 2);
  700.             }
  701.             else
  702.             {
  703.                 //upMidiGB2FontAddr
  704.                 pFont = (BYTE *)
  705.                     (pGB2Font +
  706.                     ((CH - 0xd8) * 94 + (CL - 0xA1)) * (fbit >> 3) * 2);
  707.             }
  708.         }
  709.     }
  710.     //draw the GB1 font bitmap  
  711.     if (NewFormatFlag != 0xff)
  712.     {
  713.         pFont = pFont + 3;
  714.         disploc = 0;
  715.         for (i = 0; i < fhight; i++)
  716.         {
  717.             if (((i + yStart) & 0x01)||(p_scan==1))
  718.                     pLine = pBtmLine;
  719.                 else
  720.                     pLine = pTopLine;
  721.             
  722.             for (j = 0; j < fwidth; j++)
  723.             {
  724.                 tempi = (j+bDispHalfByte) >> Bperpixel;
  725.                 if (pFont[((j + disploc) >> 3)] & (0x80 >>
  726.                     ((j + disploc) & 0x07)))
  727.                 {
  728.                 pLine[iDispLoc + tempi] = (pLine[iDispLoc + tempi] <<
  729.                     shift_num) |
  730.                     fontcolor;
  731.                 }
  732.                 else
  733.                     pLine[iDispLoc + tempi] = (pLine[iDispLoc + tempi] <<
  734.                         shift_num) |
  735.                         bgcolor;
  736.             }
  737.             disploc += fwidth ;        
  738.             if (((i + yStart) & 0x01)||(p_scan ==1))
  739.                     iDispLoc += iRegionWidth;
  740.             }
  741.         }
  742.     else
  743.     {
  744. #if 1
  745.         switch (FontType)
  746.         {
  747.         case 0:
  748.             fontcolor = bgcolor;
  749.             break;
  750.         case 1:
  751.             FigureColor = bgcolor;
  752.             break;
  753.         case 2:
  754.             //  FigureColor = 11;
  755.             break;
  756.         case 3:
  757.             FigureColor = fontcolor;
  758.             break;
  759.         default:
  760.             break;
  761.         }
  762. #endif  
  763.         //  fbit=fwidth*fhight;
  764.         pFont = pFont + 10;
  765.         if (fbit & 0x07)
  766.         {
  767.             p1Font = pFont + (fbit >> 3) + 1;
  768.         }
  769.         else
  770.         {
  771.             p1Font = pFont + (fbit >> 3);
  772.         }
  773.         disploc = 0;
  774.         for (i = 0; i < fhight; i++)
  775.         {
  776.             if (((i + yStart) & 0x01)||(p_scan==1))//xlluo 2004
  777.                     pLine = pBtmLine;
  778.                 else
  779.                     pLine = pTopLine;
  780.           
  781.             for (j = 0; j < fwidth; j++)
  782.             {
  783.                 CurrentByte = pFont[((j + disploc) >> 3)];
  784.                 CurrentByte1 = p1Font[((j + disploc) >> 3)];
  785.                 CurrentBit = CurrentByte & (0x80 >> ((j + disploc) & 0x07));
  786.                 CurrentBit1 = CurrentByte1 & (0x80 >> ((j + disploc) & 0x07));
  787.                 tempi = (j+bDispHalfByte) >> Bperpixel;
  788.                 {
  789.                     if (CurrentBit != 0 && CurrentBit1 != 0)
  790.                     {
  791.                         pLine[iDispLoc + tempi] = ((pLine[iDispLoc + tempi] <<
  792.                             shift_num) & 0xf0) |
  793.                             fontcolor; //0x02;//
  794.                     }
  795.                     else if (CurrentBit == 0 && CurrentBit1 != 0)
  796.                     {
  797.                         pLine[iDispLoc + tempi] = ((pLine[iDispLoc + tempi] <<
  798.                             shift_num) & 0xf0) |
  799.                             FigureColor;  //0x0b;//
  800.                     }
  801.                     else
  802.                     {
  803.                         pLine[iDispLoc + tempi] = ((pLine[iDispLoc + tempi] <<
  804.                             shift_num) & 0xf0) |
  805.                             bgcolor; //0x00;//
  806.                     }
  807.                 }
  808.             }
  809.             disploc += fwidth ;  
  810.             if (((i + yStart) & 0x01)||(p_scan ==1))
  811.                     iDispLoc += iRegionWidth;
  812.             }
  813.         }
  814.         osd_tog_region(number ,OSD_ON);    //ouyang 2004.07.31
  815.     }   
  816. #endif  //end #ifdef SUPPORT_ABSTRACT_FONT
  817. #ifdef MIDI_MENU_FONT
  818. //the following is 30*30 font width for number and alphabet
  819. #ifdef SUPPORT_BIG5ANDGB_MIDI
  820. BYTE MenuNumwidth[10] =
  821. {
  822.     16, 14, 16, 16, 16, 16, 16, 16, 16, 16, 
  823. };
  824. BYTE MenuABCwidth[26] =
  825. {
  826.     24, 20, 20, 20, 20, 20, 24, 24, 14, 18, 22, 20, 28, 24, 20, 20, 20, 22,
  827.     18, 22, 24, 24, 28, 22, 24, 20, 
  828. };
  829. BYTE Menuabcwidth[26] =
  830. {
  831.     16, 16, 16, 16, 16, 16, 16, 18, 12, 14, 18, 12, 28, 20, 16, 16, 16, 16, 14,
  832.     14, 18, 18, 24, 18, 18, 16, 
  833. };
  834. #else
  835. BYTE MenuNumwidth[10] =
  836. {
  837.     13, 12, 15, 15, 16, 14, 15, 15, 15, 15, 
  838. };
  839. BYTE MenuABCwidth[26] =
  840. {
  841.     23, 20, 20, 20, 20, 20, 23, 23, 11, 17, 22, 19, 27, 24, 20, 20, 20, 22,
  842.     18, 21, 23, 23, 27, 22, 23, 20, 
  843. };
  844. BYTE Menuabcwidth[26] =
  845. {
  846.     15, 16, 13, 16, 15, 15, 16, 17, 9, 12, 17, 16, 27, 19, 15, 15, 16, 13, 11,
  847.     11, 18, 17, 23, 17, 17, 14, 
  848. };
  849. #endif
  850. BYTE MenuFontcolor, MenuBgcolor, MenuFigureColor;
  851. #define MENU_FONT_WIDTH (30)
  852. #define MENU_OTHER_WIDTH (16)
  853. //when change the OSD color of the Menu font base, call it
  854. void MidiSetMenuFontColor(BYTE FontColor, BYTE BgColor, BYTE FigureColor)
  855. {
  856.     MenuFontcolor = FontColor;
  857.     MenuBgcolor = BgColor;
  858.     MenuFigureColor = FigureColor;
  859. }
  860. #endif 
  861. #ifdef SUPPORT_GB_FONTBASE3
  862.     /*********************************************************************
  863.     //   ** function :search GB3 base font pointer; gb3font should be include in font3 base
  864.     //   ** hzcode: GB code
  865.     //   **FontBaseNo:for menu or lyric
  866.      ***********************************************************************/
  867. #define GB3_FONTBASE_FLAG   (0x10000000L) 
  868. #define GB3_FONTBASE_NONFLAG (0x0fffffffL)//ouly use 28 bit for fontsize
  869. #define GET_LONG_INT(p)         (((*((p)+3))<<24)|((*((p)+2))<<16)|((*((p)+1))<<8)|(*(p)))     
  870. #define GET_SHORT_INT(p)    ((*((p)+1)<<8)|(*(p)))
  871. #define GET_HZCODE(p)           ((UINT16)GET_SHORT_INT(p))
  872. BYTE *midi_GetGB3Font(UINT16 hzcode,BYTE FontBaseNo)     
  873. {
  874.     BYTE * pfont3base =upGB3FontAddr;
  875.     BYTE fontbase;
  876.     BYTE *retpos;
  877.     while ((*pfont3base)&&(upGB3FontEndPtr>pfont3base))
  878.     {
  879.         if ( GET_HZCODE(pfont3base)==hzcode)
  880.         {
  881.             fontbase = (((GET_LONG_INT(pfont3base+2))&(GB3_FONTBASE_FLAG))&&1); 
  882.             if (!(fontbase^FontBaseNo))
  883.             {
  884.                 retpos =pfont3base+6;
  885.                 return retpos;
  886.             }else
  887.             {
  888.                 pfont3base +=(GET_LONG_INT(pfont3base+2)&(GB3_FONTBASE_NONFLAG));
  889.             }
  890.         }else
  891.         {
  892.             pfont3base +=(GET_LONG_INT(pfont3base+2)&(GB3_FONTBASE_NONFLAG));
  893.         }  
  894.     }
  895.     return 0;
  896. }    
  897. #endif
  898. /********************************************************
  899.     //Function :  Disp_Text_OSD Display the lyric on screen by OSD
  900.     //int xx :the x position
  901.     //int yy :the y position
  902.     //char *Lyric:  the string of lyric
  903.     //BYTE regNum OSD Number
  904.     //int margin: uint --> pixel
  905.     //uFontBase:  the font database NO.
  906.     //Note   :  The Font size is 40*48 color 16
  907.  ********************************************************/
  908. #if 1
  909. int Disp_Text_OSD(int xx, int yy, BYTE* Lyric, BYTE regNum, int margin,
  910.     BYTE uFontBase, BYTE FontType,int endXEdge)
  911. {
  912.     int iRegionWidth = region[regNum].osd_w<<1; 
  913.     BYTE* p = Lyric;
  914.     UINT16 ch = 0;
  915.     UINT16 x1, y1;
  916.     UINT8 uFontWidth=0, uOtherWidth=0;
  917.     BYTE Fontcolor=0, Bgcolor=0, FigureColor=0;  //,FontType
  918.     BYTE* pabc_Width, * pABC_Width, * pNum_Width;
  919.     BYTE FontHeight;
  920. #ifdef SUPPORT_GB_FONTBASE3
  921.     BYTE *gb3pos =0;
  922. #endif
  923.     if ((!endXEdge)||(endXEdge>(iRegionWidth -10)))
  924.         endXEdge =iRegionWidth;
  925.     printf("Disp_Text_OSD %sn",Lyric);
  926.     pabc_Width = pABC_Width = pNum_Width = (void *)(0);
  927.     if (uFontBase == MIDI_LYRIC_FONTDEBASE)
  928.     {
  929.         uFontWidth = LYRIC_FONT_WIDTH ; 
  930.         uOtherWidth = OTHER_FONT_WIDTH;
  931.         FontHeight =LYRIC_FONT_HIGHT;
  932.         Fontcolor = LyricFontcolor;
  933.         Bgcolor = LyricBgcolor;
  934.         FigureColor = LyricFigureColor;
  935.         pabc_Width = abc_width;
  936.         pABC_Width = ABC_width;
  937.         pNum_Width = num_width;
  938.     }
  939. #ifdef MIDI_MENU_FONT
  940.     else if (uFontBase == MIDI_MENU_FONTDEBASE)
  941.     {
  942.         uFontWidth = MENU_FONT_WIDTH ; //LYRIC_FONT_WIDTH;
  943.         uOtherWidth = MENU_OTHER_WIDTH;//OTHER_FONT_WIDTH;
  944.         FontHeight =30;
  945.         Fontcolor = MenuFontcolor;
  946.         Bgcolor = MenuBgcolor;
  947.         FigureColor = MenuFigureColor;
  948.         pabc_Width = Menuabcwidth;
  949.         pABC_Width = MenuABCwidth;
  950.         pNum_Width = MenuNumwidth;
  951. endXEdge -=10;
  952.     }else
  953.     {
  954.         printf("error font basen");
  955.         return 0;
  956.     }
  957. #endif
  958.     if (xx < 0)
  959.         xx = 0;
  960.     x1 = xx;
  961.     y1 = yy;    
  962.     while (*p == ' ')
  963.         p++;
  964.     //  osd_tog_region(regNum, OSD_ON);
  965.     while (*p)
  966.     {
  967.         int iRes;
  968.         BYTE c, c1;
  969.         iRes = 0;
  970.         c = *p;
  971.         c1 = *(p + 1);
  972.  #ifdef SUPPORT_GB_FONTBASE3
  973.         
  974.         if (((c  >= 0xA1 && c  < 0xD7 && c1 >= 0xA1 && c1 < 0xFF) ||
  975.             (c  == 0xD7 && c1 >= 0xA1 && c1 < 0xFa))||
  976.              (c  >= 0xD8 && c  < 0xF8 && c1 >= 0xA1 && c1 < 0xFF))
  977.  #else
  978.         if (c>0x80&&c1>0x80);
  979. #endif
  980.         {
  981.             iRes = 2;
  982.             p ++;
  983.             if (iRegionWidth - x1 < 48) //
  984.             {
  985.                 break;   //width is not enough break
  986.         }
  987.         }
  988.  #ifdef SUPPORT_GB_FONTBASE3
  989.         else if ((c > 0x80))//&&((c1>80)||(c1<80)))
  990.         {
  991.             UINT16 gbcode =(c<<8|c1);
  992.             gb3pos =midi_GetGB3Font(gbcode,uFontBase);
  993.             if (gb3pos)
  994.             {
  995.                 iRes = 3;
  996.                 p ++;
  997.                 if (iRegionWidth - x1 < 48) //
  998.                     break;   //width is not enough break
  999.             }else
  1000.             {
  1001.                 printf("search gb3base failn");
  1002.                 p ++;
  1003.                 iRes =0;
  1004.             }
  1005.         }    
  1006. #endif
  1007.         else if (((c >= 65) && (c <= 90)) ||     //A~Z
  1008.                  ((c >= 97) && (c <= 122)) ||    //a~z
  1009.                  ((c >= 192) && (c <= 223)) ||   //Europe characters
  1010.                  ((c >= 48) && (c <= 57)) || ((c >= 33) && (c <= 47)) //digit numbers //ouyang 2004.07.31
  1011.                  ||(c ==':'))       //interpunction //ouyang 2004.07.31
  1012.         {
  1013.             c1 = c + 0x80;
  1014.             c = 0x03 + 0xa0;
  1015.             iRes = 2;
  1016.         }
  1017.         else
  1018.         {
  1019.             switch (c)
  1020.             {
  1021.             case ' ':
  1022.                 iRes = 1;
  1023.                 break;
  1024.             default:
  1025.                 iRes = 0;
  1026.                 break;
  1027.             }
  1028.         }
  1029.         if (iRes == 0)
  1030.             c = ' ';
  1031.         if (iRes == 2)
  1032.         {
  1033.             //          if (c!=0xa3)
  1034.             {
  1035.                 if (((endXEdge - x1) < (uFontWidth))||((iRegionWidth - x1) < (uFontWidth)))  //LYRIC_FONT_WIDTH
  1036.                 {
  1037.                     //xlluo add a mend here                 //2004-11-26
  1038.                         break;
  1039.                 }
  1040.             }
  1041.             ch = (c << 8) | (c1);   
  1042.             osd_midi_DrawHZ_Mem(x1, y1, ch, Fontcolor, Bgcolor,
  1043.                 FigureColor, FontType, regNum, uFontBase);  //fontcolor, bgcolor,
  1044.             if (c == 0xa3)
  1045.                     {
  1046.                         int xtemp;
  1047.                         if (c1 >= 0xe1 && c1 <= 0xfa)
  1048.                     x1 += pabc_Width[c1 - 0xe1];//+margin;
  1049.                         else if ((c1 >= 0xc1) && (c1 <= 0xda))
  1050.                     x1 += pABC_Width[c1 - 0xc1];//+margin;
  1051.                         else if ((c1 > 0xaf) && (c1 < 0xba))
  1052.                         {
  1053.                     x1 += pNum_Width[c1 - 0xb0] + margin;
  1054.                         }
  1055.                         else
  1056.                         {
  1057.                     x1 += uOtherWidth;  //OTHER_FONT_WIDTH
  1058.                         }
  1059.                         }
  1060.             else
  1061.                         {
  1062.                 x1 += (uFontWidth) + margin;        //LYRIC_FONT_WIDTH
  1063.             }
  1064.         }
  1065.  #ifdef SUPPORT_GB_FONTBASE3
  1066.         else if (iRes == 3)
  1067.         {
  1068.             {
  1069.                 if (((endXEdge - x1) < (uFontWidth))||((iRegionWidth - x1) < (uFontWidth)))  //LYRIC_FONT_WIDTH
  1070.                 {
  1071.                     break;   //width is not enough break
  1072.                 }
  1073.             }        
  1074.             draw_midi_bitmap_HZnew(gb3pos,x1, y1<<1, Fontcolor, Bgcolor,FigureColor, FontType, regNum);
  1075.             x1 += (uFontWidth) + margin;        //LYRIC_FONT_WIDTH
  1076.                         }    
  1077. #endif
  1078.         else
  1079.         {
  1080.             if (((endXEdge - x1) < (uOtherWidth))||((iRegionWidth - x1) < (uOtherWidth)))  // LYRIC_FONT_WIDTH
  1081.                 break;   //width is not enough break
  1082. #if 0 //def SUPPORT_SANJING_WIDESAPCE                //xlluo for sj space 04-10-15
  1083.             Osd_Clear_Rect(x1,  yy, uOtherWidth+3,FontHeight,Bgcolor,regNum);
  1084.             x1 += uOtherWidth; //OTHER_FONT_WIDTH
  1085. #else
  1086.             if ((c == ' ') && (*(p - 1) != ' '))
  1087.             {
  1088. if (uFontBase == MIDI_MENU_FONTDEBASE)   
  1089. {     
  1090. int wspace = uOtherWidth+3;
  1091. if (((endXEdge - x1) < (uFontWidth))||((iRegionWidth - x1) < (uFontWidth)))
  1092. wspace = endXEdge-x1;
  1093. Osd_Clear_Rect(x1,  yy, wspace,FontHeight,Bgcolor,regNum);
  1094. x1 += wspace-3; //OTHER_FONT_WIDTH
  1095.                     }else
  1096. {
  1097. Osd_Clear_Rect(x1,  yy, uOtherWidth+3,FontHeight,Bgcolor,regNum);
  1098. x1 += uOtherWidth; //OTHER_FONT_WIDTH
  1099. }
  1100.             }
  1101. #endif
  1102.         }
  1103.         p++;
  1104.     }
  1105.     osd_tog_region(regNum, OSD_ON);
  1106.     return x1;
  1107. }
  1108. #else
  1109. int Disp_Text_OSD(int xx, int yy, BYTE* Lyric, BYTE regNum, int margin,
  1110.     BYTE uFontBase, BYTE FontType,int endXEdge)
  1111. {
  1112.     int iRegionWidth = region[regNum].osd_w<<1; 
  1113.     BYTE* p = Lyric;
  1114.     UINT16 ch = 0;
  1115.     UINT16 x1, y1;
  1116.     UINT8 uFontWidth=0, uOtherWidth=0;
  1117.     BYTE Fontcolor=0, Bgcolor=0, FigureColor=0;  //,FontType
  1118.     BYTE* pabc_Width, * pABC_Width, * pNum_Width;
  1119.     BYTE FontHeight;
  1120. #ifdef SUPPORT_GB_FONTBASE3
  1121.     BYTE *gb3pos =0;
  1122. #endif
  1123.     if (!endXEdge)
  1124.         endXEdge =iRegionWidth;
  1125.     printf("Disp_Text_OSD %sn",Lyric);
  1126.     pabc_Width = pABC_Width = pNum_Width = (void *)(0);
  1127.     if (uFontBase == MIDI_LYRIC_FONTDEBASE)
  1128.     {
  1129.         uFontWidth = LYRIC_FONT_WIDTH ; 
  1130.         uOtherWidth = OTHER_FONT_WIDTH;
  1131.         FontHeight =LYRIC_FONT_HIGHT;
  1132.         Fontcolor = LyricFontcolor;
  1133.         Bgcolor = LyricBgcolor;
  1134.         FigureColor = LyricFigureColor;
  1135.         pabc_Width = abc_width;
  1136.         pABC_Width = ABC_width;
  1137.         pNum_Width = num_width;
  1138.     }
  1139. #ifdef MIDI_MENU_FONT
  1140.     else if (uFontBase == MIDI_MENU_FONTDEBASE)
  1141.     {
  1142.         uFontWidth = MENU_FONT_WIDTH ; //LYRIC_FONT_WIDTH;
  1143.         uOtherWidth = MENU_OTHER_WIDTH;//OTHER_FONT_WIDTH;
  1144.         FontHeight =30;
  1145.         Fontcolor = MenuFontcolor;
  1146.         Bgcolor = MenuBgcolor;
  1147.         FigureColor = MenuFigureColor;
  1148.         pabc_Width = Menuabcwidth;
  1149.         pABC_Width = MenuABCwidth;
  1150.         pNum_Width = MenuNumwidth;
  1151.     }else
  1152.     {
  1153.         printf("error font basen");
  1154.         return 0;
  1155.     }
  1156. #endif
  1157.     if (xx < 0)
  1158.         xx = 0;
  1159.     x1 = xx;
  1160.     y1 = yy;    
  1161.     while (*p == ' ')
  1162.         p++;
  1163.     //  osd_tog_region(regNum, OSD_ON);
  1164.     while (*p)
  1165.     {
  1166.         int iRes;
  1167.         BYTE c, c1;
  1168.         iRes = 0;
  1169.         c = *p;
  1170.         c1 = *(p + 1);
  1171.  #ifdef SUPPORT_GB_FONTBASE3
  1172.         
  1173.         if (((c  >= 0xA1 && c  < 0xD7 && c1 >= 0xA1 && c1 < 0xFF) ||
  1174.             (c  == 0xD7 && c1 >= 0xA1 && c1 < 0xFa))||
  1175.              (c  >= 0xD8 && c  < 0xF8 && c1 >= 0xA1 && c1 < 0xFF))
  1176.  #else
  1177.         if (c>0x80&&c1>0x80);
  1178. #endif
  1179.         {
  1180.             iRes = 2;
  1181.             p ++;
  1182.             if (iRegionWidth - x1 < 48) //
  1183.                 break;   //width is not enough break
  1184.         }
  1185.  #ifdef SUPPORT_GB_FONTBASE3
  1186.         else if ((c > 0x80))//&&((c1>80)||(c1<80)))
  1187.         {
  1188.             UINT16 gbcode =(c<<8|c1);
  1189.             gb3pos =midi_GetGB3Font(gbcode,uFontBase);
  1190.             if (gb3pos)
  1191.                     {
  1192.                 iRes = 3;
  1193.                 p ++;
  1194.                 if (iRegionWidth - x1 < 48) //
  1195.                     break;   //width is not enough break
  1196.             }else
  1197.             {
  1198.                 printf("search gb3base failn");
  1199.                 p ++;
  1200.                 iRes =0;
  1201.             }
  1202.         }    
  1203. #endif
  1204.         else if (((c >= 65) && (c <= 90)) ||     //A~Z
  1205.                  ((c >= 97) && (c <= 122)) ||    //a~z
  1206.                  ((c >= 192) && (c <= 223)) ||   //Europe characters
  1207.                  ((c >= 48) && (c <= 57)) || ((c >= 33) && (c <= 47)) //digit numbers //ouyang 2004.07.31
  1208.                  ||(c ==':'))       //interpunction //ouyang 2004.07.31
  1209.         {
  1210.             c1 = c + 0x80;
  1211.             c = 0x03 + 0xa0;
  1212.             iRes = 2;
  1213.         }
  1214.         else
  1215.         {
  1216.             switch (c)
  1217.             {
  1218.             case ' ':
  1219.                 iRes = 1;
  1220.                 break;
  1221.             default:
  1222.                 iRes = 0;
  1223.                         break;
  1224.                     }    
  1225.                 }
  1226.         if (iRes == 0)
  1227.             c = ' ';
  1228.         if (iRes == 2)
  1229.         {
  1230.             //          if (c!=0xa3)
  1231.             {
  1232.                 if (((endXEdge - x1) < (uFontWidth))||((iRegionWidth - x1) < (uFontWidth)))  //LYRIC_FONT_WIDTH
  1233.                 {
  1234.                     //                  ulLineTotalColumns[(cLineDisp^1)] = x1;
  1235.                  //   printf("ulLineTotalColumns ==%dn", x1);
  1236.                     break;   //width is not enough break
  1237.                 }
  1238.             }
  1239.             ch = (c << 8) | (c1);   
  1240.             osd_midi_DrawHZ_Mem(x1, y1, ch, Fontcolor, Bgcolor,
  1241.                 FigureColor, FontType, regNum, uFontBase);  //fontcolor, bgcolor,
  1242.             if (c == 0xa3)
  1243.             {
  1244.                if (c1 >= 0xe1 && c1 <= 0xfa)
  1245.                     x1 += pabc_Width[c1 - 0xe1];//+margin;
  1246.                 else if ((c1 >= 0xc1) && (c1 <= 0xda))
  1247.                     x1 += pABC_Width[c1 - 0xc1];//+margin;
  1248.                 else if ((c1 > 0xaf) && (c1 < 0xba))
  1249.                 {
  1250.                     x1 += pNum_Width[c1 - 0xb0] + margin;
  1251.                 }
  1252.                 else
  1253.                 {
  1254.                     x1 += uOtherWidth;  //OTHER_FONT_WIDTH
  1255.                 }
  1256.             }
  1257.             else
  1258.             {
  1259.                 x1 += (uFontWidth) + margin;        //LYRIC_FONT_WIDTH
  1260.             }
  1261.         }
  1262.  #ifdef SUPPORT_GB_FONTBASE3
  1263.         else if (iRes == 3)
  1264.         {
  1265.             {
  1266.                 if (((endXEdge - x1) < (uFontWidth))||((iRegionWidth - x1) < (uFontWidth)))  //LYRIC_FONT_WIDTH
  1267.                 {
  1268.                     //                  ulLineTotalColumns[(cLineDisp^1)] = x1;
  1269.                  //   printf("ulLineTotalColumns ==%dn", x1);
  1270.                     break;   //width is not enough break
  1271.                 }
  1272.             }        
  1273.             draw_midi_bitmap_HZnew(gb3pos,x1, y1<<1, Fontcolor, Bgcolor,FigureColor, FontType, regNum);
  1274.             x1 += (uFontWidth) + margin;        //LYRIC_FONT_WIDTH
  1275.         }    
  1276. #endif
  1277.         else
  1278.         {
  1279.             printf(" show sp ");
  1280.             if (((endXEdge - x1) < (uOtherWidth))||((iRegionWidth - x1) < (uOtherWidth)))  // LYRIC_FONT_WIDTH
  1281.                 break;   //width is not enough break
  1282. #ifdef SUPPORT_SANJING_WIDESAPCE                //xlluo for sj space 04-10-15
  1283.             Osd_Clear_Rect(x1,  yy, uOtherWidth+3,FontHeight,Bgcolor,regNum);
  1284.             x1 += uOtherWidth; //OTHER_FONT_WIDTH
  1285. #else
  1286.             if ((c == ' ') && (*(p - 1) != ' '))
  1287.             {
  1288.                 Osd_Clear_Rect(x1,  yy, uOtherWidth+3,FontHeight,Bgcolor,regNum);
  1289.                 x1 += uOtherWidth; //OTHER_FONT_WIDTH
  1290.             }
  1291. #endif
  1292.         }
  1293.         printf(" x1 is %dn",x1);
  1294.         p++;
  1295.     }
  1296.     osd_tog_region(regNum, OSD_ON);
  1297.     return x1;
  1298. }
  1299. #endif
  1300. //*************************************************
  1301. //***clear the Rect region
  1302. // only for OSD_FORMAT_16COLOR 
  1303. //***int xx, int yy,:the position
  1304. //***int xlen, int ylen: the x&y length 
  1305. //***BYTE colour: the color that fill in the osd region
  1306. //***BYTE regNum:the region NO.
  1307. //*************************************************
  1308. void Osd_Clear_Rect(int xx, int yy, int xlen, int ylen, BYTE colour,
  1309.     BYTE regNum)
  1310. {
  1311.     BYTE* pTopLine, * pBtmLine, * pLine;
  1312.     BYTE colbyte;//bDispHalfByte;
  1313.     UINT32 iDispLoc;
  1314.     int i, j;
  1315.     int iRegionWidth = region[regNum].osd_w;
  1316.     if (p_scan ==1)
  1317.     {
  1318.         yy<<=1;
  1319.         ylen<<=1;
  1320.     }
  1321.     
  1322.     pTopLine = (BYTE *) (((BYTE *) get_osdbuf_baseptr()) +
  1323.         (region[regNum].osd_header[0] + OSD_DATA_OFFSET(region[regNum].osd_format)) * 32);
  1324.     pBtmLine = (BYTE *)(((BYTE *) get_osdbuf_baseptr()) +
  1325.         (region[regNum].osd_header[1] + OSD_DATA_OFFSET(region[regNum].osd_format)) * 32);
  1326.     iDispLoc = (((yy - ((yy) & 0x01)) * iRegionWidth ) + (xx))>>1;
  1327.     colbyte =(BYTE)(((colour & 0x0f) << 4) | (colour & 0x0f));
  1328.     for (j = 0; j < ylen; j++)
  1329.     {
  1330.         if ((j + yy) & 0x01)
  1331.             pLine = pBtmLine;
  1332.         else
  1333.             pLine = pTopLine;
  1334.         for (i = 0; i < xlen; i++) //print one point per time
  1335.         {
  1336.            if (i & 0x01)
  1337.             {
  1338.                 pLine[iDispLoc + (i >> 1)] = colbyte;//&0x0f;
  1339.             }
  1340.         }
  1341.         if ((j + yy) & 0x01)
  1342.             iDispLoc += iRegionWidth;
  1343.     }
  1344. }
  1345. /*******************************
  1346.     // clear a line of lyric 
  1347.     //BYTE Ystart :clear line y position
  1348.     //BYTE regNum OSD Number
  1349.     //
  1350.     //for height = 40
  1351.     //support the 16 color
  1352. ********************************/
  1353. void ClearOSDStrLine(UINT16 fwidth, UINT16 Xstart, UINT16 Ystart, BYTE regNum)
  1354. {
  1355.     Osd_Clear_Rect(Xstart,Ystart,fwidth,(LYRIC_FONT_HIGHT),0,regNum);
  1356. }
  1357. /*******************************************
  1358. //draw vertline and the font bitmap  reverse video
  1359. //int xx :the x position
  1360. //int yy :the y position
  1361. //short height :font hight
  1362. //BYTE columns :pels num for rev
  1363. //only for the 16 colors
  1364. ********************************************/
  1365. void Disp_one_vertline(int xx, int yy, UINT16 height, UINT16 columns,
  1366.     BYTE regNum)
  1367. {
  1368.     int i, j, k;
  1369.     BYTE* pTopLine, * pBtmLine, * pLine;
  1370.     UINT32 iDispLoc, uiDispHalfByte,bDispHalfByte;
  1371.     int iRegionWidth = region[regNum].osd_w;
  1372.     UINT16 high = height;
  1373.     UINT16 width = columns;
  1374.     pTopLine = (BYTE *)((BYTE *) get_osdbuf_baseptr() +
  1375.         region[regNum].osd_header[0] * 32 +
  1376.         OSD_DATA_OFFSET(region[regNum].osd_format) * 32);
  1377.     pBtmLine = (BYTE *)((BYTE *) get_osdbuf_baseptr() +
  1378.         region[regNum].osd_header[1] * 32 +
  1379.         OSD_DATA_OFFSET(region[regNum].osd_format) * 32);
  1380.     if (p_scan ==1)
  1381.     {    
  1382.         yy<<=1;
  1383.     }
  1384.     uiDispHalfByte = (((yy) * iRegionWidth) + (xx));
  1385.     iDispLoc = (((yy - ((yy) & 0x01)) * iRegionWidth) + (xx)) >> 1;
  1386.     for (i = 0; i < high; i++)
  1387.     {
  1388.         if ((i + yy) & 0x01)
  1389.             pLine = pBtmLine;
  1390.         else
  1391.             pLine = pTopLine;
  1392.         bDispHalfByte = (uiDispHalfByte) & 0x01;
  1393.         for (j = 0; j < width; j++)
  1394.         {
  1395.             k = (((xx) & 0x01) + j) >> 1;
  1396.             bDispHalfByte ^= 1;
  1397.             if (bDispHalfByte == 0)
  1398.             {
  1399.                 if ((pLine[k + iDispLoc] & 0x0f) == LyricFigureColor) 
  1400.                     pLine[k + iDispLoc] = (pLine[k + iDispLoc] & 0xf0) |
  1401.                         LyricFontcolor; 
  1402.                 else if ((pLine[k + iDispLoc] & 0x0f) == LyricFontcolor)
  1403.                     pLine[k + iDispLoc] = (pLine[k + iDispLoc] & 0xf0) |
  1404.                         LyricRevcolour;
  1405.             }
  1406.             else
  1407.             {
  1408.                 if ((pLine[k + iDispLoc] & 0xf0) == (LyricFigureColor << 4)) 
  1409.                     pLine[k + iDispLoc] = (pLine[k + iDispLoc] & 0x0f) |
  1410.                         (LyricFontcolor << 4); 
  1411.                 else if ((pLine[k + iDispLoc] & 0xf0) == (LyricFontcolor << 4))
  1412.                     pLine[k + iDispLoc] = (pLine[k + iDispLoc] & 0x0f) |
  1413.                         (LyricRevcolour << 4);
  1414.             }
  1415.         }
  1416.         if (((i + yy) & 0x01)||(p_scan ==1))
  1417.             iDispLoc += iRegionWidth;
  1418.     }
  1419.     osd_tog_region(REGION3, OSD_ON);
  1420. }
  1421. void osd_Clear_Region(BYTE reg, BYTE bkColor)
  1422. {
  1423.     Osd_Clear_Rect(0,0,region[reg].osd_w<<1,region[reg].osd_h,bkColor,reg);
  1424. }
  1425. #ifdef MIDI_MULTI_MENU
  1426. //***************************//
  1427. //updown == 0,display 凹//
  1428. //updown == 1,display 凸//
  1429. //updown > 1 ,normal display//
  1430. //**************************//
  1431. #define ARC_REGION_COLOUR_GROUND    (0)
  1432. #define ARC_REGION_COLOUR_FOUNT       (13)
  1433. #define ARC_REGION_COLOUR_EDGE         (13)
  1434. void midi_menu_draw_arc_region(int xStart, int yStart, int xLen, int yLen,
  1435.     BYTE regNum, BYTE Enable)
  1436. {
  1437.     BYTE* pTopLine, * pBtmLine, * pLine, radius;
  1438.     UINT32 iDispLoc;
  1439.     int i, j;
  1440.     int Region;
  1441.     int iRegionWidth = region[regNum].osd_w;
  1442.     BYTE cground, cfount, cedge, curColour, cfount1;
  1443.     cground = cfount = cedge = curColour = cfount1 =0;
  1444.     Region = regNum;
  1445.     if (p_scan ==1)
  1446.     {
  1447.         yStart<<=1;
  1448.         yLen<<=1;
  1449.     }
  1450.     
  1451.     pTopLine = (BYTE *)
  1452.         (((BYTE *) get_osdbuf_baseptr()) +
  1453.         (region[regNum].osd_header[0] + OSD_DATA_OFFSET(region[regNum].osd_format)) * 32);
  1454.     pBtmLine = (BYTE *)
  1455.         (((BYTE *) get_osdbuf_baseptr()) +
  1456.         (region[regNum].osd_header[1] + OSD_DATA_OFFSET(region[regNum].osd_format)) * 32);
  1457.     radius = sizeof(arc_tableLT[0]);
  1458.     //    printf("RADIUS ==%dn",radius);
  1459.     iDispLoc = ((yStart - ((yStart) & 0x01)) * iRegionWidth / 2) +
  1460.         (xStart / 2);
  1461.     if (Enable)
  1462.     {
  1463.         cground = ARC_REGION_COLOUR_GROUND;
  1464.         cfount = ARC_REGION_COLOUR_FOUNT;
  1465.         cfount1 = 0x2;
  1466.         cedge = ARC_REGION_COLOUR_EDGE;
  1467.     }
  1468.     for (j = 0; j < yLen; j++)
  1469.     {
  1470.         if ((j + yStart) & 0x01)
  1471.             pLine = pBtmLine;
  1472.         else
  1473.             pLine = pTopLine;
  1474.         if (Enable)
  1475.         {
  1476.             for (i = 0; i < xLen; i++) //print one point per time
  1477.             {
  1478.                 if ((i < radius) && (j < radius))//draw left-top corner
  1479.                 {
  1480.                     if ((arc_tableLT[j][i] == 0))
  1481.                         curColour = cground;
  1482.                     else if ((arc_tableLT[j][i] == 1))
  1483.                         curColour = cedge;
  1484.                     else if ((arc_tableLT[j][i] == 2))
  1485.                         curColour = cfount;
  1486.                     else if ((arc_tableLT[j][i] == 3))
  1487.                         curColour = cfount1;
  1488.                 }
  1489.                 else if ((i >= xLen - radius) && (j < radius))//draw right-top corner
  1490.                 {
  1491.                     if ((arc_tableRT[j][i - xLen + radius] == 0))
  1492.                         curColour = cground;
  1493.                     else if ((arc_tableRT[j][i - xLen + radius] == 1))
  1494.                         curColour = cedge;
  1495.                     else if ((arc_tableRT[j][i - xLen + radius] == 2))
  1496.                         curColour = cfount;
  1497.                 }
  1498.                 else if ((i < radius) && (j >= yLen - radius))//draw left-bottom corner
  1499.                 {
  1500.                     if ((arc_tableLB[j - yLen + radius][i] == 0))
  1501.                         curColour = cground;
  1502.                     else if ((arc_tableLB[j - yLen + radius][i] == 1))
  1503.                         curColour = cedge;
  1504.                     else if ((arc_tableLB[j - yLen + radius][i] == 2))
  1505.                         curColour = cfount;
  1506.                 }
  1507.                 else if ((j >= yLen - radius) && (i >= xLen - radius))//draw right-bottom corner
  1508.                 {
  1509.                     if (arc_tableRB[j - yLen + radius][i - xLen + radius] == 0)
  1510.                         curColour = cground;
  1511.                     else if (arc_tableRB[j - yLen + radius][i - xLen + radius] ==
  1512.                         1)
  1513.                         curColour = cedge;
  1514.                     else if (arc_tableRB[j - yLen + radius][i - xLen + radius] ==
  1515.                         2)
  1516.                         curColour = cfount;
  1517.                 }
  1518.                 else
  1519.                     curColour = cfount;//cfount;
  1520.                 if (i & 0x01)
  1521.                 {
  1522.                     pLine[iDispLoc + (i >> 1)] |= curColour & 0x0f;
  1523.                 }
  1524.                 else
  1525.                 {
  1526.                     pLine[iDispLoc + (i >> 1)] |= (curColour << 4) & 0xf0;
  1527.                 }
  1528.             }
  1529.         }
  1530.         else
  1531.         {
  1532.             for (i = 0; i < xLen; i++) //print one point per time
  1533.             {
  1534.                 pLine[iDispLoc + (i >> 1)] = 0;
  1535.             }
  1536.         }
  1537.         if ((j + yStart) & 0x01)
  1538.             iDispLoc += iRegionWidth;
  1539.     }
  1540.     //    timeout_osd[Region] = 0;
  1541.     osd_tog_region(Region, OSD_ON);
  1542. }
  1543. void Midi_Draw_Rect(int xx, int yy, UINT16 xLen, UINT16 yLen, BYTE BgColor,
  1544.     BYTE FrontC, BYTE FigC, BYTE regNum)
  1545. {
  1546.     int i, j, k;
  1547.     BYTE* pTopLine, * pBtmLine, * pLine;
  1548.     UINT32 iDispLoc, uiDispHalfByte;
  1549.     int iRegionWidth = region[regNum].osd_w;
  1550.     UINT16 high = yLen;
  1551.     UINT16 width = xLen;
  1552.     if (p_scan ==1)
  1553.     {
  1554.         yy<<=1;
  1555.         yLen<<=1;
  1556.     }
  1557.     pTopLine = (BYTE *)
  1558.         ((BYTE *) get_osdbuf_baseptr() +
  1559.         region[regNum].osd_header[0] * 32 +
  1560.         OSD_DATA_OFFSET(region[regNum].osd_format) * 32);
  1561.     pBtmLine = (BYTE *)
  1562.         ((BYTE *) get_osdbuf_baseptr() +
  1563.         region[regNum].osd_header[1] * 32 +
  1564.         OSD_DATA_OFFSET(region[regNum].osd_format) * 32);
  1565.     uiDispHalfByte = (((yy - ((yy) & 0x01)) * iRegionWidth) + (xx));
  1566.     iDispLoc = (uiDispHalfByte) >> 1;
  1567.     for (i = 0; i < high; i++)
  1568.     {
  1569.         if (((i + yy) & 0x01)||(p_scan ==1))
  1570.             pLine = pBtmLine;
  1571.         else
  1572.             pLine = pTopLine;
  1573.         uiDispHalfByte = (xx) & 0x01;
  1574.         for (j = 0; j < width; j++)
  1575.         {
  1576.             k = (((xx) & 0x01) + j) >> 1;
  1577.             uiDispHalfByte ^= 1;
  1578.             if (uiDispHalfByte == 1)
  1579.             {
  1580.                 if ((pLine[k + iDispLoc] & 0x0f) == MENU_BACKGROUND_COLOR)
  1581.                     pLine[k + iDispLoc] = (pLine[k + iDispLoc] & 0xf0) |
  1582.                         BgColor;
  1583.                 else if ((pLine[k + iDispLoc] & 0x0f) == MENU_LINE_COLOR)
  1584.                     pLine[k + iDispLoc] = (pLine[k + iDispLoc] & 0xf0) |
  1585.                         BgColor;
  1586.             }
  1587.             else
  1588.             {
  1589.                 if ((pLine[k + iDispLoc] & 0xf0) == (MENU_BACKGROUND_COLOR << 4))
  1590.                     pLine[k + iDispLoc] = (pLine[k + iDispLoc] & 0x0f) |
  1591.                         (BgColor << 4);
  1592.                 else if ((pLine[k + iDispLoc] & 0xf0) == (MENU_LINE_COLOR << 4))
  1593.                     pLine[k + iDispLoc] = (pLine[k + iDispLoc] & 0x0f) |
  1594.                         (BgColor << 4);
  1595.             }
  1596.         }
  1597.         if (((i + yy) & 0x01)||(p_scan ==1))
  1598.             iDispLoc += iRegionWidth;
  1599.     }
  1600.     osd_tog_region(regNum, OSD_ON);
  1601. }
  1602. #endif  //end #ifdef MIDI_MULTI_MENU
  1603. #endif  //end #ifdef SUPPORT_OSDLYRIC
  1604. //xlluo 04-6-14
  1605. #ifdef   SUPPORT_SCANMODE_SWITCH
  1606. void MIDI_MoveRegion(BYTE r,UINT16 x,UINT16 y,UINT16 h,UINT16 w)
  1607. {
  1608.     UINT16* pOSDHeader1 = (UINT16*)(get_osdbuf_baseptr() + region[r].osd_header[0] * 32);
  1609.     UINT16* pOSDHeader2 = (UINT16*)(get_osdbuf_baseptr() + region[r].osd_header[1] * 32);   
  1610.     UINT16 nCol, nRow;
  1611.     UINT16 nHig,nWid;
  1612.  if (p_scan)//ouyang 20040930
  1613.     {
  1614.        y<<=1;
  1615.        h<<=2;
  1616.     }
  1617.     
  1618.     nRow = y & 0x3ff; 
  1619.     nCol = x & 0x3ff;
  1620.     nHig = h&0x3ff;
  1621.     nWid =w&0x3ff;
  1622.     wbe16(pOSDHeader1 + 4, nRow);
  1623.     wbe16(pOSDHeader2 + 4, nRow);
  1624.     wbe16(pOSDHeader1 + 5, nCol);
  1625.     wbe16(pOSDHeader2 + 5, nCol);
  1626.     
  1627.   /*  wbe16(pOSDHeader1 + 2, nHig);
  1628.     wbe16(pOSDHeader2 + 2, nHig);
  1629.     wbe16(pOSDHeader1 + 3, nWid);
  1630.     wbe16(pOSDHeader2 + 3, nWid);*/
  1631. }
  1632. //xlluo add for clean the sysmesssage
  1633. void CleanSysMessage(BYTE regnum)
  1634. {
  1635.     printf("CleanSysMessage n");
  1636.      osd_tog_region(regnum,OSD_OFF);
  1637.      memset(osdbuf,0,sizeof(osdbuf));
  1638.      memset(osd_buf,0,sizeof(osd_buf));
  1639.      memset(RegionValStr[regnum],0,14);
  1640. }
  1641. #endif