Merge pull request #2 from torokati44/master

Switch to mainline glyphon 0.5.0
This commit is contained in:
StratusFearMe21 2024-03-07 02:59:32 +00:00 committed by GitHub
commit 206aa971e2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 78 additions and 96 deletions

61
Cargo.lock generated
View file

@ -513,9 +513,6 @@ name = "bitflags"
version = "2.4.2" version = "2.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "block" name = "block"
@ -841,9 +838,9 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-text" name = "cosmic-text"
version = "0.10.0" version = "0.10.0"
source = "git+https://github.com/StratusFearMe21/cosmic-text?branch=serde#5e40dd454c243a282b401291066a3e9ba807fcce" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75acbfb314aeb4f5210d379af45ed1ec2c98c7f1790bf57b8a4c562ac0c51b71"
dependencies = [ dependencies = [
"bitflags 2.4.2",
"fontdb", "fontdb",
"libm", "libm",
"log", "log",
@ -851,10 +848,8 @@ dependencies = [
"rustc-hash", "rustc-hash",
"rustybuzz", "rustybuzz",
"self_cell", "self_cell",
"serde",
"swash", "swash",
"sys-locale", "sys-locale",
"ttf-parser 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)",
"unicode-bidi", "unicode-bidi",
"unicode-linebreak", "unicode-linebreak",
"unicode-script", "unicode-script",
@ -1303,16 +1298,16 @@ dependencies = [
[[package]] [[package]]
name = "fontdb" name = "fontdb"
version = "0.16.0" version = "0.15.0"
source = "git+https://github.com/StratusFearMe21/fontdb?branch=serde#145231493e0315a1c6a5ca41cbed8db99fd4a22d" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "020e203f177c0fb250fb19455a252e838d2bbbce1f80f25ecc42402aafa8cd38"
dependencies = [ dependencies = [
"fontconfig-parser", "fontconfig-parser",
"log", "log",
"memmap2", "memmap2 0.8.0",
"serde",
"slotmap", "slotmap",
"tinyvec", "tinyvec",
"ttf-parser 0.20.0 (git+https://github.com/StratusFearMe21/ttf-parser?branch=serde)", "ttf-parser 0.19.2",
] ]
[[package]] [[package]]
@ -1541,7 +1536,8 @@ dependencies = [
[[package]] [[package]]
name = "glyphon" name = "glyphon"
version = "0.5.0" version = "0.5.0"
source = "git+https://github.com/StratusFearMe21/glyphon#e6851e7c2880119ff5f927ef5415f0ef4a970cc7" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a62d0338e4056db6a73221c2fb2e30619452f6ea9651bac4110f51b0f7a7581"
dependencies = [ dependencies = [
"cosmic-text", "cosmic-text",
"etagere", "etagere",
@ -1881,6 +1877,15 @@ version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
[[package]]
name = "memmap2"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43a5a03cefb0d953ec0be133036f14e109412fa594edc2f77227249db66cc3ed"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "memmap2" name = "memmap2"
version = "0.9.4" version = "0.9.4"
@ -2150,7 +2155,7 @@ version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7"
dependencies = [ dependencies = [
"ttf-parser 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", "ttf-parser 0.20.0",
] ]
[[package]] [[package]]
@ -2377,9 +2382,6 @@ name = "rangemap"
version = "1.5.1" version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "raw-window-handle" name = "raw-window-handle"
@ -2496,15 +2498,15 @@ dependencies = [
[[package]] [[package]]
name = "rustybuzz" name = "rustybuzz"
version = "0.12.1" version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0ae5692c5beaad6a9e22830deeed7874eae8a4e3ba4076fb48e12c56856222c" checksum = "2ee8fe2a8461a0854a37101fe7a1b13998d0cfa987e43248e81d2a5f4570f6fa"
dependencies = [ dependencies = [
"bitflags 2.4.2", "bitflags 1.3.2",
"bytemuck", "bytemuck",
"libm", "libm",
"smallvec", "smallvec",
"ttf-parser 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", "ttf-parser 0.20.0",
"unicode-bidi-mirroring", "unicode-bidi-mirroring",
"unicode-ccc", "unicode-ccc",
"unicode-properties", "unicode-properties",
@ -2540,7 +2542,7 @@ checksum = "82b2eaf3a5b264a521b988b2e73042e742df700c4f962cde845d1541adb46550"
dependencies = [ dependencies = [
"ab_glyph", "ab_glyph",
"log", "log",
"memmap2", "memmap2 0.9.4",
"smithay-client-toolkit", "smithay-client-toolkit",
"tiny-skia", "tiny-skia",
] ]
@ -2623,7 +2625,6 @@ version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a"
dependencies = [ dependencies = [
"serde",
"version_check", "version_check",
] ]
@ -2645,7 +2646,7 @@ dependencies = [
"cursor-icon", "cursor-icon",
"libc", "libc",
"log", "log",
"memmap2", "memmap2 0.9.4",
"rustix 0.38.31", "rustix 0.38.31",
"thiserror", "thiserror",
"wayland-backend", "wayland-backend",
@ -2899,17 +2900,15 @@ dependencies = [
[[package]] [[package]]
name = "ttf-parser" name = "ttf-parser"
version = "0.20.0" version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" checksum = "49d64318d8311fc2668e48b63969f4343e0a85c4a109aa8460d6672e364b8bd1"
[[package]] [[package]]
name = "ttf-parser" name = "ttf-parser"
version = "0.20.0" version = "0.20.0"
source = "git+https://github.com/StratusFearMe21/ttf-parser?branch=serde#0599c4c650883cf6add9d7b78329a17b736bf060" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4"
"serde",
]
[[package]] [[package]]
name = "type-map" name = "type-map"
@ -3677,7 +3676,7 @@ dependencies = [
"js-sys", "js-sys",
"libc", "libc",
"log", "log",
"memmap2", "memmap2 0.9.4",
"ndk", "ndk",
"ndk-sys", "ndk-sys",
"objc2 0.4.1", "objc2 0.4.1",

View file

@ -8,8 +8,8 @@ edition = "2021"
[dependencies] [dependencies]
egui = { version = "0.26.2", default-features = false } egui = { version = "0.26.2", default-features = false }
egui-wgpu = "0.26.2" egui-wgpu = "0.26.2"
glyphon = { git = "https://github.com/StratusFearMe21/glyphon", version = "0.5.0" } glyphon = "0.5.0"
[dev-dependencies] [dev-dependencies]
eframe = { version = "0.26.2", features = ["wgpu"] } eframe = { version = "0.26.2", features = ["wgpu"] }
env_logger = "0.11.1" env_logger = "0.11.3"

View file

@ -1,9 +1,6 @@
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release
use std::{ use std::sync::Arc;
ops::{Deref, DerefMut},
sync::Arc,
};
use eframe::{ use eframe::{
egui::{self, Slider}, egui::{self, Slider},
@ -18,6 +15,7 @@ use egui_glyphon::{
glyphon::{Attrs, Family, FontSystem, Metrics, Shaping}, glyphon::{Attrs, Family, FontSystem, Metrics, Shaping},
BufferWithTextArea, GlyphonRenderer, GlyphonRendererCallback, BufferWithTextArea, GlyphonRenderer, GlyphonRendererCallback,
}; };
use glyphon::Buffer;
fn main() -> Result<(), eframe::Error> { fn main() -> Result<(), eframe::Error> {
env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`). env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`).
@ -32,27 +30,6 @@ fn main() -> Result<(), eframe::Error> {
) )
} }
struct Buffer(egui_glyphon::glyphon::Buffer);
impl AsRef<egui_glyphon::glyphon::Buffer> for Buffer {
fn as_ref(&self) -> &egui_glyphon::glyphon::Buffer {
&self.0
}
}
impl Deref for Buffer {
type Target = egui_glyphon::glyphon::Buffer;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl DerefMut for Buffer {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
struct MyApp { struct MyApp {
font_system: Arc<Mutex<FontSystem>>, font_system: Arc<Mutex<FontSystem>>,
size: f32, size: f32,
@ -62,14 +39,17 @@ struct MyApp {
impl Default for MyApp { impl Default for MyApp {
fn default() -> Self { fn default() -> Self {
let mut font_system = FontSystem::new(); let mut font_system = FontSystem::new();
let mut buffer = Buffer(egui_glyphon::glyphon::Buffer::new( let mut buffer =
&mut font_system, egui_glyphon::glyphon::Buffer::new(&mut font_system, Metrics::new(30.0, 42.0));
Metrics::new(30.0, 42.0),
));
buffer.set_size(&mut font_system, 16.0, 9.0); buffer.set_size(&mut font_system, 16.0, 9.0);
buffer.set_text(&mut font_system, "<== Hello world! ==> 👋\nThis is rendered with 🦅 glyphon 🦁\nThe text below should be partially clipped.\na b c d e f g h i j k l m n o p q r s t u v w x y z", Attrs::new().family(Family::SansSerif), Shaping::Advanced); buffer.set_text(&mut font_system, "<== Hello world! ==> 👋\nThis is rendered with 🦅 glyphon 🦁\nThe text below should be partially clipped.\na b c d e f g h i j k l m n o p q r s t u v w x y z fi ffi 🐕‍🦺 fi ffi
buffer.shape_until_scroll(&mut font_system, true); fi تما 🐕🦺 ffi تما
ffi fi 🐕🦺 ffi fi
تما تما 🐕🦺 تما
تما ffi 🐕🦺 تما fi تما
تما تما 🐕🦺 تما", Attrs::new().family(Family::SansSerif), Shaping::Advanced);
buffer.shape_until_scroll(&mut font_system);
Self { Self {
font_system: Arc::new(Mutex::new(font_system)), font_system: Arc::new(Mutex::new(font_system)),
buffer: Arc::new(RwLock::new(buffer)), buffer: Arc::new(RwLock::new(buffer)),
@ -99,14 +79,14 @@ impl eframe::App for MyApp {
let mut buffer = self.buffer.write(); let mut buffer = self.buffer.write();
buffer.set_metrics(&mut font_system, Metrics::new(self.size, self.size)); buffer.set_metrics(&mut font_system, Metrics::new(self.size, self.size));
buffer.set_size(&mut font_system, size.x, size.y); buffer.set_size(&mut font_system, size.x, size.y);
buffer.shape_until_scroll(&mut font_system, true); buffer.shape_until_scroll(&mut font_system);
} }
egui::CentralPanel::default().show(ctx, |ui| { egui::CentralPanel::default().show(ctx, |ui| {
ui.add(Slider::new(&mut self.size, 0.1..=67.5)); ui.add(Slider::new(&mut self.size, 0.1..=67.5));
let rect = Rect::from_min_size(ui.cursor().min, size); let rect = Rect::from_min_size(ui.cursor().min, size);
let buffers: Vec<BufferWithTextArea<Buffer>> = vec![BufferWithTextArea::new( let buffers: Vec<BufferWithTextArea> = vec![BufferWithTextArea::new(
Arc::clone(&self.buffer), self.buffer.clone(),
rect, rect,
1.0, 1.0,
egui_glyphon::glyphon::Color::rgb(255, 255, 255), egui_glyphon::glyphon::Color::rgb(255, 255, 255),

View file

@ -1,6 +1,6 @@
//! This crate is for using [`glyphon`] to render advanced shaped text to the screen in an [`egui`] application //! This crate is for using [`glyphon`] to render advanced shaped text to the screen in an [`egui`] application
//! Please see the example for a primer on how to use this crate //! Please see the example for a primer on how to use this crate
use std::ops::{Deref, DerefMut}; use std::ops::DerefMut;
use std::sync::Arc; use std::sync::Arc;
use egui::mutex::{Mutex, RwLock}; use egui::mutex::{Mutex, RwLock};
@ -15,8 +15,8 @@ use glyphon::{
pub use glyphon; pub use glyphon;
/// A text buffer with some accosiated data used to construect a [`glyphon::TextArea`] /// A text buffer with some accosiated data used to construect a [`glyphon::TextArea`]
pub struct BufferWithTextArea<T: AsRef<Buffer> + Send + Sync> { pub struct BufferWithTextArea {
pub buffer: Arc<RwLock<T>>, pub buffer: Arc<RwLock<Buffer>>,
pub rect: Rect, pub rect: Rect,
pub scale: f32, pub scale: f32,
pub opacity: f32, pub opacity: f32,
@ -47,9 +47,9 @@ pub fn measure_buffer(buffer: &Buffer) -> Rect {
) )
} }
impl<T: AsRef<Buffer> + Send + Sync + 'static> BufferWithTextArea<T> { impl BufferWithTextArea {
pub fn new( pub fn new(
buffer: Arc<RwLock<T>>, buffer: Arc<RwLock<Buffer>>,
rect: Rect, rect: Rect,
opacity: f32, opacity: f32,
default_color: Color, default_color: Color,
@ -77,10 +77,7 @@ pub struct GlyphonRenderer {
impl GlyphonRenderer { impl GlyphonRenderer {
/// Insert an instance of itself into the [`egui_wgpu::RenderState`] /// Insert an instance of itself into the [`egui_wgpu::RenderState`]
pub fn insert<'a>( pub fn insert(wgpu_render_state: &egui_wgpu::RenderState, font_system: Arc<Mutex<FontSystem>>) {
wgpu_render_state: &'a egui_wgpu::RenderState,
font_system: Arc<Mutex<FontSystem>>,
) {
let device = &wgpu_render_state.device; let device = &wgpu_render_state.device;
let queue = &wgpu_render_state.queue; let queue = &wgpu_render_state.queue;
@ -89,7 +86,7 @@ impl GlyphonRenderer {
device, device,
queue, queue,
wgpu_render_state.target_format, wgpu_render_state.target_format,
ColorMode::Egui, ColorMode::Web,
); );
let text_renderer = let text_renderer =
TextRenderer::new(&mut atlas, device, wgpu::MultisampleState::default(), None); TextRenderer::new(&mut atlas, device, wgpu::MultisampleState::default(), None);
@ -106,12 +103,12 @@ impl GlyphonRenderer {
}); });
} }
fn prepare<A: AsRef<Buffer>, T: Deref<Target = A>>( fn prepare<'a>(
&mut self, &mut self,
device: &wgpu::Device, device: &wgpu::Device,
queue: &wgpu::Queue, queue: &wgpu::Queue,
screen_resolution: Resolution, screen_resolution: Resolution,
text_areas: impl IntoIterator<Item = TextArea<A, T>>, text_areas: impl IntoIterator<Item = TextArea<'a>>,
) -> Result<(), PrepareError> { ) -> Result<(), PrepareError> {
self.text_renderer.prepare( self.text_renderer.prepare(
device, device,
@ -132,12 +129,12 @@ impl GlyphonRenderer {
/// A callback which can be put into an [`egui_wgpu::renderer::Callback`]. /// A callback which can be put into an [`egui_wgpu::renderer::Callback`].
// And wrapped with an [`egui::PaintCallback`]. Only add one callback per individual // And wrapped with an [`egui::PaintCallback`]. Only add one callback per individual
// deffered viewport. // deffered viewport.
pub struct GlyphonRendererCallback<T: AsRef<Buffer> + Send + Sync> { pub struct GlyphonRendererCallback {
/// These buffers will be rendered to the screen all at the same time on the same layer. /// These buffers will be rendered to the screen all at the same time on the same layer.
pub buffers: Vec<BufferWithTextArea<T>>, pub buffers: Vec<BufferWithTextArea>,
} }
impl<T: AsRef<Buffer> + Send + Sync> egui_wgpu::CallbackTrait for GlyphonRendererCallback<T> { impl egui_wgpu::CallbackTrait for GlyphonRendererCallback {
fn prepare( fn prepare(
&self, &self,
device: &wgpu::Device, device: &wgpu::Device,
@ -148,6 +145,25 @@ impl<T: AsRef<Buffer> + Send + Sync> egui_wgpu::CallbackTrait for GlyphonRendere
) -> Vec<wgpu::CommandBuffer> { ) -> Vec<wgpu::CommandBuffer> {
let glyphon_renderer: &mut GlyphonRenderer = resources.get_mut().unwrap(); let glyphon_renderer: &mut GlyphonRenderer = resources.get_mut().unwrap();
glyphon_renderer.atlas.trim(); glyphon_renderer.atlas.trim();
let bufrefs: Vec<_> = self.buffers.iter().map(|b| b.buffer.read()).collect();
let text_areas: Vec<_> = self
.buffers
.iter()
.enumerate()
.map(|(i, b)| TextArea {
buffer: bufrefs.get(i).unwrap(),
left: b.rect.left(),
top: b.rect.top(),
scale: b.scale,
bounds: TextBounds {
left: b.rect.left() as i32,
top: b.rect.top() as i32,
right: b.rect.right() as i32,
bottom: b.rect.bottom() as i32,
},
default_color: b.default_color,
})
.collect();
glyphon_renderer glyphon_renderer
.prepare( .prepare(
device, device,
@ -156,20 +172,7 @@ impl<T: AsRef<Buffer> + Send + Sync> egui_wgpu::CallbackTrait for GlyphonRendere
width: screen_descriptor.size_in_pixels[0], width: screen_descriptor.size_in_pixels[0],
height: screen_descriptor.size_in_pixels[1], height: screen_descriptor.size_in_pixels[1],
}, },
self.buffers.iter().map(|b| TextArea { text_areas,
buffer: b.buffer.read(),
left: b.rect.left(),
top: b.rect.top(),
scale: b.scale,
opacity: b.opacity,
bounds: TextBounds {
left: b.rect.left() as i32,
top: b.rect.top() as i32,
right: b.rect.right() as i32,
bottom: b.rect.bottom() as i32,
},
default_color: b.default_color,
}),
) )
.unwrap(); .unwrap();
Vec::new() Vec::new()