summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/platform/text/layout_locale.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/platform/text/layout_locale.cc')
-rw-r--r--chromium/third_party/blink/renderer/platform/text/layout_locale.cc36
1 files changed, 23 insertions, 13 deletions
diff --git a/chromium/third_party/blink/renderer/platform/text/layout_locale.cc b/chromium/third_party/blink/renderer/platform/text/layout_locale.cc
index 193803edaae..85148477b0b 100644
--- a/chromium/third_party/blink/renderer/platform/text/layout_locale.cc
+++ b/chromium/third_party/blink/renderer/platform/text/layout_locale.cc
@@ -12,7 +12,7 @@
#include "third_party/blink/renderer/platform/text/locale_to_script_mapping.h"
#include "third_party/blink/renderer/platform/wtf/hash_map.h"
#include "third_party/blink/renderer/platform/wtf/text/atomic_string_hash.h"
-#include "third_party/blink/renderer/platform/wtf/text/string_hash.h"
+#include "third_party/blink/renderer/platform/wtf/text/case_folding_hash.h"
#include "third_party/blink/renderer/platform/wtf/thread_specific.h"
#include <hb.h>
@@ -42,17 +42,18 @@ PerThreadData& GetPerThreadData() {
static hb_language_t ToHarfbuzLanguage(const AtomicString& locale) {
std::string locale_as_latin1 = locale.Latin1();
return hb_language_from_string(locale_as_latin1.data(),
- locale_as_latin1.length());
+ static_cast<int>(locale_as_latin1.length()));
}
-// SkFontMgr requires script-based locale names, like "zh-Hant" and "zh-Hans",
-// instead of "zh-CN" and "zh-TW".
+// SkFontMgr uses two/three-letter language code with an optional ISO 15924
+// four-letter script code, in POSIX style (with '-' as the separator,) such as
+// "zh-Hant" and "zh-Hans". See `fonts.xml`.
static const char* ToSkFontMgrLocale(UScriptCode script) {
switch (script) {
case USCRIPT_KATAKANA_OR_HIRAGANA:
- return "ja-JP";
+ return "ja";
case USCRIPT_HANGUL:
- return "ko-KR";
+ return "ko";
case USCRIPT_SIMPLIFIED_HAN:
return "zh-Hans";
case USCRIPT_TRADITIONAL_HAN:
@@ -63,13 +64,22 @@ static const char* ToSkFontMgrLocale(UScriptCode script) {
}
const char* LayoutLocale::LocaleForSkFontMgr() const {
- if (string_for_sk_font_mgr_.empty()) {
- const char* sk_font_mgr_locale = ToSkFontMgrLocale(script_);
- string_for_sk_font_mgr_ =
- sk_font_mgr_locale ? sk_font_mgr_locale : std::string();
- if (string_for_sk_font_mgr_.empty())
- string_for_sk_font_mgr_ = string_.Ascii();
+ if (!string_for_sk_font_mgr_.empty())
+ return string_for_sk_font_mgr_.c_str();
+
+ if (const char* sk_font_mgr_locale = ToSkFontMgrLocale(script_)) {
+ string_for_sk_font_mgr_ = sk_font_mgr_locale;
+ DCHECK(!string_for_sk_font_mgr_.empty());
+ return string_for_sk_font_mgr_.c_str();
}
+
+ const icu::Locale locale(Ascii().c_str());
+ const char* language = locale.getLanguage();
+ string_for_sk_font_mgr_ = language && *language ? language : "und";
+ const char* script = locale.getScript();
+ if (script && *script)
+ string_for_sk_font_mgr_ = string_for_sk_font_mgr_ + "-" + script;
+ DCHECK(!string_for_sk_font_mgr_.empty());
return string_for_sk_font_mgr_.c_str();
}
@@ -223,7 +233,7 @@ AtomicString LayoutLocale::LocaleWithBreakKeyword(
return string_;
std::string utf8_locale = string_.Utf8();
- Vector<char> buffer(utf8_locale.length() + 11, 0);
+ Vector<char> buffer(static_cast<wtf_size_t>(utf8_locale.length() + 11), 0);
memcpy(buffer.data(), utf8_locale.c_str(), utf8_locale.length());
const char* keyword_value = nullptr;