Hook up optional FontList instance to FontContext.

This commit is contained in:
Brian J. Burg 2012-11-08 15:23:28 -08:00
parent eacf27263e
commit 577303514d
10 changed files with 62 additions and 17 deletions

@ -1 +1 @@
Subproject commit 22ff767266abfeeab508da705a4a75c23a77a291
Subproject commit 925aad58aad897c8cf90377adc7c2fdbdb63d132

@ -1 +1 @@
Subproject commit 03050d5d816462582c4506e1fb6f507b5c6653bc
Subproject commit c1450887c2e21a4cddfa57c4d3fc4d4eb02da425

View file

@ -12,11 +12,13 @@ pub use display_list::DisplayItem;
pub use display_list::DisplayList;
pub use font::Font;
pub use font::FontDescriptor;
pub use font::FontFamily;
pub use font::FontGroup;
pub use font::FontSelector;
pub use font::FontStyle;
pub use font::RunMetrics;
pub use font_context::FontContext;
pub use font_list::FontList;
pub use geometry::Au;
pub use render_context::RenderContext;

View file

@ -148,9 +148,9 @@ pub enum FontSelector {
// TODO(Issue #181): use deriving for trivial cmp::Eq implementations
pub impl FontSelector : cmp::Eq {
pure fn eq(other: &FontSelector) -> bool {
match (self, *other) {
(SelectorStubDummy, SelectorStubDummy) => true,
(SelectorPlatformName(a), SelectorPlatformName(b)) => a == b,
match (&self, other) {
(&SelectorStubDummy, &SelectorStubDummy) => true,
(&SelectorPlatformName(a), &SelectorPlatformName(b)) => a == b,
_ => false
}
}

View file

@ -3,6 +3,7 @@ use dvec::DVec;
use util::cache;
use gfx::{
FontDescriptor,
FontList,
FontSelector,
FontStyle,
};
@ -51,15 +52,19 @@ pub impl FontContextHandle {
pub struct FontContext {
instance_cache: cache::MonoCache<FontDescriptor, @Font>,
font_list: Option<FontList>, // only needed by layout
handle: FontContextHandle,
}
pub impl FontContext {
static fn new() -> FontContext {
static fn new(needs_font_list: bool) -> FontContext {
let handle = FontContextHandle::new();
let font_list = if needs_font_list { Some(FontList::new(&handle)) } else { None };
FontContext {
// TODO(Rust #3902): remove extraneous type parameters once they are inferred correctly.
instance_cache: cache::new::<FontDescriptor, @Font, cache::MonoCache<FontDescriptor, @Font>>(10),
handle: FontContextHandle::new()
font_list: move font_list,
handle: move handle,
}
}

View file

@ -1,3 +1,9 @@
use gfx::{
FontFamily,
};
use dvec::DVec;
#[cfg(target_os = "macos")]
type FontListHandle/& = quartz::font_list::QuartzFontListHandle;
@ -6,12 +12,38 @@ type FontListHandle/& = freetype::font_list::FreeTypeFontListHandle;
pub impl FontListHandle {
#[cfg(target_os = "macos")]
static pub fn new() -> FontListHandle {
quartz::font_list::QuartzFontListHandle::new()
static pub fn new(fctx: &native::FontContextHandle) -> Result<FontListHandle, ()> {
Ok(quartz::font_list::QuartzFontListHandle::new(fctx))
}
#[cfg(target_os = "linux")]
static pub fn new() -> FontListHandle {
freetype::font_list::FreeTypeFontListHandle::new()
static pub fn new(fctx: &native::FontContextHandle) -> Result<FontListHandle, ()> {
Ok(freetype::font_list::FreeTypeFontListHandle::new(fctx))
}
}
pub struct FontList {
families: DVec<@FontFamily>,
handle: FontListHandle,
}
pub impl FontList {
static fn new(fctx: &native::FontContextHandle) -> FontList {
let handle = result::unwrap(FontListHandle::new(fctx));
let list = FontList {
handle: move handle,
families: DVec(),
};
list.refresh(fctx);
return move list;
}
priv fn refresh(fctx: &native::FontContextHandle) {
// TODO: don't refresh unless something actually changed.
// Does OSX have a notification for this event?
// It would be better to do piecemeal.
do self.families.swap |_old_families: ~[@FontFamily]| {
self.handle.get_available_families(fctx)
}
}
}

View file

@ -5,4 +5,5 @@ Note that you still must define each of the files as a module in
servo.rc. This is not ideal and may be changed in the future. */
pub use font::FontHandle;
pub use font_context::FontContextHandle;
pub use font_context::FontContextHandle;
pub use font_list::FontListHandle;

View file

@ -5,7 +5,11 @@ use cf = core_foundation;
use cf::array::CFArray;
use ct = core_text;
use ct::font_collection::CTFontCollection;
use ct::font_descriptor::{CTFontDescriptor, CTFontDescriptorRef};
use ct::font_descriptor::{
CTFontDescriptor,
CTFontDescriptorRef,
debug_descriptor,
};
use gfx::font::FontFamily;
@ -16,15 +20,16 @@ pub struct QuartzFontListHandle {
}
pub impl QuartzFontListHandle {
static pub fn new() -> QuartzFontListHandle {
static pub fn new(_fctx: &native::FontContextHandle) -> QuartzFontListHandle {
QuartzFontListHandle { collection: CTFontCollection::new() }
}
fn get_available_families(_fctx: FontContext) -> ~[@FontFamily] {
fn get_available_families(_fctx: &native::FontContextHandle) -> ~[@FontFamily] {
// TODO: make a hashtable from family name to DVec<FontEntry>
let descriptors : CFArray<CTFontDescriptorRef, CTFontDescriptor>;
descriptors = self.collection.get_descriptors();
for descriptors.each |desc: &CTFontDescriptor| {
debug!("%?", { debug_descriptor(desc); () });
// TODO: for each descriptor, make a FontEntry.
// TODO: append FontEntry to hashtable value
}

View file

@ -41,7 +41,7 @@ pub fn RenderTask<C: Compositor Send>(compositor: C) -> RenderTask {
port: po,
compositor: move compositor,
mut layer_buffer_set_port: Cell(move layer_buffer_set_port),
font_ctx: @FontContext::new(),
font_ctx: @FontContext::new(false),
}.start();
}
}

View file

@ -89,7 +89,7 @@ fn Layout(render_task: RenderTask,
image_cache_task: ImageCacheTask,
from_content: comm::Port<Msg>) -> Layout {
let fctx = @FontContext::new();
let fctx = @FontContext::new(true);
Layout {
render_task: render_task,