Switch to use CGFont binding. Give out the same CGFont for each new ScaledFont. Closes #152. Closes #184.

This commit is contained in:
Brian J. Burg 2012-11-16 15:20:54 -08:00
parent 786746d3c6
commit 7fbba0b441
6 changed files with 18 additions and 25 deletions

@ -1 +1 @@
Subproject commit 8db099ac74ddb4e416eef8f2d237d4ec47787fbe Subproject commit 55b0d15f154986d85a53893e198ab6c750c0b728

@ -1 +1 @@
Subproject commit 04c0856f7d3e3c600463c0a205556c65bf74bdf3 Subproject commit eec9e9f417d2efad4710e6fa601030810fe92a4e

@ -1 +1 @@
Subproject commit 55de520630efbaef7de03832b6d3621d2b4b4d29 Subproject commit c413a96a8c6b70815b4d5ad7469c7983af417728

@ -1 +1 @@
Subproject commit ea18d1d47385d64f6a7938c4a9e68423084c9657 Subproject commit 2b306ea65aaa348ec3158588fa78779fd4a1629b

View file

@ -355,9 +355,9 @@ impl Font {
#[cfg(target_os="macos")] #[cfg(target_os="macos")]
priv fn create_azure_font() -> ScaledFont { priv fn create_azure_font() -> ScaledFont {
let ct_font = &self.handle.ctfont; let cg_font = self.handle.get_CGFont();
let size = self.style.pt_size as AzFloat; let size = self.style.pt_size as AzFloat;
ScaledFont::new(self.backend, ct_font, size) ScaledFont::new(self.backend, &cg_font, size)
} }
#[cfg(target_os="linux")] #[cfg(target_os="linux")]

View file

@ -6,6 +6,7 @@ use cf = core_foundation;
use cf::base::{ use cf::base::{
CFIndex, CFIndex,
CFTypeRef, CFTypeRef,
CFWrapper,
}; };
use cf::data::{CFData, CFDataRef}; use cf::data::{CFData, CFDataRef};
use cf::string::UniChar; use cf::string::UniChar;
@ -13,7 +14,7 @@ use cg = core_graphics;
use cg::base::{CGFloat, CGAffineTransform}; use cg::base::{CGFloat, CGAffineTransform};
use cg::data_provider::{CGDataProviderRef, CGDataProvider}; use cg::data_provider::{CGDataProviderRef, CGDataProvider};
use cg::font::{CGFontCreateWithDataProvider, CGFontRef, CGFontRelease, CGGlyph}; use cg::font::{CGFont, CGFontRef, CGGlyph};
use cg::geometry::CGRect; use cg::geometry::CGRect;
use ct = core_text; use ct = core_text;
@ -65,32 +66,24 @@ pub impl QuartzFontTable : FontTableMethods {
} }
pub struct QuartzFontHandle { pub struct QuartzFontHandle {
priv mut cgfont: Option<CGFontRef>, priv mut cgfont: Option<CGFont>,
ctfont: CTFont, ctfont: CTFont,
drop { drop { }
// TODO(Issue #152): use a wrapped CGFont.
do (copy self.cgfont).iter |cgfont| {
assert cgfont.is_not_null();
CGFontRelease(*cgfont);
}
}
} }
pub impl QuartzFontHandle { pub impl QuartzFontHandle {
static fn new_from_buffer(_fctx: &QuartzFontContextHandle, buf: ~[u8], static fn new_from_buffer(_fctx: &QuartzFontContextHandle, buf: ~[u8],
style: &SpecifiedFontStyle) -> Result<QuartzFontHandle, ()> { style: &SpecifiedFontStyle) -> Result<QuartzFontHandle, ()> {
let fontprov = vec::as_imm_buf(buf, |cbuf, len| { let fontprov : CGDataProvider = vec::as_imm_buf(buf, |cbuf, len| {
cg::data_provider::new_from_buffer(cbuf, len) cg::data_provider::new_from_buffer(cbuf, len)
}); });
let cgfont = CGFontCreateWithDataProvider(*fontprov.borrow_ref()); let cgfont = cg::font::create_with_data_provider(&fontprov);
if cgfont.is_null() { return Err(()); } let ctfont = ct::font::new_from_CGFont(&cgfont, style.pt_size);
let ctfont = ct::font::new_from_CGFont(cgfont, style.pt_size);
let result = Ok(QuartzFontHandle { let result = Ok(QuartzFontHandle {
cgfont : Some(cgfont), cgfont : Some(move cgfont),
ctfont : move ctfont, ctfont : move ctfont,
}); });
@ -106,13 +99,13 @@ pub impl QuartzFontHandle {
return move result; return move result;
} }
fn get_CGFont() -> CGFontRef { fn get_CGFont() -> CGFont {
match self.cgfont { match self.cgfont {
Some(cg) => cg, Some(ref font) => move CFWrapper::wrap_shared(*font.borrow_ref()),
None => { None => {
let cgfont = self.ctfont.copy_to_CGFont(); let cgfont = self.ctfont.copy_to_CGFont();
self.cgfont = Some(cgfont); self.cgfont = Some(CFWrapper::clone(&cgfont));
cgfont move cgfont
} }
} }
} }