mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Fix accidental bogus copying of the font binary
This commit is contained in:
parent
413d458857
commit
365ef92f07
5 changed files with 46 additions and 21 deletions
|
@ -33,10 +33,10 @@ impl Font {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn Font(fontbuf: ~[u8], +native_font: NativeFont) -> Font {
|
fn Font(fontbuf: @~[u8], +native_font: NativeFont) -> Font {
|
||||||
Font {
|
Font {
|
||||||
fontbuf : @fontbuf,
|
fontbuf : fontbuf,
|
||||||
native_font : native_font,
|
native_font : move native_font,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -73,6 +73,29 @@ fn should_get_glyph_advance() {
|
||||||
assert x == 15;
|
assert x == 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Testing thread safety
|
||||||
|
fn should_get_glyph_advance_stress() {
|
||||||
|
#[test];
|
||||||
|
|
||||||
|
let mut ports = ~[];
|
||||||
|
|
||||||
|
for iter::repeat(100) {
|
||||||
|
let (chan, port) = pipes::stream();
|
||||||
|
ports += [@move port];
|
||||||
|
do task::spawn {
|
||||||
|
let lib = FontLibrary();
|
||||||
|
let font = lib.get_test_font();
|
||||||
|
let x = font.glyph_h_advance(40u);
|
||||||
|
assert x == 15;
|
||||||
|
chan.send(());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for ports.each |port| {
|
||||||
|
port.recv();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn should_be_able_to_create_instances_in_multiple_threads() {
|
fn should_be_able_to_create_instances_in_multiple_threads() {
|
||||||
#[test];
|
#[test];
|
||||||
|
|
||||||
|
|
|
@ -30,8 +30,8 @@ fn FontLibrary() -> FontLibrary {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_font(native_lib: &native::NativeFontLibrary) -> Result<@Font, ()> {
|
fn create_font(native_lib: &native::NativeFontLibrary) -> Result<@Font, ()> {
|
||||||
let font_bin = test_font_bin();
|
let font_bin = @test_font_bin();
|
||||||
let native_font = native_font::create(native_lib, &font_bin);
|
let native_font = native_font::create(native_lib, font_bin);
|
||||||
let native_font = if native_font.is_ok() {
|
let native_font = if native_font.is_ok() {
|
||||||
result::unwrap(native_font)
|
result::unwrap(native_font)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -18,13 +18,13 @@ type NativeFont/& = quartz_native_font::QuartzNativeFont;
|
||||||
type NativeFont/& = ft_native_font::FreeTypeNativeFont;
|
type NativeFont/& = ft_native_font::FreeTypeNativeFont;
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
fn create(_native_lib: &NativeFontLibrary, buf: &~[u8]) -> Result<NativeFont, ()> {
|
fn create(_native_lib: &NativeFontLibrary, buf: @~[u8]) -> Result<NativeFont, ()> {
|
||||||
quartz_native_font::create(buf)
|
quartz_native_font::create(buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
fn create(native_lib: &NativeFontLibrary, buf: &~[u8]) -> Result<NativeFont, ()> {
|
fn create(native_lib: &NativeFontLibrary, buf: @~[u8]) -> Result<NativeFont, ()> {
|
||||||
ft_native_font::create(*native_lib, buf)
|
ft_native_font::create(native_lib, buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
|
|
|
@ -17,6 +17,8 @@ use freetype::bindgen::{
|
||||||
};
|
};
|
||||||
|
|
||||||
struct FreeTypeNativeFont {
|
struct FreeTypeNativeFont {
|
||||||
|
/// The font binary. This must stay valid for the lifetime of the font
|
||||||
|
buf: @~[u8],
|
||||||
face: FT_Face,
|
face: FT_Face,
|
||||||
|
|
||||||
drop {
|
drop {
|
||||||
|
@ -27,9 +29,9 @@ struct FreeTypeNativeFont {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn FreeTypeNativeFont(face: FT_Face) -> FreeTypeNativeFont {
|
fn FreeTypeNativeFont(face: FT_Face, buf: @~[u8]) -> FreeTypeNativeFont {
|
||||||
assert face.is_not_null();
|
assert face.is_not_null();
|
||||||
FreeTypeNativeFont { face: face }
|
FreeTypeNativeFont { buf: buf, face: face }
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FreeTypeNativeFont {
|
impl FreeTypeNativeFont {
|
||||||
|
@ -67,16 +69,16 @@ impl FreeTypeNativeFont {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create(lib: FT_Library, buf: &~[u8]) -> Result<FreeTypeNativeFont, ()> {
|
fn create(lib: &FT_Library, buf: @~[u8]) -> Result<FreeTypeNativeFont, ()> {
|
||||||
assert lib.is_not_null();
|
assert lib.is_not_null();
|
||||||
let face: FT_Face = null();
|
let face: FT_Face = null();
|
||||||
return vec_as_buf(*buf, |cbuf, _len| {
|
return vec_as_buf(*buf, |cbuf, _len| {
|
||||||
if FT_New_Memory_Face(lib, cbuf, (*buf).len() as FT_Long,
|
if FT_New_Memory_Face(*lib, cbuf, (*buf).len() as FT_Long,
|
||||||
0 as FT_Long, addr_of(face)).succeeded() {
|
0 as FT_Long, addr_of(face)).succeeded() {
|
||||||
// FIXME: These values are placeholders
|
// FIXME: These values are placeholders
|
||||||
let res = FT_Set_Char_Size(face, 0, 20*64, 0, 72);
|
let res = FT_Set_Char_Size(face, 0, 20*64, 0, 72);
|
||||||
if !res.succeeded() { fail ~"unable to set font char size" }
|
if !res.succeeded() { fail ~"unable to set font char size" }
|
||||||
Ok(FreeTypeNativeFont(face))
|
Ok(FreeTypeNativeFont(face, buf))
|
||||||
} else {
|
} else {
|
||||||
Err(())
|
Err(())
|
||||||
}
|
}
|
||||||
|
@ -96,23 +98,23 @@ fn with_test_native_font(f: fn@(nf: &NativeFont)) {
|
||||||
use unwrap_result = result::unwrap;
|
use unwrap_result = result::unwrap;
|
||||||
|
|
||||||
with_lib(|lib| {
|
with_lib(|lib| {
|
||||||
let buf = test_font_bin();
|
let buf = @test_font_bin();
|
||||||
let font = unwrap_result(create(lib, &buf));
|
let font = unwrap_result(create(lib, move buf));
|
||||||
f(&font);
|
f(&font);
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_lib(f: fn@(FT_Library)) {
|
fn with_lib(f: fn@((&FT_Library))) {
|
||||||
let lib: FT_Library = null();
|
let lib: FT_Library = null();
|
||||||
assert FT_Init_FreeType(addr_of(lib)).succeeded();
|
assert FT_Init_FreeType(addr_of(lib)).succeeded();
|
||||||
f(lib);
|
f(&lib);
|
||||||
FT_Done_FreeType(lib);
|
FT_Done_FreeType(lib);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn create_should_return_err_if_buf_is_bogus() {
|
fn create_should_return_err_if_buf_is_bogus() {
|
||||||
with_lib(|lib| {
|
with_lib(|lib| {
|
||||||
let buf = &~[];
|
let buf = @~[];
|
||||||
assert create(lib, buf).is_err();
|
assert create(lib, buf).is_err();
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -127,7 +127,7 @@ fn ctfont_from_cgfont(cgfont: CGFontRef) -> coretext::CTFontRef {
|
||||||
CTFontCreateWithGraphicsFont(cgfont, 21f as CGFloat, null(), null())
|
CTFontCreateWithGraphicsFont(cgfont, 21f as CGFloat, null(), null())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create(buf: &~[u8]) -> Result<QuartzNativeFont, ()> {
|
fn create(buf: @~[u8]) -> Result<QuartzNativeFont, ()> {
|
||||||
let fontprov = vec::as_imm_buf(*buf, |cbuf, len| {
|
let fontprov = vec::as_imm_buf(*buf, |cbuf, len| {
|
||||||
CGDataProviderCreateWithData(
|
CGDataProviderCreateWithData(
|
||||||
null(),
|
null(),
|
||||||
|
@ -150,8 +150,8 @@ fn with_test_native_font(f: fn@(nf: &NativeFont)) {
|
||||||
use font::test_font_bin;
|
use font::test_font_bin;
|
||||||
use unwrap_result = result::unwrap;
|
use unwrap_result = result::unwrap;
|
||||||
|
|
||||||
let buf = test_font_bin();
|
let buf = @test_font_bin();
|
||||||
let res = create(&buf);
|
let res = create(buf);
|
||||||
let font = unwrap_result(res);
|
let font = unwrap_result(res);
|
||||||
f(&font);
|
f(&font);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue