mirror of
https://github.com/emilk/egui.git
synced 2026-08-29 04:40:03 -04:00
Match image file extensions case-insensitively (#8430)
`image.PNG` and `cat.SVG` were not recognized as images. Adds `egui::load::has_extension(uri, extension)`, which ignores ASCII case and any `#fragment`, and uses it for the `.svg`, `.gif`, `.webp` and `.png` checks. Note: gif/webp URIs like `a#b.gif` no longer match, since the fragment is now excluded. * [x] I have followed the instructions in the PR template Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1720,7 +1720,7 @@ fn save_screenshot_and_exit(
|
||||
screen_size_in_pixels: [u32; 2],
|
||||
) {
|
||||
assert!(
|
||||
path.ends_with(".png"),
|
||||
egui::load::has_extension(path, "png"),
|
||||
"Expected EFRAME_SCREENSHOT_TO to end with '.png', got {path:?}"
|
||||
);
|
||||
let screenshot = painter.read_screen_rgba(screen_size_in_pixels);
|
||||
|
||||
@@ -306,6 +306,19 @@ macro_rules! generate_loader_id {
|
||||
}
|
||||
pub use crate::generate_loader_id;
|
||||
|
||||
/// Does the given URI end with the given file extension?
|
||||
///
|
||||
/// The comparison ignores ASCII case and any `#fragment` at the end of the URI,
|
||||
/// so `has_extension("cat.GIF#frame=2", "gif")` is `true`.
|
||||
///
|
||||
/// This is useful when implementing an [`ImageLoader`].
|
||||
pub fn has_extension(uri: &str, extension: &str) -> bool {
|
||||
let path = uri.split('#').next().unwrap_or(uri);
|
||||
std::path::Path::new(path)
|
||||
.extension()
|
||||
.is_some_and(|found| found.eq_ignore_ascii_case(extension))
|
||||
}
|
||||
|
||||
pub type BytesLoadResult = Result<BytesPoll>;
|
||||
|
||||
/// Represents a loader capable of loading raw unstructured bytes from somewhere,
|
||||
@@ -639,3 +652,14 @@ impl Loaders {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_has_extension() {
|
||||
assert!(has_extension("cat.svg", "svg"));
|
||||
assert!(has_extension("cat.SVG", "svg"));
|
||||
assert!(has_extension("http://example.com/cat.gif#frame=2", "gif"));
|
||||
assert!(!has_extension("cat.svg.png", "svg"));
|
||||
assert!(!has_extension("svg", "svg"));
|
||||
assert!(!has_extension("cat.jpeg", "jpg"));
|
||||
assert!(!has_extension("cat.svg?v=1", "svg"));
|
||||
}
|
||||
|
||||
@@ -150,5 +150,5 @@ impl TextureLoader for DefaultTextureLoader {
|
||||
}
|
||||
|
||||
fn is_svg(uri: &str) -> bool {
|
||||
uri.ends_with(".svg")
|
||||
super::has_extension(uri, "svg")
|
||||
}
|
||||
|
||||
@@ -934,7 +934,7 @@ fn animated_image_frame_index(ctx: &Context, uri: &str) -> usize {
|
||||
|
||||
/// Checks if uri is a gif file
|
||||
fn is_gif_uri(uri: &str) -> bool {
|
||||
uri.ends_with(".gif") || uri.contains(".gif#")
|
||||
crate::load::has_extension(uri, "gif")
|
||||
}
|
||||
|
||||
/// Checks if bytes are gifs
|
||||
@@ -944,7 +944,7 @@ pub fn has_gif_magic_header(bytes: &[u8]) -> bool {
|
||||
|
||||
/// Checks if uri is a webp file
|
||||
fn is_webp_uri(uri: &str) -> bool {
|
||||
uri.ends_with(".webp") || uri.contains(".webp#")
|
||||
crate::load::has_extension(uri, "webp")
|
||||
}
|
||||
|
||||
/// Checks if bytes are webp
|
||||
|
||||
@@ -29,7 +29,7 @@ impl SvgLoader {
|
||||
}
|
||||
|
||||
fn is_supported(uri: &str) -> bool {
|
||||
uri.ends_with(".svg")
|
||||
egui::load::has_extension(uri, "svg")
|
||||
}
|
||||
|
||||
impl Default for SvgLoader {
|
||||
|
||||
Reference in New Issue
Block a user