mirror of
https://github.com/servo/servo.git
synced 2025-09-23 05:10:09 +01:00
Update image to 0.25 (#38950)
Testing: These changes should be covered by existing web platform tests and `image`'s own test suite. --------- Signed-off-by: Simon Wülker <simon.wuelker@arcor.de>
This commit is contained in:
parent
ffe690c2dd
commit
c4dcd17214
6 changed files with 353 additions and 83 deletions
|
@ -14,10 +14,9 @@ use euclid::default::{Point2D, Rect, Size2D};
|
|||
use image::codecs::{bmp, gif, ico, jpeg, png, webp};
|
||||
use image::error::ImageFormatHint;
|
||||
use image::imageops::{self, FilterType};
|
||||
use image::io::Limits;
|
||||
use image::{
|
||||
AnimationDecoder, DynamicImage, ImageBuffer, ImageDecoder, ImageError, ImageFormat,
|
||||
ImageResult, Rgba,
|
||||
ImageResult, Limits, Rgba,
|
||||
};
|
||||
use ipc_channel::ipc::IpcSharedMemory;
|
||||
use log::debug;
|
||||
|
@ -366,8 +365,10 @@ pub fn load_from_memory(buffer: &[u8], cors_status: CorsStatus) -> Option<Raster
|
|||
};
|
||||
match image_decoder {
|
||||
GenericImageDecoder::Png(png_decoder) => {
|
||||
if png_decoder.is_apng() {
|
||||
let apng_decoder = png_decoder.apng();
|
||||
if png_decoder.is_apng().unwrap_or_default() {
|
||||
let Ok(apng_decoder) = png_decoder.apng() else {
|
||||
return None;
|
||||
};
|
||||
decode_animated_image(cors_status, apng_decoder)
|
||||
} else {
|
||||
decode_static_image(cors_status, *png_decoder)
|
||||
|
@ -572,9 +573,9 @@ fn make_decoder(
|
|||
})
|
||||
}
|
||||
|
||||
fn decode_static_image<'a>(
|
||||
fn decode_static_image(
|
||||
cors_status: CorsStatus,
|
||||
image_decoder: impl ImageDecoder<'a>,
|
||||
image_decoder: impl ImageDecoder,
|
||||
) -> Option<RasterImage> {
|
||||
let Ok(dynamic_image) = DynamicImage::from_decoder(image_decoder) else {
|
||||
debug!("Image decoding error");
|
||||
|
|
|
@ -8,7 +8,7 @@ use euclid::default::{Rect, Size2D};
|
|||
use image::codecs::jpeg::JpegEncoder;
|
||||
use image::codecs::png::PngEncoder;
|
||||
use image::codecs::webp::WebPEncoder;
|
||||
use image::{ColorType, ImageEncoder, ImageError};
|
||||
use image::{ExtendedColorType, GenericImageView, ImageEncoder, ImageError, Rgb};
|
||||
use ipc_channel::ipc::IpcSharedMemory;
|
||||
use malloc_size_of_derive::MallocSizeOf;
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
@ -325,10 +325,10 @@ impl Snapshot<SnapshotData> {
|
|||
EncodedImageType::Png => {
|
||||
// FIXME(nox): https://github.com/image-rs/image-png/issues/86
|
||||
// FIXME(nox): https://github.com/image-rs/image-png/issues/87
|
||||
PngEncoder::new(encoder).write_image(data, width, height, ColorType::Rgba8)
|
||||
PngEncoder::new(encoder).write_image(data, width, height, ExtendedColorType::Rgba8)
|
||||
},
|
||||
EncodedImageType::Jpeg => {
|
||||
let jpeg_encoder = if let Some(quality) = quality {
|
||||
let mut jpeg_encoder = if let Some(quality) = quality {
|
||||
// The specification allows quality to be in [0.0..1.0] but the JPEG encoder
|
||||
// expects it to be in [1..100]
|
||||
if (0.0..=1.0).contains(&quality) {
|
||||
|
@ -343,7 +343,38 @@ impl Snapshot<SnapshotData> {
|
|||
JpegEncoder::new(encoder)
|
||||
};
|
||||
|
||||
jpeg_encoder.write_image(data, width, height, ColorType::Rgba8)
|
||||
// JPEG doesn't support transparency, so simply calling jpeg_encoder.write_image fails here.
|
||||
// Instead we have to create a struct to translate from rgba to rgb.
|
||||
struct RgbaDataForJpegEncoder<'a> {
|
||||
width: u32,
|
||||
height: u32,
|
||||
data: &'a [u8],
|
||||
}
|
||||
|
||||
impl<'a> GenericImageView for RgbaDataForJpegEncoder<'a> {
|
||||
type Pixel = Rgb<u8>;
|
||||
|
||||
fn dimensions(&self) -> (u32, u32) {
|
||||
(self.width, self.height)
|
||||
}
|
||||
|
||||
fn get_pixel(&self, x: u32, y: u32) -> Self::Pixel {
|
||||
let offset = (self.width * y + x) as usize * 4;
|
||||
Rgb([
|
||||
self.data[offset],
|
||||
self.data[offset + 1],
|
||||
self.data[offset + 2],
|
||||
])
|
||||
}
|
||||
}
|
||||
|
||||
let image = RgbaDataForJpegEncoder {
|
||||
width,
|
||||
height,
|
||||
data,
|
||||
};
|
||||
|
||||
jpeg_encoder.encode_image(&image)
|
||||
},
|
||||
EncodedImageType::Webp => {
|
||||
// No quality support because of https://github.com/image-rs/image/issues/1984
|
||||
|
@ -351,7 +382,7 @@ impl Snapshot<SnapshotData> {
|
|||
data,
|
||||
width,
|
||||
height,
|
||||
ColorType::Rgba8,
|
||||
ExtendedColorType::Rgba8,
|
||||
)
|
||||
},
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue