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

DVD

开发平台:

C/C++

  1. /*
  2.  * FileName:       osd_SFM.c
  3.  * Author:         ChenZhao  Version:    Date: 2004-9-20
  4.  * Description:    osd fucntions added and modified for SOFT_MENU
  5.  * Version:        
  6.  * Function List:  
  7.  *                 osd_changeAlpha
  8.  *                 osd_interlace
  9.  *                 osd_DrawSlantCorner
  10.  *                 osd_DrawIcon_Trans
  11.  *                 osd_draw_roundcorner
  12.  *                 osd_StringDrawLength
  13.  *                 osd_DrawString_ori
  14.  * History:        
  15.  *     <author>   <time>    <version >   <desc>
  16.  */
  17. void osd_changeAlpha(UINT32 a)
  18. {
  19. UINT16 i;
  20. for(i=0;i<16;i++)
  21. SetOsdCol(SETUP_REGION,SETUP_REGION,i,palette_16color_setup[i]|a);
  22. }
  23. #ifdef TEST_INTERLACE//Modifed by ChenZhao on 2004-9-20 11:39  
  24. void osd_interlace(int x,int y,BYTE direct,BYTE fontColor,BYTE bkColor)
  25. {
  26.     UINT8 *pTopLine, *pBtmLine;
  27.     int     iRegionWidth= region[SETUP_REGION].osd_w;
  28. int     j,k;
  29. BYTE *pp;
  30. BYTE ct0,ct1,c;
  31. if(direct)
  32. {
  33. ct0=(fontColor<<4)|(fontColor&0x0f);
  34. ct1=(bkColor<<4)|(bkColor&0x0f);
  35. }
  36. else
  37. {
  38. ct0=(fontColor<<4)|(bkColor&0x0f);
  39. ct1=(fontColor<<4)|(bkColor&0x0f);
  40. }
  41.     pTopLine = get_osdbuf_region_ptr(SETUP_REGION,0);   // region 0 top
  42.     pBtmLine = get_osdbuf_region_ptr(SETUP_REGION,1);   // region 0 bot
  43.     for(j=0;j<16;j++)
  44.      {
  45. pp = (y&1) ? pBtmLine : pTopLine;
  46. pp+=x+iRegionWidth*((p_scan) ? y : y>>1);
  47. c=(j&0x01)?ct1:ct0;
  48.      for(k=0;k<8;k++)
  49.      {
  50.      *pp=c;
  51.      pp++;
  52.      }
  53. y++;
  54.      }
  55. }
  56. #endif//TEST_INTERLACE
  57. void osd_DrawSlantCorner(INT32 xStart,INT32 yStart,INT32 xEnd,INT32 yEnd,BYTE direct,BYTE lineOnly,BYTE fontColor)
  58. { //direct 0:fill left 1:fill right
  59. INT32 xs,xe,y,b;
  60. int i;
  61.     int     iRegionWidth = region[SETUP_REGION].osd_w;
  62. UINT8 *pp;
  63.     UINT8   *pTopLine, *pBtmLine;
  64.     pTopLine = get_osdbuf_region_ptr(SETUP_REGION,0);   // region 0 top
  65.     pBtmLine = get_osdbuf_region_ptr(SETUP_REGION,1);   // region 0 bot
  66. fontColor=(fontColor<<4)|(fontColor&0x0f);
  67. if(yEnd==yStart || xEnd==xStart)
  68. {
  69. osd_DrawLine(xStart/2,yStart,xEnd/2,yEnd,fontColor,1);
  70. return;
  71. }
  72. if((xEnd-xStart)*(yEnd-yStart)>0)
  73. b=1;
  74. else
  75. b=-1;
  76. xStart*=0x20000;
  77. xEnd*=0x20000;
  78. if(xStart>xEnd)
  79. {
  80. INT32 t;
  81. t=xEnd;
  82. xEnd=xStart;
  83. xStart=t;
  84. }
  85. if(yStart>yEnd)
  86. {
  87. INT32 t;
  88. t=yEnd;
  89. yEnd=yStart;
  90. yStart=t;
  91. }
  92. b*=(xEnd-xStart)/(yEnd-yStart);
  93. for(y=yStart;y<=yEnd;y++)
  94. {
  95. if(b>=0)
  96. {
  97. xs=xStart+(y-yStart)*b;
  98. xe=xs+b-0x10000;
  99. if(xe<xs)xe=xs;
  100. }
  101. else
  102. {
  103. xe=xEnd+(y-yStart)*b;
  104. xs=xe+b+0x10000;
  105. if(xs>xe)xs=xe;
  106. }
  107. if(!lineOnly)
  108. {if(direct)
  109. xe=xEnd;
  110. else
  111. xs=xStart;
  112. }
  113. if(xe>xEnd)xe=xEnd;
  114. if(xs<xStart)xs=xStart;
  115. xs=(xs<0)?0:xs;
  116. xe=(xe<0)?0:xe;
  117. xe=xe>>16;
  118. xs=xs>>16;
  119. pp = (y&1) ? pBtmLine : pTopLine;
  120. pp+=xs/2+iRegionWidth*((p_scan) ? y : y>>1);
  121. if(xs&1)
  122. {
  123. *pp=(fontColor & 0x0f)|((*pp) & 0xf0);
  124. pp++;
  125. }
  126. else
  127. {
  128. *pp=(fontColor & 0xf0)|((*pp) & 0x0f);
  129. xs--;
  130. }
  131. for(i=(xe-xs)/2;i>0;i--)
  132. pp[i-1]=fontColor;
  133. pp = (y&1) ? pBtmLine : pTopLine;
  134. pp+=xe/2+iRegionWidth*((p_scan) ? y : y>>1);
  135. if(0==(xe&1))
  136. *pp=(fontColor & 0xf0)|((*pp) & 0x0f);
  137. else// if(xs+1==xe) 
  138. *pp=(fontColor & 0x0f)|((*pp) & 0xf0);
  139. }
  140. }
  141. void osd_DrawIcon_Trans(int xStart, int yStart, unsigned index,BYTE mask,BYTE fontColor)
  142. {
  143.     BYTE    *pIcon;//,div=4;//wanghaoying 2003-8-12 19:42 marked for "div" not used here
  144.     UINT8   *pTopLine, *pBtmLine;
  145.     UINT32   iDispLoc;
  146.     int     i, j;
  147.     int     iFontWidth, iFontHigh,iFontByteWidth;
  148.     int     iRegionWidth = region[SETUP_REGION].osd_w;
  149.     osd_tog_region(0, OSD_ON);  
  150.     
  151.     //initialize buffer start
  152.     pTopLine = get_osdbuf_region_ptr(SETUP_REGION,0);   // region 0 top
  153.     pBtmLine = get_osdbuf_region_ptr(SETUP_REGION,1);   // region 0 bot
  154.     fontColor=(fontColor<<4)|(fontColor&0x0f);
  155.     //skip n blank line on top(in pixel)
  156.     //for interlace mode, we will skip n/2 blank lines, for example 4/2=2
  157.     yStart+=2;
  158.      
  159.     {
  160.         UINT8 pixel2;
  161.         UINT32 pos;
  162. UINT8 *pp;
  163. unsigned curByte;
  164.         
  165.         pIcon = get_font_entry(2, index);
  166.         //start to process
  167.         pos = 3 ;
  168.         
  169.         //get icon information
  170.         iFontWidth  = (int)pIcon[0];
  171.         iFontHigh   = (int)pIcon[1];
  172.         iFontByteWidth  = ((iFontWidth+7)/8)*4;//the icon data unit is 32bit,so iFontByteWidth must be a multiple of 4.
  173.         
  174.         for (j=0; j<iFontHigh; j++) 
  175.         {
  176. pp = (yStart&1) ? pBtmLine : pTopLine;
  177.             iDispLoc = (xStart) + iRegionWidth*((p_scan) ? yStart : yStart>>1);
  178.             for (i=0; i<(iFontWidth/2); i++) //every 2-pixels a byte
  179.              {
  180.                 pixel2 =  pp[iDispLoc+i];
  181.                 curByte = pIcon[pos+i];
  182.             pixel2=((curByte&0x0f)==0x06)?pixel2:(((mask?fontColor:curByte)&0x0f)|(pixel2&0xf0));
  183.                 pixel2=((curByte&0xf0)==0x60)?pixel2:(((mask?fontColor:curByte)&0xf0)|(pixel2&0x0f));
  184.                 pp[iDispLoc+i] =  pixel2;
  185.              }
  186. if(iFontWidth % 2)
  187. {
  188. pixel2 =  pp[iDispLoc+i];
  189.                 curByte = pIcon[pos+i];
  190.                 pixel2=((curByte&0xf0)==0x60)?pixel2:(((mask?fontColor:curByte)&0xf0)|(pixel2&0x0f));
  191.                 pp[iDispLoc+i] =  pixel2;
  192. }
  193. pos+=iFontByteWidth;
  194.             yStart++;
  195.         }//for icon heigh  
  196.     }
  197.     timeout_osd[0] = 0;
  198. }
  199. void osd_draw_roundcorner(int x,int y,BYTE direct,unsigned fontColor,unsigned bkColor)
  200. {
  201. const BYTE corner[8][8]=
  202. {
  203. {0x01,0x07,0x1F,0x3F,0x3F,0x7F,0x7F,0xFF,},//left_up
  204. {0x80,0xE0,0xF8,0xFC,0xFC,0xFE,0xFE,0xFF,},//right_up
  205. {0xFF,0xFE,0xFE,0xFC,0xFC,0xF8,0xE0,0x80,},//right_down
  206. {0xFF,0x7F,0x7F,0x3F,0x3F,0x1F,0x07,0x01,},//letf_down
  207. {0x01,0x07,0x1E,0x38,0x30,0x60,0x60,0xC0,},//left_up
  208. {0x80,0xE0,0x78,0x1C,0x0C,0x06,0x06,0x03,},//right_up
  209. {0x03,0x06,0x06,0x0C,0x1C,0x78,0xE0,0x80,},//right_down
  210. {0xC0,0x60,0x60,0x30,0x38,0x1E,0x07,0x01,},//{0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,},//letf_down
  211. };
  212.     UINT8 *pTopLine, *pBtmLine;
  213. BYTE curByte;
  214. BYTE pixel2;
  215.     int     iRegionWidth,j,k;
  216. UINT8 *pp;
  217. BYTE transcolor,transsw,invert;
  218.     iRegionWidth = region[SETUP_REGION].osd_w;
  219. transsw =(direct&0x08)?0xff:0x00;
  220. invert =(direct&0x10)?0xff:0x00;
  221. direct&=0x07;
  222. transcolor=(~transsw)&((bkColor<<4)|(bkColor&0x0f));
  223.     // initialize buffer start
  224.     pTopLine = get_osdbuf_region_ptr(SETUP_REGION, 0);
  225.     pBtmLine = get_osdbuf_region_ptr(SETUP_REGION, 1);
  226. for(j=0;j<8;j++)
  227. {
  228. pp = (y&1) ? pBtmLine : pTopLine;
  229. pp+=3+x+iRegionWidth*((p_scan) ? y : y>>1);
  230. curByte = invert^corner[direct][j];
  231. for (k=0; k<4; k++) 
  232. { // for every-bit of pattern
  233. bkColor=(transsw & (*pp))|transcolor;
  234. pixel2=((1<<(2*k)) & curByte)?fontColor:(bkColor&0x0f);
  235. pixel2|=((1<<(2*k+1)) & curByte)?(fontColor<<4):(bkColor&0xf0);
  236. *pp=pixel2;
  237. pp--;
  238. }
  239. y++;
  240. }
  241. }
  242. UINT32 osd_StringDrawLength(const BYTE *str)
  243. {
  244. UINT32 len;
  245.     BYTE    *pFont;
  246. len=0;
  247.     while (*str != '')
  248.      {
  249.         if (*str == 'r') {                    //prefix characher: to use font_table2
  250.             if (*(str++)=='' ) break;
  251.             if ((pFont = get_font_entry(1,*str))==NULL) continue;
  252.          } 
  253. else {
  254.             //get current char entry
  255.             pFont = get_font_entry(0,*str);
  256.          }
  257.         len+= (int)pFont[0];
  258. str++;
  259.      }
  260. len/=2;
  261. return len;
  262. }
  263. void osd_DrawString_ori(UINT32 xStart, UINT32 yStart, const BYTE *str, BYTE fontColor, BYTE bkColor)
  264. {
  265.     BYTE    c;
  266.     BYTE    *pFont;
  267.     UINT8  *pTopLine, *pBtmLine;
  268.     UINT32     cc;
  269.     UINT32  iStrLoc;
  270.     int     iRegionWidth;
  271.     iRegionWidth = region[SETUP_REGION].osd_w;
  272.     // initialize buffer start
  273.     pTopLine = get_osdbuf_region_ptr(SETUP_REGION, 0);
  274.     pBtmLine = get_osdbuf_region_ptr(SETUP_REGION, 1);
  275.     
  276.     // initialize start position
  277. #ifdef SOFT_MENU//Modifed by ChenZhao on 2004-9-8 17:38 WP
  278. cc = xStart; //pixels
  279. #else
  280. cc = xStart*8; //pixels
  281. #endif
  282.     //process each charactor until string ending('')
  283.     iStrLoc = 0;
  284.     while ((c = ((BYTE *)str)[iStrLoc]) != '')
  285.     {
  286.         int     i, j, k;
  287.         int     iFontWidth, iFontHigh;
  288.         UINT32  pos;
  289.         
  290.         iStrLoc++;
  291.         
  292.         if (c == 'r') {                    //prefix characher: to use font_table2
  293.             if ( (c = ((BYTE *)str)[iStrLoc])=='' ) break;
  294.             iStrLoc++;
  295.             if ((pFont = get_font_entry(1,c))==NULL) continue;
  296.         } else {
  297.             //get current char entry
  298.             pFont = get_font_entry(0,c);
  299.         }
  300.         
  301.         //start to process
  302.         pos = 2;
  303.         
  304.         //get font information
  305.         iFontWidth = (int)pFont[0];
  306.         iFontHigh  = (int)pFont[1];
  307.         
  308.         //start this character
  309.         for (j=0; j<iFontHigh; j++) {
  310.             UINT8 *pp;
  311.             int     yy;
  312.             int     iDispLoc;
  313.             //yy  = 4 + yStart*SETUP_BTN_HEIGHT + j;
  314.             yy  = 4 + yStart + j;
  315.             //For every string line = 1 blank line(in pixel) + OSD_FONT_HEIGHT-line strings + 1 blank line
  316.             pp  = (yy&1) ? pBtmLine : pTopLine;
  317.             if (p_scan==0) yy>>=1;      // p-scan
  318.             //yy*iRegionWidth + cc calculate the positon as the byte.
  319.             iDispLoc = yy*(iRegionWidth) + cc;
  320.             
  321.             //draw top line
  322.             for (i=0; i<iFontWidth/8; i++) {
  323.                 unsigned curByte;
  324.                 UINT8 pixel2;
  325.                 
  326.                 curByte =pFont[++pos];
  327.                 pixel2 = 0;
  328.                 for (k=0; k<4; k++) {       // for every-bit of pattern
  329. pixel2=((1<<(2*k)) & curByte)?fontColor:bkColor;
  330. pixel2|=(((1<<(2*k+1)) & curByte)?fontColor:bkColor)<<4;
  331. pp[iDispLoc+i*4+3-k] = pixel2;
  332.                 }
  333.             }
  334.         }
  335.         cc+=iFontWidth/2; 
  336.     }
  337.     timeout_osd[SETUP_REGION] = 0;
  338.     osd_tog_region(SETUP_REGION, OSD_ON);  
  339. }