diff options
Diffstat (limited to 'components/layout/display_list_builder.rs')
-rw-r--r-- | components/layout/display_list_builder.rs | 51 |
1 files changed, 41 insertions, 10 deletions
diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs index d2ca90fa884..9b1c5bd0262 100644 --- a/components/layout/display_list_builder.rs +++ b/components/layout/display_list_builder.rs @@ -1743,15 +1743,46 @@ impl BlockFlowDisplayListBuilding for BlockFlow { }; // Add the box that starts the block context. - let translated_clip = if establishes_stacking_context { - Some(self.base.clip.translate(&-self.base.stacking_relative_position)) - } else { - None - }; - let clip = match translated_clip { - Some(ref translated_clip) => translated_clip, - None => &self.base.clip, - }; + let mut clip = self.base.clip.clone(); + + if establishes_stacking_context { + clip = clip.translate(&-self.base.stacking_relative_position) + } + + // TODO(notriddle): To properly support transformations, we either need + // non-rectangular clipping regions in display lists, or clipping + // regions in terms of the parent coordinate system instead of the + // child coordinate system. + // + // This is a workaround for a common idiom of transform: translate(). + if let Some(ref operations) = self.fragment.style().get_effects().transform.0 { + for operation in operations { + match *operation { + transform::ComputedOperation::Translate(tx, ty, _) => { + // N.B. When the clipping value comes from us, it + // shouldn't be transformed. + let tx = if let overflow_x::T::hidden = self.fragment.style().get_box() + .overflow_x { + Au(0) + } else { + model::specified(tx, self.base.block_container_inline_size) + }; + let ty = if let overflow_x::T::hidden = self.fragment.style().get_box() + .overflow_y.0 { + Au(0) + } else { + model::specified( + ty, + self.base.block_container_explicit_block_size.unwrap_or(Au(0)) + ) + }; + let off = Point2D::new(tx, ty); + clip = clip.translate(&-off); + } + _ => {} + }; + } + } self.fragment .build_display_list(state, @@ -1764,7 +1795,7 @@ impl BlockFlowDisplayListBuilding for BlockFlow { .relative_containing_block_mode, border_painting_mode, background_border_section, - clip, + &clip, &self.base.stacking_relative_position_of_display_port); self.base.build_display_items_for_debugging_tint(state, self.fragment.node); |