| Index: third_party/WebKit/Source/platform/fonts/FontLocale.cpp
|
| diff --git a/third_party/WebKit/Source/platform/fonts/FontLocale.cpp b/third_party/WebKit/Source/platform/fonts/FontLocale.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..29586def57f0f7f82ee5b81126af6c7b2f1f5dfa
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/platform/fonts/FontLocale.cpp
|
| @@ -0,0 +1,92 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "platform/fonts/FontLocale.h"
|
| +
|
| +#include "platform/Language.h"
|
| +#include "platform/text/Hyphenation.h"
|
| +#include "platform/text/LocaleToScriptMapping.h"
|
| +#include "wtf/HashMap.h"
|
| +#include "wtf/text/AtomicStringHash.h"
|
| +#include "wtf/text/StringHash.h"
|
| +
|
| +#include <hb.h>
|
| +
|
| +namespace blink {
|
| +
|
| +using FontLocaleMap = HashMap<AtomicString, RefPtr<FontLocale>, CaseFoldingHash>;
|
| +
|
| +static FontLocaleMap& getLocaleMap()
|
| +{
|
| + DEFINE_STATIC_LOCAL(FontLocaleMap, localeMap, ());
|
| + return localeMap;
|
| +}
|
| +
|
| +const FontLocale* FontLocale::get(const AtomicString& locale)
|
| +{
|
| + if (locale.isNull())
|
| + return nullptr;
|
| + auto result = getLocaleMap().add(locale, nullptr);
|
| + if (result.isNewEntry)
|
| + result.storedValue->value = adoptRef(new FontLocale(locale.lower()));
|
| + return result.storedValue->value.get();
|
| +}
|
| +
|
| +static const FontLocale* computeDefaultLocale()
|
| +{
|
| + AtomicString locale = defaultLanguage();
|
| + if (locale.isEmpty())
|
| + locale = AtomicString("en");
|
| + return FontLocale::get(locale);
|
| +}
|
| +
|
| +const FontLocale& FontLocale::getDefault()
|
| +{
|
| + DEFINE_STATIC_LOCAL(const FontLocale*, defaultLocale, (computeDefaultLocale()));
|
| + return *defaultLocale;
|
| +}
|
| +
|
| +static hb_language_t toHarfbuzLanguage(const AtomicString& locale)
|
| +{
|
| + CString localeAsLatin1 = locale.latin1();
|
| + return hb_language_from_string(localeAsLatin1.data(), localeAsLatin1.length());
|
| +}
|
| +
|
| +FontLocale::FontLocale(const AtomicString& locale)
|
| + : m_string(locale)
|
| + , m_script(localeToScriptCodeForFontSelection(locale))
|
| + , m_harfbuzzLanguage(static_cast<const void*>(toHarfbuzLanguage(locale)))
|
| +{
|
| +}
|
| +
|
| +// SkFontMgr requires script-based locale names, like "zh-Hant" and "zh-Hans",
|
| +// instead of "zh-CN" and "zh-TW".
|
| +static CString toSkFontMgrLocale(const String& locale)
|
| +{
|
| + if (!locale.startsWith("zh", TextCaseInsensitive))
|
| + return locale.ascii();
|
| +
|
| + switch (localeToScriptCodeForFontSelection(locale)) {
|
| + case USCRIPT_SIMPLIFIED_HAN:
|
| + return "zh-Hans";
|
| + case USCRIPT_TRADITIONAL_HAN:
|
| + return "zh-Hant";
|
| + default:
|
| + return locale.ascii();
|
| + }
|
| +}
|
| +
|
| +const CString& FontLocale::localeForSkFontMgr() const
|
| +{
|
| + if (m_stringForSkFontMgr.isNull())
|
| + m_stringForSkFontMgr = toSkFontMgrLocale(m_string);
|
| + return m_stringForSkFontMgr;
|
| +}
|
| +
|
| +Hyphenation* FontLocale::getHyphenation() const
|
| +{
|
| + return Hyphenation::get(localeString());
|
| +}
|
| +
|
| +} // namespace blink
|
|
|