mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Auto merge of #21931 - jdm:reload-images, r=emilio
Make layout use available image data before querying the image cache. These changes make layout more efficient for any page which contains images that have already loaded, since it does not require synchronously querying the image cache thread for each image present. It also makes reloading a page actually display the images that are already in the image cache. --- - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #21919 - [x] There are tests for these changes <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/21931) <!-- Reviewable:end -->
This commit is contained in:
commit
e4657c1496
8 changed files with 102 additions and 5 deletions
|
@ -401,6 +401,11 @@ pub struct ImageFragmentInfo {
|
|||
pub metadata: Option<ImageMetadata>,
|
||||
}
|
||||
|
||||
enum ImageOrMetadata {
|
||||
Image(Arc<Image>),
|
||||
Metadata(ImageMetadata),
|
||||
}
|
||||
|
||||
impl ImageFragmentInfo {
|
||||
/// Creates a new image fragment from the given URL and local image cache.
|
||||
///
|
||||
|
@ -412,14 +417,29 @@ impl ImageFragmentInfo {
|
|||
node: &N,
|
||||
layout_context: &LayoutContext,
|
||||
) -> ImageFragmentInfo {
|
||||
let image_or_metadata = url.and_then(|url| {
|
||||
layout_context.get_or_request_image_or_meta(node.opaque(), url, UsePlaceholder::Yes)
|
||||
});
|
||||
// First use any image data present in the element...
|
||||
let image_or_metadata = node.image_data().and_then(|(image, metadata)| {
|
||||
match (image, metadata) {
|
||||
(Some(image), _) => Some(ImageOrMetadata::Image(image)),
|
||||
(None, Some(metadata)) => Some(ImageOrMetadata::Metadata(metadata)),
|
||||
_ => None,
|
||||
}
|
||||
}).or_else(|| url.and_then(|url| {
|
||||
// Otherwise query the image cache for anything known about the associated source URL.
|
||||
layout_context.get_or_request_image_or_meta(
|
||||
node.opaque(),
|
||||
url,
|
||||
UsePlaceholder::Yes
|
||||
).map(|result| match result {
|
||||
ImageOrMetadataAvailable::ImageAvailable(i, _) => ImageOrMetadata::Image(i),
|
||||
ImageOrMetadataAvailable::MetadataAvailable(m) => ImageOrMetadata::Metadata(m),
|
||||
})
|
||||
}));
|
||||
|
||||
let current_pixel_density = density.unwrap_or(1f64);
|
||||
|
||||
let (image, metadata) = match image_or_metadata {
|
||||
Some(ImageOrMetadataAvailable::ImageAvailable(i, _)) => {
|
||||
Some(ImageOrMetadata::Image(i)) => {
|
||||
let height = (i.height as f64 / current_pixel_density) as u32;
|
||||
let width = (i.width as f64 / current_pixel_density) as u32;
|
||||
(
|
||||
|
@ -434,7 +454,7 @@ impl ImageFragmentInfo {
|
|||
}),
|
||||
)
|
||||
},
|
||||
Some(ImageOrMetadataAvailable::MetadataAvailable(m)) => {
|
||||
Some(ImageOrMetadata::Metadata(m)) => {
|
||||
(
|
||||
None,
|
||||
Some(ImageMetadata {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue