From 25b88c622c24f898afc9a8684bbf9b145890ff02 Mon Sep 17 00:00:00 2001 From: Simon Gellis Date: Sun, 8 Dec 2024 16:00:55 -0500 Subject: [PATCH] Set runtime icon --- Cargo.lock | 82 +++++++++++++++++++++++++++++++++++++++ Cargo.toml | 1 + assets/lemur-256x256.png | Bin 0 -> 25217 bytes src/app.rs | 37 ++++++++++++++---- 4 files changed, 113 insertions(+), 7 deletions(-) create mode 100644 assets/lemur-256x256.png diff --git a/Cargo.lock b/Cargo.lock index 793d401..9a2db48 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -18,6 +18,12 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + [[package]] name = "ahash" version = "0.8.11" @@ -494,6 +500,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.9.0" @@ -788,6 +800,15 @@ dependencies = [ "windows 0.54.0", ] +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-utils" version = "0.8.20" @@ -1071,6 +1092,25 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1535,6 +1575,18 @@ dependencies = [ "icu_properties", ] +[[package]] +name = "image" +version = "0.25.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd6f44aed642f18953a158afeb30206f4d50da59fbc66ecb53c66488de73563b" +dependencies = [ + "bytemuck", + "byteorder-lite", + "num-traits", + "png", +] + [[package]] name = "indexmap" version = "2.7.0" @@ -1663,6 +1715,7 @@ dependencies = [ "egui-winit", "egui_extras", "gilrs", + "image", "itertools", "num-derive", "num-traits", @@ -1827,6 +1880,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +dependencies = [ + "adler2", + "simd-adler32", +] + [[package]] name = "naga" version = "22.1.0" @@ -2354,6 +2417,19 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +[[package]] +name = "png" +version = "0.17.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67582bd5b65bdff614270e2ea89a1cf15bef71245cc1e5f7ea126977144211d" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "polling" version = "3.7.4" @@ -2711,6 +2787,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "slab" version = "0.4.9" diff --git a/Cargo.toml b/Cargo.toml index 71e98b2..7189cb2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ egui_extras = "0.29" egui-winit = "0.29" egui-wgpu = { version = "0.29", features = ["winit"] } gilrs = "0.11" +image = { version = "0.25", default-features = false, features = ["png"] } itertools = "0.13" num-derive = "0.4" num-traits = "0.2" diff --git a/assets/lemur-256x256.png b/assets/lemur-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..d0d12ff5ef58d68e376a7f815ece0d566c448af3 GIT binary patch literal 25217 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 literal 0 HcmV?d00001 diff --git a/src/app.rs b/src/app.rs index 052cf32..8f04ce1 100644 --- a/src/app.rs +++ b/src/app.rs @@ -2,8 +2,8 @@ use std::{collections::HashSet, num::NonZero, sync::Arc, thread, time::Duration} use egui::{ ahash::{HashMap, HashMapExt}, - Context, FontData, FontDefinitions, FontFamily, TextWrapMode, ViewportBuilder, ViewportCommand, - ViewportId, ViewportInfo, + Context, FontData, FontDefinitions, FontFamily, IconData, TextWrapMode, ViewportBuilder, + ViewportCommand, ViewportId, ViewportInfo, }; use gilrs::{EventType, Gilrs}; use winit::{ @@ -20,7 +20,19 @@ use crate::{ window::{AppWindow, GameWindow, InputWindow}, }; +fn load_icon() -> anyhow::Result { + let bytes = include_bytes!("../assets/lemur-256x256.png"); + let img = image::load_from_memory_with_format(bytes, image::ImageFormat::Png)?; + let rgba = img.into_rgba8(); + Ok(IconData { + width: rgba.width(), + height: rgba.height(), + rgba: rgba.into_vec(), + }) +} + pub struct Application { + icon: Option>, client: EmulatorClient, proxy: EventLoopProxy, mappings: MappingProvider, @@ -31,6 +43,7 @@ pub struct Application { impl Application { pub fn new(client: EmulatorClient, proxy: EventLoopProxy) -> Self { + let icon = load_icon().ok().map(Arc::new); let mappings = MappingProvider::new(); let controllers = ControllerManager::new(client.clone(), &mappings); { @@ -39,6 +52,7 @@ impl Application { thread::spawn(|| process_gamepad_input(mappings, proxy)); } Self { + icon, client, proxy, mappings, @@ -53,15 +67,17 @@ impl Application { if self.viewports.contains_key(&viewport_id) { return; } - self.viewports - .insert(viewport_id, Viewport::new(event_loop, window)); + self.viewports.insert( + viewport_id, + Viewport::new(event_loop, self.icon.clone(), window), + ); } } impl ApplicationHandler for Application { fn resumed(&mut self, event_loop: &ActiveEventLoop) { let app = GameWindow::new(self.client.clone(), self.proxy.clone(), SimId::Player1); - let wrapper = Viewport::new(event_loop, Box::new(app)); + let wrapper = Viewport::new(event_loop, self.icon.clone(), Box::new(app)); self.focused = Some(wrapper.id()); self.viewports.insert(wrapper.id(), wrapper); } @@ -192,7 +208,11 @@ struct Viewport { app: Box, } impl Viewport { - pub fn new(event_loop: &ActiveEventLoop, mut app: Box) -> Self { + pub fn new( + event_loop: &ActiveEventLoop, + icon: Option>, + mut app: Box, + ) -> Self { let mut painter = egui_wgpu::winit::Painter::new( egui_wgpu::WgpuConfiguration { present_mode: wgpu::PresentMode::AutoNoVsync, @@ -222,7 +242,10 @@ impl Viewport { }); let mut info = ViewportInfo::default(); - let builder = app.initial_viewport(); + let mut builder = app.initial_viewport(); + if let Some(icon) = icon { + builder = builder.with_icon(icon); + } let (window, state) = create_window_and_state(&ctx, event_loop, &builder, &mut painter); egui_winit::update_viewport_info(&mut info, &ctx, &window, true);