Font mutex-locking
This commit is contained in:
parent
342e8b142e
commit
7e15a2f6a8
102
src/text.rs
102
src/text.rs
|
@ -3,7 +3,7 @@ use super::{DrawCommand, MeshIndex, MeshVertex};
|
||||||
use allsorts::binary::read::ReadScope;
|
use allsorts::binary::read::ReadScope;
|
||||||
use allsorts::cff::CFF;
|
use allsorts::cff::CFF;
|
||||||
use allsorts::font::{GlyphTableFlags, MatchingPresentation};
|
use allsorts::font::{GlyphTableFlags, MatchingPresentation};
|
||||||
use allsorts::font_data::{DynamicFontTableProvider, FontData};
|
use allsorts::font_data::{DynamicFontTableProvider, FontData as AllsortsFontData};
|
||||||
use allsorts::glyph_position::{GlyphLayout, TextDirection};
|
use allsorts::glyph_position::{GlyphLayout, TextDirection};
|
||||||
use allsorts::outline::OutlineBuilder;
|
use allsorts::outline::OutlineBuilder;
|
||||||
use allsorts::pathfinder_geometry::{line_segment::LineSegment2F, vector::Vector2F};
|
use allsorts::pathfinder_geometry::{line_segment::LineSegment2F, vector::Vector2F};
|
||||||
|
@ -13,6 +13,7 @@ use allsorts::{tag, Font as AllsortsFont};
|
||||||
use canary_types::GlyphPosition;
|
use canary_types::GlyphPosition;
|
||||||
use lyon::path::Path;
|
use lyon::path::Path;
|
||||||
use ouroboros::self_referencing;
|
use ouroboros::self_referencing;
|
||||||
|
use parking_lot::{Mutex, RwLock};
|
||||||
|
|
||||||
const TEXT_SCALE: f32 = 0.075;
|
const TEXT_SCALE: f32 = 0.075;
|
||||||
|
|
||||||
|
@ -142,26 +143,9 @@ pub struct GlyphMesh {
|
||||||
indices: Vec<MeshIndex>,
|
indices: Vec<MeshIndex>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[self_referencing]
|
|
||||||
pub struct Font {
|
pub struct Font {
|
||||||
file_buffer: Vec<u8>,
|
data: Mutex<FontData>,
|
||||||
face_index: u16,
|
|
||||||
script: u32,
|
|
||||||
direction: TextDirection,
|
|
||||||
vertical: bool,
|
|
||||||
glyph_cache: GlyphCache,
|
glyph_cache: GlyphCache,
|
||||||
|
|
||||||
#[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 {
|
impl Font {
|
||||||
|
@ -172,31 +156,62 @@ impl Font {
|
||||||
vertical: bool,
|
vertical: bool,
|
||||||
file_buffer: Vec<u8>,
|
file_buffer: Vec<u8>,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let mut built = FontBuilder {
|
let mut data = FontData::load(face_index, script, direction, vertical, file_buffer);
|
||||||
|
let mut glyph_cache = GlyphCache::empty();
|
||||||
|
data.with_inner_mut(|font| glyph_cache.load_paths(font));
|
||||||
|
let data = Mutex::new(data);
|
||||||
|
Self { data, glyph_cache }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn shape(&self, text: &str) -> Vec<GlyphPosition> {
|
||||||
|
self.data.lock().shape(text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[self_referencing]
|
||||||
|
pub struct FontData {
|
||||||
|
file_buffer: Vec<u8>,
|
||||||
|
face_index: u16,
|
||||||
|
script: u32,
|
||||||
|
direction: TextDirection,
|
||||||
|
vertical: bool,
|
||||||
|
|
||||||
|
#[borrows(file_buffer)]
|
||||||
|
#[covariant]
|
||||||
|
read_scope: ReadScope<'this>,
|
||||||
|
|
||||||
|
#[borrows(read_scope)]
|
||||||
|
#[not_covariant]
|
||||||
|
font_data: AllsortsFontData<'this>,
|
||||||
|
|
||||||
|
#[borrows(font_data)]
|
||||||
|
#[covariant]
|
||||||
|
inner: AllsortsFont<DynamicFontTableProvider<'this>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FontData {
|
||||||
|
pub fn load(
|
||||||
|
face_index: u16,
|
||||||
|
script: u32,
|
||||||
|
direction: TextDirection,
|
||||||
|
vertical: bool,
|
||||||
|
file_buffer: Vec<u8>,
|
||||||
|
) -> Self {
|
||||||
|
FontDataBuilder {
|
||||||
file_buffer,
|
file_buffer,
|
||||||
face_index,
|
face_index,
|
||||||
script,
|
script,
|
||||||
direction,
|
direction,
|
||||||
vertical,
|
vertical,
|
||||||
glyph_cache: GlyphCache::empty(),
|
|
||||||
read_scope_builder: |buffer| ReadScope::new(buffer),
|
read_scope_builder: |buffer| ReadScope::new(buffer),
|
||||||
font_data_builder: |scope| scope.read::<FontData<'_>>().unwrap(),
|
font_data_builder: |scope| scope.read::<AllsortsFontData<'_>>().unwrap(),
|
||||||
inner_builder: |font_data| {
|
inner_builder: |font_data| {
|
||||||
AllsortsFont::new(font_data.table_provider(0).unwrap())
|
AllsortsFont::new(font_data.table_provider(0).unwrap())
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
.build();
|
.build()
|
||||||
|
|
||||||
let mut glyph_cache = GlyphCache::empty();
|
|
||||||
built.with_inner_mut(|font| {
|
|
||||||
glyph_cache.load_paths(font);
|
|
||||||
});
|
|
||||||
|
|
||||||
built.with_glyph_cache_mut(|old| std::mem::replace(old, glyph_cache));
|
|
||||||
|
|
||||||
built
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn shape(&mut self, text: &str) -> Vec<GlyphPosition> {
|
pub fn shape(&mut self, text: &str) -> Vec<GlyphPosition> {
|
||||||
|
@ -247,7 +262,7 @@ impl FontStore {
|
||||||
pub fn load_font(&self, title: &str) -> Font {
|
pub fn load_font(&self, title: &str) -> Font {
|
||||||
use font_kit::family_name::FamilyName;
|
use font_kit::family_name::FamilyName;
|
||||||
use font_kit::handle::Handle;
|
use font_kit::handle::Handle;
|
||||||
use font_kit::properties::{Properties, Style};
|
use font_kit::properties::Properties;
|
||||||
|
|
||||||
println!("loading font family {}", title);
|
println!("loading font family {}", title);
|
||||||
|
|
||||||
|
@ -298,17 +313,16 @@ impl Default for DummyText {
|
||||||
let mut font = store.load_font(family);
|
let mut font = store.load_font(family);
|
||||||
let glyphs = font.shape(text);
|
let glyphs = font.shape(text);
|
||||||
|
|
||||||
font.with_glyph_cache_mut(|cache| {
|
let mut xcur = 0;
|
||||||
let mut xcur = 0;
|
let mut ycur = 0;
|
||||||
let mut ycur = 0;
|
for glyph in glyphs.iter() {
|
||||||
for glyph in glyphs.iter() {
|
let xpos = xcur + glyph.xoff;
|
||||||
let xpos = xcur + glyph.xoff;
|
let ypos = ycur + glyph.yoff;
|
||||||
let ypos = ycur + glyph.yoff;
|
xcur += glyph.hori_advance;
|
||||||
xcur += glyph.hori_advance;
|
ycur += glyph.vert_advance;
|
||||||
ycur += glyph.vert_advance;
|
font.glyph_cache
|
||||||
cache.draw(&mut mesh, glyph.index, xpos, ypos, line_offset);
|
.draw(&mut mesh, glyph.index, xpos, ypos, line_offset);
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
line_offset += line_height;
|
line_offset += line_height;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue