aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout')
-rw-r--r--components/layout/display_list_builder.rs23
-rw-r--r--components/layout/webrender_helpers.rs2
2 files changed, 20 insertions, 5 deletions
diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs
index 3940162b513..0e3d810f7cf 100644
--- a/components/layout/display_list_builder.rs
+++ b/components/layout/display_list_builder.rs
@@ -1871,6 +1871,20 @@ impl FragmentDisplayListBuilding for Fragment {
let stacking_relative_content_box =
self.stacking_relative_content_box(stacking_relative_border_box);
+ // Adjust the clipping region as necessary to account for `border-radius`.
+ let build_local_clip = |style: &ComputedValues| {
+ let radii = build_border_radius_for_inner_rect(&stacking_relative_border_box, style);
+ if !radii.is_square() {
+ LocalClip::RoundedRect(
+ stacking_relative_border_box.to_rectf(),
+ ComplexClipRegion::new(stacking_relative_content_box.to_rectf(),
+ radii.to_border_radius(),
+ ))
+ } else {
+ LocalClip::Rect(stacking_relative_border_box.to_rectf())
+ }
+ };
+
match self.specific {
SpecificFragmentInfo::TruncatedFragment(box TruncatedFragmentInfo {
text_info: Some(ref text_fragment),
@@ -1916,7 +1930,7 @@ impl FragmentDisplayListBuilding for Fragment {
if !stacking_relative_content_box.is_empty() {
let base = state.create_base_display_item(
&stacking_relative_content_box,
- LocalClip::from(clip.to_rectf()),
+ build_local_clip(&self.style),
self.node,
self.style.get_cursor(Cursor::Default),
DisplayListSection::Content);
@@ -1927,7 +1941,8 @@ impl FragmentDisplayListBuilding for Fragment {
let size = Size2D::new(item.bounds().size.width.to_f32_px(),
item.bounds().size.height.to_f32_px());
- state.iframe_sizes.push((fragment_info.browsing_context_id, TypedSize2D::from_untyped(&size)));
+ state.iframe_sizes.push((fragment_info.browsing_context_id,
+ TypedSize2D::from_untyped(&size)));
state.add_display_item(item);
}
@@ -1937,7 +1952,7 @@ impl FragmentDisplayListBuilding for Fragment {
if let Some(ref image) = image_fragment.image {
let base = state.create_base_display_item(
&stacking_relative_content_box,
- LocalClip::from(clip.to_rectf()),
+ build_local_clip(&self.style),
self.node,
self.style.get_cursor(Cursor::Default),
DisplayListSection::Content);
@@ -1968,7 +1983,7 @@ impl FragmentDisplayListBuilding for Fragment {
let base = state.create_base_display_item(
&stacking_relative_content_box,
- LocalClip::from(clip.to_rectf()),
+ build_local_clip(&self.style),
self.node,
self.style.get_cursor(Cursor::Default),
DisplayListSection::Content);
diff --git a/components/layout/webrender_helpers.rs b/components/layout/webrender_helpers.rs
index fbabc7cb1b8..29236533f80 100644
--- a/components/layout/webrender_helpers.rs
+++ b/components/layout/webrender_helpers.rs
@@ -464,7 +464,7 @@ impl WebRenderDisplayItemConverter for DisplayItem {
DisplayItem::Iframe(ref item) => {
let rect = item.base.bounds.to_rectf();
let pipeline_id = item.iframe.to_webrender();
- builder.push_iframe(rect, pipeline_id);
+ builder.push_iframe(rect, Some(item.base.local_clip), pipeline_id);
}
DisplayItem::PushStackingContext(ref item) => {
let stacking_context = &item.stacking_context;