mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
Various fixes
Fix the behavior of block-direction margins of replaced element both as block level or inline level, and no longer query fragment info when building display list for canvas.
This commit is contained in:
parent
b1b17f1869
commit
b0de105bb0
3 changed files with 54 additions and 52 deletions
|
@ -46,7 +46,7 @@ use gfx::display_list::{ClippingRegion, StackingContext};
|
||||||
use gfx_traits::ScrollRootId;
|
use gfx_traits::ScrollRootId;
|
||||||
use gfx_traits::print_tree::PrintTree;
|
use gfx_traits::print_tree::PrintTree;
|
||||||
use layout_debug;
|
use layout_debug;
|
||||||
use model::{CollapsibleMargins, IntrinsicISizes, MarginCollapseInfo, MaybeAuto};
|
use model::{AdjoiningMargins, CollapsibleMargins, IntrinsicISizes, MarginCollapseInfo, MaybeAuto};
|
||||||
use model::{specified, specified_or_none};
|
use model::{specified, specified_or_none};
|
||||||
use sequential;
|
use sequential;
|
||||||
use serde::{Serialize, Serializer};
|
use serde::{Serialize, Serializer};
|
||||||
|
@ -1887,6 +1887,14 @@ impl Flow for BlockFlow {
|
||||||
self.fragment.assign_replaced_block_size_if_necessary();
|
self.fragment.assign_replaced_block_size_if_necessary();
|
||||||
if !self.base.flags.contains(IS_ABSOLUTELY_POSITIONED) {
|
if !self.base.flags.contains(IS_ABSOLUTELY_POSITIONED) {
|
||||||
self.base.position.size.block = self.fragment.border_box.size.block;
|
self.base.position.size.block = self.fragment.border_box.size.block;
|
||||||
|
let mut block_start = AdjoiningMargins::from_margin(self.fragment.margin.block_start);
|
||||||
|
let block_end = AdjoiningMargins::from_margin(self.fragment.margin.block_end);
|
||||||
|
if self.fragment.border_box.size.block == Au(0) {
|
||||||
|
block_start.union(block_end);
|
||||||
|
self.base.collapsible_margins = CollapsibleMargins::CollapseThrough(block_start);
|
||||||
|
} else {
|
||||||
|
self.base.collapsible_margins = CollapsibleMargins::Collapse(block_start, block_end);
|
||||||
|
}
|
||||||
self.base.restyle_damage.remove(REFLOW_OUT_OF_FLOW | REFLOW);
|
self.base.restyle_damage.remove(REFLOW_OUT_OF_FLOW | REFLOW);
|
||||||
self.fragment.restyle_damage.remove(REFLOW_OUT_OF_FLOW | REFLOW);
|
self.fragment.restyle_damage.remove(REFLOW_OUT_OF_FLOW | REFLOW);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1489,57 +1489,51 @@ impl FragmentDisplayListBuilding for Fragment {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SpecificFragmentInfo::Canvas(ref canvas_fragment_info) => {
|
SpecificFragmentInfo::Canvas(ref canvas_fragment_info) => {
|
||||||
let width = canvas_fragment_info.replaced_image_fragment_info
|
let computed_width = canvas_fragment_info.dom_width.to_px();
|
||||||
.computed_inline_size.map_or(0, |w| w.to_px() as usize);
|
let computed_height = canvas_fragment_info.dom_height.to_px();
|
||||||
let height = canvas_fragment_info.replaced_image_fragment_info
|
|
||||||
.computed_block_size.map_or(0, |h| h.to_px() as usize);
|
|
||||||
if width > 0 && height > 0 {
|
|
||||||
let computed_width = canvas_fragment_info.canvas_inline_size().to_px();
|
|
||||||
let computed_height = canvas_fragment_info.canvas_block_size().to_px();
|
|
||||||
|
|
||||||
let canvas_data = match canvas_fragment_info.ipc_renderer {
|
let canvas_data = match canvas_fragment_info.ipc_renderer {
|
||||||
Some(ref ipc_renderer) => {
|
Some(ref ipc_renderer) => {
|
||||||
let ipc_renderer = ipc_renderer.lock().unwrap();
|
let ipc_renderer = ipc_renderer.lock().unwrap();
|
||||||
let (sender, receiver) = ipc::channel().unwrap();
|
let (sender, receiver) = ipc::channel().unwrap();
|
||||||
ipc_renderer.send(CanvasMsg::FromLayout(
|
ipc_renderer.send(CanvasMsg::FromLayout(
|
||||||
FromLayoutMsg::SendData(sender))).unwrap();
|
FromLayoutMsg::SendData(sender))).unwrap();
|
||||||
receiver.recv().unwrap()
|
receiver.recv().unwrap()
|
||||||
},
|
},
|
||||||
None => return,
|
None => return,
|
||||||
};
|
};
|
||||||
|
|
||||||
let base = state.create_base_display_item(
|
let base = state.create_base_display_item(
|
||||||
&stacking_relative_content_box,
|
&stacking_relative_content_box,
|
||||||
clip,
|
clip,
|
||||||
self.node,
|
self.node,
|
||||||
self.style.get_cursor(Cursor::Default),
|
self.style.get_cursor(Cursor::Default),
|
||||||
DisplayListSection::Content);
|
DisplayListSection::Content);
|
||||||
let display_item = match canvas_data {
|
let display_item = match canvas_data {
|
||||||
CanvasData::Image(canvas_data) => {
|
CanvasData::Image(canvas_data) => {
|
||||||
DisplayItem::Image(box ImageDisplayItem {
|
DisplayItem::Image(box ImageDisplayItem {
|
||||||
base: base,
|
base: base,
|
||||||
webrender_image: WebRenderImageInfo {
|
webrender_image: WebRenderImageInfo {
|
||||||
width: computed_width as u32,
|
width: computed_width as u32,
|
||||||
height: computed_height as u32,
|
height: computed_height as u32,
|
||||||
format: PixelFormat::RGBA8,
|
format: PixelFormat::RGBA8,
|
||||||
key: Some(canvas_data.image_key),
|
key: Some(canvas_data.image_key),
|
||||||
},
|
},
|
||||||
image_data: None,
|
image_data: None,
|
||||||
stretch_size: stacking_relative_content_box.size,
|
stretch_size: stacking_relative_content_box.size,
|
||||||
tile_spacing: Size2D::zero(),
|
tile_spacing: Size2D::zero(),
|
||||||
image_rendering: image_rendering::T::auto,
|
image_rendering: image_rendering::T::auto,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
CanvasData::WebGL(context_id) => {
|
CanvasData::WebGL(context_id) => {
|
||||||
DisplayItem::WebGL(box WebGLDisplayItem {
|
DisplayItem::WebGL(box WebGLDisplayItem {
|
||||||
base: base,
|
base: base,
|
||||||
context_id: context_id,
|
context_id: context_id,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
state.add_display_item(display_item);
|
state.add_display_item(display_item);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
SpecificFragmentInfo::UnscannedText(_) => {
|
SpecificFragmentInfo::UnscannedText(_) => {
|
||||||
panic!("Shouldn't see unscanned fragments here.")
|
panic!("Shouldn't see unscanned fragments here.")
|
||||||
|
|
|
@ -1990,10 +1990,10 @@ impl Fragment {
|
||||||
SpecificFragmentInfo::Canvas(_) | SpecificFragmentInfo::Iframe(_) |
|
SpecificFragmentInfo::Canvas(_) | SpecificFragmentInfo::Iframe(_) |
|
||||||
SpecificFragmentInfo::Image(_) | SpecificFragmentInfo::Svg(_) |
|
SpecificFragmentInfo::Image(_) | SpecificFragmentInfo::Svg(_) |
|
||||||
SpecificFragmentInfo::Generic | SpecificFragmentInfo::GeneratedContent(_) => {
|
SpecificFragmentInfo::Generic | SpecificFragmentInfo::GeneratedContent(_) => {
|
||||||
let ascent = self.border_box.size.block + self.margin.block_start;
|
let ascent = self.border_box.size.block + self.margin.block_end;
|
||||||
InlineMetrics {
|
InlineMetrics {
|
||||||
space_above_baseline: ascent,
|
space_above_baseline: ascent + self.margin.block_start,
|
||||||
space_below_baseline: self.margin.block_end,
|
space_below_baseline: Au(0),
|
||||||
ascent: ascent,
|
ascent: ascent,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue