use std::sync::{Arc, Mutex};
use crate::renderer::TextRenderer;
use crate::defaults::cosmic_font::CosmicFontProvider;
use crate::defaults::swash_raster::SwashRasterizer;
use crate::traits::FontProvider;
use crate::types::options::TextOptions;
use crate::types::color::Color;
use crate::primitives::shaped_buffer::ShapedBuffer;
pub struct Zentype {
renderer: TextRenderer,
}
impl Zentype {
pub fn new(device: std::sync::Arc<wgpu::Device>, queue: &wgpu::Queue, config: &wgpu::SurfaceConfiguration) -> Self {
let shaper = Box::new(CosmicFontProvider::new());
let nerd_font_path = std::path::Path::new("assets/fonts/SymbolsNerdFont-Regular.ttf");
if nerd_font_path.exists() {
let font_system = shaper.font_system();
let path = nerd_font_path.to_path_buf();
std::thread::spawn(move || {
match font_system.lock().unwrap().db_mut().load_font_file(&path) {
Ok(_) => println!("Successfully auto-loaded Nerd Font from {:?}", path),
Err(e) => eprintln!("Failed to auto-load Nerd Font: {:?}", e),
}
});
}
let font_system = shaper.font_system();
let rasterizer = Box::new(SwashRasterizer::new(font_system));
let atlas = crate::primitives::atlas::GlyphAtlas::new(&device, 2048);
let renderer = TextRenderer::new(device, queue, config, shaper, rasterizer, atlas);
Self { renderer }
}
pub fn draw(&mut self, queue: &wgpu::Queue, text: &str, pos: [f32; 2], options: &TextOptions) -> ShapedBuffer {
self.renderer.draw(queue, text, pos, options)
}
pub fn print(&mut self, queue: &wgpu::Queue, text: &str, pos: [f32; 2], size: f32, color: Color) -> ShapedBuffer {
let options = TextOptions::new()
.font_size(size)
.color(color);
self.renderer.draw(queue, text, pos, &options)
}
pub fn draw_rect(&mut self, pos: [f32; 2], size: [f32; 2], color: Color, clip_rect: [f32; 4]) {
self.renderer.draw_rect(pos, size, color, clip_rect);
}
pub fn hit_test(&self, buffer: &ShapedBuffer, pos: [f32; 2], options: &TextOptions, mouse_pos: [f32; 2]) -> usize {
self.renderer.hit_test(buffer, pos, options, mouse_pos)
}
pub fn position_at(&self, buffer: &ShapedBuffer, pos: [f32; 2], options: &TextOptions, index: usize) -> Option<[f32; 2]> {
self.renderer.position_at(buffer, pos, options, index)
}
pub fn resize(&mut self, queue: &wgpu::Queue, width: u32, height: u32) {
self.renderer.resize(queue, width, height);
}
pub fn render<'a>(&'a mut self, rpass: &mut wgpu::RenderPass<'a>) {
self.renderer.render(rpass);
}
pub fn renderer_mut(&mut self) -> &mut TextRenderer {
&mut self.renderer
}
pub fn font_system(&self) -> Arc<Mutex<cosmic_text::FontSystem>> {
self.renderer.font_system()
}
}