summaryrefslogtreecommitdiffstats
path: root/wgpu/src/text.rs
diff options
context:
space:
mode:
Diffstat (limited to 'wgpu/src/text.rs')
-rw-r--r--wgpu/src/text.rs110
1 files changed, 43 insertions, 67 deletions
diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs
index f4521e72..a7123d39 100644
--- a/wgpu/src/text.rs
+++ b/wgpu/src/text.rs
@@ -1,24 +1,13 @@
-mod font;
-
use crate::Transformation;
-
+use iced_graphics::font;
use std::{cell::RefCell, collections::HashMap};
-
-pub const BUILTIN_ICONS: iced_native::Font = iced_native::Font::External {
- name: "iced_wgpu icons",
- bytes: include_bytes!("text/icons.ttf"),
-};
-
-pub const CHECKMARK_ICON: char = '\u{F00C}';
-
-const FALLBACK_FONT: &[u8] = include_bytes!("../fonts/Lato-Regular.ttf");
+use wgpu_glyph::ab_glyph;
#[derive(Debug)]
pub struct Pipeline {
- draw_brush: RefCell<wgpu_glyph::GlyphBrush<'static, ()>>,
+ draw_brush: RefCell<wgpu_glyph::GlyphBrush<()>>,
draw_font_map: RefCell<HashMap<String, wgpu_glyph::FontId>>,
-
- measure_brush: RefCell<glyph_brush::GlyphBrush<'static, ()>>,
+ measure_brush: RefCell<glyph_brush::GlyphBrush<()>>,
}
impl Pipeline {
@@ -27,51 +16,48 @@ impl Pipeline {
format: wgpu::TextureFormat,
default_font: Option<&[u8]>,
) -> Self {
- // TODO: Font customization
- let font_source = font::Source::new();
+ let default_font = default_font.map(|slice| slice.to_vec());
- let default_font =
- default_font.map(|slice| slice.to_vec()).unwrap_or_else(|| {
- font_source
+ // TODO: Font customization
+ #[cfg(feature = "default_system_font")]
+ let default_font = {
+ default_font.or_else(|| {
+ font::Source::new()
.load(&[font::Family::SansSerif, font::Family::Serif])
- .unwrap_or_else(|_| FALLBACK_FONT.to_vec())
- });
-
- let load_glyph_brush = |font: Vec<u8>| {
- let builder =
- wgpu_glyph::GlyphBrushBuilder::using_fonts_bytes(vec![
- font.clone()
- ])?;
-
- Ok((
- builder,
- glyph_brush::GlyphBrushBuilder::using_font_bytes(font).build(),
- ))
+ .ok()
+ })
};
- let (brush_builder, measure_brush) = load_glyph_brush(default_font)
- .unwrap_or_else(|_: wgpu_glyph::rusttype::Error| {
- log::warn!("System font failed to load. Falling back to embedded font...");
+ let default_font =
+ default_font.unwrap_or_else(|| font::FALLBACK.to_vec());
- load_glyph_brush(FALLBACK_FONT.to_vec()).expect("Load fallback font")
+ let font = ab_glyph::FontArc::try_from_vec(default_font)
+ .unwrap_or_else(|_| {
+ log::warn!(
+ "System font failed to load. Falling back to \
+ embedded font..."
+ );
+
+ ab_glyph::FontArc::try_from_slice(font::FALLBACK)
+ .expect("Load fallback font")
});
- let draw_brush = brush_builder
- .initial_cache_size((2048, 2048))
- .build(device, format);
+ let draw_brush =
+ wgpu_glyph::GlyphBrushBuilder::using_font(font.clone())
+ .initial_cache_size((2048, 2048))
+ .draw_cache_multithread(false) // TODO: Expose as a configuration flag
+ .build(device, format);
+
+ let measure_brush =
+ glyph_brush::GlyphBrushBuilder::using_font(font).build();
Pipeline {
draw_brush: RefCell::new(draw_brush),
draw_font_map: RefCell::new(HashMap::new()),
-
measure_brush: RefCell::new(measure_brush),
}
}
- pub fn overlay_font(&self) -> wgpu_glyph::FontId {
- wgpu_glyph::FontId(0)
- }
-
pub fn queue(&mut self, section: wgpu_glyph::Section<'_>) {
self.draw_brush.borrow_mut().queue(section);
}
@@ -108,10 +94,13 @@ impl Pipeline {
let wgpu_glyph::FontId(font_id) = self.find_font(font);
let section = wgpu_glyph::Section {
- text: content,
- scale: wgpu_glyph::Scale { x: size, y: size },
bounds: (bounds.width, bounds.height),
- font_id: wgpu_glyph::FontId(font_id),
+ text: vec![wgpu_glyph::Text {
+ text: content,
+ scale: size.into(),
+ font_id: wgpu_glyph::FontId(font_id),
+ extra: wgpu_glyph::Extra::default(),
+ }],
..Default::default()
};
@@ -124,21 +113,7 @@ impl Pipeline {
}
}
- pub fn space_width(&self, size: f32) -> f32 {
- use wgpu_glyph::GlyphCruncher;
-
- let glyph_brush = self.measure_brush.borrow();
-
- // TODO: Select appropriate font
- let font = &glyph_brush.fonts()[0];
-
- font.glyph(' ')
- .scaled(wgpu_glyph::Scale { x: size, y: size })
- .h_metrics()
- .advance_width
- }
-
- pub fn clear_measurement_cache(&mut self) {
+ pub fn trim_measurement_cache(&mut self) {
// TODO: We should probably use a `GlyphCalculator` for this. However,
// it uses a lifetimed `GlyphCalculatorGuard` with side-effects on drop.
// This makes stuff quite inconvenient. A manual method for trimming the
@@ -170,11 +145,12 @@ impl Pipeline {
return *font_id;
}
- // TODO: Find a way to share font data
- let _ = self.measure_brush.borrow_mut().add_font_bytes(bytes);
+ let font = ab_glyph::FontArc::try_from_slice(bytes)
+ .expect("Load font");
+
+ let _ = self.measure_brush.borrow_mut().add_font(font.clone());
- let font_id =
- self.draw_brush.borrow_mut().add_font_bytes(bytes);
+ let font_id = self.draw_brush.borrow_mut().add_font(font);
let _ = self
.draw_font_map