You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
129 lines
3.0 KiB
129 lines
3.0 KiB
// © 2016 and later: Unicode, Inc. and others.
|
|
// License & terms of use: http://www.unicode.org/copyright.html
|
|
/*
|
|
*******************************************************************************
|
|
*
|
|
* Copyright (C) 1999-2014, 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"
|
|
|
|
#ifndef USING_ICULEHB
|
|
#include "OpenTypeLayoutEngine.h"
|
|
#endif
|
|
|
|
#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 *getCString(const LEUnicode16 *uChars)
|
|
{
|
|
if (uChars == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
const UnicodeString ustring(uChars);
|
|
|
|
return getCString(&ustring);
|
|
}
|
|
|
|
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 level = 0;
|
|
UErrorCode status = U_ZERO_ERROR;
|
|
le_int32 charCount = text.length();
|
|
le_int32 limit = -1;
|
|
UBiDi *ubidi = ubidi_openSized(charCount, 0, &status);
|
|
|
|
ubidi_setPara(ubidi, text.getBuffer(), charCount, UBIDI_DEFAULT_LTR, NULL, &status);
|
|
|
|
// TODO: Should check that there's only a single logical run...
|
|
ubidi_getLogicalRun(ubidi, 0, &limit, &level);
|
|
|
|
ubidi_close(ubidi);
|
|
|
|
return level & 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);
|
|
|
|
#ifndef USING_ICULEHB
|
|
for (le_int32 i = 0; i < languageCodeCount; i += 1) {
|
|
if (langTag == OpenTypeLayoutEngine::languageTags[i]) {
|
|
return i;
|
|
}
|
|
}
|
|
#else
|
|
if (!strcmp(lang, "JAN")) return janLanguageCode;
|
|
if (!strcmp(lang, "KOR")) return korLanguageCode;
|
|
if (!strcmp(lang, "ZHT")) return zhtLanguageCode;
|
|
if (!strcmp(lang, "ZHS")) return zhsLanguageCode;
|
|
if (!strcmp(lang, "HIN")) return hinLanguageCode;
|
|
if (!strcmp(lang, "MAR")) return marLanguageCode;
|
|
if (!strcmp(lang, "ROM")) return romLanguageCode;
|
|
#endif
|
|
|
|
|
|
return -1;
|
|
}
|
|
|