diff --git a/examples/scrolling.rs b/examples/scrolling.rs index 28d9cbc271..1a260cb3f6 100644 --- a/examples/scrolling.rs +++ b/examples/scrolling.rs @@ -153,18 +153,30 @@ impl Example for App { .. } => { let offset = match key { - winit::VirtualKeyCode::Down => (0.0, -10.0), - winit::VirtualKeyCode::Up => (0.0, 10.0), - winit::VirtualKeyCode::Right => (-10.0, 0.0), - winit::VirtualKeyCode::Left => (10.0, 0.0), - _ => return false, + winit::VirtualKeyCode::Down => Some((0.0, -10.0)), + winit::VirtualKeyCode::Up => Some((0.0, 10.0)), + winit::VirtualKeyCode::Right => Some((-10.0, 0.0)), + winit::VirtualKeyCode::Left => Some((10.0, 0.0)), + _ => None, + }; + let zoom = match key { + winit::VirtualKeyCode::Key0 => Some(1.0), + winit::VirtualKeyCode::Minus => Some(0.8), + winit::VirtualKeyCode::Equals => Some(1.25), + _ => None, }; - txn.scroll( - ScrollLocation::Delta(LayoutVector2D::new(offset.0, offset.1)), - self.cursor_position, - ); - txn.generate_frame(); + if let Some(offset) = offset { + txn.scroll( + ScrollLocation::Delta(LayoutVector2D::new(offset.0, offset.1)), + self.cursor_position, + ); + txn.generate_frame(); + } + if let Some(zoom) = zoom { + txn.set_pinch_zoom(ZoomFactor::new(zoom)); + txn.generate_frame(); + } } winit::WindowEvent::CursorMoved { position: LogicalPosition { x, y }, .. } => { self.cursor_position = WorldPoint::new(x as f32, y as f32); diff --git a/webrender/src/clip_scroll_tree.rs b/webrender/src/clip_scroll_tree.rs index d105beb312..1f4b9f3b19 100644 --- a/webrender/src/clip_scroll_tree.rs +++ b/webrender/src/clip_scroll_tree.rs @@ -405,8 +405,8 @@ impl ClipScrollTree { pt.add_item(format!("scrollable_size: {:?}", scrolling_info.scrollable_size)); pt.add_item(format!("scroll offset: {:?}", scrolling_info.offset)); } - SpatialNodeType::ReferenceFrame(ref info) => { - pt.new_level(format!("ReferenceFrame {:?}", info.resolved_transform)); + SpatialNodeType::ReferenceFrame(ref _info) => { + pt.new_level(format!("ReferenceFrame")); pt.add_item(format!("index: {:?}", index)); } } diff --git a/webrender/src/display_list_flattener.rs b/webrender/src/display_list_flattener.rs index 1f0aabc3ca..3c9edf4f8c 100644 --- a/webrender/src/display_list_flattener.rs +++ b/webrender/src/display_list_flattener.rs @@ -5,7 +5,7 @@ use api::{AlphaType, BorderDetails, BorderDisplayItem, BuiltDisplayListIter, ClipAndScrollInfo}; use api::{ClipId, ColorF, ComplexClipRegion, DeviceIntPoint, DeviceIntRect, DeviceIntSize}; -use api::{DevicePixelScale, DeviceUintRect, DisplayItemRef, ExtendMode, ExternalScrollId}; +use api::{DisplayItemRef, ExtendMode, ExternalScrollId}; use api::{FilterOp, FontInstanceKey, GlyphInstance, GlyphOptions, RasterSpace, GradientStop}; use api::{IframeDisplayItem, ImageKey, ImageRendering, ItemRange, LayoutPoint, ColorDepth}; use api::{LayoutPrimitiveInfo, LayoutRect, LayoutSize, LayoutTransform, LayoutVector2D}; @@ -32,7 +32,7 @@ use render_backend::{DocumentView}; use resource_cache::{FontInstanceMap, ImageRequest}; use scene::{Scene, ScenePipeline, StackingContextHelpers}; use scene_builder::DocumentResources; -use spatial_node::{SpatialNodeType, StickyFrameInfo}; +use spatial_node::{StickyFrameInfo}; use std::{f32, mem}; use std::collections::vec_deque::VecDeque; use tiling::{CompositeOps}; @@ -209,7 +209,6 @@ impl<'a> DisplayListFlattener<'a> { &root_pipeline.viewport_size, &root_pipeline.content_size, ); - flattener.setup_viewport_offset(view.inner_rect, view.accumulated_scale_factor()); flattener.flatten_root(root_pipeline, &root_pipeline.viewport_size); debug_assert!(flattener.sc_stack.is_empty()); @@ -1257,20 +1256,6 @@ impl<'a> DisplayListFlattener<'a> { index } - pub fn setup_viewport_offset( - &mut self, - inner_rect: DeviceUintRect, - device_pixel_scale: DevicePixelScale, - ) { - let viewport_offset = (inner_rect.origin.to_vector().to_f32() / device_pixel_scale).round(); - let root_id = self.clip_scroll_tree.root_reference_frame_index(); - let root_node = &mut self.clip_scroll_tree.spatial_nodes[root_id.0]; - if let SpatialNodeType::ReferenceFrame(ref mut info) = root_node.node_type { - info.resolved_transform = - LayoutVector2D::new(viewport_offset.x, viewport_offset.y).into(); - } - } - pub fn push_root( &mut self, pipeline_id: PipelineId, diff --git a/webrender/src/render_backend.rs b/webrender/src/render_backend.rs index 8211fa91ed..7af23bdc00 100644 --- a/webrender/src/render_backend.rs +++ b/webrender/src/render_backend.rs @@ -277,6 +277,12 @@ impl Document { FrameMsg::AppendDynamicProperties(property_bindings) => { self.dynamic_properties.add_properties(property_bindings); } + FrameMsg::SetPinchZoom(factor) => { + if self.view.pinch_zoom_factor != factor.get() { + self.view.pinch_zoom_factor = factor.get(); + self.frame_is_valid = false; + } + } } DocumentOps::nop() @@ -508,9 +514,6 @@ impl RenderBackend { SceneMsg::SetPageZoom(factor) => { doc.view.page_zoom_factor = factor.get(); } - SceneMsg::SetPinchZoom(factor) => { - doc.view.pinch_zoom_factor = factor.get(); - } SceneMsg::SetWindowParameters { window_size, inner_rect, diff --git a/webrender/src/spatial_node.rs b/webrender/src/spatial_node.rs index bccbf90d41..debe4ec60f 100644 --- a/webrender/src/spatial_node.rs +++ b/webrender/src/spatial_node.rs @@ -122,7 +122,6 @@ impl SpatialNode { let source_perspective = source_perspective.map_or_else( LayoutFastTransform::identity, |perspective| perspective.into()); let info = ReferenceFrameInfo { - resolved_transform: LayoutFastTransform::identity(), source_transform: source_transform.unwrap_or(PropertyBinding::Value(identity)), source_perspective, origin_in_parent_reference_frame, @@ -256,7 +255,7 @@ impl SpatialNode { let scrolled_perspective = info.source_perspective .pre_translate(&state.parent_accumulated_scroll_offset) .post_translate(-state.parent_accumulated_scroll_offset); - info.resolved_transform = + let resolved_transform = LayoutFastTransform::with_vector(info.origin_in_parent_reference_frame) .pre_mul(&source_transform.into()) .pre_mul(&scrolled_perspective); @@ -265,7 +264,7 @@ impl SpatialNode { // our parent reference frame, plus any accumulated scrolling offsets from nodes // between our reference frame and this node. Finally, we also include // whatever local transformation this reference frame provides. - let relative_transform = info.resolved_transform + let relative_transform = resolved_transform .post_translate(state.parent_accumulated_scroll_offset) .to_transform() .with_destination::(); @@ -622,10 +621,6 @@ impl ScrollFrameInfo { /// Contains information about reference frames. #[derive(Copy, Clone, Debug)] pub struct ReferenceFrameInfo { - /// The transformation that establishes this reference frame, relative to the parent - /// reference frame. The origin of the reference frame is included in the transformation. - pub resolved_transform: LayoutFastTransform, - /// The source transform and perspective matrices provided by the stacking context /// that forms this reference frame. We maintain the property binding information /// here so that we can resolve the animated transform and update the tree each diff --git a/webrender_api/src/api.rs b/webrender_api/src/api.rs index a0dc049420..e5a880f0d9 100644 --- a/webrender_api/src/api.rs +++ b/webrender_api/src/api.rs @@ -232,7 +232,7 @@ impl Transaction { } pub fn set_pinch_zoom(&mut self, pinch_zoom: ZoomFactor) { - self.scene_ops.push(SceneMsg::SetPinchZoom(pinch_zoom)); + self.frame_ops.push(FrameMsg::SetPinchZoom(pinch_zoom)); } pub fn set_pan(&mut self, pan: DeviceIntPoint) { @@ -523,7 +523,6 @@ pub struct AddFontInstance { pub enum SceneMsg { UpdateEpoch(PipelineId, Epoch), SetPageZoom(ZoomFactor), - SetPinchZoom(ZoomFactor), SetRootPipeline(PipelineId), RemovePipeline(PipelineId), SetDisplayList { @@ -554,6 +553,7 @@ pub enum FrameMsg { GetScrollNodeState(MsgSender>), UpdateDynamicProperties(DynamicProperties), AppendDynamicProperties(DynamicProperties), + SetPinchZoom(ZoomFactor), } impl fmt::Debug for SceneMsg { @@ -562,7 +562,6 @@ impl fmt::Debug for SceneMsg { SceneMsg::UpdateEpoch(..) => "SceneMsg::UpdateEpoch", SceneMsg::SetDisplayList { .. } => "SceneMsg::SetDisplayList", SceneMsg::SetPageZoom(..) => "SceneMsg::SetPageZoom", - SceneMsg::SetPinchZoom(..) => "SceneMsg::SetPinchZoom", SceneMsg::RemovePipeline(..) => "SceneMsg::RemovePipeline", SceneMsg::SetWindowParameters { .. } => "SceneMsg::SetWindowParameters", SceneMsg::SetRootPipeline(..) => "SceneMsg::SetRootPipeline", @@ -582,6 +581,7 @@ impl fmt::Debug for FrameMsg { FrameMsg::EnableFrameOutput(..) => "FrameMsg::EnableFrameOutput", FrameMsg::UpdateDynamicProperties(..) => "FrameMsg::UpdateDynamicProperties", FrameMsg::AppendDynamicProperties(..) => "FrameMsg::AppendDynamicProperties", + FrameMsg::SetPinchZoom(..) => "FrameMsg::SetPinchZoom", }) } }