servo: Merge #11565 - Introduce FontFaceRules::effective_sources() (from nox:fonts); r=metajack

Source-Repo: https://github.com/servo/servo
Source-Revision: b64b21ace0e9b3639906c9dc988c66ea596f3d88
This commit is contained in:
Anthony Ramine 2016-06-07 03:50:18 -05:00
Родитель f292dafa41
Коммит 36ea45b7e1
2 изменённых файлов: 45 добавлений и 9 удалений

Просмотреть файл

@ -355,19 +355,23 @@ fn add_font_face_rules(stylesheet: &Stylesheet,
font_cache_thread: &FontCacheThread,
font_cache_sender: &IpcSender<()>,
outstanding_web_fonts_counter: &Arc<AtomicUsize>) {
for font_face in stylesheet.effective_rules(&device).font_face() {
for source in &font_face.sources {
if opts::get().load_webfonts_synchronously {
let (sender, receiver) = ipc::channel().unwrap();
if opts::get().load_webfonts_synchronously {
let (sender, receiver) = ipc::channel().unwrap();
for font_face in stylesheet.effective_rules(&device).font_face() {
for source in font_face.effective_sources() {
font_cache_thread.add_web_font(font_face.family.clone(),
(*source).clone(),
sender);
(*source).clone(),
sender.clone());
receiver.recv().unwrap();
} else {
}
}
} else {
for font_face in stylesheet.effective_rules(&device).font_face() {
for source in font_face.effective_sources() {
outstanding_web_fonts_counter.fetch_add(1, Ordering::SeqCst);
font_cache_thread.add_web_font(font_face.family.clone(),
(*source).clone(),
(*font_cache_sender).clone());
(*source).clone(),
(*font_cache_sender).clone());
}
}
}

Просмотреть файл

@ -6,6 +6,8 @@ use computed_values::font_family::FontFamily;
use cssparser::{AtRuleParser, DeclarationListParser, DeclarationParser, Parser};
use parser::{ParserContext, log_css_error};
use properties::longhands::font_family::parse_one_family;
use std::iter;
use std::slice;
use url::Url;
#[derive(Clone, Debug, HeapSizeOf, PartialEq, Eq, Deserialize, Serialize)]
@ -58,6 +60,36 @@ pub fn parse_font_face_block(context: &ParserContext, input: &mut Parser)
}
}
pub struct EffectiveSourcesIter<'a>(slice::Iter<'a, Source>);
impl FontFaceRule {
/// Returns the list of effective sources for that font-face, that is the
/// sources which don't list any format hint, or the ones which list at
/// least "truetype" or "opentype".
pub fn effective_sources(&self) -> EffectiveSourcesIter {
EffectiveSourcesIter(self.sources.iter())
}
}
impl<'a> iter::Iterator for EffectiveSourcesIter<'a> {
type Item = &'a Source;
fn next(&mut self) -> Option<&'a Source> {
self.0.find(|source| {
if let Source::Url(ref url_source) = **source {
let hints = &url_source.format_hints;
// We support only opentype fonts and truetype is an alias for
// that format. Sources without format hints need to be
// downloaded in case we support them.
hints.is_empty() || hints.iter().any(|hint| {
hint == "truetype" || hint == "opentype" || hint == "woff"
})
} else {
true
}
})
}
}
enum FontFaceDescriptorDeclaration {
Family(FontFamily),
Src(Vec<Source>),