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

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_slid.c $             
  6.  *
  7.  * Description:
  8.  * ============
  9.  * menu system slider handling
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 4 $
  14.  * Last Modified by $Author: Leonm $ at $Modtime: 03-07-14 14:53 $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /SourceCode/I64_Common/I64_Reference/UI/Menu_sys/ms_slid.c $
  19.  * 
  20.  * 4     03-07-14 14:54 Leonm
  21.  * 
  22.  * 3     3/27/03 4:01p Clifflv
  23.  * Enable slide to move more steps once by param
  24.  * 
  25.  * 2     03-01-09 4:43 Leslie
  26.  * Unicode support
  27.  * 
  28.  * 11    23/04/02 9:39 Nirm
  29.  * - Added dependency in "Config.h".
  30.  * 
  31.  * 10    11/03/02 13:01 Nirm
  32.  * Debug message in case of memory allocation failure.
  33.  * 
  34.  * 9     2/27/02 7:02a Tomasp
  35.  * Changed get_blk/rel_blk to malloc,free.
  36.  * 
  37.  * 8     2/07/02 11:55 Rinata
  38.  * fix slide when changed
  39.  * 
  40.  * 7     2/06/02 17:37 Rinata
  41.  * fix kar menu by change the display slid eto print teh value of current
  42.  * closer to teh slide then it was
  43.  * 
  44.  * 5     16/01/02 8:57 Nirm
  45.  * Fixed debug-messages.
  46.  * 
  47.  * 4     9/01/02 18:23 Nirm
  48.  * Corrected Include-Paths.
  49.  * 
  50.  * 3     30/12/01 10:04 Atai
  51.  * Add explicit casting
  52.  * 
  53.  * 2     25/12/01 10:54 Atai
  54.  * Code cleaning
  55.  **************************************************************************************** */
  56. #include "Config.h" // Global Configuration - do not remove!
  57. #ifdef _DEBUG
  58. #include "DebugDbgMain.h"
  59. #undef IFTRACE
  60. #define IFTRACE if (gTraceMenu)
  61. #endif //_DEBUG
  62. #include <stdio.h>
  63. #include <stdlib.h>
  64. #include "Includesysdefs.h"
  65. #include "UIMenu_Sysosd_drv.h"
  66. #include "UIMenu_Sysms_wdgt.h"
  67. #include "UIMenu_Sysms_lib.h"
  68. #if defined(USE_JOG) && defined(D_SHOW_VOLUME_MENU)
  69. #include "Decoderosdrendr.h"
  70. #endif
  71. #define SLIDER_BASE_LINE 4
  72. #if defined(USE_JOG) && defined(D_SHOW_VOLUME_MENU)
  73. #define SLIDER_ONTIC_HEIGHT 4
  74. #define VOL_MIDDLE_VALUE 10
  75. extern BOOL b_vol_move_right, b_vol_move_left;
  76. #else
  77. #define SLIDER_ONTIC_HEIGHT 7
  78. #define KEYSHIFT_MIDDLE_VALUE 7
  79. #endif
  80. static void display (MS_WIDGET *widget, char focus)
  81. {
  82. // REMINDER Y increases downward
  83. MS_SLIDER *slider = (MS_SLIDER *) widget;
  84. // Top of slider base
  85. WORD y = widget->pos.y + ((widget->pos.h - SLIDER_BASE_LINE) / 2);
  86. // Marker position
  87. WORD p = (WORD)(widget->pos.x + (((DWORD)(slider->cur_ratio * widget->pos.w /slider->max_value)) & 0xfff8));
  88. BOOL bIsAtMax = (slider->cur_ratio == slider->max_value);
  89. {
  90. #if defined(USE_JOG) && defined(D_SHOW_VOLUME_MENU)
  91. wchar_t str[5] ;
  92. if (MS_IS_SLIDER_POINT(widget))
  93. {
  94. if (slider->cur_ratio == VOL_MIDDLE_VALUE)
  95. {
  96. str[0]=' ';
  97. str[1]='0';
  98. str[2] = 0;
  99. }
  100. else if (slider->cur_ratio > VOL_MIDDLE_VALUE)
  101. {
  102. str[0]='+';
  103. if (slider->cur_ratio >= 20)
  104. {
  105. str[1] = '1';
  106. str[2] = '0';
  107. str[3] = 0;
  108. }
  109. else
  110. {
  111. str[1]=(slider->cur_ratio-VOL_MIDDLE_VALUE)%10+'0';
  112. str[2] = 0;
  113. }
  114. }
  115. else
  116. {
  117. str[0]= '-';
  118. if (0 == slider->cur_ratio)
  119. {
  120. str[1] = '1';
  121. str[2] = '0';
  122. str[3] = 0;
  123. }
  124. else
  125. {
  126. str[1]=(VOL_MIDDLE_VALUE-slider->cur_ratio)%10+'0';
  127. str[2] = 0;
  128. }
  129. }
  130. OSD_PutText(widget->pos.x+widget->pos.w+24,widget->pos.y - SLIDER_ONTIC_HEIGHT,72,MS_LINE_HEIGHT,FG_COLOR(widget->color),BG_COLOR(widget->color),str,1,1);
  131. }
  132. else
  133. {
  134. str[0]=(slider->cur_ratio)/10+'0';
  135. str[1]=(slider->cur_ratio)%10+'0';
  136. str[2]=0;
  137. OSD_PutText(widget->pos.x+widget->pos.w+8,widget->pos.y - SLIDER_ONTIC_HEIGHT,72,MS_LINE_HEIGHT,FG_COLOR(widget->color),BG_COLOR(widget->color),str,1,1);
  138. }
  139. #else
  140. wchar_t str[4] = {0,0,0,0} ;
  141. if (MS_IS_SLIDER_POINT(widget))
  142. {
  143. if (slider->cur_ratio == KEYSHIFT_MIDDLE_VALUE)
  144. {
  145. str[0]=' ';
  146. str[1]='0';
  147. str[2] = 0;
  148. }
  149. else if (slider->cur_ratio > KEYSHIFT_MIDDLE_VALUE)
  150. {
  151. str[0]='+';
  152. str[1]=(slider->cur_ratio - KEYSHIFT_MIDDLE_VALUE)%10+'0';
  153. str[2] = 0;
  154. }
  155. else
  156. {
  157. str[0]= '-';
  158. str[1]=(KEYSHIFT_MIDDLE_VALUE - slider->cur_ratio)%10+'0';
  159. str[2] = 0;
  160. }
  161. OSD_PutText(widget->pos.x+widget->pos.w+8,widget->pos.y - 4,72,MS_LINE_HEIGHT,FG_COLOR(widget->color),BG_COLOR(widget->color),str,1,1);
  162. }
  163. else
  164. {
  165. str[0]=(slider->cur_ratio)/10+'0';
  166. str[1]=(slider->cur_ratio)%10+'0';
  167. str[2]=0;
  168. OSD_PutText(widget->pos.x+widget->pos.w+24,widget->pos.y,72,MS_LINE_HEIGHT,FG_COLOR(widget->color),BG_COLOR(widget->color),str,1,1);
  169. }
  170. #endif
  171. }
  172. OSD_PutRect(widget->pos.x, widget->pos.y, widget->pos.w, widget->pos.h, BACK_COLOR(widget, focus));
  173. if (MS_IS_SLIDER_POINT(widget))
  174. {
  175. // This is the single position style
  176. if ( bIsAtMax )
  177. {
  178. p -= 8;
  179. }
  180. // Slider base
  181. OSD_PutRect(
  182. widget->pos.x, y,
  183. widget->pos.w, SLIDER_BASE_LINE,
  184. FG_COLOR(widget->color));
  185. // Marker
  186. OSD_PutRect(
  187. p, widget->pos.y+4,
  188. 8, widget->pos.h-8,
  189. FG_COLOR(widget->color));
  190. if ( slider->tick_ratio >= 0 )
  191. {
  192.   p = (WORD)(widget->pos.x +
  193.    (((DWORD)(slider->tick_ratio * widget->pos.w / slider->max_value)) & 0xfff8));
  194.   
  195.   // Ticks for zero position
  196.   // ( needs to be parametrized )
  197.   OSD_PutRect(
  198.   p, widget->pos.y,
  199.   8, 2,
  200.   FG_COLOR(widget->color));
  201.   OSD_PutRect(
  202.   p, widget->pos.y + widget->pos.h - 2,
  203.   8, 2,
  204.   FG_COLOR(widget->color));
  205. }
  206. }
  207. else
  208. {
  209. // This is the cumulative style
  210. if ( p == widget->pos.x )
  211. {
  212.   p += 4;
  213. }
  214. if ( bIsAtMax )
  215. {
  216.   p = widget->pos.x + widget->pos.w;
  217. }
  218.   // Accumulated (left) part
  219. OSD_PutRect(
  220. widget->pos.x, widget->pos.y + SLIDER_ONTIC_HEIGHT,
  221. p - widget->pos.x, widget->pos.h - 2*SLIDER_ONTIC_HEIGHT,
  222. FG_COLOR(widget->color));
  223. if ( !bIsAtMax )
  224. {
  225.   // Non-accumulated (right) part
  226.   OSD_PutRect(
  227.   p, y,
  228.   widget->pos.x + widget->pos.w - p, SLIDER_BASE_LINE,
  229.   FG_COLOR(widget->color));
  230. }
  231. }
  232. }
  233. static void on_slider_change(MS_SLIDER *slider,char dir, char param)
  234. {
  235. unsigned short new_ratio, step_back;
  236. unsigned short y = slider->widget.pos.y+SLIDER_ONTIC_HEIGHT;
  237. unsigned short p =  (unsigned short)(slider->widget.pos.x+
  238.                  (((DWORD)(slider->cur_ratio * slider->widget.pos.w / slider->max_value )) & 0xfff8));
  239. unsigned short a; // adjustment rect left coordinate
  240. unsigned short b; // adjustment rect right coordinate
  241. unsigned char color;
  242. step_back = slider->step;
  243. slider->step = param?param:1;
  244. if (slider->cur_ratio == slider->max_value) {
  245. p = slider->widget.pos.x + slider->widget.pos.w ;//- 8;
  246. }
  247. if (dir ){
  248. // right
  249. #if defined(USE_JOG) && defined(D_SHOW_VOLUME_MENU)
  250. if (!b_vol_move_right)
  251. return;
  252. #endif
  253. if ( slider->cur_ratio == slider->max_value )
  254.   return;
  255. new_ratio = slider->cur_ratio + slider->step;
  256. if (new_ratio > slider->max_value)
  257. {
  258. new_ratio = slider->max_value;
  259. }
  260. a = p;
  261. b = (unsigned short)(slider->widget.pos.x +
  262. (((DWORD)(new_ratio * slider->widget.pos.w / slider->max_value)) & 0xfff8));
  263. //b &= 0xfff8;
  264. color = FG_COLOR(slider->widget.color);
  265. }
  266. else {
  267. // left
  268. #if defined(USE_JOG) && defined(D_SHOW_VOLUME_MENU)
  269. if (!b_vol_move_left)
  270. return;
  271. #endif
  272. if ( slider->cur_ratio == 0 )
  273.   return;
  274. if (slider->cur_ratio > slider->step)
  275. {
  276. new_ratio = slider->cur_ratio - slider->step;
  277. }
  278. else
  279. {
  280. new_ratio = 0;
  281. }
  282. b = p;
  283. if ( new_ratio == 0 )
  284.   a = slider->widget.pos.x + 4;
  285. else
  286. {
  287.   a = (unsigned short)(slider->widget.pos.x +
  288.   (((DWORD)(new_ratio * slider->widget.pos.w / slider->max_value)) & 0xfff8));
  289.   //a &= 0xFFF8;
  290. }
  291. color = FOCUS_COLOR(slider->widget.color);
  292. }
  293. if (MS_IS_SLIDER_POINT(slider))
  294. {
  295. if (slider->cur_ratio == slider->max_value) {
  296. p -= 8;
  297. }
  298. // Remove the previous marker:
  299. // Top part
  300. OSD_PutRect(p, slider->widget.pos.y + 4,
  301. 8, (slider->widget.pos.h-SLIDER_BASE_LINE)/2 - 4,
  302. FOCUS_COLOR(slider->widget.color));
  303. // Bottom part
  304. OSD_PutRect(p, slider->widget.pos.y+slider->widget.pos.h-(slider->widget.pos.h-SLIDER_BASE_LINE)/2,
  305. 8, (slider->widget.pos.h-SLIDER_BASE_LINE)/2 - 4,
  306. FOCUS_COLOR(slider->widget.color));
  307. if (new_ratio == slider->max_value) {
  308. p = slider->widget.pos.w + slider->widget.pos.x - 8;
  309. }
  310. else {
  311. p =  (unsigned short)(slider->widget.pos.x+
  312.   (((DWORD)(new_ratio * slider->widget.pos.w / slider->max_value )) & 0xfff8));
  313. }
  314. // Put the new marker
  315. OSD_PutRect(
  316. p, slider->widget.pos.y+4,
  317. 8, slider->widget.pos.h-8,FG_COLOR(slider->widget.color));
  318. }
  319. else
  320. {
  321. if ( b > a )
  322. {
  323.   // type == MS_SLIDER_RELATIVE
  324.   // top part
  325.   OSD_PutRect(
  326. a, y,
  327. b - a, (slider->widget.pos.h - SLIDER_BASE_LINE) /2 - SLIDER_ONTIC_HEIGHT,
  328. color);
  329.   y += (slider->widget.pos.h - SLIDER_BASE_LINE)/2 + SLIDER_BASE_LINE - SLIDER_ONTIC_HEIGHT;
  330.   // bottom part
  331.   OSD_PutRect(
  332. a, y,
  333. b - a, slider->widget.pos.h - SLIDER_ONTIC_HEIGHT - ( y - slider->widget.pos.y),
  334. color);
  335. }
  336. }
  337. slider->cur_ratio = new_ratio;
  338. #ifndef NO_NUMBER_ON_SLIDER
  339. {
  340. #if defined(USE_JOG) && defined(D_SHOW_VOLUME_MENU)
  341. wchar_t str[5] ;
  342. if (MS_IS_SLIDER_POINT(slider))
  343. {
  344. if (slider->cur_ratio == VOL_MIDDLE_VALUE)
  345. {
  346. str[0]=' ';
  347. str[1]='0';
  348. str[2] = 0;
  349. }
  350. else if (slider->cur_ratio > VOL_MIDDLE_VALUE)
  351. {
  352. str[0]='+';
  353. if (slider->cur_ratio >= (VOL_MIDDLE_VALUE*2))
  354. {
  355. str[1] = '1';
  356. str[2] = '0';
  357. str[3] = 0;
  358. }
  359. else
  360. {
  361. str[1]=(slider->cur_ratio-VOL_MIDDLE_VALUE)%10+'0';
  362. str[2] = 0;
  363. }
  364. }
  365. else
  366. {
  367. str[0]= '-';
  368. if (0 == slider->cur_ratio)
  369. {
  370. str[1] = '1';
  371. str[2] = '0';
  372. str[3] = 0;
  373. }
  374. else
  375. {
  376. str[1]=(VOL_MIDDLE_VALUE-slider->cur_ratio)%10+'0';
  377. str[2] = 0;
  378. }
  379. }
  380. OSD_PutText(slider->widget.pos.x+slider->widget.pos.w+24,slider->widget.pos.y - SLIDER_ONTIC_HEIGHT,72,MS_LINE_HEIGHT,FG_COLOR(slider->widget.color),BG_COLOR(slider->widget.color),str,1,1);
  381. }
  382. else
  383. {
  384. str[0]=(slider->cur_ratio)/10+'0';
  385. str[1]=(slider->cur_ratio)%10+'0';
  386. str[2]=0;
  387. OSD_PutText(slider->widget.pos.x+slider->widget.pos.w+8,slider->widget.pos.y - SLIDER_ONTIC_HEIGHT,72,MS_LINE_HEIGHT,FG_COLOR(slider->widget.color),BG_COLOR(slider->widget.color),str,1,1);
  388. }
  389. #else
  390. wchar_t str[4] = {0,0,0,0} ;
  391. if (MS_IS_SLIDER_POINT(slider))
  392. {
  393. if (slider->cur_ratio == KEYSHIFT_MIDDLE_VALUE)
  394. {
  395. str[0]=' ';
  396. str[1]='0';
  397. str[2] = 0;
  398. }
  399. else if (slider->cur_ratio > KEYSHIFT_MIDDLE_VALUE)
  400. {
  401. str[0]='+';
  402. str[1]=(slider->cur_ratio - KEYSHIFT_MIDDLE_VALUE )%10+'0';
  403. str[2] = 0;
  404. }
  405. else
  406. {
  407. str[0]= '-';
  408. str[1]=(KEYSHIFT_MIDDLE_VALUE - slider->cur_ratio)%10+'0';
  409. str[2] = 0;
  410. }
  411. OSD_PutText(slider->widget.pos.x+slider->widget.pos.w+8,slider->widget.pos.y - 4,72,MS_LINE_HEIGHT,FG_COLOR(slider->widget.color),BG_COLOR(slider->widget.color),str,1,1);
  412. }
  413. else
  414. {
  415. str[0]=(slider->cur_ratio)/10+'0';
  416. str[1]=(slider->cur_ratio)%10+'0';
  417. str[2]=0;
  418. OSD_PutText(slider->widget.pos.x+slider->widget.pos.w+24,slider->widget.pos.y,72,MS_LINE_HEIGHT,FG_COLOR(slider->widget.color),BG_COLOR(slider->widget.color),str,1,1);
  419. }
  420. #endif
  421. }
  422. #endif
  423. slider->action(new_ratio);
  424. slider->step = step_back;
  425. }
  426. MS_UOP slider_user_op(MS_WIDGET *widget,MS_UOP uop,char param) 
  427. {
  428. switch (uop) {
  429. case MS_UOP_DELETE:
  430. return 0;
  431. case MS_UOP_DISPLAY:
  432. display(widget,param);
  433. return 0;
  434. case MS_UOP_LEFT:
  435. case MS_UOP_RIGHT:
  436. on_slider_change((MS_SLIDER *)widget,uop==MS_UOP_RIGHT, param);
  437. break;
  438. default:
  439. return uop;
  440. }
  441. return MS_UOP_NOP;
  442. }
  443. MS_SLIDER *MS_create_slider(MS_POS *pos,
  444. MS_COLOR color,
  445. unsigned char max_value,
  446. unsigned char cur_ratio,
  447. unsigned char step,
  448. void (* action)(unsigned char cur_ratio),
  449. int tick_ratio,
  450. unsigned char attr)
  451. {
  452. MS_SLIDER *slider;
  453. dbg_printf(("MS_create_slidern"));
  454. slider = (MS_SLIDER *)malloc(sizeof(MS_SLIDER));
  455. #ifdef _DEBUG
  456. if (NULL == slider) {
  457. tr_printf(("FATAL: MS_create_slider() Failed: Low system resources.n"));
  458. return NULL;
  459. }
  460. #endif //_DEBUG
  461. ((MS_WIDGET *)slider)->pos = *pos;
  462. ((MS_WIDGET *)slider)->parent = NO_PARENT;
  463. slider->action = action;
  464. slider->tick_ratio = tick_ratio;
  465. slider->step = step;
  466. slider->cur_ratio = cur_ratio;
  467. slider->max_value = max_value;
  468. ((MS_WIDGET *)slider)->attr = attr;
  469. ((MS_WIDGET *)slider)->color = color;
  470. ((MS_WIDGET *)slider)->user_op = slider_user_op;
  471. ((MS_WIDGET *)slider)->attrh = 0;
  472. return slider;
  473. }