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