diff options
author | Josh Matthews <josh@joshmatthews.net> | 2014-09-02 15:14:37 -0400 |
---|---|---|
committer | Josh Matthews <josh@joshmatthews.net> | 2014-09-02 15:14:37 -0400 |
commit | cb559efd4ea9e36eec2dcf661648520ea8a44be9 (patch) | |
tree | 69d9c4ee111a0aa01f9cf47b2fc1724e88908663 | |
parent | bb79f49bfc094f8b6e2873f0280589a905c2cbfa (diff) | |
parent | cae18322e7b50758d6d2029df3b31d90ba2c84c2 (diff) | |
download | servo-cb559efd4ea9e36eec2dcf661648520ea8a44be9.tar.gz servo-cb559efd4ea9e36eec2dcf661648520ea8a44be9.zip |
Merge pull request #3173 from mrobinson/typed-units-1
Start using more typed units in the compositor
-rw-r--r-- | src/components/compositing/compositor.rs | 17 | ||||
-rw-r--r-- | src/components/compositing/compositor_data.rs | 11 | ||||
-rw-r--r-- | src/components/compositing/events.rs | 62 | ||||
-rw-r--r-- | src/components/compositing/platform/common/glfw_windowing.rs | 3 | ||||
-rw-r--r-- | src/components/compositing/platform/common/glut_windowing.rs | 3 | ||||
-rw-r--r-- | src/components/compositing/windowing.rs | 3 | ||||
-rw-r--r-- | src/components/msg/constellation_msg.rs | 3 | ||||
-rw-r--r-- | src/components/util/geometry.rs | 6 | ||||
-rw-r--r-- | src/components/util/opts.rs | 3 | ||||
-rw-r--r-- | src/components/util/util.rs | 1 | ||||
m--------- | src/support/layers/rust-layers | 0 |
11 files changed, 59 insertions, 53 deletions
diff --git a/src/components/compositing/compositor.rs b/src/components/compositing/compositor.rs index 95b822e02d5..087e9b4773c 100644 --- a/src/components/compositing/compositor.rs +++ b/src/components/compositing/compositor.rs @@ -27,6 +27,7 @@ use geom::rect::Rect; use geom::size::TypedSize2D; use geom::scale_factor::ScaleFactor; use gfx::render_task::{RenderChan, RenderMsg, RenderRequest, UnusedBufferMsg}; +use layers::geometry::DevicePixel; use layers::layers::{BufferRequest, Layer, LayerBufferSet}; use layers::rendergl; use layers::rendergl::RenderContext; @@ -38,7 +39,7 @@ use servo_msg::compositor_msg::{LayerId, ReadyState, RenderState}; use servo_msg::constellation_msg::{ConstellationChan, ExitMsg, LoadUrlMsg, NavigateMsg}; use servo_msg::constellation_msg::{PipelineId, ResizedWindowMsg, WindowSizeData}; use servo_msg::constellation_msg; -use servo_util::geometry::{DevicePixel, PagePx, ScreenPx, ViewportPx}; +use servo_util::geometry::{PagePx, ScreenPx, ViewportPx}; use servo_util::memory::MemoryProfilerChan; use servo_util::opts::Opts; use servo_util::time::{profile, TimeProfilerChan}; @@ -506,7 +507,7 @@ impl IOCompositor { events::move(root_layer.clone(), pipeline_id, layer_id, - fragment_point, + Point2D::from_untyped(&fragment_point), window_size) }) } @@ -522,6 +523,7 @@ impl IOCompositor { new_rect_in_page_coordinates: Rect<f32>) { let new_rect_in_layer_coordinates = self.convert_page_rect_to_layer_coordinates(new_rect_in_page_coordinates); + let new_rect_in_layer_coordinates = Rect::from_untyped(&new_rect_in_layer_coordinates); match self.find_layer_with_pipeline_and_layer_id(pipeline_id, layer_id) { Some(ref layer) => *layer.bounds.borrow_mut() = new_rect_in_layer_coordinates, @@ -571,7 +573,7 @@ impl IOCompositor { events::move(layer.clone(), pipeline_id, layer_id, - device_point, + Point2D::from_untyped(&device_point), window_size)) } Some(_) | None => { @@ -679,9 +681,9 @@ impl IOCompositor { fn on_mouse_window_event_class(&self, mouse_window_event: MouseWindowEvent) { let scale = self.device_pixels_per_page_px(); let point = match mouse_window_event { - MouseWindowClickEvent(_, p) => p / scale, - MouseWindowMouseDownEvent(_, p) => p / scale, - MouseWindowMouseUpEvent(_, p) => p / scale, + MouseWindowClickEvent(_, p) => p, + MouseWindowMouseDownEvent(_, p) => p, + MouseWindowMouseUpEvent(_, p) => p, }; for layer in self.scene.root.iter() { events::send_mouse_event(layer.clone(), mouse_window_event, point, scale); @@ -828,8 +830,7 @@ impl IOCompositor { fn send_buffer_requests_for_all_layers(&mut self) { let mut layers_and_requests = Vec::new(); self.scene.get_buffer_requests(&mut layers_and_requests, - Rect(Point2D(0f32, 0f32), - self.window_size.as_f32().to_untyped())); + Rect(TypedPoint2D(0f32, 0f32), self.window_size.as_f32())); // Return unused tiles first, so that they can be reused by any new BufferRequests. self.send_back_unused_buffers(); diff --git a/src/components/compositing/compositor_data.rs b/src/components/compositing/compositor_data.rs index 62c915bd421..fdfeac7656e 100644 --- a/src/components/compositing/compositor_data.rs +++ b/src/components/compositing/compositor_data.rs @@ -9,13 +9,14 @@ use pipeline::CompositionPipeline; use azure::azure_hl::Color; use geom::point::TypedPoint2D; use geom::size::{Size2D, TypedSize2D}; +use geom::rect::Rect; use gfx::render_task::UnusedBufferMsg; +use layers::geometry::DevicePixel; use layers::layers::{Layer, LayerBufferSet}; use layers::platform::surface::NativeSurfaceMethods; use servo_msg::compositor_msg::{Epoch, LayerId}; use servo_msg::compositor_msg::ScrollPolicy; use servo_msg::constellation_msg::PipelineId; -use servo_util::geometry::DevicePixel; use std::rc::Rc; pub struct CompositorData { @@ -59,19 +60,21 @@ impl CompositorData { background_color: layer_properties.background_color, epoch: layer_properties.epoch, }; - Rc::new(Layer::new(layer_properties.rect, tile_size, new_compositor_data)) + + Rc::new(Layer::new(Rect::from_untyped(&layer_properties.rect), + tile_size, new_compositor_data)) } pub fn update_layer(layer: Rc<Layer<CompositorData>>, layer_properties: LayerProperties) { layer.extra_data.borrow_mut().epoch = layer_properties.epoch; layer.extra_data.borrow_mut().background_color = layer_properties.background_color; - layer.resize(layer_properties.rect.size); + let size: TypedSize2D<DevicePixel, f32> = Size2D::from_untyped(&layer_properties.rect.size); + layer.resize(size); layer.contents_changed(); // Call scroll for bounds checking if the page shrunk. Use (-1, -1) as the // cursor position to make sure the scroll isn't propagated downwards. - let size: TypedSize2D<DevicePixel, f32> = Size2D::from_untyped(&layer.bounds.borrow().size); events::handle_scroll_event(layer.clone(), TypedPoint2D(0f32, 0f32), TypedPoint2D(-1f32, -1f32), diff --git a/src/components/compositing/events.rs b/src/components/compositing/events.rs index 4699208eed2..25779a417af 100644 --- a/src/components/compositing/events.rs +++ b/src/components/compositing/events.rs @@ -6,16 +6,17 @@ use compositor_data::{CompositorData, WantsScrollEvents}; use windowing::{MouseWindowEvent, MouseWindowClickEvent, MouseWindowMouseDownEvent}; use windowing::MouseWindowMouseUpEvent; -use geom::point::{Point2D, TypedPoint2D}; -use geom::rect::{Rect, TypedRect}; +use geom::length::Length; +use geom::point::TypedPoint2D; use geom::scale_factor::ScaleFactor; -use geom::size::{Size2D, TypedSize2D}; +use geom::size::TypedSize2D; +use layers::geometry::DevicePixel; use layers::layers::Layer; use script_traits::{ClickEvent, MouseDownEvent, MouseMoveEvent, MouseUpEvent, SendEventMsg}; use script_traits::{ScriptControlChan}; use servo_msg::compositor_msg::{FixedPosition, LayerId}; use servo_msg::constellation_msg::PipelineId; -use servo_util::geometry::{DevicePixel, PagePx}; +use servo_util::geometry::PagePx; use std::rc::Rc; @@ -55,36 +56,33 @@ pub fn handle_scroll_event(layer: Rc<Layer<CompositorData>>, } // Allow children to scroll. - let content_offset: TypedPoint2D<DevicePixel, f32> = - Point2D::from_untyped(&*layer.content_offset.borrow()); + let content_offset = layer.content_offset.borrow().clone(); let cursor = cursor - content_offset; for child in layer.children().iter() { - let rect: TypedRect<DevicePixel, f32> = Rect::from_untyped(&*child.bounds.borrow()); - if rect.contains(&cursor) && + let child_bounds = child.bounds.borrow(); + if child_bounds.contains(&cursor) && handle_scroll_event(child.clone(), delta, - cursor - rect.origin, - rect.size) { + cursor - child_bounds.origin, + child_bounds.size) { return true } } - clamp_scroll_offset_and_scroll_layer(layer, - content_offset.to_untyped() + delta.to_untyped(), - window_size.to_untyped()) + clamp_scroll_offset_and_scroll_layer(layer, content_offset + delta, window_size) } pub fn clamp_scroll_offset_and_scroll_layer(layer: Rc<Layer<CompositorData>>, - mut new_offset: Point2D<f32>, - window_size: Size2D<f32>) + mut new_offset: TypedPoint2D<DevicePixel, f32>, + window_size: TypedSize2D<DevicePixel, f32>) -> bool { let layer_size = layer.bounds.borrow().size; - let min_x = (window_size.width - layer_size.width).min(0.0); - new_offset.x = new_offset.x.clamp(&min_x, &0.0); + let min_x = (window_size.width - layer_size.width).get().min(0.0); + new_offset.x = Length(new_offset.x.get().clamp(&min_x, &0.0)); - let min_y = (window_size.height - layer_size.height).min(0.0); - new_offset.y = new_offset.y.clamp(&min_y, &0.0); + let min_y = (window_size.height - layer_size.height).get().min(0.0); + new_offset.y = Length(new_offset.y.get().clamp(&min_y, &0.0)); if *layer.content_offset.borrow() == new_offset { return false @@ -97,13 +95,15 @@ pub fn clamp_scroll_offset_and_scroll_layer(layer: Rc<Layer<CompositorData>>, } fn scroll_layer_and_all_child_layers(layer: Rc<Layer<CompositorData>>, - new_offset: Point2D<f32>) + new_offset: TypedPoint2D<DevicePixel, f32>) -> bool { let mut result = false; // Only scroll this layer if it's not fixed-positioned. if layer.extra_data.borrow().scroll_policy != FixedPosition { - *layer.transform.borrow_mut() = identity().translate(new_offset.x, new_offset.y, 0.0); + *layer.transform.borrow_mut() = identity().translate(new_offset.x.get(), + new_offset.y.get(), + 0.0); *layer.content_offset.borrow_mut() = new_offset; result = true } @@ -120,20 +120,22 @@ fn scroll_layer_and_all_child_layers(layer: Rc<Layer<CompositorData>>, // page coordinates. pub fn send_mouse_event(layer: Rc<Layer<CompositorData>>, event: MouseWindowEvent, - cursor: TypedPoint2D<PagePx, f32>, + cursor: TypedPoint2D<DevicePixel, f32>, device_pixels_per_page_px: ScaleFactor<PagePx, DevicePixel, f32>) { - let content_offset : TypedPoint2D<DevicePixel, f32> = - Point2D::from_untyped(&*layer.content_offset.borrow()); - let cursor = cursor - (content_offset / device_pixels_per_page_px); + let cursor = cursor - *layer.content_offset.borrow(); for child in layer.children().iter() { - let rect: TypedRect<PagePx, f32> = Rect::from_untyped(&*child.bounds.borrow()); - if rect.contains(&cursor) { - send_mouse_event(child.clone(), event, cursor - rect.origin, device_pixels_per_page_px); + let child_bounds = child.bounds.borrow(); + if child_bounds.contains(&cursor) { + send_mouse_event(child.clone(), + event, + cursor - child_bounds.origin, + device_pixels_per_page_px); return; } } // This mouse event is mine! + let cursor = cursor / device_pixels_per_page_px; let message = match event { MouseWindowClickEvent(button, _) => ClickEvent(button, cursor.to_untyped()), MouseWindowMouseDownEvent(button, _) => MouseDownEvent(button, cursor.to_untyped()), @@ -153,7 +155,7 @@ pub fn send_mouse_move_event(layer: Rc<Layer<CompositorData>>, pub fn move(layer: Rc<Layer<CompositorData>>, pipeline_id: PipelineId, layer_id: LayerId, - origin: Point2D<f32>, + origin: TypedPoint2D<DevicePixel, f32>, window_size: TypedSize2D<DevicePixel, f32>) -> bool { // Search children for the right layer to move. @@ -172,5 +174,5 @@ pub fn move(layer: Rc<Layer<CompositorData>>, return false } - clamp_scroll_offset_and_scroll_layer(layer, origin * -1.0, window_size.to_untyped()) + clamp_scroll_offset_and_scroll_layer(layer, TypedPoint2D(0f32, 0f32) - origin, window_size) } diff --git a/src/components/compositing/platform/common/glfw_windowing.rs b/src/components/compositing/platform/common/glfw_windowing.rs index f612ab92931..5a7215d3017 100644 --- a/src/components/compositing/platform/common/glfw_windowing.rs +++ b/src/components/compositing/platform/common/glfw_windowing.rs @@ -22,9 +22,10 @@ use std::rc::Rc; use geom::point::{Point2D, TypedPoint2D}; use geom::scale_factor::ScaleFactor; use geom::size::TypedSize2D; +use layers::geometry::DevicePixel; use servo_msg::compositor_msg::{IdleRenderState, RenderState, RenderingRenderState}; use servo_msg::compositor_msg::{FinishedLoading, Blank, Loading, PerformingLayout, ReadyState}; -use servo_util::geometry::{ScreenPx, DevicePixel}; +use servo_util::geometry::ScreenPx; use glfw; use glfw::Context; diff --git a/src/components/compositing/platform/common/glut_windowing.rs b/src/components/compositing/platform/common/glut_windowing.rs index de90421ac85..8e673376dc5 100644 --- a/src/components/compositing/platform/common/glut_windowing.rs +++ b/src/components/compositing/platform/common/glut_windowing.rs @@ -17,9 +17,10 @@ use std::rc::Rc; use geom::point::{Point2D, TypedPoint2D}; use geom::scale_factor::ScaleFactor; use geom::size::TypedSize2D; +use layers::geometry::DevicePixel; use servo_msg::compositor_msg::{IdleRenderState, RenderState, RenderingRenderState}; use servo_msg::compositor_msg::{FinishedLoading, Blank, ReadyState}; -use servo_util::geometry::{ScreenPx, DevicePixel}; +use servo_util::geometry::ScreenPx; use glut::glut::{ACTIVE_SHIFT, DOUBLE, WindowHeight}; use glut::glut::WindowWidth; diff --git a/src/components/compositing/windowing.rs b/src/components/compositing/windowing.rs index 9abd2d3de42..77b921bacba 100644 --- a/src/components/compositing/windowing.rs +++ b/src/components/compositing/windowing.rs @@ -7,8 +7,9 @@ use geom::point::TypedPoint2D; use geom::scale_factor::ScaleFactor; use geom::size::TypedSize2D; +use layers::geometry::DevicePixel; use servo_msg::compositor_msg::{ReadyState, RenderState}; -use servo_util::geometry::{ScreenPx, DevicePixel}; +use servo_util::geometry::ScreenPx; use std::rc::Rc; pub enum MouseWindowEvent { diff --git a/src/components/msg/constellation_msg.rs b/src/components/msg/constellation_msg.rs index e85951f1ce7..35b07024acd 100644 --- a/src/components/msg/constellation_msg.rs +++ b/src/components/msg/constellation_msg.rs @@ -8,8 +8,9 @@ use geom::rect::Rect; use geom::size::TypedSize2D; use geom::scale_factor::ScaleFactor; +use layers::geometry::DevicePixel; use serialize::Encodable; -use servo_util::geometry::{DevicePixel, PagePx, ViewportPx}; +use servo_util::geometry::{PagePx, ViewportPx}; use std::comm::{channel, Sender, Receiver}; use url::Url; diff --git a/src/components/util/geometry.rs b/src/components/util/geometry.rs index 2b1082fa3d2..878ebc70440 100644 --- a/src/components/util/geometry.rs +++ b/src/components/util/geometry.rs @@ -13,12 +13,6 @@ use std::fmt; // Units for use with geom::length and geom::scale_factor. -/// One hardware pixel. -/// -/// This unit corresponds to the smallest addressable element of the display hardware. -#[deriving(Encodable)] -pub enum DevicePixel {} - /// A normalized "pixel" at the default resolution for the display. /// /// Like the CSS "px" unit, the exact physical size of this unit may vary between devices, but it diff --git a/src/components/util/opts.rs b/src/components/util/opts.rs index b4f0a817609..2794e5387c2 100644 --- a/src/components/util/opts.rs +++ b/src/components/util/opts.rs @@ -5,11 +5,12 @@ //! Configuration options for a single run of the servo application. Created //! from command line arguments. -use geometry::{DevicePixel, ScreenPx}; +use geometry::ScreenPx; use azure::azure_hl::{BackendType, CairoBackend, CoreGraphicsBackend}; use azure::azure_hl::{CoreGraphicsAcceleratedBackend, Direct2DBackend, SkiaBackend}; use geom::scale_factor::ScaleFactor; +use layers::geometry::DevicePixel; use getopts; use std::cmp; use std::io; diff --git a/src/components/util/util.rs b/src/components/util/util.rs index 56b446b43bf..b74ed076e75 100644 --- a/src/components/util/util.rs +++ b/src/components/util/util.rs @@ -18,6 +18,7 @@ extern crate azure; extern crate collections; extern crate geom; extern crate getopts; +extern crate layers; extern crate libc; extern crate native; extern crate rand; diff --git a/src/support/layers/rust-layers b/src/support/layers/rust-layers -Subproject 5c167a7f739553dff01d3d6cba25e344058f77a +Subproject c04029907be1f2242d48235d3b03608b905bbd9 |