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

MTK

开发平台:

C/C++

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2005
  8. *
  9. *  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
  10. *  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
  11. *  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
  12. *  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
  13. *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
  14. *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
  15. *  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
  16. *  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
  17. *  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
  18. *  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
  19. *  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
  20. *  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
  21. *
  22. *  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
  23. *  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
  24. *  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
  25. *  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
  26. *  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
  27. *
  28. *  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
  29. *  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
  30. *  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
  31. *  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
  32. *  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
  33. *
  34. *****************************************************************************/
  35. /*****************************************************************************
  36.  *
  37.  * Filename:
  38.  * ---------
  39.  *    pixcomfontengine.c
  40.  *
  41.  * Project:
  42.  * --------
  43.  *   Maui_Software
  44.  *
  45.  * Description:
  46.  * ------------
  47.  *   font engine related function calls
  48.  *
  49.  *
  50.  * Author:
  51.  * -------
  52.  * -------
  53.  *
  54.  *============================================================================
  55.  *             HISTORY
  56.  * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  57.  *------------------------------------------------------------------------------
  58.  * removed!
  59.  *
  60.  * removed!
  61.  * removed!
  62.  * removed!
  63.  *
  64.  * removed!
  65.  * removed!
  66.  * removed!
  67.  *
  68.  * removed!
  69.  * removed!
  70.  * removed!
  71.  *
  72.  * removed!
  73.  * removed!
  74.  * removed!
  75.  *
  76.  * removed!
  77.  * removed!
  78.  * removed!
  79.  *
  80.  * removed!
  81.  * removed!
  82.  * removed!
  83.  *
  84.  * removed!
  85.  * removed!
  86.  * removed!
  87.  *
  88.  * removed!
  89.  * removed!
  90.  * removed!
  91.  *
  92.  * removed!
  93.  * removed!
  94.  * removed!
  95.  *
  96.  * removed!
  97.  * removed!
  98.  * removed!
  99.  *
  100.  * removed!
  101.  * removed!
  102.  * removed!
  103.  *
  104.  * removed!
  105.  * removed!
  106.  * removed!
  107.  *
  108.  * removed!
  109.  * removed!
  110.  * removed!
  111.  *
  112.  * removed!
  113.  * removed!
  114.  * removed!
  115.  *
  116.  * removed!
  117.  * removed!
  118.  * removed!
  119.  *
  120.  * removed!
  121.  * removed!
  122.  * removed!
  123.  *
  124.  * removed!
  125.  * removed!
  126.  * removed!
  127.  *
  128.  * removed!
  129.  * removed!
  130.  * removed!
  131.  *
  132.  * removed!
  133.  * removed!
  134.  * removed!
  135.  *
  136.  * removed!
  137.  * removed!
  138.  * removed!
  139.  *
  140.  * removed!
  141.  * removed!
  142.  * removed!
  143.  *
  144.  * removed!
  145.  * removed!
  146.  * removed!
  147.  *
  148.  * removed!
  149.  * removed!
  150.  * removed!
  151.  *
  152.  * removed!
  153.  * removed!
  154.  * removed!
  155.  *
  156.  * removed!
  157.  * removed!
  158.  * removed!
  159.  *
  160.  * removed!
  161.  * removed!
  162.  * removed!
  163.  *
  164.  * removed!
  165.  * removed!
  166.  * removed!
  167.  *
  168.  * removed!
  169.  * removed!
  170.  * removed!
  171.  *
  172.  * removed!
  173.  * removed!
  174.  * removed!
  175.  *
  176.  * removed!
  177.  * removed!
  178.  * removed!
  179.  *
  180.  * removed!
  181.  * removed!
  182.  * removed!
  183.  *
  184.  * removed!
  185.  * removed!
  186.  * removed!
  187.  *
  188.  *------------------------------------------------------------------------------
  189.  * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
  190.  *============================================================================
  191.  ****************************************************************************/
  192. /**
  193.  * Copyright Notice
  194.  * ?2002 - 2003, Pixtel Communications, Inc., 1489 43rd Ave. W.,
  195.  * Vancouver, B.C. V6M 4K8 Canada. All Rights Reserved.
  196.  *  (It is illegal to remove this copyright notice from this software or any
  197.  *  portion of it)
  198.  */
  199. /**************************************************************
  200.    FILENAME : PixcomFontengine.c
  201.    PURPOSE     : Font Engine
  202.    REMARKS     :  available font information
  203.                type 1 -> size's 9 to 15.
  204.                type's 2 to 5 -> size's 8 to 15.
  205.    AUTHOR      : Anku Jain and Arun Gupta
  206.    DATE     : May 25, 2002
  207. **************************************************************/
  208. #define FONTENGINE_IRAM_PLACEMENT   0
  209. #define BORDERED_TEXT_NO_BOUNDARY 1     /* MTK justin */
  210. #include "stdc.h"
  211. #include <stdio.h>
  212. #include <signal.h>
  213. #include "PixtelDataTypes.h"
  214. #include "FontRes.h"
  215. #include "FontDCL.h"
  216. #include "FontData.h"
  217. #include "gui_data_types.h"
  218. #include "DebugInitDef.h"
  219. #include "MMI_features.h"
  220. /* MTK Add steven 2006.03.15 */
  221. #ifdef __MMI_MAINLCD_240X320__
  222. #include "MTKPropFont20.h"
  223. #if defined(__MMI_ZI__)
  224. #if defined(__MMI_ZI_V7__)
  225. #include "ZiV7ExtraCharacter20.h"
  226. #else 
  227. #include "ZiExtraCharacter20.h"
  228. #endif 
  229. #endif /* defined(__MMI_ZI__) */ 
  230. #else /* __MMI_MAINLCD_240X320__ */ 
  231. #include "MTKPropFont.h"
  232. #if defined(__MMI_ZI__)
  233. #if defined(__MMI_ZI_V7__)
  234. #include "ZiV7ExtraCharacter14.h"
  235. #else 
  236. #include "ZiExtraCharacter.h"
  237. #endif 
  238. #endif /* defined(__MMI_ZI__) */ 
  239. #endif /* __MMI_MAINLCD_240X320__ */ 
  240. /* MTK End */
  241. #include "gui.h"
  242. #include "PixcomFontEngine.h"
  243. #ifdef __MMI_HINDI_ALG__
  244. #include "gui.h"
  245. #include "hf_rules.h"
  246. #endif /* __MMI_HINDI_ALG__ */ 
  247. #ifdef __MMI_LANG_VIETNAMESE__
  248. #include "gui_lang_viet.h"
  249. #endif 
  250. #include "ATHandlerProt.h"
  251. #include "gdi_include.h"
  252. #include "SSCStringHandle.h"
  253. #include "BIDIDEF.h"
  254. #include "BIDIProt.h"
  255. #include "UCS2Prot.h"
  256. #ifdef __MMI_ZI_V7__
  257. #include "ezicmn.h"
  258. #endif 
  259. #if defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__)
  260. #include "zi8ARshape.h"
  261. #endif /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  262. U8 gnCurrentFontAttrib = FONTATTRIB_NORMAL;
  263. U8 gbFontType = 0;
  264. U32 gThaiFontInterSpace = 0;    /* The new Thai font already has the inter space */
  265. U32 gThaiLineHeight = 17;
  266. void SetFontValues(U32 nFont, U8 arrCount);
  267. /* extern sLanguageDetails gLanguageArray[MAX_LANGUAGES]; */
  268. extern sLanguageDetails *gLanguageArray;
  269. extern void gdi_font_begin(gdi_color fg_color, U8 font_attr);
  270. extern void gdi_font_end(void);
  271. /* MTK steven for removing compile warnings */
  272. extern U8(*pfnEncodingSchemeToUnicode) (PU16 pUnicode, PU8 arrOut);
  273. extern void gdi_show_char_bordered(
  274.                 S32 x,
  275.                 S32 y,
  276.                 gdi_color text_color,
  277.                 gdi_color border_color,
  278.                 U8 *font_data,
  279.                 U32 font_data_size,
  280.                 U16 char_width,
  281.                 U16 char_height,
  282.                 U8 font_attr);
  283. extern void gdi_show_char(
  284.                 S32 x,
  285.                 S32 y,
  286.                 gdi_color color,
  287.                 U8 *font_data,
  288.                 U32 font_data_size,
  289.                 U16 char_width,
  290.                 U16 char_height,
  291.                 U8 font_attr);
  292. extern BOOL r2lMMIFlag;
  293. #ifdef __MMI_BIDI_ALG__
  294. extern U8 MMI_bidi_input_type;
  295. U16 show_pwcWord[MAX_SHOW_STRING_TEXT_LENGTH];
  296. U8 show_visual_str[MAX_SHOW_STRING_TEXT_LENGTH * BIDI_ENCODING_LENGTH];
  297. #endif /* __MMI_BIDI_ALG__ */ 
  298. #ifdef __MMI_SUPPORT_DUMP_SCREEN_STRING__
  299. extern MMI_BOOL mmi_trace_screen_string(S32 x, S32 y, U8 *str, S32 len, S32 Bordered);
  300. extern MMI_BOOL mmi_trace_screen_char(S32 x, S32 y, U16 unicode, S32 len, S32 Bordered);
  301. #endif
  302. /* For Font Cache */
  303. CharHashTable charHashTableLatin[LATIN_CHAR_HT_SIZE];
  304. CharHashTable charHashTableOthers[OTHERS_CHAR_HT_SIZE];
  305. /* MTK Add steven 2006.01.06 */
  306. #ifdef __MMI_MAINLCD_240X320__
  307. const RangeData gMTKProprietaryFont_RangeData[41]={
  308. {2,2},
  309. {108,108},
  310. {133,134},
  311. {331,331},
  312. {593,593},
  313. {596,596},
  314. {601,603},
  315. {609,609},
  316. {618,618},
  317. {643,643},
  318. {650,650},
  319. {652,652},
  320. {658,658},
  321. {711,711},
  322. {714,716},
  323. {719,719},
  324. {729,729},
  325. {7747,7747},
  326. {7751,7751},
  327. {8213,8213},
  328. {8216,8217},
  329. {8220,8221},
  330. {8230,8231},
  331. {8364,8364},
  332. {8482,8482},
  333. {12289,12290},
  334. {12298,12303},
  335. {61440,61442},
  336. {61444,61445},
  337. {61447,61447},
  338. {62464,62467},
  339. {62469,62505},
  340. {62720,62725},
  341. {65104,65104},
  342. {65106,65106},
  343. {65108,65111},
  344. {65113,65114},
  345. {65124,65124},
  346. {65281,65374},
  347. {65377,65380},
  348. {65515,65515},
  349. };
  350. const RangeDetails gMTKProprietaryFont_RangeInfo={
  351. 41,
  352. gMTKProprietaryFont_RangeData
  353. };
  354. sCustFontData gMTKProprietaryFont = 
  355. {
  356.     20, 20, 0, 50, 500,
  357. #ifdef __MMI_HINDI_ALG__
  358.     (U8 *) NULL,
  359. #endif 
  360.     (U8 *) MTKProprietaryFont20_Width, (U32 *) MTKProprietaryFont20_Offset, (U8 *) MTKProprietaryFont20_Data,
  361.         (U32 *) MTKProprietaryFont20_RangeOffset,
  362.     {
  363.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  364.       FONTATTRIB_STRIKETHROUGH,
  365.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  366.       FONTATTRIB_STRIKETHROUGH},
  367.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  368.       FONTATTRIB_STRIKETHROUGH,
  369.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  370.       FONTATTRIB_STRIKETHROUGH},
  371.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  372.       FONTATTRIB_STRIKETHROUGH,
  373.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  374.       FONTATTRIB_STRIKETHROUGH},
  375.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  376.       FONTATTRIB_STRIKETHROUGH,
  377.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  378.       FONTATTRIB_STRIKETHROUGH},
  379.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  380.       FONTATTRIB_STRIKETHROUGH,
  381.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  382.       FONTATTRIB_STRIKETHROUGH},},
  383.     &gMTKProprietaryFont_RangeInfo
  384. };
  385. #if defined(__MMI_ZI__)
  386. #if defined(__MMI_ZI_V7__)
  387. const RangeData gZiExtraCharacter_RangeData[162] = 
  388. {
  389.     {61184, 61192},
  390.     {61200, 61201},
  391.     {61203, 61203},
  392.     {61206, 61206},
  393.     {61209, 61209},
  394.     {61214, 61214},
  395.     {61217, 61228},
  396.     {61230, 61231},
  397.     {61233, 61238},
  398.     {61243, 61247},
  399.     {61249, 61254},
  400.     {61256, 61256},
  401.     {61259, 61260},
  402.     {61264, 61264},
  403.     {61268, 61270},
  404.     {61274, 61274},
  405.     {61276, 61280},
  406.     {61282, 61282},
  407.     {61287, 61287},
  408.     {61289, 61291},
  409.     {61293, 61293},
  410.     {61295, 61300},
  411.     {61302, 61319},
  412.     {61321, 61322},
  413.     {61324, 61330},
  414.     {61332, 61333},
  415.     {61335, 61337},
  416.     {61339, 61339},
  417.     {61342, 61342},
  418.     {61346, 61347},
  419.     {61349, 61352},
  420.     {61354, 61354},
  421.     {61357, 61358},
  422.     {61360, 61360},
  423.     {61364, 61365},
  424.     {61367, 61367},
  425.     {61369, 61371},
  426.     {61373, 61373},
  427.     {61375, 61376},
  428.     {61378, 61378},
  429.     {61382, 61384},
  430.     {61386, 61386},
  431.     {61389, 61389},
  432.     {61392, 61393},
  433.     {61396, 61396},
  434.     {61399, 61399},
  435.     {61401, 61403},
  436.     {61406, 61407},
  437.     {61411, 61411},
  438.     {61413, 61416},
  439.     {61418, 61418},
  440.     {61421, 61421},
  441.     {61424, 61424},
  442.     {61427, 61427},
  443.     {61431, 61431},
  444.     {61435, 61435},
  445.     {61437, 61442},
  446.     {61445, 61445},
  447.     {61447, 61448},
  448.     {61450, 61450},
  449.     {61452, 61452},
  450.     {61455, 61461},
  451.     {61464, 61464},
  452.     {61466, 61468},
  453.     {61470, 61470},
  454.     {61472, 61474},
  455.     {61477, 61477},
  456.     {61479, 61485},
  457.     {61487, 61487},
  458.     {61491, 61491},
  459.     {61493, 61493},
  460.     {61496, 61498},
  461.     {61501, 61502},
  462.     {61504, 61504},
  463.     {61508, 61509},
  464.     {61511, 61517},
  465.     {61523, 61523},
  466.     {61525, 61525},
  467.     {61530, 61530},
  468.     {61532, 61535},
  469.     {61538, 61538},
  470.     {61540, 61540},
  471.     {61542, 61542},
  472.     {61544, 61545},
  473.     {61547, 61551},
  474.     {61553, 61558},
  475.     {61561, 61561},
  476.     {61563, 61564},
  477.     {61566, 61566},
  478.     {61568, 61568},
  479.     {61570, 61571},
  480.     {61574, 61575},
  481.     {61578, 61582},
  482.     {61586, 61587},
  483.     {61589, 61591},
  484.     {61594, 61595},
  485.     {61597, 61598},
  486.     {61600, 61600},
  487.     {61605, 61606},
  488.     {61609, 61611},
  489.     {61624, 61626},
  490.     {61633, 61633},
  491.     {61635, 61635},
  492.     {61637, 61637},
  493.     {61642, 61642},
  494.     {61656, 61656},
  495.     {61663, 61663},
  496.     {61685, 61685},
  497.     {61688, 61688},
  498.     {61691, 61692},
  499.     {61695, 61695},
  500.     {61703, 61704},
  501.     {61708, 61709},
  502.     {61713, 61713},
  503.     {61715, 61715},
  504.     {61718, 61718},
  505.     {61732, 61732},
  506.     {61743, 61743},
  507.     {61750, 61750},
  508.     {61752, 61752},
  509.     {61754, 61755},
  510.     {61760, 61760},
  511.     {61762, 61762},
  512.     {61764, 61765},
  513.     {61769, 61772},
  514.     {61775, 61775},
  515.     {61787, 61787},
  516.     {61791, 61791},
  517.     {61793, 61793},
  518.     {61795, 61796},
  519.     {61801, 61801},
  520.     {61811, 61811},
  521.     {61815, 61816},
  522.     {61823, 61823},
  523.     {61825, 61825},
  524.     {61836, 61837},
  525.     {61844, 61844},
  526.     {61850, 61850},
  527.     {61872, 61872},
  528.     {61878, 61878},
  529.     {61915, 61915},
  530.     {61924, 61924},
  531.     {61926, 61927},
  532.     {61930, 61930},
  533.     {61938, 61938},
  534.     {61969, 61969},
  535.     {61979, 61979},
  536.     {61989, 61989},
  537.     {61995, 61995},
  538.     {62041, 62041},
  539.     {62043, 62043},
  540.     {62046, 62047},
  541.     {62051, 62051},
  542.     {62067, 62067},
  543.     {62080, 62080},
  544.     {62084, 62084},
  545.     {62090, 62090},
  546.     {62095, 62095},
  547.     {62098, 62098},
  548.     {62213, 62249},
  549.     {62257, 62261},
  550.     {62305, 62330},
  551. };
  552. const RangeDetails gZiExtraCharacter_RangeInfo = 
  553. {
  554.     162,
  555.     gZiExtraCharacter_RangeData
  556. };
  557. sCustFontData gZiExtraCharacter = 
  558. {
  559.     20, 20, 0, 50, 500,
  560. #ifdef __MMI_HINDI_ALG__
  561.     (U8 *) NULL,
  562. #endif 
  563.     (U8 *) ZiV7ExtraCharacter20_Width, (U32 *) ZiV7ExtraCharacter20_Offset, (U8 *) ZiV7ExtraCharacter20_Data,
  564.     (U32 *) ZiV7ExtraCharacter20_RangeOffset,
  565.     {
  566.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  567.       FONTATTRIB_STRIKETHROUGH,
  568.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  569.       FONTATTRIB_STRIKETHROUGH},
  570.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  571.       FONTATTRIB_STRIKETHROUGH,
  572.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  573.       FONTATTRIB_STRIKETHROUGH},
  574.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  575.       FONTATTRIB_STRIKETHROUGH,
  576.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  577.       FONTATTRIB_STRIKETHROUGH},
  578.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  579.       FONTATTRIB_STRIKETHROUGH,
  580.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  581.       FONTATTRIB_STRIKETHROUGH},
  582.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  583.       FONTATTRIB_STRIKETHROUGH,
  584.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  585.       FONTATTRIB_STRIKETHROUGH},},
  586.     &gZiExtraCharacter_RangeInfo
  587. };
  588. #else /* defined(__MMI_ZI_V7__) */ 
  589. const RangeData gZiExtraCharacter_RangeData[5] = 
  590. {
  591.     {61440, 61448},
  592.     {61456, 62398},
  593.     {62469, 62505},
  594.     {62513, 62517},
  595.     {62561, 62586},
  596. };
  597. const RangeDetails gZiExtraCharacter_RangeInfo = 
  598. {
  599.     5,
  600.     gZiExtraCharacter_RangeData
  601. };
  602. sCustFontData gZiExtraCharacter = 
  603. {
  604.     20, 20, 0, 50, 500,
  605. #ifdef __MMI_HINDI_ALG__
  606.     (U8 *) NULL,
  607. #endif 
  608.     (U8 *) ZiExtraCharacter20_Width, (U32 *) ZiExtraCharacter20_Offset, (U8 *) ZiExtraCharacter20_Data,
  609.         (U32 *) ZiExtraCharacter20_RangeOffset,
  610.     {
  611.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  612.       FONTATTRIB_STRIKETHROUGH,
  613.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  614.       FONTATTRIB_STRIKETHROUGH},
  615.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  616.       FONTATTRIB_STRIKETHROUGH,
  617.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  618.       FONTATTRIB_STRIKETHROUGH},
  619.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  620.       FONTATTRIB_STRIKETHROUGH,
  621.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  622.       FONTATTRIB_STRIKETHROUGH},
  623.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  624.       FONTATTRIB_STRIKETHROUGH,
  625.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  626.       FONTATTRIB_STRIKETHROUGH},
  627.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  628.       FONTATTRIB_STRIKETHROUGH,
  629.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  630.       FONTATTRIB_STRIKETHROUGH},},
  631.     &gZiExtraCharacter_RangeInfo
  632. };
  633. #endif /* defined(__MMI_ZI_V7__) */ 
  634. #endif /* defined(__MMI_ZI__) */ 
  635. #else /* __MMI_MAINLCD_240X320__ */ /* not defined __MMI_MAINLCD_240X320__ */
  636. const RangeData gMTKProprietaryFont_RangeData[42]={
  637. {2,2},
  638. {133,134},
  639. {230,230},
  640. {240,240},
  641. {331,331},
  642. {593,593},
  643. {596,596},
  644. {601,603},
  645. {609,609},
  646. {618,618},
  647. {643,643},
  648. {650,650},
  649. {652,652},
  650. {658,658},
  651. {711,711},
  652. {714,716},
  653. {719,719},
  654. {729,729},
  655. {7735,7735},
  656. {7747,7747},
  657. {7751,7751},
  658. {8213,8213},
  659. {8216,8217},
  660. {8220,8221},
  661. {8230,8231},
  662. {8364,8364},
  663. {8482,8482},
  664. {12289,12290},
  665. {12298,12303},
  666. {61440,61442},
  667. {61444,61445},
  668. {61447,61447},
  669. {62464,62467},
  670. {62720,62725},
  671. {65104,65104},
  672. {65106,65106},
  673. {65108,65111},
  674. {65113,65114},
  675. {65124,65125},
  676. {65281,65374},
  677. {65377,65380},
  678. {65515,65515},
  679. };
  680. const RangeDetails gMTKProprietaryFont_RangeInfo={
  681. 42,
  682. gMTKProprietaryFont_RangeData
  683. };
  684. sCustFontData gMTKProprietaryFont = 
  685. {
  686.     14, 14, 0, 25, 500,
  687. #ifdef __MMI_HINDI_ALG__
  688.     (U8 *) NULL,
  689. #endif 
  690.     (U8 *) MTKProprietaryFont_Width, (U32 *) MTKProprietaryFont_Offset, (U8 *) MTKProprietaryFont_Data,
  691.         (U32 *) MTKProprietaryFont_RangeOffset,
  692.     {
  693.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  694.       FONTATTRIB_STRIKETHROUGH,
  695.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  696.       FONTATTRIB_STRIKETHROUGH},
  697.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  698.       FONTATTRIB_STRIKETHROUGH,
  699.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  700.       FONTATTRIB_STRIKETHROUGH},
  701.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  702.       FONTATTRIB_STRIKETHROUGH,
  703.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  704.       FONTATTRIB_STRIKETHROUGH},
  705.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  706.       FONTATTRIB_STRIKETHROUGH,
  707.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  708.       FONTATTRIB_STRIKETHROUGH},
  709.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  710.       FONTATTRIB_STRIKETHROUGH,
  711.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  712.       FONTATTRIB_STRIKETHROUGH},},
  713.     &gMTKProprietaryFont_RangeInfo
  714. };
  715. #if defined(__MMI_ZI__)
  716. #if defined(__MMI_ZI_V7__)
  717. const RangeData gZiExtraCharacter_RangeData[162] = 
  718. {
  719.     {61184, 61192},
  720.     {61200, 61201},
  721.     {61203, 61203},
  722.     {61206, 61206},
  723.     {61209, 61209},
  724.     {61214, 61214},
  725.     {61217, 61228},
  726.     {61230, 61231},
  727.     {61233, 61238},
  728.     {61243, 61247},
  729.     {61249, 61254},
  730.     {61256, 61256},
  731.     {61259, 61260},
  732.     {61264, 61264},
  733.     {61268, 61270},
  734.     {61274, 61274},
  735.     {61276, 61280},
  736.     {61282, 61282},
  737.     {61287, 61287},
  738.     {61289, 61291},
  739.     {61293, 61293},
  740.     {61295, 61300},
  741.     {61302, 61319},
  742.     {61321, 61322},
  743.     {61324, 61330},
  744.     {61332, 61333},
  745.     {61335, 61337},
  746.     {61339, 61339},
  747.     {61342, 61342},
  748.     {61346, 61347},
  749.     {61349, 61352},
  750.     {61354, 61354},
  751.     {61357, 61358},
  752.     {61360, 61360},
  753.     {61364, 61365},
  754.     {61367, 61367},
  755.     {61369, 61371},
  756.     {61373, 61373},
  757.     {61375, 61376},
  758.     {61378, 61378},
  759.     {61382, 61384},
  760.     {61386, 61386},
  761.     {61389, 61389},
  762.     {61392, 61393},
  763.     {61396, 61396},
  764.     {61399, 61399},
  765.     {61401, 61403},
  766.     {61406, 61407},
  767.     {61411, 61411},
  768.     {61413, 61416},
  769.     {61418, 61418},
  770.     {61421, 61421},
  771.     {61424, 61424},
  772.     {61427, 61427},
  773.     {61431, 61431},
  774.     {61435, 61435},
  775.     {61437, 61442},
  776.     {61445, 61445},
  777.     {61447, 61448},
  778.     {61450, 61450},
  779.     {61452, 61452},
  780.     {61455, 61461},
  781.     {61464, 61464},
  782.     {61466, 61468},
  783.     {61470, 61470},
  784.     {61472, 61474},
  785.     {61477, 61477},
  786.     {61479, 61485},
  787.     {61487, 61487},
  788.     {61491, 61491},
  789.     {61493, 61493},
  790.     {61496, 61498},
  791.     {61501, 61502},
  792.     {61504, 61504},
  793.     {61508, 61509},
  794.     {61511, 61517},
  795.     {61523, 61523},
  796.     {61525, 61525},
  797.     {61530, 61530},
  798.     {61532, 61535},
  799.     {61538, 61538},
  800.     {61540, 61540},
  801.     {61542, 61542},
  802.     {61544, 61545},
  803.     {61547, 61551},
  804.     {61553, 61558},
  805.     {61561, 61561},
  806.     {61563, 61564},
  807.     {61566, 61566},
  808.     {61568, 61568},
  809.     {61570, 61571},
  810.     {61574, 61575},
  811.     {61578, 61582},
  812.     {61586, 61587},
  813.     {61589, 61591},
  814.     {61594, 61595},
  815.     {61597, 61598},
  816.     {61600, 61600},
  817.     {61605, 61606},
  818.     {61609, 61611},
  819.     {61624, 61626},
  820.     {61633, 61633},
  821.     {61635, 61635},
  822.     {61637, 61637},
  823.     {61642, 61642},
  824.     {61656, 61656},
  825.     {61663, 61663},
  826.     {61685, 61685},
  827.     {61688, 61688},
  828.     {61691, 61692},
  829.     {61695, 61695},
  830.     {61703, 61704},
  831.     {61708, 61709},
  832.     {61713, 61713},
  833.     {61715, 61715},
  834.     {61718, 61718},
  835.     {61732, 61732},
  836.     {61743, 61743},
  837.     {61750, 61750},
  838.     {61752, 61752},
  839.     {61754, 61755},
  840.     {61760, 61760},
  841.     {61762, 61762},
  842.     {61764, 61765},
  843.     {61769, 61772},
  844.     {61775, 61775},
  845.     {61787, 61787},
  846.     {61791, 61791},
  847.     {61793, 61793},
  848.     {61795, 61796},
  849.     {61801, 61801},
  850.     {61811, 61811},
  851.     {61815, 61816},
  852.     {61823, 61823},
  853.     {61825, 61825},
  854.     {61836, 61837},
  855.     {61844, 61844},
  856.     {61850, 61850},
  857.     {61872, 61872},
  858.     {61878, 61878},
  859.     {61915, 61915},
  860.     {61924, 61924},
  861.     {61926, 61927},
  862.     {61930, 61930},
  863.     {61938, 61938},
  864.     {61969, 61969},
  865.     {61979, 61979},
  866.     {61989, 61989},
  867.     {61995, 61995},
  868.     {62041, 62041},
  869.     {62043, 62043},
  870.     {62046, 62047},
  871.     {62051, 62051},
  872.     {62067, 62067},
  873.     {62080, 62080},
  874.     {62084, 62084},
  875.     {62090, 62090},
  876.     {62095, 62095},
  877.     {62098, 62098},
  878.     {62213, 62249},
  879.     {62257, 62261},
  880.     {62305, 62330},
  881. };
  882. const RangeDetails gZiExtraCharacter_RangeInfo = 
  883. {
  884.     162,
  885.     gZiExtraCharacter_RangeData
  886. };
  887. sCustFontData gZiExtraCharacter = 
  888. {
  889.     14, 14, 0, 25, 500,
  890. #ifdef __MMI_HINDI_ALG__
  891.     (U8 *) NULL,
  892. #endif 
  893.     (U8 *) ZiV7ExtraCharacter14_Width, (U32 *) ZiV7ExtraCharacter14_Offset, (U8 *) ZiV7ExtraCharacter14_Data,
  894.     (U32 *) ZiV7ExtraCharacter14_RangeOffset,
  895.     {
  896.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  897.       FONTATTRIB_STRIKETHROUGH,
  898.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  899.       FONTATTRIB_STRIKETHROUGH},
  900.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  901.       FONTATTRIB_STRIKETHROUGH,
  902.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  903.       FONTATTRIB_STRIKETHROUGH},
  904.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  905.       FONTATTRIB_STRIKETHROUGH,
  906.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  907.       FONTATTRIB_STRIKETHROUGH},
  908.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  909.       FONTATTRIB_STRIKETHROUGH,
  910.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  911.       FONTATTRIB_STRIKETHROUGH},
  912.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  913.       FONTATTRIB_STRIKETHROUGH,
  914.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  915.       FONTATTRIB_STRIKETHROUGH},},
  916.     &gZiExtraCharacter_RangeInfo
  917. };
  918. #else /* defined(__MMI_ZI_V7__) */ 
  919. const RangeData gZiExtraCharacter_RangeData[5] = 
  920. {
  921.     {322, 322},
  922.     {341, 341},
  923.     {352, 352},
  924.     {61440, 61448},
  925.     {61456, 62398},
  926. };
  927. const RangeDetails gZiExtraCharacter_RangeInfo = 
  928. {
  929.     5,
  930.     gZiExtraCharacter_RangeData
  931. };
  932. sCustFontData gZiExtraCharacter = 
  933. {
  934.     14, 14, 0, 25, 500,
  935. #ifdef __MMI_HINDI_ALG__
  936.     (U8 *) NULL,
  937. #endif 
  938.     (U8 *) ZiExtraCharacter_Width, (U32 *) ZiExtraCharacter_Offset, (U8 *) ZiExtraCharacter_Data,
  939.         (U32 *) ZiExtraCharacter_RangeOffset,
  940.     {
  941.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  942.       FONTATTRIB_STRIKETHROUGH,
  943.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  944.       FONTATTRIB_STRIKETHROUGH},
  945.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  946.       FONTATTRIB_STRIKETHROUGH,
  947.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  948.       FONTATTRIB_STRIKETHROUGH},
  949.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  950.       FONTATTRIB_STRIKETHROUGH,
  951.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  952.       FONTATTRIB_STRIKETHROUGH},
  953.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  954.       FONTATTRIB_STRIKETHROUGH,
  955.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  956.       FONTATTRIB_STRIKETHROUGH},
  957.      {FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  958.       FONTATTRIB_STRIKETHROUGH,
  959.       FONTATTRIB_NORMAL | FONTATTRIB_BOLD | FONTATTRIB_ITALIC | FONTATTRIB_OBLIQUE | FONTATTRIB_UNDERLINE |
  960.       FONTATTRIB_STRIKETHROUGH},},
  961.     &gZiExtraCharacter_RangeInfo
  962. };
  963. #endif /* defined(__MMI_ZI_V7__) */ 
  964. #endif /* defined(__MMI_ZI__) */ 
  965. #endif /* __MMI_MAINLCD_240X320__ */ 
  966. /* MTK End */
  967. U32 gnCurrentFont;
  968. sCustFontData *gpCurrentFont = NULL;
  969. extern U16 gMaxDeployedLangs;
  970. extern U16 gCurrLangIndex;
  971. #ifdef __UCS2_ENCODING
  972. U8 UCS2EncodingToUnicode(PU16 pUnicode, PU8 arr);
  973. #endif 
  974. /**************************************************************/
  975. extern void text_drawpixel2(S32 x, S32 y);
  976. extern color UI_current_text_color;
  977. extern color UI_text_border_color;
  978. /* extern color UI_text_color; */
  979. extern void (*_ui_text_putpixel) (S32 x, S32 y, color c);
  980. extern void (*_ui_text_putpixel_unconditional) (S32 x, S32 y, color c);
  981. extern void UI_set_current_text_color(color c);
  982. /*****************************************************************************
  983.  * FUNCTION
  984.  *  Get_Current_Lang_CountryCode
  985.  * DESCRIPTION
  986.  *  To get current language's country code
  987.  *  
  988.  *  This is used to get current language's country code
  989.  * PARAMETERS
  990.  *  void
  991.  * RETURNS
  992.  *  U8 *
  993.  *****************************************************************************/
  994. U8 *Get_Current_Lang_CountryCode(void)
  995. {
  996.     /*----------------------------------------------------------------*/
  997.     /* Local Variables                                                */
  998.     /*----------------------------------------------------------------*/
  999.     /*----------------------------------------------------------------*/
  1000.     /* Code Body                                                      */
  1001.     /*----------------------------------------------------------------*/
  1002.     return (U8*) gLanguageArray[gCurrLangIndex].aLangCountryCode;
  1003. }
  1004. /*****************************************************************************
  1005.  * FUNCTION
  1006.  *  SetFont
  1007.  * DESCRIPTION
  1008.  *  To set the fonts.
  1009.  *  
  1010.  *  This is used to set all different type of font with different sizes.
  1011.  * PARAMETERS
  1012.  *  Font            [IN]        
  1013.  *  arrCount        [IN]        
  1014.  * RETURNS
  1015.  *  U8
  1016.  *****************************************************************************/
  1017. U8 SetFont(stFontAttribute Font, U8 arrCount)
  1018. {
  1019.     /*----------------------------------------------------------------*/
  1020.     /* Local Variables                                                */
  1021.     /*----------------------------------------------------------------*/
  1022.     /*----------------------------------------------------------------*/
  1023.     /* Code Body                                                      */
  1024.     /*----------------------------------------------------------------*/
  1025.     gnCurrentFont = Font.size;
  1026.     gbFontType = Font.smallCaps;
  1027.     gnCurrentFontAttrib = 0;
  1028.     if (gbFontType != 0)
  1029.     {
  1030.         gbFontType = 0;
  1031.     }
  1032.     if (Font.bold)
  1033.     {
  1034.         gnCurrentFontAttrib |= FONTATTRIB_BOLD;
  1035.     }
  1036.     if (Font.italic)
  1037.     {
  1038.         gnCurrentFontAttrib |= FONTATTRIB_ITALIC;
  1039.     }
  1040.     if (Font.oblique)
  1041.     {
  1042.         gnCurrentFontAttrib |= FONTATTRIB_OBLIQUE;
  1043.     }
  1044.     if (Font.underline)
  1045.     {
  1046.         gnCurrentFontAttrib |= FONTATTRIB_UNDERLINE;
  1047.     }
  1048.     if (!gnCurrentFontAttrib)
  1049.     {
  1050.         gnCurrentFontAttrib |= FONTATTRIB_NORMAL;
  1051.     }
  1052.     SetFontValues(gnCurrentFont, arrCount);
  1053.     return 0;
  1054. }
  1055. /*****************************************************************************
  1056.  * FUNCTION
  1057.  *  SetFontValues
  1058.  * DESCRIPTION
  1059.  *  
  1060.  * PARAMETERS
  1061.  *  nFont           [IN]        
  1062.  *  arrCount        [IN]        
  1063.  * RETURNS
  1064.  *  void
  1065.  *****************************************************************************/
  1066. void SetFontValues(U32 nFont, U8 arrCount)
  1067. {
  1068.     /*----------------------------------------------------------------*/
  1069.     /* Local Variables                                                */
  1070.     /*----------------------------------------------------------------*/
  1071.     /*----------------------------------------------------------------*/
  1072.     /* Code Body                                                      */
  1073.     /*----------------------------------------------------------------*/
  1074.     if ((gLanguageArray[arrCount].fontfamilyList[gLanguageArray[arrCount].nCurrentFamily]->nTotalFonts) > nFont)
  1075.     {
  1076.         gpCurrentFont =
  1077.             gLanguageArray[arrCount].fontfamilyList[gLanguageArray[arrCount].nCurrentFamily]->fontData[nFont];
  1078.     }
  1079.     else
  1080.     {
  1081.         gpCurrentFont = gLanguageArray[arrCount].fontfamilyList[gLanguageArray[arrCount].nCurrentFamily]->fontData[0];
  1082.     }
  1083. }
  1084. #if(FONTENGINE_IRAM_PLACEMENT)
  1085. #ifdef __MTK_TARGET__
  1086. #pragma arm section code
  1087. #endif 
  1088. #endif /* (FONTENGINE_IRAM_PLACEMENT) */ 
  1089. #if defined(__MMI_ZI__)
  1090. /*****************************************************************************
  1091.  * FUNCTION
  1092.  *  SearchInZiExtraFont
  1093.  * DESCRIPTION
  1094.  *  To search a character in the Zi Extra font
  1095.  *  
  1096.  *  This function applies binary search assuming that the RangeList
  1097.  *  array is sorted ina scending order and no ranges overlap.
  1098.  * PARAMETERS
  1099.  *  nCh         [IN]        
  1100.  *  pnBase      [OUT]       Returns the base
  1101.  * RETURNS
  1102.  *  S32 - The offset of the character in the Range table
  1103.  *****************************************************************************/
  1104. S32 SearchInZiExtraFont(U32 nCh, U32 *pnBase)
  1105. {
  1106.     /*----------------------------------------------------------------*/
  1107.     /* Local Variables                                                */
  1108.     /*----------------------------------------------------------------*/
  1109.     S16 nFirst = 0;
  1110.     S16 nLast = gZiExtraCharacter.pRangeDetails->nNoOfRanges - 1;
  1111.     S16 nMid;
  1112.     /*----------------------------------------------------------------*/
  1113.     /* Code Body                                                      */
  1114.     /*----------------------------------------------------------------*/
  1115.     while (nLast >= nFirst)
  1116.     {
  1117.         nMid = (nFirst + nLast) / 2;;
  1118.         if ((nCh >= gZiExtraCharacter_RangeData[nMid].nMin) && (nCh <= gZiExtraCharacter_RangeData[nMid].nMax))
  1119.         {
  1120.             *pnBase = gZiExtraCharacter_RangeData[nMid].nMin;
  1121.             return gZiExtraCharacter.pRange[nMid];
  1122.         }
  1123.         if (nCh > gZiExtraCharacter_RangeData[nMid].nMin)
  1124.         {
  1125.             nFirst = nMid + 1;
  1126.         }
  1127.         else
  1128.         {
  1129.             nLast = nMid - 1;
  1130.         }
  1131.     }
  1132.     return -1;
  1133. }
  1134. #endif /* defined(__MMI_ZI__) */ 
  1135. /**************************************************************
  1136.    FUNCTION NAME     : GetFontdata()
  1137.    PURPOSE           : To get the font information.
  1138.    INPUT PARAMETERS  : U32 Ch, stFontAttribute Font, U8 *CharData
  1139.    OUTPUT PARAMETERS : nil
  1140.    RETURNS           : UNIT32
  1141.    REMARKS           : This is used to get the font information
  1142. **************************************************************/
  1143. #ifdef __MMI_HINDI_ALG__
  1144. static U32 GetFontdata(U32 Ch, stFontAttribute Font, U8 **ppCharData, U16 *pnWidth, U16 *pnDWidth, U16 *pnHeight)
  1145. #else 
  1146. static U32 GetFontdata(U32 Ch, stFontAttribute Font, U8 **ppCharData, U16 *pnWidth, U16 *pnHeight)
  1147. #endif 
  1148. {
  1149.     U8 count;
  1150.     S32 NumChar = 0;
  1151.     S32 index = -1;
  1152.     S32 nFontIndex = -1;
  1153.     U32 nIndexInList;
  1154.     U32 nBase;
  1155.     U32 nHashKey = 0;
  1156.     CharHashTable *charHashTable;
  1157. #ifdef __MMI_HINDI_ALG__
  1158.     sCustFontData *CurrentFont = gpCurrentFont;
  1159.     *pnDWidth = 0;
  1160. #endif /* __MMI_HINDI_ALG__ */ 
  1161.     if (Ch & 0xFF00)
  1162.     {
  1163.         charHashTable = charHashTableOthers;
  1164.         nHashKey = Ch & OTHERS_CHAR_HT_MASK;
  1165.     }
  1166.     else
  1167.     {
  1168.         charHashTable = charHashTableLatin;
  1169.         nHashKey = Ch & LATIN_CHAR_HT_MASK;
  1170.     }
  1171.     if (charHashTable[nHashKey].unicode == Ch && charHashTable[nHashKey].gnCurrentFont == gnCurrentFont)
  1172.     {
  1173.         *ppCharData = charHashTable[nHashKey].CharData;
  1174.         *pnWidth = charHashTable[nHashKey].Width;
  1175.         *pnHeight = charHashTable[nHashKey].Height;
  1176.     #ifdef __MMI_HINDI_ALG__
  1177.         *pnDWidth = charHashTable[nHashKey].DWidth;
  1178.     #endif 
  1179.         return charHashTable[nHashKey].NumChar;
  1180.     }
  1181.     charHashTable[nHashKey].unicode = Ch;
  1182.     GetLangIndex(&count, &nFontIndex, &index, Ch, &nBase);
  1183.     charHashTable[nHashKey].count = count;
  1184.     charHashTable[nHashKey].gnCurrentFont = gnCurrentFont;
  1185.     charHashTable[nHashKey].index = index;
  1186.     if (index > -1)
  1187.     {
  1188.         /* Comments : No error handling is being  done if some characters come that is not
  1189.            currently supported then nothing can be displayed */
  1190.         SetFontValues(gnCurrentFont, count);
  1191.         charHashTable[nHashKey].Width = *pnWidth = gpCurrentFont->nWidth;
  1192.         charHashTable[nHashKey].Height = *pnHeight = gpCurrentFont->nHeight;
  1193.         if (gpCurrentFont->nEquiDistant)
  1194.         {
  1195.             charHashTable[nHashKey].NumChar = NumChar = gpCurrentFont->nCharBytes;
  1196.             nIndexInList = index + (NumChar * (Ch - nBase));
  1197.             charHashTable[nHashKey].CharData = *ppCharData = (gpCurrentFont->pDataArray + nIndexInList);
  1198.         }
  1199.         else
  1200.         {
  1201.             nIndexInList = index + (Ch - nBase);
  1202.             charHashTable[nHashKey].Width = *pnWidth = gpCurrentFont->pWidthArray[nIndexInList];
  1203.             charHashTable[nHashKey].NumChar = NumChar =
  1204.                 (gpCurrentFont->pOffsetArray[nIndexInList + 1] - gpCurrentFont->pOffsetArray[nIndexInList]);
  1205.             charHashTable[nHashKey].CharData = *ppCharData =
  1206.                 (gpCurrentFont->pDataArray + gpCurrentFont->pOffsetArray[nIndexInList]);
  1207.         }
  1208.     #ifdef __MMI_HINDI_ALG__
  1209.         if (gpCurrentFont->pDWidthArray)
  1210.             charHashTable[nHashKey].DWidth = *pnDWidth = gpCurrentFont->pDWidthArray[nIndexInList];
  1211.         gpCurrentFont = CurrentFont;
  1212.     #endif /* __MMI_HINDI_ALG__ */ 
  1213.         return NumChar;
  1214.     }
  1215.     else
  1216.     {
  1217.         /* MTK Add Steven 2005.06.03 */
  1218.     #if defined(__MMI_ZI__)
  1219.         index = SearchInZiExtraFont(Ch, &nBase);
  1220.     #else 
  1221.         index = SearchInPropFont(Ch, &nBase);
  1222.     #endif 
  1223.         if (index == -1)
  1224.         {
  1225.         #if defined(__MMI_ZI__)
  1226.             index = SearchInPropFont(Ch, &nBase);
  1227.             if (index == -1)
  1228.             {
  1229.         #endif /* defined(__MMI_ZI__) */ 
  1230.                 Ch = 65515; /* 0x4E01;//0x000F; */
  1231.                 index = SearchInPropFont(Ch, &nBase);
  1232.                 if (index == -1)
  1233.                 {
  1234.                 #ifdef __MMI_HINDI_ALG__
  1235.                     gpCurrentFont = CurrentFont;
  1236.                 #endif 
  1237.                     return NumChar;
  1238.                 }
  1239.             #if defined(__MMI_ZI__)
  1240.             }
  1241.             charHashTable[nHashKey].Height = *pnHeight = gMTKProprietaryFont.nHeight;
  1242.             nIndexInList = index + (Ch - nBase);
  1243.             charHashTable[nHashKey].Width = *pnWidth = gMTKProprietaryFont.pWidthArray[nIndexInList];
  1244.             charHashTable[nHashKey].NumChar = NumChar =
  1245.                 (gMTKProprietaryFont.pOffsetArray[nIndexInList + 1] - gMTKProprietaryFont.pOffsetArray[nIndexInList]);
  1246.             charHashTable[nHashKey].CharData = *ppCharData =
  1247.                 (gMTKProprietaryFont.pDataArray + gMTKProprietaryFont.pOffsetArray[nIndexInList]);
  1248.             goto label_out;
  1249.             #endif /* defined(__MMI_ZI__) */ 
  1250.         }
  1251.     #if defined(__MMI_ZI__)
  1252.         charHashTable[nHashKey].Height = *pnHeight = gZiExtraCharacter.nHeight;
  1253.         nIndexInList = index + (Ch - nBase);
  1254.         charHashTable[nHashKey].Width = *pnWidth = gZiExtraCharacter.pWidthArray[nIndexInList];
  1255.         charHashTable[nHashKey].NumChar = NumChar =
  1256.             (gZiExtraCharacter.pOffsetArray[nIndexInList + 1] - gZiExtraCharacter.pOffsetArray[nIndexInList]);
  1257.         charHashTable[nHashKey].CharData = *ppCharData =
  1258.             (gZiExtraCharacter.pDataArray + gZiExtraCharacter.pOffsetArray[nIndexInList]);
  1259.       label_out:;
  1260.     #else /* defined(__MMI_ZI__) */ 
  1261.         charHashTable[nHashKey].Height = *pnHeight = gMTKProprietaryFont.nHeight;
  1262.         nIndexInList = index + (Ch - nBase);
  1263.         charHashTable[nHashKey].Width = *pnWidth = gMTKProprietaryFont.pWidthArray[nIndexInList];
  1264.         charHashTable[nHashKey].NumChar = NumChar =
  1265.             (gMTKProprietaryFont.pOffsetArray[nIndexInList + 1] - gMTKProprietaryFont.pOffsetArray[nIndexInList]);
  1266.         charHashTable[nHashKey].CharData = *ppCharData =
  1267.             (gMTKProprietaryFont.pDataArray + gMTKProprietaryFont.pOffsetArray[nIndexInList]);
  1268.     #endif /* defined(__MMI_ZI__) */ 
  1269.         /* MTK End */
  1270.     }
  1271. #ifdef __MMI_HINDI_ALG__
  1272.     gpCurrentFont = CurrentFont;
  1273. #endif 
  1274.     return NumChar;
  1275. }
  1276. /**************************************************************
  1277.    FUNCTION NAME     : GetLangIndex()
  1278.    PURPOSE           : To get the language index of the character.
  1279.    INPUT PARAMETERS  : U32 nCh - Character to look for
  1280.    OUTPUT PARAMETERS : U8* pCount - The langugae Index
  1281.                     S32* pnIndex - The offset of the character in the array
  1282.                     U32* pnBase -  Base of Character set
  1283.    RETURNS           : void
  1284.    REMARKS           : Gets the character information
  1285. **************************************************************/
  1286. void GetLangIndex(U8 * pCount, S32 * pnFontIndex, S32 * pnIndex, U32 nCh, U32 * pnBase)
  1287. {
  1288.     /* first check the index in the current language. 90% of the cases strings will be from current language */
  1289.     U16 nFontCount;
  1290.     sFontFamily *pFontFamily;
  1291.     U16 nFontAttrib = gnCurrentFontAttrib;
  1292.     *pCount = 0;
  1293.     while (*pCount < gMaxDeployedLangs)
  1294.     {
  1295.     /*----------------------------------------------------------------*/
  1296.     /* Local Variables                                                */
  1297.     /*----------------------------------------------------------------*/
  1298.     /*----------------------------------------------------------------*/
  1299.     /* Code Body                                                      */
  1300.     /*----------------------------------------------------------------*/
  1301.         pFontFamily = gLanguageArray[*pCount].fontfamilyList[gLanguageArray[*pCount].nCurrentFamily];
  1302.         nFontCount = 0;
  1303.         if (gnCurrentFontAttrib & FONTATTRIB_BOLD && (U32) (pFontFamily->fontData[nFontCount]->pFontType[gnCurrentFont][gbFontType] & FONTATTRIB_BOLD)) /* this will test for bold font.. which ever font is bold will betaken */
  1304.             /* bold is super set. If font is displayed for bold and italic then the bold font will be made as italic */
  1305.         {
  1306.             nFontAttrib = FONTATTRIB_BOLD;
  1307.         }
  1308.         else
  1309.         {
  1310.             nFontAttrib &= ~FONTATTRIB_BOLD;
  1311.             if (!nFontAttrib)
  1312.             {
  1313.                 nFontAttrib |= FONTATTRIB_NORMAL;
  1314.             }
  1315.         }
  1316.         while (nFontCount < pFontFamily->nTotalFonts)
  1317.         {
  1318.             if ((U32) (pFontFamily->fontData[nFontCount]->pFontType[gnCurrentFont][gbFontType] & nFontAttrib))
  1319.             {
  1320.                 if (nCh >= pFontFamily->fontData[nFontCount]->pRangeDetails->pRangeData[0].nMin &&
  1321.                     nCh <=
  1322.                     pFontFamily->fontData[nFontCount]->pRangeDetails->pRangeData[pFontFamily->fontData[nFontCount]->
  1323.                                                                                  pRangeDetails->nNoOfRanges - 1].nMax)
  1324.                 {
  1325.                     *pnIndex = SearchIndexinList(*pCount, nFontCount, nCh, pnBase);
  1326.                     if (*pnIndex == -1)
  1327.                     {
  1328.                         ++nFontCount;
  1329.                     }
  1330.                     else
  1331.                     {
  1332.                         gpCurrentFont = pFontFamily->fontData[nFontCount];
  1333.                         *pnFontIndex = nFontCount;
  1334.                         return;
  1335.                     }
  1336.                 }   /* if(nCh>=pFontFamily->fontData[nFontCount].pRangeData[0].nMin && */
  1337.                 else
  1338.                 {
  1339.                     ++nFontCount;
  1340.                 }
  1341.             }
  1342.             else
  1343.             {
  1344.                 ++nFontCount;
  1345.             }
  1346.         }   /* while(nFontCount < pFontFamily->nTotalFonts) */
  1347.         ++(*pCount);
  1348.     }   /* while(*pCount < gMaxDeployedLangs) */
  1349.     if (*pnIndex == -1)
  1350.     {
  1351.     /*----------------------------------------------------------------*/
  1352.     /* Local Variables                                                */
  1353.     /*----------------------------------------------------------------*/
  1354.     /*----------------------------------------------------------------*/
  1355.     /* Code Body                                                      */
  1356.     /*----------------------------------------------------------------*/
  1357.     }
  1358.     return;
  1359. }
  1360. /*****************************************************************************
  1361.  * FUNCTION
  1362.  *  SearchIndexinList
  1363.  * DESCRIPTION
  1364.  *  To search index and base of the character in a language.
  1365.  *  
  1366.  *  This function applies binary search assuming that the RangeList
  1367.  *  array is sorted ina scending order and no ranges overlap.
  1368.  * PARAMETERS
  1369.  *  nListIndex      [IN]        
  1370.  *  nFontCount      [IN]        
  1371.  *  nCh             [IN]        
  1372.  *  pnBase          [OUT]       Returns the base
  1373.  * RETURNS
  1374.  *  S32 - The offset of the character in the Range table
  1375.  *****************************************************************************/
  1376. S32 SearchIndexinList(U8 nListIndex, U16 nFontCount, U32 nCh, U32 *pnBase)
  1377. {
  1378.     /*----------------------------------------------------------------*/
  1379.     /* Local Variables                                                */
  1380.     /*----------------------------------------------------------------*/
  1381.     S16 nFirst = 0;
  1382.     S16 nLast =
  1383.         gLanguageArray[nListIndex].fontfamilyList[gLanguageArray[nListIndex].nCurrentFamily]->fontData[nFontCount]->
  1384.         pRangeDetails->nNoOfRanges - 1;
  1385.     const RangeData *pRangeData =
  1386.         gLanguageArray[nListIndex].fontfamilyList[gLanguageArray[nListIndex].nCurrentFamily]->fontData[nFontCount]->
  1387.         pRangeDetails->pRangeData;
  1388.     U32 *pRange =
  1389.         gLanguageArray[nListIndex].fontfamilyList[gLanguageArray[nListIndex].nCurrentFamily]->fontData[nFontCount]->
  1390.         pRange;
  1391.     S16 nMid;
  1392.     /*----------------------------------------------------------------*/
  1393.     /* Code Body                                                      */
  1394.     /*----------------------------------------------------------------*/
  1395.     while (nLast >= nFirst)
  1396.     {
  1397.         nMid = (nFirst + nLast) / 2;;
  1398.         if ((nCh >= pRangeData[nMid].nMin) && (nCh <= pRangeData[nMid].nMax))
  1399.         {
  1400.             *pnBase = pRangeData[nMid].nMin;
  1401.             return pRange[nMid];
  1402.         }
  1403.         if (nCh > pRangeData[nMid].nMin)
  1404.         {
  1405.             nFirst = nMid + 1;
  1406.         }
  1407.         else
  1408.         {
  1409.             nLast = nMid - 1;
  1410.         }
  1411.     }
  1412.     return -1;
  1413. }
  1414. /*****************************************************************************
  1415.  * FUNCTION
  1416.  *  SearchInPropFont
  1417.  * DESCRIPTION
  1418.  *  To search a character in the properitory font
  1419.  *  
  1420.  *  This function applies binary search assuming that the RangeList
  1421.  *  array is sorted ina scending order and no ranges overlap.
  1422.  * PARAMETERS
  1423.  *  nCh         [IN]        
  1424.  *  pnBase      [OUT]       Returns the base
  1425.  * RETURNS
  1426.  *  S32 - The offset of the character in the Range table
  1427.  *****************************************************************************/
  1428. S32 SearchInPropFont(U32 nCh, U32 *pnBase)
  1429. {
  1430.     /*----------------------------------------------------------------*/
  1431.     /* Local Variables                                                */
  1432.     /*----------------------------------------------------------------*/
  1433.     S16 nFirst = 0;
  1434.     S16 nLast = gMTKProprietaryFont.pRangeDetails->nNoOfRanges - 1;
  1435.     S16 nMid;
  1436.     /*----------------------------------------------------------------*/
  1437.     /* Code Body                                                      */
  1438.     /*----------------------------------------------------------------*/
  1439.     while (nLast >= nFirst)
  1440.     {
  1441.         nMid = (nFirst + nLast) / 2;;
  1442.         if ((nCh >= gMTKProprietaryFont_RangeData[nMid].nMin) && (nCh <= gMTKProprietaryFont_RangeData[nMid].nMax))
  1443.         {
  1444.             *pnBase = gMTKProprietaryFont_RangeData[nMid].nMin;
  1445.             return gMTKProprietaryFont.pRange[nMid];
  1446.         }
  1447.         if (nCh > gMTKProprietaryFont_RangeData[nMid].nMin)
  1448.         {
  1449.             nFirst = nMid + 1;
  1450.         }
  1451.         else
  1452.         {
  1453.             nLast = nMid - 1;
  1454.         }
  1455.     }
  1456.     return -1;
  1457. }
  1458. /*****************************************************************************
  1459.  * FUNCTION
  1460.  *  ShowString
  1461.  * DESCRIPTION
  1462.  *  To display a string in the screen
  1463.  *  
  1464.  *  This is used to display the string in the screen
  1465.  * PARAMETERS
  1466.  *  x                   [IN]        
  1467.  *  y                   [IN]        
  1468.  *  Font                [IN]        
  1469.  *  BackGround          [IN]        
  1470.  *  String              [?]         
  1471.  *  LineHeight          [IN]        
  1472.  *  NumChar(?)          [IN]        
  1473.  *  CharData(?)         [IN]        
  1474.  *  Background(?)       [IN]        
  1475.  * RETURNS
  1476.  *  UNIT32
  1477.  *****************************************************************************/
  1478. /* START FARHAD PMT 20050211 */
  1479. BOOL cancelWidth = 0;
  1480. #ifndef __MMI_LANG_THAI__       /* Remove compile warnings */
  1481. /* START TARUN PMT 20050128 */
  1482. extern color UI_text_color;
  1483. #ifdef __MMI_HINDI_ALG__
  1484. /* END FARHAD PMT 20050211 */
  1485. static U32 ShowString_internal(S32 x, S32 y, stFontAttribute Font, U8 BackGround, U8 *String, S32 len, U32 LineHeight,
  1486.                                U32 Bordered)
  1487. #else /* __MMI_HINDI_ALG__ */ 
  1488. static U32 ShowString_internal(S32 x, S32 y, stFontAttribute Font, U8 *String, S32 len, U32 LineHeight, U32 Bordered)
  1489. #endif /* __MMI_HINDI_ALG__ */ 
  1490. {
  1491.     //W05.38 Remove GDI_ENTER_CRITICAL_SECTION outside GDI
  1492.     //GDI_ENTER_CRITICAL_SECTION(ShowString_internal)
  1493.     U8 *CharData;
  1494.     U32 NumChar;
  1495.     U32 Counter = 0;
  1496.     S32 CurrentX;
  1497.     U16 nHgt;
  1498.     U16 nWidth;
  1499. #ifdef __MMI_HINDI_ALG__
  1500.     U16 nDWidth;
  1501. #endif 
  1502.     S32 nXOffset;
  1503.     S32 nYOffset;
  1504.     S32 yy;
  1505.     U16 unicode = 0;
  1506. #if defined(__MMI_LANG_VIETNAMESE__)
  1507.     U16 next_unicode = 0;
  1508.     viet_tone_mark tone_mark = VIET_TONE_NONE;
  1509.     viet_vowel_letter viet_vowel = VIET_VOWEL_NONE;
  1510. #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1511.     /* START TARUN PMT 20050128 */
  1512. #ifdef __MMI_HINDI_ALG__
  1513.     static S32 single_time_bidi = 0;    /* added farhad 20012004 */
  1514.     /* START FARHAD PMT 20050211 */
  1515.     static S32 hindi_rule_string = 1;
  1516.     /* END FARHAD PMT 20050211 */
  1517. #endif /* __MMI_HINDI_ALG__ */ 
  1518.     /* END TARUN PMT 20050128 */
  1519.     U8 font_attr = 0;
  1520.     gdi_color border_color = 0, text_color;
  1521.     S32 clip_x1, clip_y1, clip_x2, clip_y2;
  1522. #ifdef __MMI_BIDI_ALG__
  1523.     PMT_BIDI_TYPES default_direction = BIDI_L;
  1524.     U16 logical_cur_pos;
  1525.     U8 *temp_text_P;
  1526.     U16 visual_str_len;
  1527.     U16 visual_cur_pos;
  1528.     S32 nLen;
  1529.     U16 visual_hilight_start;
  1530.     U16 visual_hilight_end;
  1531. #endif /* __MMI_BIDI_ALG__ */ 
  1532.     gdi_layer_get_clip(&clip_x1, &clip_y1, &clip_x2, &clip_y2);
  1533.     if (len == 0)
  1534.         return 1;
  1535. #ifdef __MMI_SUPPORT_DUMP_SCREEN_STRING__
  1536. mmi_trace_screen_string(x, y, String, len, Bordered);
  1537. #endif
  1538.     /* START TARUN PMT 20050128 */
  1539. #ifdef __MMI_HINDI_ALG__
  1540.     if (!single_time_bidi && !cancelWidth)  /* added farhad 20012004 */
  1541. #endif 
  1542.     {                                       /* added farhad 20012005 */
  1543.         /* END TARUN PMT 20050128 */
  1544.     #ifdef __MMI_BIDI_ALG__
  1545.         nLen = UCS2Strlen((const char *)String);
  1546.         if(nLen > MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH) 
  1547.             len = MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH;
  1548. //        MMI_ASSERT(!(nLen > MAX_SHOW_STRING_TEXT_LENGTH - ENCODING_LENGTH));
  1549.         if (len > 0)
  1550.             UCS2Strncpy((S8 *) show_pwcWord, (S8 *) String, len);
  1551.         else
  1552.             UCS2Strcpy((S8 *) show_pwcWord, (S8 *) String);
  1553.         nLen = UCS2Strlen((const char *)show_pwcWord);
  1554.         /* PMT NO_AR_SL_DU START 20050909 */
  1555.     #if defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__)
  1556.     #if defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__)
  1557.         if (nLen)
  1558.         {
  1559.         #ifdef __MMI_ZI_V7__
  1560.         #if defined(__MMI_ZI_PERSIAN__) && defined(__MMI_ZI_ARABIC__)
  1561.             ZiStringShape(ZI8_LANG_FA, (U16 *) & nLen, show_pwcWord);
  1562.         #elif defined (__MMI_ZI_PERSIAN__)
  1563.             ZiStringShape(ZI8_LANG_FA, (U16 *) & nLen, show_pwcWord);
  1564.         #elif defined (__MMI_ZI_ARABIC__)
  1565.             ZiStringShape(ZI8_LANG_AR, (U16 *) & nLen, show_pwcWord);
  1566.         #endif 
  1567.         #else /* __MMI_ZI_V7__ */ 
  1568.             ArabicStringShape((U16 *) & nLen, show_pwcWord);
  1569.         #endif /* __MMI_ZI_V7__ */ 
  1570.         }
  1571.     #else /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  1572.         if (nLen)
  1573.         {
  1574.             ArabicShapeEngine((U16 *) & nLen, show_pwcWord);    /* output will replace the input string after returning */
  1575.         }
  1576.     #endif /* defined(__MMI_ZI_ARABIC__) || defined(__MMI_ZI_PERSIAN__) */ 
  1577.     #endif /* defined(__MMI_LANG_ARABIC__) || defined(__MMI_LANG_PERSIAN__) */ 
  1578.         /* PMT NO_AR_SL_DU END 20050909 */
  1579.         String = (U8 *) show_pwcWord;
  1580.         bidi_get_char_type((U8 *) String, (U8 *) & default_direction);
  1581.         logical_cur_pos = 0;
  1582.         if (default_direction == BIDI_R || default_direction == AL)
  1583.         {
  1584.             bidi_main((U8 *) String, (U16) UCS2Strlen((const S8 *)String), logical_cur_pos,
  1585.                       show_visual_str, &visual_str_len, &visual_cur_pos,
  1586.                       MMI_TRUE, MMI_bidi_input_type, 0, 0, &visual_hilight_start, &visual_hilight_end);
  1587.             default_direction = BIDI_R;
  1588.         }
  1589.         else    /* if(default_direction == BIDI_L) */
  1590.         {
  1591.             bidi_main((U8 *) String, (U16) UCS2Strlen((const S8 *)String),
  1592.                       logical_cur_pos, show_visual_str, &visual_str_len, &visual_cur_pos,
  1593.                       MMI_FALSE, MMI_bidi_input_type, 0, 0, &visual_hilight_start, &visual_hilight_end);
  1594.             default_direction = BIDI_L;
  1595.         }
  1596.         /* START FARHAD PMT 20050211 */
  1597.     #ifdef __MMI_HINDI_ALG__
  1598.         if (r2lMMIFlag)
  1599.         {
  1600.             get_hindi_rules_for_whole_string(show_visual_str);
  1601.             hindi_rule_string = 0;
  1602.         }
  1603.     #endif /* __MMI_HINDI_ALG__ */ 
  1604.         /* END FARHAD PMT 20050211 */
  1605.         if ((r2lMMIFlag && default_direction == BIDI_L) || (!r2lMMIFlag && default_direction != BIDI_L))
  1606.             bidi_reverse(show_visual_str, (U16) UCS2Strlen((const S8 *)show_visual_str));
  1607.         temp_text_P = String;
  1608.         String = show_visual_str;
  1609.     #endif /* __MMI_BIDI_ALG__ */ 
  1610.     }   /* added farhad 20012005 */
  1611.     //START FARHAD PMT 20050211 : For hindi character sudden disappear 
  1612.     //UI_current_text_color = UI_text_color;     
  1613.     //END FARHAD PMT 20050211
  1614.     if (gnCurrentFontAttrib & FONTATTRIB_ITALIC)
  1615.         font_attr |= FONTATTRIB_ITALIC;
  1616.     else if (gnCurrentFontAttrib & FONTATTRIB_OBLIQUE)
  1617.         font_attr |= FONTATTRIB_OBLIQUE;
  1618.     if (Font.underline)
  1619.         font_attr |= FONTATTRIB_UNDERLINE;
  1620.     {
  1621.         if (Bordered)
  1622.             border_color =
  1623.                 gdi_act_color_from_rgb(0xff, UI_text_border_color.r, UI_text_border_color.g, UI_text_border_color.b);
  1624.         text_color =
  1625.             gdi_act_color_from_rgb(0xff, UI_current_text_color.r, UI_current_text_color.g, UI_current_text_color.b);
  1626.     }
  1627.     gdi_font_begin(text_color, font_attr);
  1628.     CurrentX = x;
  1629. #ifdef __MMI_HINDI_ALG__
  1630.     if (hf_is_reset_hindi_params())
  1631.         reset_hindi_params();
  1632.     if (Font.color == 0)
  1633.         Font.color = 15;
  1634.     //START FARHAD PMT 20050211
  1635.     //START TARUN 20041123 : For hindi character sudden disappear 
  1636.     //UI_current_text_color = UI_text_color;     
  1637.     //END TARUN 20041123
  1638.     if (hf_is_hindi_rules_parsing() && hindi_rule_string)
  1639.         /* END FARHAD PMT 20050211 */
  1640.     {
  1641.         U16 cluster_fill[G_MAX];
  1642.         S32 cluster_length;
  1643.         U16 glyph_output[G_MAX];
  1644.         S32 Len;
  1645.         /* PMT FARHAD START 20050708 */
  1646.         S32 total_len = 0;
  1647.         S32 original_len = 0;
  1648.         /* PMT FARHAD END 20050708 */
  1649.         S32 width, height;
  1650.         init_cluster_start_p(String);
  1651.         /* PMT FARHAD START 20050708 */
  1652.         if (len > 0)
  1653.         {
  1654.             init_cluster_end_p(String + (len *2));
  1655.         }
  1656.         else
  1657.         {
  1658.             init_cluster_end_p(String + (2 *UCS2Strlen((const char *)String) + 1));
  1659.         }
  1660.         original_len = len;
  1661.         /* PMT FARHAD END 20050708 */
  1662.         hf_disable_hindi_rules_parsing();
  1663.         hf_disable_hindi_reset_hindi_params();
  1664.         /* START TARUN PMT 20050128 */
  1665.         single_time_bidi = 1;   /* added farhad 20012004 */
  1666.         /* END TARUN PMT 20050128 */
  1667.         do
  1668.         {
  1669.             cluster_length = hf_get_cluster(cluster_fill);
  1670.             /* PMT FARHAD START 20050708 */
  1671.             total_len += cluster_length;
  1672.             if (original_len > 0)
  1673.             {
  1674.                 if (total_len > original_len)
  1675.                     break;
  1676.             }
  1677.             /* PMT FARHAD END 20050708 */
  1678.             if (cluster_length)
  1679.             {
  1680.                 Len = hf_hindi_rules(glyph_output, cluster_fill, cluster_length);
  1681.                 ShowString_internal(x, y, Font, BackGround, (U8 *) glyph_output, len, LineHeight, Bordered);
  1682.                 Get_StringWidthHeight((U8 *) glyph_output, &width, &height);
  1683.                 /* START TARUN PMT 20050128 */
  1684.                 if (r2lMMIFlag)
  1685.                     x -= width;
  1686.                 else
  1687.                     x += width;
  1688.                 /* END TARUN PMT 20050128 */
  1689.             }
  1690.         } while (cluster_length);
  1691.         hf_enable_hindi_rules_parsing();
  1692.         hf_enable_hindi_reset_hindi_params();
  1693.         /* START TARUN PMT 20050128 */
  1694.         single_time_bidi = 0;   /* added farhad 20012004 */
  1695.         /* END TARUN PMT 20050128 */
  1696.         gdi_font_end();
  1697.         return 0;
  1698.         /* GDI_RETURN(0); */
  1699.     }
  1700.     /* START FARHAD PMT 20050211 */
  1701.     hindi_rule_string = 1;
  1702.     /* END FARHAD PMT 20050211 */
  1703. #endif /* __MMI_HINDI_ALG__ */ 
  1704.     while (len != 0)
  1705.     {
  1706.         /* START FARHAD PMT 20050211 */
  1707.         U16 prev_unicode = 0;
  1708.         /* END FARHAD PMT 20050211 */
  1709.         if ((String[0] == '') && (String[1] == ''))
  1710.             break;
  1711.         len--;
  1712.         /* START FARHAD PMT 20050211 */
  1713.         prev_unicode = unicode;
  1714.         /* END FARHAD PMT 20050211 */
  1715.         unicode = String[0];
  1716.         unicode |= (String[1] << 8);
  1717.         if (FONT_TEST_CONTROL_CHAR(unicode))
  1718.             unicode = 0x20;
  1719.     #if defined(__MMI_LANG_VIETNAMESE__)
  1720.         if ((unicode > 0x0040) && (unicode < 0x01B1))
  1721.         {
  1722.             next_unicode = String[2];
  1723.             next_unicode |= (String[3] << 8);
  1724.             tone_mark = mmi_viet_tone_mark(next_unicode);
  1725.             if (VIET_TONE_NONE != tone_mark)
  1726.             {
  1727.                 viet_vowel = mmi_viet_vowel_letter(unicode);
  1728.                 if (VIET_VOWEL_NONE != viet_vowel)
  1729.                 {
  1730.                     unicode = mmi_viet_combine_vowel_tone(viet_vowel, tone_mark);
  1731.                     String += 2;
  1732.                 }
  1733.             }
  1734.         }
  1735.     #endif /* defined(__MMI_LANG_VIETNAMESE__) */ 
  1736.     #ifdef __MMI_HINDI_ALG__
  1737.         NumChar = GetFontdata(unicode, Font, &CharData, &nWidth, &nDWidth, &nHgt);
  1738.     #else 
  1739.         NumChar = GetFontdata(unicode, Font, &CharData, &nWidth, &nHgt);
  1740.     #endif 
  1741.         Counter++;
  1742.         if (LineHeight > 0)
  1743.             yy = y + LineHeight - nHgt;
  1744.         else
  1745.             yy = y;
  1746.         /* START TARUN PMT 20050128 */
  1747.         if (r2lMMIFlag
  1748.     #ifdef __MMI_HINDI_ALG__
  1749.             && (!cancelWidth)
  1750.     #endif 
  1751.             )
  1752.         {
  1753.         #ifdef __MMI_HINDI_ALG__
  1754.             /* START FARHAD PMT 20050211 */
  1755.             if (UI_HINDI_CHARACTER_UCS2_RANGE(unicode))
  1756.             {
  1757.                 /* PMT START MAUI_00223197 */
  1758.                 if ((prev_unicode != S_VISARGA) && UI_HINDI_SIGN_RANGE(prev_unicode))
  1759.                     /* PMT END MAUI_00223197 */
  1760.                     CurrentX -= 0;
  1761.                 else if (UI_HINDI_SIGN_RANGE(unicode))
  1762.                     CurrentX -= nWidth;
  1763.                 else
  1764.                     CurrentX -= nDWidth;
  1765.             }
  1766.             else
  1767.         #endif /* __MMI_HINDI_ALG__ */ 
  1768.                 /* END FARHAD PMT 20050211 */
  1769.                 CurrentX -= nWidth;
  1770.         }
  1771.         /* END TARUN PMT 20050128 */
  1772.         nXOffset = CurrentX + nWidth;
  1773.         nYOffset = yy + nHgt;
  1774.         /* START TARUN PMT 20050128 */
  1775.     #if defined(__MMI_HINDI_ALG__)
  1776.         if (cancelWidth || !r2lMMIFlag)
  1777.             get_text_x(&CurrentX, unicode, yy, nDWidth, nWidth);
  1778.     #endif /* defined(__MMI_HINDI_ALG__) */ 
  1779.         /* END TARUN PMT 20050128 */
  1780.         if (Bordered)
  1781.             gdi_show_char_bordered(CurrentX, yy, text_color, border_color, CharData, NumChar, nWidth, nHgt, font_attr);
  1782.         else if (!
  1783.                  (gnCurrentFontAttrib & FONTATTRIB_BOLD &&
  1784.                   gpCurrentFont->pFontType[gnCurrentFont][gbFontType] & FONTATTRIB_BOLD) ||
  1785.                  !(gpCurrentFont->pFontType[gnCurrentFont][gbFontType] & FONTATTRIB_NORMAL))
  1786.         {
  1787.             gdi_show_char(CurrentX, yy, text_color, CharData, NumChar, nWidth, nHgt, font_attr);
  1788.         }
  1789.         else
  1790.         {
  1791.             gdi_show_char(CurrentX + 1, yy, text_color, CharData, NumChar, nWidth, nHgt, font_attr);
  1792.             gdi_show_char(CurrentX, yy, text_color, CharData, NumChar, nWidth, nHgt, font_attr);
  1793.         }
  1794.         if (!r2lMMIFlag)
  1795.             CurrentX += nWidth;
  1796.         nHgt = (U8) LineHeight;
  1797.         String += 2;
  1798.         /* W05.50 Skip unnecessary action when the character is out of clip */
  1799.         if ((CurrentX > clip_x2) && !r2lMMIFlag)
  1800.             break;
  1801.     }
  1802.     gdi_font_end();
  1803.     /* GDI_RETURN (CurrentX); */
  1804.     /* GDI_EXIT_CRITICAL_SECTION(ShowString_internal) */
  1805.     return CurrentX;
  1806. }
  1807. #endif /* __MMI_LANG_THAI__ */ 
  1808. U32 ShowString_n(U32 x_unsigned, U32 y_unsigned, stFontAttribute Font, U8 BackGround, U8 *String, int Len,
  1809.                  U32 LineHeight)
  1810. {
  1811. #if defined(__MMI_LANG_THAI__)
  1812.     return ShowStackedString(x_unsigned, y_unsigned, Font, BackGround, String, LineHeight, 0, Len);
  1813. #elif defined(__MMI_LANG_HINDI__)
  1814.     /* START TARUN PMT 20050128 */
  1815.     return ShowString_internal(x_unsigned, y_unsigned, Font, BackGround, String, Len, LineHeight, FALSE);
  1816.     /* END TARUN PMT 20050128 */
  1817. #else 
  1818.     return ShowString_internal(x_unsigned, y_unsigned, Font, String, Len, LineHeight, FALSE);
  1819. #endif 
  1820. }
  1821. U32 ShowString(S32 x, S32 y, stFontAttribute Font, U8 BackGround, U8 *String, U32 LineHeight)
  1822. {
  1823. #if defined(__MMI_LANG_THAI__)
  1824.     /*----------------------------------------------------------------*/
  1825.     /* Local Variables                                                */
  1826.     /*----------------------------------------------------------------*/
  1827.     /*----------------------------------------------------------------*/
  1828.     /* Code Body                                                      */
  1829.     /*----------------------------------------------------------------*/
  1830.     return ShowStackedString(x, y, Font, BackGround, String, LineHeight, 0, -1);
  1831. #elif defined(__MMI_LANG_HINDI__)
  1832.     /* START TARUN PMT 20050128 */
  1833.     return ShowString_internal(x, y, Font, BackGround, String, -1, LineHeight, 0);
  1834.     /* END TARUN PMT 20050128 */
  1835. #else 
  1836.     return ShowString_internal(x, y, Font, String, -1, LineHeight, 0);
  1837. #endif 
  1838. }
  1839. /*****************************************************************************
  1840.  * FUNCTION
  1841.  *  ShowStringBordered
  1842.  * DESCRIPTION
  1843.  *  
  1844.  * PARAMETERS
  1845.  *  x               [IN]        
  1846.  *  y               [IN]        
  1847.  *  Font            [IN]        
  1848.  *  BackGround      [IN]        
  1849.  *  String          [?]         
  1850.  *  LineHeight      [IN]        
  1851.  * RETURNS
  1852.  *  
  1853.  *****************************************************************************/
  1854. U32 ShowStringBordered(S32 x, S32 y, stFontAttribute Font, U8 BackGround, U8 *String, U32 LineHeight)
  1855. {
  1856. #if defined(__MMI_LANG_THAI__)
  1857.     /*----------------------------------------------------------------*/
  1858.     /* Local Variables                                                */
  1859.     /*----------------------------------------------------------------*/
  1860.     /*----------------------------------------------------------------*/
  1861.     /* Code Body                                                      */
  1862.     /*----------------------------------------------------------------*/
  1863.     return ShowStackedString(x, y, Font, BackGround, String, LineHeight, 1, -1);
  1864. #elif defined(__MMI_LANG_HINDI__)
  1865.     /* START TARUN PMT 20050128 */
  1866.     return ShowString_internal(x, y, Font, BackGround, String, -1, LineHeight, 1);
  1867.     /* END TARUN PMT 20050128 */
  1868. #else 
  1869.     return ShowString_internal(x, y, Font, String, -1, LineHeight, 1);
  1870. #endif 
  1871. }
  1872. /*****************************************************************************
  1873.  * FUNCTION
  1874.  *  ShowStringBordered_n
  1875.  * DESCRIPTION
  1876.  *  
  1877.  * PARAMETERS
  1878.  *  x_unsigned      [IN]        
  1879.  *  y_unsigned      [IN]        
  1880.  *  Font            [IN]        
  1881.  *  BackGround      [IN]        
  1882.  *  String          [?]         
  1883.  *  Len             [IN]        
  1884.  *  LineHeight      [IN]        
  1885.  * RETURNS
  1886.  *  
  1887.  *****************************************************************************/
  1888. U32 ShowStringBordered_n(
  1889.         U32 x_unsigned,
  1890.         U32 y_unsigned,
  1891.         stFontAttribute Font,
  1892.         U8 BackGround,
  1893.         U8 *String,
  1894.         int Len,
  1895.         U32 LineHeight)
  1896. {
  1897. #if defined(__MMI_LANG_THAI__)
  1898.     /*----------------------------------------------------------------*/
  1899.     /* Local Variables                                                */
  1900.     /*----------------------------------------------------------------*/
  1901.     /*----------------------------------------------------------------*/
  1902.     /* Code Body                                                      */
  1903.     /*----------------------------------------------------------------*/
  1904.     return ShowStackedString(x_unsigned, y_unsigned, Font, BackGround, String, LineHeight, 1, Len);
  1905. #elif defined(__MMI_LANG_HINDI__)
  1906.     /* START TARUN PMT 20050128 */
  1907.     return ShowString_internal(x_unsigned, y_unsigned, Font, BackGround, String, Len, LineHeight, 1);
  1908.     /* END TARUN PMT 20050128 */
  1909. #else 
  1910.     return ShowString_internal(x_unsigned, y_unsigned, Font, String, Len, LineHeight, 1);
  1911. #endif 
  1912. }
  1913. /* MTK: Justin end */
  1914. /*****************************************************************************
  1915.  * FUNCTION
  1916.  *  Get_CharWidth
  1917.  * DESCRIPTION
  1918.  *  To get char widths
  1919.  *  
  1920.  *  This is used to get char widths
  1921.  * PARAMETERS
  1922.  *  Ch          [IN]        
  1923.  *  pdWidth     [?]         
  1924.  * RETURNS
  1925.  *  S32(?)
  1926.  *****************************************************************************/
  1927. void Get_CharWidth(U32 Ch, S32 *pdWidth)
  1928. {
  1929.     /*----------------------------------------------------------------*/
  1930.     /* Local Variables                                                */
  1931.     /*----------------------------------------------------------------*/
  1932.     U8 count = 0;
  1933.     S32 index = -1;
  1934.     U32 nBase;
  1935.     S32 Height = 0;
  1936.     S32 nFontIndex = -1;
  1937.     sCustFontData *CurrentFont = gpCurrentFont;
  1938.     /* for font cache */
  1939.     U32 nHashKey = 0;
  1940.     CharHashTable *charHashTable;
  1941.     /*----------------------------------------------------------------*/
  1942.     /* Code Body                                                      */
  1943.     /*----------------------------------------------------------------*/
  1944.     if (Ch & 0xFF00)
  1945.     {
  1946.         charHashTable = charHashTableOthers;
  1947.         nHashKey = Ch & OTHERS_CHAR_HT_MASK;
  1948.     }
  1949.     else
  1950.     {
  1951.         charHashTable = charHashTableLatin;
  1952.         nHashKey = Ch & LATIN_CHAR_HT_MASK;
  1953.     }
  1954.     if (charHashTable[nHashKey].unicode == Ch && charHashTable[nHashKey].gnCurrentFont == gnCurrentFont)
  1955.     {
  1956.         *pdWidth = charHashTable[nHashKey].Width;
  1957.         return;
  1958.     }
  1959.     /* for font cache */
  1960.     GetLangIndex(&count, &nFontIndex, &index, Ch, &nBase);
  1961.     if (index > -1)
  1962.     {
  1963.         if (count >= gMaxDeployedLangs)
  1964.         {
  1965.             *pdWidth = 0;
  1966.             gpCurrentFont = CurrentFont;
  1967.             return;
  1968.         }
  1969.         SetFontValues(gnCurrentFont, count);
  1970.         if (gpCurrentFont->nEquiDistant)
  1971.         {
  1972.             *pdWidth = gpCurrentFont->nWidth;
  1973.         }
  1974.         else
  1975.         {
  1976.             *pdWidth = gpCurrentFont->pWidthArray[index + (Ch - nBase)];
  1977.         }
  1978.     }
  1979.     else
  1980.     {
  1981.         Get_PropWidthHeight(Ch, pdWidth, &Height);
  1982.     }
  1983.     gpCurrentFont = CurrentFont;
  1984.     return;
  1985. }
  1986. /*****************************************************************************
  1987.  * FUNCTION
  1988.  *  Get_CharNumInWidth
  1989.  * DESCRIPTION
  1990.  *  To get char number in specified width
  1991.  *  
  1992.  *  This is used to get char number in specified width
  1993.  * PARAMETERS
  1994.  *  String              [IN]        
  1995.  *  width               [IN]        
  1996.  *  checklinebreak      [IN]        
  1997.  *  number(?)           [OUT]       Of characters
  1998.  * RETURNS
  1999.  *  void
  2000.  *****************************************************************************/
  2001. U32 Get_CharNumInWidth(U8 *String, U32 width, U8 checklinebreak)
  2002. {
  2003.     /*----------------------------------------------------------------*/
  2004.     /* Local Variables                                                */
  2005.     /*----------------------------------------------------------------*/
  2006.     U32 nwidth = 0, chwidth, chheight;
  2007.     U32 nchar = 0, line_break_char_counter = 0;
  2008.     U16 ch;
  2009.     U8 linebreakflag = 0;
  2010.     /*----------------------------------------------------------------*/
  2011.     /* Code Body                                                      */
  2012.     /*----------------------------------------------------------------*/
  2013.     pfnEncodingSchemeToUnicode(&ch, String);
  2014.     if (ch == 0)
  2015.     {
  2016.         return 0;
  2017.     }
  2018.     do
  2019.     {
  2020.         pfnEncodingSchemeToUnicode(&ch, String);
  2021.         if (checklinebreak)
  2022.         {
  2023.             linebreakflag = FONT_TEST_WORD_WRAPPING_BREAK_CHARACTER(ch);
  2024.         }
  2025.         if (FONT_TEST_BIDI_CONTROL_CHAR(ch))
  2026.         {
  2027.             chwidth = 0;
  2028.         }
  2029.         else
  2030.         {
  2031.             Get_CharWidthHeight(ch, (S32*) & chwidth, (S32*) & chheight);
  2032.             chwidth += 1;
  2033.         }
  2034.         nwidth += chwidth;
  2035.         String += 2;
  2036.         nchar++;
  2037.         if (checklinebreak)
  2038.         {
  2039.             if (UI_STRING_END_OF_STRING_CHARACTER(ch))
  2040.             {
  2041.                 line_break_char_counter = nchar;
  2042.             }
  2043.             if (linebreakflag)
  2044.             {
  2045.                 line_break_char_counter = nchar;
  2046.             }
  2047.             /*
  2048.              * if (!FONT_TEST_ASCII_CHARACTER(ch))
  2049.              * {
  2050.              * line_break_char_counter = 0;
  2051.              * }
  2052.              */
  2053.         }
  2054.     } while (nwidth <= width && ch != 0 /* && ch != 0x0A && ch != 0x0D */ );
  2055.     if (checklinebreak)
  2056.     {
  2057.         if (line_break_char_counter == 0)
  2058.         {
  2059.             nchar--;
  2060.         }
  2061.         else
  2062.         {
  2063.             nchar = line_break_char_counter;
  2064.         }
  2065.     }
  2066.     else
  2067.     {
  2068.         nchar--;
  2069.     }
  2070.     return nchar;
  2071. }
  2072. /**************************************************************
  2073.    FUNCTION NAME     : Get_CharWidthHeight()
  2074.    PURPOSE           : To get char widths
  2075.    INPUT PARAMETERS  : U32 Ch
  2076.    OUTPUT PARAMETERS : nil
  2077.    RETURNS           : S32
  2078.    REMARKS           : This is used to get char widths
  2079. **************************************************************/
  2080. #ifdef __MMI_HINDI_ALG__
  2081. void Get_CharWidthHeight(U32 Ch, S32 *pdWidth, S32 *pHeight)
  2082. #else 
  2083. void Get_CharWidthHeight(U32 Ch, S32 *pWidth, S32 *pHeight)
  2084. #endif 
  2085. {
  2086.     U8 count = 0;
  2087.     S32 index = -1;
  2088.     U32 nBase;
  2089.     S32 nFontIndex = -1;
  2090.     sCustFontData *CurrentFont = gpCurrentFont;
  2091.     /* for font cache */
  2092.     U32 nHashKey = 0;
  2093.     CharHashTable *charHashTable;
  2094.     if (Ch & 0xFF00)
  2095.     {
  2096.         charHashTable = charHashTableOthers;
  2097.         nHashKey = Ch & OTHERS_CHAR_HT_MASK;
  2098.     }
  2099.     else
  2100.     {
  2101.         charHashTable = charHashTableLatin;
  2102.         nHashKey = Ch & LATIN_CHAR_HT_MASK;
  2103.     }
  2104.     if (charHashTable[nHashKey].unicode == Ch && charHashTable[nHashKey].gnCurrentFont == gnCurrentFont)
  2105.     {
  2106.         /* PMT START LANGUAGE 20060104 */
  2107.     #ifdef __MMI_HINDI_ALG__
  2108.         /* PMT START FIX HINDI ISSUES 20060604 */
  2109.         if (UI_HINDI_CHARACTER_UCS2_RANGE(Ch))
  2110.         {
  2111.             *pdWidth = charHashTable[nHashKey].DWidth;
  2112.         }
  2113.         else
  2114.         {
  2115.             *pdWidth = charHashTable[nHashKey].Width;
  2116.         }
  2117.         /* PMT END FIX HINDI ISSUES 20060604 */
  2118.     #else /* __MMI_HINDI_ALG__ */ 
  2119.         *pWidth = charHashTable[nHashKey].Width;
  2120.     #endif /* __MMI_HINDI_ALG__ */ 
  2121.         /* PMT END LANGUAGE 20060104 */
  2122.         *pHeight = charHashTable[nHashKey].Height;
  2123.         return;
  2124.     }
  2125.     /* for font cache */
  2126.     GetLangIndex(&count, &nFontIndex, &index, Ch, &nBase);
  2127.     if (index > -1)
  2128.     {
  2129.     #ifdef __MMI_HINDI_ALG__
  2130.         if (count >= gMaxDeployedLangs)
  2131.         {
  2132.             *pdWidth = 0;
  2133.             *pHeight = 0;
  2134.             gpCurrentFont = CurrentFont;
  2135.             return;
  2136.         }
  2137.     #endif /* __MMI_HINDI_ALG__ */ 
  2138.         SetFontValues(gnCurrentFont, count);
  2139.         *pHeight = gpCurrentFont->nHeight;
  2140.     #ifdef __MMI_HINDI_ALG__
  2141.         if (UI_HINDI_CHARACTER_UCS2_RANGE(Ch))
  2142.         {
  2143.             *pdWidth = gpCurrentFont->pDWidthArray[index + (Ch - nBase) /* +103 */ ];
  2144.         }
  2145.         else
  2146.         {
  2147.             if (gpCurrentFont->nEquiDistant)
  2148.                 *pdWidth = gpCurrentFont->nWidth;
  2149.             else
  2150.                 *pdWidth = gpCurrentFont->pWidthArray[index + (Ch - nBase)];
  2151.         }
  2152.     #else /* __MMI_HINDI_ALG__ */ 
  2153.         if (gpCurrentFont->nEquiDistant)
  2154.             *pWidth = gpCurrentFont->nWidth;
  2155.         else
  2156.             *pWidth = gpCurrentFont->pWidthArray[index + (Ch - nBase)];
  2157.     #endif /* __MMI_HINDI_ALG__ */ 
  2158.     }
  2159.     else
  2160.     {
  2161.     #ifdef __MMI_HINDI_ALG__
  2162.         Get_PropWidthHeight(Ch, pdWidth, pHeight);
  2163.     #else 
  2164.         Get_PropWidthHeight(Ch, pWidth, pHeight);
  2165.     #endif 
  2166.     }
  2167.     gpCurrentFont = CurrentFont;
  2168.     return;
  2169. }
  2170. /**************************************************************
  2171.    FUNCTION NAME     : Get_CharBoundingBox()
  2172.    PURPOSE           : To get the bounding box of "drawn area" of a character
  2173.    INPUT PARAMETERS  : U32 Ch
  2174.    OUTPUT PARAMETERS : pCharWidth - width of character
  2175.                      pCharHeight    - height of character
  2176.                      pBoxXoffset    - X offset of the bounding box of drawn area relative to the top-left corner
  2177.                      pBoxYoffset    - Y offset of the bounding box of drawn area  relative to the top-left corner
  2178.                      pBoxWidth      - width of the bounding box of drawn area 
  2179.                      pBoxHeight     - height of the bounding box of drawn area 
  2180.    RETURNS           : void
  2181.    REMARKS           : 
  2182.                      1. It does not handle Hindi properly.
  2183.                      2. The function is slow because it process internal font data.
  2184.                      3. This function can be used to align a character in a better way because the "drawn area" is aligned
  2185.                        differently for different font database.
  2186. **************************************************************/
  2187. void Get_CharBoundingBox(U32 Ch, S32 * pCharWidth, S32 * pCharHeight, S32 * pBoxXoffset, S32 * pBoxYoffset,
  2188.                          S32 * pBoxWidth, S32 * pBoxHeight)
  2189. {
  2190.     U8 *font_data;
  2191.     U32 font_data_size;
  2192.     U16 char_height;
  2193.     U16 char_width;
  2194. #ifdef __MMI_HINDI_ALG__
  2195.     U16 char_d_width = 0;
  2196. #endif 
  2197.     S32 fx1, fy1, fx2, fy2, x, y;
  2198. #ifdef __MMI_HINDI_ALG__
  2199.     font_data_size =
  2200.         GetFontdata(Ch, *UI_font /* dummy parameter */ , &font_data, &char_width, &char_d_width, &char_height);
  2201. #else /* __MMI_HINDI_ALG__ */ 
  2202.     font_data_size = GetFontdata(Ch, *UI_font /* dummy parameter */ , &font_data, &char_width, &char_height);
  2203. #endif /* __MMI_HINDI_ALG__ */ 
  2204.     *pCharWidth = char_width;
  2205.     *pCharHeight = char_height;
  2206.     fx1 = char_width - 1;   /* min X of drawn area */
  2207.     fx2 = 0;                /* max X of drawn area */
  2208.     fy1 = char_height - 1;  /* min Y of drawn area */
  2209.     fy2 = 0;                /* max Y of drawn area */
  2210.     x = 0;
  2211.     y = 0;
  2212.     while (font_data_size--)
  2213.     {
  2214.     /*----------------------------------------------------------------*/
  2215.     /* Local Variables                                                */
  2216.     /*----------------------------------------------------------------*/
  2217.         U8 pattern = *font_data++;
  2218.     /*----------------------------------------------------------------*/
  2219.     /* Code Body                                                      */
  2220.     /*----------------------------------------------------------------*/
  2221.         if (!pattern)
  2222.         {
  2223.             U32 nTemp;
  2224.             x += 8;
  2225.             nTemp = x / char_width;
  2226.             if (nTemp)
  2227.             {
  2228.                 y += nTemp;
  2229.                 char_height -= (U16) nTemp;
  2230.                 if (!char_height)
  2231.                 {
  2232.                     break;
  2233.                 }
  2234.             }
  2235.             x %= char_width;
  2236.         }
  2237.         else
  2238.         {
  2239.             S32 i;
  2240.             for (i = 0; i < 8; i++)
  2241.             {
  2242.                 if (pattern & 1)
  2243.                 {
  2244.                     if (x < fx1)
  2245.                     {
  2246.                         fx1 = x;
  2247.                     }
  2248.                     if (y < fy1)
  2249.                     {
  2250.                         fy1 = y;
  2251.                     }
  2252.                     if (x > fx2)
  2253.                     {
  2254.                         fx2 = x;
  2255.                     }
  2256.                     if (y > fy2)
  2257.                     {
  2258.                         fy2 = y;
  2259.                     }
  2260.                 }
  2261.                 x++;
  2262.                 if (x == (S32) char_width)
  2263.                 {
  2264.                     y++;
  2265.                     char_height--;
  2266.                     x = 0;
  2267.                     if (!char_height)
  2268.                     {
  2269.                         break;
  2270.                     }
  2271.                 }
  2272.                 pattern >>= 1;
  2273.             }
  2274.         }
  2275.     }
  2276.     MMI_DBG_ASSERT(fx2 >= fx1 && fy2 >= fy1);
  2277.     *pBoxXoffset = fx1;
  2278.     *pBoxYoffset = fy1;
  2279.     *pBoxWidth = fx2 - fx1 + 1;
  2280.     *pBoxHeight = fy2 - fy1 + 1;
  2281. }
  2282. /*****************************************************************************
  2283.  * FUNCTION
  2284.  *  Get_PropWidthHeight
  2285.  * DESCRIPTION
  2286.  *  To get char widths
  2287.  *  
  2288.  *  This is used to get char widths
  2289.  * PARAMETERS
  2290.  *  Ch          [IN]        
  2291.  *  pWidth      [?]         
  2292.  *  pHeight     [?]         
  2293.  * RETURNS
  2294.  *  S32
  2295.  *****************************************************************************/
  2296. S32 Get_PropWidthHeight(U32 Ch, S32 *pWidth, S32 *pHeight)
  2297. {
  2298.     /*----------------------------------------------------------------*/
  2299.     /* Local Variables                                                */
  2300.     /*----------------------------------------------------------------*/
  2301.     U32 nBase = 0;
  2302.     S32 index = -1;
  2303.     /*----------------------------------------------------------------*/
  2304.     /* Code Body                                                      */
  2305.     /*----------------------------------------------------------------*/
  2306.     /* MTK Add Steven 2005.06.03 */
  2307. #if defined(__MMI_ZI__)
  2308.     index = SearchInZiExtraFont(Ch, &nBase);
  2309. #else 
  2310.     index = SearchInPropFont(Ch, &nBase);
  2311. #endif 
  2312.     if (index == -1)