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

DVD

开发平台:

C/C++

  1. /**********************************************************
  2. **  Description: for virtual keyboard
  3. **  Creater:liweihua
  4. **  Date:03-8-15 21:09
  5. **  Modify Record
  6. ** 1. liweihua 2004-2-21 21:37 
  7. **    change the mode of call ircmd_xxx to the mode of call the function of call_ir_func(IRC_xxx)
  8. ***********************************************************/
  9. #include "user_init.h"
  10. #include "global.h"
  11. #include "memmap0.h"
  12. #include "ircmd.h"
  13. #include "types.h"
  14. #include "memcfg.h"
  15. #include "framebuf.h"
  16. #include "memmap.h"
  17. #include "osd.h"
  18. #include "keyboard_bmp.h"
  19. #include "ircode.h"
  20. #ifdef VIRTUAL_KEYBOARD
  21. extern void osd_init_keyboard(void);
  22. extern UINT8 *get_osdbuf_region_ptr(int _region, int _field);
  23. #define __palette4F(G,B,R,A) 
  24.         ( ((UINT32)((G)&0xff)<<24)|((UINT32)((B)&0xff)<<16)|((UINT32)((R)&0xff)<<8)|(A&0xff) ) 
  25. #ifdef CD_PLAYER
  26. #define KEY_R  4    //define the region of drawing keyboard
  27. #else
  28. #define KEY_R  3    
  29. #endif
  30. BYTE KeyID=0;//Define ID variable for the keys on virtual keyboard
  31. //Draw virtual keyboard on osd region r
  32. //The bmp image of virtual keyboard was made by image processing software.
  33. void osd_draw_virtual_keyboard(int xStart, int yStart,BYTE r)
  34. {
  35. //BYTE    *pIcon;
  36.     UINT32  *pTopLine, *pBtmLine;
  37.     UINT32  iDispLoc;
  38.     
  39.     int     i, j, k;
  40.     int     iFontWidth, iFontHigh;
  41.     int     iRegionWidth = region[r].osd_w;
  42.     //osd_tog_region(r, OSD_ON);
  43.     osd_tog_region(r, OSD_OFF); //20040225
  44. iRegionWidth = region[r].osd_w;
  45.     //initialize buffer start
  46.     pTopLine = (UINT32 *)get_osdbuf_region_ptr(r,0);   // region r top
  47.     pBtmLine = (UINT32 *)get_osdbuf_region_ptr(r,1);   // region r bot
  48.    
  49.     //skip n blank line on top(in pixel)
  50.     //for interlace mode, we will skip n/2 blank lines, for example 4/2=2
  51.     yStart+=2;
  52. UINT32 pixel4;
  53.     UINT32 pos;
  54.     //get Keyboard bmp information
  55.     iFontWidth  = bmp_key[0];
  56.     iFontHigh   = bmp_key[1];
  57.     //start to process
  58.     pos = 2;    
  59.         
  60.     for (j=0; j<iFontHigh; j++)
  61.     {
  62.         int yy;
  63.         UINT32 *pp;
  64.         yy = (p_scan) ? yStart : yStart>>1;
  65.         pp = (yStart&1) ? pBtmLine : pTopLine;
  66.         iDispLoc = (yy*iRegionWidth*2/8) + (xStart);
  67.         for (i=0; i<(iFontWidth/4); i++) // every 4-bytes a time, every 1-pixel a byte
  68.         {
  69.          pixel4=0;
  70.             // 0x12345678  ==>  0x78563412
  71.             for (k=0;k<4;k++)
  72.             {
  73.              unsigned curByte = bmp_key[pos++];
  74.             pixel4 = pixel4 | (curByte<<8*k);
  75.             }
  76.             pp[iDispLoc+i] =  pixel4;
  77.         }
  78.         yStart++;
  79.     }//for key heigh
  80.     osd_tog_region(r, OSD_ON);//20040225
  81.     timeout_osd[r] = 0;
  82. }
  83. //Set all keys of keyboard the default color
  84. //The keys of virtual keyboard are draw in different colors
  85. //The numbers,"201, 70, 200, 185, 187, 127", are the positions of keys in color palette. 
  86. void set_button_color(void)
  87. {
  88. // alan, 2003/8/27 10:43AM
  89. SetOsdCol(KEY_R,KEY_R,201, __palette4F(0,160,0,0xff));//set the play/pause key color
  90. SetOsdCol(KEY_R,KEY_R,70, __palette4F(0,160,0,0xff));//set the forward key color
  91. SetOsdCol(KEY_R,KEY_R,200, __palette4F(0,160,0,0xff));//set the next key color
  92. SetOsdCol(KEY_R,KEY_R,185, __palette4F(0,160,0,0xff));//set the stop key color
  93. SetOsdCol(KEY_R,KEY_R,187, __palette4F(0,160,0,0xff)); //set the prev key color
  94. SetOsdCol(KEY_R,KEY_R,127, __palette4F(0,160,0,0xff));//set the backward key color
  95. }
  96. //=====================================
  97. // set the selected key highlight color
  98. // SelectID=0: select play/pause key
  99. // SelectID=1: select forward key
  100. // SelectID=2: select next key
  101. // SelectID=3: select stop key
  102. // SelectID=4: select prev key
  103. // SelectID=5: select backward key 
  104. //=====================================
  105. void hl_keyboard_button(BYTE SelectID)
  106. {
  107. set_button_color();
  108. switch(SelectID)
  109. {
  110. case 0:
  111. SetOsdCol(KEY_R,KEY_R,201, __palette4F(0xff,0xff,0xff,0xff)); // alan, 2003/8/27 10:43AM
  112. break;
  113. case 1:
  114. SetOsdCol(KEY_R,KEY_R,70, __palette4F(0xff,0xff,0xff,0xff)); // alan, 2003/8/27 10:43AM
  115. break;
  116. case 2:
  117. SetOsdCol(KEY_R,KEY_R,200, __palette4F(0xff,0xff,0xff,0xff)); // alan, 2003/8/27 10:43AM
  118. break;
  119. case 3:
  120. SetOsdCol(KEY_R,KEY_R,185, __palette4F(0xff,0xff,0xff,0xff)); // alan, 2003/8/27 10:43AM
  121. break;
  122. case 4:
  123. SetOsdCol(KEY_R,KEY_R,187,__palette4F(0xff,0xff,0xff,0xff)); // alan, 2003/8/27 10:43AM
  124. break;
  125. case 5:
  126. SetOsdCol(KEY_R,KEY_R,127, __palette4F(0xff,0xff,0xff,0xff)); // alan, 2003/8/27 10:43AM
  127. break;
  128. }
  129. }
  130. //Show virtual keyboard on osd region KEY_R in default state
  131. void show_virtual_keyboard(void)
  132. {
  133. KeyID=0;
  134. osd_init_keyboard();
  135. osd_draw_virtual_keyboard(0,0,KEY_R);
  136. hl_keyboard_button(KeyID);
  137. }
  138. //Run the related function of selected key 
  139. void virtual_keyboard_select(void)
  140. {
  141.        if(is_menu()){
  142.         invalid_key();
  143. return;
  144.        }//wangap add 2004/3/3
  145. if(KeyID==0)
  146.     {
  147. /*
  148.      if ( (adv_search_time!=0) && (adv_search_time!=1) ) // alan, 2003/8/26 04:23PM
  149.      ircmd_play();
  150.      else
  151. if((play_state==VCD_STATE_PAUSE)||(play_state==VCD_STATE_STOP))
  152. {
  153. if (resumeMSF==0)
  154. ircmd_play();
  155. else
  156. ircmd_resume();
  157. } else {
  158. ircmd_pause();
  159. }
  160. */
  161. call_ir_func(IRC_PAUSEPLAY);//nono 20040217
  162.     }
  163.     else if(KeyID==1)
  164.     {
  165.      /*
  166.      if (play_state!=VCD_STATE_STOP)
  167.      ircmd_forward();
  168.      else
  169.      invalid_key();
  170.      */
  171.      call_ir_func(IRC_FORWARD);
  172.     }
  173.     else if(KeyID==2)
  174.     {
  175.      /*
  176.      if (play_state!=VCD_STATE_STOP)
  177.      ircmd_next();
  178.      else
  179.      invalid_key();
  180.      */
  181.      call_ir_func(IRC_NEXT);
  182.     }
  183.     else if(KeyID==3)
  184.     {
  185.      //ircmd_stop();
  186.      call_ir_func(IRC_STOP);
  187.     }
  188.     else if(KeyID==4)
  189.     {
  190.      /*
  191.      if (play_state!=VCD_STATE_STOP)
  192.      ircmd_prev();
  193.      else
  194.      invalid_key();
  195.      */
  196.      call_ir_func(IRC_PREV);
  197.     }
  198.     else if(KeyID==5)
  199.     {
  200.      /*
  201.      if (play_state!=VCD_STATE_STOP)
  202.      ircmd_backward();
  203.      else
  204.      invalid_key();
  205.      */
  206.      call_ir_func(IRC_BACKWARD);
  207.     }
  208. }
  209. //change selected color in
  210. void virtual_keyboard_left()
  211. {
  212. if(KeyID<=0)
  213. KeyID=5;
  214. else
  215. KeyID--;
  216. hl_keyboard_button(KeyID);
  217. }
  218. void virtual_keyboard_right()
  219. {
  220. if(KeyID>=5)
  221. KeyID=0;
  222. else
  223. KeyID++;
  224. //osd_init_key();
  225. hl_keyboard_button(KeyID);
  226. }
  227. #endif