/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
bool FcPatternAllowsBitmaps(FcPattern* aPattern, bool aAntialias, bool aHinting) { if (!aAntialias) { // Always allow bitmaps when antialiasing is disabled returntrue;
}
FcBool bitmap; if (FcPatternGetBool(aPattern, FC_EMBEDDED_BITMAP, 0, &bitmap) !=
FcResultMatch ||
!bitmap) { // If bitmaps were explicitly disabled, then disallow them returnfalse;
} if (aHinting) { // If hinting is used and bitmaps were enabled, then allow them returntrue;
} // When hinting is disabled, then avoid loading bitmaps from outline // fonts. However, emoji fonts may have no outlines while containing // bitmaps intended to be scaled, so still allow those.
FcBool outline; if (FcPatternGetBool(aPattern, FC_OUTLINE, 0, &outline) == FcResultMatch &&
outline) { returnfalse;
}
FcBool scalable; if (FcPatternGetBool(aPattern, FC_SCALABLE, 0, &scalable) != FcResultMatch ||
!scalable) { returnfalse;
} returntrue;
}
// For printer fonts, Cairo hint metrics and hinting will be disabled. // For other fonts, allow hint metrics and hinting.
FcBool printing; if (FcPatternGetBool(aPattern, "gfx.printing", 0, &printing) !=
FcResultMatch ||
!printing) {
mFlags |= HINT_METRICS;
FcBool hinting; if (FcPatternGetBool(aPattern, FC_HINTING, 0, &hinting) != FcResultMatch ||
hinting) { int hintstyle; if (FcPatternGetInteger(aPattern, FC_HINT_STYLE, 0, &hintstyle) !=
FcResultMatch) {
hintstyle = FC_HINT_FULL;
} switch (hintstyle) { case FC_HINT_SLIGHT:
mHinting = FontHinting::LIGHT; break; case FC_HINT_MEDIUM:
mHinting = FontHinting::NORMAL; break; case FC_HINT_FULL:
mHinting = FontHinting::FULL; break; case FC_HINT_NONE: default: break;
}
}
}
FcBool antialias; if (FcPatternGetBool(aPattern, FC_ANTIALIAS, 0, &antialias) ==
FcResultMatch &&
!antialias) { // If AA is explicitly disabled, leave bitmaps enabled.
mFlags |= EMBEDDED_BITMAP;
} else {
mAntialias = AntialiasMode::GRAY;
// Otherwise, if AA is enabled, disable embedded bitmaps unless explicitly // enabled. if (FcPatternAllowsBitmaps(aPattern, true, mHinting != FontHinting::NONE)) {
mFlags |= EMBEDDED_BITMAP;
}
// Only record subpixel order and lcd filtering if antialiasing is enabled. int rgba; if (mFlags & HINT_METRICS &&
FcPatternGetInteger(aPattern, FC_RGBA, 0, &rgba) == FcResultMatch) { switch (rgba) { case FC_RGBA_RGB: case FC_RGBA_BGR: case FC_RGBA_VRGB: case FC_RGBA_VBGR:
mAntialias = AntialiasMode::SUBPIXEL; if (rgba == FC_RGBA_VRGB || rgba == FC_RGBA_VBGR) {
mFlags |= LCD_VERTICAL;
} if (rgba == FC_RGBA_BGR || rgba == FC_RGBA_VBGR) {
mFlags |= SUBPIXEL_BGR;
} break; case FC_RGBA_NONE: case FC_RGBA_UNKNOWN: default: break;
}
}
int filter; if (mAntialias == AntialiasMode::SUBPIXEL &&
FcPatternGetInteger(aPattern, FC_LCD_FILTER, 0, &filter) ==
FcResultMatch) { switch (filter) { case FC_LCD_NONE:
mLcdFilter = FT_LCD_FILTER_NONE; break; case FC_LCD_DEFAULT:
mLcdFilter = FT_LCD_FILTER_DEFAULT; break; case FC_LCD_LIGHT:
mLcdFilter = FT_LCD_FILTER_LIGHT; break; case FC_LCD_LEGACY: default: break;
}
}
}
}
ScaledFontFontconfig::InstanceData::InstanceData( const wr::FontInstanceOptions* aOptions, const wr::FontInstancePlatformOptions* aPlatformOptions)
: mFlags(HINT_METRICS),
mAntialias(AntialiasMode::NONE),
mHinting(FontHinting::FULL),
mLcdFilter(FT_LCD_FILTER_LEGACY) { if (aOptions) { if (aOptions->flags & wr::FontInstanceFlags::FORCE_AUTOHINT) {
mFlags |= AUTOHINT;
} if (aOptions->flags & wr::FontInstanceFlags::EMBEDDED_BITMAPS) {
mFlags |= EMBEDDED_BITMAP;
} if (aOptions->flags & wr::FontInstanceFlags::SYNTHETIC_BOLD) {
mFlags |= EMBOLDEN;
} if (aOptions->render_mode == wr::FontRenderMode::Subpixel) {
mAntialias = AntialiasMode::SUBPIXEL; if (aOptions->flags & wr::FontInstanceFlags::SUBPIXEL_BGR) {
mFlags |= SUBPIXEL_BGR;
} if (aOptions->flags & wr::FontInstanceFlags::LCD_VERTICAL) {
mFlags |= LCD_VERTICAL;
}
} elseif (aOptions->render_mode != wr::FontRenderMode::Mono) {
mAntialias = AntialiasMode::GRAY;
}
} if (aPlatformOptions) { switch (aPlatformOptions->hinting) { case wr::FontHinting::None:
mHinting = FontHinting::NONE; break; case wr::FontHinting::Light:
mHinting = FontHinting::LIGHT; break; case wr::FontHinting::Normal:
mHinting = FontHinting::NORMAL; break; default: break;
} switch (aPlatformOptions->lcd_filter) { case wr::FontLCDFilter::None:
mLcdFilter = FT_LCD_FILTER_NONE; break; case wr::FontLCDFilter::Default:
mLcdFilter = FT_LCD_FILTER_DEFAULT; break; case wr::FontLCDFilter::Light:
mLcdFilter = FT_LCD_FILTER_LIGHT; break; default: break;
}
}
}
void ScaledFontFontconfig::InstanceData::SetupFontOptions(
cairo_font_options_t* aFontOptions, int* aOutLoadFlags, unsignedint* aOutSynthFlags) const { // For regular (non-printer) fonts, enable hint metrics as well as hinting // and (possibly subpixel) antialiasing.
cairo_font_options_set_hint_metrics(
aFontOptions,
mFlags & HINT_METRICS ? CAIRO_HINT_METRICS_ON : CAIRO_HINT_METRICS_OFF);
cairo_hint_style_t hinting; switch (mHinting) { case FontHinting::NONE:
hinting = CAIRO_HINT_STYLE_NONE; break; case FontHinting::LIGHT:
hinting = CAIRO_HINT_STYLE_SLIGHT; break; case FontHinting::NORMAL:
hinting = CAIRO_HINT_STYLE_MEDIUM; break; case FontHinting::FULL:
hinting = CAIRO_HINT_STYLE_FULL; break;
}
cairo_font_options_set_hint_style(aFontOptions, hinting);
// Try to build a sane initial set of Cairo font options based on the // Fontconfig pattern. int loadFlags = FT_LOAD_DEFAULT; unsignedint synthFlags = 0;
if (!(mFlags & EMBEDDED_BITMAP)) {
loadFlags |= FT_LOAD_NO_BITMAP;
} if (mFlags & AUTOHINT) {
loadFlags |= FT_LOAD_FORCE_AUTOHINT;
} if (mFlags & EMBOLDEN) {
synthFlags |= CAIRO_FT_SYNTHESIZE_BOLD;
}
if (HasVariationSettings()) {
UnscaledFontFreeType::GetVariationSettingsFromFace(aOutVariations,
mFace->GetFace());
}
returntrue;
}
already_AddRefed<ScaledFont> UnscaledFontFontconfig::CreateScaledFont( Float aSize, const uint8_t* aInstanceData, uint32_t aInstanceDataLength, const FontVariation* aVariations, uint32_t aNumVariations) { if (aInstanceDataLength < sizeof(ScaledFontFontconfig::InstanceData)) {
gfxWarning() << "Fontconfig scaled font instance data is truncated."; return nullptr;
} const ScaledFontFontconfig::InstanceData& instanceData =
*reinterpret_cast<const ScaledFontFontconfig::InstanceData*>(
aInstanceData);
RefPtr<SharedFTFace> face(InitFace()); if (!face) {
gfxWarning() << "Attempted to deserialize Fontconfig scaled font without " "FreeType face"; return nullptr;
}
if (aNumVariations > 0 && face->GetData()) { if (RefPtr<SharedFTFace> varFace = face->GetData()->CloneFace()) {
face = varFace;
}
}
// Only apply variations if we have an explicitly cloned face. if (aNumVariations > 0 && face != GetFace()) {
ApplyVariationsToFace(aVariations, aNumVariations, face->GetFace());
}
RefPtr<ScaledFontFontconfig> scaledFont = new ScaledFontFontconfig(std::move(face), instanceData, this, aSize);
bool ScaledFontFontconfig::HasVariationSettings() { // Check if the FT face has been cloned. return mFace &&
mFace->GetFace()->face_flags & FT_FACE_FLAG_MULTIPLE_MASTERS &&
mFace != static_cast<UnscaledFontFontconfig*>(mUnscaledFont.get())
->GetFace();
}
already_AddRefed<UnscaledFont> UnscaledFontFontconfig::CreateFromFontDescriptor( const uint8_t* aData, uint32_t aDataLength, uint32_t aIndex) { if (aDataLength == 0) {
gfxWarning() << "Fontconfig font descriptor is truncated."; return nullptr;
} constchar* path = reinterpret_cast<constchar*>(aData);
RefPtr<UnscaledFont> unscaledFont = new UnscaledFontFontconfig(std::string(path, aDataLength), aIndex); return unscaledFont.forget();
}
} // namespace mozilla::gfx
¤ Dauer der Verarbeitung: 0.19 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.