//----------------------------------------------------------------------------- U32 convertUTF8toUTF16(const UTF8 *unistring, UTF16 *outbuffer, U32 len) { AssertFatal(len >= 1, "Buffer for unicode conversion must be large enough to hold at least the null terminator."); PROFILE_SCOPE(convertUTF8toUTF16); #ifdef TORQUE_ENABLE_UTF16_CACHE // If we have cached this conversion already, don't do it again U32 hashKey = Torque::hash((const U8 *)unistring, dStrlen(unistring), 0); UTF16CacheTable::Iterator cacheItr = sgUTF16Cache.find(hashKey); if(cacheItr != sgUTF16Cache.end()) { const UTF16Cache &cache = (*cacheItr).value; cache.copyToBuffer(outbuffer, len); outbuffer[len-1] = '\0'; return getMin(cache.mLength,len - 1); } #endif U32 walked, nCodepoints; UTF32 middleman; nCodepoints=0; while(*unistring != '\0' && nCodepoints < len) { walked = 1; middleman = oneUTF8toUTF32(unistring,&walked); outbuffer[nCodepoints] = oneUTF32toUTF16(middleman); unistring+=walked; nCodepoints++; } nCodepoints = getMin(nCodepoints,len - 1); outbuffer[nCodepoints] = '\0'; #ifdef TORQUE_ENABLE_UTF16_CACHE // Cache the results. // FIXME As written, this will result in some unnecessary memory copying due to copy constructor calls. UTF16Cache cache(outbuffer, nCodepoints); sgUTF16Cache.insertUnique(hashKey, cache); #endif return nCodepoints; }
bool x86UNIXFont::isValidChar(const UTF8 *str) const { return isValidChar(oneUTF32toUTF16(oneUTF8toUTF32(str,NULL))); }
PlatformFont::CharInfo &x86UNIXFont::getCharInfo(const UTF8 *str) const { return getCharInfo(oneUTF32toUTF16(oneUTF8toUTF32(str,NULL))); }
PlatformFont::CharInfo& EmscriptenFont::getCharInfo(const UTF8 *str) const { return getCharInfo( oneUTF32toUTF16(oneUTF8toUTF32(str,NULL)) ); }