From 54ae2360ec7313dc2f04ca5a9d832ccd33d88059 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 21 May 2025 17:18:36 +0200 Subject: [PATCH] Fix incorrect color fringe colors on SVG:s (#7069) This is a problem that affected the fringes on all SVG:s with transparency, especially on a light background. ## Before ![image](https://github.com/user-attachments/assets/342823ad-005c-4f82-83a6-d2dcccfd3221) ## After ![image](https://github.com/user-attachments/assets/73398265-d333-461b-8c2b-fce405d95a9c) --- crates/egui_demo_lib/Cargo.toml | 4 +-- crates/egui_demo_lib/data/peace.svg | 11 +++++++ .../src/demo/demo_app_windows.rs | 1 + crates/egui_demo_lib/src/demo/tests/mod.rs | 2 ++ .../egui_demo_lib/src/demo/tests/svg_test.rs | 32 +++++++++++++++++++ crates/egui_extras/src/image.rs | 2 +- 6 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 crates/egui_demo_lib/data/peace.svg create mode 100644 crates/egui_demo_lib/src/demo/tests/svg_test.rs diff --git a/crates/egui_demo_lib/Cargo.toml b/crates/egui_demo_lib/Cargo.toml index 013e2d24..a86f3dcd 100644 --- a/crates/egui_demo_lib/Cargo.toml +++ b/crates/egui_demo_lib/Cargo.toml @@ -16,7 +16,7 @@ include = [ "../LICENSE-MIT", "**/*.rs", "Cargo.toml", - "data/icon.png", + "data/*", ] [lints] @@ -43,7 +43,7 @@ syntect = ["egui_extras/syntect"] [dependencies] egui = { workspace = true, default-features = false, features = ["color-hex"] } -egui_extras = { workspace = true, features = ["default"] } +egui_extras = { workspace = true, features = ["default", "file", "svg"] } unicode_names2 = { version = "0.6.0", default-features = false } # this old version has fewer dependencies diff --git a/crates/egui_demo_lib/data/peace.svg b/crates/egui_demo_lib/data/peace.svg new file mode 100644 index 00000000..4bf3e33a --- /dev/null +++ b/crates/egui_demo_lib/data/peace.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/crates/egui_demo_lib/src/demo/demo_app_windows.rs b/crates/egui_demo_lib/src/demo/demo_app_windows.rs index 7b897278..892c6f40 100644 --- a/crates/egui_demo_lib/src/demo/demo_app_windows.rs +++ b/crates/egui_demo_lib/src/demo/demo_app_windows.rs @@ -100,6 +100,7 @@ impl Default for DemoGroups { Box::::default(), Box::::default(), Box::::default(), + Box::::default(), Box::::default(), Box::::default(), ]), diff --git a/crates/egui_demo_lib/src/demo/tests/mod.rs b/crates/egui_demo_lib/src/demo/tests/mod.rs index d9fad538..dc69cca7 100644 --- a/crates/egui_demo_lib/src/demo/tests/mod.rs +++ b/crates/egui_demo_lib/src/demo/tests/mod.rs @@ -6,6 +6,7 @@ mod input_event_history; mod input_test; mod layout_test; mod manual_layout_test; +mod svg_test; mod tessellation_test; mod window_resize_test; @@ -17,5 +18,6 @@ pub use input_event_history::InputEventHistory; pub use input_test::InputTest; pub use layout_test::LayoutTest; pub use manual_layout_test::ManualLayoutTest; +pub use svg_test::SvgTest; pub use tessellation_test::TessellationTest; pub use window_resize_test::WindowResizeTest; diff --git a/crates/egui_demo_lib/src/demo/tests/svg_test.rs b/crates/egui_demo_lib/src/demo/tests/svg_test.rs new file mode 100644 index 00000000..a75c29d7 --- /dev/null +++ b/crates/egui_demo_lib/src/demo/tests/svg_test.rs @@ -0,0 +1,32 @@ +pub struct SvgTest { + color: egui::Color32, +} + +impl Default for SvgTest { + fn default() -> Self { + Self { + color: egui::Color32::LIGHT_RED, + } + } +} + +impl crate::Demo for SvgTest { + fn name(&self) -> &'static str { + "SVG Test" + } + + fn show(&mut self, ctx: &egui::Context, open: &mut bool) { + egui::Window::new(self.name()).open(open).show(ctx, |ui| { + use crate::View as _; + self.ui(ui); + }); + } +} + +impl crate::View for SvgTest { + fn ui(&mut self, ui: &mut egui::Ui) { + let Self { color } = self; + ui.color_edit_button_srgba(color); + ui.add(egui::Image::new(egui::include_image!("../../../data/peace.svg")).tint(*color)); + } +} diff --git a/crates/egui_extras/src/image.rs b/crates/egui_extras/src/image.rs index d7aa3126..fd97fb87 100644 --- a/crates/egui_extras/src/image.rs +++ b/crates/egui_extras/src/image.rs @@ -295,7 +295,7 @@ pub fn load_svg_bytes_with_size( &mut pixmap.as_mut(), ); - let image = egui::ColorImage::from_rgba_unmultiplied([w as _, h as _], pixmap.data()); + let image = egui::ColorImage::from_rgba_premultiplied([w as _, h as _], pixmap.data()); Ok(image) }