gui.c
上传用户:lqx1163
上传日期:2014-08-13
资源大小:9183k
文件大小:192k
源码类别:

MTK

开发平台:

C/C++

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2005
  8. *
  9. *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
  27. *
  28. *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. /*****************************************************************************
  36.  *
  37.  * Filename:
  38.  * ---------
  39.  *   gui.c
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   MAUI
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *   GUI primitives
  48.  *
  49.  *   This file includes
  50.  *   o Wrapper function pointers
  51.  *   o Special filler effects
  52.  *   o HLS colorspace
  53.  *   o Truncated text display
  54.  *   o Gui cleanup callback
  55.  *
  56.  * Author:
  57.  * -------
  58.  * -------
  59.  *
  60.  *============================================================================
  61.  *             HISTORY
  62.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  63.  *------------------------------------------------------------------------------
  64.  * removed!
  65.  *
  66.  * removed!
  67.  * removed!
  68.  * removed!
  69.  *
  70.  * removed!
  71.  * removed!
  72.  * removed!
  73.  *
  74.  * removed!
  75.  * removed!
  76.  * removed!
  77.  *
  78.  * removed!
  79.  * removed!
  80.  * removed!
  81.  *
  82.  * removed!
  83.  * removed!
  84.  * removed!
  85.  *
  86.  * removed!
  87.  * removed!
  88.  * removed!
  89.  *
  90.  * removed!
  91.  * removed!
  92.  * removed!
  93.  *
  94.  * removed!
  95.  * removed!
  96.  * removed!
  97.  *
  98.  * removed!
  99.  * removed!
  100.  * removed!
  101.  *
  102.  * removed!
  103.  * removed!
  104.  * removed!
  105.  *
  106.  * removed!
  107.  * removed!
  108.  * removed!
  109.  *
  110.  * removed!
  111.  * removed!
  112.  * removed!
  113.  *
  114.  * removed!
  115.  * removed!
  116.  * removed!
  117.  *
  118.  * removed!
  119.  * removed!
  120.  * removed!
  121.  *
  122.  * removed!
  123.  * removed!
  124.  * removed!
  125.  *
  126.  * removed!
  127.  * removed!
  128.  * removed!
  129.  *
  130.  * removed!
  131.  * removed!
  132.  * removed!
  133.  *
  134.  * removed!
  135.  * removed!
  136.  * removed!
  137.  *
  138.  * removed!
  139.  * removed!
  140.  * removed!
  141.  *
  142.  * removed!
  143.  * removed!
  144.  * removed!
  145.  *
  146.  * removed!
  147.  * removed!
  148.  * removed!
  149.  *
  150.  * removed!
  151.  * removed!
  152.  * removed!
  153.  *
  154.  * removed!
  155.  * removed!
  156.  * removed!
  157.  *
  158.  * removed!
  159.  * removed!
  160.  * removed!
  161.  *
  162.  *------------------------------------------------------------------------------
  163.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  164.  *============================================================================
  165.  ****************************************************************************/
  166. /**
  167.  * Copyright Notice
  168.  * ?2002 - 2003, Pixtel Communications, Inc., 1489 43rd Ave. W.,
  169.  * Vancouver, B.C. V6M 4K8 Canada. All Rights Reserved.
  170.  *  (It is illegal to remove this copyright notice from this software or any
  171.  *  portion of it)
  172.  */
  173. #include "MMI_features.h"
  174. #include "kal_non_specific_general_types.h"
  175. #include "gui.h"
  176. #include "gdi_include.h"
  177. #include "lcd_sw_rnd.h"
  178. #include "UCS2Prot.h"
  179. #include "DebugInitDef.h"
  180. #include "math.h"       /* Floating arithmetics */
  181. #ifdef __MMI_LANG_VIETNAMESE__
  182. #include "gui_lang_viet.h"
  183. #endif 
  184. #include "BIDIDef.h"
  185. /* PMT START PERSIAN */
  186. #ifdef __MMI_ZI_V7__
  187. #include "ezicmn.h"
  188. #endif 
  189. #if defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__)
  190. #include "zi8ARshape.h"
  191. #endif /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  192. /* PMT END PERSIAN */
  193. #ifdef __MMI_BIDI_ALG__
  194. extern U16 pwcWord[];
  195. #endif 
  196. extern BOOL r2lMMIFlag;
  197. #ifdef __MMI_HINDI_ALG__
  198. #include "hf_rules.h"
  199. #endif /* __MMI_HINDI_ALG__ */ 
  200. #ifdef __MMI_ARSHAPING_ENGINE__
  201. extern void ArabicShapeEngine(PU16, PU16);
  202. #endif 
  203. /* UI globals */
  204. S32 UI_clip_x1;             /* Left edge of UI clip rectangle */
  205. S32 UI_clip_y1;             /* Top edge of UI clip rectangle */
  206. S32 UI_clip_x2;             /* Right edge of UI clip rectangle */
  207. S32 UI_clip_y2;             /* Bottom edge of UI clip rectangle */
  208. S32 UI_old_clip_x1;         /* Saved UI clipping values */
  209. S32 UI_old_clip_y1;
  210. S32 UI_old_clip_x2;
  211. S32 UI_old_clip_y2;
  212. S32 UI_text_x;              /* Current text cursor position */
  213. S32 UI_text_y;
  214. S32 UI_text_height;         /* Current line height to use */
  215. S32 UI_pointer_x;           /* Current pointer position */
  216. S32 UI_pointer_y;
  217. color UI_text_color;        /* Current text color */
  218. color UI_text_border_color; /* Current text border color */
  219. /*
  220.  * Base functions required by the UI system:
  221.  * All UI components will use these functions and will not directly use any other 
  222.  * OS or hardware related functions.                        
  223.  * All these calls are function pointers and need to be initialized with the
  224.  * proper driver (Ex: wingui.c for Win32 platforms)
  225.  */
  226. /*----------------------------------------------------------------------------
  227. Function Pointer: gui_putpixel
  228. Description:      Plots a pixel at (x,y) with color c
  229. Input Parameters: (x,y) co-ordinates in the device screen
  230.                c     color in which the pixel is plotted
  231. Output Parameters:   none
  232. Returns:       void
  233. ----------------------------------------------------------------------------*/
  234. void (*gui_putpixel) (S32 x, S32 y, color c) = NULL;
  235. /*----------------------------------------------------------------------------
  236. Function Pointer: gui_draw_vertical_line
  237. Description:      Draws a vertical line from (x,y1) to (x,y2) with color c
  238. Input Parameters: y1    starting y co-ordinate
  239.                y2    ending y co-ordinate
  240.                x     x co-ordinate
  241.                c     color in which the line is drawn
  242. Output Parameters:   none
  243. Returns:       void
  244. Remarks:       Single pixel wide line
  245.                Currently doesn't support (y2<y1)
  246. ----------------------------------------------------------------------------*/
  247. void (*gui_draw_vertical_line) (S32 y1, S32 y2, S32 x, color c) = NULL;
  248. /*----------------------------------------------------------------------------
  249. Function Pointer: gui_draw_horizontal_line
  250. Description:      Draws a horizontal line from (x1,y) to (x2,y) with color c
  251. Input Parameters: x1    starting x co-ordinate
  252.                x2    ending x co-ordinate
  253.                y     y co-ordinate
  254.                c     color in which the line is drawn
  255.                type_line NORMAL/DOTTED/DASHED
  256. Output Parameters:   none
  257. Returns:       void
  258. Remarks:       Single pixel wide line
  259.                Currently doesn't support (x2<x1)
  260. ----------------------------------------------------------------------------*/
  261. void (*gui_draw_horizontal_line) (S32 x1, S32 x2, S32 y, color c) = NULL;
  262. /*----------------------------------------------------------------------------
  263. Function Pointer: gui_line
  264. Description:      Draws a line from (x1,y1) to (x2,y2) with color c
  265. Input Parameters: (x1,y1)  end point 1
  266.                (x2,y2)  end point 2
  267.                c     color
  268. Output Parameters:   none
  269. Returns:       void
  270. Remarks:       Single pixel wide line
  271. ----------------------------------------------------------------------------*/
  272. void (*gui_line) (S32 x1, S32 y1, S32 x2, S32 y2, color c) = NULL;
  273. /*----------------------------------------------------------------------------
  274. Function Pointer: gui_wline
  275. Description:      Draws a line from (x1,y1) to (x2,y2) with color c
  276. Input Parameters: (x1,y1)  end point 1
  277.                (x2,y2)  end point 2
  278.                c     color
  279.                w     is the width in pixels
  280. Output Parameters:   none
  281. Returns:       void
  282. Remarks:       Single pixel wide line
  283. ----------------------------------------------------------------------------*/
  284. void (*gui_wline) (S32 x1, S32 y1, S32 x2, S32 y2, color c, S32 w) = NULL;
  285. /*----------------------------------------------------------------------------
  286. Function Pointer: gui_draw_rectangle_type
  287. Description:      Draws a rectangle (x1,y1) to (x2,y2) with color c
  288. Input Parameters: (x1,y1)  left-top corner of the rectangle
  289.                (x2,y2)  right-bottom corner of the rectangle
  290.                c     color
  291. Output Parameters:   none
  292. Returns:       void
  293. Remarks:       Single pixel wide, outlined rectangle
  294.                Currently doesn't support (x2<x1) or (y2<y1)
  295. ----------------------------------------------------------------------------*/
  296. void (*gui_draw_rectangle_type) (S32 x1, S32 y1, S32 x2, S32 y2, color c, S32 type_line) = NULL;
  297. /*----------------------------------------------------------------------------
  298. Function Pointer: gui_draw_vertical_line_type
  299. Description:      Draws a vertical line from (x,y1) to (x,y2) with color c
  300. Input Parameters: y1    starting y co-ordinate
  301.                y2    ending y co-ordinate
  302.                x     x co-ordinate
  303.                c     color in which the line is drawn
  304.                type_line NORMAL/DOTTED/DASHED
  305. Output Parameters:   none
  306. Returns:       void
  307. Remarks:       Single pixel wide line
  308.                Currently doesn't support (y2<y1)
  309. ----------------------------------------------------------------------------*/
  310. void (*gui_draw_vert_line_type) (S32 y1, S32 y2, S32 x, color c, S32 type_line) = NULL;
  311. /*----------------------------------------------------------------------------
  312. Function Pointer: gui_draw_horizontal_line_type 
  313. Description:      Draws a horizontal line from (x1,y) to (x2,y) with color c
  314. Input Parameters: x1    starting x co-ordinate
  315.                x2    ending x co-ordinate
  316.                y     y co-ordinate
  317.                c     color in which the line is drawn
  318. Output Parameters:   none
  319. Returns:       void
  320. Remarks:       Single pixel wide line
  321.                Currently doesn't support (x2<x1)
  322. ----------------------------------------------------------------------------*/
  323. void (*gui_draw_hori_line_type) (S32 x1, S32 x2, S32 y, color c, S32 type_line) = NULL;
  324. /*----------------------------------------------------------------------------
  325. Function Pointer: gui_draw_rectangle
  326. Description:      Draws a rectangle (x1,y1) to (x2,y2) with color c with t
  327. Input Parameters: (x1,y1)  left-top corner of the rectangle
  328.                (x2,y2)  right-bottom corner of the rectangle
  329.                c     color
  330.                type_line NORMAL/DOTTED/DASHED
  331. Output Parameters:   none
  332. Returns:       void
  333. Remarks:       Single pixel wide, outlined rectangle
  334.                Currently doesn't support (x2<x1) or (y2<y1)
  335. ----------------------------------------------------------------------------*/
  336. void (*gui_draw_rectangle) (S32 x1, S32 y1, S32 x2, S32 y2, color c) = NULL;
  337. /*----------------------------------------------------------------------------
  338. Function Pointer: gui_fill_rectangle
  339. Description:      Draws a filled rectangle (x1,y1) to (x2,y2) with color c
  340. Input Parameters: (x1,y1)  left-top corner of the rectangle
  341.                (x2,y2)  right-bottom corner of the rectangle
  342.                c     color
  343. Output Parameters:   none
  344. Returns:       void
  345. Remarks:       Filled rectangle without border
  346.                Currently doesn't support (x2<x1) or (y2<y1)
  347. ----------------------------------------------------------------------------*/
  348. void (*gui_fill_rectangle) (S32 x1, S32 y1, S32 x2, S32 y2, color c) = NULL;
  349. /*----------------------------------------------------------------------------
  350. Function Pointer: gui_cross_hatch_fill_rectangle
  351. Description:      Draws a cross hatch filled rectangle (x1,y1) to (x2,y2) with color c
  352. Input Parameters: (x1,y1)  left-top corner of the rectangle
  353.                (x2,y2)  right-bottom corner of the rectangle
  354.                c     color
  355. Output Parameters:   none
  356. Returns:       void
  357. Remarks:       Filled rectangle without border
  358.                Currently doesn't support (x2<x1) or (y2<y1)
  359. ----------------------------------------------------------------------------*/
  360. void (*gui_cross_hatch_fill_rectangle) (S32 x1, S32 y1, S32 x2, S32 y2, color c) = NULL;
  361. /*----------------------------------------------------------------------------
  362. Function Pointer: gui_hatch_fill_rectangle
  363. Description:      Draws a horizontal hatch filled rectangle (x1,y1) to (x2,y2) with color c
  364. Input Parameters: (x1,y1)  left-top corner of the rectangle
  365.                (x2,y2)  right-bottom corner of the rectangle
  366.                c     color
  367. Output Parameters:   none
  368. Returns:       void
  369. Remarks:       Filled rectangle without border
  370.                Currently doesn't support (x2<x1) or (y2<y1)
  371. ----------------------------------------------------------------------------*/
  372. void (*gui_hatch_fill_rectangle) (S32 x1, S32 y1, S32 x2, S32 y2, color c) = NULL;
  373. /*----------------------------------------------------------------------------
  374. Function Pointer: gui_alternate_cross_hatch_fill_rectangle
  375. Description:      Draws a cross hatch filled rectangle (x1,y1) to (x2,y2) with alternating colors c1 and c2
  376. Input Parameters: (x1,y1)  left-top corner of the rectangle
  377.                (x2,y2)  right-bottom corner of the rectangle
  378.                c1, c2   colors
  379. Output Parameters:   none
  380. Returns:       void
  381. Remarks:       Filled rectangle without border
  382.                Currently doesn't support (x2<x1) or (y2<y1)
  383. ----------------------------------------------------------------------------*/
  384. void (*gui_alternate_cross_hatch_fill_rectangle) (S32 x1, S32 y1, S32 x2, S32 y2, color c1, color c2) = NULL;
  385. /*----------------------------------------------------------------------------
  386. Function Pointer: gui_alternate_hatch_fill_rectangle
  387. Description:      Draws a horizontal hatch filled rectangle (x1,y1) to (x2,y2) with alternating colors c1 and c2
  388. Input Parameters: (x1,y1)  left-top corner of the rectangle
  389.                (x2,y2)  right-bottom corner of the rectangle
  390.                c1, c2   colors
  391. Output Parameters:   none
  392. Returns:       void
  393. Remarks:       Filled rectangle without border
  394.                Currently doesn't support (x2<x1) or (y2<y1)
  395. ----------------------------------------------------------------------------*/
  396. void (*gui_alternate_hatch_fill_rectangle) (S32 x1, S32 y1, S32 x2, S32 y2, color c1, color c2) = NULL;
  397. /*----------------------------------------------------------------------------
  398. Function Pointer: gui_set_text_clip
  399. Description:      Sets the text clipping boundary
  400. Input Parameters: (x1,y1)  left-top corner of the text clipping rectangle
  401.                (x2,y2)  right-bottom corner of the text clipping rectangle
  402. Output Parameters:   none
  403. Returns:       void
  404. ----------------------------------------------------------------------------*/
  405. void (*gui_set_text_clip) (S32 x1, S32 y1, S32 x2, S32 y2) = NULL;
  406. /*----------------------------------------------------------------------------
  407. Function Pointer: gui_get_text_clip
  408. Description:      Gets the text clipping boundary
  409. Input Parameters: none
  410. Output Parameters:   (x1,y1)  left-top corner of the text clipping rectangle
  411.                (x2,y2)  right-bottom corner of the text clipping rectangle
  412. Returns:       void
  413. ----------------------------------------------------------------------------*/
  414. void (*gui_get_text_clip) (S32 *x1, S32 *y1, S32 *x2, S32 *y2) = NULL;
  415. /*----------------------------------------------------------------------------
  416. Function Pointer: gui_set_text_clip_preset
  417. Description:      Sets the text clipping boundary making sure its not larger
  418.                than the previously set boundary.
  419. Input Parameters: (x1,y1)  left-top corner of the text clipping rectangle
  420.                (x2,y2)  right-bottom corner of the text clipping rectangle
  421. Output Parameters:   none
  422. Returns:       void
  423. ----------------------------------------------------------------------------*/
  424. void (*gui_set_text_clip_preset) (S32 x1, S32 y1, S32 x2, S32 y2) = NULL;
  425. /*----------------------------------------------------------------------------
  426. Function Pointer: gui_set_clip
  427. Description:      Sets the graphics clipping boundary
  428. Input Parameters: (x1,y1)  left-top corner of the clipping rectangle
  429.                (x2,y2)  right-bottom corner of the clipping rectangle
  430. Output Parameters:   none
  431. Returns:       void
  432. ----------------------------------------------------------------------------*/
  433. void (*gui_set_clip) (S32 x1, S32 y1, S32 x2, S32 y2) = NULL;
  434. /*----------------------------------------------------------------------------
  435. Function Pointer: gui_set_clip_with_bounding_box
  436. Description:      Sets the graphics clipping boundary with boundary 
  437. Input Parameters: (x1,y1)  left-top corner of the clipping rectangle
  438.                (x2,y2)     right-bottom corner of the clipping rectangle
  439.                (bx1, by1)  left-top corner of the bounding rectangle
  440.                (bx2, by2)  right-bottom corner of the bounding rectangle
  441. Output Parameters:   none
  442. Returns:       void
  443. ----------------------------------------------------------------------------*/
  444. extern void (*gui_set_clip_with_bounding_box) (S32 x1, S32 y1, S32 x2, S32 y2, S32 bx1, S32 by1, S32 bx2, S32 by2) =
  445.     NULL;
  446. /*----------------------------------------------------------------------------
  447. Function Pointer: gui_get_clip
  448. Description:      Gets the graphics clipping boundary
  449. Input Parameters: none
  450. Output Parameters:   (x1,y1)  left-top corner of the clipping rectangle
  451.                (x2,y2)  right-bottom corner of the clipping rectangle
  452. Returns:       void
  453. ----------------------------------------------------------------------------*/
  454. void (*gui_get_clip) (S32 *x1, S32 *y1, S32 *x2, S32 *y2) = NULL;
  455. /*----------------------------------------------------------------------------
  456. Function Pointer: gui_set_clip_preset
  457. Description:      Sets the graphics clipping boundary making sure its not larger
  458.                than the previously set boundary.
  459. Input Parameters: (x1,y1)  left-top corner of the clipping rectangle
  460.                (x2,y2)  right-bottom corner of the clipping rectangle
  461. Output Parameters:   none
  462. Returns:       void
  463. ----------------------------------------------------------------------------*/
  464. void (*gui_set_clip_preset) (S32 x1, S32 y1, S32 x2, S32 y2) = NULL;
  465. /*----------------------------------------------------------------------------
  466. Function Pointer: gui_reset_clip
  467. Description:      Resets the graphics clipping to the default values
  468. Input Parameters: none
  469. Output Parameters:   none
  470. Returns:       void
  471. ----------------------------------------------------------------------------*/
  472. void (*gui_reset_clip) (void) = NULL;
  473. /*----------------------------------------------------------------------------
  474. Function Pointer: gui_reset_text_clip
  475. Description:      Resets the text clipping to the default values
  476. Input Parameters: none
  477. Output Parameters:   none
  478. Returns:       void
  479. ----------------------------------------------------------------------------*/
  480. void (*gui_reset_text_clip) (void) = NULL;
  481. /*----------------------------------------------------------------------------
  482. Function Pointer: gui_move_text_cursor
  483. Description:      Positions the text cursor at (x,y)
  484. Input Parameters: (x,y) pixel from which the text drawing begins.
  485. Output Parameters:   none
  486. Returns:       void
  487. ----------------------------------------------------------------------------*/
  488. void (*gui_move_text_cursor) (S32 x, S32 y) = NULL;
  489. /*----------------------------------------------------------------------------
  490. Function Pointer: gui_set_line_height
  491. Description:      Sets the line height to use
  492. Input Parameters: height is the line height to use
  493. Output Parameters:   none
  494. Returns:       void
  495. Remarks:       In the current implemenation, line height is reset after 
  496.                every call to gui_move_text_cursor. So, this function
  497.                must be called after gui_move_text_cursor
  498. ----------------------------------------------------------------------------*/
  499. void (*gui_set_line_height) (S32 height) = NULL;
  500. /*----------------------------------------------------------------------------
  501. Function Pointer: gui_set_text_color
  502. Description:      Sets the color of text.
  503. Input Parameters: c  is the color using which the text is drawn
  504. Output Parameters:   none
  505. Returns:       void
  506. Remarks:       Affects all the text that is drawn after calling this function.
  507.                Text that was drawn before calling this function will not be affected.
  508. ----------------------------------------------------------------------------*/
  509. void (*gui_set_text_color) (color c) = NULL;
  510. /*----------------------------------------------------------------------------
  511. Function Pointer: gui_set_text_border_color
  512. Description:      Sets the border color of text.
  513. Input Parameters: c  is the color using which the text border is drawn
  514. Output Parameters:   none
  515. Returns:       void
  516. Remarks:       Affects all the text that is drawn after calling this function.
  517.                Text that was drawn before calling this function will not be affected.
  518. ----------------------------------------------------------------------------*/
  519. void (*gui_set_text_border_color) (color c) = NULL;
  520. /*----------------------------------------------------------------------------
  521. Function Pointer: gui_printf
  522. Description:      Platform's printf() function
  523. Input Parameters: Same as printf()
  524. Output Parameters:   none
  525. Returns:       Same as printf()
  526. Remarks:       The text is displayed at the current text cursor position using
  527.                the current font and text color, See gui_set_text_color(),
  528.                gui_set_font(), gui_move_text_cursor()
  529. ----------------------------------------------------------------------------*/
  530. S32(*gui_printf) (const S8 *format,...) = NULL;
  531. /*----------------------------------------------------------------------------
  532. Function Pointer: gui_sprintf
  533. Description:      Platform's sprintf() function
  534. Input Parameters: Same as sprintf()
  535. Output Parameters:   none
  536. Returns:       Same as sprintf()
  537. ----------------------------------------------------------------------------*/
  538. S32(*gui_sprintf) (UI_string_type _text, const S8 *format,...) = NULL;
  539. /*----------------------------------------------------------------------------
  540. Function Pointer: gui_print_text
  541. Description:      Displays a string.
  542. Input Parameters: _text is the text that is displayed
  543. Output Parameters:   none
  544. Returns:       void
  545. Remarks:       The text is displayed at the current text cursor position using
  546.                the current font and text color, See gui_set_text_color(),
  547.                gui_set_font(), gui_move_text_cursor()
  548. ----------------------------------------------------------------------------*/
  549. void (*gui_print_text) (UI_string_type _text) = NULL;
  550. /*----------------------------------------------------------------------------
  551. Function Pointer: gui_print_character
  552. Description:      Displays a character
  553. Input Parameters: _c    is the character that is displayed
  554. Output Parameters:   none
  555. Returns:       void
  556. Remarks:       The character is displayed at the current text cursor position using
  557.                the current font and text color, See gui_set_text_color(),
  558.                gui_set_font(), gui_move_text_cursor()
  559. ----------------------------------------------------------------------------*/
  560. void (*gui_print_character) (UI_character_type _c) = NULL;
  561. void (*gui_print_bordered_character) (UI_character_type _c) = NULL;
  562. /*----------------------------------------------------------------------------
  563. Function Pointer: gui_print_stacked_character
  564. Description:      Displays a stacked character
  565. Input Parameters: _curCh is the character that is displayed, _pre2Ch is the previous two char, and _preCh is the previous char
  566. Output Parameters:   none
  567. Returns:       void
  568. Remarks:       The displayed position is decided by previous two characters.
  569.                This function is to print the stacked character. it means that one word may
  570.                composed by several characters and be stacked up.
  571. ----------------------------------------------------------------------------*/
  572. void (*gui_print_stacked_character) (UI_character_type _curCh, UI_character_type _pre2Ch, UI_character_type _preCh) = NULL;
  573. /*----------------------------------------------------------------------------
  574. Function Pointer: gui_print_bordered_stacked_character
  575. Description:      Displays a stacked character
  576. Input Parameters: _curCh is the character that is displayed, _pre2Ch is the previous two char, and _preCh is the previous char
  577. Output Parameters:   none
  578. Returns:       void
  579. Remarks:       The displayed position is decided by previous two characters.
  580.                This function is to print the stacked character. it means that one word may
  581.                composed by several characters and be stacked up.
  582. ----------------------------------------------------------------------------*/
  583. void (*gui_print_bordered_stacked_character) (UI_character_type _curCh, UI_character_type _pre2Ch,
  584.                                               UI_character_type _preCh) = NULL;
  585. /*----------------------------------------------------------------------------
  586. Function Pointer: gui_print_bordered_text
  587. Description:      Displays a string.
  588. Input Parameters: _text is the text that is displayed
  589. Output Parameters:   none
  590. Returns:       void
  591. Remarks:       The text is displayed at the current text cursor position using
  592.                the current font and the current color and border color, See also
  593.                gui_set_font(), gui_move_text_cursor(),
  594.                gui_set_text_color(),gui_set_text_border_color()
  595. ----------------------------------------------------------------------------*/
  596. void (*gui_print_bordered_text) (UI_string_type _text) = NULL;
  597. /*----------------------------------------------------------------------------
  598. Function Pointer: gui_print_text_n
  599. Description:      Displays a string with length n.
  600. Input Parameters: _text is the text that is displayed,_n is the length to display
  601. Output Parameters:   none
  602. Returns:       void
  603. Remarks:       The text is displayed at the current text cursor position using
  604.                the current font and text color, See gui_set_text_color(),
  605.                gui_set_font(), gui_move_text_cursor()
  606. ----------------------------------------------------------------------------*/
  607. void (*gui_print_text_n) (UI_string_type _text, int _n) = NULL;
  608. /*----------------------------------------------------------------------------
  609. Function Pointer: gui_print_bordered_text_n
  610. Description:      Displays a string with length n.
  611. Input Parameters: _text is the text that is displayed,_n id the length to dusplay
  612. Output Parameters:   none
  613. Returns:       void
  614. Remarks:       The text is displayed at the current text cursor position using
  615.                the current font and the current color and border color, See also
  616.                gui_set_font(), gui_move_text_cursor(),
  617.                gui_set_text_color(),gui_set_text_border_color()
  618. ----------------------------------------------------------------------------*/
  619. void (*gui_print_bordered_text_n) (UI_string_type _text, int _n) = NULL;
  620. /*----------------------------------------------------------------------------
  621. Function Pointer: gui_push_text_clip
  622. Description:      Saves the text clipping boundary
  623. Input Parameters: none
  624. Output Parameters:   none
  625. Returns:       void
  626. Remarks:       Currently not a stack type implementation
  627. ----------------------------------------------------------------------------*/
  628. void (*gui_push_text_clip) (void) = NULL;
  629. /*----------------------------------------------------------------------------
  630. Function Pointer: gui_pop_text_clip
  631. Description:      Retrieves the text clipping boundary
  632. Input Parameters: none
  633. Output Parameters:   none
  634. Returns:       void
  635. Remarks:       Currently not a stack type implementation
  636. ----------------------------------------------------------------------------*/
  637. void (*gui_pop_text_clip) (void) = NULL;
  638. /*----------------------------------------------------------------------------
  639. Function Pointer: gui_push_clip
  640. Description:      Saves the graphics clipping boundary
  641. Input Parameters: none
  642. Output Parameters:   none
  643. Returns:       void
  644. Remarks:       Currently not a stack type implementation
  645. ----------------------------------------------------------------------------*/
  646. void (*gui_push_clip) (void) = NULL;
  647. /*----------------------------------------------------------------------------
  648. Function Pointer: gui_pop_clip
  649. Description:      Retrieves the graphics clipping boundary
  650. Input Parameters: none
  651. Output Parameters:   none
  652. Returns:       void
  653. Remarks:       Currently not a stack type implementation
  654. ----------------------------------------------------------------------------*/
  655. void (*gui_pop_clip) (void) = NULL;
  656. /*----------------------------------------------------------------------------
  657. Function Pointer: gui_malloc
  658. Description:      Same as malloc
  659. Input Parameters: Same as malloc
  660. Output Parameters:   none
  661. Returns:       Same as malloc
  662. Remarks:       All UI functions use this to allocate memory.
  663. ----------------------------------------------------------------------------*/
  664. void *(*gui_malloc) (size_t size) = NULL;
  665. /*----------------------------------------------------------------------------
  666. Function Pointer: gui_free
  667. Description:      Same as free
  668. Input Parameters: Same as free
  669. Output Parameters:   none
  670. Returns:       Same as free
  671. Remarks:       All UI functions use this to free memory.
  672. ----------------------------------------------------------------------------*/
  673. void (*gui_free) (void *ptr) = NULL;
  674. /*----------------------------------------------------------------------------
  675. Function Pointer: gui_get_character_width
  676. Description:      Returns the width of a given character in pixels
  677. Input Parameters: c  is the character whose width is to be measured
  678. Output Parameters:   none
  679. Returns:       width of the character in pixels
  680. Remarks:       This works with reference to the current font.
  681.                See gui_set_font()
  682. ----------------------------------------------------------------------------*/
  683. S32(*gui_get_character_width) (UI_character_type c) = NULL;
  684. /*----------------------------------------------------------------------------
  685. Function Pointer: gui_get_character_height
  686. Description:      Returns the height of characters in the current font
  687. Input Parameters: none
  688. Output Parameters:   none
  689. Returns:       height of the character in pixels
  690. Remarks:       This works with reference to the current font.
  691.                See gui_set_font()
  692. ----------------------------------------------------------------------------*/
  693. S32(*gui_get_character_height) (void) = NULL;
  694. /*----------------------------------------------------------------------------
  695. Function Pointer: gui_get_measure_character
  696. Description:      Returns the width and height of a given character
  697. Input Parameters: c     is the character to be measured
  698. Output Parameters:   width pointer to the width of the character in pixels
  699.                height   pointer to the height of the character in pixels
  700. Returns:       void
  701. Remarks:       This works with reference to the current font.
  702.                See gui_set_font()
  703. ----------------------------------------------------------------------------*/
  704. void (*gui_measure_character) (UI_character_type c, S32 *width, S32 *height) = NULL;
  705. /*----------------------------------------------------------------------------
  706. Function Pointer: gui_get_string_width
  707. Description:      Returns the width of a string in pixels
  708. Input Parameters: text  pointer to the string
  709. Output Parameters:   none
  710. Returns:       width of the string in pixels
  711. Remarks:       This works with reference to the current font.
  712.                See gui_set_font()
  713. ----------------------------------------------------------------------------*/
  714. S32(*gui_get_string_width) (UI_string_type text) = NULL;
  715. /*----------------------------------------------------------------------------
  716. Function Pointer: gui_get_string_height
  717. Description:      Returns the height of a string in pixels
  718. Input Parameters: text  pointer to the string
  719. Output Parameters:   none
  720. Returns:       height of the string in pixels
  721. Remarks:       This works with reference to the current font.
  722.                See gui_set_font()
  723. ----------------------------------------------------------------------------*/
  724. S32(*gui_get_string_height) (UI_string_type text) = NULL;
  725. /*----------------------------------------------------------------------------
  726. Function Pointer: gui_measure_string
  727. Description:      Returns the width and height of a string in pixels
  728. Input Parameters: text  pointer to the string
  729. Output Parameters:   width pointer to width of string in pixels
  730.                height   pointer to height of string in pixels
  731. Returns:       void
  732. Remarks:       This works with reference to the current font.
  733.                See gui_set_font()
  734. ----------------------------------------------------------------------------*/
  735. void (*gui_measure_string) (UI_string_type text, S32 *width, S32 *height) = NULL;
  736. void (*gui_measure_string_n) (UI_string_type text, S32 n, S32 *width, S32 *height) = NULL;
  737. void (*gui_measure_string_w) (UI_string_type text, S32 w, S32 *width, S32 *height) = NULL;
  738. void (*gui_measure_string_wn) (UI_string_type text, S32 w, S32 n, S32 *width, S32 *height) = NULL;
  739. /*----------------------------------------------------------------------------
  740. Function Pointer: gui_get_string_width_n
  741. Description:      Returns the width of first n characters in a string
  742. Input Parameters: text  pointer to the string
  743.                n     number of characters to measure
  744. Output Parameters:   none
  745. Returns:       width of the string in pixels
  746. Remarks:       This works with reference to the current font.
  747.                See gui_set_font()
  748. ----------------------------------------------------------------------------*/
  749. S32(*gui_get_string_width_n) (UI_string_type text, S32 n) = NULL;
  750. /*----------------------------------------------------------------------------
  751. Function Pointer: gui_get_string_width_w
  752. Description:      Returns the width of a string
  753. Input Parameters: text  pointer to the string
  754.                w     spacing between characters
  755. Output Parameters:   none
  756. Returns:       width of the string in pixels
  757. Remarks:       This works with reference to the current font.
  758.                See gui_set_font()
  759. ----------------------------------------------------------------------------*/
  760. S32(*gui_get_string_width_w) (UI_string_type text, S32 w) = NULL;
  761. /*----------------------------------------------------------------------------
  762. Function Pointer: gui_get_string_width_wn
  763. Description:      Returns the width of first n characters in a string
  764. Input Parameters: text  pointer to the string
  765.                w     spacing between characters
  766.                n     number of characters to measure
  767. Output Parameters:   none
  768. Returns:       width of the string in pixels
  769. Remarks:       This works with reference to the current font.
  770.                See gui_set_font()
  771. ----------------------------------------------------------------------------*/
  772. S32(*gui_get_string_width_wn) (UI_string_type text, S32 w, S32 n) = NULL;
  773. /*----------------------------------------------------------------------------
  774. Function Pointer: gui_strlen
  775. Description:      Returns the length of a string
  776. Input Parameters: text  pointer to the string
  777. Output Parameters:   none
  778. Returns:       number of characters in the string (Not including the terminator)
  779. Remarks:       Currently an ASCIIZ implementation. Will later support Unicode.
  780. ----------------------------------------------------------------------------*/
  781. S32(*gui_strlen) (UI_string_type text) = NULL;
  782. /*----------------------------------------------------------------------------
  783. Function Pointer: gui_strcpy
  784. Description:      Copies text2 contents into text1
  785. Input Parameters: text2 pointer to the source string
  786. Output Parameters:   text1 pointer to the destination string
  787. Returns:       pointer to the destination string
  788. Remarks:       Currently an ASCIIZ implementation. Will later support Unicode.
  789. ----------------------------------------------------------------------------*/
  790. UI_string_type(*gui_strcpy) (UI_string_type text1, UI_string_type text2) = NULL;
  791. /*----------------------------------------------------------------------------
  792. Function Pointer: gui_strncpy
  793. Description:      Copies text2 contents into text1 upto n given characters
  794. Input Parameters: text2 pointer to the source string
  795.                n     number of characters to copy
  796. Output Parameters:   text1 pointer to the destination string
  797. Returns:       pointer to the destination string
  798. Remarks:       Currently an ASCIIZ implementation. Will later support Unicode.
  799. ----------------------------------------------------------------------------*/
  800. UI_string_type(*gui_strncpy) (UI_string_type text1, UI_string_type text2, S32 n) = NULL;
  801. /*----------------------------------------------------------------------------
  802. Function Pointer: gui_strcat
  803. Description:      Copies text2 contents into text1 starting at the end of text1
  804.                (Concatenation of strings)
  805. Input Parameters: text2 pointer to the source string
  806. Output Parameters:   text1 pointer to the destination string
  807. Returns:       pointer to the destination string
  808. Remarks:       Currently an ASCIIZ implementation. Will later support Unicode.
  809. ----------------------------------------------------------------------------*/
  810. UI_string_type(*gui_strcat) (UI_string_type text1, UI_string_type text2) = NULL;
  811. /*----------------------------------------------------------------------------
  812. Function Pointer: gui_strcmp
  813. Description:      Compares two strings
  814. Input Parameters: text1 pointer to the first string
  815.                text2 pointer to the second string
  816. Output Parameters:   none
  817. Returns:       Same as strmp
  818. Remarks:       Currently an ASCIIZ implementation. Will later support Unicode.
  819. ----------------------------------------------------------------------------*/
  820. S32(*gui_strcmp) (UI_string_type text1, UI_string_type text2) = NULL;
  821. /*----------------------------------------------------------------------------
  822. Function Pointer: gui_strncmp
  823. Description:      Compares two strings upto n characters
  824. Input Parameters: text1 pointer to the first string
  825.                text2 pointer to the second string
  826.                n     Number of characters upto which to perform the comparision
  827. Output Parameters:   none
  828. Returns:       Same as strncmp
  829. Remarks:       Currently an ASCIIZ implementation. Will later support Unicode.
  830. ----------------------------------------------------------------------------*/
  831. S32(*gui_strncmp) (UI_string_type text1, UI_string_type text2, S32 n) = NULL;
  832. /*----------------------------------------------------------------------------
  833. Function Pointer: gui_memcpy
  834. Description:      Similar to memcpy
  835. Input Parameters: s     pointer to source
  836.                n     number of octets to copy
  837. Output Parameters:   d     pointer to destination
  838. Returns:       pointer to the destination string
  839. ----------------------------------------------------------------------------*/
  840. void *(*gui_memcpy) (void *d, const void *s, S32 n) = NULL;
  841. /*----------------------------------------------------------------------------
  842. Function Pointer: gui_itoa
  843. Description:      Converts an integer to a string
  844. Input Parameters: value Integer value to be converted
  845.                radix Base system to use (Ex: Decimal, Binary, Hexadecimal --etc).
  846. Output Parameters:   s     Pointer to the string into which this value is written
  847. Returns:       Same as itoa (Pointer to the string)
  848. ----------------------------------------------------------------------------*/
  849. UI_string_type(*gui_itoa) (S32 value, UI_string_type s, S32 radix) = NULL;
  850. /*----------------------------------------------------------------------------
  851. Function Pointer: gui_atoi
  852. Description:      Converts an string to a integer
  853. Input Parameters: s     Pointer to the string to be converted
  854. Output Parameters:   none
  855. Returns:       Same as atoi (An integer)
  856. ----------------------------------------------------------------------------*/
  857. S32(*gui_atoi) (UI_string_type s) = NULL;
  858. /*----------------------------------------------------------------------------
  859. Function Pointer: gui_set_font
  860. Description:      Sets the font to be used by text display functions
  861. Input Parameters: f     is the font to be used
  862. Output Parameters:   none
  863. Returns:       void
  864. Remarks:       See UI_font_type (Abstract type)
  865. ----------------------------------------------------------------------------*/
  866. void (*gui_set_font) (UI_font_type f) = NULL;
  867. /*----------------------------------------------------------------------------
  868. Function Pointer: gui_show_image
  869. Description:      Displays an image at (x,y)
  870. Input Parameters: (x,y) co-ordinates of the top left corner of the image
  871.                i     is the image to be displayed
  872. Output Parameters:   none
  873. Returns:       void
  874. Remarks:       See PU8 (Abstract type)
  875. ----------------------------------------------------------------------------*/
  876. void (*gui_show_image) (S32 x, S32 y, PU8 i) = NULL;
  877. /*----------------------------------------------------------------------------
  878. Function Pointer: gui_show_animated_image
  879. Description:      Displays an animated image at (x,y)
  880. Input Parameters: (x,y) co-ordinates of the top left corner of the image
  881.                i     is the image to be displayed
  882. Output Parameters:   none
  883. Returns:       A handle to the animated image of the type UI_animated_image_handle
  884. Remarks:       See PU8 (Abstract type)
  885.                See UI_animated_image_handle (Abstract type)
  886. ----------------------------------------------------------------------------*/
  887. /* UI_animated_image_handle     (*gui_show_animated_image)(S32 x,S32 y,PU8 i)=NULL; */
  888. /*----------------------------------------------------------------------------
  889. Function Pointer: gui_show_transparent_image
  890. Description:      Displays an image at (x,y). Omits the display of color t.
  891. Input Parameters: (x,y) co-ordinates of the top left corner of the image
  892.                i     is the image to be displayed
  893.                t     is the color in the image bitmap to consider as transparent
  894. Output Parameters:   none
  895. Returns:       void
  896. Remarks:       Used for irregular bitmaps (Some pixels in the bitmap rectangle are not drawn)
  897.                See PU8 (Abstract type)
  898.                See UI_transparent_color_type (Abstract type)
  899. ----------------------------------------------------------------------------*/
  900. void (*gui_show_transparent_image) (S32 x, S32 y, PU8 i, UI_transparent_color_type t) = NULL;
  901. /*----------------------------------------------------------------------------
  902. Function Pointer: gui_show_transparent_animated_image
  903. Description:      Displays an animated image at (x,y). Omits the display of color t.
  904. Input Parameters: (x,y) co-ordinates of the top left corner of the image
  905.                i     is the image to be displayed
  906.                t     is the color in the image bitmap to consider as transparent
  907. Output Parameters:   none
  908. Returns:       A handle to the animated image of the type UI_animated_image_handle
  909. Remarks:       Used for irregular bitmaps (Some pixels in the bitmap rectangle are not drawn)
  910.                See PU8 (Abstract type)
  911.                See UI_transparent_color_type (Abstract type)
  912.                See UI_animated_image_handle (Abstract type)
  913.                See also gui_register_hide_animation_frame()
  914. ----------------------------------------------------------------------------*/
  915. /* UI_animated_image_handle             (*gui_show_transparent_animated_image)(S32 x,S32 y,PU8 i,UI_transparent_color_type t)=NULL; */
  916. /*----------------------------------------------------------------------------
  917. Function Pointer: gui_measure_image
  918. Description:      Gets the width and height of a given image
  919. Input Parameters: i     is the image
  920. Output Parameters:   width is the width of the image in pixels
  921.                height   is the height of the image in pixels
  922. Returns:       void
  923. Remarks:       See PU8 (Abstract type)
  924. ----------------------------------------------------------------------------*/
  925. void (*gui_measure_image) (PU8 i, S32 *width, S32 *height) = NULL;
  926. /*----------------------------------------------------------------------------
  927. Function Pointer: gui_image_n_frames
  928. Description:      Gets the number of frames in the given image
  929. Input Parameters: i     is the image
  930. Output Parameters:   none
  931. Returns:       The number of frames in the image
  932. Remarks:       See PU8 (Abstract type)
  933. ----------------------------------------------------------------------------*/
  934. S32(*gui_image_n_frames) (PU8 i) = NULL;
  935. /*----------------------------------------------------------------------------
  936. Function Pointer: gui_register_hide_animation_frame
  937. Description:      Registers a function to be called to hide a frame of an animating image
  938.                Normally used for animated transparent images
  939. Input Parameters: i     is a handle to the animated image 
  940.                      (returned from gui_show_animated_image or
  941.                                  gui_show_transparent_animated_image)
  942.                f     function that is used to hide a frame
  943.                      (x1,y1,x2,y2) is the rectangular area that is drawn to hide the animated image
  944. Output Parameters:   none
  945. Returns:       void
  946. Remarks:       Note: This function may not be available in later versions
  947.                See UI_animated_image_handle (Abstract type)
  948. ----------------------------------------------------------------------------*/
  949. void (*gui_register_hide_animation_frame) (UI_animated_image_handle i, void (*f) (S32 x1, S32 y1, S32 x2, S32 y2)) =
  950.     NULL;
  951. /*----------------------------------------------------------------------------
  952. Function Pointer: gui_hide_animated_image
  953. Description:      Hides an animated image
  954. Input Parameters: (x,y) co-ordinates of the top left corner of the image
  955.                i     is a handle to the animated image 
  956.                      (returned from gui_show_animated_image or
  957.                                  gui_show_transparent_animated_image)
  958. Output Parameters:   none
  959. Returns:       void
  960. Remarks:       See PU8 (Abstract type)
  961.                See UI_animated_image_handle (Abstract type) 
  962. ----------------------------------------------------------------------------*/
  963. void (*gui_hide_animated_image) (S32 x, S32 y, UI_animated_image_handle i) = NULL;
  964. /*----------------------------------------------------------------------------
  965. Function Pointer: gui_show_transparent_animated_image_frame
  966. Description:      Displays a single frame of an animated image
  967. Input Parameters: (x,y) co-ordinates of the top left corner of the image
  968.                i     is the image
  969.                t     is the transparent color
  970.                frame_number   is the index (0 based) of the frame to display
  971. Output Parameters:   none
  972. Returns:       void
  973. Remarks:       See PU8 (Abstract type)
  974.                See UI_transparent_color (Abstract type)
  975. ----------------------------------------------------------------------------*/
  976. U8(*gui_show_transparent_animated_image_frame) (S32 x, S32 y, PU8 i, UI_transparent_color_type t, S16 frame_number) =
  977.     NULL;
  978. /*----------------------------------------------------------------------------
  979. Function Pointer: gui_show_animated_image_frame
  980. Description:      Displays a single frame of an animated image
  981. Input Parameters: (x,y) co-ordinates of the top left corner of the image
  982.                i     is the image
  983.                t     is the transparent color
  984.                frame_number   is the index (0 based) of the frame to display
  985. Output Parameters:   none
  986. Returns:       void
  987. Remarks:       See PU8 (Abstract type)
  988.                See UI_transparent_color (Abstract type)
  989. ----------------------------------------------------------------------------*/
  990. U8(*gui_show_animated_image_frame) (S32 x, S32 y, PU8 i, S16 frame_number) = NULL;
  991. /*----------------------------------------------------------------------------
  992. Function Pointer: gui_hide_animations
  993. Description:      Cancels all animations
  994. Input Parameters: none
  995. Output Parameters:   none
  996. Returns:       void
  997. ----------------------------------------------------------------------------*/
  998. void (*gui_hide_animations) (void) = NULL;
  999. #if 0
  1000. /* under construction !*/
  1001. /* under construction !*/
  1002. /* under construction !*/
  1003. /* under construction !*/
  1004. /* under construction !*/
  1005. /* under construction !*/
  1006. /* under construction !*/
  1007. /* under construction !*/
  1008. /* under construction !*/
  1009. /* under construction !*/
  1010. /* under construction !*/
  1011. /* under construction !*/
  1012. /* under construction !*/
  1013. /* under construction !*/
  1014. /* under construction !*/
  1015. /* under construction !*/
  1016. /* under construction !*/
  1017. /* under construction !*/
  1018. #endif /* 0 */ 
  1019. /*----------------------------------------------------------------------------
  1020. Function Pointer: gui_start_timer
  1021. Description:      One shot timer
  1022. Input Parameters: count    is the delay (Implementation dependent: Normally milliseconds)
  1023.                callback is the function that is called when the timer expires
  1024. Output Parameters:   none
  1025. Returns:       void
  1026. Remakrs:       NOTE: DO NOT USE UI TIMER IN CRITICAL CASES
  1027.                UI timer will be suspended when LCD backlight is turned off.
  1028. ----------------------------------------------------------------------------*/
  1029. void (*gui_start_timer) (S32 count, void (*callback) (void)) = NULL;
  1030. /*----------------------------------------------------------------------------
  1031. Function Pointer: gui_cancel_timer
  1032. Description:      Cancels a timer if it has been started for a particular call back function
  1033. Input Parameters: callback is the function that is called when the timer expires
  1034. Output Parameters:   none
  1035. Returns:       void
  1036. ----------------------------------------------------------------------------*/
  1037. void (*gui_cancel_timer) (void (*callback) (void)) = NULL;
  1038. /*----------------------------------------------------------------------------
  1039. Function Pointer: gui_transparent_color
  1040. Description:      Returns a transparent color value for given R,G,B values
  1041. Input Parameters: r     red component of a color   (0 to 255)
  1042.                g     green component of a color (0 to 255)
  1043.                b     blue component of a color  (0 to 255)
  1044. Output Parameters:   none
  1045. Returns:       Transparent color value 
  1046.                (Implementation dependent, see UI_transparent_color_type (Abstract type))
  1047. ----------------------------------------------------------------------------*/
  1048. UI_transparent_color_type(*gui_transparent_color) (U8 r, U8 g, U8 b) = NULL;
  1049. /*----------------------------------------------------------------------------
  1050. Function Pointer: gui_color
  1051. Description:      Returns a color value for given R,G,B values
  1052. Input Parameters: r     red component of a color   (0 to 255)
  1053.                g     green component of a color (0 to 255)
  1054.                b     blue component of a color  (0 to 255)
  1055. Output Parameters:   none
  1056. Returns:       color value. 
  1057.                (Implementation dependent, see color (Abstract type))
  1058. ----------------------------------------------------------------------------*/
  1059. color(*gui_color) (U8 r, U8 g, U8 b) = NULL;
  1060. /*----------------------------------------------------------------------------
  1061. Function Pointer: gui_color32
  1062. Description:      Returns a color value for given R,G,B and alpha values
  1063. Input Parameters: r     red component of a color   (0 to 255)
  1064.                g     green component of a color (0 to 255)
  1065.                b     blue component of a color  (0 to 255)
  1066.                alpha alpha value (0 to 100 in percentage)
  1067. Output Parameters:   none
  1068. Returns:       color value. 
  1069.                (Implementation dependent, see color (Abstract type))
  1070. ----------------------------------------------------------------------------*/
  1071. color(*gui_color32) (U8 r, U8 g, U8 b, U8 alpha) = NULL;
  1072. /*----------------------------------------------------------------------------
  1073. Function Pointer: gui_color_RGB
  1074. Description:      Returns the R,G,B values for a given color
  1075. Input Parameters: c     is the color
  1076. Output Parameters:   r     red component of a color   (0 to 255)
  1077.                g     green component of a color (0 to 255)
  1078.                b     blue component of a color  (0 to 255)
  1079. Returns:       void
  1080. ----------------------------------------------------------------------------*/
  1081. void (*gui_color_RGB) (color c, U8 *r, U8 *g, U8 *b) = NULL;
  1082. /* Functions added for multiple character set support. Comments will be added later */
  1083. UI_character_type(*gui_get_next_character) (UI_string_type *s) = NULL;
  1084. UI_character_type(*gui_get_previous_character) (UI_string_type *s) = NULL;
  1085. /* Functions to support double buffering. Comments will be added later  */
  1086. void (*gui_BLT_double_buffer) (S32 x1, S32 y1, S32 x2, S32 y2) = NULL;
  1087. void (*gui_lock_double_buffer) (void) = NULL;
  1088. void (*gui_unlock_double_buffer) (void) = NULL;
  1089. /* 
  1090.  * Dummy functions are called by UI elements by default. 
  1091.  * Do not remove any of these functions.  
  1092.  */
  1093. /*****************************************************************************
  1094.  * FUNCTION
  1095.  *  UI_dummy_function
  1096.  * DESCRIPTION
  1097.  *  
  1098.  * PARAMETERS
  1099.  *  void
  1100.  * RETURNS
  1101.  *  void
  1102.  *****************************************************************************/
  1103. void UI_dummy_function(void)
  1104. {
  1105.     /*----------------------------------------------------------------*/
  1106.     /* Local Variables                                                */
  1107.     /*----------------------------------------------------------------*/
  1108.     /*----------------------------------------------------------------*/
  1109.     /* Code Body                                                      */
  1110.     /*----------------------------------------------------------------*/
  1111. }
  1112. /*****************************************************************************
  1113.  * FUNCTION
  1114.  *  UI_dummy_function_byte
  1115.  * DESCRIPTION
  1116.  *  
  1117.  * PARAMETERS
  1118.  *  a       [IN]        Unused parameter
  1119.  * RETURNS
  1120.  *  void
  1121.  *****************************************************************************/
  1122. void UI_dummy_function_byte(U8 a)
  1123. {
  1124.     /*----------------------------------------------------------------*/
  1125.     /* Local Variables                                                */
  1126.     /*----------------------------------------------------------------*/
  1127.     /*----------------------------------------------------------------*/
  1128.     /* Code Body                                                      */
  1129.     /*----------------------------------------------------------------*/
  1130.     UI_UNUSED_PARAMETER(a);
  1131. }
  1132. /*****************************************************************************
  1133.  * FUNCTION
  1134.  *  UI_dummy_function_s32
  1135.  * DESCRIPTION
  1136.  *  
  1137.  * PARAMETERS
  1138.  *  a       [IN]        
  1139.  * RETURNS
  1140.  *  void
  1141.  *****************************************************************************/
  1142. void UI_dummy_function_s32(S32 a)
  1143. {
  1144.     /*----------------------------------------------------------------*/
  1145.     /* Local Variables                                                */
  1146.     /*----------------------------------------------------------------*/
  1147.     /*----------------------------------------------------------------*/
  1148.     /* Code Body                                                      */
  1149.     /*----------------------------------------------------------------*/
  1150.     UI_UNUSED_PARAMETER(a);
  1151. }
  1152. /*****************************************************************************
  1153.  * FUNCTION
  1154.  *  UI_dummy_function_character
  1155.  * DESCRIPTION
  1156.  *  
  1157.  * PARAMETERS
  1158.  *  c       [IN]        
  1159.  * RETURNS
  1160.  *  void
  1161.  *****************************************************************************/
  1162. void UI_dummy_function_character(UI_character_type c)
  1163. {
  1164.     /*----------------------------------------------------------------*/
  1165.     /* Local Variables                                                */
  1166.     /*----------------------------------------------------------------*/
  1167.     /*----------------------------------------------------------------*/
  1168.     /* Code Body                                                      */
  1169.     /*----------------------------------------------------------------*/
  1170.     UI_UNUSED_PARAMETER(c);
  1171. }
  1172. /* Some standard functions                */
  1173. /*****************************************************************************
  1174.  * FUNCTION
  1175.  *  gui_blend_two_color
  1176.  * DESCRIPTION
  1177.  *  Blend two color together.
  1178.  * PARAMETERS
  1179.  *  c1          [IN]        Color 1
  1180.  *  c2          [IN]        Color 2
  1181.  *  weight1     [IN]        Weighting of color 1
  1182.  *  weight2     [IN]        Weighting of color 2
  1183.  * RETURNS
  1184.  *  blended color
  1185.  *****************************************************************************/
  1186. color gui_blend_two_color(color c1, color c2, S32 weight1, S32 weight2)
  1187. {
  1188.     /*----------------------------------------------------------------*/
  1189.     /* Local Variables                                                */
  1190.     /*----------------------------------------------------------------*/
  1191.     color c;
  1192.     /*----------------------------------------------------------------*/
  1193.     /* Code Body                                                      */
  1194.     /*----------------------------------------------------------------*/
  1195.     c.alpha = (U8) ((weight1 * c1.alpha + weight2 * c2.alpha) / (weight1 + weight2));
  1196.     c.r = (U8) ((weight1 * c1.r + weight2 * c2.r) / (weight1 + weight2));
  1197.     c.g = (U8) ((weight1 * c1.g + weight2 * c2.g) / (weight1 + weight2));
  1198.     c.b = (U8) ((weight1 * c1.b + weight2 * c2.b) / (weight1 + weight2));
  1199.     return c;
  1200. }
  1201. /*****************************************************************************
  1202.  * FUNCTION
  1203.  *  gui_linebreak_character
  1204.  * DESCRIPTION
  1205.  *  Returns true if a given character is a line break character
  1206.  * PARAMETERS
  1207.  *  c       [IN]        Character to be tested
  1208.  * RETURNS
  1209.  *  true  if c is a line break character
  1210.  *  false if c is not a line break character
  1211.  *****************************************************************************/
  1212. U8 gui_linebreak_character(UI_character_type c)
  1213. {
  1214.     /*----------------------------------------------------------------*/
  1215.     /* Local Variables                                                */
  1216.     /*----------------------------------------------------------------*/
  1217.     /*----------------------------------------------------------------*/
  1218.     /* Code Body                                                      */
  1219.     /*----------------------------------------------------------------*/
  1220.     if ((UI_character_type) c == 'n')
  1221.     {
  1222.         return (1);
  1223.     }
  1224.     else
  1225.     {
  1226.         return (0);
  1227.     }
  1228. }
  1229. /*****************************************************************************
  1230.  * FUNCTION
  1231.  *  gui_endofstring_character
  1232.  * DESCRIPTION
  1233.  *  Returns true if a given character is an end of string character
  1234.  * PARAMETERS
  1235.  *  c       [IN]        Character to be tested
  1236.  * RETURNS
  1237.  *  true  if c is an end of string character
  1238.  *  false if c is not an end of string character
  1239.  *  See UI_character_type (Abstract type)
  1240.  *****************************************************************************/
  1241. U8 gui_endofstring_character(UI_character_type c)
  1242. {
  1243.     /*----------------------------------------------------------------*/
  1244.     /* Local Variables                                                */
  1245.     /*----------------------------------------------------------------*/
  1246.     /*----------------------------------------------------------------*/
  1247.     /* Code Body                                                      */
  1248.     /*----------------------------------------------------------------*/
  1249.     if ((UI_character_type) c == '')
  1250.     {
  1251.         return (1);
  1252.     }
  1253.     else
  1254.     {
  1255.         return (0);
  1256.     }
  1257. }
  1258. /*****************************************************************************
  1259.  * FUNCTION
  1260.  *  gui_initialize_gradient_color
  1261.  * DESCRIPTION
  1262.  *  Creates a gradient color
  1263.  *  
  1264.  *  Note: gc must be allocated before calling this function.
  1265.  * PARAMETERS
  1266.  *  gc      [OUT]       Is the gradient color      (pre-allocated)
  1267.  *  c       [IN]        Is an array of colors      (n    elements)
  1268.  *  p       [IN]        Is an array of percentages (n-1  elements)
  1269.  *  n       [IN]        Is the number of colors
  1270.  * RETURNS
  1271.  *  void
  1272.  *****************************************************************************/
  1273. void gui_initialize_gradient_color(gradient_color *gc, color *c, U8 *p, U8 n)
  1274. {
  1275.     /*----------------------------------------------------------------*/
  1276.     /* Local Variables                                                */
  1277.     /*----------------------------------------------------------------*/
  1278.     /*----------------------------------------------------------------*/
  1279.     /* Code Body                                                      */
  1280.     /*----------------------------------------------------------------*/
  1281.     gc->c = c;
  1282.     gc->p = p;
  1283.     gc->n = n;
  1284. }
  1285. /*****************************************************************************
  1286.  * FUNCTION
  1287.  *  gui_gradient_fill_rectangle
  1288.  * DESCRIPTION
  1289.  *  Gradient color fills a rectangle
  1290.  * PARAMETERS
  1291.  *  x1                                  [IN]        Left-top corner of the rectangle
  1292.  *  y1                                  [IN]        Left-top corner of the rectangle
  1293.  *  x2                                  [IN]        Right-bottom corner of the rectangle
  1294.  *  y2                                  [IN]        Right-bottom corner of the rectangle
  1295.  *  gc                                  [IN]        Is the gradient color
  1296.  *  flags                               [IN]        Can have the following values:
  1297.  * RETURNS
  1298.  *  void
  1299.  *****************************************************************************/
  1300. #if(UI_INDEXED_COLOR_SYSTEM)
  1301. void gui_gradient_fill_rectangle(S32 x1, S32 y1, S32 x2, S32 y2, gradient_color *gc, U32 flags)
  1302. {
  1303.     /*----------------------------------------------------------------*/
  1304.     /* Local Variables                                                */
  1305.     /*----------------------------------------------------------------*/
  1306.     /*----------------------------------------------------------------*/
  1307.     /* Code Body                                                      */
  1308.     /*----------------------------------------------------------------*/
  1309.     if (flags & UI_GRADIENT_COLOR_VERTICAL)
  1310.     {
  1311.         S32 fill_height = y2 - y1 + 1;
  1312.         S32 i, y_start = 0, y_end, p;
  1313.         U8 done = 0;
  1314.         color start_color, end_color;
  1315.         if (flags & UI_GRADIENT_COLOR_FLIP)
  1316.         {
  1317.             for (i = gc->n - 1; (i > 0 && !done); i--)
  1318.             {
  1319.                 start_color = gc->c[i];
  1320.                 end_color = gc->c[i - 1];
  1321.                 p = gc->p[i - 1];
  1322.                 y_end = y_start + pixtel_percent(fill_height, p);
  1323.                 if (y_end > fill_height - 1)
  1324.                 {
  1325.                     y_end = fill_height - 1;
  1326.                     done = 1;
  1327.                 }
  1328.                 gui_fill_rectangle(x1, y_start, x2, y_end, start_color);
  1329.                 y_start = y_end + 1;
  1330.             }
  1331.         }
  1332.         else
  1333.         {
  1334.             for (i = 0; (i < (gc->n - 1) && !done); i++)
  1335.             {
  1336.                 start_color = gc->c[i];
  1337.                 end_color = gc->c[i + 1];
  1338.                 p = gc->p[i];
  1339.                 y_end = y_start + pixtel_percent(fill_height, p);
  1340.                 if (y_end > fill_height - 1)
  1341.                 {
  1342.                     y_end = fill_height - 1;
  1343.                     done = 1;
  1344.                 }
  1345.                 gui_fill_rectangle(x1, y_start, x2, y_end, start_color);
  1346.                 y_start = y_end + 1;
  1347.             }
  1348.         }
  1349.     }
  1350.     else
  1351.     {
  1352.         S32 fill_width = x2 - x1 + 1;
  1353.         S32 i, x_start = 0, x_end, p;
  1354.         U8 done = 0;
  1355.         color start_color, end_color;
  1356.         if (flags & UI_GRADIENT_COLOR_FLIP)
  1357.         {
  1358.             for (i = gc->n - 1; (i > 0 && !done); i--)
  1359.             {
  1360.                 start_color = gc->c[i];
  1361.                 end_color = gc->c[i - 1];
  1362.                 p = gc->p[i - 1];
  1363.                 x_end = x_start + pixtel_percent(fill_width, p);
  1364.                 if (x_end > fill_width - 1)
  1365.                 {
  1366.                     x_end = fill_width - 1;
  1367.                     done = 1;
  1368.                 }
  1369.                 gui_fill_rectangle(x_start, y1, x_end, y2, start_color);
  1370.                 x_start = x_end + 1;
  1371.             }
  1372.         }
  1373.         else
  1374.         {
  1375.             for (i = 0; (i < (gc->n - 1) && !done); i++)
  1376.             {
  1377.                 start_color = gc->c[i];
  1378.                 end_color = gc->c[i + 1];
  1379.                 p = gc->p[i];
  1380.                 x_end = x_start + pixtel_percent(fill_width, p);
  1381.                 if (x_end > fill_width - 1)
  1382.                 {
  1383.                     x_end = fill_width - 1;
  1384.                     done = 1;
  1385.                 }
  1386.                 gui_fill_rectangle(x_start, y1, x_end, y2, start_color);
  1387.                 x_start = x_end + 1;
  1388.             }
  1389.         }
  1390.     }
  1391. }
  1392. #else /* (UI_INDEXED_COLOR_SYSTEM) */ 
  1393. void gui_gradient_fill_rectangle(S32 x1, S32 y1, S32 x2, S32 y2, gradient_color *gc, U32 flags)
  1394. {
  1395.     /*----------------------------------------------------------------*/
  1396.     /* Local Variables                                                */
  1397.     /*----------------------------------------------------------------*/
  1398.     /*----------------------------------------------------------------*/
  1399.     /* Code Body                                                      */
  1400.     /*----------------------------------------------------------------*/
  1401.     if (flags & UI_GRADIENT_COLOR_VERTICAL)
  1402.     {
  1403.         S32 fill_height = y2 - y1 + 1;
  1404.         S32 i, y_start = 0, y_end, p, y;
  1405.         FLOAT ir, ig, ib, divisor;
  1406.         FLOAT tr, tg, tb;
  1407.         U8 done = 0;
  1408.         color start_color, end_color, c;
  1409.         if (flags & UI_GRADIENT_COLOR_FLIP)
  1410.         {
  1411.             for (i = gc->n - 1; (i > 0 && !done); i--)
  1412.             {
  1413.                 start_color = gc->c[i];
  1414.                 end_color = gc->c[i - 1];
  1415.                 p = gc->p[i - 1];
  1416.                 y_end = y_start + pixtel_percent(fill_height, p);
  1417.                 if (y_end > fill_height - 1)
  1418.                 {
  1419.                     y_end = fill_height - 1;
  1420.                     done = 1;
  1421.                 }
  1422.                 divisor = (FLOAT) (y_end - y_start) + 1;
  1423.                 if (divisor == 0)
  1424.                 {
  1425.                     divisor = 1;
  1426.                 }
  1427.                 ir = -(start_color.r - end_color.r) / divisor;
  1428.                 ig = -(start_color.g - end_color.g) / divisor;
  1429.                 ib = -(start_color.b - end_color.b) / divisor;
  1430.                 tr = c.r = start_color.r;
  1431.                 tg = c.g = start_color.g;
  1432.                 tb = c.b = start_color.b;
  1433.                 c.alpha = start_color.alpha;
  1434.                 for (y = y_start; y <= y_end; y++)
  1435.                 {
  1436.                     gui_draw_horizontal_line(x1, x2, y + y1, c);
  1437.                     tr += ir;
  1438.                     tg += ig;
  1439.                     tb += ib;
  1440.                     c.r = (S8) tr;
  1441.                     c.g = (S8) tg;
  1442.                     c.b = (S8) tb;
  1443.                 }
  1444.                 y_start = y_end + 1;
  1445.             }
  1446.         }
  1447.         else
  1448.         {
  1449.             for (i = 0; (i < (gc->n - 1) && !done); i++)
  1450.             {
  1451.                 start_color = gc->c[i];
  1452.                 end_color = gc->c[i + 1];
  1453.                 p = gc->p[i];
  1454.                 y_end = y_start + pixtel_percent(fill_height, p);
  1455.                 if (y_end > fill_height - 1)
  1456.                 {
  1457.                     y_end = fill_height - 1;
  1458.                     done = 1;
  1459.                 }
  1460.                 divisor = (FLOAT) (y_end - y_start) + 1;
  1461.                 if (divisor == 0)
  1462.                 {
  1463.                     divisor = 1;
  1464.                 }
  1465.                 ir = -(start_color.r - end_color.r) / divisor;
  1466.                 ig = -(start_color.g - end_color.g) / divisor;
  1467.                 ib = -(start_color.b - end_color.b) / divisor;
  1468.                 tr = c.r = start_color.r;
  1469.                 tg = c.g = start_color.g;
  1470.                 tb = c.b = start_color.b;
  1471.                 c.alpha = start_color.alpha;
  1472.                 for (y = y_start; y <= y_end; y++)
  1473.                 {
  1474.                     gui_draw_horizontal_line(x1, x2, y + y1, c);
  1475.                     tr += ir;
  1476.                     tg += ig;
  1477.                     tb += ib;
  1478.                     c.r = (S8) tr;
  1479.                     c.g = (S8) tg;
  1480.                     c.b = (S8) tb;
  1481.                 }
  1482.                 y_start = y_end + 1;
  1483.             }
  1484.         }
  1485.     }
  1486.     else
  1487.     {
  1488.         S32 fill_width = x2 - x1 + 1;
  1489.         S32 i, x_start = 0, x_end, p, x;
  1490.         FLOAT ir, ig, ib, divisor;
  1491.         FLOAT tr, tg, tb;
  1492.         U8 done = 0;
  1493.         color start_color, end_color, c;
  1494.         if (flags & UI_GRADIENT_COLOR_FLIP)
  1495.         {
  1496.             for (i = gc->n - 1; (i > 0 && !done); i--)
  1497.             {
  1498.                 start_color = gc->c[i];
  1499.                 end_color = gc->c[i - 1];
  1500.                 p = gc->p[i - 1];
  1501.                 x_end = x_start + pixtel_percent(fill_width, p);
  1502.                 if (x_end > fill_width - 1)
  1503.                 {
  1504.                     x_end = fill_width - 1;
  1505.                     done = 1;
  1506.                 }
  1507.                 divisor = (FLOAT) (x_end - x_start) + 1;
  1508.                 if (divisor == 0)
  1509.                 {
  1510.                     divisor = 1;
  1511.                 }
  1512.                 ir = -(start_color.r - end_color.r) / divisor;
  1513.                 ig = -(start_color.g - end_color.g) / divisor;
  1514.                 ib = -(start_color.b - end_color.b) / divisor;
  1515.                 tr = c.r = start_color.r;
  1516.                 tg = c.g = start_color.g;
  1517.                 tb = c.b = start_color.b;
  1518.                 c.alpha = start_color.alpha;
  1519.                 for (x = x_start; x <= x_end; x++)
  1520.                 {
  1521.                     gui_draw_vertical_line(y1, y2, x + x1, c);
  1522.                     tr += ir;
  1523.                     tg += ig;
  1524.                     tb += ib;
  1525.                     c.r = (S8) tr;
  1526.                     c.g = (S8) tg;
  1527.                     c.b = (S8) tb;
  1528.                 }
  1529.                 x_start = x_end + 1;
  1530.             }
  1531.         }
  1532.         else
  1533.         {
  1534.             for (i = 0; (i < (gc->n - 1) && !done); i++)
  1535.             {
  1536.                 start_color = gc->c[i];
  1537.                 end_color = gc->c[i + 1];
  1538.                 p = gc->p[i];
  1539.                 x_end = x_start + pixtel_percent(fill_width, p);
  1540.                 if (x_end > fill_width - 1)
  1541.                 {
  1542.                     x_end = fill_width - 1;
  1543.                     done = 1;
  1544.                 }
  1545.                 divisor = (FLOAT) (x_end - x_start) + 1;
  1546.                 if (divisor == 0)
  1547.                 {
  1548.                     divisor = 1;
  1549.                 }
  1550.                 ir = -(start_color.r - end_color.r) / divisor;
  1551.                 ig = -(start_color.g - end_color.g) / divisor;
  1552.                 ib = -(start_color.b - end_color.b) / divisor;
  1553.                 tr = c.r = start_color.r;
  1554.                 tg = c.g = start_color.g;
  1555.                 tb = c.b = start_color.b;
  1556.                 c.alpha = start_color.alpha;
  1557.                 for (x = x_start; x <= x_end; x++)
  1558.                 {
  1559.                     gui_draw_vertical_line(y1, y2, x + x1, c);
  1560.                     tr += ir;
  1561.                     tg += ig;
  1562.                     tb += ib;
  1563.                     c.r = (S8) tr;
  1564.                     c.g = (S8) tg;
  1565.                     c.b = (S8) tb;
  1566.                 }
  1567.                 x_start = x_end + 1;
  1568.             }
  1569.         }
  1570.     }
  1571. }
  1572. #endif /* (UI_INDEXED_COLOR_SYSTEM) */ 
  1573. /*****************************************************************************
  1574.  * FUNCTION
  1575.  *  gui_transparent_texture_fill_rectangle
  1576.  * DESCRIPTION
  1577.  *  Texture fills a rectangle
  1578.  * PARAMETERS
  1579.  *  x1          [IN]        Left-top corner of the rectangle
  1580.  *  y1          [IN]        Left-top corner of the rectangle
  1581.  *  x2          [IN]        Right-bottom corner of the rectangle
  1582.  *  y2          [IN]        Right-bottom corner of the rectangle
  1583.  *  image       [IN]        Is the texture to use (repeating pattern bitmap)
  1584.  *  t           [IN]        Color which should be considered as transparent
  1585.  * RETURNS
  1586.  *  void
  1587.  *****************************************************************************/
  1588. void gui_transparent_texture_fill_rectangle(S32 x1, S32 y1, S32 x2, S32 y2, PU8 image, UI_transparent_color_type t)
  1589. {
  1590.     /*----------------------------------------------------------------*/
  1591.     /* Local Variables                                                */
  1592.     /*----------------------------------------------------------------*/
  1593.     S32 ysize = y2 - y1 + 1;
  1594.     S32 xsize = x2 - x1 + 1;
  1595.     S32 i, j, txsize, tysize;
  1596.     /*----------------------------------------------------------------*/
  1597.     /* Code Body                                                      */
  1598.     /*----------------------------------------------------------------*/
  1599.     gui_measure_image(image, &txsize, &tysize);
  1600.     gui_push_clip();
  1601.     gui_set_clip_preset(x1, y1, x2, y2);
  1602.     for (j = 0; j < ysize; j += tysize)
  1603.     {
  1604.         for (i = 0; i < xsize; i += txsize)
  1605.         {
  1606.             gui_show_transparent_image(x1 + i, y1 + j, image, t);
  1607.         }
  1608.     }
  1609.     gui_pop_clip();
  1610. }
  1611. /*****************************************************************************
  1612.  * FUNCTION
  1613.  *  gui_texture_fill_rectangle
  1614.  * DESCRIPTION
  1615.  *  Texture fills a rectangle
  1616.  * PARAMETERS
  1617.  *  x1          [IN]        Left-top corner of the rectangle
  1618.  *  y1          [IN]        Left-top corner of the rectangle
  1619.  *  x2          [IN]        Right-bottom corner of the rectangle
  1620.  *  y2          [IN]        Right-bottom corner of the rectangle
  1621.  *  image       [IN]        Is the texture to use (repeating pattern bitmap)
  1622.  * RETURNS
  1623.  *  void
  1624.  *****************************************************************************/
  1625. void gui_texture_fill_rectangle(S32 x1, S32 y1, S32 x2, S32 y2, PU8 image)
  1626. {
  1627.     /*----------------------------------------------------------------*/
  1628.     /* Local Variables                                                */
  1629.     /*----------------------------------------------------------------*/
  1630.     S32 ysize = y2 - y1 + 1;
  1631.     S32 xsize = x2 - x1 + 1;
  1632.     S32 i, j, txsize, tysize;
  1633.     /*----------------------------------------------------------------*/
  1634.     /* Code Body                                                      */
  1635.     /*----------------------------------------------------------------*/
  1636.     gui_measure_image(image, &txsize, &tysize);
  1637.     gui_push_clip();
  1638.     gui_set_clip_preset(x1, y1, x2, y2);
  1639.     for (j = 0; j < ysize; j += tysize)
  1640.     {
  1641.         for (i = 0; i < xsize; i += txsize)
  1642.         {
  1643.             gui_show_image(x1 + i, y1 + j, image);
  1644.         }
  1645.     }
  1646.     gui_pop_clip();
  1647. }
  1648. /*****************************************************************************
  1649.  * FUNCTION
  1650.  *  gui_greyscale_rectangle
  1651.  * DESCRIPTION
  1652.  *  Greyscale the assigned region
  1653.  * PARAMETERS
  1654.  *  x1              [IN]        Left-top corner of the rectangle
  1655.  *  y1              [IN]        Left-top corner of the rectangle
  1656.  *  x2              [IN]        Right-bottom corner of the rectangle
  1657.  *  y2              [IN]        Right-bottom corner of the rectangle
  1658.  *  white_value     [IN]        0~255 change the gamma value of the region
  1659.  *  black_value     [IN]        0~255 change the darkness of the region
  1660.  * RETURNS
  1661.  *  void
  1662.  *****************************************************************************/
  1663. /* void gui_greyscale_rectangle(S32 x1,S32 y1,S32 x2,S32 y2, S32 white_value) */
  1664. void gui_greyscale_rectangle(S32 x1, S32 y1, S32 x2, S32 y2, S32 white_value, S32 black_value)
  1665. {
  1666.     /*----------------------------------------------------------------*/
  1667.     /* Local Variables                                                */
  1668.     /*----------------------------------------------------------------*/
  1669.     /*----------------------------------------------------------------*/
  1670.     /* Code Body                                                      */
  1671.     /*----------------------------------------------------------------*/
  1672.     if ( x1 == 0 && y1 == 0 && x2 >= UI_device_width - 1 && y2 >= UI_device_height - 1 )
  1673.     {
  1674.         gdi_layer_apply_gray_effect();
  1675.     }
  1676.     else
  1677.     {
  1678.         gdi_draw_greyscale_rect(x1, y1, x2, y2, white_value, black_value);
  1679.     }
  1680. }
  1681. /* array storing the color bit values used for calculating the gradient color */
  1682. S32 rounded_corner_color_bit[6][6] = 
  1683.     {0, 0, 0, 0, 0, 1},
  1684.     {0, 0, 0, 1, 1, 1},
  1685.     {0, 0, 1, 1, 1, 2},
  1686.     {0, 1, 1, 2, 2, 3},
  1687.     {0, 1, 1, 2, 3, 4},
  1688.     {1, 1, 2, 3, 4, 5}
  1689. };
  1690. /*****************************************************************************
  1691.  * FUNCTION
  1692.  *  gui_draw_rounded_corner
  1693.  * DESCRIPTION
  1694.  *  This function will draw the gradient rounded corner of the rectangle
  1695.  * PARAMETERS
  1696.  *  x1                      [IN]        
  1697.  *  y1                      [IN]        
  1698.  *  size                    [IN]        
  1699.  *  rect_color_start        [IN]        It specifies the outermost start color of the border.
  1700.  *  rect_color_end          [IN]        It specifies the innermost end color of the border.
  1701.  *  level                   [IN]        Levels of different colors
  1702.  *  corner_style            [IN]        It specifies the corner of the rectangle.
  1703.  * RETURNS
  1704.  *  void
  1705.  *****************************************************************************/
  1706. void gui_draw_rounded_corner(
  1707.         S32 x1,
  1708.         S32 y1,
  1709.         S32 size,
  1710.         color rect_color_start,
  1711.         color rect_color_end,
  1712.         S32 level,
  1713.         mmi_gradient_rect_rounded_corner_style_enum corner_style)
  1714. {
  1715.     /*----------------------------------------------------------------*/
  1716.     /* Local Variables                                                */
  1717.     /*----------------------------------------------------------------*/
  1718.     S32 x2, y2, i, j, color_percentage;
  1719.     S32 increment;
  1720.     color result;
  1721.     /*----------------------------------------------------------------*/
  1722.     /* Code Body                                                      */
  1723.     /*----------------------------------------------------------------*/
  1724.     /* if (size == 0)//now only support fixed size with 6 pixels */
  1725.     size = 6;
  1726.     x2 = x1 + size - 1;
  1727.     y2 = y1 + size - 1;
  1728.     /* if (level == 0) */
  1729.     level = 5;
  1730.     increment = 100 / level;
  1731.     switch (corner_style)
  1732.     {
  1733.         case MMI_GRADIENT_RECT_ROUNDED_CORNER_TOP_LEFT:
  1734.         {
  1735.             for (i = y1; i <= y2; i++)
  1736.             {
  1737.                 for (j = x1; j <= x2; j++)
  1738.                 {
  1739.                     if ((rounded_corner_color_bit[i - y1][j - x1] > 0))
  1740.                     {
  1741.                         color_percentage = 100 - ((rounded_corner_color_bit[i - y1][j - x1]) - 1) * increment;
  1742.                         result = gui_blend_two_color(
  1743.                                     rect_color_start,
  1744.                                     rect_color_end,
  1745.                                     color_percentage,
  1746.                                     100 - color_percentage);
  1747.                         gui_putpixel(j, i, result);
  1748.                     }
  1749.                 }
  1750.             }
  1751.             break;
  1752.         }
  1753.         case MMI_GRADIENT_RECT_ROUNDED_CORNER_TOP_RIGHT:
  1754.         {
  1755.             for (i = y1; i <= y2; i++)
  1756.             {
  1757.                 for (j = x1; j <= x2; j++)
  1758.                 {
  1759.                     if ((rounded_corner_color_bit[x2 - j][i - y1] > 0))
  1760.                     {
  1761.                         color_percentage = 100 - ((rounded_corner_color_bit[x2 - j][i - y1]) - 1) * increment;
  1762.                         result = gui_blend_two_color(
  1763.                                     rect_color_start,
  1764.                                     rect_color_end,
  1765.                                     color_percentage,
  1766.                                     100 - color_percentage);
  1767.                         gui_putpixel(j, i, result);
  1768.                     }
  1769.                 }
  1770.             }
  1771.             break;
  1772.         }
  1773.         case MMI_GRADIENT_RECT_ROUNDED_CORNER_BOTTOM_LEFT:
  1774.         {
  1775.             for (i = y1; i <= y2; i++)
  1776.             {
  1777.                 for (j = x1; j <= x2; j++)
  1778.                 {
  1779.                     if ((rounded_corner_color_bit[j - x1][y2 - i] > 0))
  1780.                     {
  1781.                         color_percentage = 100 - ((rounded_corner_color_bit[j - x1][y2 - i]) - 1) * increment;
  1782.                         result = gui_blend_two_color(
  1783.                                     rect_color_start,
  1784.                                     rect_color_end,
  1785.                                     color_percentage,
  1786.                                     100 - color_percentage);
  1787.                         gui_putpixel(j, i, result);
  1788.                     }
  1789.                 }
  1790.             }
  1791.             break;
  1792.         }
  1793.         case MMI_GRADIENT_RECT_ROUNDED_CORNER_BOTTOM_RIGHT:
  1794.         {
  1795.             for (i = y1; i <= y2; i++)
  1796.             {
  1797.                 for (j = x1; j <= x2; j++)
  1798.                 {
  1799.                     if ((rounded_corner_color_bit[x2 - j][y2 - i] > 0))
  1800.                     {
  1801.                         color_percentage = 100 - ((rounded_corner_color_bit[x2 - j][y2 - i]) - 1) * increment;
  1802.                         result = gui_blend_two_color(
  1803.                                     rect_color_start,
  1804.                                     rect_color_end,
  1805.                                     color_percentage,
  1806.                                     100 - color_percentage);
  1807.                         gui_putpixel(j, i, result);
  1808.                     }
  1809.                 }
  1810.             }
  1811.             break;
  1812.         }
  1813.     }
  1814. }
  1815. /*****************************************************************************
  1816.  * FUNCTION
  1817.  *  gui_draw_gradient_rounded_rectangle
  1818.  * DESCRIPTION
  1819.  *  This function is used to draw the rounded rectangle with gradient border.
  1820.  * PARAMETERS
  1821.  *  x1                  [IN]        Left-top coordinate of the rectangle.
  1822.  *  y1                  [IN]        
  1823.  *  x2                  [IN]        Bottom-right coordinate of the rectangle.
  1824.  *  y2                  [IN]        
  1825.  *  start_color         [IN]        It specifies the outermost start color of the border.
  1826.  *  end_color           [IN]        It specifies the innermost end color of the border.
  1827.  *  border_width        [IN]        It specifies the width of the border.
  1828.  * RETURNS
  1829.  *  void
  1830.  *****************************************************************************/
  1831. void gui_draw_gradient_rounded_rectangle(
  1832.         S32 x1,
  1833.         S32 y1,
  1834.         S32 x2,
  1835.         S32 y2,
  1836.         color start_color,
  1837.         color end_color,
  1838.         S32 border_width)
  1839. {
  1840.     /*----------------------------------------------------------------*/
  1841.     /* Local Variables                                                */
  1842.     /*----------------------------------------------------------------*/
  1843.     S32 width = border_width;
  1844.     /*----------------------------------------------------------------*/
  1845.     /* Code Body                                                      */
  1846.     /*----------------------------------------------------------------*/
  1847.     //currently the width is hardcoded to 6. It will be removed later.
  1848.     //if (width == 0)
  1849.     width = 6;
  1850.     /* fill the inner rectanlgle */
  1851.     gui_fill_rectangle(x1 + width, y1 + width, x2 - width, y2 - width, end_color);
  1852.     /* draw the top horizontal gradient border */
  1853.     gdi_draw_gradient_rect(
  1854.         x1 + width,
  1855.         y1,
  1856.         x2 - width,
  1857.         y1 + width,
  1858.         gdi_act_color_from_rgb(start_color.alpha, start_color.r, start_color.g, start_color.b),
  1859.         gdi_act_color_from_rgb(end_color.alpha, end_color.r, end_color.g, end_color.b),
  1860.         0,
  1861.         0,
  1862.         GDI_GRADIENT_RECT_VER);
  1863.     /* draw the bottom horizontal gradient border */
  1864.     gdi_draw_gradient_rect(
  1865.         x1 + width,
  1866.         y2 - width,
  1867.         x2 - width,
  1868.         y2,
  1869.         gdi_act_color_from_rgb(end_color.alpha, end_color.r, end_color.g, end_color.b),
  1870.         gdi_act_color_from_rgb(start_color.alpha, start_color.r, start_color.g, start_color.b),
  1871.         0,
  1872.         0,
  1873.         GDI_GRADIENT_RECT_VER);
  1874.     /* draw the left vertical gradient border */
  1875.     gdi_draw_gradient_rect(
  1876.         x1,
  1877.         y1 + width,
  1878.         x1 + width,
  1879.         y2 - width,
  1880.         gdi_act_color_from_rgb(start_color.alpha, start_color.r, start_color.g, start_color.b),
  1881.         gdi_act_color_from_rgb(end_color.alpha, end_color.r, end_color.g, end_color.b),
  1882.         0,
  1883.         0,
  1884.         GDI_GRADIENT_RECT_HOR);
  1885.     /* draw the right vertical gradient border */
  1886.     gdi_draw_gradient_rect(
  1887.         x2 - width,
  1888.         y1 + width,
  1889.         x2,
  1890.         y2 - width,
  1891.         gdi_act_color_from_rgb(end_color.alpha, end_color.r, end_color.g, end_color.b),
  1892.         gdi_act_color_from_rgb(start_color.alpha, start_color.r, start_color.g, start_color.b),
  1893.         0,
  1894.         0,
  1895.         GDI_GRADIENT_RECT_HOR);
  1896.     /* draw the top left gradient corner border */
  1897.     gui_draw_rounded_corner(x1, y1, 0, start_color, end_color, 0, MMI_GRADIENT_RECT_ROUNDED_CORNER_TOP_LEFT);
  1898.     /* draw the top right gradient corner border */
  1899.     gui_draw_rounded_corner(
  1900.         x2 - width + 1,
  1901.         y1,
  1902.         0,
  1903.         start_color,
  1904.         end_color,
  1905.         0,
  1906.         MMI_GRADIENT_RECT_ROUNDED_CORNER_TOP_RIGHT);
  1907.     /* draw the bottom left gradient corner border */
  1908.     gui_draw_rounded_corner(
  1909.         x1,
  1910.         y2 - width + 1,
  1911.         0,
  1912.         start_color,
  1913.         end_color,
  1914.         0,
  1915.         MMI_GRADIENT_RECT_ROUNDED_CORNER_BOTTOM_LEFT);
  1916.     /* draw the bottom right gradient corner border */
  1917.     gui_draw_rounded_corner(
  1918.         x2 - width + 1,
  1919.         y2 - width + 1,
  1920.         0,
  1921.         start_color,
  1922.         end_color,
  1923.         0,
  1924.         MMI_GRADIENT_RECT_ROUNDED_CORNER_BOTTOM_RIGHT);
  1925. }
  1926. /* 
  1927.  * HLS colorspace
  1928.  * http://en.wikipedia.org/wiki/HSV_color_space
  1929.  * http://en.wikipedia.org/wiki/HLS_color_space
  1930.  */
  1931. #define COLOR_MAX(a, b)    ((a) >= (b) ? (a) : (b))
  1932. #define COLOR_MIN(a, b)    ((a) >= (b) ? (b) : (a))
  1933. #define COLOR_MAX3(r, g, b)   COLOR_MAX(COLOR_MAX((r), (g)), (b))
  1934. #define COLOR_MIN3(r, g, b)   COLOR_MIN(COLOR_MIN((r), (g)), (b))
  1935. #define UI_UNDEFINED_HUE      0x0FFF
  1936. #if !defined(__MTK_TARGET__)
  1937. /* Round to integer */
  1938. #define RINT gui_util_rint
  1939. #else /* !defined(__MTK_TARGET__) */ 
  1940. #define RINT rint
  1941. #endif /* !defined(__MTK_TARGET__) */ 
  1942. /*****************************************************************************
  1943.  * FUNCTION
  1944.  *  gui_util_fix_short_integer_bound
  1945.  * DESCRIPTION
  1946.  *  
  1947.  * PARAMETERS
  1948.  *  v           [OUT]         
  1949.  *  min         [IN]        
  1950.  *  max         [IN]        
  1951.  * RETURNS
  1952.  *  void
  1953.  *****************************************************************************/
  1954. static void gui_util_fix_short_integer_bound(S16 *v, S16 min, S16 max)
  1955. {
  1956.     /*----------------------------------------------------------------*/
  1957.     /* Local Variables                                                */
  1958.     /*----------------------------------------------------------------*/
  1959.     /*----------------------------------------------------------------*/
  1960.     /* Code Body                                                      */
  1961.     /*----------------------------------------------------------------*/
  1962.     if (*v < min)
  1963.     {
  1964.         *v = min;
  1965.     }
  1966.     else if (*v > max)
  1967.     {
  1968.         *v = max;
  1969.     }
  1970. }
  1971. #if !defined(__MTK_TARGET__)
  1972. /* Round floating point to nearest integer */
  1973. /*****************************************************************************
  1974.  * FUNCTION
  1975.  *  gui_util_rint
  1976.  * DESCRIPTION
  1977.  *  
  1978.  * PARAMETERS
  1979.  *  d       [IN]        
  1980.  * RETURNS
  1981.  *  
  1982.  *****************************************************************************/
  1983. static double gui_util_rint(double d)
  1984. {
  1985.     /*----------------------------------------------------------------*/
  1986.     /* Local Variables                                                */
  1987.     /*----------------------------------------------------------------*/
  1988.     double m = fmod(d, 1.0);
  1989.     /*----------------------------------------------------------------*/
  1990.     /* Code Body                                                      */
  1991.     /*----------------------------------------------------------------*/
  1992.     if (m < 0.5)
  1993.     {
  1994.         return floor(d);
  1995.     }
  1996.     else
  1997.     {
  1998.         return ceil(d);
  1999.     }
  2000. }
  2001. #endif /* !defined(__MTK_TARGET__) */ 
  2002. /* FIXME. Add Alpha value in UI_HLS_color */
  2003. /*****************************************************************************
  2004.  * FUNCTION
  2005.  *  gui_RGB_to_HLS
  2006.  * DESCRIPTION
  2007.  *  
  2008.  * PARAMETERS
  2009.  *  rgb     [IN]        
  2010.  *  hls     [OUT]         
  2011.  * RETURNS
  2012.  *  void
  2013.  *****************************************************************************/
  2014. void gui_RGB_to_HLS(color rgb, UI_HLS_color *hls)
  2015. {
  2016.     /*----------------------------------------------------------------*/
  2017.     /* Local Variables                                                */
  2018.     /*----------------------------------------------------------------*/
  2019.     double r, g, b; /* 0-1.0 */
  2020.     double mx /* max of r,g,b */ , mn /* min of r.g.b */ , md /* diff of min/max */ ;
  2021.     U8 max_rgb;     /* 0-255 */
  2022.     S16 h, l, s;    /* Use S16 to prevent overflow */
  2023.     /*----------------------------------------------------------------*/
  2024.     /* Code Body                                                      */
  2025.     /*----------------------------------------------------------------*/
  2026.     r = (double)rgb.r / 255.0;
  2027.     g = (double)rgb.g / 255.0;
  2028.     b = (double)rgb.b / 255.0;
  2029.     mx = COLOR_MAX3(r, g, b);
  2030.     mn = COLOR_MIN3(r, g, b);
  2031.     md = mx - mn;
  2032.     l = (S16) RINT((mx + mn) * 255.0 / 2.0);    /* 0-255 */
  2033.     if (md == 0.0)
  2034.     {
  2035.         h = UI_UNDEFINED_HUE;
  2036.         s = 0;
  2037.     }
  2038.     else
  2039.     {
  2040.         if (l <= 127)
  2041.         {
  2042.             s = (S16) RINT(md * 255.0 / (mx + mn));
  2043.         }
  2044.         else
  2045.         {
  2046.             s = (S16) RINT(md * 255.0 / (2.0 - mx - mn));
  2047.         }
  2048.         r = (((mx - r) * 60.0) + (md * 180.0)) / md;
  2049.         g = (((mx - g) * 60.0) + (md * 180.0)) / md;
  2050.         b = (((mx - b) * 60.0) + (md * 180.0)) / md;
  2051.         max_rgb = (U8) COLOR_MAX3(rgb.r, rgb.g, rgb.b);
  2052.         if (rgb.r == max_rgb)
  2053.         {
  2054.             h = (S16) RINT(b - g);
  2055.         }
  2056.         else if (rgb.g == max_rgb)
  2057.         {
  2058.             h = (S16) RINT(r - b + 120.0);
  2059.         }
  2060.         else
  2061.         {
  2062.             h = (S16) RINT(g - r + 240.0);
  2063.         }
  2064.     }
  2065.     gui_util_fix_short_integer_bound(&l, 0, 255);
  2066.     gui_util_fix_short_integer_bound(&s, 0, 255);
  2067.     if (h != UI_UNDEFINED_HUE)
  2068.     {
  2069.         if (h >= 360)
  2070.         {
  2071.             h -= 360;
  2072.         }
  2073.         if (h < 0)
  2074.         {
  2075.             h += 360;
  2076.         }
  2077.     }
  2078.     hls->l = (U8) l;
  2079.     hls->s = (U8) s;
  2080.     hls->h = (U16) h;
  2081. }
  2082. /*****************************************************************************
  2083.  * FUNCTION
  2084.  *  gui_util_hue_to_RGB
  2085.  * DESCRIPTION
  2086.  *  Convert HLS color to RGB colorspace
  2087.  * PARAMETERS
  2088.  *  v1          [IN]        
  2089.  *  v2          [IN]        
  2090.  *  vh          [IN]        
  2091.  * RETURNS
  2092.  *  void
  2093.  *****************************************************************************/
  2094. static double gui_util_hue_to_RGB(double v1, double v2, double vh)
  2095. {
  2096.     /*----------------------------------------------------------------*/
  2097.     /* Local Variables                                                */
  2098.     /*----------------------------------------------------------------*/
  2099.     /*----------------------------------------------------------------*/
  2100.     /* Code Body                                                      */
  2101.     /*----------------------------------------------------------------*/
  2102.     if (vh < 0)
  2103.     {
  2104.         vh += 1.0;
  2105.     }
  2106.     if (vh > 1)
  2107.     {
  2108.         vh -= 1.0;
  2109.     }
  2110.     if ((6.0 * vh) < 1.0)
  2111.     {
  2112.         return v1 + (v2 - v1) * 6.0 * vh;
  2113.     }
  2114.     if ((2.0 * vh) < 1.0)
  2115.     {
  2116.         return v2;
  2117.     }
  2118.     if ((3.0 * vh) < 2.0)
  2119.     {
  2120.         return v1 + (v2 - v1) * ((2.0 / 3.0) - vh) * 6.0;
  2121.     }
  2122.     return v1;
  2123. }
  2124. /*****************************************************************************
  2125.  * FUNCTION
  2126.  *  gui_HLS_to_RGB
  2127.  * DESCRIPTION
  2128.  *  
  2129.  * PARAMETERS
  2130.  *  hls     [IN]        
  2131.  *  rgb     [OUT]         
  2132.  * RETURNS
  2133.  *  void
  2134.  *****************************************************************************/
  2135. void gui_HLS_to_RGB(UI_HLS_color hls, color *rgb)
  2136. {
  2137.     /*----------------------------------------------------------------*/
  2138.     /* Local Variables                                                */
  2139.     /*----------------------------------------------------------------*/
  2140.     double var1, var2;
  2141.     double h, l, s;
  2142.     S16 tmp;
  2143.     /*----------------------------------------------------------------*/
  2144.     /* Code Body                                                      */
  2145.     /*----------------------------------------------------------------*/
  2146.     /* This is slightly different than standard implementation because 
  2147.        GUI might set s != 0 while h is undefined */
  2148.     if (hls.s == 0 || hls.h == UI_UNDEFINED_HUE)
  2149.     {
  2150.         rgb->r = hls.l;
  2151.         rgb->g = hls.l;
  2152.         rgb->b = hls.l;
  2153.     }
  2154.     else
  2155.     {
  2156.         h = (double)hls.h / 360.0;
  2157.         l = (double)hls.l / 255.0;
  2158.         s = (double)hls.s / 255.0;
  2159.         if (l <= 0.5)
  2160.         {
  2161.             var2 = l * (1 + s);
  2162.         }
  2163.         else
  2164.         {
  2165.             var2 = (l + s) - (s * l);
  2166.         }
  2167.         var1 = 2.0 * l - var2;
  2168.         tmp = (S16) RINT(255.0 * gui_util_hue_to_RGB(var1, var2, h + 1.0 / 3.0));
  2169.         gui_util_fix_short_integer_bound(&tmp, 0, 255);
  2170.         rgb->r = (U8) tmp;
  2171.         tmp = (S16) RINT(255.0 * gui_util_hue_to_RGB(var1, var2, h));
  2172.         gui_util_fix_short_integer_bound(&tmp, 0, 255);
  2173.         rgb->g = (U8) tmp;
  2174.         tmp = (S16) RINT(255.0 * gui_util_hue_to_RGB(var1, var2, h - 1.0 / 3.0));
  2175.         gui_util_fix_short_integer_bound(&tmp, 0, 255);
  2176.         rgb->b = (U8) tmp;
  2177.     }
  2178.     rgb->alpha = 100;
  2179. }
  2180. /* This must be initialized to a valid theme    */
  2181. UI_filled_area_border_theme *current_filled_area_border_theme = NULL;
  2182. UI_filled_area *current_UI_filler = NULL;
  2183. /*****************************************************************************
  2184.  * FUNCTION