mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Rename NativeFont to FontHandle.
This commit is contained in:
parent
75a88e4f08
commit
a3f4b52c90
9 changed files with 68 additions and 62 deletions
|
@ -14,7 +14,6 @@ pub use font_cache::FontCache;
|
||||||
pub use font_context::FontContext;
|
pub use font_context::FontContext;
|
||||||
pub use font_matcher::FontMatcher;
|
pub use font_matcher::FontMatcher;
|
||||||
pub use geometry::Au;
|
pub use geometry::Au;
|
||||||
pub use native_font::NativeFont;
|
|
||||||
pub use shaper::Shaper;
|
pub use shaper::Shaper;
|
||||||
pub use text_run::TextRun;
|
pub use text_run::TextRun;
|
||||||
pub use text_run::SendableTextRun;
|
pub use text_run::SendableTextRun;
|
||||||
|
|
|
@ -10,6 +10,8 @@ use geom::{Point2D, Rect, Size2D};
|
||||||
use glyph::{GlyphStore, GlyphIndex};
|
use glyph::{GlyphStore, GlyphIndex};
|
||||||
use servo_util::range::Range;
|
use servo_util::range::Range;
|
||||||
|
|
||||||
|
use native::FontHandle;
|
||||||
|
|
||||||
// Used to abstract over the shaper's choice of fixed int representation.
|
// Used to abstract over the shaper's choice of fixed int representation.
|
||||||
type FractionalPixel = float;
|
type FractionalPixel = float;
|
||||||
|
|
||||||
|
@ -72,7 +74,7 @@ and the renderer can use it to render text.
|
||||||
*/
|
*/
|
||||||
struct Font {
|
struct Font {
|
||||||
priv fontbuf: @~[u8],
|
priv fontbuf: @~[u8],
|
||||||
priv native_font: NativeFont,
|
priv handle: FontHandle,
|
||||||
priv mut azure_font: Option<AzScaledFontRef>,
|
priv mut azure_font: Option<AzScaledFontRef>,
|
||||||
priv mut shaper: Option<@Shaper>,
|
priv mut shaper: Option<@Shaper>,
|
||||||
style: FontStyle,
|
style: FontStyle,
|
||||||
|
@ -86,12 +88,12 @@ struct Font {
|
||||||
|
|
||||||
impl Font {
|
impl Font {
|
||||||
// TODO: who should own fontbuf?
|
// TODO: who should own fontbuf?
|
||||||
static fn new(fontbuf: @~[u8], native_font: NativeFont, style: FontStyle) -> Font {
|
static fn new(fontbuf: @~[u8], handle: FontHandle, style: FontStyle) -> Font {
|
||||||
let metrics = native_font.get_metrics();
|
let metrics = handle.get_metrics();
|
||||||
|
|
||||||
Font {
|
Font {
|
||||||
fontbuf : fontbuf,
|
fontbuf : fontbuf,
|
||||||
native_font : move native_font,
|
handle : move handle,
|
||||||
azure_font: None,
|
azure_font: None,
|
||||||
shaper: None,
|
shaper: None,
|
||||||
style: move style,
|
style: move style,
|
||||||
|
@ -151,7 +153,7 @@ impl Font {
|
||||||
fn get_cairo_face(font: &Font) -> *cairo_font_face_t {
|
fn get_cairo_face(font: &Font) -> *cairo_font_face_t {
|
||||||
use cairo::cairo_ft::bindgen::{cairo_ft_font_face_create_for_ft_face};
|
use cairo::cairo_ft::bindgen::{cairo_ft_font_face_create_for_ft_face};
|
||||||
|
|
||||||
let ftface = font.native_font.face;
|
let ftface = font.handle.face;
|
||||||
let cface = cairo_ft_font_face_create_for_ft_face(ftface, 0 as c_int);
|
let cface = cairo_ft_font_face_create_for_ft_face(ftface, 0 as c_int);
|
||||||
// FIXME: error handling
|
// FIXME: error handling
|
||||||
return cface;
|
return cface;
|
||||||
|
@ -161,7 +163,7 @@ impl Font {
|
||||||
fn get_cairo_face(font: &Font) -> *cairo_font_face_t {
|
fn get_cairo_face(font: &Font) -> *cairo_font_face_t {
|
||||||
use cairo::cairo_quartz::bindgen::cairo_quartz_font_face_create_for_cgfont;
|
use cairo::cairo_quartz::bindgen::cairo_quartz_font_face_create_for_cgfont;
|
||||||
|
|
||||||
let cgfont = font.native_font.cgfont;
|
let cgfont = font.handle.cgfont;
|
||||||
let face = cairo_quartz_font_face_create_for_cgfont(cgfont);
|
let face = cairo_quartz_font_face_create_for_cgfont(cgfont);
|
||||||
// FIXME: error handling
|
// FIXME: error handling
|
||||||
return face;
|
return face;
|
||||||
|
@ -318,11 +320,11 @@ pub impl Font : FontMethods {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn glyph_index(codepoint: char) -> Option<GlyphIndex> {
|
fn glyph_index(codepoint: char) -> Option<GlyphIndex> {
|
||||||
self.native_font.glyph_index(codepoint)
|
self.handle.glyph_index(codepoint)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn glyph_h_advance(glyph: GlyphIndex) -> FractionalPixel {
|
fn glyph_h_advance(glyph: GlyphIndex) -> FractionalPixel {
|
||||||
match self.native_font.glyph_h_advance(glyph) {
|
match self.handle.glyph_h_advance(glyph) {
|
||||||
Some(adv) => adv,
|
Some(adv) => adv,
|
||||||
None => /* FIXME: Need fallback strategy */ 10f as FractionalPixel
|
None => /* FIXME: Need fallback strategy */ 10f as FractionalPixel
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
use font::{Font, FontStyle, FontWeight300};
|
use font::{Font, FontStyle, FontWeight300};
|
||||||
use native_font::NativeFont;
|
use native::{FontHandle, FontContext};
|
||||||
use font_context::FontContext;
|
|
||||||
|
|
||||||
// TODO(Issue #164): delete, and get default font from NativeFontMatcher
|
// TODO(Issue #164): delete, and get default font from font list
|
||||||
const TEST_FONT: [u8 * 33004] = #include_bin("JosefinSans-SemiBold.ttf");
|
const TEST_FONT: [u8 * 33004] = #include_bin("JosefinSans-SemiBold.ttf");
|
||||||
|
|
||||||
fn test_font_bin() -> ~[u8] {
|
fn test_font_bin() -> ~[u8] {
|
||||||
|
@ -44,7 +43,7 @@ impl FontCache {
|
||||||
// TODO: maybe FontStyle should be canonicalized when used in FontCache?
|
// TODO: maybe FontStyle should be canonicalized when used in FontCache?
|
||||||
priv fn create_font(style: &FontStyle) -> Result<@Font, ()> {
|
priv fn create_font(style: &FontStyle) -> Result<@Font, ()> {
|
||||||
let font_bin = @test_font_bin();
|
let font_bin = @test_font_bin();
|
||||||
let native_font = NativeFont::new(self.fctx, font_bin, style.pt_size);
|
let native_font = FontHandle::new(self.fctx, font_bin, style.pt_size);
|
||||||
let native_font = if native_font.is_ok() {
|
let native_font = if native_font.is_ok() {
|
||||||
result::unwrap(move native_font)
|
result::unwrap(move native_font)
|
||||||
} else {
|
} else {
|
||||||
|
|
33
src/servo/gfx/font_handle.rs
Normal file
33
src/servo/gfx/font_handle.rs
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
/**
|
||||||
|
FontHandle encapsulates access to the platform's font API,
|
||||||
|
e.g. quartz, FreeType. It provides access to metrics and tables
|
||||||
|
needed by the text shaper as well as access to the underlying
|
||||||
|
font resources needed by the graphics layer to draw glyphs.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
pub type FontHandle/& = quartz::font_handle::QuartzFontHandle;
|
||||||
|
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
pub type FontHandle/& = freetype::font_handle::FreeTypeFontHandle;
|
||||||
|
|
||||||
|
// TODO: `new` should be part of trait FontHandle
|
||||||
|
|
||||||
|
// TODO(Issue #163): this is a workaround for static methods and
|
||||||
|
// typedefs not working well together. It should be removed.
|
||||||
|
|
||||||
|
// TODO(Rust #1723): #cfg doesn't work for impl methods, so we have
|
||||||
|
// to conditionally define the entire impl.
|
||||||
|
#[cfg(target_os = "macos")]
|
||||||
|
impl FontHandle {
|
||||||
|
static pub fn new(fctx: &native::FontContext, buf: @~[u8], pt_size: float) -> Result<FontHandle, ()> {
|
||||||
|
quartz::font_handle::QuartzFontHandle::new(fctx, buf, pt_size)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
impl FontHandle {
|
||||||
|
static pub fn new(fctx: &native::FontContext, buf: @~[u8], pt_size: float) -> Result<FontHandle, ()> {
|
||||||
|
freetype::font_handle::FreeTypeFontHandle::new(fctx, buf, pt_size)
|
||||||
|
}
|
||||||
|
}
|
|
@ -31,7 +31,7 @@ fn fixed_to_float_ft(f: i32) -> float {
|
||||||
fixed_to_float(6, f)
|
fixed_to_float(6, f)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct FreeTypeNativeFont {
|
pub struct FreeTypeFontHandle {
|
||||||
/// The font binary. This must stay valid for the lifetime of the font
|
/// The font binary. This must stay valid for the lifetime of the font
|
||||||
buf: @~[u8],
|
buf: @~[u8],
|
||||||
face: FT_Face,
|
face: FT_Face,
|
||||||
|
@ -44,9 +44,9 @@ pub struct FreeTypeNativeFont {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub impl FreeTypeNativeFont {
|
pub impl FreeTypeFontHandle {
|
||||||
static pub fn new(fctx: &FreeTypeFontContext,
|
static pub fn new(fctx: &FreeTypeFontContext,
|
||||||
buf: @~[u8], pt_size: float) -> Result<FreeTypeNativeFont, ()> {
|
buf: @~[u8], pt_size: float) -> Result<FreeTypeFontHandle, ()> {
|
||||||
let ft_ctx = fctx.ctx;
|
let ft_ctx = fctx.ctx;
|
||||||
assert ft_ctx.is_not_null();
|
assert ft_ctx.is_not_null();
|
||||||
let face: FT_Face = null();
|
let face: FT_Face = null();
|
||||||
|
@ -59,7 +59,7 @@ pub impl FreeTypeNativeFont {
|
||||||
72, // horiz. DPI
|
72, // horiz. DPI
|
||||||
72); // vert. DPI
|
72); // vert. DPI
|
||||||
if !res.succeeded() { fail ~"unable to set font char size" }
|
if !res.succeeded() { fail ~"unable to set font char size" }
|
||||||
Ok(FreeTypeNativeFont { face: face, buf: buf })
|
Ok(FreeTypeFontHandle { face: face, buf: buf })
|
||||||
} else {
|
} else {
|
||||||
Err(())
|
Err(())
|
||||||
}
|
}
|
8
src/servo/gfx/native.rs
Normal file
8
src/servo/gfx/native.rs
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
/* This file exists just to make it easier to import platform-specific
|
||||||
|
implementations.
|
||||||
|
|
||||||
|
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_handle::FontHandle;
|
||||||
|
pub use font_context::FontContext;
|
|
@ -1,35 +0,0 @@
|
||||||
/**
|
|
||||||
NativeFont encapsulates access to the platform's font API,
|
|
||||||
e.g. quartz, FreeType. It provides access to metrics and tables
|
|
||||||
needed by the text shaper as well as access to the underlying
|
|
||||||
font resources needed by the graphics layer to draw glyphs.
|
|
||||||
*/
|
|
||||||
|
|
||||||
use font_context::FontContext;
|
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
|
||||||
pub type NativeFont/& = quartz::native_font::QuartzNativeFont;
|
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
|
||||||
pub type NativeFont/& = freetype::native_font::FreeTypeNativeFont;
|
|
||||||
|
|
||||||
// TODO: `new` should be part of trait NativeFont
|
|
||||||
|
|
||||||
// TODO(Issue #163): this is a workaround for static methods and
|
|
||||||
// typedefs not working well together. It should be removed.
|
|
||||||
|
|
||||||
// TODO(Rust #1723): #cfg doesn't work for impl methods, so we have
|
|
||||||
// to conditionally define the entire impl.
|
|
||||||
#[cfg(target_os = "macos")]
|
|
||||||
impl NativeFont {
|
|
||||||
static pub fn new(fctx: &FontContext, buf: @~[u8], pt_size: float) -> Result<NativeFont, ()> {
|
|
||||||
quartz::native_font::QuartzNativeFont::new(fctx, buf, pt_size)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
|
||||||
impl NativeFont {
|
|
||||||
static pub fn new(fctx: &FontContext, buf: @~[u8], pt_size: float) -> Result<NativeFont, ()> {
|
|
||||||
freetype::native_font::FreeTypeNativeFont::new(fctx, buf, pt_size)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -53,7 +53,7 @@ use ct::font_descriptor::{
|
||||||
kCTFontDefaultOrientation,
|
kCTFontDefaultOrientation,
|
||||||
};
|
};
|
||||||
|
|
||||||
pub struct QuartzNativeFont {
|
pub struct QuartzFontHandle {
|
||||||
fontprov: CGDataProviderRef,
|
fontprov: CGDataProviderRef,
|
||||||
cgfont: CGFontRef,
|
cgfont: CGFontRef,
|
||||||
ctfont: CTFontRef,
|
ctfont: CTFontRef,
|
||||||
|
@ -69,8 +69,8 @@ pub struct QuartzNativeFont {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub impl QuartzNativeFont {
|
pub impl QuartzFontHandle {
|
||||||
static pub fn new(_fctx: &QuartzFontContext, buf: @~[u8], pt_size: float) -> Result<QuartzNativeFont, ()> {
|
static pub fn new(_fctx: &QuartzFontContext, buf: @~[u8], pt_size: float) -> Result<QuartzFontHandle, ()> {
|
||||||
let fontprov = vec::as_imm_buf(*buf, |cbuf, len| {
|
let fontprov = vec::as_imm_buf(*buf, |cbuf, len| {
|
||||||
CGDataProviderCreateWithData(
|
CGDataProviderCreateWithData(
|
||||||
null(),
|
null(),
|
||||||
|
@ -86,7 +86,7 @@ pub impl QuartzNativeFont {
|
||||||
let ctfont = ctfont_from_cgfont(cgfont, pt_size);
|
let ctfont = ctfont_from_cgfont(cgfont, pt_size);
|
||||||
if ctfont.is_null() { return Err(()); }
|
if ctfont.is_null() { return Err(()); }
|
||||||
|
|
||||||
Ok(QuartzNativeFont {
|
Ok(QuartzFontHandle {
|
||||||
fontprov : fontprov,
|
fontprov : fontprov,
|
||||||
cgfont : cgfont,
|
cgfont : cgfont,
|
||||||
ctfont : ctfont,
|
ctfont : ctfont,
|
|
@ -88,11 +88,11 @@ pub mod gfx {
|
||||||
pub mod glyph;
|
pub mod glyph;
|
||||||
pub mod text_run;
|
pub mod text_run;
|
||||||
|
|
||||||
// Typedefs and pub-uses for multiple implementations. If prefixed
|
// Typedefs and pub-uses for multiple implementations.
|
||||||
// with 'native', then the specific implementataion is composed by
|
// native contains redirects, so one can write native::FontHandle.
|
||||||
// a non-prefixed version, listed above.
|
pub mod native;
|
||||||
pub mod font_context;
|
pub mod font_context;
|
||||||
pub mod native_font;
|
pub mod font_handle;
|
||||||
pub mod shaper;
|
pub mod shaper;
|
||||||
|
|
||||||
// Below are the actual platform-specific parts.
|
// Below are the actual platform-specific parts.
|
||||||
|
@ -103,13 +103,13 @@ pub mod gfx {
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
pub mod quartz {
|
pub mod quartz {
|
||||||
pub mod font_context;
|
pub mod font_context;
|
||||||
pub mod native_font;
|
pub mod font_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
pub mod freetype {
|
pub mod freetype {
|
||||||
pub mod font_context;
|
pub mod font_context;
|
||||||
pub mod native_font;
|
pub mod font_handle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue