Implement basic last-resort font selection.

This commit is contained in:
Caitlin Potter 2013-05-29 03:43:33 -04:00
parent 8ee1b5f57a
commit 24ef69dccb
4 changed files with 26 additions and 2 deletions

View file

@ -112,14 +112,14 @@ pub impl<'self> FontContext {
debug!("(create font group) --- starting ---"); debug!("(create font group) --- starting ---");
let list = self.get_font_list();
// TODO(Issue #193): make iteration over 'font-family' more robust. // TODO(Issue #193): make iteration over 'font-family' more robust.
for str::each_split_char(style.families, ',') |family| { for str::each_split_char(style.families, ',') |family| {
let family_name = str::trim(family); let family_name = str::trim(family);
let transformed_family_name = self.transform_family(family_name); let transformed_family_name = self.transform_family(family_name);
debug!("(create font group) transformed family is `%s`", transformed_family_name); debug!("(create font group) transformed family is `%s`", transformed_family_name);
let list = self.get_font_list();
let result = list.find_font_in_family(transformed_family_name, style); let result = list.find_font_in_family(transformed_family_name, style);
let mut found = false; let mut found = false;
for result.each |font_entry| { for result.each |font_entry| {
@ -134,6 +134,16 @@ pub impl<'self> FontContext {
} }
} }
let last_resort = FontList::get_last_resort_font_families();
for last_resort.each |family| {
let result = list.find_font_in_family(*family,style);
for result.each |font_entry| {
let instance = Font::new_from_existing_handle(self, &font_entry.handle, style, self.backend);
do result::iter(&instance) |font: &@mut Font| { fonts.push(*font); }
}
}
assert!(fonts.len() > 0); assert!(fonts.len() > 0);
// TODO(Issue #179): Split FontStyle into specified and used styles // TODO(Issue #179): Split FontStyle into specified and used styles
let used_style = copy *style; let used_style = copy *style;

View file

@ -19,6 +19,7 @@ pub type FontFamilyMap = HashMap<~str, @mut FontFamily>;
trait FontListHandleMethods { trait FontListHandleMethods {
fn get_available_families(&self, fctx: &FontContextHandle) -> FontFamilyMap; fn get_available_families(&self, fctx: &FontContextHandle) -> FontFamilyMap;
fn load_variations_for_family(&self, family: @mut FontFamily); fn load_variations_for_family(&self, family: @mut FontFamily);
fn get_last_resort_font_families() -> ~[~str];
} }
/// The platform-independent font list abstraction. /// The platform-independent font list abstraction.
@ -86,6 +87,11 @@ pub impl FontList {
// TODO(Issue #188): look up localized font family names if canonical name not found // TODO(Issue #188): look up localized font family names if canonical name not found
family.map(|f| **f) family.map(|f| **f)
} }
pub fn get_last_resort_font_families() -> ~[~str] {
let last_resort = FontListHandle::get_last_resort_font_families();
last_resort
}
} }
// Holds a specific font family, and the various // Holds a specific font family, and the various

View file

@ -125,6 +125,10 @@ pub impl FontListHandle {
FcObjectSetDestroy(object_set); FcObjectSetDestroy(object_set);
} }
} }
fn get_last_resort_font_families() -> ~[~str] {
~[~"Arial"]
}
} }
struct AutoPattern { struct AutoPattern {

View file

@ -55,4 +55,8 @@ pub impl FontListHandle {
family.entries.push(entry) family.entries.push(entry)
} }
} }
fn get_last_resort_font_families() -> ~[~str] {
~[~"Arial Unicode MS",~"Arial"]
}
} }