146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ******************************************************************************* 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * Copyright (C) 1999-2008, International Business Machines 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Corporation and others. All Rights Reserved. 690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) * 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ******************************************************************************* 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * file name: letsutil.cpp 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * created on: 04/25/2006 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * created by: Eric R. Mader 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "unicode/utypes.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "unicode/unistr.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "unicode/ubidi.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "layout/LETypes.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "layout/LEScripts.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "layout/LayoutEngine.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "layout/LELanguages.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "OpenTypeLayoutEngine.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "letest.h" 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "letsutil.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)U_NAMESPACE_USE 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char *getCString(const UnicodeString *uString) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uString == NULL) { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) le_int32 uLength = uString->length(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) le_int32 cLength = uString->extract(0, uLength, NULL, 0, US_INV); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *cString = NEW_ARRAY(char, cLength + 1); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uString->extract(0, uLength, cString, cLength, US_INV); 4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cString[cLength] = '\0'; 4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 4390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return cString; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char *getCString(const LEUnicode16 *uChars) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uChars == NULL) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const UnicodeString ustring(uChars); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return getCString(&ustring); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)char *getUTF8String(const UnicodeString *uString) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (uString == NULL) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) le_int32 uLength = uString->length(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) le_int32 cLength = uString->extract(0, uLength, NULL, 0, "UTF-8"); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *cString = NEW_ARRAY(char, cLength + 1); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uString->extract(0, uLength, cString, cLength, "UTF-8"); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cString[cLength] = '\0'; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return cString; 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 73 74void freeCString(char *cString) 75{ 76 DELETE_ARRAY(cString); 77} 78 79le_bool getRTL(const UnicodeString &text) 80{ 81 UBiDiLevel level = 0; 82 UErrorCode status = U_ZERO_ERROR; 83 le_int32 charCount = text.length(); 84 le_int32 limit = -1; 85 UBiDi *ubidi = ubidi_openSized(charCount, 0, &status); 86 87 ubidi_setPara(ubidi, text.getBuffer(), charCount, UBIDI_DEFAULT_LTR, NULL, &status); 88 89 // TODO: Should check that there's only a single logical run... 90 ubidi_getLogicalRun(ubidi, 0, &limit, &level); 91 92 ubidi_close(ubidi); 93 94 return level & 1; 95} 96 97le_int32 getLanguageCode(const char *lang) 98{ 99 if (strlen(lang) != 3) { 100 return -1; 101 } 102 103 LETag langTag = (LETag) ((lang[0] << 24) + (lang[1] << 16) + (lang[2] << 8) + 0x20); 104 105 for (le_int32 i = 0; i < languageCodeCount; i += 1) { 106 if (langTag == OpenTypeLayoutEngine::languageTags[i]) { 107 return i; 108 } 109 } 110 111 return -1; 112} 113 114