提交 71ec9705 编写于 作者: R Roozbeh Pournader

Support three-letter language codes in FontLanguage.

Also handle the case of weird language code that we don't understand
properly better, by treating them not equal to each other.

Change-Id: Iaccb251fa38d700932f6eadac254d3d1fa09b3ea
上级 c02138bf
......@@ -40,7 +40,9 @@ public:
// Parse from string
FontLanguage(const char* buf, size_t size);
bool operator==(const FontLanguage other) const { return mBits == other.mBits; }
bool operator==(const FontLanguage other) const {
return mBits != kUnsupportedLanguage && mBits == other.mBits;
}
operator bool() const { return mBits != 0; }
std::string getString() const;
......@@ -53,10 +55,11 @@ private:
uint32_t bits() const { return mBits; }
static const uint32_t kBaseLangMask = 0xffff;
static const uint32_t kScriptMask = (1 << 18) - (1 << 16);
static const uint32_t kHansFlag = 1 << 16;
static const uint32_t kHantFlag = 1 << 17;
static const uint32_t kUnsupportedLanguage = 0xFFFFFFFFu;
static const uint32_t kBaseLangMask = 0xFFFFFFu;
static const uint32_t kScriptMask = (1u << 26) - (1u << 24);
static const uint32_t kHansFlag = 1u << 24;
static const uint32_t kHantFlag = 1u << 25;
uint32_t mBits;
};
......
......@@ -40,7 +40,14 @@ FontLanguage::FontLanguage(const char* buf, size_t size) {
if (c == '-' || c == '_') break;
}
if (i == 2) {
bits = (uint8_t(buf[0]) << 8) | uint8_t(buf[1]);
bits = uint8_t(buf[0]) | (uint8_t(buf[1]) << 8);
} else if (i == 3) {
bits = uint8_t(buf[0]) | (uint8_t(buf[1]) << 8) | (uint8_t(buf[2]) << 16);
} else {
mBits = kUnsupportedLanguage;
// We don't understand anything other than two-letter or three-letter
// language codes, so we skip parsing the rest of the string.
return;
}
size_t next;
for (i++; i < size; i = next + 1) {
......@@ -62,28 +69,38 @@ FontLanguage::FontLanguage(const char* buf, size_t size) {
}
std::string FontLanguage::getString() const {
char buf[16];
size_t i = 0;
if (mBits & kBaseLangMask) {
buf[i++] = (mBits >> 8) & 0xFFu;
buf[i++] = mBits & 0xFFu;
}
if (mBits & kScriptMask) {
if (!i)
buf[i++] = 'x';
buf[i++] = '-';
buf[i++] = 'H';
buf[i++] = 'a';
buf[i++] = 'n';
if (mBits & kHansFlag)
buf[i++] = 's';
else
buf[i++] = 't';
}
return std::string(buf, i);
if (mBits == kUnsupportedLanguage) {
return "und";
}
char buf[16];
size_t i = 0;
if (mBits & kBaseLangMask) {
buf[i++] = mBits & 0xFFu;
buf[i++] = (mBits >> 8) & 0xFFu;
char third_letter = (mBits >> 16) & 0xFFu;
if (third_letter != 0) buf[i++] = third_letter;
}
if (mBits & kScriptMask) {
if (!i) {
// This should not happen, but as it apparently has, we fill the language code part
// with "und".
buf[i++] = 'u';
buf[i++] = 'n';
buf[i++] = 'd';
}
buf[i++] = '-';
buf[i++] = 'H';
buf[i++] = 'a';
buf[i++] = 'n';
buf[i++] = (mBits & kHansFlag) ? 's' : 't';
}
return std::string(buf, i);
}
int FontLanguage::match(const FontLanguage other) const {
if (mBits == kUnsupportedLanguage || other.mBits == kUnsupportedLanguage)
return 0;
int result = 0;
if ((mBits & kBaseLangMask) == (other.mBits & kBaseLangMask)) {
result++;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册