From b41d01ac9b4dae3dc55e74f232160898a20d41ff Mon Sep 17 00:00:00 2001 From: hanabi1224 Date: Thu, 5 Aug 2021 16:44:30 +0800 Subject: [PATCH 1/3] Add webp support to texture loader --- Cargo.toml | 1 + crates/bevy_internal/Cargo.toml | 1 + crates/bevy_render/Cargo.toml | 4 +++- .../src/texture/image_texture_loader.rs | 2 ++ crates/bevy_render/src/texture/texture.rs | 15 ++++++++++++++- 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d71a7ae47611d..f5594df85cc85 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -64,6 +64,7 @@ dds = ["bevy_internal/dds"] tga = ["bevy_internal/tga"] jpeg = ["bevy_internal/jpeg"] bmp = ["bevy_internal/bmp"] +webp = ["bevy_internal/webp"] # Audio format support (MP3 is enabled by default) flac = ["bevy_internal/flac"] diff --git a/crates/bevy_internal/Cargo.toml b/crates/bevy_internal/Cargo.toml index 64460a5d7e98a..fd9488f5aa7fd 100644 --- a/crates/bevy_internal/Cargo.toml +++ b/crates/bevy_internal/Cargo.toml @@ -25,6 +25,7 @@ dds = ["bevy_render/dds"] tga = ["bevy_render/tga"] jpeg = ["bevy_render/jpeg"] bmp = ["bevy_render/bmp"] +webp = ["bevy_render/webp"] # Audio format support (MP3 is enabled by default) flac = ["bevy_audio/flac"] diff --git a/crates/bevy_render/Cargo.toml b/crates/bevy_render/Cargo.toml index 7c82d528ea540..3dcb81f1d8500 100644 --- a/crates/bevy_render/Cargo.toml +++ b/crates/bevy_render/Cargo.toml @@ -26,7 +26,8 @@ bevy_window = { path = "../bevy_window", version = "0.5.0" } bevy_utils = { path = "../bevy_utils", version = "0.5.0" } # rendering -image = { version = "0.23.12", default-features = false } +image = { version = "0.23.14", default-features = false } +webp_lib = { package = "webp", version = "0.1.3", optional = true} # misc serde = { version = "1", features = ["derive"] } @@ -55,3 +56,4 @@ dds = ["image/dds"] tga = ["image/tga"] jpeg = ["image/jpeg"] bmp = ["image/bmp"] +webp = ["webp_lib"] diff --git a/crates/bevy_render/src/texture/image_texture_loader.rs b/crates/bevy_render/src/texture/image_texture_loader.rs index a0527020de559..5b5558aa5d403 100644 --- a/crates/bevy_render/src/texture/image_texture_loader.rs +++ b/crates/bevy_render/src/texture/image_texture_loader.rs @@ -21,6 +21,8 @@ const FILE_EXTENSIONS: &[&str] = &[ "jpeg", #[cfg(feature = "bmp")] "bmp", + #[cfg(feature = "webp")] + "webp", ]; impl AssetLoader for ImageTextureLoader { diff --git a/crates/bevy_render/src/texture/texture.rs b/crates/bevy_render/src/texture/texture.rs index 2a349a0fd0770..1193d68a43f4f 100644 --- a/crates/bevy_render/src/texture/texture.rs +++ b/crates/bevy_render/src/texture/texture.rs @@ -230,6 +230,7 @@ impl Texture { "image/jpeg" => Ok(image::ImageFormat::Jpeg), "image/bmp" => Ok(image::ImageFormat::Bmp), "image/x-bmp" => Ok(image::ImageFormat::Bmp), + "image/webp" => Ok(image::ImageFormat::WebP), _ => Err(TextureError::InvalidImageMimeType(mime_type.to_string())), }, ImageType::Extension(extension) => image::ImageFormat::from_extension(extension) @@ -242,7 +243,19 @@ impl Texture { // needs to be added, so the image data needs to be converted in those // cases. - let dyn_img = image::load_from_memory_with_format(buffer, format)?; + let dyn_img = match format { + image::ImageFormat::WebP => webp_lib::Decoder::new(buffer) + .decode() + .ok_or_else(|| { + TextureError::ImageError(image::ImageError::Decoding( + image::error::DecodingError::from_format_hint( + image::error::ImageFormatHint::Exact(format), + ), + )) + })? + .to_image(), + _ => image::load_from_memory_with_format(buffer, format)?, + }; Ok(dyn_img.into()) } } From c73653dc2d55f7fb1c5fab0bc61de5e911068c9c Mon Sep 17 00:00:00 2001 From: hanabi1224 Date: Thu, 5 Aug 2021 17:09:50 +0800 Subject: [PATCH 2/3] update doc and changelog --- CHANGELOG.md | 13 +++++++++++++ docs/cargo_features.md | 1 + 2 files changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 73f9575c4c263..062873e01e5ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,19 @@ current changes on git with [previous release tags][git_tag_comparison]. [git_tag_comparison]: https://github.com/bevyengine/bevy/compare/v0.5.0...main +## Unreleased + +### Added + +- [Add webp as a supported texture format (C compiler required)][2600] + +### Changed + +### Fixed + + +[2600]: https://github.com/bevyengine/bevy/pull/2600 + ## Version 0.5.0 (2021-04-06) ### Added diff --git a/docs/cargo_features.md b/docs/cargo_features.md index b7dd276f2b73d..908aafc36392b 100644 --- a/docs/cargo_features.md +++ b/docs/cargo_features.md @@ -28,6 +28,7 @@ |tga|TGA picture format support.| |jpeg|JPEG picture format support.| |bmp|BMP picture format support.| +|webp|WEBP picture format support. (C compiler required)| |flac|FLAC audio format support. It's included in bevy_audio feature.| |wav|WAV audio format support.| |vorbis|Vorbis audio format support.| From bc093f199f73a21f35dfbc763bd6a97f8b40574f Mon Sep 17 00:00:00 2001 From: hanabi1224 Date: Sat, 7 Aug 2021 20:15:36 +0800 Subject: [PATCH 3/3] fix build break w/o webp feature --- CHANGELOG.md | 1 - crates/bevy_render/Cargo.toml | 2 +- crates/bevy_render/src/lib.rs | 6 ++++-- crates/bevy_render/src/texture/texture.rs | 2 ++ 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 062873e01e5ae..2c333d1787c16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,7 +19,6 @@ current changes on git with [previous release tags][git_tag_comparison]. ### Fixed - [2600]: https://github.com/bevyengine/bevy/pull/2600 ## Version 0.5.0 (2021-04-06) diff --git a/crates/bevy_render/Cargo.toml b/crates/bevy_render/Cargo.toml index 3dcb81f1d8500..9db4bbe1f13e0 100644 --- a/crates/bevy_render/Cargo.toml +++ b/crates/bevy_render/Cargo.toml @@ -56,4 +56,4 @@ dds = ["image/dds"] tga = ["image/tga"] jpeg = ["image/jpeg"] bmp = ["image/bmp"] -webp = ["webp_lib"] +webp = ["image/webp", "webp_lib"] diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index e26be98280c1c..ed40faca99b19 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -63,7 +63,8 @@ use texture::HdrTextureLoader; feature = "dds", feature = "tga", feature = "jpeg", - feature = "bmp" + feature = "bmp", + feature = "webp" ))] use texture::ImageTextureLoader; @@ -108,7 +109,8 @@ impl Plugin for RenderPlugin { feature = "dds", feature = "tga", feature = "jpeg", - feature = "bmp" + feature = "bmp", + feature = "webp" ))] { app.init_asset_loader::(); diff --git a/crates/bevy_render/src/texture/texture.rs b/crates/bevy_render/src/texture/texture.rs index 1193d68a43f4f..9bd8080745265 100644 --- a/crates/bevy_render/src/texture/texture.rs +++ b/crates/bevy_render/src/texture/texture.rs @@ -230,6 +230,7 @@ impl Texture { "image/jpeg" => Ok(image::ImageFormat::Jpeg), "image/bmp" => Ok(image::ImageFormat::Bmp), "image/x-bmp" => Ok(image::ImageFormat::Bmp), + #[cfg(feature = "webp")] "image/webp" => Ok(image::ImageFormat::WebP), _ => Err(TextureError::InvalidImageMimeType(mime_type.to_string())), }, @@ -244,6 +245,7 @@ impl Texture { // cases. let dyn_img = match format { + #[cfg(feature = "webp")] image::ImageFormat::WebP => webp_lib::Decoder::new(buffer) .decode() .ok_or_else(|| {