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

MTK

开发平台:

C/C++

  1.  *  gui_shadow_filled_area
  2.  * DESCRIPTION
  3.  *  Draws a shadow for a filled area
  4.  *  
  5.  *  See fillers (UI_filled_area structure)
  6.  * PARAMETERS
  7.  *  x1      [IN]        Left-top corner of the rectangle
  8.  *  y1      [IN]        Left-top corner of the rectangle
  9.  *  x2      [IN]        Right-bottom corner of the rectangle
  10.  *  y2      [IN]        Right-bottom corner of the rectangle
  11.  *  f       [IN]        Is the filler to use
  12.  * RETURNS
  13.  *  void
  14.  *****************************************************************************/
  15. void gui_shadow_filled_area(S32 x1, S32 y1, S32 x2, S32 y2, UI_filled_area *f)
  16. {
  17.     /*----------------------------------------------------------------*/
  18.     /* Local Variables                                                */
  19.     /*----------------------------------------------------------------*/
  20.     U32 flags = f->flags;
  21.     color shadow_color = f->shadow_color;
  22.     /*----------------------------------------------------------------*/
  23.     /* Code Body                                                      */
  24.     /*----------------------------------------------------------------*/
  25.     if (flags & UI_FILLED_AREA_SHADOW_DOUBLE_LINE)
  26.     {
  27.         if ((flags & UI_FILLED_AREA_DOUBLE_BORDER) == UI_FILLED_AREA_DOUBLE_BORDER)
  28.         {
  29.             if (flags & UI_FILLED_AREA_ROUNDED_BORDER)
  30.             {
  31.                 gui_draw_horizontal_line(x1 + 3, x2 + 1, y2 + 1, shadow_color);
  32.                 gui_draw_horizontal_line(x1 + 4, x2, y2 + 2, shadow_color);
  33.                 gui_draw_vertical_line(y1 + 3, y2, x2 + 1, shadow_color);
  34.                 gui_draw_vertical_line(y1 + 4, y2, x2 + 2, shadow_color);
  35.                 gui_putpixel(x2 - 1, y2, shadow_color);
  36.                 gui_putpixel(x2, y2, shadow_color);
  37.                 gui_putpixel(x2, y2 - 1, shadow_color);
  38.             }
  39.             else
  40.             {
  41.                 gui_draw_horizontal_line(x1 + 2, x2 + 2, y2 + 1, shadow_color);
  42.                 gui_draw_horizontal_line(x1 + 2, x2 + 2, y2 + 2, shadow_color);
  43.                 gui_draw_vertical_line(y1 + 2, y2, x2 + 1, shadow_color);
  44.                 gui_draw_vertical_line(y1 + 2, y2, x2 + 2, shadow_color);
  45.             }
  46.         }
  47.         else
  48.         {
  49.             if (flags & UI_FILLED_AREA_ROUNDED_BORDER)
  50.             {
  51.                 gui_draw_horizontal_line(x1 + 3, x2 + 1, y2 + 1, shadow_color);
  52.                 gui_draw_horizontal_line(x1 + 4, x2, y2 + 2, shadow_color);
  53.                 gui_draw_vertical_line(y1 + 3, y2, x2 + 1, shadow_color);
  54.                 gui_draw_vertical_line(y1 + 4, y2, x2 + 2, shadow_color);
  55.                 gui_putpixel(x2 - 1, y2, shadow_color);
  56.                 gui_putpixel(x2, y2, shadow_color);
  57.                 gui_putpixel(x2, y2 - 1, shadow_color);
  58.             }
  59.             else
  60.             {
  61.                 gui_draw_horizontal_line(x1 + 2, x2 + 2, y2 + 1, shadow_color);
  62.                 gui_draw_horizontal_line(x1 + 2, x2 + 2, y2 + 2, shadow_color);
  63.                 gui_draw_vertical_line(y1 + 2, y2, x2 + 1, shadow_color);
  64.                 gui_draw_vertical_line(y1 + 2, y2, x2 + 2, shadow_color);
  65.             }
  66.         }
  67.     }
  68.     else
  69.     {
  70.         if ((flags & UI_FILLED_AREA_DOUBLE_BORDER) == UI_FILLED_AREA_DOUBLE_BORDER)
  71.         {
  72.             if (flags & UI_FILLED_AREA_ROUNDED_BORDER)
  73.             {
  74.                 gui_draw_horizontal_line(x1 + 3, x2 - 2, y2 + 1, shadow_color);
  75.                 gui_draw_vertical_line(y1 + 3, y2 - 2, x2 + 1, shadow_color);
  76.                 gui_putpixel(x2, y2 - 1, shadow_color);
  77.                 gui_putpixel(x2 - 1, y2, shadow_color);
  78.             }
  79.             else
  80.             {
  81.                 gui_draw_horizontal_line(x1 + 1, x2 + 1, y2 + 1, shadow_color);
  82.                 gui_draw_vertical_line(y1 + 1, y2, x2 + 1, shadow_color);
  83.             }
  84.         }
  85.         else
  86.         {
  87.             if (flags & UI_FILLED_AREA_ROUNDED_BORDER)
  88.             {
  89.                 gui_draw_horizontal_line(x1 + 2, x2 - 1, y2 + 1, shadow_color);
  90.                 gui_draw_vertical_line(y1 + 2, y2 - 1, x2 + 1, shadow_color);
  91.                 gui_putpixel(x2, y2, shadow_color);
  92.             }
  93.             else
  94.             {
  95.                 gui_draw_horizontal_line(x1 + 1, x2 + 1, y2 + 1, shadow_color);
  96.                 gui_draw_vertical_line(y1 + 1, y2, x2 + 1, shadow_color);
  97.             }
  98.         }
  99.     }
  100. }
  101. /* c=c+x such that c does not go above 255   */
  102. #define INCREMENT_COLOR_COMPONENT(c,x)    
  103. {  S32   cc=c;                            
  104.    cc=cc+x;                               
  105.    if(cc>255) cc=255;                     
  106.    c=(U8)cc;                              
  107. }
  108. /* c=c-x such that c does not go below 0  */
  109. #define DECREMENT_COLOR_COMPONENT(c,x)    
  110. {  S32   cc=c;                            
  111.    cc=cc-x;                               
  112.    if(cc<0) cc=0;                         
  113.    c=(U8)cc;                              
  114. }
  115. #define UI_FILLED_AREA_INFO_BORDER_OFFSET 5
  116. /*****************************************************************************
  117.  * FUNCTION
  118.  *  gui_custom_fill_area_type2
  119.  * DESCRIPTION
  120.  *  
  121.  * PARAMETERS
  122.  *  x1      [IN]        
  123.  *  y1      [IN]        
  124.  *  x2      [IN]        
  125.  *  y2      [IN]        
  126.  *  f       [IN]         
  127.  * RETURNS
  128.  *  void
  129.  *****************************************************************************/
  130. void gui_custom_fill_area_type2(S32 x1, S32 y1, S32 x2, S32 y2, UI_filled_area *f)
  131. {
  132.     /*----------------------------------------------------------------*/
  133.     /* Local Variables                                                */
  134.     /*----------------------------------------------------------------*/
  135.     S32 rx1 = x1, rx2 = x2, ry1 = y1, ry2 = y2, i = 0;
  136.     color c = f->c;
  137.     gdi_color gdi_c = gdi_act_color_from_rgb(255, c.r, c.g, c.b);
  138.     /*----------------------------------------------------------------*/
  139.     /* Code Body                                                      */
  140.     /*----------------------------------------------------------------*/
  141.     ry2 -= UI_FILLED_AREA_INFO_BORDER_OFFSET;
  142.     gdi_draw_solid_rect(rx1 + 1, ry1 + 1, rx2 - 1, ry2 - 1, gdi_c);
  143.     for (i = 0; i < 5; i++)
  144.     {
  145.         gdi_draw_line(rx1 + 9 + i, ry2 + i, rx1 + 17 - i, ry2 + i, gdi_c);
  146.     }
  147.     c = f->border_color;
  148.     gdi_c = gdi_act_color_from_rgb(255, c.r, c.g, c.b);
  149.     gdi_draw_line(rx1, ry1 + 2, rx1, ry2 - 2, gdi_c);
  150.     gdi_draw_line(rx1 + 1, ry1 + 2, rx1 + 1, ry2 - 3, GDI_COLOR_WHITE);
  151.     gdi_draw_line(rx1 + 2, ry1, rx2 - 2, ry1, gdi_c);
  152.     gdi_draw_line(rx1 + 2, ry1 + 1, rx2 - 3, ry1 + 1, GDI_COLOR_WHITE);
  153.     gdi_draw_point(rx1 + 1, ry1 + 1, gdi_c);            /* Line Next To Upper Line */
  154.     gdi_draw_point(rx1 + 2, ry1 + 2, GDI_COLOR_WHITE);  /* Line Next To Upper Line */
  155.     gdi_draw_point(rx2 - 1, ry1 + 1, gdi_c);            /* Line Next To Upper Line */
  156.     gdi_draw_point(rx2 - 2, ry1 + 1, gdi_c);            /* Line Next To Upper Line */
  157.     gdi_draw_point(rx1 + 1, ry2 - 1, gdi_c);            /* Lower Edge */
  158.     gdi_draw_point(rx1 + 1, ry2 - 2, gdi_c);            /* Lower Edge */
  159.     gdi_draw_point(rx2 - 1, ry2 - 1, gdi_c);            /* Ipx above lower edge */
  160.     gdi_draw_point(rx2 - 2, ry2 - 2, gdi_c);            /* Ipx above lower edge */
  161.     gdi_draw_line(rx2 - 1, ry1 + 2, rx2 - 1, ry2 - 2, gdi_c);
  162.     gdi_draw_line(rx2, ry1 + 2, rx2, ry2 - 2, gdi_c);
  163.     gdi_draw_line(rx1 + 2, ry2, rx1 + 8, ry2, gdi_c);
  164.     gdi_draw_line(rx1 + 2, ry2 - 1, rx1 + 8, ry2 - 1, gdi_c);
  165.     gdi_draw_line(rx1 + 18, ry2, rx2 - 2, ry2, gdi_c);
  166.     gdi_draw_line(rx1 + 18, ry2 - 1, rx2 - 2, ry2 - 1, gdi_c);
  167.     gdi_draw_line(rx1 + 8, ry2, rx1 + 13, ry2 + UI_FILLED_AREA_INFO_BORDER_OFFSET, gdi_c);
  168.     gdi_draw_line(rx1 + 9, ry2, rx1 + 13, ry2 + UI_FILLED_AREA_INFO_BORDER_OFFSET - 1, gdi_c);
  169.     gdi_draw_line(
  170.         rx1 + 8 + UI_FILLED_AREA_INFO_BORDER_OFFSET,
  171.         ry2 + UI_FILLED_AREA_INFO_BORDER_OFFSET,
  172.         rx1 + 8 + (UI_FILLED_AREA_INFO_BORDER_OFFSET << 1),
  173.         ry2,
  174.         gdi_c);
  175.     gdi_draw_line(
  176.         rx1 + 8 + UI_FILLED_AREA_INFO_BORDER_OFFSET,
  177.         ry2 + UI_FILLED_AREA_INFO_BORDER_OFFSET - 1,
  178.         rx1 + 8 + (UI_FILLED_AREA_INFO_BORDER_OFFSET << 1),
  179.         ry2,
  180.         gdi_c);
  181. }
  182. /* For new hint style 2 & 3 */
  183. /*****************************************************************************
  184.  * FUNCTION
  185.  *  gui_custom_fill_area_type1and2
  186.  * DESCRIPTION
  187.  *  
  188.  * PARAMETERS
  189.  *  x1      [IN]        
  190.  *  y1      [IN]        
  191.  *  x2      [IN]        
  192.  *  y2      [IN]        
  193.  *  f       [IN]         
  194.  * RETURNS
  195.  *  void
  196.  *****************************************************************************/
  197. void gui_custom_fill_area_type1and2(S32 x1, S32 y1, S32 x2, S32 y2, UI_filled_area *f)
  198. {
  199. #if defined(UI_POPUP_DESCRIPTION_STYLE_1)
  200.     /*----------------------------------------------------------------*/
  201.     /* Local Variables                                                */
  202.     /*----------------------------------------------------------------*/
  203.     /*----------------------------------------------------------------*/
  204.     /* Code Body                                                      */
  205.     /*----------------------------------------------------------------*/
  206.     gui_fill_rectangle(x1, y1, x2, y2, f->c);
  207. #elif defined(UI_POPUP_DESCRIPTION_STYLE_2)
  208.     UI_HLS_color hls;
  209.     color sc;
  210.     U8 l;
  211.     gui_fill_rectangle(x1 + 1, y1 + 1, x2 - 2, y2 - 2, f->c);
  212.     gui_putpixel(x1 + 1, y1 + 1, f->border_color);
  213.     gui_putpixel(x1 + 1, y2 - 2, f->border_color);
  214.     gui_putpixel(x2 - 2, y1 + 1, f->border_color);
  215.     gui_putpixel(x2 - 2, y2 - 2, f->border_color);
  216.     gui_draw_horizontal_line(x1 + 2, x2 - 3, y1, f->border_color);
  217.     gui_draw_horizontal_line(x1 + 2, x2 - 3, y2 - 1, f->border_color);
  218.     gui_draw_vertical_line(y1 + 2, y2 - 3, x1, f->border_color);
  219.     gui_draw_vertical_line(y1 + 2, y2 - 3, x2 - 1, f->border_color);
  220.     gui_RGB_to_HLS(f->c, &hls);
  221.     l = hls.l;
  222.     l -= (l >> 2);
  223.     sc = gui_color(l, l, l);
  224.     gui_draw_horizontal_line(x1 + 2 + 1, x2 - 3, y2, sc);
  225.     gui_draw_vertical_line(y1 + 2 + 1, y2 - 3, x2, sc);
  226.     l -= (l >> 3);
  227.     sc = gui_color(l, l, l);
  228.     gui_putpixel(x2 - 1, y2 - 2, sc);
  229.     gui_putpixel(x2 - 2, y2 - 1, sc);
  230.     l = hls.l;
  231.     l -= (l >> 3);
  232.     sc = gui_color(l, l, l);
  233.     gui_putpixel(x1 + 2, y2, sc);
  234.     gui_putpixel(x1 + 1, y2 - 1, sc);
  235.     gui_putpixel(x2, y1 + 2, sc);
  236.     gui_putpixel(x2 - 1, y2 - 1, sc);
  237.     gui_putpixel(x2 - 2, y2, sc);
  238.     gui_putpixel(x2, y2 - 2, sc);
  239. #elif defined(UI_POPUP_DESCRIPTION_STYLE_3)
  240.     color c, sc, bc, lc;    /* fill color, shadow color, border color, light color */
  241.     S32 i;
  242.     BOOL upward;
  243. #if 1
  244.     static color cache_c, cache_bc, cache_sc;
  245.     c = f->c;
  246.     bc = f->border_color;
  247.     lc = gui_color(255, 255, 255);
  248.     if (memcpy(&cache_c, &c, sizeof(color)) || memcpy(&cache_bc, &bc, sizeof(color)))
  249.     {
  250.         UI_HLS_color hls1, hls2;
  251.         cache_c = c;
  252.         cache_bc = bc;
  253.         gui_RGB_to_HLS(c, &hls1);
  254.         gui_RGB_to_HLS(bc, &hls2);
  255.         hls2.l = ((hls1.l << 1) + hls2.l) / 3;
  256.         hls2.s -= (hls2.s >> 4) + (hls2.s >> 3);    /* about 0.8 */
  257.         gui_HLS_to_RGB(hls2, &cache_sc);
  258.     }
  259.     sc = cache_sc;
  260. #else /* 1 */ /* alternative algorithm. simple but does not work for all color combination */
  261. /* under construction !*/
  262. /* under construction !*/
  263. /* under construction !*/
  264. /* under construction !*/
  265. /* under construction !*/
  266. /* under construction !*/
  267. #endif /* 1 */ 
  268.     if ((f->flags & 0x0ff) == UI_FILLED_AREA_TYPE_CUSTOM_FILL_TYPE1)
  269.     {
  270.         upward = MMI_TRUE;
  271.     }
  272.     else
  273.     {
  274.         upward = MMI_FALSE;
  275.     }
  276.     if (upward)
  277.     {
  278.         y1 += 3;
  279.     }
  280.     else
  281.     {
  282.         y2 -= 3;
  283.     }
  284.     /* internal */
  285.     gui_fill_rectangle(x1 + 2, y1 + 2, x2 - 2, y2 - 2, c);
  286.     /* shadown */
  287.     gui_draw_horizontal_line(x1 + 2, x2 - 2, y1 + 1, lc);
  288.     gui_draw_horizontal_line(x1 + 2, x2 - 2, y2 - 1, sc);
  289.     gui_draw_vertical_line(y1 + 2, y2 - 2, x1 + 1, sc);
  290.     gui_draw_vertical_line(y1 + 2, y2 - 2, x2 - 1, sc);
  291.     /* border */
  292.     gui_draw_horizontal_line(x1 + 2, x2 - 2, y1, bc);
  293.     gui_draw_horizontal_line(x1 + 2, x2 - 2, y2, bc);
  294.     gui_draw_vertical_line(y1 + 2, y2 - 2, x1, bc);
  295.     gui_draw_vertical_line(y1 + 2, y2 - 2, x2, bc);
  296.     gui_putpixel(x1 + 1, y1 + 1, bc);
  297.     gui_putpixel(x1 + 1, y2 - 1, bc);
  298.     gui_putpixel(x2 - 1, y1 + 1, bc);
  299.     gui_putpixel(x2 - 1, y2 - 1, bc);
  300.     if (x2 - x1 > 10 + 7)
  301.     {
  302.         if (!r2lMMIFlag)
  303.         {
  304.             x1 += 10;
  305.         }
  306.         else
  307.         {
  308.             x1 = x2 - 10 - 7;
  309.         }
  310.         x2 = x1 + 6;
  311.         if (upward)
  312.         {
  313.             y1 -= 3;
  314.             for (i = 0; i < 3; i++)
  315.             {
  316.                 gui_draw_horizontal_line(x1 + 2 - i, x2 - 2 + i, y1 + i, bc);
  317.             }
  318.             for (i = 0; i < 4; i++)
  319.             {
  320.                 gui_draw_horizontal_line(x1 + 3 - i, x2 - 3 + i, y1 + i, lc);
  321.             }
  322.             y1++;
  323.             for (i = 0; i < 4; i++)
  324.             {
  325.                 gui_draw_horizontal_line(x1 + 3 - i, x2 - 3 + i, y1 + i, c);
  326.             }
  327.         }
  328.         else
  329.         {
  330.             y2 += 3;
  331.             for (i = 0; i < 3; i++)
  332.             {
  333.                 gui_draw_horizontal_line(x1 + 2 - i, x2 - 2 + i, y2 - i, bc);
  334.             }
  335.             for (i = 0; i < 4; i++)
  336.             {
  337.                 gui_draw_horizontal_line(x1 + 3 - i, x2 - 3 + i, y2 - i, sc);
  338.             }
  339.             y2--;
  340.             for (i = 0; i < 4; i++)
  341.             {
  342.                 gui_draw_horizontal_line(x1 + 3 - i, x2 - 3 + i, y2 - i, c);
  343.             }
  344.         }
  345.     }
  346. #endif 
  347. }
  348. /*****************************************************************************
  349.  * FUNCTION
  350.  *  gui_fill_left_rounded_border
  351.  * DESCRIPTION
  352.  *  Draws a filled area with left rounded border shape
  353.  *  
  354.  *  See fillers (UI_filled_area structure)
  355.  * PARAMETERS
  356.  *  rx1     [IN]        Left-top corner of the rectangle
  357.  *  ry1     [IN]        Left-top corner of the rectangle
  358.  *  rx2     [IN]        Right-bottom corner of the rectangle
  359.  *  ry2     [IN]        Right-bottom corner of the rectangle
  360.  *  f       [IN]        Is the filler to use
  361.  * RETURNS
  362.  *  void
  363.  *****************************************************************************/
  364. void gui_fill_left_rounded_border(S32 rx1, S32 ry1, S32 rx2, S32 ry2, UI_filled_area *f)
  365. {
  366.     /*----------------------------------------------------------------*/
  367.     /* Local Variables                                                */
  368.     /*----------------------------------------------------------------*/
  369.     color filler_color = f->c;
  370.     color border_color = f->border_color;
  371.     /*----------------------------------------------------------------*/
  372.     /* Code Body                                                      */
  373.     /*----------------------------------------------------------------*/
  374.     gui_draw_vertical_line(ry1, ry2, rx1 - 1, border_color);
  375.     gui_draw_vertical_line(ry1 - 1, ry2 + 1, rx1, border_color);
  376.     gui_draw_horizontal_line(rx1 + 5, rx2, ry1 - 6, border_color);
  377.     gui_draw_horizontal_line(rx1 + 3, rx2, ry1 - 5, border_color);
  378.     gui_draw_horizontal_line(rx1 + 5, rx2, ry2 + 6, border_color);
  379.     gui_draw_horizontal_line(rx1 + 3, rx2, ry2 + 5, border_color);
  380.     gui_draw_horizontal_line(rx1 + 1, rx2, ry1 - 1, filler_color);
  381.     gui_draw_horizontal_line(rx1 + 2, rx2, ry1 - 2, filler_color);
  382.     gui_draw_horizontal_line(rx1 + 3, rx2, ry1 - 3, filler_color);
  383.     gui_draw_horizontal_line(rx1 + 4, rx2, ry1 - 4, filler_color);
  384.     gui_draw_horizontal_line(rx1 + 1, rx2, ry2 + 1, filler_color);
  385.     gui_draw_horizontal_line(rx1 + 2, rx2, ry2 + 2, filler_color);
  386.     gui_draw_horizontal_line(rx1 + 3, rx2, ry2 + 3, filler_color);
  387.     gui_draw_horizontal_line(rx1 + 4, rx2, ry2 + 4, filler_color);
  388.     gui_putpixel(rx1, ry1 - 1, border_color);
  389.     gui_putpixel(rx1, ry1 - 2, border_color);
  390.     gui_putpixel(rx1 + 1, ry1 - 2, border_color);
  391.     gui_putpixel(rx1 + 1, ry1 - 3, border_color);
  392.     gui_putpixel(rx1 + 2, ry1 - 3, border_color);
  393.     gui_putpixel(rx1 + 2, ry1 - 4, border_color);
  394.     gui_putpixel(rx1 + 3, ry1 - 4, border_color);
  395.     gui_putpixel(rx1 + 4, ry1 - 4, border_color);
  396.     gui_putpixel(rx1 + 3, ry1 - 5, border_color);
  397.     gui_putpixel(rx1 + 4, ry1 - 5, border_color);
  398.     gui_putpixel(rx1, ry2 + 1, border_color);
  399.     gui_putpixel(rx1, ry2 + 2, border_color);
  400.     gui_putpixel(rx1 + 1, ry2 + 2, border_color);
  401.     gui_putpixel(rx1 + 1, ry2 + 3, border_color);
  402.     gui_putpixel(rx1 + 2, ry2 + 3, border_color);
  403.     gui_putpixel(rx1 + 2, ry2 + 4, border_color);
  404.     gui_putpixel(rx1 + 3, ry2 + 4, border_color);
  405.     gui_putpixel(rx1 + 4, ry2 + 4, border_color);
  406.     gui_putpixel(rx1 + 3, ry2 + 5, border_color);
  407.     gui_putpixel(rx1 + 4, ry2 + 5, border_color);
  408. }
  409. /*****************************************************************************
  410.  * FUNCTION
  411.  *  gui_fill_right_rounded_border
  412.  * DESCRIPTION
  413.  *  Draws a filled area with right rounded border shape
  414.  *  
  415.  *  See fillers (UI_filled_area structure)
  416.  * PARAMETERS
  417.  *  rx1     [IN]        Left-top corner of the rectangle
  418.  *  ry1     [IN]        Left-top corner of the rectangle
  419.  *  rx2     [IN]        Right-bottom corner of the rectangle
  420.  *  ry2     [IN]        Right-bottom corner of the rectangle
  421.  *  f       [IN]        Is the filler to use
  422.  * RETURNS
  423.  *  void
  424.  *****************************************************************************/
  425. void gui_fill_right_rounded_border(S32 rx1, S32 ry1, S32 rx2, S32 ry2, UI_filled_area *f)
  426. {
  427.     /*----------------------------------------------------------------*/
  428.     /* Local Variables                                                */
  429.     /*----------------------------------------------------------------*/
  430.     color filler_color = f->c;
  431.     color border_color = f->border_color;
  432.     /*----------------------------------------------------------------*/
  433.     /* Code Body                                                      */
  434.     /*----------------------------------------------------------------*/
  435.     gui_draw_vertical_line(ry1, ry2, rx2 + 1, border_color);
  436.     gui_draw_vertical_line(ry1 - 1, ry2 + 1, rx2, border_color);
  437.     gui_draw_horizontal_line(rx1, rx2 - 5, ry1 - 6, border_color);
  438.     gui_draw_horizontal_line(rx1, rx2 - 3, ry1 - 5, border_color);
  439.     gui_draw_horizontal_line(rx1, rx2 - 5, ry2 + 6, border_color);
  440.     gui_draw_horizontal_line(rx1, rx2 - 3, ry2 + 5, border_color);
  441.     gui_draw_horizontal_line(rx1, rx2 - 1, ry1 - 1, filler_color);
  442.     gui_draw_horizontal_line(rx1, rx2 - 2, ry1 - 2, filler_color);
  443.     gui_draw_horizontal_line(rx1, rx2 - 3, ry1 - 3, filler_color);
  444.     gui_draw_horizontal_line(rx1, rx2 - 4, ry1 - 4, filler_color);
  445.     gui_draw_horizontal_line(rx1, rx2 - 1, ry2 + 1, filler_color);
  446.     gui_draw_horizontal_line(rx1, rx2 - 2, ry2 + 2, filler_color);
  447.     gui_draw_horizontal_line(rx1, rx2 - 3, ry2 + 3, filler_color);
  448.     gui_draw_horizontal_line(rx1, rx2 - 4, ry2 + 4, filler_color);
  449.     gui_putpixel(rx2, ry1 - 1, border_color);
  450.     gui_putpixel(rx2, ry1 - 2, border_color);
  451.     gui_putpixel(rx2 - 1, ry1 - 2, border_color);
  452.     gui_putpixel(rx2 - 1, ry1 - 3, border_color);
  453.     gui_putpixel(rx2 - 2, ry1 - 3, border_color);
  454.     gui_putpixel(rx2 - 2, ry1 - 4, border_color);
  455.     gui_putpixel(rx2 - 3, ry1 - 4, border_color);
  456.     gui_putpixel(rx2 - 4, ry1 - 4, border_color);
  457.     gui_putpixel(rx2 - 3, ry1 - 5, border_color);
  458.     gui_putpixel(rx2 - 4, ry1 - 5, border_color);
  459.     gui_putpixel(rx2, ry2 + 1, border_color);
  460.     gui_putpixel(rx2, ry2 + 2, border_color);
  461.     gui_putpixel(rx2 - 1, ry2 + 2, border_color);
  462.     gui_putpixel(rx2 - 1, ry2 + 3, border_color);
  463.     gui_putpixel(rx2 - 2, ry2 + 3, border_color);
  464.     gui_putpixel(rx2 - 2, ry2 + 4, border_color);
  465.     gui_putpixel(rx2 - 3, ry2 + 4, border_color);
  466.     gui_putpixel(rx2 - 4, ry2 + 4, border_color);
  467.     gui_putpixel(rx2 - 3, ry2 + 5, border_color);
  468.     gui_putpixel(rx2 - 4, ry2 + 5, border_color);
  469. }
  470. /*****************************************************************************
  471.  * FUNCTION
  472.  *  gui_draw_filled_area
  473.  * DESCRIPTION
  474.  *  Draws a filled area
  475.  *  
  476.  *  See fillers (UI_filled_area structure)
  477.  * PARAMETERS
  478.  *  x1      [IN]        Left-top corner of the rectangle
  479.  *  y1      [IN]        Left-top corner of the rectangle
  480.  *  x2      [IN]        Right-bottom corner of the rectangle
  481.  *  y2      [IN]        Right-bottom corner of the rectangle
  482.  *  f       [IN]        Is the filler to use
  483.  * RETURNS
  484.  *  void
  485.  *****************************************************************************/
  486. void gui_draw_filled_area(S32 x1, S32 y1, S32 x2, S32 y2, UI_filled_area *f)
  487. {
  488.     /*----------------------------------------------------------------*/
  489.     /* Local Variables                                                */
  490.     /*----------------------------------------------------------------*/
  491.     S32 rx1 = x1, ry1 = y1, rx2 = x2, ry2 = y2;
  492.     U32 flags;
  493.     /*----------------------------------------------------------------*/
  494.     /* Code Body                                                      */
  495.     /*----------------------------------------------------------------*/
  496.     if (f == NULL)
  497.     {
  498.         return;
  499.     }
  500.     flags = f->flags;
  501.     if ((flags & UI_FILLED_AREA_DOUBLE_BORDER) == UI_FILLED_AREA_DOUBLE_BORDER)
  502.     {
  503.         rx1 += 2;
  504.         rx2 -= 2;
  505.         ry1 += 2;
  506.         ry2 -= 2;
  507.         if (flags & UI_FILLED_AREA_NO_VERTICAL_LINE)
  508.         {
  509.             rx1 -= 2;
  510.             rx2 += 2;
  511.         }
  512.     }
  513.     else if (flags & UI_FILLED_AREA_SINGLE_BORDER)
  514.     {
  515.         rx1 += 1;
  516.         rx2 -= 1;
  517.         ry1 += 1;
  518.         ry2 -= 1;
  519.         if (flags & UI_FILLED_AREA_NO_VERTICAL_LINE)
  520.         {
  521.             rx1 -= 1;
  522.             rx2 += 1;
  523.         }
  524.     }
  525.     if (flags & UI_FILLED_AREA_LEFT_ROUNDED_BORDER)
  526.     {
  527.         rx1 += 2;
  528.         ry1 += 6;
  529.         ry2 -= 6;
  530.     }
  531.     else if (flags & UI_FILLED_AREA_RIGHT_ROUNDED_BORDER)
  532.     {
  533.         rx2 -= 2;
  534.         ry1 += 6;
  535.         ry2 -= 6;
  536.     }
  537.     switch (flags & 0x0ff)
  538.     {
  539.         case UI_FILLED_AREA_TYPE_COLOR:
  540.         #if defined (__MMI_UI_TRANSPARENT_EFFECT__) || defined (__MMI_UI_LIST_HIGHLIGHT_EFFECTS__)      /* 072505 Calvin modified */
  541.             if (flags & UI_FILLED_AREA_TYPE_TRANSPARENT_COLOR)
  542.             {
  543.                 gui_transparent_color_filler(rx1, ry1, rx2, ry2, f->c); /* For transparent color filler */
  544.             }
  545.             else
  546.         #endif /* defined (__MMI_UI_TRANSPARENT_EFFECT__) || defined (__MMI_UI_LIST_HIGHLIGHT_EFFECTS__) */ 
  547.             {
  548.                 gui_fill_rectangle(rx1, ry1, rx2, ry2, f->c);
  549.             }
  550.             break;
  551.             
  552.         case UI_FILLED_AREA_TYPE_GRADIENT_COLOR:
  553.             gui_gradient_fill_rectangle(rx1, ry1, rx2, ry2, f->gc, flags);
  554.             break;
  555.             
  556.         case UI_FILLED_AREA_TYPE_TEXTURE:
  557.             if (f->transparent_color != UI_NULL_TRANSPARENT_COLOR)
  558.             {
  559.                 gui_transparent_texture_fill_rectangle(rx1, ry1, rx2, ry2, f->b, f->transparent_color);
  560.             }
  561.             else
  562.             {
  563.                 gui_texture_fill_rectangle(rx1, ry1, rx2, ry2, f->b);
  564.             }
  565.             break;
  566.             
  567.         case UI_FILLED_AREA_TYPE_BITMAP:
  568.             gui_push_clip();
  569.             gui_set_clip_preset(x1, y1, x2, y2);
  570.             if (f->transparent_color != UI_NULL_TRANSPARENT_COLOR)
  571.             {
  572.                 gui_show_transparent_image(x1, y1, f->b, f->transparent_color);
  573.             }
  574.             else
  575.             {
  576.                 gui_show_image(x1, y1, f->b);
  577.             }
  578.             gui_pop_clip();
  579.             break;
  580.             
  581.         case UI_FILLED_AREA_TYPE_HATCH_COLOR:
  582.             gui_hatch_fill_rectangle(rx1, ry1, rx2, ry2, f->c);
  583.             break;
  584.             
  585.         case UI_FILLED_AREA_TYPE_ALTERNATE_HATCH_COLOR:
  586.             gui_alternate_hatch_fill_rectangle(rx1, ry1, rx2, ry2, f->c, f->ac);
  587.             break;
  588.             
  589.         case UI_FILLED_AREA_TYPE_CROSS_HATCH_COLOR:
  590.             gui_cross_hatch_fill_rectangle(rx1, ry1, rx2, ry2, f->c);
  591.             break;
  592.             
  593.         case UI_FILLED_AREA_TYPE_ALTERNATE_CROSS_HATCH_COLOR:
  594.             gui_alternate_cross_hatch_fill_rectangle(rx1, ry1, rx2, ry2, f->c, f->ac);
  595.             break;
  596.             
  597.         case UI_FILLED_AREA_TYPE_CUSTOM_FILL_TYPE1:
  598.             gui_custom_fill_area_type1and2(rx1, ry1, rx2, ry2, f);
  599.             break;
  600.             
  601.         case UI_FILLED_AREA_TYPE_CUSTOM_FILL_TYPE2:
  602.             gui_custom_fill_area_type1and2(rx1, ry1, rx2, ry2, f);
  603.             break;
  604.             
  605.         case UI_FILLED_AREA_TYPE_3D_BORDER:
  606.             gui_custom_fill_area_type2(rx1, ry1, rx2, ry2, f);
  607.             break;
  608.     }
  609.     if (flags & UI_FILLED_AREA_LEFT_ROUNDED_BORDER)
  610.     {
  611.         gui_fill_left_rounded_border(rx1, ry1, rx2, ry2, f);
  612.     }
  613.     else if (flags & UI_FILLED_AREA_RIGHT_ROUNDED_BORDER)
  614.     {
  615.         gui_fill_right_rounded_border(rx1, ry1, rx2, ry2, f);
  616.     }
  617.     if (flags & UI_FILLED_AREA_BORDER)  /* if border flag is set */
  618.     {
  619.         color border_color = f->border_color;   /* border color */
  620.         if ((flags & UI_FILLED_AREA_DOUBLE_BORDER) == UI_FILLED_AREA_DOUBLE_BORDER)
  621.         {
  622.             if (flags & UI_FILLED_AREA_3D_BORDER)
  623.             {
  624.                 /* outer  border light color */
  625.                 color filled_area_outer_light_border = current_filled_area_border_theme->filled_area_outer_light_border;
  626.                 /* inner border light color */
  627.                 color filled_area_inner_light_border = current_filled_area_border_theme->filled_area_inner_light_border;
  628.                 /* outer border dark color */
  629.                 color filled_area_outer_dark_border = current_filled_area_border_theme->filled_area_outer_dark_border;
  630.                 /* inner border dark color */
  631.                 color filled_area_inner_dark_border = current_filled_area_border_theme->filled_area_inner_dark_border;
  632.                 if (flags & UI_FILLED_AREA_ROUNDED_BORDER)  /* if round border is set */
  633.                 {
  634.                 #if !defined(__MMI_PLUTO_DOUBLEPX_ROUND_CORNER__)
  635.                     if (flags & UI_FILLED_AREA_ELEVATED_BORDER)
  636.                     {
  637.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y1, filled_area_outer_light_border);
  638.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x1, filled_area_outer_light_border);
  639.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y1 + 1, filled_area_inner_light_border);
  640.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x1 + 1, filled_area_inner_light_border);
  641.                         gui_putpixel(x1 + 1, y1 + 1, filled_area_outer_light_border);
  642.                         gui_putpixel(x1 + 1, y2 - 1, filled_area_outer_dark_border);
  643.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y2, filled_area_outer_dark_border);
  644.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y2 - 1, filled_area_inner_dark_border);
  645.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x2 - 1, filled_area_inner_dark_border);
  646.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x2, filled_area_outer_dark_border);
  647.                         gui_putpixel(x2 - 1, y1 + 1, filled_area_outer_light_border);
  648.                         gui_putpixel(x2 - 1, y2 - 1, filled_area_outer_dark_border);
  649.                     }
  650.                     else
  651.                     {
  652.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y1, filled_area_outer_dark_border);
  653.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x1, filled_area_outer_dark_border);
  654.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y1 + 1, filled_area_inner_dark_border);
  655.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x1 + 1, filled_area_inner_dark_border);
  656.                         gui_putpixel(x1 + 1, y1 + 1, filled_area_outer_dark_border);
  657.                         gui_putpixel(x1 + 1, y2 - 1, filled_area_outer_light_border);
  658.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y2, filled_area_outer_light_border);
  659.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y2 - 1, filled_area_inner_light_border);
  660.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x2 - 1, filled_area_inner_light_border);
  661.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x2, filled_area_outer_light_border);
  662.                         gui_putpixel(x2 - 1, y1 + 1, filled_area_outer_dark_border);
  663.                         gui_putpixel(x2 - 1, y2 - 1, filled_area_outer_light_border);
  664.                     }
  665.                 #else /* !defined(__MMI_PLUTO_DOUBLEPX_ROUND_CORNER__) */ 
  666.                     if (flags & UI_FILLED_AREA_ELEVATED_BORDER)
  667.                     {
  668.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y1, filled_area_outer_light_border);
  669.                         /* draw vertical line */
  670.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x1, filled_area_outer_light_border);
  671.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y1 + 1, filled_area_inner_light_border);
  672.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x1 + 1, filled_area_inner_light_border);
  673.                         gui_putpixel(x1 + 1, y1 + 1, filled_area_outer_light_border);
  674.                         gui_putpixel(x1 + 1, y2 - 1, filled_area_outer_dark_border);
  675.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y2, filled_area_outer_dark_border);
  676.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y2 - 1, filled_area_inner_dark_border);
  677.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x2 - 1, filled_area_inner_dark_border);
  678.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x2, filled_area_outer_dark_border);
  679.                         gui_putpixel(x2 - 1, y1 + 1, filled_area_outer_light_border);
  680.                         gui_putpixel(x2 - 1, y2 - 1, filled_area_outer_dark_border);
  681.                         gui_putpixel(x1 + 2, y1 + 2, filled_area_inner_light_border);   /* Single Pixel Line To Fill Left Upper Corner */
  682.                         gui_putpixel(x2 - 2, y1 + 2, filled_area_inner_light_border);   /* Single Pixel Line To Fill Left Bottom Corner */
  683.                         gui_putpixel(x1 + 2, y2 - 2, filled_area_inner_dark_border);    /* Single Pixel Line To Fill Right Upper Corner */
  684.                         gui_putpixel(x2 - 2, y2 - 2, filled_area_inner_dark_border);    /* Single Pixel Line To Fill Right Bottom Corner */
  685.                     }
  686.                     else
  687.                     {
  688.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y1, filled_area_outer_dark_border);
  689.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x1, filled_area_outer_dark_border);
  690.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y1 + 1, filled_area_inner_dark_border);
  691.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x1 + 1, filled_area_inner_dark_border);
  692.                         gui_putpixel(x1 + 1, y1 + 1, filled_area_outer_dark_border);
  693.                         gui_putpixel(x1 + 1, y2 - 1, filled_area_outer_light_border);
  694.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y2, filled_area_outer_light_border);
  695.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y2 - 1, filled_area_inner_light_border);
  696.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x2 - 1, filled_area_inner_light_border);
  697.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x2, filled_area_outer_light_border);
  698.                         gui_putpixel(x2 - 1, y1 + 1, filled_area_outer_dark_border);
  699.                         gui_putpixel(x2 - 1, y2 - 1, filled_area_outer_light_border);
  700.                         gui_putpixel(x1 + 2, y1 + 2, filled_area_inner_dark_border);    /* Single Pixel Line To Fill Left Upper Corner */
  701.                         gui_putpixel(x2 - 2, y1 + 2, filled_area_inner_dark_border);    /* Single Pixel Line To Fill Left Bottom Corner */
  702.                         gui_putpixel(x1 + 2, y2 - 2, filled_area_inner_light_border);   /* Single Pixel Line To Fill Right Upper Corner */
  703.                         gui_putpixel(x2 - 2, y2 - 2, filled_area_inner_light_border);   /* Single Pixel Line To Fill Right Bottom Corner */
  704.                     }
  705.                 #endif /* !defined(__MMI_PLUTO_DOUBLEPX_ROUND_CORNER__) */ 
  706.                 }
  707.                 else
  708.                 {
  709.                     if (flags & UI_FILLED_AREA_ELEVATED_BORDER) /* if elevated border is set */
  710.                     {
  711.                         gui_draw_horizontal_line(x1, x2, y1, filled_area_outer_light_border);
  712.                         gui_draw_vertical_line(y1 + 1, y2, x1, filled_area_outer_light_border);
  713.                         gui_draw_horizontal_line(x1 + 1, x2 - 1, y1 + 1, filled_area_inner_light_border);
  714.                         gui_draw_vertical_line(y1 + 2, y2 - 1, x1 + 1, filled_area_inner_light_border);
  715.                         gui_draw_horizontal_line(x1 + 1, x2, y2, filled_area_outer_dark_border);
  716.                         gui_draw_horizontal_line(x1 + 2, x2 - 1, y2 - 1, filled_area_inner_dark_border);
  717.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x2 - 1, filled_area_inner_dark_border);
  718.                         gui_draw_vertical_line(y1 + 1, y2 - 1, x2, filled_area_outer_dark_border);
  719.                     }
  720.                     else
  721.                     {
  722.                         gui_draw_horizontal_line(x1, x2, y1, filled_area_outer_dark_border);
  723.                         gui_draw_vertical_line(y1 + 1, y2, x1, filled_area_outer_dark_border);
  724.                         gui_draw_horizontal_line(x1 + 1, x2 - 1, y1 + 1, filled_area_inner_dark_border);
  725.                         gui_draw_vertical_line(y1 + 2, y2 - 1, x1 + 1, filled_area_inner_dark_border);
  726.                         gui_draw_horizontal_line(x1 + 1, x2, y2, filled_area_outer_light_border);
  727.                         gui_draw_horizontal_line(x1 + 2, x2 - 1, y2 - 1, filled_area_inner_light_border);
  728.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x2 - 1, filled_area_inner_light_border);
  729.                         gui_draw_vertical_line(y1 + 1, y2 - 1, x2, filled_area_outer_light_border);
  730.                     }
  731.                 }
  732.             }
  733.             else
  734.             {
  735.                 if (flags & UI_FILLED_AREA_ROUNDED_BORDER)  /* if round border is set */
  736.                 {                                           /* Pixtel - Gurinder 1/21/04 - Added code to support double pixel rounded corner. */
  737.                 #if !defined(__MMI_PLUTO_DOUBLEPX_ROUND_CORNER__)
  738.                     gui_draw_horizontal_line(x1 + 2, x2 - 2, y1, border_color);
  739.                     gui_draw_vertical_line(y1 + 2, y2 - 2, x1, border_color);
  740.                     gui_draw_horizontal_line(x1 + 1, x2 - 1, y1 + 1, border_color);
  741.                     gui_draw_vertical_line(y1 + 2, y2 - 2, x1 + 1, border_color);
  742.                     gui_draw_horizontal_line(x1 + 2, x2 - 2, y2, border_color);
  743.                     gui_draw_horizontal_line(x1 + 1, x2 - 1, y2 - 1, border_color);
  744.                     gui_draw_vertical_line(y1 + 2, y2 - 2, x2 - 1, border_color);
  745.                     gui_draw_vertical_line(y1 + 2, y2 - 2, x2, border_color);
  746.                 #else /* !defined(__MMI_PLUTO_DOUBLEPX_ROUND_CORNER__) */ 
  747.                     gui_draw_horizontal_line(x1 + 2, x2 - 2, y1, border_color);
  748.                     gui_draw_horizontal_line(x1 + 1, x2 - 1, y1 + 1, border_color);
  749.                     gui_draw_vertical_line(y1 + 2, y2 - 2, x1, border_color);
  750.                     gui_draw_vertical_line(y1 + 2, y2 - 2, x1 + 1, border_color);
  751.                     gui_putpixel(x1 + 2, y1 + 2, border_color); /* Single Pixel Line To Fill Left Upper Corner */
  752.                     gui_putpixel(x2 - 2, y1 + 2, border_color); /* Single Pixel Line To Fill Left Bottom Corner */
  753.                     gui_putpixel(x1 + 2, y2 - 2, border_color); /* Single Pixel Line To Fill Right Upper Corner */
  754.                     gui_putpixel(x2 - 2, y2 - 2, border_color); /* Single Pixel Line To Fill Right Bottom Corner */
  755.                     gui_draw_vertical_line(y1 + 2, y2 - 2, x2 - 1, border_color);
  756.                     gui_draw_vertical_line(y1 + 2, y2 - 2, x2, border_color);
  757.                     gui_draw_horizontal_line(x1 + 1, x2 - 1, y2 - 1, border_color);
  758.                     gui_draw_horizontal_line(x1 + 2, x2 - 2, y2, border_color);
  759.                 #endif /* !defined(__MMI_PLUTO_DOUBLEPX_ROUND_CORNER__) */ 
  760.                 }
  761.                 else
  762.                 {
  763.                     if (flags & UI_FILLED_AREA_NO_VERTICAL_LINE)
  764.                     {
  765.                         gui_draw_horizontal_line(x1, x2, y1, border_color);
  766.                         gui_draw_horizontal_line(x1, x2, y1 + 1, border_color);
  767.                         gui_draw_horizontal_line(x1, x2, y2, border_color);
  768.                         gui_draw_horizontal_line(x1, x2, y2 - 1, border_color);
  769.                     }
  770.                     else
  771.                     {
  772.                         gui_draw_horizontal_line(x1, x2, y1, border_color);
  773.                         gui_draw_vertical_line(y1 + 1, y2, x1, border_color);
  774.                         gui_draw_horizontal_line(x1 + 1, x2 - 1, y1 + 1, border_color);
  775.                         gui_draw_vertical_line(y1 + 2, y2 - 1, x1 + 1, border_color);
  776.                         gui_draw_horizontal_line(x1 + 1, x2, y2, border_color);
  777.                         gui_draw_horizontal_line(x1 + 2, x2 - 1, y2 - 1, border_color);
  778.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x2 - 1, border_color);
  779.                         gui_draw_vertical_line(y1 + 1, y2 - 1, x2, border_color);
  780.                     }
  781.                 }
  782.             }
  783.         }
  784.         else
  785.         {
  786.             if (flags & UI_FILLED_AREA_3D_BORDER)   /* if 3d border is set */
  787.             {
  788.                 color filled_area_outer_light_border = current_filled_area_border_theme->filled_area_outer_light_border;
  789.                 color filled_area_outer_dark_border = current_filled_area_border_theme->filled_area_outer_dark_border;
  790.                 if (flags & UI_FILLED_AREA_ROUNDED_BORDER)
  791.                 {
  792.                 #if !defined(__MMI_PLUTO_DOUBLEPX_ROUND_CORNER__)
  793.                     if (flags & UI_FILLED_AREA_ELEVATED_BORDER)
  794.                     {
  795.                         gui_draw_horizontal_line(x1 + 1, x2 - 1, y1, filled_area_outer_light_border);
  796.                         gui_draw_vertical_line(y1 + 1, y2 - 1, x1, filled_area_outer_light_border);
  797.                         gui_draw_horizontal_line(x1 + 1, x2 - 1, y2, filled_area_outer_dark_border);
  798.                         gui_draw_vertical_line(y1 + 1, y2 - 1, x2, filled_area_outer_dark_border);
  799.                     }
  800.                     else
  801.                     {
  802.                         gui_draw_horizontal_line(x1 + 1, x2 - 1, y1, filled_area_outer_dark_border);
  803.                         gui_draw_vertical_line(y1 + 1, y2 - 1, x1, filled_area_outer_dark_border);
  804.                         gui_draw_horizontal_line(x1 + 1, x2 - 1, y2, filled_area_outer_light_border);
  805.                         gui_draw_vertical_line(y1 + 1, y2 - 1, x2, filled_area_outer_light_border);
  806.                     }
  807.                 #else /* !defined(__MMI_PLUTO_DOUBLEPX_ROUND_CORNER__) */ 
  808.                     if (flags & UI_FILLED_AREA_ELEVATED_BORDER)
  809.                     {
  810.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y1, filled_area_outer_light_border);
  811.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x1, filled_area_outer_light_border);
  812.                         gui_putpixel(x1 + 1, y1 + 1, filled_area_outer_light_border);   /* Single Pixel Line To Fill Left Upper Corner */
  813.                         gui_putpixel(x2 - 1, y1 + 1, filled_area_outer_light_border);   /* Single Pixel Line To Fill Left Bottom Corner */
  814.                         gui_putpixel(x1 + 1, y2 - 1, filled_area_outer_dark_border);    /* Single Pixel Line To Fill Right Upper Corner */
  815.                         gui_putpixel(x2 - 1, y2 - 1, filled_area_outer_dark_border);    /* Single Pixel Line To Fill Right Bottom Corner */
  816.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x2, filled_area_outer_dark_border);
  817.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y2, filled_area_outer_dark_border);
  818.                     }
  819.                     else
  820.                     {
  821.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y1, filled_area_outer_dark_border);
  822.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x1, filled_area_outer_dark_border);
  823.                         gui_putpixel(x1 + 1, y1 + 1, filled_area_outer_dark_border);    /* Single Pixel Line To Fill Left Upper Corner */
  824.                         gui_putpixel(x2 - 1, y1 + 1, filled_area_outer_dark_border);    /* Single Pixel Line To Fill Left Bottom Corner */
  825.                         gui_putpixel(x1 + 1, y2 - 1, filled_area_outer_light_border);   /* Single Pixel Line To Fill Right Upper Corner */
  826.                         gui_putpixel(x2 - 1, y2 - 1, filled_area_outer_light_border);   /* Single Pixel Line To Fill Right Bottom Corner */
  827.                         gui_draw_vertical_line(y1 + 2, y2 - 2, x2, filled_area_outer_light_border);
  828.                         gui_draw_horizontal_line(x1 + 2, x2 - 2, y2, filled_area_outer_light_border);
  829.                     }
  830.                 #endif /* !defined(__MMI_PLUTO_DOUBLEPX_ROUND_CORNER__) */ 
  831.                 }
  832.                 else
  833.                 {
  834.                     if (flags & UI_FILLED_AREA_ELEVATED_BORDER)
  835.                     {
  836.                         gui_draw_horizontal_line(x1, x2, y1, filled_area_outer_light_border);
  837.                         gui_draw_vertical_line(y1, y2, x1, filled_area_outer_light_border);
  838.                         gui_draw_horizontal_line(x1 + 1, x2, y2, filled_area_outer_dark_border);
  839.                         gui_draw_vertical_line(y1 + 1, y2 - 1, x2, filled_area_outer_dark_border);
  840.                     }
  841.                     else
  842.                     {
  843.                         if (flags & UI_FILLED_AREA_NO_VERTICAL_LINE)
  844.                         {
  845.                             gui_draw_horizontal_line(x1, x2, y1, filled_area_outer_dark_border);
  846.                             gui_draw_horizontal_line(x1, x2, y2, filled_area_outer_light_border);
  847.                         }
  848.                         else
  849.                         {
  850.                             gui_draw_horizontal_line(x1, x2, y1, filled_area_outer_dark_border);
  851.                             gui_draw_vertical_line(y1, y2, x1, filled_area_outer_dark_border);
  852.                             gui_draw_horizontal_line(x1 + 1, x2, y2, filled_area_outer_light_border);
  853.                             gui_draw_vertical_line(y1 + 1, y2 - 1, x2, filled_area_outer_light_border);
  854.                         }
  855.                     }
  856.                 }
  857.             }
  858.             else
  859.             {
  860.                 if (flags & UI_FILLED_AREA_ROUNDED_BORDER)
  861.                 {
  862.                 #if !defined(__MMI_PLUTO_DOUBLEPX_ROUND_CORNER__)
  863.                     gui_draw_horizontal_line(x1 + 1, x2 - 1, y1, border_color);
  864.                     gui_draw_vertical_line(y1 + 1, y2 - 1, x1, border_color);
  865.                     gui_draw_horizontal_line(x1 + 1, x2 - 1, y2, border_color);
  866.                     gui_draw_vertical_line(y1 + 1, y2 - 1, x2, border_color);
  867.                 #else /* !defined(__MMI_PLUTO_DOUBLEPX_ROUND_CORNER__) */ 
  868.                     gui_draw_vertical_line(y1 + 2, y2 - 2, x1, border_color);
  869.                     gui_draw_horizontal_line(x1 + 2, x2 - 2, y1, border_color); /* Line Next To Upper Line */
  870.                     gui_putpixel(x1 + 1, y1 + 1, border_color); /* Line Next To Upper Line */
  871.                     gui_putpixel(x2 - 1, y1 + 1, border_color); /* Line Next To Upper Line */
  872.                     gui_putpixel(x1 + 1, y2 - 1, border_color); /* Lower Edge */
  873.                     gui_putpixel(x2 - 1, y2 - 1, border_color); /* Ipx above lower edge */
  874.                     gui_draw_vertical_line(y1 + 2, y2 - 2, x2, border_color);
  875.                     gui_draw_horizontal_line(x1 + 2, x2 - 2, y2, border_color); /* Line Next To Upper Line */
  876.                 #endif /* !defined(__MMI_PLUTO_DOUBLEPX_ROUND_CORNER__) */ 
  877.                 }
  878.                 else
  879.                 {
  880.                     gui_draw_horizontal_line(x1, x2, y1, border_color);
  881.                     gui_draw_vertical_line(y1, y2, x1, border_color);
  882.                     gui_draw_horizontal_line(x1 + 1, x2, y2, border_color);
  883.                     gui_draw_vertical_line(y1 + 1, y2 - 1, x2, border_color);
  884.                 }
  885.             }
  886.         }
  887.     }
  888.     if (flags & UI_FILLED_AREA_SHADOW)
  889.     {
  890.         gui_shadow_filled_area(x1, y1, x2, y2, f);
  891.     }
  892. }
  893. /*****************************************************************************
  894.  * FUNCTION
  895.  *  gui_print_truncated_text
  896.  * DESCRIPTION
  897.  *  Print truncated text with no border .
  898.  *  
  899.  *  If length of text is greater  than
  900.  *  screen width then the text is truncated . Three dots are shown at end of text
  901.  * PARAMETERS
  902.  *  x           [IN]        Start x positoin
  903.  *  y           [IN]        Start Y position
  904.  *  xwidth      [IN]        Width of text in pixels to display
  905.  *  st          [IN]        Text to display
  906.  * RETURNS
  907.  *  void
  908.  *****************************************************************************/
  909. void gui_print_truncated_text(S32 x, S32 y, S32 xwidth, UI_string_type st)
  910. {
  911.     /*----------------------------------------------------------------*/
  912.     /* Local Variables                                                */
  913.     /*----------------------------------------------------------------*/
  914.     S32 sw, sh;
  915. #if defined(__MMI_LANG_VIETNAMESE__)
  916.     viet_tone_mark tone_mark = VIET_TONE_NONE;
  917.     viet_vowel_letter viet_vowel = VIET_VOWEL_NONE;
  918.     UI_character_type dummy_c = 0;
  919. #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  920.     UI_string_type s;
  921. #ifdef __MMI_BIDI_ALG__
  922.     S32 nLen;
  923. #endif 
  924. #ifdef __MMI_HINDI_ALG__
  925.     U16 glyph_output[G_MAX];
  926.     S32 cluster_length = 0;
  927.     U16 cluster_fill[G_MAX];
  928.     S8 hf_flag = TRUE;
  929.     PU16 hf_text_p;
  930.     S32 hf_len = 0;
  931.     U16 *hf_string;
  932.     U16 *hf_string_p;
  933.     S32 hf_total_len = 0;
  934. #endif /* __MMI_HINDI_ALG__ */ 
  935.     /*----------------------------------------------------------------*/
  936.     /* Code Body                                                      */
  937.     /*----------------------------------------------------------------*/
  938. #ifdef __MMI_HINDI_ALG__
  939.     hf_len = UCS2Strlen((const char*)st);
  940.     hf_string_p = st;
  941.     hf_string = (U16*) OslMalloc((hf_len + 1) * 2);
  942.     while (hf_len--)
  943.     {
  944.         if (HF_HINDI_RANGE(*hf_string_p))
  945.         {
  946.             hf_string_p++;
  947.             hf_flag = FALSE;
  948.             break;
  949.         }
  950.     }
  951.     if (!hf_flag)
  952.     {
  953.         hf_text_p = st;
  954.         hf_string_p = hf_string;
  955.         init_cluster_start_p((PU8) hf_text_p);
  956.         init_cluster_end_p((PU8) hf_text_p);
  957.         do
  958.         {
  959.             cluster_length = hf_get_cluster(cluster_fill);
  960.             if (cluster_length)
  961.             {
  962.                 hf_hindi_rules(glyph_output, cluster_fill, cluster_length);
  963.                 hf_len = UCS2Strlen((const S8*)glyph_output);
  964.                 hf_text_p += cluster_length;
  965.                 memcpy(hf_string_p, glyph_output, hf_len * 2);
  966.                 hf_string_p += hf_len;
  967.                 hf_total_len += hf_len;
  968.             }
  969.         } while (cluster_length);
  970.         *hf_string_p = (U16) NULL;
  971.         s = hf_string;
  972.     }
  973.     else
  974. #endif /* __MMI_HINDI_ALG__ */ 
  975.     {
  976.         s = st;
  977.     }
  978. #ifdef __MMI_BIDI_ALG__
  979.     nLen = UCS2Strlen((const char*)s);
  980.     MMI_ASSERT(!(nLen > MAX_TEXT_LENGTH - ENCODING_LENGTH));
  981.     UCS2Strcpy((S8*) pwcWord, (S8*) s);
  982.     nLen = UCS2Strlen((const char*)pwcWord);
  983. #if defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__)
  984. #if defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__)
  985.     if (nLen)
  986.     {
  987.     #ifdef __MMI_ZI_V7__
  988.         /* PMT START PERSIAN */
  989.     #if defined(__MMI_ZI_PERSIAN__) && defined(__MMI_ZI_ARABIC__)
  990.         ZiStringShape(ZI8_LANG_FA, (U16*) & nLen, pwcWord);
  991.     #elif defined (__MMI_ZI_PERSIAN__)
  992.         ZiStringShape(ZI8_LANG_FA, (U16*) & nLen, pwcWord);
  993.     #elif defined (__MMI_ZI_ARABIC__)
  994.         ZiStringShape(ZI8_LANG_AR, (U16*) & nLen, pwcWord);
  995.     #endif 
  996.         /* PMT END PERSIAN */
  997.     #else /* __MMI_ZI_V7__ */ 
  998.         ArabicStringShape((U16*) & nLen, pwcWord);  /* output will replace the input string after returning */
  999.     #endif /* __MMI_ZI_V7__ */ 
  1000.     }
  1001. #else /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  1002.     if (nLen)
  1003.     {
  1004.         ArabicShapeEngine((U16*) & nLen, pwcWord);  /* output will replace the input string after returning */
  1005.     }
  1006. #endif /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  1007. #endif /* defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__) */ 
  1008.     s = pwcWord;
  1009. #endif /* __MMI_BIDI_ALG__ */ 
  1010.     gui_measure_string(s, &sw, &sh);
  1011.     
  1012.     if (sw > xwidth)
  1013.     {
  1014.         UI_character_type es[] = { '.', '.', '' };
  1015.         UI_character_type c;
  1016.         U8 done = 0;
  1017.         UI_buffer_type text_p, last_p, previous_p;
  1018.         S32 ew, lh, cw, ch, total_width, w;
  1019.         U8* text=(U8*)s;
  1020.         //U8 text[512];   /* =(U8*)UI_temp_buffer; */
  1021.         /* get string width */
  1022.         ew = gui_get_string_width((UI_string_type) es);
  1023.         //gui_strcpy((UI_string_type) text, s);
  1024.         text_p = (U8*) text;
  1025.         last_p = (U8*) text;
  1026.         total_width = lh = 0;
  1027.         //w = xwidth - ew + 4;//082406 truncate
  1028.         w = xwidth - ew;
  1029.     #ifdef __MMI_LANG_THAI__
  1030.         if (HaveThaiCharacter(s))
  1031.         {
  1032.             //If the length of string is too long to show and it has Thai characters,we need to process this string in different way
  1033.             //The defect of this way is that it need to process the string two times(maybe more) and if the string is too long,it may waaste a lot of time.
  1034.             int i = 1;
  1035.             gui_measure_string_n(s, i, &sw, &sh);
  1036.             while (sw < w)
  1037.             {
  1038.                 i++;
  1039.                 gui_measure_string_n(s, i, &sw, &sh);
  1040.             }
  1041.             gui_move_text_cursor(x, y);
  1042.             gui_print_text_n((UI_string_type) s, i - 1);
  1043.             gui_measure_string_n(s, i - 1, &sw, &sh);
  1044.             gui_move_text_cursor(x + sw, y);
  1045.             gui_print_bordered_text((UI_string_type) es);
  1046.             return;
  1047.         }
  1048.     #endif /* __MMI_LANG_THAI__ */ 
  1049.         /* First pass: find the last displayable character and the string dimensions  */
  1050.         while (!done)
  1051.         {
  1052.             previous_p = text_p;
  1053.             UI_STRING_GET_NEXT_CHARACTER(text_p, c);    /* get next character in c , and point the pointer text_p to next character */
  1054.             /* This function is not designed for multi-line */
  1055.             if (c == (UI_character_type) 'n')
  1056.             {
  1057.                 c = (UI_character_type) ' ';
  1058.             }
  1059.         #if defined(__MMI_LANG_VIETNAMESE__)
  1060.             if ((c > 0x0040) && (c < 0x01B1))
  1061.             {
  1062.                 UI_STRING_GET_NEXT_CHARACTER(text_p, dummy_c);  /* get next character */
  1063.                 tone_mark = mmi_viet_tone_mark(dummy_c);
  1064.                 if (VIET_TONE_NONE != tone_mark)
  1065.                 {
  1066.                     viet_vowel = mmi_viet_vowel_letter(c);
  1067.                     if (VIET_VOWEL_NONE != viet_vowel)
  1068.                     {
  1069.                         c = mmi_viet_combine_vowel_tone(viet_vowel, tone_mark);
  1070.                     }
  1071.                     else
  1072.                     {
  1073.                         UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1074.                     }
  1075.                 }
  1076.                 else
  1077.                 {
  1078.                     UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1079.                 }
  1080.             }
  1081.         #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1082.             gui_measure_character(c, &cw, &ch); /* measure width of character in pixels */
  1083.             if (UI_STRING_LINE_BREAK_CHARACTER(c) || UI_STRING_END_OF_STRING_CHARACTER(c))      /* check for end or space */
  1084.             {
  1085.                 last_p = previous_p;
  1086.                 break;
  1087.             }
  1088.             if ((total_width + cw) > w)
  1089.             {
  1090.                 last_p = previous_p;
  1091.                 break;
  1092.             }
  1093.             if (ch > lh)
  1094.             {
  1095.                 lh = ch;
  1096.             }
  1097.             total_width += cw;
  1098.         }
  1099.         /* Second pass: display the text */
  1100.         text_p = (U8*) text;
  1101.         while (text_p != last_p)
  1102.         {
  1103.             UI_STRING_GET_NEXT_CHARACTER(text_p, c);
  1104.         #if defined(__MMI_LANG_VIETNAMESE__)
  1105.             if ((c > 0x0040) && (c < 0x01B1))
  1106.             {
  1107.                 UI_STRING_GET_NEXT_CHARACTER(text_p, dummy_c);  /* get next character */
  1108.                 tone_mark = mmi_viet_tone_mark(dummy_c);
  1109.                 if (VIET_TONE_NONE != tone_mark)
  1110.                 {
  1111.                     viet_vowel = mmi_viet_vowel_letter(c);
  1112.                     if (VIET_VOWEL_NONE != viet_vowel)
  1113.                     {
  1114.                         c = mmi_viet_combine_vowel_tone(viet_vowel, tone_mark);
  1115.                     }
  1116.                     else
  1117.                     {
  1118.                         UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1119.                     }
  1120.                 }
  1121.                 else
  1122.                 {
  1123.                     UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1124.                 }
  1125.             }
  1126.         #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1127.             gui_measure_character(c, &cw, &ch);
  1128.             gui_move_text_cursor(x, y + lh - ch);
  1129.             gui_print_character(c);
  1130.             if (r2lMMIFlag)
  1131.             {
  1132.                 x -= cw;
  1133.             }
  1134.             else
  1135.             {
  1136.                 x += cw;
  1137.             }
  1138.         }
  1139.         gui_measure_character((UI_character_type) es[0], &cw, &ch);
  1140.         gui_move_text_cursor(x, y + lh - ch);   /* move cursor to particular position x,y */
  1141.         gui_print_text((UI_string_type) es);    /* print text */
  1142.     }
  1143.     else
  1144.     {
  1145.         gui_move_text_cursor(x, y);         /* move cursor to x,y position */
  1146.     #ifdef __MMI_HINDI_ALG__
  1147.         hf_disable_hindi_rules_parsing();   /* vj */
  1148.         gui_print_text(s);                  /* print text //vj */
  1149.         hf_enable_hindi_rules_parsing();    /* vj */
  1150.     #else /* __MMI_HINDI_ALG__ */ 
  1151.         gui_print_text(s);                  /* print text */
  1152.     #endif /* __MMI_HINDI_ALG__ */ 
  1153.     }
  1154. #ifdef __MMI_HINDI_ALG__
  1155.     OslMfree(hf_string);
  1156. #endif 
  1157. }
  1158. /*****************************************************************************
  1159.  * FUNCTION
  1160.  *  gui_print_truncated_borderd_text
  1161.  * DESCRIPTION
  1162.  *  Print truncated text border .
  1163.  *  
  1164.  *  If length of text is greater  than
  1165.  *  screen width then the text is truncated . Three dots are shown at end of text
  1166.  * PARAMETERS
  1167.  *  x           [IN]        Start x positoin
  1168.  *  y           [IN]        Start Y position
  1169.  *  xwidth      [IN]        Width of text in pixels to display
  1170.  *  st          [IN]        Text to display
  1171.  * RETURNS
  1172.  *  void
  1173.  *****************************************************************************/
  1174. void gui_print_truncated_borderd_text(S32 x, S32 y, S32 xwidth, UI_string_type st)
  1175. {
  1176.     /*----------------------------------------------------------------*/
  1177.     /* Local Variables                                                */
  1178.     /*----------------------------------------------------------------*/
  1179.     S32 sw, sh;
  1180. #if defined(__MMI_LANG_VIETNAMESE__)
  1181.     viet_tone_mark tone_mark = VIET_TONE_NONE;
  1182.     viet_vowel_letter viet_vowel = VIET_VOWEL_NONE;
  1183.     UI_character_type dummy_c;
  1184. #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1185.     UI_string_type s = st;
  1186. #ifdef __MMI_HINDI_ALG__
  1187.     S32 border_hindi = 1;
  1188.     U16 glyph_output[G_MAX];
  1189.     S32 cluster_length = 0;
  1190.     U16 cluster_fill[G_MAX];
  1191.     S8 hf_flag = TRUE;
  1192.     PU16 hf_text_p;
  1193.     S32 hf_len = 0;
  1194.     U16 *hf_string;
  1195.     U16 *hf_string_p;
  1196.     S32 hf_total_len = 0;
  1197. #endif /* __MMI_HINDI_ALG__ */ 
  1198. #ifdef __MMI_BIDI_ALG__
  1199.     S32 nLen;
  1200. #endif 
  1201.     /*----------------------------------------------------------------*/
  1202.     /* Code Body                                                      */
  1203.     /*----------------------------------------------------------------*/
  1204. #ifdef __MMI_HINDI_ALG__
  1205.     hf_len = UCS2Strlen((const char*)st);
  1206.     hf_string_p = st;
  1207.     hf_string = (U16*) OslMalloc((hf_len + 1) * 2);
  1208.     while (hf_len--)
  1209.     {
  1210.         if (HF_HINDI_RANGE(*hf_string_p))
  1211.         {
  1212.             hf_string_p++;
  1213.             hf_flag = FALSE;
  1214.             break;
  1215.         }
  1216.     }
  1217.     if (!hf_flag)
  1218.     {
  1219.         hf_text_p = st;
  1220.         hf_string_p = hf_string;
  1221.         init_cluster_start_p((PU8) hf_text_p);
  1222.         init_cluster_end_p((PU8) hf_text_p);
  1223.         do
  1224.         {
  1225.             cluster_length = hf_get_cluster(cluster_fill);
  1226.             if (cluster_length)
  1227.             {
  1228.                 hf_hindi_rules(glyph_output, cluster_fill, cluster_length);
  1229.                 hf_len = UCS2Strlen((const S8*)glyph_output);
  1230.                 hf_text_p += cluster_length;
  1231.                 memcpy(hf_string_p, glyph_output, hf_len * 2);
  1232.                 hf_string_p += hf_len;
  1233.                 hf_total_len += hf_len;
  1234.             }
  1235.         } while (cluster_length);
  1236.         *hf_string_p = (U16) NULL;
  1237.         s = hf_string;
  1238.     }
  1239.     else
  1240. #endif /* __MMI_HINDI_ALG__ */ 
  1241.     {
  1242.         s = st;
  1243.     }
  1244. #ifdef __MMI_BIDI_ALG__
  1245.     nLen = UCS2Strlen((const char*)s);
  1246.     MMI_ASSERT(!(nLen > MAX_TEXT_LENGTH - ENCODING_LENGTH));
  1247.     UCS2Strcpy((S8*) pwcWord, (S8*) s);
  1248.     nLen = UCS2Strlen((const char*)pwcWord);
  1249. #if defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__)
  1250. #if defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__)
  1251.     if (nLen)
  1252.     {
  1253.     #ifdef __MMI_ZI_V7__
  1254.         /* PMT START PERSIAN */
  1255.     #if defined(__MMI_ZI_PERSIAN__) && defined(__MMI_ZI_ARABIC__)
  1256.         ZiStringShape(ZI8_LANG_FA, (U16*) & nLen, pwcWord);
  1257.     #elif defined (__MMI_ZI_PERSIAN__)
  1258.         ZiStringShape(ZI8_LANG_FA, (U16*) & nLen, pwcWord);
  1259.     #elif defined (__MMI_ZI_ARABIC__)
  1260.         ZiStringShape(ZI8_LANG_AR, (U16*) & nLen, pwcWord);
  1261.     #endif 
  1262.         /* PMT END PERSIAN */
  1263.     #else /* __MMI_ZI_V7__ */ 
  1264.         ArabicStringShape((U16*) & nLen, pwcWord);  /* output will replace the input string after returning */
  1265.     #endif /* __MMI_ZI_V7__ */ 
  1266.     }
  1267. #else /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  1268.     if (nLen)
  1269.     {
  1270.         ArabicShapeEngine((U16*) & nLen, pwcWord);  /* output will replace the input string after returning */
  1271.     }
  1272. #endif /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  1273. #endif /* defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__) */ 
  1274.     s = pwcWord;
  1275. #endif /* __MMI_BIDI_ALG__ */ 
  1276.     gui_measure_string(s, &sw, &sh);
  1277.     if (sw > xwidth)
  1278.     {
  1279.         UI_character_type es[] = { '.', '.', '' };
  1280.         UI_character_type c;
  1281.         U8 done = 0;
  1282.         UI_buffer_type text_p, last_p, previous_p;
  1283.         S32 ew, lh, cw, ch, total_width, w;
  1284.         U8* text=(U8*)s;
  1285.         //U8 text[512];   /* =(U8*)UI_temp_buffer; */
  1286.         ew = gui_get_string_width((UI_string_type) es); /* get string width in pixels */
  1287.         //gui_strcpy((UI_string_type) text, s);
  1288.         text_p = (U8*) text;
  1289.         last_p = (U8*) text;
  1290.         total_width = lh = 0;
  1291.         //Adding the width of 4 will cause error as we don't have space for two dots.
  1292.         //w=xwidth-ew+4; 
  1293.         w = xwidth - ew - 2;
  1294.     #ifdef __MMI_LANG_THAI__
  1295.         if (HaveThaiCharacter(s))
  1296.         {
  1297.             //If the length of string is too long to show and it has Thai characters,we need to process this string in different way
  1298.             //The defect of this way is that it need to process the string two times(maybe more) and if the string is too long,it may waaste a lot of time.
  1299.             int i = 1;
  1300.             gui_measure_string_n(s, i, &sw, &sh);
  1301.             while (sw < w)
  1302.             {
  1303.                 i++;
  1304.                 gui_measure_string_n(s, i, &sw, &sh);
  1305.             }
  1306.             gui_move_text_cursor(x, y);
  1307.             gui_print_bordered_text_n((UI_string_type) s, i - 1);
  1308.             gui_measure_string_n(s, i - 1, &sw, &sh);
  1309.             gui_move_text_cursor(x + sw, y);
  1310.             gui_print_bordered_text((UI_string_type) es);
  1311.             return;
  1312.         }
  1313.     #endif /* __MMI_LANG_THAI__ */ 
  1314.         /* First pass: find the last displayable character and the string dimensions  */
  1315.         while (!done)
  1316.         {
  1317.             previous_p = text_p;
  1318.             UI_STRING_GET_NEXT_CHARACTER(text_p, c);
  1319.             /* This function is not designed for multi-line */
  1320.             if (c == (UI_character_type) 'n')
  1321.             {
  1322.                 c = (UI_character_type) ' ';
  1323.             }
  1324.         #if defined(__MMI_LANG_VIETNAMESE__)
  1325.             if ((c > 0x0040) && (c < 0x01B1))
  1326.             {
  1327.                 UI_STRING_GET_NEXT_CHARACTER(text_p, dummy_c);  /* get next character */
  1328.                 tone_mark = mmi_viet_tone_mark(dummy_c);
  1329.                 if (VIET_TONE_NONE != tone_mark)
  1330.                 {
  1331.                     viet_vowel = mmi_viet_vowel_letter(c);
  1332.                     if (VIET_VOWEL_NONE != viet_vowel)
  1333.                     {
  1334.                         c = mmi_viet_combine_vowel_tone(viet_vowel, tone_mark);
  1335.                     }
  1336.                     else
  1337.                     {
  1338.                         UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1339.                     }
  1340.                 }
  1341.                 else
  1342.                 {
  1343.                     UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1344.                 }
  1345.             }
  1346.         #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1347.             gui_measure_character(c, &cw, &ch); /* measure width of character in pixels */
  1348.             if (UI_STRING_LINE_BREAK_CHARACTER(c) || UI_STRING_END_OF_STRING_CHARACTER(c))
  1349.             {
  1350.                 last_p = previous_p;
  1351.                 break;
  1352.             }
  1353.             if ((total_width + cw) > w)
  1354.             {
  1355.                 last_p = previous_p;
  1356.                 break;
  1357.             }
  1358.             if (ch > lh)
  1359.             {
  1360.                 lh = ch;
  1361.             }
  1362.             total_width += cw;
  1363.         }
  1364.         /* Second pass: display the text */
  1365.         text_p = (U8*) text;
  1366.         {
  1367.             U8 no_of_chars = (last_p - text_p) / ENCODING_LENGTH;
  1368.             U8 *string_to_be_reversed;
  1369.             U8 *orginal_string_to_be_reversed;
  1370.             orginal_string_to_be_reversed = OslMalloc((no_of_chars + 4) * ENCODING_LENGTH);
  1371.             string_to_be_reversed = orginal_string_to_be_reversed;
  1372.             UCS2Strncpy((char*)orginal_string_to_be_reversed, (const char*)text_p, no_of_chars);
  1373.             string_to_be_reversed += (no_of_chars * ENCODING_LENGTH);
  1374.             /* Add .. in the end */
  1375.             *string_to_be_reversed++ = '.';
  1376.             *(string_to_be_reversed++) = '';
  1377.             *string_to_be_reversed++ = '.';
  1378.             *(string_to_be_reversed++) = '';
  1379.             /* Add NULL in the end */
  1380.             *string_to_be_reversed++ = '';
  1381.             *string_to_be_reversed++ = '';
  1382.             gui_measure_character((UI_character_type) es[0], &cw, &ch);
  1383.             gui_move_text_cursor(x, y);
  1384.             gui_print_bordered_text((UI_string_type) orginal_string_to_be_reversed);
  1385.             OslMfree(orginal_string_to_be_reversed);
  1386.         }
  1387.     #if 0
  1388. /* under construction !*/
  1389. /* under construction !*/
  1390. /* under construction !*/
  1391. /* under construction !*/
  1392. #if defined(__MMI_LANG_VIETNAMESE__)
  1393. /* under construction !*/
  1394. /* under construction !*/
  1395. /* under construction !*/
  1396. /* under construction !*/
  1397. /* under construction !*/
  1398. /* under construction !*/
  1399. /* under construction !*/
  1400. /* under construction !*/
  1401. /* under construction !*/
  1402. /* under construction !*/
  1403. /* under construction !*/
  1404. /* under construction !*/
  1405. /* under construction !*/
  1406. /* under construction !*/
  1407. /* under construction !*/
  1408. /* under construction !*/
  1409. /* under construction !*/
  1410. /* under construction !*/
  1411. /* under construction !*/
  1412. /* under construction !*/
  1413. /* under construction !*/
  1414. #endif
  1415. /* under construction !*/
  1416. /* under construction !*/
  1417.          #if defined(__MMI_HINDI_ALG__)
  1418. /* under construction !*/
  1419. /* under construction !*/
  1420. /* under construction !*/
  1421. /* under construction !*/
  1422. /* under construction !*/
  1423. /* under construction !*/
  1424. /* under construction !*/
  1425. /* under construction !*/
  1426. /* under construction !*/
  1427.          #endif
  1428. /* under construction !*/
  1429. /* under construction !*/
  1430. /* under construction !*/
  1431. /* under construction !*/
  1432. /* under construction !*/
  1433. /* under construction !*/
  1434. /* under construction !*/
  1435. /* under construction !*/
  1436. /* under construction !*/
  1437. /* under construction !*/
  1438. /* under construction !*/
  1439. /* under construction !*/
  1440. /* under construction !*/
  1441. /* under construction !*/
  1442.     #endif /* 0 */ 
  1443.     }
  1444.     else
  1445.     {
  1446.         gui_move_text_cursor(x, y);
  1447.     #ifdef __MMI_HINDI_ALG__
  1448.         hf_disable_hindi_rules_parsing();   /* vj */
  1449.         gui_print_bordered_text(s);         /* vj */
  1450.         hf_enable_hindi_rules_parsing();    /* vj */
  1451.     #else /* __MMI_HINDI_ALG__ */ 
  1452.         gui_print_bordered_text(s);         /* vj */
  1453.     #endif /* __MMI_HINDI_ALG__ */ 
  1454.     }
  1455. #ifdef __MMI_HINDI_ALG__
  1456.     OslMfree(hf_string);
  1457. #endif 
  1458. }
  1459. /*****************************************************************************
  1460.  * FUNCTION
  1461.  *  gui_print_truncated_text2
  1462.  * DESCRIPTION
  1463.  *  Displays truncated text (Does not display ...)
  1464.  * PARAMETERS
  1465.  *  x           [IN]        Top left corner of text display
  1466.  *  y           [IN]        Top left corner of text display
  1467.  *  xwidth      [IN]        Width (in pixels) available for text display
  1468.  *  ss          [IN]         Text to be displayed
  1469.  * RETURNS
  1470.  *  Non-zero if the complete string was displayed
  1471.  *  zero if the complete string could not be displayed
  1472.  *****************************************************************************/
  1473. U8 gui_print_truncated_text2(S32 x, S32 y, S32 xwidth, UI_string_type *ss)
  1474. {
  1475.     /*----------------------------------------------------------------*/
  1476.     /* Local Variables                                                */
  1477.     /*----------------------------------------------------------------*/
  1478.     S32 sw, sh;
  1479. #if defined(__MMI_LANG_VIETNAMESE__)
  1480.     viet_tone_mark tone_mark = VIET_TONE_NONE;
  1481.     viet_vowel_letter viet_vowel = VIET_VOWEL_NONE;
  1482. #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1483. #ifdef __MMI_BIDI_ALG__
  1484.     S32 nLen;
  1485. #endif 
  1486.     /*----------------------------------------------------------------*/
  1487.     /* Code Body                                                      */
  1488.     /*----------------------------------------------------------------*/
  1489. #ifdef __MMI_BIDI_ALG__
  1490.     nLen = UCS2Strlen((const char*)ss);
  1491.     MMI_ASSERT(!(nLen > MAX_TEXT_LENGTH - ENCODING_LENGTH));
  1492.     UCS2Strcpy((S8*) pwcWord, (S8*) ss);
  1493.     nLen = UCS2Strlen((const char*)pwcWord);
  1494. #if defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__)
  1495. #if defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__)
  1496.     if (nLen)
  1497.     {
  1498. #ifdef __MMI_ZI_V7__
  1499.         /* PMT START PERSIAN */
  1500.     #if defined(__MMI_ZI_PERSIAN__) && defined(__MMI_ZI_ARABIC__)
  1501.         ZiStringShape(ZI8_LANG_FA, (U16*) & nLen, pwcWord);
  1502.     #elif defined (__MMI_ZI_PERSIAN__)
  1503.         ZiStringShape(ZI8_LANG_FA, (U16*) & nLen, pwcWord);
  1504.     #elif defined (__MMI_ZI_ARABIC__)
  1505.         ZiStringShape(ZI8_LANG_AR, (U16*) & nLen, pwcWord);
  1506.     #endif 
  1507.         /* PMT END PERSIAN */
  1508. #else /* __MMI_ZI_V7__ */ 
  1509.         ArabicStringShape((U16*) & nLen, pwcWord);  /* output will replace the input string after returning */
  1510. #endif /* __MMI_ZI_V7__ */ 
  1511.     }
  1512. #else /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  1513.     if (nLen)
  1514.     {
  1515.         ArabicShapeEngine((U16*) & nLen, pwcWord);  /* output will replace the input string after returning */
  1516.     }
  1517. #endif /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  1518. #endif /* defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__) */ 
  1519.     ss = (UI_string_type*) pwcWord;
  1520. #endif /* __MMI_BIDI_ALG__ */ 
  1521.     gui_measure_string(*ss, &sw, &sh);
  1522.     if (sw > xwidth)
  1523.     {
  1524.         UI_character_type c, dummy_c;
  1525.         U8 done = 0;
  1526.         UI_buffer_type text_p, last_p, previous_p;
  1527.         S32 lh, cw, ch, total_width, w;
  1528.         U8* text=(U8*)*ss;
  1529.         //U8 text[512];   /* =(U8*)UI_temp_buffer; */
  1530.         U8 *s = (U8*) * ss;
  1531.         //gui_strcpy((UI_string_type) text, *ss);
  1532.         text_p = (U8*) text;
  1533.         last_p = (U8*) text;
  1534.         total_width = lh = 0;
  1535.         w = xwidth;
  1536.     #ifdef __MMI_LANG_THAI__
  1537.         if (HaveThaiCharacter(*ss))
  1538.         {
  1539.             //If the length of string is too long to show and it has Thai characters,we need to process this string in different way
  1540.             //The defect of this way is that it need to process the string two times(maybe more) and if the string is too long,it may waaste a lot of time.
  1541.             int i = 1;
  1542.             gui_measure_string_n(*ss, i, &sw, &sh);
  1543.             while (sw < w)
  1544.             {
  1545.                 i++;
  1546.                 gui_measure_string_n(*ss, i, &sw, &sh);
  1547.             }
  1548.             gui_move_text_cursor(x, y);
  1549.             gui_print_text_n((UI_string_type) * ss, i - 1);
  1550.             ss += (i - 1) * 2;
  1551.             return 0;
  1552.         }
  1553.     #endif /* __MMI_LANG_THAI__ */ 
  1554.         /* First pass: find the last displayable character and the string dimensions  */
  1555.         while (!done)
  1556.         {
  1557.             previous_p = text_p;
  1558.             UI_STRING_GET_NEXT_CHARACTER(text_p, c);    /* get next character in c , and point the pointer text_p to next character */
  1559.             /* This function is not designed for multi-line */
  1560.             if (c == (UI_character_type) 'n')
  1561.             {
  1562.                 c = (UI_character_type) ' ';
  1563.             }
  1564.         #if defined(__MMI_LANG_VIETNAMESE__)
  1565.             if ((c > 0x0040) && (c < 0x01B1))
  1566.             {
  1567.                 UI_STRING_GET_NEXT_CHARACTER(text_p, dummy_c);  /* get next character */
  1568.                 tone_mark = mmi_viet_tone_mark(dummy_c);
  1569.                 if (VIET_TONE_NONE != tone_mark)
  1570.                 {
  1571.                     viet_vowel = mmi_viet_vowel_letter(c);
  1572.                     if (VIET_VOWEL_NONE != viet_vowel)
  1573.                     {
  1574.                         c = mmi_viet_combine_vowel_tone(viet_vowel, tone_mark);
  1575.                     }
  1576.                     else
  1577.                     {
  1578.                         UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1579.                     }
  1580.                 }
  1581.                 else
  1582.                 {
  1583.                     UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1584.                 }
  1585.             }
  1586.         #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1587.             gui_measure_character(c, &cw, &ch); /* measure width of character in pixels */
  1588.             if (UI_STRING_LINE_BREAK_CHARACTER(c) || UI_STRING_END_OF_STRING_CHARACTER(c))      /* check for end or space */
  1589.             {
  1590.                 last_p = previous_p;
  1591.                 break;
  1592.             }
  1593.             if ((total_width + cw) > w)
  1594.             {
  1595.                 last_p = previous_p;
  1596.                 break;
  1597.             }
  1598.             if (ch > lh)
  1599.             {
  1600.                 lh = ch;
  1601.             }
  1602.             total_width += cw;
  1603.         }
  1604.         /* Second pass: display the text */
  1605.         text_p = (U8*) text;
  1606.         while (text_p != last_p)
  1607.         {
  1608.             UI_STRING_GET_NEXT_CHARACTER(text_p, c);
  1609.             UI_STRING_GET_NEXT_CHARACTER(s, dummy_c);
  1610.         #if defined(__MMI_LANG_VIETNAMESE__)
  1611.             if ((c > 0x0040) && (c < 0x01B1))
  1612.             {
  1613.                 UI_STRING_GET_NEXT_CHARACTER(text_p, dummy_c);  /* get next character */
  1614.                 tone_mark = mmi_viet_tone_mark(dummy_c);
  1615.                 if (VIET_TONE_NONE != tone_mark)
  1616.                 {
  1617.                     viet_vowel = mmi_viet_vowel_letter(c);
  1618.                     if (VIET_VOWEL_NONE != viet_vowel)
  1619.                     {
  1620.                         c = mmi_viet_combine_vowel_tone(viet_vowel, tone_mark);
  1621.                         UI_STRING_GET_NEXT_CHARACTER(s, dummy_c);
  1622.                     }
  1623.                     else
  1624.                     {
  1625.                         UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1626.                     }
  1627.                 }
  1628.                 else
  1629.                 {
  1630.                     UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1631.                 }
  1632.             }
  1633.         #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1634.             gui_measure_character(c, &cw, &ch);
  1635.             gui_move_text_cursor(x, y + lh - ch);
  1636.             gui_print_character(c);
  1637.             if (r2lMMIFlag)
  1638.             {
  1639.                 x -= cw;
  1640.             }
  1641.             else
  1642.             {
  1643.                 x += cw;
  1644.             }
  1645.         }
  1646.         *ss = (UI_string_type) s;
  1647.         return (0);
  1648.     }
  1649.     else
  1650.     {
  1651.         gui_move_text_cursor(x, y); /* move cursor to x,y position */
  1652.         gui_print_text(*ss);        /* print text */
  1653.         return (1);
  1654.     }
  1655. }
  1656. /*****************************************************************************
  1657.  * FUNCTION
  1658.  *  gui_print_truncated_bordered_text2
  1659.  * DESCRIPTION
  1660.  *  Displays truncated bordered text (Does not display ...)
  1661.  * PARAMETERS
  1662.  *  x           [IN]        Top left corner of text display
  1663.  *  y           [IN]        Top left corner of text display
  1664.  *  xwidth      [IN]        Width (in pixels) available for text display
  1665.  *  ss          [IN]        Text to be displayed
  1666.  * RETURNS
  1667.  *  Non-zero if the complete string was displayed
  1668.  *  zero if the complete string could not be displayed
  1669.  *****************************************************************************/
  1670. U8 gui_print_truncated_bordered_text2(S32 x, S32 y, S32 xwidth, UI_string_type *ss)
  1671. {
  1672.     /*----------------------------------------------------------------*/
  1673.     /* Local Variables                                                */
  1674.     /*----------------------------------------------------------------*/
  1675.     S32 sw, sh;
  1676. #if defined(__MMI_LANG_VIETNAMESE__)
  1677.     viet_tone_mark tone_mark = VIET_TONE_NONE;
  1678.     viet_vowel_letter viet_vowel = VIET_VOWEL_NONE;
  1679. #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1680. #ifdef __MMI_BIDI_ALG__
  1681.     S32 nLen;
  1682. #endif 
  1683.     /*----------------------------------------------------------------*/
  1684.     /* Code Body                                                      */
  1685.     /*----------------------------------------------------------------*/
  1686. #ifdef __MMI_BIDI_ALG__
  1687.     nLen = UCS2Strlen((const char*)ss);
  1688.     MMI_ASSERT(!(nLen > MAX_TEXT_LENGTH - ENCODING_LENGTH));
  1689.     UCS2Strcpy((S8*) pwcWord, (S8*) ss);
  1690.     nLen = UCS2Strlen((const char*)pwcWord);
  1691. #if defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__)
  1692. #if defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__)
  1693.     if (nLen)
  1694.     {
  1695. #ifdef __MMI_ZI_V7__
  1696.         /* PMT START PERSIAN */
  1697.     #if defined(__MMI_ZI_PERSIAN__) && defined(__MMI_ZI_ARABIC__)
  1698.         ZiStringShape(ZI8_LANG_FA, (U16*) & nLen, pwcWord);
  1699.     #elif defined (__MMI_ZI_PERSIAN__)
  1700.         ZiStringShape(ZI8_LANG_FA, (U16*) & nLen, pwcWord);
  1701.     #elif defined (__MMI_ZI_ARABIC__)
  1702.         ZiStringShape(ZI8_LANG_AR, (U16*) & nLen, pwcWord);
  1703.     #endif 
  1704.         /* PMT END PERSIAN */
  1705. #else /* __MMI_ZI_V7__ */ 
  1706.         ArabicStringShape((U16*) & nLen, pwcWord);  /* output will replace the input string after returning */
  1707. #endif /* __MMI_ZI_V7__ */ 
  1708.     }
  1709. #else /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  1710.     if (nLen)
  1711.     {
  1712.         ArabicShapeEngine((U16*) & nLen, pwcWord);  /* output will replace the input string after returning */
  1713.     }
  1714. #endif /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  1715. #endif /* defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__) */ 
  1716.     ss = (UI_string_type*) pwcWord;
  1717. #endif /* __MMI_BIDI_ALG__ */ 
  1718.     gui_measure_string(*ss, &sw, &sh);
  1719.     if (sw > xwidth)
  1720.     {
  1721.         UI_character_type c, dummy_c;
  1722.         U8 done = 0;
  1723.         UI_buffer_type text_p, last_p, previous_p;
  1724.         S32 lh, cw, ch, total_width, w;
  1725.         U8* text=(U8*)*ss;
  1726.         //U8 text[512];   /* =(U8*)UI_temp_buffer; */
  1727.         U8 *s = (U8*) * ss;
  1728.         //gui_strcpy((UI_string_type) text, *ss);
  1729.         text_p = (U8*) text;
  1730.         last_p = (U8*) text;
  1731.         total_width = lh = 0;
  1732.         w = xwidth;
  1733.     #ifdef __MMI_LANG_THAI__
  1734.         if (HaveThaiCharacter(*ss))
  1735.         {
  1736.             //If the length of string is too long to show and it has Thai characters,we need to process this string in different way
  1737.             //The defect of this way is that it need to process the string two times(maybe more) and if the string is too long,it may waaste a lot of time.
  1738.             int i = 1;
  1739.             gui_measure_string_n(*ss, i, &sw, &sh);
  1740.             while (sw < w)
  1741.             {
  1742.                 i++;
  1743.                 gui_measure_string_n(*ss, i, &sw, &sh);
  1744.             }
  1745.             gui_move_text_cursor(x, y);
  1746.             gui_print_bordered_text_n((UI_string_type) * ss, i - 1);
  1747.             ss += (i - 1) * 2;
  1748.             return 0;
  1749.         }
  1750.     #endif /* __MMI_LANG_THAI__ */ 
  1751.         /* First pass: find the last displayable character and the string dimensions  */
  1752.         while (!done)
  1753.         {
  1754.             previous_p = text_p;
  1755.             UI_STRING_GET_NEXT_CHARACTER(text_p, c);    /* get next character in c , and point the pointer text_p to next character */
  1756.             /* This function is not designed for multi-line */
  1757.             if (c == (UI_character_type) 'n')
  1758.             {
  1759.                 c = (UI_character_type) ' ';
  1760.             }
  1761.         #if defined(__MMI_LANG_VIETNAMESE__)
  1762.             if ((c > 0x0040) && (c < 0x01B1))
  1763.             {
  1764.                 UI_STRING_GET_NEXT_CHARACTER(text_p, dummy_c);  /* get next character */
  1765.                 tone_mark = mmi_viet_tone_mark(dummy_c);
  1766.                 if (VIET_TONE_NONE != tone_mark)
  1767.                 {
  1768.                     viet_vowel = mmi_viet_vowel_letter(c);
  1769.                     if (VIET_VOWEL_NONE != viet_vowel)
  1770.                     {
  1771.                         c = mmi_viet_combine_vowel_tone(viet_vowel, tone_mark);
  1772.                     }
  1773.                     else
  1774.                     {
  1775.                         UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1776.                     }
  1777.                 }
  1778.                 else
  1779.                 {
  1780.                     UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1781.                 }
  1782.             }
  1783.         #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1784.             gui_measure_character(c, &cw, &ch); /* measure width of character in pixels */
  1785.             if (UI_STRING_LINE_BREAK_CHARACTER(c) || UI_STRING_END_OF_STRING_CHARACTER(c))      /* check for end or space */
  1786.             {
  1787.                 last_p = previous_p;
  1788.                 break;
  1789.             }
  1790.             if ((total_width + cw) > w)
  1791.             {
  1792.                 last_p = previous_p;
  1793.                 break;
  1794.             }
  1795.             if (ch > lh)
  1796.             {
  1797.                 lh = ch;
  1798.             }
  1799.             total_width += cw;
  1800.         }
  1801.         /* Second pass: display the text */
  1802.         text_p = (U8*) text;
  1803.         while (text_p != last_p)
  1804.         {
  1805.             UI_STRING_GET_NEXT_CHARACTER(text_p, c);
  1806.             UI_STRING_GET_NEXT_CHARACTER(s, dummy_c);
  1807.         #if defined(__MMI_LANG_VIETNAMESE__)
  1808.             if ((c > 0x0040) && (c < 0x01B1))
  1809.             {
  1810.                 UI_STRING_GET_NEXT_CHARACTER(text_p, dummy_c);  /* get next character */
  1811.                 tone_mark = mmi_viet_tone_mark(dummy_c);
  1812.                 if (VIET_TONE_NONE != tone_mark)
  1813.                 {
  1814.                     viet_vowel = mmi_viet_vowel_letter(c);
  1815.                     if (VIET_VOWEL_NONE != viet_vowel)
  1816.                     {
  1817.                         c = mmi_viet_combine_vowel_tone(viet_vowel, tone_mark);
  1818.                         UI_STRING_GET_NEXT_CHARACTER(s, dummy_c);
  1819.                     }
  1820.                     else
  1821.                     {
  1822.                         UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1823.                     }
  1824.                 }
  1825.                 else
  1826.                 {
  1827.                     UI_STRING_GET_PREVIOUS_CHARACTER(text_p, dummy_c);
  1828.                 }
  1829.             }
  1830.         #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1831.             gui_measure_character(c, &cw, &ch);
  1832.             gui_move_text_cursor(x, y + lh - ch);
  1833.             gui_print_bordered_character(c);
  1834.             if (r2lMMIFlag)
  1835.             {
  1836.                 x -= cw;
  1837.             }
  1838.             else
  1839.             {
  1840.                 x += cw;
  1841.             }
  1842.         }
  1843.         *ss = (UI_string_type) s;
  1844.         return (0);
  1845.     }
  1846.     else
  1847.     {
  1848.         gui_move_text_cursor(x, y);     /* move cursor to x,y position */
  1849.         gui_print_bordered_text(*ss);   /* print text */
  1850.         return (1);
  1851.     }
  1852. }
  1853. /* 
  1854.  * Painter Component: encapsulates various painting operations with common interface
  1855.  */
  1856. /*****************************************************************************
  1857.  * FUNCTION
  1858.  *  gui_util_painter_create_empty
  1859.  * DESCRIPTION
  1860.  *  Create an empty painter that draws nothing
  1861.  * PARAMETERS
  1862.  *  p       [OUT]           created painter object 
  1863.  * RETURNS
  1864.  *  void
  1865.  *****************************************************************************/
  1866. void gui_util_painter_create_empty(gui_util_painter_struct *p)
  1867. {
  1868.     /*----------------------------------------------------------------*/
  1869.     /* Local Variables                                                */
  1870.     /*----------------------------------------------------------------*/
  1871.     /*----------------------------------------------------------------*/
  1872.     /* Code Body                                                      */
  1873.     /*----------------------------------------------------------------*/
  1874.     p->type = GUI_UTIL_PAINTER_TYPE_EMPTY;
  1875. }
  1876. /*****************************************************************************
  1877.  * FUNCTION
  1878.  *  gui_util_painter_create_transparent
  1879.  * DESCRIPTION
  1880.  *  Create a painter that fills transparent background
  1881.  * PARAMETERS
  1882.  *  p       [OUT]           created painter object 
  1883.  * RETURNS
  1884.  *  void
  1885.  *****************************************************************************/
  1886. void gui_util_painter_create_transparent(gui_util_painter_struct *p)
  1887. {
  1888.     /*----------------------------------------------------------------*/
  1889.     /* Local Variables                                                */
  1890.     /*----------------------------------------------------------------*/
  1891.     /*----------------------------------------------------------------*/
  1892.     /* Code Body                                                      */
  1893.     /*----------------------------------------------------------------*/
  1894.     p->type = GUI_UTIL_PAINTER_TYPE_TRANSPARENT;
  1895. }
  1896. /*****************************************************************************
  1897.  * FUNCTION
  1898.  *  gui_util_painter_create_imageid
  1899.  * DESCRIPTION
  1900.  *  Create a painter that draws a image
  1901.  *
  1902.  *  Note: it's preferred to use image ID instead of raw data because 
  1903.  *  image ID can be drawn with downloadable theme.
  1904.  * PARAMETERS
  1905.  *  p           [OUT]       created painter object 
  1906.  *  imageid     [IN]        image to be drawn
  1907.  * RETURNS
  1908.  *  void
  1909.  *****************************************************************************/
  1910. void gui_util_painter_create_imageid(gui_util_painter_struct *p, MMI_ID_TYPE imageid)
  1911. {
  1912.     /*----------------------------------------------------------------*/
  1913.     /* Local Variables                                                */
  1914.     /*----------------------------------------------------------------*/
  1915.     /*----------------------------------------------------------------*/
  1916.     /* Code Body                                                      */
  1917.     /*----------------------------------------------------------------*/
  1918.     p->type = GUI_UTIL_PAINTER_TYPE_IMAGEID;
  1919.     p->_u.imageid = imageid;
  1920. }
  1921. /*****************************************************************************
  1922.  * FUNCTION
  1923.  *  gui_util_painter_create_imageid
  1924.  * DESCRIPTION
  1925.  *  Create a painter that uses a callback to draw the region
  1926.  * PARAMETERS
  1927.  *  p           [OUT]       created painter object 
  1928.  *  callback    [IN]        callback draw function
  1929.  * RETURNS
  1930.  *  void
  1931.  *****************************************************************************/
  1932. void gui_util_painter_create_callback(gui_util_painter_struct *p, gui_util_painter_callback_type callback)
  1933. {
  1934.     /*----------------------------------------------------------------*/
  1935.     /* Local Variables                                                */
  1936.     /*----------------------------------------------------------------*/
  1937.     /*----------------------------------------------------------------*/
  1938.     /* Code Body                                                      */
  1939.     /*----------------------------------------------------------------*/
  1940.     p->type = GUI_UTIL_PAINTER_TYPE_CALLBACK;
  1941.     p->_u.callback = callback;
  1942. }
  1943. /*****************************************************************************
  1944.  * FUNCTION
  1945.  *  gui_util_painter_create_filler
  1946.  * DESCRIPTION
  1947.  *  Create a painter that draws a filler
  1948.  * PARAMETERS
  1949.  *  p           [OUT]       created painter object 
  1950.  *  filler      [IN]        filler (must not be released before the painter object is released)
  1951.  * RETURNS
  1952.  *  void
  1953.  *****************************************************************************/
  1954. void gui_util_painter_create_filler(gui_util_painter_struct *p, const UI_filled_area *filler)
  1955. {
  1956.     /*----------------------------------------------------------------*/
  1957.     /* Local Variables                                                */
  1958.     /*----------------------------------------------------------------*/
  1959.     /*----------------------------------------------------------------*/
  1960.     /* Code Body                                                      */
  1961.     /*----------------------------------------------------------------*/
  1962.     p->type = GUI_UTIL_PAINTER_TYPE_FILLER;
  1963.     p->_u.filler = filler;
  1964. }
  1965. /*****************************************************************************
  1966.  * FUNCTION
  1967.  *  gui_util_painter_show_clipped
  1968.  * DESCRIPTION
  1969.  *  Draw a painter in a clipped region
  1970.  *
  1971.  *  Note: if (x, y) is outside (clip_x1, clip_y1, clip_x2, clip_y2), it is clipped. 
  1972.  *
  1973.  *  For example, when it draws an image, the left-top corner of the image is
  1974.  *  (x, y), but the displayed area is (clip_x1, clip_y1, clip_x2, clip_y2).
  1975.  * PARAMETERS
  1976.  *  p               [IN]    painter object 
  1977.  *  x               [IN]    x coordinate of left-top corner of painting area
  1978.  *  y               [IN]    y coordinate of left-top corner of painting area
  1979.  *  clip_x1         [IN]    clipping area
  1980.  *  clip_y1         [IN]    clipping area
  1981.  *  clip_x2         [IN]    clipping area
  1982.  *  clip_y2         [IN]    clipping area
  1983.  * RETURNS
  1984.  *  void
  1985.  *****************************************************************************/
  1986. void gui_util_painter_show_clipped(
  1987.         const gui_util_painter_struct *p, 
  1988.         S32 x, 
  1989.         S32 y, 
  1990.         S32 clip_x1, 
  1991.         S32 clip_y1, 
  1992.         S32 clip_x2, 
  1993.         S32 clip_y2)
  1994. {
  1995.     /*----------------------------------------------------------------*/
  1996.     /* Local Variables                                                */
  1997.     /*----------------------------------------------------------------*/
  1998.     /*----------------------------------------------------------------*/
  1999.     /* Code Body                                                      */
  2000.     /*----------------------------------------------------------------*/
  2001.     if (x > clip_x2 || y > clip_y2 || clip_x2 < 0 || clip_y2 < 0 || 
  2002.         x >= UI_device_width || y >= UI_device_height)
  2003.     {
  2004.         return;
  2005.     }
  2006.     if (x > clip_x1)
  2007.     {
  2008.         clip_x1 = x;
  2009.     }
  2010.     if (y > clip_y1)
  2011.     {
  2012.         clip_y1 = y;
  2013.     }
  2014.     
  2015.     gui_push_clip();
  2016.     gui_set_clip(clip_x1, clip_y1, clip_x2, clip_y2);
  2017.     switch (p->type)
  2018.     {
  2019.         case GUI_UTIL_PAINTER_TYPE_TRANSPARENT:
  2020.             gdi_draw_solid_rect(clip_x1, clip_y1, clip_x2, clip_y2, GDI_COLOR_TRANSPARENT);
  2021.             break;
  2022.             
  2023.         case GUI_UTIL_PAINTER_TYPE_IMAGEID:
  2024.             gui_show_transparent_image(
  2025.                 x,
  2026.                 y,
  2027.                 (PU8) GetImage(p->_u.imageid),
  2028.                 UI_DEFAULT_TRANSPARENT_COLOR);
  2029.             break;
  2030.         case GUI_UTIL_PAINTER_TYPE_CALLBACK:
  2031.             p->_u.callback(x, y, clip_x1, clip_y1, clip_x2, clip_y2);
  2032.             break;
  2033.         case GUI_UTIL_PAINTER_TYPE_FILLER:
  2034.             /* Some types of filler have starting point, so we use x/y instead of clip_x1/clip_y1 */
  2035.             gui_draw_filled_area(x, y, clip_x2, clip_y2, (UI_filled_area *) p->_u.filler);
  2036.             break;
  2037.             
  2038.         default:
  2039.             /* Do nothing */
  2040.             break;
  2041.     }
  2042.  
  2043.     gui_pop_clip();
  2044. }
  2045. /*****************************************************************************
  2046.  * FUNCTION
  2047.  *  gui_util_painter_show
  2048.  * DESCRIPTION
  2049.  *  Draw a painter 
  2050.  * PARAMETERS
  2051.  *  p               [IN]    painter object 
  2052.  *  x1              [IN]    x coordinate of left-top corner 
  2053.  *  y1              [IN]    y coordinate of left-top corner 
  2054.  *  x2              [IN]    x coordinate of right-bottom corner 
  2055.  *  y2              [IN]    y coordinate of right-bottom corner 
  2056.  * RETURNS
  2057.  *  void
  2058.  *****************************************************************************/
  2059. void gui_util_painter_show(const gui_util_painter_struct *p, S32 x1, S32 y1, S32 x2, S32 y2)
  2060. {
  2061.     /*----------------------------------------------------------------*/
  2062.     /* Local Variables                                                */
  2063.     /*----------------------------------------------------------------*/
  2064.     /*----------------------------------------------------------------*/
  2065.     /* Code Body                                                      */
  2066.     /*----------------------------------------------------------------*/
  2067.     gui_util_painter_show_clipped(p, x1, y1, x1, y1, x2, y2);
  2068. }
  2069. /* 
  2070.  * Clean-up of GUI components 
  2071.  * To avoid clean-up each UI component explicitly in WGUI/draw manager/widget, 
  2072.  * general cleanup mechanism is provided here.
  2073.  */
  2074. static gui_cleanup_hook_hdlr g_mmi_gui_cleanup_hooks[GUI_MAX_CLEANUP_HOOK];
  2075. /*****************************************************************************
  2076.  * FUNCTION
  2077.  *  gui_add_cleanup_hook
  2078.  * DESCRIPTION
  2079.  *  
  2080.  * PARAMETERS
  2081.  *  fp      [IN]        
  2082.  * RETURNS
  2083.  *  void
  2084.  *****************************************************************************/
  2085. void gui_add_cleanup_hook(gui_cleanup_hook_hdlr fp)
  2086. {
  2087.     /*----------------------------------------------------------------*/
  2088.     /* Local Variables                                                */
  2089.     /*----------------------------------------------------------------*/
  2090.     S32 i;
  2091.     gui_cleanup_hook_hdlr *item = g_mmi_gui_cleanup_hooks;
  2092.     /*----------------------------------------------------------------*/
  2093.     /* Code Body                                                      */
  2094.     /*----------------------------------------------------------------*/
  2095.     if (!fp)
  2096.     {
  2097.         return;
  2098.     }
  2099.     for (i = 0; i < GUI_MAX_CLEANUP_HOOK; i++)
  2100.     {
  2101.         if (*item == fp)
  2102.         {
  2103.             return;
  2104.         }
  2105.         item++;
  2106.     }
  2107.     item = g_mmi_gui_cleanup_hooks;
  2108.     for (i = 0; i < GUI_MAX_CLEANUP_HOOK; i++)
  2109.     {
  2110.         if (!*item)
  2111.         {
  2112.             *item = fp;
  2113.             return;
  2114.         }
  2115.         item++;
  2116.     }
  2117.     /* The table is full */
  2118.     MMI_ASSERT(0);
  2119. }
  2120. /*****************************************************************************
  2121.  * FUNCTION
  2122.  *  gui_remove_cleanup_hook
  2123.  * DESCRIPTION
  2124.  *  
  2125.  * PARAMETERS
  2126.  *  fp      [IN]        
  2127.  * RETURNS
  2128.  *  void
  2129.  *****************************************************************************/
  2130. void gui_remove_cleanup_hook(gui_cleanup_hook_hdlr fp)
  2131. {
  2132.     /*----------------------------------------------------------------*/
  2133.     /* Local Variables                                                */
  2134.     /*----------------------------------------------------------------*/
  2135.     S32 i;
  2136.     gui_cleanup_hook_hdlr *item = g_mmi_gui_cleanup_hooks;
  2137.     /*----------------------------------------------------------------*/
  2138.     /* Code Body                                                      */
  2139.     /*----------------------------------------------------------------*/
  2140.     for (i = 0; i < GUI_MAX_CLEANUP_HOOK; i++)
  2141.     {
  2142.         if (*item == fp)
  2143.         {
  2144.             *item = NULL;
  2145.             return;
  2146.         }
  2147.         item++;
  2148.     }
  2149. }
  2150. /*****************************************************************************
  2151.  * FUNCTION
  2152.  *  gui_cleanup
  2153.  * DESCRIPTION
  2154.  *  
  2155.  * PARAMETERS
  2156.  *  void
  2157.  * RETURNS
  2158.  *  void
  2159.  *****************************************************************************/
  2160. void gui_cleanup(void)
  2161. {
  2162.     /*----------------------------------------------------------------*/
  2163.     /* Local Variables                                                */
  2164.     /*----------------------------------------------------------------*/
  2165.     S32 i;
  2166.     gui_cleanup_hook_hdlr *item = g_mmi_gui_cleanup_hooks;
  2167.     /*----------------------------------------------------------------*/
  2168.     /* Code Body                                                      */
  2169.     /*----------------------------------------------------------------*/
  2170.     for (i = 0; i < GUI_MAX_CLEANUP_HOOK; i++)
  2171.     {
  2172.         if (*item)
  2173.         {
  2174.             (*item) ();
  2175.             *item = NULL;   /* remove handler */
  2176.         }
  2177.         item++;
  2178.     }
  2179. }
  2180. /* 
  2181.  * Pre Clean-up of GUI components 
  2182.  * general pre cleanup mechanism is provided here.
  2183.  */
  2184. static gui_pre_cleanup_hook_hdlr g_mmi_gui_pre_cleanup_hooks[GUI_MAX_CLEANUP_HOOK];
  2185. /*****************************************************************************
  2186.  * FUNCTION
  2187.  *  gui_add_pre_cleanup_hook
  2188.  * DESCRIPTION
  2189.  *  
  2190.  * PARAMETERS
  2191.  *  fp      [IN]        
  2192.  * RETURNS
  2193.  *  void
  2194.  *****************************************************************************/
  2195. void gui_add_pre_cleanup_hook(gui_cleanup_hook_hdlr fp)
  2196. {
  2197.     /*----------------------------------------------------------------*/
  2198.     /* Local Variables                                                */
  2199.     /*----------------------------------------------------------------*/
  2200.     S32 i;
  2201.     gui_cleanup_hook_hdlr *item = g_mmi_gui_pre_cleanup_hooks;
  2202.     /*----------------------------------------------------------------*/
  2203.     /* Code Body                                                      */
  2204.     /*----------------------------------------------------------------*/
  2205.     if (!fp)
  2206.     {
  2207.         return;
  2208.     }
  2209.     for (i = 0; i < GUI_MAX_CLEANUP_HOOK; i++)
  2210.     {
  2211.         if (*item == fp)
  2212.         {
  2213.             return;
  2214.         }
  2215.         item++;
  2216.     }
  2217.     item = g_mmi_gui_pre_cleanup_hooks;
  2218.     for (i = 0; i < GUI_MAX_CLEANUP_HOOK; i++)
  2219.     {
  2220.         if (!*item)
  2221.         {
  2222.             *item = fp;
  2223.             return;
  2224.         }
  2225.         item++;
  2226.     }
  2227.     /* The table is full */
  2228.     MMI_ASSERT(0);
  2229. }
  2230. /*****************************************************************************
  2231.  * FUNCTION
  2232.  *  gui_remove_pre_cleanup_hook
  2233.  * DESCRIPTION
  2234.  *  
  2235.  * PARAMETERS
  2236.  *  fp      [IN]        
  2237.  * RETURNS
  2238.  *  void
  2239.  *****************************************************************************/
  2240. void gui_remove_pre_cleanup_hook(gui_cleanup_hook_hdlr fp)
  2241. {
  2242.     /*----------------------------------------------------------------*/
  2243.     /* Local Variables                                                */
  2244.     /*----------------------------------------------------------------*/
  2245.     S32 i;
  2246.     gui_cleanup_hook_hdlr *item = g_mmi_gui_pre_cleanup_hooks;
  2247.     /*----------------------------------------------------------------*/
  2248.     /* Code Body                                                      */
  2249.     /*----------------------------------------------------------------*/
  2250.     for (i = 0; i < GUI_MAX_CLEANUP_HOOK; i++)
  2251.     {
  2252.         if (*item == fp)
  2253.         {
  2254.             *item = NULL;
  2255.             return;
  2256.         }
  2257.         item++;
  2258.     }
  2259. }
  2260. /*****************************************************************************
  2261.  * FUNCTION
  2262.  *  gui_pre_cleanup
  2263.  * DESCRIPTION
  2264.  *  
  2265.  * PARAMETERS
  2266.  *  void
  2267.  * RETURNS
  2268.  *  void
  2269.  *****************************************************************************/
  2270. void gui_pre_cleanup(void)
  2271. {
  2272.     /*----------------------------------------------------------------*/
  2273.     /* Local Variables                                                */
  2274.     /*----------------------------------------------------------------*/
  2275.     S32 i;
  2276.     gui_cleanup_hook_hdlr *item = g_mmi_gui_pre_cleanup_hooks;
  2277.     /*----------------------------------------------------------------*/
  2278.     /* Code Body                                                      */
  2279.     /*----------------------------------------------------------------*/
  2280.     for (i = 0; i < GUI_MAX_CLEANUP_HOOK; i++)
  2281.     {
  2282.         if (*item)
  2283.         {
  2284.             (*item) ();
  2285.             *item = NULL;   /* remove handler */
  2286.         }
  2287.         item++;
  2288.     }
  2289. }