From c881c2a0fbaf21a33220ab28d2560cc9060ed59c Mon Sep 17 00:00:00 2001 From: nupurbaghel Date: Fri, 20 Jul 2018 00:35:06 +0530 Subject: [PATCH] implement step 5 of select_image_source --- components/script/dom/htmlimageelement.rs | 32 ++++++++++++++++++----- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 4ec57511f8d5..271665eff150 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -517,14 +517,14 @@ impl HTMLImageElement { } } - fn evaluate_source_size_list(&self, source_size_list: &mut SourceSizeList, width: Option) -> Au { + fn evaluate_source_size_list(&self, source_size_list: &mut SourceSizeList, _width: Option) -> Au { let document = document_from_node(self); let device = document.device(); if !device.is_some() { return Au(1); } let quirks_mode = document.quirks_mode(); - source_size_list.set_fallback_value(width); + //FIXME https://github.com/whatwg/html/issues/3832 source_size_list.evaluate(&device.unwrap(), quirks_mode) } @@ -603,15 +603,33 @@ impl HTMLImageElement { } } } + + let mut max = (0f64, 0); let img_sources = &mut vec![]; - for outer_index in 0..len { - if !repeat_indices.contains(&outer_index) { - img_sources.push(&source_set.image_sources[outer_index]); + for (index, image_source) in source_set.image_sources.iter().enumerate() { + if repeat_indices.contains(&index) { + continue; + } + let den = image_source.descriptor.den.unwrap(); + if max.0 < den { + max = (den, img_sources.len()); } + img_sources.push(image_source); } - // TODO Step 5 - select source based on pixel density - let selected_source = img_sources.remove(0).clone(); + // Step 5 + let mut best_candidate = max; + let device = document_from_node(self).device(); + if let Some(device) = device { + let device_den = device.device_pixel_ratio().get() as f64; + for (index, image_source) in img_sources.iter().enumerate() { + let current_den = image_source.descriptor.den.unwrap(); + if current_den < best_candidate.0 && current_den >= device_den { + best_candidate = (current_den, index); + } + } + } + let selected_source = img_sources.remove(best_candidate.1).clone(); Some((DOMString::from_string(selected_source.url), selected_source.descriptor.den.unwrap() as f32)) }