mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
fonts: Add support for generic font families and font size configuration (#32673)
This adds support for generic font families in Servo and allows for configuration of them as well as their default font sizes. One interesting fix here is that now monospace default to 13px, like it does in other browsers. In addition to that, this exposes a new interface in Stylo which allows setting a default style. This is quite useful for fonts, but also for other kinds of default style settings -- like text zoom. Fixes #8371. Fixes #14773. Signed-off-by: Martin Robinson <mrobinson@igalia.com> Co-authored-by: Mukilan Thiyagarajan <mukilan@igalia.com>
This commit is contained in:
parent
956b7f62e0
commit
77e9e3deba
32 changed files with 397 additions and 300 deletions
|
@ -16,11 +16,12 @@ use log::debug;
|
|||
use malloc_size_of_derive::MallocSizeOf;
|
||||
use parking_lot::RwLock;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use servo_atoms::{atom, Atom};
|
||||
use smallvec::SmallVec;
|
||||
use style::computed_values::font_variant_caps;
|
||||
use style::properties::style_structs::Font as FontStyleStruct;
|
||||
use style::values::computed::font::{GenericFontFamily, SingleFontFamily};
|
||||
use style::values::computed::font::{
|
||||
FamilyName, FontFamilyNameSyntax, GenericFontFamily, SingleFontFamily,
|
||||
};
|
||||
use style::values::computed::{FontStretch, FontStyle, FontWeight};
|
||||
use unicode_script::Script;
|
||||
use webrender_api::{FontInstanceFlags, FontInstanceKey};
|
||||
|
@ -629,10 +630,18 @@ impl FontGroup {
|
|||
TemplatePredicate: Fn(FontTemplateRef) -> bool,
|
||||
FontPredicate: Fn(&FontRef) -> bool,
|
||||
{
|
||||
iter::once(FontFamilyDescriptor::serif())
|
||||
.chain(fallback_font_families(options).into_iter().map(|family| {
|
||||
FontFamilyDescriptor::new(FontFamilyName::from(family), FontSearchScope::Local)
|
||||
}))
|
||||
iter::once(FontFamilyDescriptor::default())
|
||||
.chain(
|
||||
fallback_font_families(options)
|
||||
.into_iter()
|
||||
.map(|family_name| {
|
||||
let family = SingleFontFamily::FamilyName(FamilyName {
|
||||
name: family_name.into(),
|
||||
syntax: FontFamilyNameSyntax::Quoted,
|
||||
});
|
||||
FontFamilyDescriptor::new(family, FontSearchScope::Local)
|
||||
}),
|
||||
)
|
||||
.filter_map(|family_descriptor| {
|
||||
FontGroupFamily {
|
||||
family_descriptor,
|
||||
|
@ -675,11 +684,8 @@ struct FontGroupFamily {
|
|||
|
||||
impl FontGroupFamily {
|
||||
fn new(family: &SingleFontFamily) -> FontGroupFamily {
|
||||
let family_descriptor =
|
||||
FontFamilyDescriptor::new(FontFamilyName::from(family), FontSearchScope::Any);
|
||||
|
||||
FontGroupFamily {
|
||||
family_descriptor,
|
||||
family_descriptor: FontFamilyDescriptor::new(family.clone(), FontSearchScope::Any),
|
||||
members: None,
|
||||
}
|
||||
}
|
||||
|
@ -781,73 +787,24 @@ pub enum FontSearchScope {
|
|||
Local,
|
||||
}
|
||||
|
||||
/// A font family name used in font selection.
|
||||
#[derive(Clone, Debug, Deserialize, Eq, Hash, MallocSizeOf, PartialEq, Serialize)]
|
||||
pub enum FontFamilyName {
|
||||
/// A specific name such as `"Arial"`
|
||||
Specific(Atom),
|
||||
|
||||
/// A generic name such as `sans-serif`
|
||||
Generic(Atom),
|
||||
}
|
||||
|
||||
impl FontFamilyName {
|
||||
pub fn name(&self) -> &str {
|
||||
match *self {
|
||||
FontFamilyName::Specific(ref name) => name,
|
||||
FontFamilyName::Generic(ref name) => name,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> From<&'a SingleFontFamily> for FontFamilyName {
|
||||
fn from(other: &'a SingleFontFamily) -> FontFamilyName {
|
||||
match *other {
|
||||
SingleFontFamily::FamilyName(ref family_name) => {
|
||||
FontFamilyName::Specific(family_name.name.clone())
|
||||
},
|
||||
|
||||
SingleFontFamily::Generic(generic) => FontFamilyName::Generic(match generic {
|
||||
GenericFontFamily::None => panic!("Shouldn't appear in style"),
|
||||
GenericFontFamily::Serif => atom!("serif"),
|
||||
GenericFontFamily::SansSerif => atom!("sans-serif"),
|
||||
GenericFontFamily::Monospace => atom!("monospace"),
|
||||
GenericFontFamily::Cursive => atom!("cursive"),
|
||||
GenericFontFamily::Fantasy => atom!("fantasy"),
|
||||
GenericFontFamily::SystemUi => atom!("system-ui"),
|
||||
}),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> From<&'a str> for FontFamilyName {
|
||||
fn from(other: &'a str) -> FontFamilyName {
|
||||
FontFamilyName::Specific(Atom::from(other))
|
||||
}
|
||||
}
|
||||
|
||||
/// The font family parameters for font selection.
|
||||
#[derive(Clone, Debug, Deserialize, Eq, Hash, MallocSizeOf, PartialEq, Serialize)]
|
||||
pub struct FontFamilyDescriptor {
|
||||
pub name: FontFamilyName,
|
||||
pub family: SingleFontFamily,
|
||||
pub scope: FontSearchScope,
|
||||
}
|
||||
|
||||
impl FontFamilyDescriptor {
|
||||
pub fn new(name: FontFamilyName, scope: FontSearchScope) -> FontFamilyDescriptor {
|
||||
FontFamilyDescriptor { name, scope }
|
||||
pub fn new(family: SingleFontFamily, scope: FontSearchScope) -> FontFamilyDescriptor {
|
||||
FontFamilyDescriptor { family, scope }
|
||||
}
|
||||
|
||||
fn serif() -> FontFamilyDescriptor {
|
||||
fn default() -> FontFamilyDescriptor {
|
||||
FontFamilyDescriptor {
|
||||
name: FontFamilyName::Generic(atom!("serif")),
|
||||
family: SingleFontFamily::Generic(GenericFontFamily::None),
|
||||
scope: FontSearchScope::Local,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn name(&self) -> &str {
|
||||
self.name.name()
|
||||
}
|
||||
}
|
||||
|
||||
/// Given a mapping array `mapping` and a value, map that value onto
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue