OSD_DRV.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: OSD_DRV.C $             
  6.  *
  7.  * Description:
  8.  * ============
  9.  * low level OSD handler
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 21 $
  14.  * Last Modified by $Author: Terencet $ at $Modtime: 3/12/04 3:27p $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I76/I76_Common/I76_Reference/UI/Menu_sys/OSD_DRV.C $
  19.  * 
  20.  * 21    3/12/04 3:29p Terencet
  21.  * display english string if current language string is null
  22.  * 
  23.  * 20    03-03-19 16:28 Rogerl
  24.  * Avoid too much warning messages ouput to Hyperterminal
  25.  * 
  26.  * 19    03-03-04 11:50 Hannahh
  27.  * remove the customer name of all project.
  28.  * 
  29.  * 18    03-02-26 15:13 Mikelv
  30.  * change frame
  31.  * 
  32.  * 17    03-02-08 16:00 Rogerl
  33.  * Fix OSD_GetFontHeight,
  34.  * Don't treat ALIGN_LEFT_PAD as ALIGN_LEFT in OSD_PutText
  35.  * 
  36.  * 16    03-01-17 11:56 Rogerl
  37.  * add OSD_3DFrameRect
  38.  * 
  39.  * 15    03-01-09 4:43 Leslie
  40.  * Unicode support
  41.  * 
  42.  * 14    11/22/02 9:30a Leslie
  43.  * Use Look-up table for Ascii to String convertion
  44.  * 
  45.  * 13    10/30/02 18:03 Rond
  46.  * 
  47.  * 15    5/22/02 8:52a Tomasp
  48.  * Changed include paths.
  49.  * 
  50.  * 14    23/04/02 9:39 Nirm
  51.  * - Added dependency in "Config.h".
  52.  * 
  53.  * 13    4/22/02 14:50 Rinata
  54.  * under USE_BMP_BUTTON setup menu with bitmap buttons
  55.  * 
  56.  * 12    4/11/02 6:11a Tomasp
  57.  * ASCII character with code >= 0xF0 are also replaced.
  58.  * 
  59.  * 11    19/03/02 20:56 Nirm
  60.  * Improvements in OSD_CorneredFrame().
  61.  * 
  62.  * 10    17/03/02 20:05 Nirm
  63.  * Added OSD_CorneredFrame().
  64.  * 
  65.  * 9     11/03/02 14:12 Nirm
  66.  * Code cleanup.
  67.  * 
  68.  * 8     24/02/02 14:13 Nirm
  69.  * - Added support for various characters.
  70.  * 
  71.  * 7     16/01/02 8:57 Nirm
  72.  * Fixed debug-messages.
  73.  * 
  74.  * 6     13/01/02 16:41 Atai
  75.  * Remove old Defines
  76.  * 
  77.  * 5     9/01/02 18:23 Nirm
  78.  * Corrected Include-Paths.
  79.  * 
  80.  * 4     31/12/01 16:10 Nirm
  81.  * Corrected wrong casting, which caused giberish on the OSD.
  82.  * 
  83.  * 3     30/12/01 10:06 Atai
  84.  * Add explicit casting
  85.  * 
  86.  * 2     25/12/01 12:03 Atai
  87.  * code cleaning
  88.  **************************************************************************************** */
  89. #include "Config.h" // Global Configuration - do not remove!
  90. #ifdef _DEBUG
  91. #include "DebugDbgMain.h"
  92. #undef IFTRACE
  93. #define IFTRACE if (gTraceMenu)
  94. #endif //_DEBUG
  95. #include <stdio.h>
  96. #include "Includesysdefs.h"
  97. #include "Decoderosdrendr.h"
  98. #include "Decoderosdlayou.h"
  99. #include "UIMenu_Sysms_wdgt.h"
  100. #include "UIMenu_Sysosd_drv.h"
  101. #include "UIMenu_Sysms_lib.h"
  102. //START of customer specific include files
  103. #include "Stringsstrings.h"
  104. //END of customer specific include files
  105. static unsigned short Xorigin;
  106. static unsigned short Yorigin;
  107. #ifdef _DEBUG
  108. #define IFTRACE if (gTraceMenu)
  109. #include "DebugDbgMain.h"
  110. #endif
  111. int OSD_GetFontHeight(void)
  112. {
  113. #ifdef D_LINE_DOUBLING
  114.   return (pgoCurrentFont->m_cHeight * 2);
  115. #else
  116.   return 
  117.  #ifdef USE_FONT24x32
  118. // use height parameter in fonts
  119.     pgoCurrentFont->m_cHeight;
  120.  #else
  121.     pgoCurrentFont->m_cHeight;
  122.  #endif
  123. #endif // D_LINE_DOUBLING
  124. }
  125. #ifdef D_LINE_DOUBLING
  126. #define OSD_DRAW_RECTANGLE( _x_, _y_, _w_, _h_ ) OSDDrawRectangle( (_x_), ((_y_) >> 1), (_w_), ((_h_) >> 1) )
  127. #else
  128. #define OSD_DRAW_RECTANGLE( _x_, _y_, _w_, _h_ ) OSDDrawRectangle( (_x_), (_y_), (_w_), (_h_) )
  129. #endif
  130. void OSD_AimedFrame(int x, int y, int w, int h, int h_length, int v_length,
  131.    unsigned char color, unsigned char thickness)
  132. {
  133. int iEffectiveHeight= (v_length - thickness);
  134. /*
  135. int iHorizCenter, iVertCenter;
  136. x += Xorigin;
  137. y += Yorigin;
  138. OSDSetBrushColor(color);
  139. iHorizCenter= ((x + w - thickness) / 2);
  140. iVertCenter= ((y + h - thickness) / 2);
  141. // Draw the Crosshair:
  142. // Top Center
  143. OSD_DRAW_RECTANGLE(iHorizCenter, y, thickness, iEffectiveHeight);
  144. // Bottom Center
  145. OSD_DRAW_RECTANGLE(iHorizCenter, (y + h - v_length), thickness, iEffectiveHeight);
  146. // Left Center
  147. OSD_DRAW_RECTANGLE(x, iVertCenter, h_length, thickness);
  148. // Right Center
  149. OSD_DRAW_RECTANGLE((x + w - h_length), iVertCenter, h_length, thickness);
  150. // Adjust the coordinates to align the Frame with the Crosshair
  151. x += (h_length / 2);
  152. y += (v_length / 2);
  153. w -= h_length;
  154. h -= v_length;
  155. // Draw the Corners of the Frame:
  156. // Top-Left Corner
  157. OSD_DRAW_RECTANGLE(x, y, h_length, thickness);
  158. OSD_DRAW_RECTANGLE(x, (y + thickness), thickness, iEffectiveHeight);
  159. // Top-Right Corner
  160. OSD_DRAW_RECTANGLE((x + w - h_length), y, h_length, thickness);
  161. OSD_DRAW_RECTANGLE((x + w - thickness), (y + thickness), thickness, iEffectiveHeight);
  162. // Bottom-Left Corner
  163. OSD_DRAW_RECTANGLE(x, (y + h - thickness), h_length, thickness);
  164. OSD_DRAW_RECTANGLE(x, (y + h - v_length), thickness, iEffectiveHeight);
  165. // Bottom-Right Corner
  166. OSD_DRAW_RECTANGLE((x + w - h_length), (y + h - thickness), h_length, thickness);
  167. OSD_DRAW_RECTANGLE((x + w - thickness), (y + h - v_length), thickness, iEffectiveHeight);
  168. return;
  169. int iEffectiveHeight= (v_length - thickness);
  170. */
  171. int tx,ty,tw,th;
  172. x += Xorigin;
  173. y += Yorigin;
  174. tx = x;
  175. ty = y; 
  176. tw = w;
  177. th = h ;
  178. x = tx + tw/2 - thickness - h_length ;
  179. y = ty + th/2 - thickness - v_length;
  180. w = thickness *2 + h_length *2 ;
  181. h = thickness*2 + v_length*2 ;
  182. OSDSetBrushColor(color);
  183. // Top-Left Corner
  184. OSD_DRAW_RECTANGLE(x, y, h_length, thickness);
  185. OSD_DRAW_RECTANGLE(x, (y + thickness), thickness, iEffectiveHeight);
  186. // Top-Right Corner
  187. OSD_DRAW_RECTANGLE((x + w - h_length), y, h_length, thickness);
  188. OSD_DRAW_RECTANGLE((x + w - thickness), (y + thickness), thickness, iEffectiveHeight);
  189. // Bottom-Left Corner
  190. OSD_DRAW_RECTANGLE(x, (y + h - thickness), h_length, thickness);
  191. OSD_DRAW_RECTANGLE(x, (y + h - v_length), thickness, iEffectiveHeight);
  192. // Bottom-Right Corner
  193. OSD_DRAW_RECTANGLE((x + w - h_length), (y + h - thickness), h_length, thickness);
  194. OSD_DRAW_RECTANGLE((x + w - thickness), (y + h - v_length), thickness, iEffectiveHeight);
  195. //cross range
  196. x = x - (h_length/2);
  197. y = y - (v_length/2);
  198. w = w + h_length;
  199. h = h + v_length;
  200. //cross up
  201. OSD_DRAW_RECTANGLE( (x + w/2 - thickness/2 ), y , thickness, v_length);
  202. //cross left
  203. OSD_DRAW_RECTANGLE( x, (y + h/2 - thickness/2 ), h_length, thickness);
  204. //cross right
  205. OSD_DRAW_RECTANGLE( x+w-h_length, (y + h/2 - thickness/2 ), h_length, thickness);
  206. //cross down
  207. OSD_DRAW_RECTANGLE( (x + w/2 - thickness/2 ), y+h-v_length , thickness, v_length);
  208. return;
  209. }
  210. void OSD_CorneredFrame(int x, int y, int w, int h, int h_length, int v_length,
  211.    unsigned char color, unsigned char thickness)
  212. {
  213. int iEffectiveHeight= (v_length - thickness);
  214. x += Xorigin;
  215. y += Yorigin;
  216. OSDSetBrushColor(color);
  217. // Top-Left Corner
  218. OSD_DRAW_RECTANGLE(x, y, h_length, thickness);
  219. OSD_DRAW_RECTANGLE(x, (y + thickness), thickness, iEffectiveHeight);
  220. // Top-Right Corner
  221. OSD_DRAW_RECTANGLE((x + w - h_length), y, h_length, thickness);
  222. OSD_DRAW_RECTANGLE((x + w - thickness), (y + thickness), thickness, iEffectiveHeight);
  223. // Bottom-Left Corner
  224. OSD_DRAW_RECTANGLE(x, (y + h - thickness), h_length, thickness);
  225. OSD_DRAW_RECTANGLE(x, (y + h - v_length), thickness, iEffectiveHeight);
  226. // Bottom-Right Corner
  227. OSD_DRAW_RECTANGLE((x + w - h_length), (y + h - thickness), h_length, thickness);
  228. OSD_DRAW_RECTANGLE((x + w - thickness), (y + h - v_length), thickness, iEffectiveHeight);
  229. return;
  230. }
  231. void OSD_FrameRect(int x,int y,int w,int h,unsigned char color,unsigned char thickness)
  232. {
  233. int iInnerHeight = (h - (2 * thickness));
  234. x += Xorigin;
  235. y += Yorigin;
  236. dbg_printf(("OSD_FrameRect %d %d %d %d color: %d thickness %d STARTn",x,y,w,h,(int)color,(int)thickness));
  237. OSDSetBrushColor(color);
  238. // Top horizontal line
  239. OSD_DRAW_RECTANGLE(x, y, w, thickness);
  240. // Bottom horizontal
  241. OSD_DRAW_RECTANGLE(x, y + h - thickness, w, thickness);
  242. // Left vertical line
  243. OSD_DRAW_RECTANGLE(x, y + thickness, thickness, iInnerHeight);
  244. // Right vertical line
  245. OSD_DRAW_RECTANGLE(x + w - thickness, y + thickness, thickness, iInnerHeight);
  246. dbg_printf(("OSD_FrameRect %d %d %d %d color: %d thickness %d ENDn",x,y,w,h,(int)color,(int)thickness));
  247. return;
  248. }
  249. void OSD_3DFrameRect(int x,int y,int w,int h,unsigned char colorLT, unsigned char colorRB, unsigned char thickness)
  250. {
  251. int iInnerHeight = (h - (2 * thickness));
  252. x += Xorigin;
  253. y += Yorigin;
  254. //dbg_printf(("OSD_3DFrameRect %d %d %d %d color: %d thickness %d STARTn",x,y,w,h,(int)color,(int)thickness));
  255. OSDSetBrushColor(colorLT);
  256. // Top horizontal line
  257. OSD_DRAW_RECTANGLE(x, y, w, thickness);
  258. // Left vertical line
  259. OSD_DRAW_RECTANGLE(x, y + thickness, thickness, iInnerHeight);
  260. OSDSetBrushColor(colorRB);
  261. // Bottom horizontal
  262. OSD_DRAW_RECTANGLE(x, y + h - thickness, w, thickness);
  263. // Right vertical line
  264. OSD_DRAW_RECTANGLE(x + w - thickness, y + thickness, thickness, iInnerHeight);
  265. //dbg_printf(("OSD_FrameRect %d %d %d %d color: %d thickness %d ENDn",x,y,w,h,(int)color,(int)thickness));
  266. }
  267. // Calculate the frame bounds for the specified rectangle
  268. void OSD_CalcFramedPos( MS_POS *pmspos )
  269. {
  270.   unsigned char cExtraPixels = C_INSET + C_THICKNESS;
  271.   pmspos->x -= cExtraPixels;
  272.   if ( (short) pmspos->x < 0 )
  273. pmspos->x = 0;
  274.   pmspos->y -= cExtraPixels;
  275.   if ( (short) pmspos->y < 0 )
  276. pmspos->y = 0;
  277.   pmspos->w += (2 * cExtraPixels);
  278.   pmspos->h += (2 * cExtraPixels);
  279. }
  280. void OSD_PutRect(int x,int y,int w,int h,unsigned char color)
  281. {
  282. x+=Xorigin;
  283. y+=Yorigin;
  284. dbg_printf(("OSD_PutRect %d %d %d %d color: %d STARTn",x,y,w,h,(int)color));
  285. OSDSetBrushColor(color);
  286. OSD_DRAW_RECTANGLE(x, y, w, h);
  287. dbg_printf(("OSD_PutRect %d %d %d %d color: %d ENDn",x,y,w,h,(int)color));
  288. return;
  289. }
  290. void OSD_PutText(int x,int y,int w,int h,unsigned char forward_color,unsigned char backward_color,void *text, char alignment,char ascii)
  291. {
  292. int y_gap;
  293. int iFontHeight = OSD_GetFontHeight();
  294. #ifdef D_MS_EXTENSIONS
  295. char szConcatBuffer[MS_STATIC_MAX_LENGTH + 1];
  296. #endif // MS_EXTENSIONS
  297. // Force wWidth = FIT_STRING_SZ for ALIGN_LEFT
  298. if ( alignment == ALIGN_LEFT )
  299.   w = FIT_STRING_SZ;
  300. // Don't do the following for use ALIGN_LEFT_PAD as a new justify attribute, Roger 030207
  301. //if ( alignment == ALIGN_LEFT_PAD )
  302. //  alignment = ALIGN_LEFT;
  303. x+=Xorigin;
  304. y+=Yorigin;
  305. dbg_printf(("OSD_PutText %d %d %d %d color: (%d,%d)n",x,y,w,h,(int)forward_color,(int)backward_color));
  306. y_gap = (h-iFontHeight)/2;
  307. OSDSetBrushColor(backward_color);
  308. #ifdef D_LINE_DOUBLING
  309. OSDDrawRectangle(x, (y>>1), w, (y_gap>>1));
  310. #else
  311. OSDDrawRectangle(x,y,w,y_gap);
  312. #endif // D_LINE_DOUBLING
  313. y+= y_gap;
  314. OSDSetFontColor(forward_color, backward_color);
  315. if ( ascii != C_ASCII )
  316. {
  317. if ( text == 0 )
  318. {
  319. dbg_printf(("OSD_PutText(): Warning: text is NULL.n"));
  320. }
  321. //#ifdef D_NEW_STRING
  322. // if ((int)text < 0x100)
  323. // text = (void *) ((Strings_Common[LANGUAGE_ENGLISH])[(int)text]);
  324. // else
  325. // text = (void *) ((Strings[gCurrentLanguage])[(int)text - 0x100]);
  326. //#else
  327. #ifdef DEFAULT_ENGLISH_FOR_NULL_STRING   
  328. if(NULL == (Strings[gCurrentLanguage])[(int)text])
  329. {
  330. //replace with english string if current language string is null
  331. text = (void *) ((Strings[LANGUAGE_ENGLISH])[(int)text]);
  332. }
  333. else
  334. #endif
  335. text = (void *) ((Strings[gCurrentLanguage])[(int)text]);
  336. //#endif
  337. #ifdef D_MS_EXTENSIONS
  338.   if ( *((char *)text) == ESCSQ_MSG )
  339.   {
  340. char *pucSrc = (char *) text;
  341. char *pucDst = szConcatBuffer;
  342. while ( *pucSrc == ESCSQ_MSG )
  343. {
  344.   pucSrc = (char *) ( (Strings[gCurrentLanguage])[(int) pucSrc[1]] );
  345.   while ( *pucSrc )
  346.   {
  347. *pucDst = *pucSrc;
  348. pucDst++;
  349. pucSrc++;
  350.   } // while ( *pucSrc )
  351.   text = (void *) ((char *) text + 2);
  352.   pucSrc = (char *) text;
  353. } // while ( *pucSrc == ESCSQ_MSG )
  354. *pucDst = '';
  355. text = (void *) szConcatBuffer;
  356.   } // ( *((char *)text) == ESCSQ_MSG )
  357. #endif // D_MS_EXTENSIONS
  358. } // ascii != C_ASCII
  359. #ifdef D_LINE_DOUBLING
  360. OSDPrintStr((BYTE *)text, x, (y>>1), w, alignment);
  361. #else
  362. OSDPrintStr((BYTE *)text, x, y, w, alignment);
  363. #endif // D_LINE_DOUBLING
  364. OSDSetBrushColor(backward_color);
  365. y += iFontHeight;
  366. h -= ( y_gap + iFontHeight );
  367. #ifdef D_LINE_DOUBLING
  368. OSDDrawRectangle(x, (y>>1), w, (h>>1));
  369. #else
  370. OSDDrawRectangle(x, y, w, h);
  371. #endif // D_LINE_DOUBLING
  372. return;
  373. }
  374. //#ifdef USE_BMP_BUTTON
  375. void OSD_DrawBitmap(WORD wXPos , WORD wYPos , CONST BYTE *pcBm,  BYTE FocusIndex, BYTE newBGindex )
  376. {
  377. wXPos += Xorigin;
  378. wYPos += Yorigin;
  379. OSDDisplayFocusBitmap(wXPos, wYPos, pcBm , FocusIndex, newBGindex );  
  380. }
  381. //#endif
  382. void OSD_TurnOff(void)
  383. {
  384. dbg_printf(("OSD turn OFFn"));
  385. Xorigin = 0;
  386. Yorigin = 0;
  387. OSDTurnOff();
  388. }
  389. void OSD_TurnOn(void)
  390. {
  391. dbg_printf(("OSD turn ONn"));
  392. OSDTurnOn();
  393. }
  394. void OSD_SetOrigin(MS_WIDGET *widget)
  395. {
  396. MS_WIDGET *curr = (MS_WIDGET *)widget->parent;
  397. Xorigin = widget->pos.x;
  398. Yorigin = widget->pos.y;
  399. while (curr != NO_PARENT) {
  400. Xorigin += curr->pos.x;
  401. Yorigin += curr->pos.y;
  402. curr = (MS_WIDGET *)curr->parent;
  403. }
  404. }