Merge "Cherry-pick: Fix the incompatible type of UChar and char16_t"
diff --git a/cpp/src/sample/chromium/subsetter_impl.cc b/cpp/src/sample/chromium/subsetter_impl.cc
index 707ebdc..fc82ef1 100644
--- a/cpp/src/sample/chromium/subsetter_impl.cc
+++ b/cpp/src/sample/chromium/subsetter_impl.cc
@@ -44,10 +44,18 @@
using namespace sfntly;
+/**
+ * std::u16string and icu::UnicodeString can't be used here.
+ * UChar is not always char16_t in some platforms. std::u16string is avoided.
+ * icu::UnicodeString C++ API is also avoided to make it more portable across
+ * platforms due to C++ ABI compatility issue.
+ */
+typedef std::basic_string<UChar> UCharString;
+
// The bitmap tables must be greater than 16KB to trigger bitmap subsetter.
static const int BITMAP_SIZE_THRESHOLD = 16384;
-void ConstructName(UChar* name_part, std::u16string* name, int32_t name_id) {
+void ConstructName(UChar* name_part, UCharString* name, int32_t name_id) {
switch (name_id) {
case NameId::kFullFontName:
*name = name_part;
@@ -55,7 +63,7 @@
case NameId::kFontFamilyName:
case NameId::kPreferredFamily:
case NameId::kWWSFamilyName: {
- std::u16string original = *name;
+ UCharString original = *name;
*name = name_part;
*name += original;
break;
@@ -76,11 +84,11 @@
//
// Ill-formed input is replaced with U+FFFD.
// Otherwise, return empty string if other error occurs during the conversion.
-std::u16string ConvertFromUtf8(const char* src) {
+UCharString ConvertFromUtf8(const char* src) {
int32_t srcLength = strlen(src);
int32_t destCapacity = srcLength + 1;
UChar* buffer = new UChar[destCapacity];
- std::u16string dest;
+ UCharString dest;
if (buffer == NULL) {
return dest;
}
@@ -97,8 +105,8 @@
return dest;
}
-int32_t CaseCompareUtf16(const std::u16string& str1,
- const std::u16string& str2, uint32_t option) {
+int32_t CaseCompareUtf16(const UCharString& str1,
+ const UCharString& str2, uint32_t option) {
UErrorCode errorCode = U_ZERO_ERROR;
return u_strCaseCompare(str1.c_str(), str1.length(), str2.c_str(),
str2.length(), option, &errorCode);
@@ -120,14 +128,14 @@
}
bool HasName(const char* font_name, Font* font) {
- std::u16string font_string = ConvertFromUtf8(font_name);
+ UCharString font_string = ConvertFromUtf8(font_name);
if (font_string.empty())
return false;
- std::u16string regular_suffix(u" Regular");
- std::u16string alt_font_string = font_string;
+ UCharString regular_suffix = ConvertFromUtf8("Regular");
+ UCharString alt_font_string = font_string;
alt_font_string += regular_suffix;
- typedef std::map<int32_t, std::u16string> NameMap;
+ typedef std::map<int32_t, UCharString> NameMap;
NameMap names;
NameTablePtr name_table = down_cast<NameTable*>(font->GetTable(Tag::name));
if (name_table == NULL) {