diff --git a/components/layout_2020/context.rs b/components/layout_2020/context.rs index 04374849f74..71372ffe224 100644 --- a/components/layout_2020/context.rs +++ b/components/layout_2020/context.rs @@ -5,6 +5,7 @@ use std::sync::Arc; use base::id::PipelineId; +use euclid::Size2D; use fnv::FnvHashMap; use fonts::FontContext; use fxhash::FxHashMap; @@ -148,8 +149,7 @@ impl LayoutContext<'_> { Some(ImageOrMetadataAvailable::ImageAvailable { image, .. }) => { self.handle_animated_image(node, image.clone()); let image_info = WebRenderImageInfo { - width: image.width, - height: image.height, + size: Size2D::new(image.width, image.height), key: image.id, }; if image_info.key.is_none() { @@ -188,10 +188,29 @@ impl LayoutContext<'_> { )?; Some(ResolvedImage::Image(webrender_info)) }, - Image::ImageSet(image_set) => image_set - .items - .get(image_set.selected_index) - .and_then(|image| self.resolve_image(node, &image.image)), + Image::ImageSet(image_set) => { + image_set + .items + .get(image_set.selected_index) + .and_then(|image| { + self.resolve_image(node, &image.image) + .map(|info| match info { + ResolvedImage::Image(mut image_info) => { + // From : + // > A (optional). This is used to help the UA decide + // > which to choose. If the image reference is + // > for a raster image, it also specifies the image’s natural + // > resolution, overriding any other source of data that might + // > supply a natural resolution. + image_info.size = (image_info.size.to_f32() / + image.resolution.dppx()) + .to_u32(); + ResolvedImage::Image(image_info) + }, + _ => info, + }) + }) + }, } } } diff --git a/components/layout_2020/display_list/mod.rs b/components/layout_2020/display_list/mod.rs index 0e71f8505dc..8a746a01184 100644 --- a/components/layout_2020/display_list/mod.rs +++ b/components/layout_2020/display_list/mod.rs @@ -61,8 +61,7 @@ pub use stacking_context::*; #[derive(Clone, Copy)] pub struct WebRenderImageInfo { - pub width: u32, - pub height: u32, + pub size: Size2D, pub key: Option, } @@ -817,8 +816,8 @@ impl<'a> BuilderForBoxFragment<'a> { // FIXME: https://drafts.csswg.org/css-images-4/#the-image-resolution let dppx = 1.0; let intrinsic = NaturalSizes::from_width_and_height( - image_info.width as f32 / dppx, - image_info.height as f32 / dppx, + image_info.size.width as f32 / dppx, + image_info.size.height as f32 / dppx, ); let Some(image_key) = image_info.key else { continue; @@ -1007,8 +1006,8 @@ impl<'a> BuilderForBoxFragment<'a> { return false; }; - width = image_info.width as f32; - height = image_info.height as f32; + width = image_info.size.width as f32; + height = image_info.size.height as f32; NinePatchBorderSource::Image(key, ImageRendering::Auto) }, Some(ResolvedImage::Gradient(gradient)) => { diff --git a/tests/wpt/meta/css/css-images/image-set/image-set-resolution-002.html.ini b/tests/wpt/meta/css/css-images/image-set/image-set-resolution-002.html.ini deleted file mode 100644 index 4b5172849de..00000000000 --- a/tests/wpt/meta/css/css-images/image-set/image-set-resolution-002.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[image-set-resolution-002.html] - expected: FAIL