diff options
Diffstat (limited to 'Build/source/libs/icu-xetex/test/letest/letsutil.cpp')
-rw-r--r-- | Build/source/libs/icu-xetex/test/letest/letsutil.cpp | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/Build/source/libs/icu-xetex/test/letest/letsutil.cpp b/Build/source/libs/icu-xetex/test/letest/letsutil.cpp new file mode 100644 index 00000000000..edac65ac9a2 --- /dev/null +++ b/Build/source/libs/icu-xetex/test/letest/letsutil.cpp @@ -0,0 +1,98 @@ +/* + ******************************************************************************* + * + * Copyright (C) 1999-2006, International Business Machines + * Corporation and others. All Rights Reserved. + * + ******************************************************************************* + * file name: letsutil.cpp + * + * created on: 04/25/2006 + * created by: Eric R. Mader + */ + +#include "unicode/utypes.h" +#include "unicode/unistr.h" +#include "unicode/ubidi.h" + +#include "layout/LETypes.h" +#include "layout/LEScripts.h" +#include "layout/LayoutEngine.h" +#include "layout/LELanguages.h" + +#include "OpenTypeLayoutEngine.h" + +#include "letest.h" +#include "letsutil.h" + +U_NAMESPACE_USE + +char *getCString(const UnicodeString *uString) +{ + if (uString == NULL) { + return NULL; + } + + le_int32 uLength = uString->length(); + le_int32 cLength = uString->extract(0, uLength, NULL, 0, US_INV); + char *cString = NEW_ARRAY(char, cLength + 1); + + uString->extract(0, uLength, cString, cLength, US_INV); + cString[cLength] = '\0'; + + return cString; +} + +char *getUTF8String(const UnicodeString *uString) +{ + if (uString == NULL) { + return NULL; + } + + le_int32 uLength = uString->length(); + le_int32 cLength = uString->extract(0, uLength, NULL, 0, "UTF-8"); + char *cString = NEW_ARRAY(char, cLength + 1); + + uString->extract(0, uLength, cString, cLength, "UTF-8"); + + cString[cLength] = '\0'; + + return cString; +} + +void freeCString(char *cString) +{ + DELETE_ARRAY(cString); +} + +le_bool getRTL(const UnicodeString &text) +{ + UBiDiLevel paraLevel; + UErrorCode status = U_ZERO_ERROR; + le_int32 charCount = text.length(); + UBiDi *ubidi = ubidi_openSized(charCount, 0, &status); + + ubidi_setPara(ubidi, text.getBuffer(), charCount, UBIDI_DEFAULT_LTR, NULL, &status); + paraLevel = ubidi_getParaLevel(ubidi); + ubidi_close(ubidi); + + return paraLevel & 1; +} + +le_int32 getLanguageCode(const char *lang) +{ + if (strlen(lang) != 3) { + return -1; + } + + LETag langTag = (LETag) ((lang[0] << 24) + (lang[1] << 16) + (lang[2] << 8) + 0x20); + + for (le_int32 i = 0; i < languageCodeCount; i += 1) { + if (langTag == OpenTypeLayoutEngine::languageTags[i]) { + return i; + } + } + + return -1; +} + |