зеркало из https://github.com/mozilla/gecko-dev.git
servo: Merge #16766 - layout: Fix radius percentage resolution (from emilio:border-radius); r=glennw
Fixes #16764 Source-Repo: https://github.com/servo/servo Source-Revision: 34d33574dbd8696ff788ae8b9af65f8e88f404a9 --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : 979c8ae0d11656329d6949014536e817bd56dcab
This commit is contained in:
Родитель
71ca8d56c2
Коммит
1f6edba4b7
|
@ -564,20 +564,20 @@ fn build_border_radius(abs_bounds: &Rect<Au>,
|
|||
|
||||
handle_overlapping_radii(&abs_bounds.size, &BorderRadii {
|
||||
top_left: model::specified_border_radius(border_style.border_top_left_radius,
|
||||
abs_bounds.size.width),
|
||||
abs_bounds.size),
|
||||
top_right: model::specified_border_radius(border_style.border_top_right_radius,
|
||||
abs_bounds.size.width),
|
||||
abs_bounds.size),
|
||||
bottom_right: model::specified_border_radius(border_style.border_bottom_right_radius,
|
||||
abs_bounds.size.width),
|
||||
abs_bounds.size),
|
||||
bottom_left: model::specified_border_radius(border_style.border_bottom_left_radius,
|
||||
abs_bounds.size.width),
|
||||
abs_bounds.size),
|
||||
})
|
||||
}
|
||||
|
||||
/// Get the border radius for the rectangle inside of a rounded border. This is useful
|
||||
/// for building the clip for the content inside the border.
|
||||
fn build_border_radius_for_inner_rect(outer_rect: &Rect<Au>,
|
||||
style: ::StyleArc<ServoComputedValues>)
|
||||
style: &ServoComputedValues)
|
||||
-> BorderRadii<Au> {
|
||||
let mut radii = build_border_radius(&outer_rect, style.get_border());
|
||||
if radii.is_square() {
|
||||
|
@ -1278,7 +1278,7 @@ impl FragmentDisplayListBuilding for Fragment {
|
|||
spread_radius: box_shadow.spread_radius,
|
||||
border_radius: model::specified_border_radius(style.get_border()
|
||||
.border_top_left_radius,
|
||||
absolute_bounds.size.width).width,
|
||||
absolute_bounds.size).width,
|
||||
clip_mode: if box_shadow.inset {
|
||||
BoxShadowClipMode::Inset
|
||||
} else {
|
||||
|
@ -2376,7 +2376,7 @@ impl BlockFlowDisplayListBuilding for BlockFlow {
|
|||
let mut clip = ClippingRegion::from_rect(&clip_rect);
|
||||
|
||||
let border_radii = build_border_radius_for_inner_rect(&border_box,
|
||||
self.fragment.style.clone());
|
||||
&self.fragment.style);
|
||||
if !border_radii.is_square() {
|
||||
clip.intersect_with_rounded_rect(&clip_rect, &border_radii)
|
||||
}
|
||||
|
@ -2398,7 +2398,7 @@ impl BlockFlowDisplayListBuilding for BlockFlow {
|
|||
|
||||
let clip_rect = Rect::new(Point2D::zero(), content_box.size);
|
||||
let mut clip = ClippingRegion::from_rect(&clip_rect);
|
||||
let radii = build_border_radius_for_inner_rect(&border_box, self.fragment.style.clone());
|
||||
let radii = build_border_radius_for_inner_rect(&border_box, &self.fragment.style);
|
||||
if !radii.is_square() {
|
||||
clip.intersect_with_rounded_rect(&clip_rect, &radii)
|
||||
}
|
||||
|
|
|
@ -478,10 +478,22 @@ pub fn specified(length: LengthOrPercentage, containing_length: Au) -> Au {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn specified_border_radius(radius: BorderRadiusSize, containing_length: Au) -> Size2D<Au> {
|
||||
/// Computes a border radius size against the containing size.
|
||||
///
|
||||
/// Note that percentages in `border-radius` are resolved against the relevant
|
||||
/// box dimension instead of only against the width per [1]:
|
||||
///
|
||||
/// > Percentages: Refer to corresponding dimension of the border box.
|
||||
///
|
||||
/// [1]: https://drafts.csswg.org/css-backgrounds-3/#border-radius
|
||||
pub fn specified_border_radius(
|
||||
radius: BorderRadiusSize,
|
||||
containing_size: Size2D<Au>)
|
||||
-> Size2D<Au>
|
||||
{
|
||||
let generics::BorderRadiusSize(size) = radius;
|
||||
let w = specified(size.width, containing_length);
|
||||
let h = specified(size.height, containing_length);
|
||||
let w = specified(size.width, containing_size.width);
|
||||
let h = specified(size.height, containing_size.height);
|
||||
Size2D::new(w, h)
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче