diff --git a/Cargo.lock b/Cargo.lock index 983d073096d..361c64ec158 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -884,7 +884,7 @@ dependencies = [ "euclid", "gfx_traits", "gleam 0.12.1", - "image 0.24.1", + "image 0.24.2", "ipc-channel", "keyboard-types", "libc", @@ -2977,9 +2977,9 @@ dependencies = [ [[package]] name = "image" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db207d030ae38f1eb6f240d5a1c1c88ff422aa005d10f8c6c6fc5e75286ab30e" +checksum = "28edd9d7bc256be2502e325ac0628bde30b7001b9b52e0abe31a1a9dc2701212" dependencies = [ "bytemuck", "byteorder", @@ -4180,7 +4180,7 @@ dependencies = [ "http", "hyper 0.14.5", "hyper_serde", - "image 0.24.1", + "image 0.24.2", "ipc-channel", "lazy_static", "log", @@ -5387,7 +5387,7 @@ dependencies = [ "html5ever", "http", "hyper_serde", - "image 0.24.1", + "image 0.24.2", "indexmap", "ipc-channel", "itertools", @@ -5665,7 +5665,7 @@ dependencies = [ "clipboard", "euclid", "getopts", - "image 0.24.1", + "image 0.24.2", "keyboard-types", "lazy_static", "libc", @@ -7301,7 +7301,7 @@ dependencies = [ "euclid", "headers", "http", - "image 0.24.1", + "image 0.24.2", "ipc-channel", "keyboard-types", "log", diff --git a/components/net_traits/Cargo.toml b/components/net_traits/Cargo.toml index f35cbff8b69..ffd51ff2063 100644 --- a/components/net_traits/Cargo.toml +++ b/components/net_traits/Cargo.toml @@ -20,6 +20,7 @@ headers = "0.3" http = "0.2" hyper = "0.14" hyper_serde = "0.13" +image = "0.24" ipc-channel = "0.14" lazy_static = "1" log = "0.4" @@ -29,7 +30,6 @@ mime = "0.3" msg = { path = "../msg" } num-traits = "0.2" percent-encoding = "2.0" -piston_image = { package = "image", version = "0.24" } pixels = { path = "../pixels" } serde = "1.0" servo_arc = { path = "../servo_arc" } diff --git a/components/net_traits/image/base.rs b/components/net_traits/image/base.rs index d77855aee27..0fd2f357d2b 100644 --- a/components/net_traits/image/base.rs +++ b/components/net_traits/image/base.rs @@ -3,8 +3,8 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use crate::image_cache::CorsStatus; +use image::ImageFormat; use ipc_channel::ipc::IpcSharedMemory; -use piston_image::ImageFormat; use pixels::PixelFormat; use std::fmt; @@ -50,7 +50,7 @@ pub fn load_from_memory(buffer: &[u8], cors_status: CorsStatus) -> Option debug!("{}", msg); None }, - Ok(_) => match piston_image::load_from_memory(buffer) { + Ok(_) => match image::load_from_memory(buffer) { Ok(image) => { let mut rgba = image.into_rgba8(); pixels::rgba8_byte_swap_colors_inplace(&mut *rgba); @@ -79,6 +79,8 @@ pub fn detect_image_format(buffer: &[u8]) -> Result { Ok(ImageFormat::Jpeg) } else if is_png(buffer) { Ok(ImageFormat::Png) + } else if is_webp(buffer) { + Ok(ImageFormat::WebP) } else if is_bmp(buffer) { Ok(ImageFormat::Bmp) } else if is_ico(buffer) { @@ -107,3 +109,7 @@ fn is_bmp(buffer: &[u8]) -> bool { fn is_ico(buffer: &[u8]) -> bool { buffer.starts_with(&[0x00, 0x00, 0x01, 0x00]) } + +fn is_webp(buffer: &[u8]) -> bool { + buffer.starts_with(b"RIFF") && buffer.len() >= 14 && &buffer[8..14] == b"WEBPVP" +} diff --git a/components/net_traits/tests/image.rs b/components/net_traits/tests/image.rs index 181f1c915e1..a4963702b57 100644 --- a/components/net_traits/tests/image.rs +++ b/components/net_traits/tests/image.rs @@ -10,6 +10,9 @@ fn test_supported_images() { let gif2 = [b'G', b'I', b'F', b'8', b'9', b'a']; let jpeg = [0xff, 0xd8, 0xff]; let png = [0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A]; + let webp = [ + b'R', b'I', b'F', b'F', 0x01, 0x02, 0x03, 0x04, b'W', b'E', b'B', b'P', b'V', b'P', + ]; let bmp = [0x42, 0x4D]; let ico = [0x00, 0x00, 0x01, 0x00]; let junk_format = [0x01, 0x02, 0x03, 0x04, 0x05]; @@ -18,6 +21,7 @@ fn test_supported_images() { assert!(detect_image_format(&gif2).is_ok()); assert!(detect_image_format(&jpeg).is_ok()); assert!(detect_image_format(&png).is_ok()); + assert!(detect_image_format(&webp).is_ok()); assert!(detect_image_format(&bmp).is_ok()); assert!(detect_image_format(&ico).is_ok()); assert!(detect_image_format(&junk_format).is_err());