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

MTK

开发平台:

C/C++

  1.     {
  2.     #if defined(__MMI_ZI__)
  3.         index = SearchInPropFont(Ch, &nBase);
  4.         if (index == -1)
  5.         {
  6.     #endif /* defined(__MMI_ZI__) */ 
  7.             Ch = 65515;
  8.             index = SearchInPropFont(Ch, &nBase);
  9.             if (index == -1)
  10.             {
  11.                 return index;
  12.             }
  13.         #if defined(__MMI_ZI__)
  14.         }
  15.         *pHeight = gMTKProprietaryFont.nHeight;
  16.         *pWidth = gMTKProprietaryFont.pWidthArray[index];
  17.         goto label_out2;
  18.         #endif /* defined(__MMI_ZI__) */ 
  19.     }
  20. #if defined(__MMI_ZI__)
  21.     *pHeight = gZiExtraCharacter.nHeight;
  22.     *pWidth = gZiExtraCharacter.pWidthArray[index];
  23.   label_out2:;
  24. #else /* defined(__MMI_ZI__) */ 
  25.     *pHeight = gMTKProprietaryFont.nHeight;
  26.     *pWidth = gMTKProprietaryFont.pWidthArray[index];
  27. #endif /* defined(__MMI_ZI__) */ 
  28.     /* MTK End */
  29.     return index;
  30. }
  31. /*****************************************************************************
  32.  * FUNCTION
  33.  *  Get_StringWidthHeight
  34.  * DESCRIPTION
  35.  *  To get string width and height
  36.  *  
  37.  *  This is used to get string widths
  38.  * PARAMETERS
  39.  *  String      [IN]        
  40.  *  pWidth      [?]         
  41.  *  pHeight     [?]         
  42.  * RETURNS
  43.  *  S32(?)
  44.  *****************************************************************************/
  45. void Get_StringWidthHeight(U8 *String, S32 *pWidth, S32 *pHeight)
  46. {
  47.     /*----------------------------------------------------------------*/
  48.     /* Local Variables                                                */
  49.     /*----------------------------------------------------------------*/
  50.     S32 StrWidth = 0;
  51.     S32 nHeight = 0;
  52.     S32 Counter = 0;
  53.     U16 unicode = 0;
  54.     U16 curCh = 0, preCh = 0, pre2Ch = 0;
  55. #if defined(__MMI_LANG_VIETNAMESE__)
  56.     U16 next_unicode = 0;
  57.     viet_tone_mark tone_mark = VIET_TONE_NONE;
  58.     viet_vowel_letter viet_vowel = VIET_VOWEL_NONE;
  59. #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  60. #ifdef __MMI_BIDI_ALG__
  61.     S32 nLen;
  62. #endif 
  63.     /*----------------------------------------------------------------*/
  64.     /* Code Body                                                      */
  65.     /*----------------------------------------------------------------*/
  66.     *pHeight = 0;
  67.     *pWidth = 0;
  68.     /* START VIJAY PMT 20050728 */
  69. #ifdef __MMI_HINDI_ALG__
  70.     if (hf_is_reset_hindi_params())
  71.     {
  72.         reset_hindi_params();
  73.     }
  74.     if (hf_is_hindi_rules_parsing())
  75.     {
  76.         U16 cluster_fill[G_MAX];
  77.         S32 cluster_length;
  78.         U16 glyph_output[G_MAX];
  79.         S32 Len;
  80.         S32 len;
  81.         S32 total_len = 0;
  82.         S32 original_len = 0;
  83.         S32 width, height;
  84.         pre2Ch = 0;
  85.         preCh = 0;
  86.         if (String == NULL)
  87.         {
  88.             return;
  89.         }
  90.         /* PMT START LANGUAGE 20060104 */
  91.     #if defined (__MMI_BIDI_ALG__)
  92.         nLen = UCS2Strlen((const char*)String);
  93.         //MMI_ASSERT(!(nLen > MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH));
  94.         if(nLen>MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH) nLen = MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH;
  95.         //UCS2Strcpy((S8*) show_pwcWord, (S8*) String);
  96.         UCS2Strncpy((S8*) show_pwcWord, (S8*) String,nLen);
  97.         show_pwcWord[nLen] = 0;
  98.         nLen = UCS2Strlen((const char*)show_pwcWord);
  99.     #if defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__)
  100.     #if defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__)
  101.         if (nLen)
  102.         {
  103.         #ifdef __MMI_ZI_V7__
  104.         #if defined(__MMI_ZI_PERSIAN__) && defined(__MMI_ZI_ARABIC__)
  105.             ZiStringShape(ZI8_LANG_FA, (U16 *) & nLen, show_pwcWord);
  106.         #elif defined (__MMI_ZI_PERSIAN__)
  107.             ZiStringShape(ZI8_LANG_FA, (U16 *) & nLen, show_pwcWord);
  108.         #elif defined (__MMI_ZI_ARABIC__)
  109.             ZiStringShape(ZI8_LANG_AR, (U16 *) & nLen, show_pwcWord);
  110.         #endif 
  111.         #else /* __MMI_ZI_V7__ */ 
  112.             ArabicStringShape((U16 *) & nLen, show_pwcWord);
  113.         #endif /* __MMI_ZI_V7__ */ 
  114.         }
  115.     #else /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  116.         if (nLen)
  117.         {
  118.             ArabicShapeEngine((U16*) & nLen, show_pwcWord); /* output will replace the input string after returning */
  119.         }
  120.     #endif /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  121.     #endif /* defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__) */ 
  122.         String = (U8*) show_pwcWord;
  123.     #endif /* defined (__MMI_BIDI_ALG__) */ 
  124.         /* PMT END LANGUAGE 20060104 */
  125.         init_cluster_start_p(String);
  126.         len = gui_strlen((UI_string_type) String);
  127.         if (len > 0)
  128.         {
  129.             init_cluster_end_p(String + (len * 2));
  130.         }
  131.         else
  132.         {
  133.             init_cluster_end_p(String + (2 * UCS2Strlen((const char*)String) + 1));
  134.         }
  135.         original_len = len;
  136.         hf_disable_hindi_rules_parsing();
  137.         hf_disable_hindi_reset_hindi_params();
  138.         do
  139.         {
  140.             cluster_length = hf_get_cluster(cluster_fill);
  141.             total_len += cluster_length;
  142.             if (original_len > 0)
  143.             {
  144.                 if (total_len > original_len)
  145.                 {
  146.                     break;
  147.                 }
  148.             }
  149.             if (cluster_length)
  150.             {
  151.                 Len = hf_hindi_rules(glyph_output, cluster_fill, cluster_length);
  152.                 Get_StringWidthHeight((U8*) glyph_output, &width, &height);
  153.                 if (height > *pHeight)
  154.                 {
  155.                     *pHeight = height;
  156.                 }
  157.                 *pWidth += width;
  158.             }
  159.         } while (cluster_length);
  160.         hf_enable_hindi_rules_parsing();
  161.         hf_enable_hindi_reset_hindi_params();
  162.         return;
  163.     }
  164. #endif /* __MMI_HINDI_ALG__ */ 
  165.     /* END VIJAY PMT 20050728 */
  166.     if (String == NULL)
  167.     {
  168.         return;
  169.     }
  170.     /* PMT START LANGUAGE 20060104 */
  171. #if defined (__MMI_BIDI_ALG__) && !defined(__MMI_HINDI_ALG__)
  172.     /* PMT END LANGUAGE 20060104 */
  173.     nLen = UCS2Strlen((const char*)String);
  174.     //MMI_ASSERT(!(nLen > MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH));
  175.     if(nLen>MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH) nLen = MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH;
  176.     //UCS2Strcpy((S8*) show_pwcWord, (S8*) String);
  177.     UCS2Strncpy((S8*) show_pwcWord, (S8*) String,nLen);
  178.     show_pwcWord[nLen] = 0;
  179.     nLen = UCS2Strlen((const char*)show_pwcWord);
  180.     /* PMT NO_AR_SL_DU START 20050909 */
  181.     #if defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__)
  182.     #if defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__)
  183.         if (nLen)
  184.         {
  185.         #ifdef __MMI_ZI_V7__
  186.         #if defined(__MMI_ZI_PERSIAN__) && defined(__MMI_ZI_ARABIC__)
  187.             ZiStringShape(ZI8_LANG_FA, (U16 *) & nLen, show_pwcWord);
  188.         #elif defined (__MMI_ZI_PERSIAN__)
  189.             ZiStringShape(ZI8_LANG_FA, (U16 *) & nLen, show_pwcWord);
  190.         #elif defined (__MMI_ZI_ARABIC__)
  191.             ZiStringShape(ZI8_LANG_AR, (U16 *) & nLen, show_pwcWord);
  192.         #endif 
  193.         #else /* __MMI_ZI_V7__ */ 
  194.             ArabicStringShape((U16 *) & nLen, show_pwcWord);
  195.         #endif /* __MMI_ZI_V7__ */ 
  196.         }
  197.     #else /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  198.         if (nLen)
  199.         {
  200.             ArabicShapeEngine((U16*) & nLen, show_pwcWord); /* output will replace the input string after returning */
  201.         }
  202.     #endif /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  203.     #endif /* defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__) */ 
  204.  
  205.     /* PMT NO_AR_SL_DU END 20050909 */
  206.     String = (U8*) show_pwcWord;
  207. #endif /* defined (__MMI_BIDI_ALG__) && !defined(__MMI_HINDI_ALG__) */ 
  208.     while (1)
  209.     {
  210.         if ((String[0] == '') && (String[1] == ''))
  211.         {
  212.             break;
  213.         }
  214.         memcpy(&unicode, String, 2);
  215.     #if defined(__MMI_LANG_VIETNAMESE__)
  216.         if ((unicode > 0x0040) && (unicode < 0x01B1))
  217.         {
  218.             next_unicode = String[2];
  219.             next_unicode |= (String[3] << 8);
  220.             tone_mark = mmi_viet_tone_mark(next_unicode);
  221.             if (VIET_TONE_NONE != tone_mark)
  222.             {
  223.                 viet_vowel = mmi_viet_vowel_letter(unicode);
  224.                 if (VIET_VOWEL_NONE != viet_vowel)
  225.                 {
  226.                     unicode = mmi_viet_combine_vowel_tone(viet_vowel, tone_mark);
  227.                     String += 2;
  228.                 }
  229.             }
  230.         }
  231.     #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  232.         Get_CharWidthHeight(unicode, &StrWidth, &nHeight);
  233.         /* Consider the Thai String length is different from others */
  234.         curCh = unicode;
  235.         if (curCh >= 0x0E01 && curCh <= 0x0E7F)
  236.         {
  237.             /* Base line character, can combinate with above vowels,bottom vowels, tone mark, and sign */
  238.             if (IsThaiBaseLineChar(curCh))
  239.             {
  240.                 //if the current character is 0x0E33 and previous or previous 2 character is base line character, 0x0E33 shall be
  241.                 //moved ahead to let the circyle sign on the top of previous or previous2 character
  242.                 if (curCh == 0x0E33 && (IsThaiBaseLineChar(preCh) || IsThaiBaseLineChar(pre2Ch)))
  243.                 {
  244.                     *pWidth = *pWidth - 4 + (S32) StrWidth + gThaiFontInterSpace;
  245.                 }
  246.                 else
  247.                 {
  248.                     *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace;
  249.                 }
  250.             }
  251.             /* For Thai digits and base line sign, the only thing we have to do is moving cursor */
  252.             else if (IsThaiDigitChar(curCh) || IsThaiBaseSignChar(curCh))
  253.             {
  254.                 *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace;
  255.             }
  256.             else if (IsThaiToneMark(curCh))
  257.             {
  258.                 if (IsThaiBaseLineChar(preCh) || IsThaiAboveLineChar(preCh) || IsThaiBottomLineChar(preCh))
  259.                 {
  260.                 }
  261.                 else if (preCh == 0x0E47 || preCh == 0x0E4C)
  262.                 {
  263.                     /* move the tone mark to next character space */
  264.                     *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace;
  265.                 }
  266.                 else
  267.                 {
  268.                     *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace;
  269.                 }
  270.             }
  271.             *pHeight = gThaiLineHeight; /* If  the string has Thai characters,the height will become gThaiLineHeight(now the value is 17) */
  272.             pre2Ch = preCh;
  273.             preCh = curCh;
  274.         }
  275.     #ifdef __MMI_HINDI_ALG__
  276.         else if (UI_HINDI_CHARACTER_UCS2_RANGE(curCh))
  277.         {
  278.             U16 nextCharUCS2;
  279.             memcpy(&nextCharUCS2, String + 2, 2);
  280.             /* PMT START MAUI_00223197 */
  281.             if ((curCh != S_VISARGA) && UI_HINDI_SIGN_RANGE(curCh))
  282.                 /* PMT END MAUI_00223197 */
  283.             {
  284.                 (*pWidth) += 0;
  285.             }
  286.             else
  287.             {
  288.                 if (UI_HINDI_CHARACTER_UCS2_RANGE(nextCharUCS2) || nextCharUCS2 == 0)
  289.                 {
  290.                     (*pWidth) += StrWidth;
  291.                 }
  292.                 else
  293.                 {
  294.                     Get_CharWidth(curCh, &StrWidth);
  295.                     (*pWidth) += StrWidth;
  296.                 }
  297.             }
  298.         }
  299.     #endif /* __MMI_HINDI_ALG__ */ 
  300.         else
  301.         {
  302.             (*pWidth) += StrWidth;
  303.         }
  304.         if (*pHeight < nHeight)
  305.         {
  306.             *pHeight = nHeight;
  307.         }
  308.         Counter++;
  309.         String += 2;
  310.     }
  311.     return;
  312. }
  313. #if(FONTENGINE_IRAM_PLACEMENT)
  314. #ifdef __MTK_TARGET__
  315. #pragma arm section code
  316. #endif 
  317. #endif /* (FONTENGINE_IRAM_PLACEMENT) */ 
  318. /* july-28-2002 manju: required by UI elements. This function measures a text string's width upto a given number of characters */
  319. /*****************************************************************************
  320.  * FUNCTION
  321.  *  Get_StringWidthHeight_n
  322.  * DESCRIPTION
  323.  *  To get string widths and height upto a given number of characters
  324.  *  
  325.  *  This is used to get string widths upto a given number of characters
  326.  * PARAMETERS
  327.  *  String      [IN]        
  328.  *  n           [IN]        
  329.  *  pWidth      [IN]        
  330.  *  pHeight     [IN]        
  331.  * RETURNS
  332.  *  void
  333.  *****************************************************************************/
  334. void Get_StringWidthHeight_n(U8 *String, S32 n, S32 *pWidth, S32 *pHeight)
  335. {
  336.     /*----------------------------------------------------------------*/
  337.     /* Local Variables                                                */
  338.     /*----------------------------------------------------------------*/
  339.     S32 StrWidth = 0;
  340.     S32 Counter = 0;
  341.     S32 nHeight = 0;
  342.     U16 unicode = 0;
  343.     U16 curCh = 0, preCh = 0, pre2Ch = 0;
  344. #if defined(__MMI_LANG_VIETNAMESE__)
  345.     U16 next_unicode = 0;
  346.     viet_tone_mark tone_mark = VIET_TONE_NONE;
  347.     viet_vowel_letter viet_vowel = VIET_VOWEL_NONE;
  348. #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  349.     #ifdef __MMI_BIDI_ALG__
  350.     S32 nLen;
  351.     #endif
  352.     /*----------------------------------------------------------------*/
  353.     /* Code Body                                                      */
  354.     /*----------------------------------------------------------------*/
  355.     *pHeight = 0;
  356.     *pWidth = 0;
  357.     //Modified by Ailsa start
  358. #ifdef __MMI_HINDI_ALG__
  359.             if (hf_is_reset_hindi_params())
  360.             {
  361.                 reset_hindi_params();
  362.             }
  363.             if (hf_is_hindi_rules_parsing())
  364.             {
  365.                 U16 cluster_fill[G_MAX];
  366.                 S32 cluster_length;
  367.                 U16 glyph_output[G_MAX];
  368.                 S32 Len;
  369.                 S32 len;
  370.                 S32 total_len = 0;
  371.                 S32 original_len = 0;
  372.         
  373.                 S32 width, height;
  374.                 pre2Ch = 0;
  375.                 preCh = 0;
  376.                 if (String == NULL)
  377.                 {
  378.                     return;
  379.                 }
  380.     //Modified by Ailsa end
  381.     #if defined (__MMI_BIDI_ALG__)
  382.         nLen = UCS2Strlen((const char*)String);
  383.         //MMI_ASSERT(!(nLen > MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH));
  384.         if(nLen>MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH) nLen = MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH;
  385.         if(n< nLen) nLen = n;
  386.         //UCS2Strcpy((S8*) show_pwcWord, (S8*) String);
  387.         UCS2Strncpy((S8*) show_pwcWord, (S8*) String,nLen);
  388.         show_pwcWord[nLen] = 0;
  389.         nLen = UCS2Strlen((const char*)show_pwcWord);
  390.     #if defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__)
  391.     #if defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__)
  392.         if (nLen)
  393.         {
  394.         #ifdef __MMI_ZI_V7__
  395.         #if defined(__MMI_ZI_PERSIAN__) && defined(__MMI_ZI_ARABIC__)
  396.             ZiStringShape(ZI8_LANG_FA, (U16 *) & nLen, show_pwcWord);
  397.         #elif defined (__MMI_ZI_PERSIAN__)
  398.             ZiStringShape(ZI8_LANG_FA, (U16 *) & nLen, show_pwcWord);
  399.         #elif defined (__MMI_ZI_ARABIC__)
  400.             ZiStringShape(ZI8_LANG_AR, (U16 *) & nLen, show_pwcWord);
  401.         #endif 
  402.         #else /* __MMI_ZI_V7__ */ 
  403.             ArabicStringShape((U16 *) & nLen, show_pwcWord);
  404.         #endif /* __MMI_ZI_V7__ */ 
  405.         }
  406.     #else /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  407.         if (nLen)
  408.         {
  409.             ArabicShapeEngine((U16*) & nLen, show_pwcWord); /* output will replace the input string after returning */
  410.         }
  411.     #endif /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  412.     #endif /* defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__) */ 
  413.         String = (U8*) show_pwcWord;
  414.     #endif /* defined (__MMI_BIDI_ALG__) */ 
  415.         //Modified by Ailsa start
  416.             init_cluster_start_p(String);
  417.             len = gui_strlen((UI_string_type) String);
  418.     
  419.             if (len > 0)
  420.             {
  421.                 init_cluster_end_p(String + (len * 2));
  422.             }
  423.             else
  424.             {
  425.                 init_cluster_end_p(String + (2 * UCS2Strlen((const char*)String) + 1));
  426.             }
  427.             original_len = len;
  428.     
  429.             hf_disable_hindi_rules_parsing();
  430.             hf_disable_hindi_reset_hindi_params();
  431.     
  432.             do
  433.             {
  434.                 cluster_length = hf_get_cluster(cluster_fill);
  435.     
  436.                 total_len += cluster_length;
  437.                 if (original_len > 0)
  438.                 {
  439.                     if (total_len > original_len)
  440.                     {
  441.                         break;
  442.                     }
  443.                 }
  444.     
  445.                 if (cluster_length)
  446.                 {
  447.                     Len = hf_hindi_rules(glyph_output, cluster_fill, cluster_length);
  448.                     Get_StringWidthHeight((U8*) glyph_output, &width, &height);
  449.                     if (height > *pHeight)
  450.                     {
  451.                         *pHeight = height;
  452.                     }
  453.                     *pWidth += width;
  454.                 }
  455.             } while (cluster_length);
  456.             hf_enable_hindi_rules_parsing();
  457.             hf_enable_hindi_reset_hindi_params();
  458.             return;
  459.         }
  460. #endif /* __MMI_HINDI_ALG__ */ 
  461.     //Modified by Ailsa end
  462.     if (String == NULL)
  463.     {
  464.         return;
  465.     }
  466. #if defined (__MMI_BIDI_ALG__) && !defined(__MMI_HINDI_ALG__)    
  467.     nLen = UCS2Strlen((const char*)String);
  468.     //MMI_ASSERT(!(nLen > MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH));
  469.     if(nLen>MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH) nLen = MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH;
  470.     if(n< nLen) nLen = n;
  471.     //UCS2Strcpy((S8*) show_pwcWord, (S8*) String);
  472.     UCS2Strncpy((S8*) show_pwcWord, (S8*) String,nLen);
  473.     show_pwcWord[nLen] = 0;
  474.     nLen = UCS2Strlen((const char*)show_pwcWord);    
  475.     #if defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__)
  476.     #if defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__)
  477.         if (nLen)
  478.         {
  479.         #ifdef __MMI_ZI_V7__
  480.         #if defined(__MMI_ZI_PERSIAN__) && defined(__MMI_ZI_ARABIC__)
  481.             ZiStringShape(ZI8_LANG_FA, (U16 *) & nLen, show_pwcWord);
  482.         #elif defined (__MMI_ZI_PERSIAN__)
  483.             ZiStringShape(ZI8_LANG_FA, (U16 *) & nLen, show_pwcWord);
  484.         #elif defined (__MMI_ZI_ARABIC__)
  485.             ZiStringShape(ZI8_LANG_AR, (U16 *) & nLen, show_pwcWord);
  486.         #endif 
  487.         #else /* __MMI_ZI_V7__ */ 
  488.             ArabicStringShape((U16 *) & nLen, show_pwcWord);
  489.         #endif /* __MMI_ZI_V7__ */ 
  490.         }
  491.     #else /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  492.         if (nLen)
  493.         {
  494.             ArabicShapeEngine((U16*) & nLen, show_pwcWord); /* output will replace the input string after returning */
  495.         }
  496.     #endif /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  497.     #endif /* defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__) */ 
  498.     
  499.     String = (U8*) show_pwcWord;
  500. #endif /* defined (__MMI_BIDI_ALG__) && !defined(__MMI_HINDI_ALG__) */ 
  501.     while (Counter < n)
  502.     {
  503.         if ((String[0] == '') && (String[1] == ''))
  504.         {
  505.             break;
  506.         }
  507.         memcpy(&unicode, String, 2);
  508.     #if defined(__MMI_LANG_VIETNAMESE__)
  509.         if ((unicode > 0x0040) && (unicode < 0x01B1))
  510.         {
  511.             next_unicode = String[2];
  512.             next_unicode |= (String[3] << 8);
  513.             tone_mark = mmi_viet_tone_mark(next_unicode);
  514.             if (VIET_TONE_NONE != tone_mark)
  515.             {
  516.                 viet_vowel = mmi_viet_vowel_letter(unicode);
  517.                 if (VIET_VOWEL_NONE != viet_vowel)
  518.                 {
  519.                     unicode = mmi_viet_combine_vowel_tone(viet_vowel, tone_mark);
  520.                     String += 2;
  521.                     n += 1;
  522.                 }
  523.             }
  524.         }
  525.     #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  526.         Get_CharWidthHeight(unicode, &StrWidth, &nHeight);
  527.         /* Consider the Thai String length is different from others */
  528.         curCh = unicode;
  529.         if (curCh >= 0x0E01 && curCh <= 0x0E7F)
  530.         {
  531.             /* Base line character, can combinate with above vowels,bottom vowels, tone mark, and sign */
  532.             if (IsThaiBaseLineChar(curCh))
  533.             {
  534.                 //if the current character is 0x0E33 and previous or previous 2 character is base line character, 0x0E33 shall be
  535.                 //moved ahead to let the circyle sign on the top of previous or previous2 character
  536.                 if (curCh == 0x0E33 && (IsThaiBaseLineChar(preCh) || IsThaiBaseLineChar(pre2Ch)))
  537.                 {
  538.                     *pWidth = *pWidth - 4 + (S32) StrWidth + gThaiFontInterSpace;
  539.                 }
  540.                 else
  541.                 {
  542.                     *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace;
  543.                 }
  544.             }
  545.             /* For Thai digits and base line sign, the only thing we have to do is moving cursor */
  546.             else if (IsThaiDigitChar(curCh) || IsThaiBaseSignChar(curCh))
  547.             {
  548.                 *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace;
  549.             }
  550.             else if (IsThaiToneMark(curCh))
  551.             {
  552.                 if (IsThaiBaseLineChar(preCh) || IsThaiAboveLineChar(preCh) || IsThaiBottomLineChar(preCh))
  553.                 {
  554.                 }
  555.                 else if (preCh == 0x0E47 || preCh == 0x0E4C)
  556.                 {
  557.                     /* move the tone mark to next character space */
  558.                     *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace;
  559.                 }
  560.                 else
  561.                 {
  562.                     *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace;
  563.                 }
  564.             }
  565.             *pHeight = gThaiLineHeight; /* If  the string has Thai characters,the height will become gThaiLineHeight(now the value is 17) */
  566.             pre2Ch = preCh;
  567.             preCh = curCh;
  568.         }
  569. #ifdef __MMI_HINDI_ALG__
  570.             else if (UI_HINDI_CHARACTER_UCS2_RANGE(curCh))
  571.             {
  572.                 U16 nextCharUCS2;
  573.         
  574.                 memcpy(&nextCharUCS2, String + 2, 2);
  575.                 /* PMT START MAUI_00223197 */
  576.                 if ((curCh != S_VISARGA) && UI_HINDI_SIGN_RANGE(curCh))
  577.                     /* PMT END MAUI_00223197 */
  578.                 {
  579.                     (*pWidth) += 0;
  580.                 }
  581.                 else
  582.                 {
  583.                     if (UI_HINDI_CHARACTER_UCS2_RANGE(nextCharUCS2) || nextCharUCS2 == 0)
  584.                     {
  585.                         (*pWidth) += StrWidth;
  586.                     }
  587.                     else
  588.                     {
  589.                         Get_CharWidth(curCh, &StrWidth);
  590.                         (*pWidth) += StrWidth;
  591.                     }
  592.                 }
  593.             }
  594. #endif /* __MMI_HINDI_ALG__ */ 
  595.         else
  596.         {
  597.             (*pWidth) += StrWidth;
  598.         }
  599.         if (*pHeight < nHeight)
  600.         {
  601.             *pHeight = nHeight;
  602.         }
  603.         Counter++;
  604.         String += 2;
  605.     }
  606.     return;
  607. }
  608. /* PMT dara added for Multitap thai */
  609. /*****************************************************************************
  610.  * FUNCTION
  611.  *  Get_StringWidthHeight_multitap
  612.  * DESCRIPTION
  613.  *  
  614.  * PARAMETERS
  615.  *  String      [?]         
  616.  *  w           [IN]        
  617.  *  pWidth      [?]         
  618.  *  pHeight     [?]         
  619.  * RETURNS
  620.  *  void
  621.  *****************************************************************************/
  622. void Get_StringWidthHeight_multitap(U8 *String, S32 w, S32 *pWidth, S32 *pHeight)
  623. {
  624.     /*----------------------------------------------------------------*/
  625.     /* Local Variables                                                */
  626.     /*----------------------------------------------------------------*/
  627.     S32 StrWidth = 0;
  628.     S32 Counter = 0;
  629.     S32 nHeight = 0;
  630.     U16 unicode = 0;
  631.     /*----------------------------------------------------------------*/
  632.     /* Code Body                                                      */
  633.     /*----------------------------------------------------------------*/
  634.     *pHeight = 0;
  635.     *pWidth = 0;
  636.     if (String == NULL)
  637.     {
  638.         return;
  639.     }
  640.     while (1)
  641.     {
  642.         if ((String[0] == '') && (String[1] == ''))
  643.         {
  644.             break;
  645.         }
  646.         memcpy(&unicode, String, 2);
  647.         Get_CharWidthHeight(unicode, &StrWidth, &nHeight);
  648.         /* Consider the Thai String length is different from others */
  649.         (*pWidth) += (StrWidth + w);
  650.         if (*pHeight < nHeight)
  651.         {
  652.             *pHeight = nHeight;
  653.         }
  654.         Counter++;
  655.         String += 2;
  656.     }
  657.     return;
  658. }
  659. /*****************************************************************************
  660.  * FUNCTION
  661.  *  Get_StringWidthHeight_w
  662.  * DESCRIPTION
  663.  *  
  664.  * PARAMETERS
  665.  *  String      [?]         
  666.  *  w           [IN]        
  667.  *  pWidth      [?]         
  668.  *  pHeight     [?]         
  669.  * RETURNS
  670.  *  void
  671.  *****************************************************************************/
  672. void Get_StringWidthHeight_w(U8 *String, S32 w, S32 *pWidth, S32 *pHeight)
  673. {
  674.     /*----------------------------------------------------------------*/
  675.     /* Local Variables                                                */
  676.     /*----------------------------------------------------------------*/
  677.     S32 StrWidth = 0;
  678.     S32 Counter = 0;
  679.     S32 nHeight = 0;
  680.     U16 unicode = 0;
  681.     U16 curCh = 0, preCh = 0, pre2Ch = 0;
  682. #if defined(__MMI_LANG_VIETNAMESE__)
  683.     U16 next_unicode = 0;
  684.     viet_tone_mark tone_mark = VIET_TONE_NONE;
  685.     viet_vowel_letter viet_vowel = VIET_VOWEL_NONE;
  686. #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  687.     /*----------------------------------------------------------------*/
  688.     /* Code Body                                                      */
  689.     /*----------------------------------------------------------------*/
  690.     *pHeight = 0;
  691.     *pWidth = 0;
  692.     if (String == NULL)
  693.     {
  694.         return;
  695.     }
  696.     while (1)
  697.     {
  698.         if ((String[0] == '') && (String[1] == ''))
  699.         {
  700.             break;
  701.         }
  702.         memcpy(&unicode, String, 2);
  703.     #if defined(__MMI_LANG_VIETNAMESE__)
  704.         if ((unicode > 0x0040) && (unicode < 0x01B1))
  705.         {
  706.             next_unicode = String[2];
  707.             next_unicode |= (String[3] << 8);
  708.             tone_mark = mmi_viet_tone_mark(next_unicode);
  709.             if (VIET_TONE_NONE != tone_mark)
  710.             {
  711.                 viet_vowel = mmi_viet_vowel_letter(unicode);
  712.                 if (VIET_VOWEL_NONE != viet_vowel)
  713.                 {
  714.                     unicode = mmi_viet_combine_vowel_tone(viet_vowel, tone_mark);
  715.                     String += 2;
  716.                 }
  717.             }
  718.         }
  719.     #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  720.         Get_CharWidthHeight(unicode, &StrWidth, &nHeight);
  721.         /* Consider the Thai String length is different from others */
  722.         curCh = unicode;
  723.         if (curCh >= 0x0E01 && curCh <= 0x0E7F)
  724.         {
  725.             /* Base line character, can combinate with above vowels,bottom vowels, tone mark, and sign */
  726.             if (IsThaiBaseLineChar(curCh))
  727.             {
  728.                 //if the current character is 0x0E33 and previous or previous 2 character is base line character, 0x0E33 shall be
  729.                 //moved ahead to let the circyle sign on the top of previous or previous2 character
  730.                 if (curCh == 0x0E33 && (IsThaiBaseLineChar(preCh) || IsThaiBaseLineChar(pre2Ch)))
  731.                 {
  732.                     *pWidth = *pWidth - 4 + (S32) StrWidth + gThaiFontInterSpace + w;
  733.                 }
  734.                 else
  735.                 {
  736.                     *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace + w;
  737.                 }
  738.             }
  739.             /* For Thai digits and base line sign, the only thing we have to do is moving cursor */
  740.             else if (IsThaiDigitChar(curCh) || IsThaiBaseSignChar(curCh))
  741.             {
  742.                 *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace;
  743.             }
  744.             else if (IsThaiToneMark(curCh))
  745.             {
  746.                 if (IsThaiBaseLineChar(preCh) || IsThaiAboveLineChar(preCh) || IsThaiBottomLineChar(preCh))
  747.                 {
  748.                 }
  749.                 else if (preCh == 0x0E47 || preCh == 0x0E4C)
  750.                 {
  751.                     /* move the tone mark to next character space */
  752.                     *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace + w;
  753.                 }
  754.                 else
  755.                 {
  756.                     *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace + w;
  757.                 }
  758.             }
  759.             *pHeight = gThaiLineHeight; /* If  the string has Thai characters,the height will become gThaiLineHeight(now the value is 17) */
  760.             pre2Ch = preCh;
  761.             preCh = curCh;
  762.         }
  763.         else
  764.         {
  765.             (*pWidth) += (StrWidth + w);
  766.         }
  767.         if (*pHeight < nHeight)
  768.         {
  769.             *pHeight = nHeight;
  770.         }
  771.         Counter++;
  772.         String += 2;
  773.     }
  774.     return;
  775. }
  776. /*****************************************************************************
  777.  * FUNCTION
  778.  *  Get_StringWidthHeight_wn
  779.  * DESCRIPTION
  780.  *  
  781.  * PARAMETERS
  782.  *  String      [?]         
  783.  *  w           [IN]        
  784.  *  n           [IN]        
  785.  *  pWidth      [?]         
  786.  *  pHeight     [?]         
  787.  * RETURNS
  788.  *  void
  789.  *****************************************************************************/
  790. void Get_StringWidthHeight_wn(U8 *String, S32 w, S32 n, S32 *pWidth, S32 *pHeight)
  791. {
  792.     /*----------------------------------------------------------------*/
  793.     /* Local Variables                                                */
  794.     /*----------------------------------------------------------------*/
  795.     S32 StrWidth = 0;
  796.     S32 Counter = 0;
  797.     S32 nHeight = 0;
  798.     U16 unicode = 0;
  799.     U16 curCh = 0, preCh = 0, pre2Ch = 0;
  800. #if defined(__MMI_LANG_VIETNAMESE__)
  801.     U16 next_unicode = 0;
  802.     viet_tone_mark tone_mark = VIET_TONE_NONE;
  803.     viet_vowel_letter viet_vowel = VIET_VOWEL_NONE;
  804. #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  805.     /*----------------------------------------------------------------*/
  806.     /* Code Body                                                      */
  807.     /*----------------------------------------------------------------*/
  808.     if (String == NULL)
  809.     {
  810.         return;
  811.     }
  812.     *pHeight = 0;
  813.     *pWidth = 0;
  814.     while (Counter < n)
  815.     {
  816.         if ((String[0] == '') && (String[1] == ''))
  817.         {
  818.             break;
  819.         }
  820.         memcpy(&unicode, String, 2);
  821.     #if defined(__MMI_LANG_VIETNAMESE__)
  822.         if ((unicode > 0x0040) && (unicode < 0x01B1))
  823.         {
  824.             next_unicode = String[2];
  825.             next_unicode |= (String[3] << 8);
  826.             tone_mark = mmi_viet_tone_mark(next_unicode);
  827.             if (VIET_TONE_NONE != tone_mark)
  828.             {
  829.                 viet_vowel = mmi_viet_vowel_letter(unicode);
  830.                 if (VIET_VOWEL_NONE != viet_vowel)
  831.                 {
  832.                     unicode = mmi_viet_combine_vowel_tone(viet_vowel, tone_mark);
  833.                     String += 2;
  834.                     n += 1;
  835.                 }
  836.             }
  837.         }
  838.     #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  839.         Get_CharWidthHeight(unicode, &StrWidth, &nHeight);
  840.         /* Consider the Thai String length is different from others */
  841.         curCh = unicode;
  842.         if (curCh >= 0x0E01 && curCh <= 0x0E7F)
  843.         {
  844.             //curCh = unicode;
  845.             // Base line character, can combinate with above vowels,bottom vowels, tone mark, and sign
  846.             if (IsThaiBaseLineChar(curCh))
  847.             {
  848.                 //if the current character is 0x0E33 and previous or previous 2 character is base line character, 0x0E33 shall be
  849.                 //moved ahead to let the circyle sign on the top of previous or previous2 character
  850.                 if (curCh == 0x0E33 && (IsThaiBaseLineChar(preCh) || IsThaiBaseLineChar(pre2Ch)))
  851.                 {
  852.                     *pWidth = *pWidth - 4 + (S32) StrWidth + gThaiFontInterSpace + w;
  853.                 }
  854.                 else
  855.                 {
  856.                     *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace + w;
  857.                 }
  858.             }
  859.             /* For Thai digits and base line sign, the only thing we have to do is moving cursor */
  860.             else if (IsThaiDigitChar(curCh) || IsThaiBaseSignChar(curCh))
  861.             {
  862.                 *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace;
  863.             }
  864.             else if (IsThaiToneMark(curCh))
  865.             {
  866.                 if (IsThaiBaseLineChar(preCh) || IsThaiAboveLineChar(preCh) || IsThaiBottomLineChar(preCh))
  867.                 {
  868.                 }
  869.                 else if (preCh == 0x0E47 || preCh == 0x0E4C)
  870.                 {
  871.                     /* move the tone mark to next character space */
  872.                     *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace + w;
  873.                 }
  874.                 else
  875.                 {
  876.                     *pWidth = *pWidth + (S32) StrWidth + gThaiFontInterSpace + w;
  877.                 }
  878.             }
  879.             *pHeight = gThaiLineHeight; /* If  the string has Thai characters,the height will become gThaiLineHeight(now the value is 17) */
  880.             pre2Ch = preCh;
  881.             preCh = curCh;
  882.         }
  883.         else
  884.         {
  885.             (*pWidth) += (StrWidth + w);
  886.         }
  887.         Counter++;
  888.         String += 2;
  889.     }
  890.     return;
  891. }
  892. /*****************************************************************************
  893.  * FUNCTION
  894.  *  Get_CharHeight
  895.  * DESCRIPTION
  896.  *  To get char height
  897.  *  
  898.  *  This is used to get char height
  899.  * PARAMETERS
  900.  *  void
  901.  * RETURNS
  902.  *  S32
  903.  *****************************************************************************/
  904. S32 Get_CharHeight()
  905. {
  906.     /*----------------------------------------------------------------*/
  907.     /* Local Variables                                                */
  908.     /*----------------------------------------------------------------*/
  909.     /*----------------------------------------------------------------*/
  910.     /* Code Body                                                      */
  911.     /*----------------------------------------------------------------*/
  912.     return (S32) gpCurrentFont->nHeight;
  913. }
  914. /*****************************************************************************
  915.  * FUNCTION
  916.  *  Get_CharHeightOfAllLang
  917.  * DESCRIPTION
  918.  *  To get maximum char height regardless of language
  919.  *  
  920.  *  Justin. for WAP layout formating.
  921.  * PARAMETERS
  922.  *  size        [IN]        
  923.  * RETURNS
  924.  *  S32
  925.  *****************************************************************************/
  926. S32 Get_CharHeightOfAllLang(U8 size)
  927. {
  928.     /*----------------------------------------------------------------*/
  929.     /* Local Variables                                                */
  930.     /*----------------------------------------------------------------*/
  931.     int lang_index;
  932.     sFontFamily *pFontFamily;
  933.     S32 height = 0, h;
  934.     /*----------------------------------------------------------------*/
  935.     /* Code Body                                                      */
  936.     /*----------------------------------------------------------------*/
  937.     for (lang_index = 0; lang_index < gMaxDeployedLangs; lang_index++)
  938.     {
  939.         pFontFamily = gLanguageArray[lang_index].fontfamilyList[gLanguageArray[lang_index].nCurrentFamily];
  940.         if ((h = (S32) pFontFamily->fontData[size]->nHeight) > height)
  941.         {
  942.             height = h;
  943.         }
  944.     }
  945.     if (height < (S32) gMTKProprietaryFont.nHeight)
  946.     {
  947.         height = (S32) gMTKProprietaryFont.nHeight;
  948.     }
  949.     /* MTK Add steven 2005.06.03 */
  950. #if defined(__MMI_ZI__)
  951.     if (height < (S32) gZiExtraCharacter.nHeight)
  952.     {
  953.         height = (S32) gZiExtraCharacter.nHeight;
  954.     }
  955. #endif /* defined(__MMI_ZI__) */ 
  956.     /* MTK End */
  957.     return height;
  958. }
  959. /*****************************************************************************
  960.  * FUNCTION
  961.  *  Get_StringHeight
  962.  * DESCRIPTION
  963.  *  To get string height
  964.  *  
  965.  *  This is used to get string height
  966.  * PARAMETERS
  967.  *  void
  968.  * RETURNS
  969.  *  S32
  970.  *****************************************************************************/
  971. S32 Get_StringHeight()
  972. {
  973.     /*----------------------------------------------------------------*/
  974.     /* Local Variables                                                */
  975.     /*----------------------------------------------------------------*/
  976.     sFontFamily *pFontFamily;
  977.     /*----------------------------------------------------------------*/
  978.     /* Code Body                                                      */
  979.     /*----------------------------------------------------------------*/
  980.     pFontFamily = gLanguageArray[gCurrLangIndex].fontfamilyList[gLanguageArray[gCurrLangIndex].nCurrentFamily];
  981.     return (S32) (pFontFamily->fontData[gnCurrentFont]->nHeight);
  982. #if 0
  983. /* under construction !*/
  984. #endif /* 0 */ 
  985. }
  986. /*****************************************************************************
  987.  * FUNCTION
  988.  *  TestDiffFonts
  989.  * DESCRIPTION
  990.  *  To test the different fonts with diferent sizes.
  991.  *  
  992.  *  This is used to test the different fonts with diferent sizes.
  993.  * PARAMETERS
  994.  *  void
  995.  * RETURNS
  996.  *  void
  997.  * BOOL
  998.  *  
  999.  *****************************************************************************/
  1000. void TestDiffFonts()
  1001. {
  1002.     /*----------------------------------------------------------------*/
  1003.     /* Local Variables                                                */
  1004.     /*----------------------------------------------------------------*/
  1005.     S16 count = 0, y = 20;
  1006.     stFontAttribute fontInfo;
  1007.     /*----------------------------------------------------------------*/
  1008.     /* Code Body                                                      */
  1009.     /*----------------------------------------------------------------*/
  1010.     fontInfo.bold = 0;
  1011.     fontInfo.italic = 0;
  1012.     fontInfo.underline = 0;
  1013.     fontInfo.size = 9;  /* (size 8..15 FOR type 2..5 ) & (size 9...15 FOR type 1 ) */
  1014.     fontInfo.type = 1;  /* 1...5 */
  1015.     for (count = 0; count < 2; count++)
  1016.     {
  1017.         ShowString(0, y, fontInfo, 0, (PU8) "abcdefghij", 30);
  1018.         y += 20;
  1019.         ShowString(0, y, fontInfo, 0, (PU8) "klmnopqrst", 30);
  1020.         y += 20;
  1021.         ShowString(0, y, fontInfo, 0, (PU8) "uvwxyz", 30);
  1022.         fontInfo.size += 1;
  1023.         y += 20;
  1024.     }
  1025. }
  1026. /*****************************************************************************
  1027.  * FUNCTION
  1028.  *  Get_FontHeight
  1029.  * DESCRIPTION
  1030.  *  
  1031.  * PARAMETERS
  1032.  *  f               [IN]        
  1033.  *  arrCount        [IN]        
  1034.  * RETURNS
  1035.  *  
  1036.  *****************************************************************************/
  1037. S32 Get_FontHeight(stFontAttribute f, U8 arrCount)
  1038. {
  1039.     /*----------------------------------------------------------------*/
  1040.     /* Local Variables                                                */
  1041.     /*----------------------------------------------------------------*/
  1042.     sFontFamily *pFontFamily;
  1043.     /*----------------------------------------------------------------*/
  1044.     /* Code Body                                                      */
  1045.     /*----------------------------------------------------------------*/
  1046.     pFontFamily = gLanguageArray[arrCount].fontfamilyList[gLanguageArray[arrCount].nCurrentFamily];
  1047.     return (S32) (pFontFamily->fontData[f.size]->nHeight);
  1048. }
  1049. /*****************************************************************************
  1050.  * FUNCTION
  1051.  *  IsThaiToneMark
  1052.  * DESCRIPTION
  1053.  *  
  1054.  * PARAMETERS
  1055.  *  ch      [IN]        
  1056.  * RETURNS
  1057.  *  
  1058.  *****************************************************************************/
  1059. BOOL IsThaiToneMark(U16 ch)
  1060. {
  1061.     /*----------------------------------------------------------------*/
  1062.     /* Local Variables                                                */
  1063.     /*----------------------------------------------------------------*/
  1064.     /*----------------------------------------------------------------*/
  1065.     /* Code Body                                                      */
  1066.     /*----------------------------------------------------------------*/
  1067.     if (ch == 0x0E48 || ch == 0x0E49 || ch == 0x0E4A || ch == 0x0E4B)
  1068.     {
  1069.         return TRUE;
  1070.     }
  1071.     else
  1072.     {
  1073.         return FALSE;
  1074.     }
  1075. }
  1076. /*****************************************************************************
  1077.  * FUNCTION
  1078.  *  IsThaiBaseLineChar
  1079.  * DESCRIPTION
  1080.  *  
  1081.  * PARAMETERS
  1082.  *  ch      [IN]        
  1083.  * RETURNS
  1084.  *  
  1085.  *****************************************************************************/
  1086. BOOL IsThaiBaseLineChar(U16 ch)
  1087. {
  1088.     /*----------------------------------------------------------------*/
  1089.     /* Local Variables                                                */
  1090.     /*----------------------------------------------------------------*/
  1091.     /*----------------------------------------------------------------*/
  1092.     /* Code Body                                                      */
  1093.     /*----------------------------------------------------------------*/
  1094.     if (ch >= 0x0E01 && ch <= 0x0E7F)
  1095.     {
  1096.         /* above vowels */
  1097.         if (ch != 0x0E31 && ch != 0x0E34 && ch != 0x0E35 && ch != 0x0E36 && ch != 0x0E37 &&
  1098.             /* Tone marks */
  1099.             ch != 0x0E48 && ch != 0x0E49 && ch != 0x0E4A && ch != 0x0E4B &&
  1100.             /* Below vowels */
  1101.             ch != 0x0E38 && ch != 0x0E39 && ch != 0X0E3A &&
  1102.             /* Signs */
  1103.             ch != 0x0E2F && ch != 0x0E3F && ch != 0x0E46 && ch != 0x0E47 && ch != 0x0E4C &&
  1104.             /* Exclude Thai digits */
  1105.             ch < 0x0E4F)
  1106.         {
  1107.             return TRUE;
  1108.         }
  1109.         else
  1110.         {
  1111.             return FALSE;
  1112.         }
  1113.     }
  1114.     else
  1115.     {
  1116.         return FALSE;
  1117.     }
  1118. }
  1119. /*****************************************************************************
  1120.  * FUNCTION
  1121.  *  IsThaiAboveLineChar
  1122.  * DESCRIPTION
  1123.  *  
  1124.  * PARAMETERS
  1125.  *  ch      [IN]        
  1126.  * RETURNS
  1127.  *  
  1128.  *****************************************************************************/
  1129. BOOL IsThaiAboveLineChar(U16 ch)
  1130. {
  1131.     /*----------------------------------------------------------------*/
  1132.     /* Local Variables                                                */
  1133.     /*----------------------------------------------------------------*/
  1134.     /*----------------------------------------------------------------*/
  1135.     /* Code Body                                                      */
  1136.     /*----------------------------------------------------------------*/
  1137.     if (ch == 0x0E31 || ch == 0x0E34 || ch == 0x0E35 || ch == 0x0E36 || ch == 0x0E37 || ch == 0x0E47 || ch == 0x0E4C)
  1138.     {
  1139.         return TRUE;
  1140.     }
  1141.     else
  1142.     {
  1143.         return FALSE;
  1144.     }
  1145. }
  1146. /*****************************************************************************
  1147.  * FUNCTION
  1148.  *  IsThaiBottomLineChar
  1149.  * DESCRIPTION
  1150.  *  
  1151.  * PARAMETERS
  1152.  *  ch      [IN]        
  1153.  * RETURNS
  1154.  *  
  1155.  *****************************************************************************/
  1156. BOOL IsThaiBottomLineChar(U16 ch)
  1157. {
  1158.     /*----------------------------------------------------------------*/
  1159.     /* Local Variables                                                */
  1160.     /*----------------------------------------------------------------*/
  1161.     /*----------------------------------------------------------------*/
  1162.     /* Code Body                                                      */
  1163.     /*----------------------------------------------------------------*/
  1164.     if (ch == 0x0E38 || ch == 0x0E39 || ch == 0x0E3A)
  1165.     {
  1166.         return TRUE;
  1167.     }
  1168.     else
  1169.     {
  1170.         return FALSE;
  1171.     }
  1172. }
  1173. /*****************************************************************************
  1174.  * FUNCTION
  1175.  *  IsThaiLongTailChar
  1176.  * DESCRIPTION
  1177.  *  
  1178.  * PARAMETERS
  1179.  *  ch      [IN]        
  1180.  * RETURNS
  1181.  *  
  1182.  *****************************************************************************/
  1183. BOOL IsThaiLongTailChar(U16 ch)
  1184. {
  1185.     /*----------------------------------------------------------------*/
  1186.     /* Local Variables                                                */
  1187.     /*----------------------------------------------------------------*/
  1188.     /*----------------------------------------------------------------*/
  1189.     /* Code Body                                                      */
  1190.     /*----------------------------------------------------------------*/
  1191.     if (ch == 0x0E1B || ch == 0x0E1D || ch == 0x0E1F)
  1192.     {
  1193.         return TRUE;
  1194.     }
  1195.     else
  1196.     {
  1197.         return FALSE;
  1198.     }
  1199. }
  1200. /*****************************************************************************
  1201.  * FUNCTION
  1202.  *  IsThaiDigitChar
  1203.  * DESCRIPTION
  1204.  *  
  1205.  * PARAMETERS
  1206.  *  ch      [IN]        
  1207.  * RETURNS
  1208.  *  
  1209.  *****************************************************************************/
  1210. BOOL IsThaiDigitChar(U16 ch)
  1211. {
  1212.     /*----------------------------------------------------------------*/
  1213.     /* Local Variables                                                */
  1214.     /*----------------------------------------------------------------*/
  1215.     /*----------------------------------------------------------------*/
  1216.     /* Code Body                                                      */
  1217.     /*----------------------------------------------------------------*/
  1218.     if (ch >= 0x0E50 && ch <= 0x0E59)
  1219.     {
  1220.         return TRUE;
  1221.     }
  1222.     else
  1223.     {
  1224.         return FALSE;
  1225.     }
  1226. }
  1227. /*****************************************************************************
  1228.  * FUNCTION
  1229.  *  IsThaiBaseSignChar
  1230.  * DESCRIPTION
  1231.  *  
  1232.  * PARAMETERS
  1233.  *  ch      [IN]        
  1234.  * RETURNS
  1235.  *  
  1236.  *****************************************************************************/
  1237. BOOL IsThaiBaseSignChar(U16 ch)
  1238. {
  1239.     /*----------------------------------------------------------------*/
  1240.     /* Local Variables                                                */
  1241.     /*----------------------------------------------------------------*/
  1242.     /*----------------------------------------------------------------*/
  1243.     /* Code Body                                                      */
  1244.     /*----------------------------------------------------------------*/
  1245.     if (ch == 0x0E2F || ch == 0x0E3F || ch == 0x0E46 || ch == 0x0E4F || ch == 0x0E5A || ch == 0x0E5B)
  1246.     {
  1247.         return TRUE;
  1248.     }
  1249.     else
  1250.     {
  1251.         return FALSE;
  1252.     }
  1253. }
  1254. /*****************************************************************************
  1255.  * FUNCTION
  1256.  *  HaveThaiCharacter
  1257.  * DESCRIPTION
  1258.  *  
  1259.  * PARAMETERS
  1260.  *  str     [?]     
  1261.  * RETURNS
  1262.  *  
  1263.  *****************************************************************************/
  1264. BOOL HaveThaiCharacter(U16 *str)
  1265. {
  1266.     /*----------------------------------------------------------------*/
  1267.     /* Local Variables                                                */
  1268.     /*----------------------------------------------------------------*/
  1269.     U16 ch = 0;
  1270.     /*----------------------------------------------------------------*/
  1271.     /* Code Body                                                      */
  1272.     /*----------------------------------------------------------------*/
  1273.     while (1)
  1274.     {
  1275.         ch = str[0];
  1276.         if (ch == 0)
  1277.         {
  1278.             return FALSE;
  1279.         }
  1280.         if (ch >= 0x0E01 && ch <= 0x0E7F)
  1281.         {
  1282.             return TRUE;
  1283.         }
  1284.         str++;
  1285.     }
  1286.     return FALSE;
  1287. }
  1288. /*****************************************************************************
  1289.  * FUNCTION
  1290.  *  RequireToMoveCursor
  1291.  * DESCRIPTION
  1292.  *  
  1293.  * PARAMETERS
  1294.  *  preCh       [IN]        
  1295.  *  curCh       [IN]        
  1296.  * RETURNS
  1297.  *  
  1298.  *****************************************************************************/
  1299. BOOL RequireToMoveCursor(U16 preCh, U16 curCh)
  1300. {
  1301.     /*----------------------------------------------------------------*/
  1302.     /* Local Variables                                                */
  1303.     /*----------------------------------------------------------------*/
  1304.     pBOOL isPreBaseLineChar = IsThaiBaseLineChar(preCh);
  1305.     /*----------------------------------------------------------------*/
  1306.     /* Code Body                                                      */
  1307.     /*----------------------------------------------------------------*/
  1308.     if (curCh >= 0x0E01 && curCh <= 0x0E7F)
  1309.     {
  1310.         if (IsThaiBaseLineChar(curCh) || IsThaiDigitChar(curCh) || IsThaiBaseSignChar(curCh))
  1311.         {   /* For base level character */
  1312.             return TRUE;
  1313.         }
  1314.         else if (IsThaiAboveLineChar(curCh))
  1315.         {   /* For above level character */
  1316.             if (isPreBaseLineChar)
  1317.             {
  1318.                 return FALSE;
  1319.             }
  1320.             else if (curCh == 0x0E4C && preCh != 0x0E4C && preCh != 0x0E47)
  1321.             {
  1322.                 return FALSE;
  1323.             }
  1324.             else
  1325.             {
  1326.                 return TRUE;
  1327.             }
  1328.         }
  1329.         else if (IsThaiBottomLineChar(curCh))
  1330.         {   /* For below level character */
  1331.             if (isPreBaseLineChar)
  1332.             {
  1333.                 return FALSE;
  1334.             }
  1335.             else
  1336.             {
  1337.                 return TRUE;
  1338.             }
  1339.         }
  1340.         else if (IsThaiToneMark(curCh))
  1341.         {   /* For Tone mark characters */
  1342.             if (isPreBaseLineChar || IsThaiAboveLineChar(preCh) || IsThaiBottomLineChar(preCh))
  1343.             {
  1344.                 return FALSE;
  1345.             }
  1346.             else
  1347.             {
  1348.                 return TRUE;
  1349.             }
  1350.         }
  1351.         else
  1352.         {
  1353.             return TRUE;
  1354.         }
  1355.     }
  1356.     else
  1357.     {
  1358.         return TRUE;
  1359.     }
  1360. }
  1361. /*****************************************************************************
  1362.  * FUNCTION
  1363.  *  ShowCharFuncDispatch
  1364.  * DESCRIPTION
  1365.  *  
  1366.  * PARAMETERS
  1367.  *  LineHeight      [IN]        
  1368.  *  nWidth          [IN]        
  1369.  *  nHgt            [IN]        
  1370.  *  CurrentX        [IN]        
  1371.  *  CurrentY        [IN]        
  1372.  *  Font            [IN]        
  1373.  *  BackGround      [IN]        
  1374.  *  CharData        [?]         
  1375.  *  NumChar         [IN]        
  1376.  *  Bordered        [IN]        
  1377.  * RETURNS
  1378.  *  void
  1379.  *****************************************************************************/
  1380. __inline static void ShowCharFuncDispatch(
  1381.                         U32 LineHeight,
  1382.                         U16 nWidth,
  1383.                         U16 nHgt,
  1384.                         S32 CurrentX,
  1385.                         S32 CurrentY,
  1386.                         stFontAttribute Font,
  1387.                         U8 BackGround,
  1388.                         U8 *CharData,
  1389.                         U32 NumChar,
  1390.                         U32 Bordered)
  1391. {
  1392.     /*----------------------------------------------------------------*/
  1393.     /* Local Variables                                                */
  1394.     /*----------------------------------------------------------------*/
  1395.     S32 nXOffset, nYOffset;
  1396.     U8 font_attr = 0;
  1397.     gdi_color border_color = 0, text_color;
  1398.     /*----------------------------------------------------------------*/
  1399.     /* Code Body                                                      */
  1400.     /*----------------------------------------------------------------*/
  1401.     if (gnCurrentFontAttrib & FONTATTRIB_ITALIC)
  1402.     {
  1403.         font_attr |= FONTATTRIB_ITALIC;
  1404.     }
  1405.     else if (gnCurrentFontAttrib & FONTATTRIB_OBLIQUE)
  1406.     {
  1407.         font_attr |= FONTATTRIB_OBLIQUE;
  1408.     }
  1409.     if (Font.underline)
  1410.     {
  1411.         font_attr |= FONTATTRIB_UNDERLINE;
  1412.     }
  1413.     {
  1414.         if (Bordered)
  1415.         {
  1416.             border_color = gdi_act_color_from_rgb(0xff, UI_text_border_color.r, UI_text_border_color.g, UI_text_border_color.b);
  1417.         }
  1418.         text_color = gdi_act_color_from_rgb(0xff, UI_current_text_color.r, UI_current_text_color.g, UI_current_text_color.b);
  1419.     }
  1420.     /*
  1421.      * MTK Terry to consider Thai display in ShowStackedString
  1422.      * if(LineHeight>0)
  1423.      * {
  1424.      * 
  1425.      * if(LineHeight==gThaiLineHeight ) //If the line height is equal to 17 points
  1426.      * CurrentY+=(LineHeight-(S32)nHgt-1); // Lower one pixel to centralize ThaiFont
  1427.      * else
  1428.      * CurrentY+=(LineHeight-(S32)nHgt);
  1429.      * 
  1430.      * }
  1431.      */
  1432.     nXOffset = CurrentX + nWidth;
  1433.     nYOffset = CurrentY + nHgt;
  1434.     if (Bordered)
  1435.     {
  1436.         gdi_show_char_bordered(
  1437.             CurrentX,
  1438.             CurrentY,
  1439.             text_color,
  1440.             border_color,
  1441.             CharData,
  1442.             NumChar,
  1443.             nWidth,
  1444.             nHgt,
  1445.             font_attr);
  1446.     }
  1447.     else if (!
  1448.              (gnCurrentFontAttrib & FONTATTRIB_BOLD &&
  1449.               gpCurrentFont->pFontType[gnCurrentFont][gbFontType] & FONTATTRIB_BOLD) ||
  1450.              !(gpCurrentFont->pFontType[gnCurrentFont][gbFontType] & FONTATTRIB_NORMAL))
  1451.     {
  1452.         gdi_show_char(CurrentX, CurrentY, text_color, CharData, NumChar, nWidth, nHgt, font_attr);
  1453.     }
  1454.     else
  1455.     {
  1456.         gdi_show_char(CurrentX + 1, CurrentY, text_color, CharData, NumChar, nWidth, nHgt, font_attr);
  1457.         gdi_show_char(CurrentX, CurrentY, text_color, CharData, NumChar, nWidth, nHgt, font_attr);
  1458.     }
  1459. }
  1460. /*****************************************************************************
  1461.  * FUNCTION
  1462.  *  ShowStackedString
  1463.  * DESCRIPTION
  1464.  *  
  1465.  * PARAMETERS
  1466.  *  CurrentX        [IN]        
  1467.  *  CurrentY        [IN]        
  1468.  *  Font            [IN]        
  1469.  *  BackGround      [IN]        
  1470.  *  String          [?]         
  1471.  *  LineHeight      [IN]        
  1472.  *  Bordered        [IN]        
  1473.  *  len             [IN]        
  1474.  * RETURNS
  1475.  *  
  1476.  *****************************************************************************/
  1477. U32 ShowStackedString(
  1478.         S32 CurrentX,
  1479.         S32 CurrentY,
  1480.         stFontAttribute Font,
  1481.         U8 BackGround,
  1482.         U8 *String,
  1483.         U32 LineHeight,
  1484.         U32 Bordered,
  1485.         S32 len)
  1486. {
  1487.     /*----------------------------------------------------------------*/
  1488.     /* Local Variables                                                */
  1489.     /*----------------------------------------------------------------*/
  1490.     /* GDI_ENTER_CRITICAL_SECTION(ShowStackedString) */
  1491.     U8 *CharData;
  1492.     U32 NumChar;
  1493.     U16 nHgt;
  1494.     U16 nWidth;
  1495.     S32 temp_len = 0;
  1496.     BOOL has_thai_char = MMI_FALSE;
  1497.     S32 iX, iY;
  1498.     static U16 curCh = 0, preCh = 0, pre2Ch = 0, nextCharUCS2 = 0;
  1499.     S32 interLeaving = gThaiFontInterSpace;
  1500.     gdi_color border_color, text_color;
  1501.     U8 font_attr = 0;
  1502.     S32 str_width, str_height;
  1503.     S32 clip_x1, clip_y1, clip_x2, clip_y2;
  1504. #if defined(__MMI_LANG_VIETNAMESE__)
  1505.     viet_tone_mark tone_mark = VIET_TONE_NONE;
  1506.     viet_vowel_letter viet_vowel = VIET_VOWEL_NONE;
  1507. #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1508. #ifdef __MMI_HINDI_ALG__
  1509.     U16 nDWidth = 0;
  1510.     static S32 single_time_bidi = 0;    /* added farhad 20012004 */
  1511.     static S32 hindi_rule_string = 1;
  1512. #endif /* __MMI_HINDI_ALG__ */ 
  1513. #ifdef __MMI_BIDI_ALG__
  1514.     PMT_BIDI_TYPES default_direction = BIDI_L;
  1515.     U16 logical_cur_pos;
  1516.     U8 *temp_text_P;
  1517.     U16 visual_str_len;
  1518.     U16 visual_cur_pos;
  1519.     S32 nLen;
  1520.     U16 visual_hilight_start;
  1521.     U16 visual_hilight_end;
  1522. #endif /* __MMI_BIDI_ALG__ */ 
  1523.     /*----------------------------------------------------------------*/
  1524.     /* Code Body                                                      */
  1525.     /*----------------------------------------------------------------*/
  1526.     gdi_layer_get_clip(&clip_x1, &clip_y1, &clip_x2, &clip_y2);
  1527.     Get_StringWidthHeight(String, &str_width, &str_height);
  1528. #ifdef __MMI_SUPPORT_DUMP_SCREEN_STRING__
  1529. mmi_trace_screen_string(CurrentX, CurrentY, String, len, Bordered);
  1530. #endif
  1531. #ifdef __MMI_HINDI_ALG__
  1532.     if (!single_time_bidi && !cancelWidth)
  1533. #endif 
  1534.     {
  1535.     #ifdef __MMI_BIDI_ALG__
  1536.         nLen = UCS2Strlen((const char*)String);
  1537.         if(nLen > MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH) 
  1538.             len = MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH;
  1539. //        MMI_ASSERT(!(nLen > MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH));
  1540.         if (len > 0)
  1541.         {
  1542.             UCS2Strncpy((S8*) show_pwcWord, (S8*) String, len);
  1543.         }
  1544.         else
  1545.         {
  1546.             UCS2Strcpy((S8*) show_pwcWord, (S8*) String);
  1547.         }
  1548.         nLen = UCS2Strlen((const char*)show_pwcWord);
  1549.         /* PMT NO_AR_SL_DU START 20050909 */
  1550.     #if defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__)
  1551.     #if defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__)
  1552.         if (nLen)
  1553.         {
  1554.         #ifdef __MMI_ZI_V7__
  1555.         #if defined(__MMI_ZI_PERSIAN__) && defined(__MMI_ZI_ARABIC__)
  1556.             ZiStringShape(ZI8_LANG_FA, (U16 *) & nLen, show_pwcWord);
  1557.         #elif defined (__MMI_ZI_PERSIAN__)
  1558.             ZiStringShape(ZI8_LANG_FA, (U16 *) & nLen, show_pwcWord);
  1559.         #elif defined (__MMI_ZI_ARABIC__)
  1560.             ZiStringShape(ZI8_LANG_AR, (U16 *) & nLen, show_pwcWord);
  1561.         #endif 
  1562.         #else /* __MMI_ZI_V7__ */ 
  1563.             ArabicStringShape((U16 *) & nLen, show_pwcWord);
  1564.         #endif /* __MMI_ZI_V7__ */ 
  1565.         }
  1566.     #else /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  1567.         if (nLen)
  1568.         {
  1569.             ArabicShapeEngine((U16*) & nLen, show_pwcWord); /* output will replace the input string after returning */
  1570.         }
  1571.     #endif /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  1572.     #endif /* defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__) */ 
  1573.  
  1574.         /* PMT NO_AR_SL_DU END 20050909 */
  1575.         String = (U8*) show_pwcWord;
  1576.         bidi_get_char_type((U8*) String, (U8*) & default_direction);
  1577.         logical_cur_pos = 0;
  1578.         if (default_direction == BIDI_R || default_direction == AL)
  1579.         {
  1580.             bidi_main(
  1581.                 (U8*) String,
  1582.                 (U16) UCS2Strlen((const S8*)String),
  1583.                 logical_cur_pos,
  1584.                 show_visual_str,
  1585.                 &visual_str_len,
  1586.                 &visual_cur_pos,
  1587.                 MMI_TRUE,
  1588.                 MMI_bidi_input_type,
  1589.                 0,
  1590.                 0,
  1591.                 &visual_hilight_start,
  1592.                 &visual_hilight_end);
  1593.             default_direction = BIDI_R;
  1594.         }
  1595.         else    /* if(default_direction == BIDI_L) */
  1596.         {
  1597.             bidi_main(
  1598.                 (U8*) String,
  1599.                 (U16) UCS2Strlen((const S8*)String),
  1600.                 logical_cur_pos,
  1601.                 show_visual_str,
  1602.                 &visual_str_len,
  1603.                 &visual_cur_pos,
  1604.                 MMI_FALSE,
  1605.                 MMI_bidi_input_type,
  1606.                 0,
  1607.                 0,
  1608.                 &visual_hilight_start,
  1609.                 &visual_hilight_end);
  1610.             default_direction = BIDI_L;
  1611.         }
  1612.         /* START FARHAD PMT 20050211 */
  1613.     #ifdef __MMI_HINDI_ALG__
  1614.         if (r2lMMIFlag)
  1615.         {
  1616.             get_hindi_rules_for_whole_string(show_visual_str);
  1617.             hindi_rule_string = 0;
  1618.         }
  1619.     #endif /* __MMI_HINDI_ALG__ */ 
  1620.         /* END FARHAD PMT 20050211 */
  1621.         if ((r2lMMIFlag && default_direction == BIDI_L) || (!r2lMMIFlag && default_direction != BIDI_L))
  1622.         {
  1623.             bidi_reverse(show_visual_str, (U16) UCS2Strlen((const S8*)show_visual_str));
  1624.         }
  1625.         temp_text_P = String;
  1626.         String = show_visual_str;
  1627.     #endif /* __MMI_BIDI_ALG__ */ 
  1628.     }   /* added farhad 20012005 */
  1629.     if (gnCurrentFontAttrib & FONTATTRIB_ITALIC)
  1630.     {
  1631.         font_attr |= FONTATTRIB_ITALIC;
  1632.     }
  1633.     else if (gnCurrentFontAttrib & FONTATTRIB_OBLIQUE)
  1634.     {
  1635.         font_attr |= FONTATTRIB_OBLIQUE;
  1636.     }
  1637.     if (Font.underline)
  1638.     {
  1639.         font_attr |= FONTATTRIB_UNDERLINE;
  1640.     }
  1641.     if (Bordered)
  1642.     {
  1643.         border_color = gdi_act_color_from_rgb(0xff, UI_text_border_color.r, UI_text_border_color.g, UI_text_border_color.b);
  1644.     }
  1645.     text_color = gdi_act_color_from_rgb(0xff, UI_current_text_color.r, UI_current_text_color.g, UI_current_text_color.b);
  1646.     gdi_font_begin(text_color, font_attr);
  1647.     //UI_current_text_color = UI_text_color;
  1648.     //Process string
  1649. #ifdef __MMI_HINDI_ALG__
  1650.     if (hf_is_reset_hindi_params())
  1651.     {
  1652.         reset_hindi_params();
  1653.     }
  1654.     if (Font.color == 0)
  1655.     {
  1656.         Font.color = 15;
  1657.     }
  1658.     //For hindi character sudden disappear 
  1659.     //UI_current_text_color = UI_text_color;
  1660.     if (hf_is_hindi_rules_parsing())
  1661.     {
  1662.         U16 cluster_fill[G_MAX];
  1663.         S32 cluster_length;
  1664.         U16 glyph_output[G_MAX];
  1665.         S32 Len;
  1666.         /* PMT FARHAD START 20050708 */
  1667.         S32 total_len = 0;
  1668.         S32 original_len = 0;
  1669.         /* PMT FARHAD END 20050708 */
  1670.         S32 width, height;
  1671.         pre2Ch = 0;
  1672.         preCh = 0;
  1673.         init_cluster_start_p(String);
  1674.         /* PMT FARHAD START 20050708 */
  1675.         if (len > 0)
  1676.         {
  1677.             init_cluster_end_p(String + (len * 2));
  1678.         }
  1679.         else
  1680.         {
  1681.             init_cluster_end_p(String + (2 * UCS2Strlen((const char*)String) + 1));
  1682.         }
  1683.         original_len = len;
  1684.         /* PMT FARHAD END 20050708 */
  1685.         hf_disable_hindi_rules_parsing();
  1686.         hf_disable_hindi_reset_hindi_params();
  1687.         /* W05.34 For Hindi with Bidi issue */
  1688.         single_time_bidi = 1;
  1689.         do
  1690.         {
  1691.             cluster_length = hf_get_cluster(cluster_fill);
  1692.             /* PMT FARHAD START 20050708 */
  1693.             total_len += cluster_length;
  1694.             if (original_len > 0)
  1695.             {
  1696.                 if (total_len > original_len)
  1697.                 {
  1698.                     break;
  1699.                 }
  1700.             }
  1701.             /* PMT FARHAD END 20050708 */
  1702.             if (cluster_length)
  1703.             {
  1704.                 Len = hf_hindi_rules(glyph_output, cluster_fill, cluster_length);
  1705.                 ShowStackedString(CurrentX, CurrentY, Font, BackGround, (U8*) glyph_output, LineHeight, Bordered, len);
  1706.                 Get_StringWidthHeight((U8*) glyph_output, &width, &height);
  1707.                 CurrentX += width;
  1708.             }
  1709.         } while (cluster_length);
  1710.         hf_enable_hindi_rules_parsing();
  1711.         hf_enable_hindi_reset_hindi_params();
  1712.         /* W05.34 For Hindi with Bidi issue */
  1713.         single_time_bidi = 0;
  1714.         gdi_font_end();
  1715.         return 0;
  1716.         /* GDI_RETURN(0); */
  1717.     }
  1718. #endif /* __MMI_HINDI_ALG__ */ 
  1719.     if (r2lMMIFlag)
  1720.     {
  1721.         while (1)
  1722.         {
  1723.             curCh = (String[temp_len] | (String[temp_len + 1] << 8));
  1724.             if (curCh >= 0x0E01 && curCh <= 0x0E7F)
  1725.             {
  1726.                 has_thai_char = MMI_TRUE;
  1727.                 break;
  1728.             }
  1729.             temp_len += 2;
  1730.             if (curCh == 0x0000)
  1731.             {
  1732.                 break;
  1733.             }
  1734.         }
  1735.         if (has_thai_char == MMI_TRUE)
  1736.         {
  1737.             bidi_reverse(String, (U16) UCS2Strlen((const S8*)String));
  1738.             Get_StringWidthHeight(String, &str_width, &str_height);
  1739.             CurrentX -= str_width;
  1740.         }
  1741.     }
  1742.     while (len != 0)
  1743.     {
  1744.         iX = CurrentX;
  1745.         iY = CurrentY;
  1746.         /* prepare the unicode of current and next characters */
  1747.         curCh = (String[0] | (String[1] << 8));
  1748.         nextCharUCS2 = (String[2] | (String[3] << 8));
  1749.         if (curCh == 0x0000)
  1750.         {
  1751.             break;
  1752.         }
  1753.         len--;
  1754.         if (FONT_TEST_CONTROL_CHAR(curCh))
  1755.         {
  1756.             curCh = 0x20;
  1757.         }
  1758.     #if defined(__MMI_LANG_VIETNAMESE__)
  1759.         if ((curCh > 0x0040) && (curCh < 0x01B1))
  1760.         {
  1761.             tone_mark = mmi_viet_tone_mark(nextCharUCS2);
  1762.             if (VIET_TONE_NONE != tone_mark)
  1763.             {
  1764.                 viet_vowel = mmi_viet_vowel_letter(curCh);
  1765.                 if (VIET_VOWEL_NONE != viet_vowel)
  1766.                 {
  1767.                     curCh = mmi_viet_combine_vowel_tone(viet_vowel, tone_mark);
  1768.                     String += 2;
  1769.                 }
  1770.             }
  1771.         }
  1772.     #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1773.     #if defined(__MMI_HINDI_ALG__)
  1774.         NumChar = GetFontdata(curCh, Font, &CharData, &nWidth, &nDWidth, &nHgt);
  1775.         get_text_x(&iX, curCh, iY, nDWidth, nWidth);
  1776.     #else /* defined(__MMI_HINDI_ALG__) */ 
  1777.         NumChar = GetFontdata(curCh, Font, &CharData, &nWidth, &nHgt);
  1778.     #endif /* defined(__MMI_HINDI_ALG__) */ 
  1779.         /* check if current character is in Thai character ranges */
  1780.         if (curCh >= 0x0E01 && curCh <= 0x0E7F)
  1781.         {
  1782.             /* Base line character, can combinate with above vowels,bottom vowels, tone mark, and sign */
  1783.             if (IsThaiBaseLineChar(curCh))
  1784.             {
  1785.                 //if the current character is 0x0E33 and previous or previous 2 character is base line character, 0x0E33 shall be
  1786.                 //moved ahead to let the circyle sign on the top of previous or previous2 character
  1787.                 if (curCh == 0x0E33 && (IsThaiBaseLineChar(preCh) || IsThaiBaseLineChar(pre2Ch)))
  1788.                 {
  1789.                     iX -= 4;
  1790.                 }
  1791.                 CurrentX = (iX + (S32) nWidth + interLeaving);
  1792.             }
  1793.             /* For Thai digits and base line sign, the only thing we have to do is moving cursor */
  1794.             else if (IsThaiDigitChar(curCh) || IsThaiBaseSignChar(curCh))
  1795.             {
  1796.                 CurrentX = (iX + (S32) nWidth + interLeaving);
  1797.             }
  1798.             else if (IsThaiAboveLineChar(curCh))
  1799.             {
  1800.                 /* Above line characters */
  1801.                 iY -= 1;    /* Reserver 1 pixtel vertical interleaving */
  1802.                 if (IsThaiBaseLineChar(preCh))
  1803.                 {
  1804.                     /* Process the X coordinate when combining with other base line characters */
  1805.                     iX -= ((S32) nWidth + interLeaving);
  1806.                     if (IsThaiLongTailChar(preCh))  /* move ahead 3 pixels, */
  1807.                     {
  1808.                         iX -= 3;
  1809.                     }
  1810.                     else if (preCh == 0x0E0A || preCh == 0x0E0B)
  1811.                     {
  1812.                         iX -= 2;
  1813.                     }
  1814.                     else if (preCh == 0x0E2C)   /* move ahead 6 pixels */
  1815.                     {
  1816.                         iX -= 6;
  1817.                     }
  1818.                 }
  1819.             }
  1820.             else if (IsThaiBottomLineChar(curCh))
  1821.             {
  1822.                 /* Bottom line characters */
  1823.                 iY += interLeaving;
  1824.                 if (IsThaiBaseLineChar(preCh))
  1825.                 {
  1826.                     iX -= ((S32) nWidth + interLeaving);
  1827.                     if (preCh == 0x0E2C)
  1828.                     {
  1829.                         iX -= 2;    /* move ahead for 2 pixels */
  1830.                     }
  1831.                 }
  1832.             }
  1833.             else if (IsThaiToneMark(curCh))
  1834.             {
  1835.                 /* Tone marks */
  1836.                 iY -= 1;
  1837.                 if (IsThaiBaseLineChar(preCh))
  1838.                 {
  1839.                     iX -= ((S32) nWidth + interLeaving);
  1840.                     if (preCh == 0x0E33)
  1841.                     {
  1842.                         iY -= 3;    /* move tone mark higher */
  1843.                         if (IsThaiBaseLineChar(pre2Ch))
  1844.                         {
  1845.                             iX -= 7;    /* Move tone mark ahead across the width of */
  1846.                         }
  1847.                     }
  1848.                     else if (nextCharUCS2 == 0x0E33)
  1849.                     {
  1850.                         iY -= 3;    /* move tone mark higher */
  1851.                     }
  1852.                     else if (IsThaiLongTailChar(preCh))
  1853.                     {
  1854.                         iX -= 3;    /* move tone mark ahead for 3 pixel */
  1855.                     }
  1856.                     else if (preCh == 0x0E0A || preCh == 0x0E0B)
  1857.                     {
  1858.                         iX -= 2;
  1859.                     }
  1860.                     else if (preCh == 0x0E2C)
  1861.                     {
  1862.                         iX -= 6;
  1863.                     }
  1864.                 }
  1865.                 else if (IsThaiAboveLineChar(preCh))
  1866.                 {
  1867.                     iY -= 3;
  1868.                     iX -= ((S32) nWidth + interLeaving);
  1869.                     if (IsThaiLongTailChar(pre2Ch))
  1870.                     {
  1871.                         iX -= 3;
  1872.                     }
  1873.                     else if (pre2Ch == 0x0E0A || pre2Ch == 0x0E0B)
  1874.                     {
  1875.                         iX -= 2;
  1876.                     }
  1877.                     else if (pre2Ch == 0x0E2C)
  1878.                     {
  1879.                         iX -= 6;
  1880.                     }
  1881.                 }
  1882.                 else if (IsThaiBottomLineChar(preCh))
  1883.                 {
  1884.                     iX -= ((S32) nWidth + interLeaving);
  1885.                     if (IsThaiLongTailChar(pre2Ch))
  1886.                     {
  1887.                         iX -= 3;
  1888.                     }
  1889.                 }
  1890.                 else if (preCh == 0x0E47 || preCh == 0x0E4C)
  1891.                 {
  1892.                     /* move the tone mark to next character space */
  1893.                     iX += ((S32) nWidth + interLeaving);
  1894.                     CurrentX += ((S32) nWidth + interLeaving);
  1895.                 }
  1896.                 else
  1897.                 {
  1898.                     CurrentX += ((S32) nWidth + interLeaving);
  1899.                 }
  1900.             }
  1901.             iY += (str_height - nHgt);
  1902.             ShowCharFuncDispatch(LineHeight, nWidth, nHgt, iX, iY, Font, BackGround, CharData, NumChar, Bordered);
  1903.         }
  1904.         else    /* non-Thai char */
  1905.         {
  1906.             if (r2lMMIFlag
  1907.         #ifdef __MMI_HINDI_ALG__
  1908.                 && (!cancelWidth)
  1909.         #endif 
  1910.                 )
  1911.             {
  1912.             #ifdef __MMI_HINDI_ALG__
  1913.                 if (UI_HINDI_CHARACTER_UCS2_RANGE(curCh))
  1914.                 {
  1915.                     /* PMT START MAUI_00223197 */
  1916.                     if ((preCh != S_VISARGA) && UI_HINDI_SIGN_RANGE(preCh))
  1917.                         /* PMT END MAUI_00223197 */
  1918.                     {
  1919.                         CurrentX -= 0;
  1920.                     }
  1921.                     /* PMT START MAUI_00223197 */
  1922.                     else if ((curCh != S_VISARGA) && UI_HINDI_SIGN_RANGE(curCh))
  1923.                         /* PMT END MAUI_00223197 */
  1924.                     {
  1925.                         CurrentX -= nWidth;
  1926.                     }
  1927.                     else
  1928.                     {
  1929.                         CurrentX -= nDWidth;
  1930.                     }
  1931.                 }
  1932.                 else
  1933.             #endif /* __MMI_HINDI_ALG__ */ 
  1934.                 if (!has_thai_char)
  1935.                 {
  1936.                     CurrentX -= nWidth;
  1937.                 }
  1938.             }
  1939.             /* PMT FARHAD START 20050708 */
  1940.         #ifndef __MMI_HINDI_ALG__
  1941.             iX = CurrentX;
  1942.         #endif 
  1943.             /* PMT FARHAD END 20050708 */
  1944.             iY += (str_height - nHgt);
  1945.             ShowCharFuncDispatch(LineHeight, nWidth, nHgt, iX, iY, Font, BackGround, CharData, NumChar, Bordered);
  1946.             if (!r2lMMIFlag || has_thai_char)
  1947.             {
  1948.                 CurrentX += nWidth;
  1949.             }
  1950.         }
  1951.         nHgt = (U8) LineHeight;
  1952.         pre2Ch = preCh;
  1953.         preCh = curCh;
  1954.         String += 2;
  1955.         /* W05.50 Skip unnecessary action when the character is out of clip */
  1956.         if ((iX > clip_x2) && !r2lMMIFlag)
  1957.         {
  1958.             break;
  1959.         }
  1960.     }
  1961.     gdi_font_end();
  1962.     return CurrentX;
  1963.     //GDI_RETURN(CurrentX);
  1964.     //GDI_EXIT_CRITICAL_SECTION(ShowStackedString)
  1965. }
  1966. /*****************************************************************************
  1967.  * FUNCTION
  1968.  *  ShowStackedChar
  1969.  * DESCRIPTION
  1970.  *  
  1971.  * PARAMETERS
  1972.  *  CurrentX        [IN]        
  1973.  *  CurrentY        [IN]        
  1974.  *  Font            [IN]        
  1975.  *  BackGround      [IN]        
  1976.  *  curCh           [IN]        
  1977.  *  LineHeight      [IN]        
  1978.  *  Bordered        [IN]        
  1979.  *  pre2Ch          [IN]        
  1980.  *  preCh           [IN]        
  1981.  * RETURNS
  1982.  *  void
  1983.  *****************************************************************************/
  1984. void ShowStackedChar(
  1985.         S32 CurrentX,
  1986.         S32 CurrentY,
  1987.         stFontAttribute Font,
  1988.         U8 BackGround,
  1989.         U16 curCh,
  1990.         U32 LineHeight,
  1991.         U32 Bordered,
  1992.         U16 pre2Ch,
  1993.         U16 preCh)
  1994. {
  1995.     /*----------------------------------------------------------------*/
  1996.     /* Local Variables                                                */
  1997.     /*----------------------------------------------------------------*/
  1998.     /* GDI_ENTER_CRITICAL_SECTION(ShowStackedChar) */
  1999.     U8 *CharData;
  2000.     U32 NumChar;
  2001.     U16 nHgt;
  2002.     U16 nWidth;
  2003. #ifdef __MMI_HINDI_ALG__
  2004.     U16 nDWidth;
  2005. #endif 
  2006.     S32 interLeaving = gThaiFontInterSpace;
  2007.     S32 iX = CurrentX;
  2008.     S32 iY = CurrentY;
  2009.     gdi_color border_color = 0, text_color;
  2010.     U8 font_attr = 0;
  2011.     /*----------------------------------------------------------------*/
  2012.     /* Code Body                                                      */
  2013.     /*----------------------------------------------------------------*/
  2014.     if (gnCurrentFontAttrib & FONTATTRIB_ITALIC)
  2015.     {
  2016.         font_attr |= FONTATTRIB_ITALIC;
  2017.     }
  2018.     else if (gnCurrentFontAttrib & FONTATTRIB_OBLIQUE)
  2019.     {
  2020.         font_attr |= FONTATTRIB_OBLIQUE;
  2021.     }
  2022.     if (Font.underline)
  2023.     {
  2024.         font_attr |= FONTATTRIB_UNDERLINE;
  2025.     }
  2026.     {
  2027.         if (Bordered)
  2028.         {
  2029.             border_color = gdi_act_color_from_rgb(0xff, UI_text_border_color.r, UI_text_border_color.g, UI_text_border_color.b);
  2030.         }
  2031.         text_color = gdi_act_color_from_rgb(0xff, UI_current_text_color.r, UI_current_text_color.g, UI_current_text_color.b);
  2032.     }
  2033. #ifdef __MMI_SUPPORT_DUMP_SCREEN_STRING__
  2034. mmi_trace_screen_char(CurrentX, CurrentY, curCh, 0, Bordered);
  2035. #endif
  2036.     if (FONT_TEST_CONTROL_CHAR(curCh))
  2037.     {
  2038.         curCh = 0x20;
  2039.     }
  2040. #ifdef __MMI_HINDI_ALG__
  2041.     NumChar = GetFontdata(curCh, Font, &CharData, &nWidth, &nDWidth, &nHgt);
  2042. #else 
  2043.     NumChar = GetFontdata(curCh, Font, &CharData, &nWidth, &nHgt);
  2044. #endif 
  2045.     gdi_font_begin(text_color, font_attr);
  2046.     /* adjust iX and iY for Thai characters */
  2047.     if (curCh >= 0x0E01 && curCh <= 0x0E7F)
  2048.     {
  2049.         if (IsThaiBaseLineChar(curCh))
  2050.         {
  2051.             if (IsThaiLongTailChar(curCh))
  2052.             {
  2053.                 iX += 1;
  2054.             }
  2055.             //if the current character is 0x0E33 and previous or previous 2 character is base line character, 0x0E33 shall be
  2056.             //moved ahead to let the circyle sign on the top of previous or previous2 character
  2057.             if (curCh == 0x0E33 && (IsThaiBaseLineChar(preCh) || IsThaiBaseLineChar(pre2Ch)))
  2058.             {
  2059.                 iX -= 1;
  2060.             }
  2061.         }
  2062.         else if (IsThaiAboveLineChar(curCh))
  2063.         {
  2064.             /* Above line characters */
  2065.             iY -= 1;    /* Reserver 1 pixtel vertical interleaving */
  2066.             if (IsThaiBaseLineChar(preCh))
  2067.             {
  2068.                 /* Process the X coordinate when combining with other base line characters */
  2069.                 iX -= ((S32) nWidth + interLeaving);
  2070.                 if (IsThaiLongTailChar(preCh))  /* move ahead 3 pixels, */
  2071.                 {
  2072.                     iX -= 3;
  2073.                 }
  2074.                 else if (preCh == 0x0E0A || preCh == 0x0E0B)
  2075.                 {
  2076.                     iX -= 2;
  2077.                 }
  2078.                 else if (preCh == 0x0E2C)   /* move ahead 6 pixels */
  2079.                 {
  2080.                     iX -= 6;
  2081.                 }
  2082.             }
  2083.         }
  2084.         else if (IsThaiBottomLineChar(curCh))
  2085.         {
  2086.             /* Bottom line characters */
  2087.             iY += interLeaving;
  2088.             if (IsThaiBaseLineChar(preCh))
  2089.             {
  2090.                 iX -= ((S32) nWidth + interLeaving);
  2091.                 if (preCh == 0x0E2C)
  2092.                 {
  2093.                     iX -= 2;    /* move ahead for 2 pixels */
  2094.                 }
  2095.             }
  2096.         }
  2097.         else if (IsThaiToneMark(curCh))
  2098.         {
  2099.             /* Tone marks */
  2100.             iY -= 1;
  2101.             if (IsThaiBaseLineChar(preCh))
  2102.             {
  2103.                 iX -= ((S32) nWidth + interLeaving);
  2104.                 if (preCh == 0x0E33)
  2105.                 {
  2106.                     iY -= 3;    /* move tone mark higher */
  2107.                     if (IsThaiBaseLineChar(pre2Ch))
  2108.                     {
  2109.                         iX -= 7;    /* Move tone mark ahead across the width of */
  2110.                     }
  2111.                 }
  2112.                 //else if(nextCharUCS2 == 0x0E33)
  2113.                 //       iY -= 3;//move tone mark higher
  2114.                 else if (IsThaiLongTailChar(preCh))
  2115.                 {
  2116.                     iX -= 3;    /* move tone mark ahead for 3 pixel */
  2117.                 }
  2118.                 else if (preCh == 0x0E0A || preCh == 0x0E0B)
  2119.                 {
  2120.                     iX -= 2;
  2121.                 }
  2122.                 else if (preCh == 0x0E2C)
  2123.                 {
  2124.                     iX -= 6;
  2125.                 }
  2126.             }
  2127.             else if (IsThaiAboveLineChar(preCh))
  2128.             {
  2129.                 iY -= 3;
  2130.                 iX -= ((S32) nWidth + interLeaving);
  2131.                 if (IsThaiLongTailChar(pre2Ch))
  2132.                 {
  2133.                     iX -= 3;
  2134.                 }
  2135.                 else if (pre2Ch == 0x0E0A || pre2Ch == 0x0E0B)
  2136.                 {
  2137.                     iX -= 2;
  2138.                 }
  2139.                 else if (pre2Ch == 0x0E2C)
  2140.                 {
  2141.                     iX -= 6;
  2142.                 }
  2143.             }
  2144.             else if (IsThaiBottomLineChar(preCh))
  2145.             {
  2146.                 iX -= ((S32) nWidth + interLeaving);
  2147.                 if (IsThaiLongTailChar(pre2Ch))
  2148.                 {
  2149.                     iX -= 3;
  2150.                 }
  2151.             }
  2152.             else if (preCh == 0x0E47 || preCh == 0x0E4C)
  2153.             {
  2154.                 /* move the tone mark to next character space */
  2155.                 iX += ((S32) nWidth + interLeaving);
  2156.             }
  2157.         }
  2158.         //(1)Other cases: For Thai digits and base line sign, the only thing we have to do is moving cursor
  2159.         //(2)Show Characters
  2160.         ShowCharFuncDispatch(LineHeight, nWidth, nHgt, iX, iY, Font, BackGround, CharData, NumChar, Bordered);
  2161.     }
  2162.     else    /* non-Thai char */
  2163.     {
  2164.         ShowCharFuncDispatch(LineHeight, nWidth, nHgt, iX, iY, Font, BackGround, CharData, NumChar, Bordered);
  2165.     }
  2166.     gdi_font_end();
  2167.     /* GDI_EXIT_CRITICAL_SECTION(ShowStackedChar) */
  2168. }
  2169. const L2RLangSSC l2RLangSSC[] = 
  2170. {
  2171.     /* PMT START GR_HE_CZ_FI_DA_HU 20051007 */
  2172.     SSC_ARABIC,
  2173.     SSC_PERSIAN,
  2174.     SSC_HEBREW
  2175.         /* PMT END GR_HE_CZ_FI_DA_HU 20051007 */
  2176. };
  2177. /*****************************************************************************
  2178.  * FUNCTION
  2179.  *  IsL2RMMIStyle
  2180.  * DESCRIPTION
  2181.  *  
  2182.  * PARAMETERS
  2183.  *  void
  2184.  * RETURNS
  2185.  *  
  2186.  *****************************************************************************/
  2187. BOOL IsL2RMMIStyle(void)
  2188. {
  2189.     /*----------------------------------------------------------------*/
  2190.     /* Local Variables                                                */
  2191.     /*----------------------------------------------------------------*/
  2192.     U16 index = 0;
  2193.     U8 temp_str1[30];
  2194.     U8 temp_str2[30];
  2195.     /*----------------------------------------------------------------*/
  2196.     /* Code Body                                                      */
  2197.     /*----------------------------------------------------------------*/
  2198.     AnsiiToUnicodeString((S8*) temp_str1, (S8*) gLanguageArray[gCurrLangIndex].aLangSSC);
  2199.     for (index = 0; index < (sizeof(l2RLangSSC) / sizeof(l2RLangSSC[0])); index++)
  2200.     {
  2201.         AnsiiToUnicodeString((S8*) temp_str2, (S8*) l2RLangSSC[index].sscString);
  2202.         /* pTemp = (U8 *) temp_str; */
  2203.         if (UCS2Strcmp((const S8*)temp_str1, (const S8*)temp_str2) == 0)
  2204.         {
  2205.             return MMI_TRUE;
  2206.         }
  2207.     }
  2208.     return MMI_FALSE;
  2209. }
  2210. /*****************************************************************************
  2211.  * FUNCTION
  2212.  *  ShowDebugString
  2213.  * DESCRIPTION
  2214.  *  
  2215.  * PARAMETERS
  2216.  *  x               [IN]        
  2217.  *  y               [IN]        
  2218.  *  Font            [IN]        
  2219.  *  String          [?]         
  2220.  *  len             [IN]        
  2221.  *  LineHeight      [IN]        
  2222.  *  Bordered        [IN]        
  2223.  * RETURNS
  2224.  *  
  2225.  *****************************************************************************/
  2226. U32 ShowDebugString(S32 x, S32 y, stFontAttribute Font, U8 *String, S32 len, U32 LineHeight, U32 Bordered)
  2227. {
  2228.     /*----------------------------------------------------------------*/
  2229.     /* Local Variables                                                */
  2230.     /*----------------------------------------------------------------*/
  2231.     /* GDI_ENTER_CRITICAL_SECTION(ShowDebugString) */
  2232.     U8 *CharData;
  2233.     U32 NumChar;
  2234.     U32 Counter = 0;
  2235.     S32 CurrentX;
  2236.     U16 nHgt;
  2237.     U16 nWidth;
  2238.     S32 nXOffset;
  2239.     S32 nYOffset;
  2240.     S32 yy;
  2241.     U16 unicode = 0;
  2242. #ifdef __MMI_HINDI_ALG__
  2243.     U16 nDWidth = 0;
  2244. #endif 
  2245.     U8 font_attr = 0;
  2246.     gdi_color border_color = 0, text_color;
  2247.     /*----------------------------------------------------------------*/
  2248.     /* Code Body                                                      */
  2249.     /*----------------------------------------------------------------*/
  2250.     if (gnCurrentFontAttrib & FONTATTRIB_ITALIC)
  2251.     {
  2252.         font_attr |= FONTATTRIB_ITALIC;
  2253.     }
  2254.     else if (gnCurrentFontAttrib & FONTATTRIB_OBLIQUE)
  2255.     {
  2256.         font_attr |= FONTATTRIB_OBLIQUE;
  2257.     }
  2258.     if (Font.underline)
  2259.     {
  2260.         font_attr |= FONTATTRIB_UNDERLINE;
  2261.     }
  2262.     {
  2263.         if (Bordered)
  2264.         {
  2265.             border_color = gdi_act_color_from_rgb(0xff, UI_text_border_color.r, UI_text_border_color.g, UI_text_border_color.b);
  2266.         }
  2267.         text_color = gdi_act_color_from_rgb(0xff, UI_current_text_color.r, UI_current_text_color.g, UI_current_text_color.b);
  2268.     }
  2269.     gdi_font_begin(text_color, font_attr);
  2270.     CurrentX = x;
  2271.     while (len != 0)
  2272.     {
  2273.         if ((String[0] == '') && (String[1] == ''))
  2274.         {
  2275.             break;
  2276.         }
  2277.         len--;
  2278.         unicode = String[0];
  2279.         unicode |= (String[1] << 8);
  2280.         if (FONT_TEST_CONTROL_CHAR(unicode))
  2281.         {
  2282.             unicode = 0x20;
  2283.         }
  2284.     #ifdef __MMI_HINDI_ALG__
  2285.         NumChar = GetFontdata(unicode, Font, &CharData, &nWidth, &nDWidth, &nHgt);
  2286.     #else 
  2287.         NumChar = GetFontdata(unicode, Font, &CharData, &nWidth, &nHgt);
  2288.     #endif 
  2289.         Counter++;
  2290.         if (LineHeight > 0)
  2291.         {
  2292.             yy = y + LineHeight - nHgt;
  2293.         }
  2294.         else
  2295.         {
  2296.             yy = y;
  2297.         }
  2298.         nXOffset = CurrentX + nWidth;
  2299.         nYOffset = yy + nHgt;
  2300.         if (Bordered)
  2301.         {
  2302.             gdi_show_char_bordered(CurrentX, yy, text_color, border_color, CharData, NumChar, nWidth, nHgt, font_attr);
  2303.         }
  2304.         else if (!
  2305.                  (gnCurrentFontAttrib & FONTATTRIB_BOLD &&
  2306.                   gpCurrentFont->pFontType[gnCurrentFont][gbFontType] & FONTATTRIB_BOLD) ||
  2307.                  !(gpCurrentFont->pFontType[gnCurrentFont][gbFontType] & FONTATTRIB_NORMAL))
  2308.         {
  2309.             gdi_show_char(CurrentX, yy, text_color, CharData, NumChar, nWidth, nHgt, font_attr);
  2310.         }
  2311.         else
  2312.         {
  2313.             gdi_show_char(CurrentX + 1, yy, text_color, CharData, NumChar, nWidth, nHgt, font_attr);
  2314.             gdi_show_char(CurrentX, yy, text_color, CharData, NumChar, nWidth, nHgt, font_attr);
  2315.         }
  2316.         CurrentX += nWidth;
  2317.         nHgt = (U8) LineHeight;
  2318.         String += 2;
  2319.     }
  2320.     gdi_font_end();
  2321.     return CurrentX;
  2322.     /* GDI_RETURN (CurrentX); */
  2323.     /* GDI_EXIT_CRITICAL_SECTION(ShowDebugString) */
  2324. }
  2325. /*-----------------------------------------------------------------------*/
  2326. /*--------------------------- *** End *** -------------------------------*/
  2327. /*-----------------------------------------------------------------------*/