aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/gfx/render_task.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/gfx/render_task.rs')
-rw-r--r--src/components/gfx/render_task.rs41
1 files changed, 30 insertions, 11 deletions
diff --git a/src/components/gfx/render_task.rs b/src/components/gfx/render_task.rs
index a0b54d8dd9e..32368265deb 100644
--- a/src/components/gfx/render_task.rs
+++ b/src/components/gfx/render_task.rs
@@ -31,6 +31,7 @@ pub struct RenderLayer {
pub enum Msg<C> {
AttachCompositorMsg(C),
RenderMsg(RenderLayer),
+ ReRenderMsg(f32),
ExitMsg(Chan<()>),
}
@@ -82,6 +83,7 @@ pub fn create_render_task<C: RenderListener + Owned>(port: Port<Msg<C>>,
opts: opts_cell.take(),
profiler_chan: profiler_chan_copy,
share_gl_context: share_gl_context,
+ render_layer: None,
};
renderer.start();
@@ -98,6 +100,9 @@ priv struct Renderer<C> {
profiler_chan: ProfilerChan,
share_gl_context: AzGLContext,
+
+ /// The layer to be rendered
+ render_layer: Option<RenderLayer>,
}
impl<C: RenderListener + Owned> Renderer<C> {
@@ -107,7 +112,13 @@ impl<C: RenderListener + Owned> Renderer<C> {
loop {
match self.port.recv() {
AttachCompositorMsg(compositor) => self.compositor = compositor,
- RenderMsg(render_layer) => self.render(render_layer),
+ RenderMsg(render_layer) => {
+ self.render_layer = Some(render_layer);
+ self.render(1.0);
+ }
+ ReRenderMsg(scale) => {
+ self.render(scale);
+ }
ExitMsg(response_ch) => {
response_ch.send(());
break;
@@ -116,12 +127,20 @@ impl<C: RenderListener + Owned> Renderer<C> {
}
}
- fn render(&mut self, render_layer: RenderLayer) {
+ fn render(&mut self, scale: f32) {
debug!("renderer: rendering");
+
+ let render_layer;
+ match (self.render_layer) {
+ None => return,
+ Some(ref r_layer) => {
+ render_layer = r_layer;
+ }
+ }
+
self.compositor.set_render_state(RenderingRenderState);
do profile(time::RenderingCategory, self.profiler_chan.clone()) {
let tile_size = self.opts.tile_size;
- let scale = self.opts.zoom;
// FIXME: Try not to create a new array here.
let mut new_buffers = ~[];
@@ -129,17 +148,17 @@ impl<C: RenderListener + Owned> Renderer<C> {
// Divide up the layer into tiles.
do time::profile(time::RenderingPrepBuffCategory, self.profiler_chan.clone()) {
let mut y = 0;
- while y < render_layer.size.height * scale {
+ while y < (render_layer.size.height as f32 * scale).ceil() as uint {
let mut x = 0;
- while x < render_layer.size.width * scale {
+ while x < (render_layer.size.width as f32 * scale).ceil() as uint {
// Figure out the dimension of this tile.
- let right = uint::min(x + tile_size, render_layer.size.width * scale);
- let bottom = uint::min(y + tile_size, render_layer.size.height * scale);
+ let right = uint::min(x + tile_size, (render_layer.size.width as f32 * scale).ceil() as uint);
+ let bottom = uint::min(y + tile_size, (render_layer.size.height as f32 * scale).ceil() as uint);
let width = right - x;
let height = bottom - y;
- let tile_rect = Rect(Point2D(x / scale, y / scale), Size2D(width, height)); //change this
- let screen_rect = Rect(Point2D(x, y), Size2D(width, height)); //change this
+ let tile_rect = Rect(Point2D(x as f32 / scale, y as f32 / scale), Size2D(width as f32, height as f32));
+ let screen_rect = Rect(Point2D(x, y), Size2D(width, height));
let buffer = LayerBuffer {
draw_target: DrawTarget::new_with_fbo(self.opts.render_backend,
@@ -162,8 +181,8 @@ impl<C: RenderListener + Owned> Renderer<C> {
// Apply the translation to render the tile we want.
let matrix: Matrix2D<AzFloat> = Matrix2D::identity();
let matrix = matrix.scale(scale as AzFloat, scale as AzFloat);
- let matrix = matrix.translate(-(buffer.rect.origin.x as f32) as AzFloat,
- -(buffer.rect.origin.y as f32) as AzFloat);
+ let matrix = matrix.translate(-(buffer.rect.origin.x) as AzFloat,
+ -(buffer.rect.origin.y) as AzFloat);
ctx.canvas.draw_target.set_transform(&matrix);