// Copyright (c) 2011 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 "content/common/font_list.h" #include #include #include #include "base/i18n/rtl.h" #include "base/strings/string16.h" #include "base/strings/utf_string_conversions.h" #include "base/trace_event/trace_event.h" #include "base/values.h" #include "ui/gfx/win/direct_write.h" namespace content { std::unique_ptr GetFontList_SlowBlocking() { TRACE_EVENT0("fonts", "GetFontList_SlowBlocking"); std::unique_ptr font_list(new base::ListValue); Microsoft::WRL::ComPtr factory; gfx::win::CreateDWriteFactory(&factory); if (!factory) return font_list; Microsoft::WRL::ComPtr collection; if (FAILED(factory->GetSystemFontCollection(&collection))) return font_list; // Retrieve the localized font family name. If there is no localized name, // used the native name instead. std::string locale = base::i18n::GetConfiguredLocale(); const UINT32 family_count = collection->GetFontFamilyCount(); for (UINT32 family_index = 0; family_index < family_count; ++family_index) { Microsoft::WRL::ComPtr font_family; Microsoft::WRL::ComPtr family_names; if (FAILED(collection->GetFontFamily(family_index, &font_family)) || FAILED(font_family->GetFamilyNames(&family_names))) { continue; } // Retrieve the native font family name. Try the "en-us" locale and if it's // not present, used the first available localized name. base::Optional native_name = gfx::win::RetrieveLocalizedString(family_names.Get(), "en-us"); if (!native_name) { native_name = gfx::win::RetrieveLocalizedString(family_names.Get(), ""); if (!native_name) continue; } base::Optional localized_name = gfx::win::RetrieveLocalizedString(family_names.Get(), locale); if (!localized_name) localized_name = native_name; auto font_item = std::make_unique(); font_item->AppendString(native_name.value()); font_item->AppendString(localized_name.value()); font_list->Append(std::move(font_item)); } return font_list; } } // namespace content