/*
* Copyright (C) 2017 Google Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "third_party/blink/renderer/platform/fonts/font_cache.h"
#include "skia/ext/font_utils.h"
#include "third_party/blink/renderer/platform/fonts/font_platform_data.h"
namespace blink {
static AtomicString& MutableSystemFontFamily() {
DEFINE_THREAD_SAFE_STATIC_LOCAL(AtomicString, system_font_family, ());
return system_font_family;
}
// static
const AtomicString& FontCache::SystemFontFamily() {
return MutableSystemFontFamily();
}
// static
void FontCache::SetSystemFontFamily(const AtomicString& family_name) {
DCHECK(!family_name.empty());
MutableSystemFontFamily() = family_name;
}
const SimpleFontData* FontCache::PlatformFallbackFontForCharacter(
const FontDescription& font_description,
UChar32 character,
const SimpleFontData* font_data_to_substitute,
FontFallbackPriority fallback_priority) {
sk_sp<SkFontMgr> font_mgr(skia::DefaultFontMgr());
std::string family_name = font_description.Family().FamilyName().Utf8();
Bcp47Vector locales =
GetBcp47LocaleForRequest(font_description, fallback_priority);
sk_sp<SkTypeface> typeface(font_mgr->matchFamilyStyleCharacter(
family_name.c_str(), font_description.SkiaFontStyle(), locales.data(),
locales.size(), character));
if (!typeface)
return nullptr;
bool synthetic_bold = font_description.IsSyntheticBold() &&
!typeface->isBold() &&
font_description.SyntheticBoldAllowed();
bool synthetic_italic = font_description.IsSyntheticItalic() &&
!typeface->isItalic() &&
font_description.SyntheticItalicAllowed();
const auto* font_data = MakeGarbageCollected<FontPlatformData>(
std::move(typeface), std::string(), font_description.EffectiveFontSize(),
synthetic_bold, synthetic_italic, font_description.TextRendering(),
ResolvedFontFeatures(), font_description.Orientation());
return FontDataFromFontPlatformData(font_data);
}
} // namespace blink