From 3a92f3c8eacc4b5b51bf31280032113d9840ea03 Mon Sep 17 00:00:00 2001 From: HampusM Date: Thu, 26 Mar 2026 14:49:36 +0100 Subject: refactor(engine): pass color space when generating GL texture --- Cargo.lock | 68 ++++++++++++++++++++++++++++--------------- engine/Cargo.toml | 2 +- engine/src/image.rs | 10 ++++++- engine/src/renderer/opengl.rs | 6 ++++ 4 files changed, 60 insertions(+), 26 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8363a2c..c7b88ee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -179,10 +179,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" [[package]] -name = "byteorder" -version = "1.5.0" +name = "byteorder-lite" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" [[package]] name = "bytes" @@ -332,12 +332,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" -[[package]] -name = "color_quant" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" - [[package]] name = "combine" version = "4.6.7" @@ -825,16 +819,17 @@ checksum = "fbd780fe5cc30f81464441920d82ac8740e2e46b29a6fad543ddd075229ce37e" [[package]] name = "image" -version = "0.24.9" +version = "0.25.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" dependencies = [ "bytemuck", - "byteorder", - "color_quant", - "jpeg-decoder", + "byteorder-lite", + "moxcms", "num-traits", "png", + "zune-core", + "zune-jpeg", ] [[package]] @@ -905,12 +900,6 @@ dependencies = [ "libc", ] -[[package]] -name = "jpeg-decoder" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" - [[package]] name = "js-sys" version = "0.3.77" @@ -946,7 +935,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] @@ -1044,6 +1033,16 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + [[package]] name = "ndk" version = "0.9.0" @@ -1480,11 +1479,11 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "png" -version = "0.17.16" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.9.0", "crc32fast", "fdeflate", "flate2", @@ -1553,6 +1552,12 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "pxfm" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" + [[package]] name = "quick-xml" version = "0.37.5" @@ -2788,3 +2793,18 @@ dependencies = [ "quote", "syn 2.0.100", ] + +[[package]] +name = "zune-core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb8a0807f7c01457d0379ba880ba6322660448ddebc890ce29bb64da71fb40f9" + +[[package]] +name = "zune-jpeg" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7a1c0af6e5d8d1363f4994b7a091ccf963d8b694f7da5b0b9cceb82da2c0a6" +dependencies = [ + "zune-core", +] diff --git a/engine/Cargo.toml b/engine/Cargo.toml index 9461ee9..424d09b 100644 --- a/engine/Cargo.toml +++ b/engine/Cargo.toml @@ -26,7 +26,7 @@ default-features = false features = ["rwh_06", "wayland", "wayland-dlopen", "x11"] [dependencies.image_rs] -version = "0.24.7" +version = "0.25.10" default-features = false features = ["png", "jpeg"] package = "image" diff --git a/engine/src/image.rs b/engine/src/image.rs index 7c18bf7..cf31a92 100644 --- a/engine/src/image.rs +++ b/engine/src/image.rs @@ -20,7 +20,7 @@ impl Image let buffered_reader = BufReader::new(File::open(&path).map_err(Error::ReadFailed)?); - let image_reader = image_rs::io::Reader::with_format( + let image_reader = image_rs::ImageReader::with_format( buffered_reader, image_rs::ImageFormat::from_path(path) .map_err(|_| Error::UnsupportedFormat)?, @@ -60,6 +60,14 @@ impl Image self.inner.color().into() } + pub fn color_space_is_srgb(&self) -> bool + { + match self.inner.color_space().primaries { + image_rs::metadata::CicpColorPrimaries::SRgb => true, + _ => false, + } + } + pub fn as_bytes(&self) -> &[u8] { self.inner.as_bytes() diff --git a/engine/src/renderer/opengl.rs b/engine/src/renderer/opengl.rs index a280073..11a4ca9 100644 --- a/engine/src/renderer/opengl.rs +++ b/engine/src/renderer/opengl.rs @@ -45,6 +45,7 @@ use opengl_bindings::shader::{ // UniformLocation as GlUniformLocation, }; use opengl_bindings::texture::{ + ColorSpace as GlTextureColorSpace, Filtering as GlTextureFiltering, GenerateError as GlTextureGenerateError, PixelDataFormat as GlTexturePixelDataFormat, @@ -1145,6 +1146,11 @@ fn create_gl_texture( unimplemented!(); } }, + if image.color_space_is_srgb() { + GlTextureColorSpace::Srgb + } else { + GlTextureColorSpace::Linear + }, )?; gl_texture.set_wrap( -- cgit v1.2.3-18-g5258