Cruddy hacked-together owning Font struct
This commit is contained in:
parent
9cd5aa3822
commit
2975477725
|
@ -17,5 +17,6 @@ anyhow = "1"
|
||||||
bytemuck = "1"
|
bytemuck = "1"
|
||||||
canary_types = { path = "crates/types" }
|
canary_types = { path = "crates/types" }
|
||||||
lyon = "1"
|
lyon = "1"
|
||||||
|
ouroboros = "^0.15"
|
||||||
parking_lot = "0.12"
|
parking_lot = "0.12"
|
||||||
wasmtime = "0.38"
|
wasmtime = "0.38"
|
||||||
|
|
68
src/text.rs
68
src/text.rs
|
@ -9,8 +9,9 @@ use allsorts::outline::OutlineBuilder;
|
||||||
use allsorts::pathfinder_geometry::{line_segment::LineSegment2F, vector::Vector2F};
|
use allsorts::pathfinder_geometry::{line_segment::LineSegment2F, vector::Vector2F};
|
||||||
use allsorts::tables::{glyf::GlyfTable, loca::LocaTable};
|
use allsorts::tables::{glyf::GlyfTable, loca::LocaTable};
|
||||||
use allsorts::tables::{FontTableProvider, SfntVersion};
|
use allsorts::tables::{FontTableProvider, SfntVersion};
|
||||||
use allsorts::{tag, Font};
|
use allsorts::{tag, Font as AllsortsFont};
|
||||||
use lyon::path::Path;
|
use lyon::path::Path;
|
||||||
|
use ouroboros::self_referencing;
|
||||||
|
|
||||||
const TEXT_SCALE: f32 = 0.0001;
|
const TEXT_SCALE: f32 = 0.0001;
|
||||||
|
|
||||||
|
@ -19,7 +20,7 @@ pub struct GlyphCache {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GlyphCache {
|
impl GlyphCache {
|
||||||
pub fn new(font: &mut Font<DynamicFontTableProvider>) -> Self {
|
pub fn new(font: &AllsortsFont<DynamicFontTableProvider>) -> Self {
|
||||||
let glyph_num = font.num_glyphs();
|
let glyph_num = font.num_glyphs();
|
||||||
let mut glyphs = Vec::with_capacity(glyph_num as usize);
|
let mut glyphs = Vec::with_capacity(glyph_num as usize);
|
||||||
|
|
||||||
|
@ -127,6 +128,43 @@ pub struct GlyphMesh {
|
||||||
indices: Vec<MeshIndex>,
|
indices: Vec<MeshIndex>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[self_referencing]
|
||||||
|
pub struct Font {
|
||||||
|
file_buffer: Vec<u8>,
|
||||||
|
|
||||||
|
#[borrows(file_buffer)]
|
||||||
|
#[covariant]
|
||||||
|
read_scope: ReadScope<'this>,
|
||||||
|
|
||||||
|
#[borrows(read_scope)]
|
||||||
|
#[not_covariant]
|
||||||
|
font_data: FontData<'this>,
|
||||||
|
|
||||||
|
#[borrows(font_data)]
|
||||||
|
#[covariant]
|
||||||
|
inner: AllsortsFont<DynamicFontTableProvider<'this>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Font {
|
||||||
|
pub fn load(file_buffer: Vec<u8>) -> Self {
|
||||||
|
FontBuilder {
|
||||||
|
file_buffer,
|
||||||
|
read_scope_builder: |buffer| ReadScope::new(buffer),
|
||||||
|
font_data_builder: |scope| scope.read::<FontData<'_>>().unwrap(),
|
||||||
|
inner_builder: |font_data| {
|
||||||
|
AllsortsFont::new(font_data.table_provider(0).unwrap())
|
||||||
|
.unwrap()
|
||||||
|
.unwrap()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_glyph_cache(&self) -> GlyphCache {
|
||||||
|
GlyphCache::new(self.borrow_inner())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct DummyText {
|
pub struct DummyText {
|
||||||
vertices: Vec<MeshVertex>,
|
vertices: Vec<MeshVertex>,
|
||||||
indices: Vec<MeshIndex>,
|
indices: Vec<MeshIndex>,
|
||||||
|
@ -136,26 +174,28 @@ impl Default for DummyText {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
let script = tag::LATN;
|
let script = tag::LATN;
|
||||||
let buffer = include_bytes!("linja-pona-4.9.otf");
|
let buffer = include_bytes!("linja-pona-4.9.otf");
|
||||||
let buffer = buffer.as_slice();
|
|
||||||
let scope = ReadScope::new(&buffer);
|
|
||||||
let font_file = scope.read::<FontData<'_>>().unwrap();
|
|
||||||
let provider = font_file.table_provider(0).unwrap();
|
|
||||||
let mut font = Font::new(provider).unwrap().unwrap();
|
|
||||||
let mut cache = GlyphCache::new(&mut font);
|
|
||||||
let text = "toki o! nimi mi li [_mun_alasa_sona]. toki+pona li pona.";
|
let text = "toki o! nimi mi li [_mun_alasa_sona]. toki+pona li pona.";
|
||||||
let glyphs = font.map_glyphs(&text, script, MatchingPresentation::Required);
|
let mut font = Font::load(buffer.to_vec());
|
||||||
|
let mut cache = font.create_glyph_cache();
|
||||||
|
|
||||||
|
let glyphs = font
|
||||||
|
.with_inner_mut(|font| font.map_glyphs(&text, script, MatchingPresentation::Required));
|
||||||
|
|
||||||
let lang_tag = None;
|
let lang_tag = None;
|
||||||
let features = allsorts::gsub::Features::default();
|
let features = allsorts::gsub::Features::default();
|
||||||
let kerning = true;
|
let kerning = true;
|
||||||
let infos = font
|
let infos = font.with_inner_mut(|font| {
|
||||||
.shape(glyphs, script, lang_tag, &features, kerning)
|
font.shape(glyphs, script, lang_tag, &features, kerning)
|
||||||
.unwrap();
|
.unwrap()
|
||||||
|
});
|
||||||
|
|
||||||
let direction = TextDirection::LeftToRight;
|
let direction = TextDirection::LeftToRight;
|
||||||
let vertical = false;
|
let vertical = false;
|
||||||
let mut layout = GlyphLayout::new(&mut font, &infos, direction, vertical);
|
|
||||||
let positions = layout.glyph_positions().unwrap();
|
let positions = font.with_inner_mut(|font| {
|
||||||
|
let mut layout = GlyphLayout::new(font, &infos, direction, vertical);
|
||||||
|
layout.glyph_positions().unwrap()
|
||||||
|
});
|
||||||
|
|
||||||
let mut mesh = Self {
|
let mut mesh = Self {
|
||||||
vertices: Vec::new(),
|
vertices: Vec::new(),
|
||||||
|
|
Loading…
Reference in New Issue