mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Get the correct glyph index/advance on mac
This commit is contained in:
parent
fb36c05c35
commit
2f6868bbbe
1 changed files with 77 additions and 7 deletions
|
@ -5,7 +5,6 @@ export QuartzNativeFont, with_test_native_font, create;
|
|||
import libc::size_t;
|
||||
import ptr::null;
|
||||
import unsafe::reinterpret_cast;
|
||||
import result::{Result, Ok};
|
||||
import glyph::GlyphIndex;
|
||||
import cocoa::cg::{
|
||||
CGDataProviderRef,
|
||||
|
@ -18,6 +17,38 @@ import cocoa::cg::cg::{
|
|||
CGFontRelease
|
||||
};
|
||||
|
||||
mod coretext {
|
||||
|
||||
type CTFontRef = *u8;
|
||||
type UniChar = libc::c_ushort;
|
||||
type CGGlyph = libc::c_ushort;
|
||||
type CFIndex = libc::c_long;
|
||||
|
||||
type CTFontOrientation = u32;
|
||||
const kCTFontDefaultOrientation: CTFontOrientation = 0;
|
||||
const kCTFontHorizontalOrientation: CTFontOrientation = 1;
|
||||
const kCTFontVerticalOrientation: CTFontOrientation = 2;
|
||||
|
||||
type CGFloat = libc::c_double;
|
||||
|
||||
struct CGSize {
|
||||
width: CGFloat;
|
||||
height: CGFloat;
|
||||
}
|
||||
|
||||
type CGAffineTransform = ();
|
||||
type CTFontDescriptorRef = *u8;
|
||||
|
||||
#[nolink]
|
||||
#[link_args = "-framework ApplicationServices"]
|
||||
extern mod coretext {
|
||||
fn CTFontCreateWithGraphicsFont(graphicsFont: CGFontRef, size: CGFloat, matrix: *CGAffineTransform, attributes: CTFontDescriptorRef) -> CTFontRef;
|
||||
fn CTFontGetGlyphsForCharacters(font: CTFontRef, characters: *UniChar, glyphs: *CGGlyph, count: CFIndex) -> bool;
|
||||
fn CTFontGetAdvancesForGlyphs(font: CTFontRef, orientation: CTFontOrientation, glyphs: *CGGlyph, advances: *CGSize, count: CFIndex) -> libc::c_double;
|
||||
fn CFRelease(font: CTFontRef);
|
||||
}
|
||||
}
|
||||
|
||||
struct QuartzNativeFont/& {
|
||||
let fontprov: CGDataProviderRef;
|
||||
let cgfont: CGFontRef;
|
||||
|
@ -38,18 +69,57 @@ struct QuartzNativeFont/& {
|
|||
CGDataProviderRelease(self.fontprov);
|
||||
}
|
||||
|
||||
fn glyph_index(_codepoint: char) -> Option<GlyphIndex> {
|
||||
// FIXME
|
||||
Some(40u)
|
||||
fn glyph_index(codepoint: char) -> Option<GlyphIndex> {
|
||||
|
||||
import coretext::{UniChar, CGGlyph, CFIndex};
|
||||
import coretext::coretext::{CFRelease, CTFontGetGlyphsForCharacters};
|
||||
|
||||
let ctfont = ctfont_from_cgfont(self.cgfont);
|
||||
assert ctfont.is_not_null();
|
||||
let characters: ~[UniChar] = ~[codepoint as UniChar];
|
||||
let glyphs: ~[mut CGGlyph] = ~[mut 0 as CGGlyph];
|
||||
let count: CFIndex = 1;
|
||||
|
||||
let result = do vec::as_buf(characters) |character_buf, _l| {
|
||||
do vec::as_buf(glyphs) |glyph_buf, _l| {
|
||||
CTFontGetGlyphsForCharacters(ctfont, character_buf, glyph_buf, count)
|
||||
}
|
||||
};
|
||||
|
||||
assert result != false; // FIXME: error handling
|
||||
|
||||
CFRelease(ctfont);
|
||||
|
||||
assert glyphs[0] != 0; // FIXME: error handling
|
||||
return Some(glyphs[0] as GlyphIndex);
|
||||
}
|
||||
|
||||
// FIXME: What unit is this returning? Let's have a custom type
|
||||
fn glyph_h_advance(_glyph: GlyphIndex) -> Option<int> {
|
||||
// FIXME
|
||||
Some(15)
|
||||
fn glyph_h_advance(glyph: GlyphIndex) -> Option<int> {
|
||||
import coretext::{CGGlyph, kCTFontDefaultOrientation};
|
||||
import coretext::coretext::{CFRelease, CTFontGetAdvancesForGlyphs};
|
||||
|
||||
let ctfont = ctfont_from_cgfont(self.cgfont);
|
||||
assert ctfont.is_not_null();
|
||||
let glyphs = ~[glyph as CGGlyph];
|
||||
let advance = do vec::as_buf(glyphs) |glyph_buf, _l| {
|
||||
CTFontGetAdvancesForGlyphs(ctfont, kCTFontDefaultOrientation, glyph_buf, null(), 1)
|
||||
};
|
||||
|
||||
CFRelease(ctfont);
|
||||
|
||||
return Some(advance as int);
|
||||
}
|
||||
}
|
||||
|
||||
fn ctfont_from_cgfont(+cgfont: CGFontRef) -> coretext::CTFontRef unsafe {
|
||||
import coretext::CGFloat;
|
||||
import coretext::coretext::CTFontCreateWithGraphicsFont;
|
||||
|
||||
assert cgfont.is_not_null();
|
||||
CTFontCreateWithGraphicsFont(cgfont, 21f as CGFloat, null(), null())
|
||||
}
|
||||
|
||||
fn create(buf: &~[u8]) -> Result<QuartzNativeFont, ()> {
|
||||
let fontprov = vec::as_buf(*buf, |cbuf, len| {
|
||||
CGDataProviderCreateWithData(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue