зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1604280 - Fix a bug in SpatialTree::get_world_transform_impl(). r=gw
The first branch (where the node is in the root coordinate system) was not handling the TransformScroll::Unscrolled case, which should use the scale/offset from the viewport transform rather than the content transform. Differential Revision: https://phabricator.services.mozilla.com/D196692
This commit is contained in:
Родитель
11ffdd4348
Коммит
8dd9084e61
|
@ -1077,7 +1077,10 @@ impl SpatialTree {
|
||||||
if index == self.root_reference_frame_index {
|
if index == self.root_reference_frame_index {
|
||||||
CoordinateSpaceMapping::Local
|
CoordinateSpaceMapping::Local
|
||||||
} else {
|
} else {
|
||||||
CoordinateSpaceMapping::ScaleOffset(child.content_transform)
|
match scroll {
|
||||||
|
TransformScroll::Scrolled => CoordinateSpaceMapping::ScaleOffset(child.content_transform),
|
||||||
|
TransformScroll::Unscrolled => CoordinateSpaceMapping::ScaleOffset(child.viewport_transform),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let system = &self.coord_systems[child.coordinate_system_id.0 as usize];
|
let system = &self.coord_systems[child.coordinate_system_id.0 as usize];
|
||||||
|
@ -2004,3 +2007,38 @@ fn test_find_scroll_root_2d_scale() {
|
||||||
|
|
||||||
assert_eq!(st.find_scroll_root(sub_scroll), sub_scroll);
|
assert_eq!(st.find_scroll_root(sub_scroll), sub_scroll);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_world_transforms() {
|
||||||
|
// Create a spatial tree with a scroll frame node with scroll offset (0, 200).
|
||||||
|
let mut cst = SceneSpatialTree::new();
|
||||||
|
let pid = PipelineInstanceId::new(0);
|
||||||
|
let scroll = cst.add_scroll_frame(
|
||||||
|
cst.root_reference_frame_index(),
|
||||||
|
ExternalScrollId(1, PipelineId::dummy()),
|
||||||
|
PipelineId::dummy(),
|
||||||
|
&LayoutRect::from_size(LayoutSize::new(400.0, 400.0)),
|
||||||
|
&LayoutSize::new(400.0, 800.0),
|
||||||
|
ScrollFrameKind::Explicit,
|
||||||
|
LayoutVector2D::new(0.0, 200.0),
|
||||||
|
APZScrollGeneration::default(),
|
||||||
|
HasScrollLinkedEffect::No,
|
||||||
|
SpatialNodeUid::external(SpatialTreeItemKey::new(0, 1), PipelineId::dummy(), pid));
|
||||||
|
|
||||||
|
let mut st = SpatialTree::new();
|
||||||
|
st.apply_updates(cst.end_frame_and_get_pending_updates());
|
||||||
|
st.update_tree(&SceneProperties::new());
|
||||||
|
|
||||||
|
// The node's world transform should reflect the scroll offset,
|
||||||
|
// e.g. here it should be (0, -200) to reflect that the content has been
|
||||||
|
// scrolled up by 200px.
|
||||||
|
assert_eq!(
|
||||||
|
st.get_world_transform(scroll).into_transform(),
|
||||||
|
LayoutToWorldTransform::translation(0.0, -200.0, 0.0));
|
||||||
|
|
||||||
|
// The node's world viewport transform only reflects enclosing scrolling
|
||||||
|
// or transforms. Here we don't have any, so it should be the identity.
|
||||||
|
assert_eq!(
|
||||||
|
st.get_world_viewport_transform(scroll).into_transform(),
|
||||||
|
LayoutToWorldTransform::identity());
|
||||||
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче