MS_LIB.C
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:8k
源码类别:

DVD

开发平台:

Others

  1. /* **************************************************************************************
  2.  *  Copyright (c) 2002 ZORAN Corporation, All Rights Reserved
  3.  *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
  4.  *
  5.  *  File: $Workfile: MS_LIB.C $             
  6.  *
  7.  * Description:
  8.  * ============
  9.  * menu library handle
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 5 $
  14.  * Last Modified by $Author: Leonh $ at $Modtime: 12/23/03 12:54p $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I76/I76_Common/I76_Reference/UI/Menu_sys/MS_LIB.C $
  19.  * 
  20.  * 5     12/23/03 1:01p Leonh
  21.  * Angieh:Support for the hidden group search.
  22.  * 
  23.  * 4     11/25/03 9:27a Leonh
  24.  * Angieh:Move the compile(D_MS_EXTENSIONS).
  25.  * 
  26.  * 3     03-05-08 19:51 Rogerl
  27.  * Adjust layout according to video format
  28.  * 
  29.  * 2     03-01-09 4:43 Leslie
  30.  * Unicode support
  31.  * 
  32.  * 10    23/04/02 9:39 Nirm
  33.  * - Added dependency in "Config.h".
  34.  * 
  35.  * 9     11/03/02 14:09 Nirm
  36.  * Debug message in case of memory allocation failure.
  37.  * 
  38.  * 8     3/05/02 11:25 Rinata
  39.  * fix num_to_str to support high num of digits
  40.  * 
  41.  * 7     2/27/02 7:02a Tomasp
  42.  * Changed get_blk/rel_blk to malloc,free.
  43.  * 
  44.  * 5     13/01/02 16:35 Atai
  45.  * Remove old Defines
  46.  * 
  47.  * 4     9/01/02 18:23 Nirm
  48.  * Corrected Include-Paths.
  49.  * 
  50.  * 3     30/12/01 10:00 Atai
  51.  * Add explicit casting
  52.  * 
  53.  * 2     25/12/01 10:41 Atai
  54.  * Code cleaning
  55.  **************************************************************************************** */
  56. #include "Config.h" // Global Configuration - do not remove!
  57. #include "Includesysdefs.h"
  58. #include "Decoderosdrendr.h"
  59. #include "Decoderosdlayou.h"
  60. #include "Decoderdecoder.h"
  61. #include "UIMenu_Sysms_wdgt.h"
  62. #include "UIMenu_Sysms_lib.h"
  63. #include "UIMenu_Sysosd_drv.h"
  64. BOOL g_ms_bMustClose = FALSE;
  65. void (*g_ms_deferred_action)(void) = NULL;
  66. WORD g_ui_active_menu_id = RUN_TIME_MENU_ID;
  67. WORD g_ui_default_menu_id = RUN_TIME_MENU_ID;
  68. //#ifdef D_USE_RETURN_IN_MENUS
  69. WORD g_ui_next_menu_id = RUN_TIME_MENU_ID;
  70. //#endif // D_USE_RETURN_IN_MENUS
  71. #ifdef D_MS_EXTENSIONS
  72. WORD g_ui_stopPending_menu_id = 0;
  73. UINT g_ui_stopPending_cnt = 0;
  74. #endif // D_MS_EXTENSIONS
  75. BOOL g_ms_bMustUseBigMemMap = FALSE;
  76. CONST MS_COLOR dialog_color = DIALOG_COLOR;
  77. CONST MS_COLOR i_color = I_COLOR;
  78. CONST MS_COLOR screen_color = SCREEN_COLOR;
  79. CONST MS_COLOR group_color = GROUP_COLOR;
  80. CONST MS_POS MS_toggle_pos = { 0, 0, 0, 0 };
  81. #ifdef D_USE_RETURN_IN_MENUS
  82. P_MENU_INFO g_ms_pMenuInfo = NULL;
  83. // Push a menu onto the menu stack
  84. void push_menu( WORD wMenuID )
  85. {
  86. P_MENU_INFO pMenuInfo;
  87. pMenuInfo = (P_MENU_INFO)malloc(sizeof(MENU_INFO));
  88. #ifdef _DEBUG
  89. if (NULL == pMenuInfo) {
  90. tr_printf(("FATAL: push_menu() Failed: Low system resources.n"));
  91. return;
  92. }
  93. #endif //_DEBUG
  94. pMenuInfo->m_wMenuID = wMenuID;
  95. pMenuInfo->m_pMenuInfo = (void *) g_ms_pMenuInfo;
  96. g_ms_pMenuInfo = pMenuInfo;
  97. }
  98. // Pop a menu from the menu stack
  99. WORD pop_menu( void )
  100. {
  101.   P_MENU_INFO pMenuInfo = g_ms_pMenuInfo;
  102.   WORD wMenuID = g_ui_default_menu_id;
  103.   if ( pMenuInfo )
  104.   {
  105. wMenuID = pMenuInfo->m_wMenuID;
  106. g_ms_pMenuInfo = (P_MENU_INFO) pMenuInfo->m_pMenuInfo;
  107. free(pMenuInfo);
  108.   }
  109.   return wMenuID;
  110. }
  111. // Flush the menu stack
  112. void flush_menu( void )
  113. {
  114.   while ( g_ms_pMenuInfo )
  115.   {
  116. pop_menu();
  117.   }
  118.   g_ui_next_menu_id = g_ui_default_menu_id;
  119. }
  120. // Call this when handling MS_UOP_RETURN
  121. // The popped menu ID is put into g_ui_next_menu_id
  122. void MS_return_to_menu( void )
  123. {
  124.   g_ms_bMustClose = TRUE;
  125.   g_ui_next_menu_id = pop_menu();
  126. }
  127. // Go to another menu without affecting the menu stack
  128. void MS_goto_next_menu( WORD wMenuID )
  129. {
  130.   g_ms_bMustClose = TRUE;
  131.   g_ui_next_menu_id = wMenuID;
  132. }
  133. // Call this from actions which require going to a submenu
  134. // wMenuID is the destination menu ID
  135. void MS_goto_submenu( WORD wMenuID )
  136. {
  137.   push_menu(g_ui_active_menu_id);
  138.   MS_goto_next_menu( wMenuID );
  139. }
  140. // REMINDER Move menu ID's to menu_var.h?
  141. #endif // D_USE_RETURN_IN_MENUS
  142. BOOL isDigit( wchar_t ch )
  143. {
  144.   return ( (ch >= '0') && (ch <= '9') );
  145. }
  146. // Convert a number to a string
  147. //
  148. // For zero-padding, specify 10^iNumDigits + (actual num) as the num parameter
  149. //
  150. int num_to_str(UINT32 num, wchar_t *str, int iNumDigits)
  151. {
  152.   int i = 0;
  153.   UINT32 iMod = 1;
  154.   UINT32 iValue = num;
  155.   while ( iNumDigits-- > 1 )
  156.   {
  157. iMod *= 10;
  158.   }
  159.   
  160.   iValue = num % (iMod * 10);
  161.   i = 0;
  162.   while ( iMod > 1 )
  163.   {
  164. if ( num > (iMod - 1) )
  165. {
  166.   str[i++] = num_to_ch(iValue / iMod);
  167. }
  168. iValue %= iMod;
  169. iMod /= 10;
  170.   }
  171.   str[i++] = num_to_ch(iValue);
  172.   str[i] = '';
  173.   return i;
  174. }
  175. //tecobest gxd 20050817
  176. #if defined(D_MS_EXTENSIONS) || defined(D_TEST)||defined(D_IRCODE_TEST)||defined(D_FP_DISPLAY_TEST)||defined(D_FP_KEYCODE_TEST)
  177. unsigned char pucHexDigit[] = {'A', 'B', 'C', 'D', 'E', 'F'};
  178. // Convert a number to a hex string
  179. //
  180. // -- Take care that str storage is at least iNumDigits + 1 bytes
  181. //
  182. void num_to_hex_str(int num, wchar_t *str, int iNumDigits)
  183. {
  184. int i = 0;
  185. int iValue = num;
  186. unsigned char ucHexDigit;
  187. str[iNumDigits] = '';
  188. while (iNumDigits)
  189. {
  190. ucHexDigit = num & 0x0f;
  191. num >>= 4;
  192. str[--iNumDigits] = ( (ucHexDigit >= 0x0A) ? pucHexDigit[ucHexDigit - 0x0A] : num_to_ch(ucHexDigit) );
  193. }
  194. }
  195. void hex_to_num(wchar_t *text, long *pdw)
  196. {
  197.   long dw = 0;
  198.   int iLength = wcslen(text);
  199.   wchar_t c;
  200.   while ( iLength && !isHexDigit(*text) )
  201.   {
  202. iLength--;
  203. text++;
  204.   }
  205.   
  206.   if ( iLength )
  207.   {
  208. while ( isHexDigit(c = *text++) )
  209. {
  210. c = hex_char_to_num(c);
  211. dw = dw * 0x10 + c;
  212. }
  213.   } // iLength
  214.   *pdw = dw;
  215. }
  216. #endif // D_MS_EXTENSIONS
  217. wchar_t strict_hex_char_to_num( wchar_t ch )
  218. {
  219.   wchar_t cDecrement = 0;
  220.   
  221.   if ( (ch >= 'a') && (ch <= 'f') )
  222. cDecrement = 'a';
  223.   else
  224.   if ( (ch >= 'A') && (ch <= 'F') )
  225. cDecrement = 'A';
  226.   if ( cDecrement )
  227. ch -= (cDecrement - 0x0A);
  228.   else
  229. ch = 0;
  230.   
  231.   return ch;
  232. }
  233. BOOL isStrictHexDigit( wchar_t ch )
  234. {
  235.   return ( ((ch >= 'A') && (ch <= 'F')) || ((ch >= 'a') && (ch <= 'f')) );
  236. }
  237. BOOL isHexDigit( wchar_t ch )
  238. {
  239.   return ( isDigit(ch) || isStrictHexDigit(ch) );
  240. }
  241. wchar_t hex_char_to_num( wchar_t ch )
  242. {
  243.   if ( isDigit(ch) )
  244. ch = char_to_num(ch);
  245.   else
  246. ch = strict_hex_char_to_num(ch);
  247.   return ch;
  248. }
  249. // Override standard user_op
  250. void *MS_override_user_op( MS_WIDGET *pmsw, void *pvNew_user_op )
  251. {
  252.   void *pvOriginal_user_op = pmsw->user_op;
  253.   pmsw->user_op = pvNew_user_op;
  254.   return pvOriginal_user_op;
  255. }
  256. void MS_adjust_layout(void)
  257. {
  258. #ifdef D_LINE_DOUBLING
  259.   WORD wHeightLimit = NBRLIN_NTSC;
  260.   if ( (go_CurrentLayout.m_wHeight + (go_CurrentLayout.m_wOriginY * 2) ) > wHeightLimit )
  261. go_CurrentLayout.m_wHeight = wHeightLimit - (go_CurrentLayout.m_wOriginY * 2);
  262.   go_CurrentLayout.m_wOriginY >>= 1;
  263.   go_CurrentLayout.m_wHeight >>= 1;
  264.   go_CurrentLayout.m_cPixRes = MS_PIX_RES;
  265.   if ( go_CurrentLayout.m_cNbrHole )
  266.   {
  267. char cIndex;
  268. for ( cIndex = 0; cIndex < go_CurrentLayout.m_cNbrHole; cIndex++ )
  269. {
  270.   go_CurrentLayout.m_oHolePos[cIndex].m_wLineNbr >>= 1;
  271.   go_CurrentLayout.m_oHolePos[cIndex].m_wHeight >>= 1;
  272. }
  273.   }
  274. #else // D_LINE_DOUBLING
  275.   WORD wHeightLimit = DEC_IsVideoPal() ? NBRLIN_PAL : NBRLIN_NTSC;
  276.   if ( (go_CurrentLayout.m_wHeight + (go_CurrentLayout.m_wOriginY * 2) ) > wHeightLimit )
  277. go_CurrentLayout.m_wHeight = wHeightLimit - (go_CurrentLayout.m_wOriginY * 2);
  278. #endif // D_LINE_DOUBLING
  279. }
  280. #ifdef D_DISPLAY_1_MENU
  281. void seconds_to_time_input_str( DWORD dwSs, char *sz )
  282. {
  283.   // Get either bookmark time or invalid string into szTime
  284. DWORD dwHh;
  285. DWORD dwMm;
  286. DWORD dwTime;
  287. unsigned char ucIndex;
  288. dwHh = dwSs / SECONDS_PER_HOUR;
  289. dwSs = dwSs - dwHh * SECONDS_PER_HOUR;
  290. dwMm = dwSs / SECONDS_PER_MINUTE;
  291. dwSs = dwSs - dwMm * SECONDS_PER_MINUTE;
  292. dwTime = dwHh * 10000 + dwMm * 100 + dwSs;
  293. #ifdef D_ONE_HOUR_DIGIT
  294. num_to_str(1000000 + dwTime, sz, 5);
  295. #else
  296. num_to_str(1000000 + dwTime, sz, 6);
  297. #endif
  298. }
  299. #endif // D_DISPLAY_1_MENU
  300. void MS_display_in_container( MS_WIDGET *pmsw )
  301. {
  302.   OSD_SetOrigin( (MS_WIDGET*)pmsw->parent );
  303.   pmsw->user_op( pmsw, MS_UOP_DISPLAY, ( pmsw->parent->pwli_focus->widget == pmsw ? C_FOCUSED : !C_FOCUSED ) );
  304. }
  305. void MS_set_deferred_action( void (*pfnDeferred)(void) )
  306. {
  307.   g_ms_deferred_action = pfnDeferred;
  308. }