mirror of
https://github.com/servo/servo.git
synced 2025-06-10 09:33:13 +00:00
Auto merge of #8559 - glennw:transform-layers, r=pcwalton
Include transform changes in list that cause incremental reflows. Also ensure that 3d translations get layers. Fixes #8329. <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/8559) <!-- Reviewable:end -->
This commit is contained in:
commit
c19b01c2f4
3 changed files with 40 additions and 29 deletions
|
@ -55,7 +55,7 @@ use std::cmp::{max, min};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use style::computed_values::{border_collapse, box_sizing, display, float, overflow_x, overflow_y};
|
use style::computed_values::{border_collapse, box_sizing, display, float, overflow_x, overflow_y};
|
||||||
use style::computed_values::{position, text_align, transform, transform_style};
|
use style::computed_values::{position, text_align, transform_style};
|
||||||
use style::properties::ComputedValues;
|
use style::properties::ComputedValues;
|
||||||
use style::values::computed::{LengthOrNone, LengthOrPercentageOrNone};
|
use style::values::computed::{LengthOrNone, LengthOrPercentageOrNone};
|
||||||
use style::values::computed::{LengthOrPercentage, LengthOrPercentageOrAuto};
|
use style::values::computed::{LengthOrPercentage, LengthOrPercentageOrAuto};
|
||||||
|
@ -585,33 +585,6 @@ impl BlockFlow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn transform_requires_layer(&self) -> bool {
|
|
||||||
// Check if the transform matrix is 2D or 3D
|
|
||||||
if let Some(ref transform_list) = self.fragment.style().get_effects().transform.0 {
|
|
||||||
for transform in transform_list {
|
|
||||||
match *transform {
|
|
||||||
transform::ComputedOperation::Perspective(..) => {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
transform::ComputedOperation::Matrix(m) => {
|
|
||||||
// See http://dev.w3.org/csswg/css-transforms/#2d-matrix
|
|
||||||
if m.m31 != 0.0 || m.m32 != 0.0 ||
|
|
||||||
m.m13 != 0.0 || m.m23 != 0.0 ||
|
|
||||||
m.m43 != 0.0 || m.m14 != 0.0 ||
|
|
||||||
m.m24 != 0.0 || m.m34 != 0.0 ||
|
|
||||||
m.m33 != 1.0 || m.m44 != 1.0 {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Neither perspective nor transform present
|
|
||||||
false
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Compute the actual inline size and position for this block.
|
/// Compute the actual inline size and position for this block.
|
||||||
pub fn compute_used_inline_size(&mut self,
|
pub fn compute_used_inline_size(&mut self,
|
||||||
layout_context: &LayoutContext,
|
layout_context: &LayoutContext,
|
||||||
|
@ -1560,7 +1533,7 @@ impl BlockFlow {
|
||||||
|
|
||||||
// This flow needs a layer if it has a 3d transform, or provides perspective
|
// This flow needs a layer if it has a 3d transform, or provides perspective
|
||||||
// to child layers. See http://dev.w3.org/csswg/css-transforms/#3d-rendering-contexts.
|
// to child layers. See http://dev.w3.org/csswg/css-transforms/#3d-rendering-contexts.
|
||||||
let has_3d_transform = self.transform_requires_layer();
|
let has_3d_transform = self.fragment.style().transform_requires_layer();
|
||||||
let has_perspective = self.fragment.style().get_effects().perspective !=
|
let has_perspective = self.fragment.style().get_effects().perspective !=
|
||||||
LengthOrNone::None;
|
LengthOrNone::None;
|
||||||
|
|
||||||
|
|
|
@ -191,6 +191,12 @@ pub fn compute_damage(old: &Option<Arc<ComputedValues>>, new: &ComputedValues) -
|
||||||
get_font.font_size, get_font.font_stretch
|
get_font.font_size, get_font.font_stretch
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
// If the layer requirements of this flow have changed due to the value
|
||||||
|
// of the transform, then reflow is required to rebuild the layers.
|
||||||
|
if old.transform_requires_layer() != new.transform_requires_layer() {
|
||||||
|
damage.insert(rebuild_and_reflow());
|
||||||
|
}
|
||||||
|
|
||||||
// FIXME: test somehow that we checked every CSS property
|
// FIXME: test somehow that we checked every CSS property
|
||||||
damage
|
damage
|
||||||
}
|
}
|
||||||
|
|
|
@ -6227,6 +6227,38 @@ impl ComputedValues {
|
||||||
effects.transform_style
|
effects.transform_style
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn transform_requires_layer(&self) -> bool {
|
||||||
|
// Check if the transform matrix is 2D or 3D
|
||||||
|
if let Some(ref transform_list) = self.get_effects().transform.0 {
|
||||||
|
for transform in transform_list {
|
||||||
|
match *transform {
|
||||||
|
computed_values::transform::ComputedOperation::Perspective(..) => {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
computed_values::transform::ComputedOperation::Matrix(m) => {
|
||||||
|
// See http://dev.w3.org/csswg/css-transforms/#2d-matrix
|
||||||
|
if m.m31 != 0.0 || m.m32 != 0.0 ||
|
||||||
|
m.m13 != 0.0 || m.m23 != 0.0 ||
|
||||||
|
m.m43 != 0.0 || m.m14 != 0.0 ||
|
||||||
|
m.m24 != 0.0 || m.m34 != 0.0 ||
|
||||||
|
m.m33 != 1.0 || m.m44 != 1.0 {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
computed_values::transform::ComputedOperation::Translate(_, _, z) => {
|
||||||
|
if z != Au(0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Neither perspective nor transform present
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
% for style_struct in STYLE_STRUCTS:
|
% for style_struct in STYLE_STRUCTS:
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn get_${style_struct.name.lower()}
|
pub fn get_${style_struct.name.lower()}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue