diff options
author | eschweic <eschweickart@mozilla.com> | 2013-07-02 09:33:19 -0700 |
---|---|---|
committer | eschweic <eschweickart@mozilla.com> | 2013-07-10 17:12:52 -0700 |
commit | 1948280aec04d6c0e2e73c3ddf3d18be8a3fe61b (patch) | |
tree | 41156f3be86446a6c32285bfebb9429790601a39 /src | |
parent | 6bebda4f26c97c2204d23ce6340962a65cb727ad (diff) | |
download | servo-1948280aec04d6c0e2e73c3ddf3d18be8a3fe61b.tar.gz servo-1948280aec04d6c0e2e73c3ddf3d18be8a3fe61b.zip |
Clean up and annotations
Diffstat (limited to 'src')
-rw-r--r-- | src/components/gfx/render_task.rs | 20 | ||||
-rw-r--r-- | src/components/main/compositing/mod.rs | 53 | ||||
-rw-r--r-- | src/components/main/compositing/quadtree.rs | 16 | ||||
-rw-r--r-- | src/components/msg/compositor_msg.rs | 2 |
4 files changed, 36 insertions, 55 deletions
diff --git a/src/components/gfx/render_task.rs b/src/components/gfx/render_task.rs index 1fdbc91aa74..8d62a57664a 100644 --- a/src/components/gfx/render_task.rs +++ b/src/components/gfx/render_task.rs @@ -11,7 +11,6 @@ use servo_msg::compositor_msg::{RenderListener, IdleRenderState, RenderingRender use servo_msg::compositor_msg::{LayerBufferSet}; use font_context::FontContext; use geom::matrix2d::Matrix2D; -use geom::point::Point2D; use geom::size::Size2D; use geom::rect::Rect; use opts::Opts; @@ -33,7 +32,7 @@ pub struct RenderLayer { pub enum Msg { RenderMsg(RenderLayer), - ReRenderMsg(~Rect<uint>], f32), + ReRenderMsg(~[(Rect<uint>, Rect<f32>)], f32), PaintPermissionGranted, PaintPermissionRevoked, ExitMsg(Chan<()>), @@ -146,7 +145,7 @@ impl<C: RenderListener + Send> RenderTask<C> { } } - fn render(&mut self, tiles: ~[Rect<uint>], scale: f32) { + fn render(&mut self, tiles: ~[(Rect<uint>, Rect<f32>)], scale: f32) { debug!("render_task: rendering"); let render_layer; @@ -166,21 +165,18 @@ impl<C: RenderListener + Send> RenderTask<C> { // Divide up the layer into tiles. do time::profile(time::RenderingPrepBuffCategory, self.profiler_chan.clone()) { - for tiles.each |tile_rect| { - let x = tile_rect.origin.x; - let y = tile_rect.origin.y; - let width = tile_rect.size.width; - let height = tile_rect.size.height; - - let rect = Rect(Point2D(x as f32 / scale, y as f32 / scale), Size2D(width as f32, height as f32)); + for tiles.each |tile_rects| { + let (screen_rect, page_rect) = *tile_rects; + let width = screen_rect.size.width; + let height = screen_rect.size.height; let buffer = LayerBuffer { draw_target: DrawTarget::new_with_fbo(self.opts.render_backend, self.share_gl_context, Size2D(width as i32, height as i32), B8G8R8A8), - rect: rect, - screen_pos: *tile_rect, + rect: page_rect, + screen_pos: screen_rect, resolution: scale, stride: (width * 4) as uint }; diff --git a/src/components/main/compositing/mod.rs b/src/components/main/compositing/mod.rs index efb089e92e6..543d2e564cd 100644 --- a/src/components/main/compositing/mod.rs +++ b/src/components/main/compositing/mod.rs @@ -28,7 +28,6 @@ use extra::timer; use geom::matrix::identity; use geom::point::Point2D; use geom::size::Size2D; -use geom::rect::Rect; //eschweic use layers::layers::{ARGB32Format, ContainerLayer, ContainerLayerKind, Format}; use layers::layers::{ImageData, WithDataFn}; use layers::layers::{TextureLayerKind, TextureLayer, TextureManager}; @@ -119,8 +118,7 @@ pub enum Msg { /// Requests the compositors GL context. GetGLContext(Chan<AzGLContext>), - //eschweic - // FIXME: Attach layer ids and epochs to these messages + // TODO: Attach layer ids and epochs to these messages /// Alerts the compositor that there is a new layer to be rendered. NewLayer(Size2D<uint>, uint), /// Alerts the compositor that the current layer has changed size. @@ -237,7 +235,9 @@ impl CompositorTask { let ask_for_tiles: @fn() = || { match *quadtree { Some(ref quad) => { - let mut tile_size = quad.get_tile_size(); // temporary solution + // FIXME: find a better way to get the tile size + // currently tiles that need to be updated can be missed + let mut tile_size = quad.get_tile_size(); let mut tile_request = ~[]; //FIXME: try not to allocate if possible let mut y = world_offset.y as uint; @@ -253,15 +253,15 @@ impl CompositorTask { } None => {} // fall through } - let (tile_pos, new_tile_size) = quad.get_tile_rect(x, y, *world_zoom); - tile_size = new_tile_size; - x = tile_pos.x; - y = tile_pos.y; + let (tile_screen_pos, tile_page_pos) = quad.get_tile_rect(x, y, *world_zoom); + tile_size = tile_screen_pos.size.width; + x = tile_screen_pos.origin.x; + y = tile_screen_pos.origin.y; // TODO: clamp tiles to page bounds // TODO: add null buffer/checkerboard tile to stop a flood of requests - println(fmt!("requesting tile: (%?, %?): %?", x, y, tile_size)); - tile_request.push(Rect(Point2D(x, y), Size2D(tile_size, tile_size))); + debug!("requesting tile: (%?, %?): %?", x, y, tile_size); + tile_request.push((tile_screen_pos, tile_page_pos)); x += tile_size; } @@ -325,32 +325,14 @@ impl CompositorTask { } WindowMouseDownEvent(button, layer_mouse_point) => { event = MouseDownEvent(button, world_mouse_point(layer_mouse_point)); - - //eschweic - match *quadtree { - Some(ref quad) => { - -/* let wmp = world_mouse_point(layer_mouse_point); - println(fmt!("mouse: (%?, %?):", wmp.x as uint, wmp.y as uint)); - let buffer = quad.get_tile(wmp.x as uint, wmp.y as uint, *world_zoom); - match *buffer { - None => println("None"), - Some(ref buffer) => println(fmt!("Some: (%?, %?), %?, %?", buffer.screen_pos.origin.x, buffer.screen_pos.origin.y, buffer.screen_pos.size.width, buffer.resolution)), - - } */ - - println(quad.get_html()); - } - None => {} - } + } WindowMouseUpEvent(button, layer_mouse_point) => { - //FIXME: this should not be here eschweic + // FIXME: this should happen on a scroll/zoom event instead, + // but is here temporarily to prevent request floods to the renderer ask_for_tiles(); - - event = MouseUpEvent(button, world_mouse_point(layer_mouse_point)); } } @@ -385,7 +367,6 @@ impl CompositorTask { GetGLContext(chan) => chan.send(current_gl_context()), - //eschweic NewLayer(new_size, tile_size) => { *page_size = Size2D(new_size.width as f32, new_size.height as f32); *quadtree = Some(Quadtree::new(0, 0, new_size.width, new_size.height, tile_size)); @@ -430,8 +411,8 @@ impl CompositorTask { } for quad.get_all_tiles().each |buffer| { - let width = buffer.rect.size.width as uint; - let height = buffer.rect.size.height as uint; + let width = buffer.screen_pos.size.width as uint; + let height = buffer.screen_pos.size.height as uint; debug!("osmain: compositing buffer rect %?", &buffer.rect); @@ -457,11 +438,11 @@ impl CompositorTask { Some(_) => fail!(~"found unexpected layer kind"), }; - let origin = buffer.screen_pos.origin; + let origin = buffer.rect.origin; let origin = Point2D(origin.x as f32, origin.y as f32); // Set the layer's transform. - let transform = identity().translate(origin.x * *world_zoom / buffer.resolution, origin.y * *world_zoom / buffer.resolution, 0.0); + let transform = identity().translate(origin.x * *world_zoom, origin.y * *world_zoom, 0.0); let transform = transform.scale(width as f32 * *world_zoom / buffer.resolution, height as f32 * *world_zoom / buffer.resolution, 1.0); texture_layer.common.set_transform(transform); diff --git a/src/components/main/compositing/quadtree.rs b/src/components/main/compositing/quadtree.rs index e9fc4e65d85..2fda821406d 100644 --- a/src/components/main/compositing/quadtree.rs +++ b/src/components/main/compositing/quadtree.rs @@ -6,6 +6,8 @@ // been rasterized and which have not. use geom::point::Point2D; +use geom::size::Size2D; +use geom::rect::Rect; /// Parent to all quadtree nodes. Stores variables needed at all levels. All method calls /// at this level are in pixel coordinates. @@ -65,8 +67,8 @@ impl<T> Quadtree<T> { pub fn add_tile(&mut self, x: uint, y: uint, scale: f32, tile: T) { self.root.add_tile(x as f32 / scale, y as f32 / scale, tile, self.max_tile_size as f32 / scale); } - /// Get the tile size/offset for a given pixel position - pub fn get_tile_rect(&self, x: uint, y: uint, scale: f32) -> (Point2D<uint>, uint) { + /// Get the tile rect in screen and page coordinates for a given pixel position + pub fn get_tile_rect(&self, x: uint, y: uint, scale: f32) -> (Rect<uint>, Rect<f32>) { self.root.get_tile_rect(x as f32 / scale, y as f32 / scale, scale, self.max_tile_size as f32 / scale) } /// Get all the tiles in the tree @@ -191,8 +193,8 @@ impl<T> QuadtreeNode<T> { } } - /// Get an origin and a width/height for a future tile for a given position in page coords - fn get_tile_rect(&self, x: f32, y: f32, scale: f32, tile_size: f32) -> (Point2D<uint>, uint) { + /// Get a tile rect in screen and page coords for a given position in page coords + fn get_tile_rect(&self, x: f32, y: f32, scale: f32, tile_size: f32) -> (Rect<uint>, Rect<f32>) { if x >= self.origin.x + self.size || x < self.origin.x || y >= self.origin.y + self.size || y < self.origin.y { fail!("Quadtree: Tried to query a tile rect outside of range"); @@ -202,7 +204,8 @@ impl<T> QuadtreeNode<T> { let self_x = (self.origin.x * scale).ceil() as uint; let self_y = (self.origin.y * scale).ceil() as uint; let self_size = (self.size * scale).ceil() as uint; - return (Point2D(self_x, self_y), self_size); + return (Rect(Point2D(self_x, self_y), Size2D(self_size, self_size)), + Rect(Point2D(self.origin.x, self.origin.y), Size2D(self.size, self.size))); } let index = self.get_quadrant(x,y) as int; @@ -219,7 +222,8 @@ impl<T> QuadtreeNode<T> { let new_x_pixel = (new_x_page * scale).ceil() as uint; let new_y_pixel = (new_y_page * scale).ceil() as uint; - (Point2D(new_x_pixel, new_y_pixel), new_size_pixel) + (Rect(Point2D(new_x_pixel, new_y_pixel), Size2D(new_size_pixel, new_size_pixel)), + Rect(Point2D(new_x_page, new_y_page), Size2D(new_size_page, new_size_page))) } Some(ref child) => child.get_tile_rect(x, y, scale, tile_size), } diff --git a/src/components/msg/compositor_msg.rs b/src/components/msg/compositor_msg.rs index 0763833357c..4a5ba488f1b 100644 --- a/src/components/msg/compositor_msg.rs +++ b/src/components/msg/compositor_msg.rs @@ -20,7 +20,7 @@ pub struct LayerBuffer { screen_pos: Rect<uint>, // The scale at which this tile is rendered - resolution: f32, //eschweic + resolution: f32, // NB: stride is in pixels, like OpenGL GL_UNPACK_ROW_LENGTH. stride: uint, |