mirror of
https://github.com/servo/servo.git
synced 2025-08-04 05:00:08 +01:00
Added a command-line argument for rendering tiles at higher resolutions
This commit is contained in:
parent
e50cee9adc
commit
f3ad95fa01
6 changed files with 32 additions and 9 deletions
|
@ -12,6 +12,8 @@ pub struct LayerBuffer {
|
||||||
// The rect in the containing RenderLayer that this represents.
|
// The rect in the containing RenderLayer that this represents.
|
||||||
rect: Rect<uint>,
|
rect: Rect<uint>,
|
||||||
|
|
||||||
|
screen_pos: Rect<uint>,
|
||||||
|
|
||||||
// NB: stride is in pixels, like OpenGL GL_UNPACK_ROW_LENGTH.
|
// NB: stride is in pixels, like OpenGL GL_UNPACK_ROW_LENGTH.
|
||||||
stride: uint
|
stride: uint
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,10 @@ pub struct Opts {
|
||||||
n_render_threads: uint,
|
n_render_threads: uint,
|
||||||
tile_size: uint,
|
tile_size: uint,
|
||||||
profiler_period: Option<f64>,
|
profiler_period: Option<f64>,
|
||||||
|
|
||||||
|
/// A scale factor to apply to tiles, to allow rendering tiles at higher resolutions for
|
||||||
|
/// testing pan and zoom code.
|
||||||
|
zoom: uint,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(non_implicitly_copyable_typarams)]
|
#[allow(non_implicitly_copyable_typarams)]
|
||||||
|
@ -28,6 +32,7 @@ pub fn from_cmdline_args(args: &[~str]) -> Opts {
|
||||||
getopts::optopt(~"s"), // size of tiles
|
getopts::optopt(~"s"), // size of tiles
|
||||||
getopts::optopt(~"t"), // threads to render with
|
getopts::optopt(~"t"), // threads to render with
|
||||||
getopts::optflagopt(~"p"), // profiler flag and output interval
|
getopts::optflagopt(~"p"), // profiler flag and output interval
|
||||||
|
getopts::optopt(~"z"), // zoom level
|
||||||
];
|
];
|
||||||
|
|
||||||
let opt_match = match getopts::getopts(args, opts) {
|
let opt_match = match getopts::getopts(args, opts) {
|
||||||
|
@ -76,11 +81,17 @@ pub fn from_cmdline_args(args: &[~str]) -> Opts {
|
||||||
None => None,
|
None => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let zoom: uint = match getopts::opt_maybe_str(&opt_match, ~"z") {
|
||||||
|
Some(zoom_str) => uint::from_str(zoom_str).get(),
|
||||||
|
None => 1,
|
||||||
|
};
|
||||||
|
|
||||||
Opts {
|
Opts {
|
||||||
urls: urls,
|
urls: urls,
|
||||||
render_backend: render_backend,
|
render_backend: render_backend,
|
||||||
n_render_threads: n_render_threads,
|
n_render_threads: n_render_threads,
|
||||||
tile_size: tile_size,
|
tile_size: tile_size,
|
||||||
profiler_period: profiler_period,
|
profiler_period: profiler_period,
|
||||||
|
zoom: zoom,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,7 @@ pub fn render_layers(layer_ref: *RenderLayer,
|
||||||
f: RenderFn)
|
f: RenderFn)
|
||||||
-> LayerBufferSet {
|
-> LayerBufferSet {
|
||||||
let tile_size = opts.tile_size;
|
let tile_size = opts.tile_size;
|
||||||
|
let scale = opts.zoom;
|
||||||
|
|
||||||
// FIXME: Try not to create a new array here.
|
// FIXME: Try not to create a new array here.
|
||||||
let mut new_buffer_ports = ~[];
|
let mut new_buffer_ports = ~[];
|
||||||
|
@ -45,12 +46,12 @@ pub fn render_layers(layer_ref: *RenderLayer,
|
||||||
do time::profile(time::RenderingPrepBuffCategory, prof_chan.clone()) {
|
do time::profile(time::RenderingPrepBuffCategory, prof_chan.clone()) {
|
||||||
let layer: &RenderLayer = unsafe { cast::transmute(layer_ref) };
|
let layer: &RenderLayer = unsafe { cast::transmute(layer_ref) };
|
||||||
let mut y = 0;
|
let mut y = 0;
|
||||||
while y < layer.size.height {
|
while y < layer.size.height * scale {
|
||||||
let mut x = 0;
|
let mut x = 0;
|
||||||
while x < layer.size.width {
|
while x < layer.size.width * scale {
|
||||||
// Figure out the dimension of this tile.
|
// Figure out the dimension of this tile.
|
||||||
let right = uint::min(x + tile_size, layer.size.width);
|
let right = uint::min(x + tile_size, layer.size.width * scale);
|
||||||
let bottom = uint::min(y + tile_size, layer.size.height);
|
let bottom = uint::min(y + tile_size, layer.size.height * scale);
|
||||||
let width = right - x;
|
let width = right - x;
|
||||||
let height = bottom - y;
|
let height = bottom - y;
|
||||||
|
|
||||||
|
@ -65,7 +66,8 @@ pub fn render_layers(layer_ref: *RenderLayer,
|
||||||
|
|
||||||
debug!("tile aligned_width %u", aligned_width);
|
debug!("tile aligned_width %u", aligned_width);
|
||||||
|
|
||||||
let tile_rect = Rect(Point2D(x, y), Size2D(aligned_width, height));
|
let tile_rect = Rect(Point2D(x / scale, y / scale), Size2D(aligned_width, height)); //change this
|
||||||
|
let screen_rect = Rect(Point2D(x, y), Size2D(aligned_width, height)); //change this
|
||||||
|
|
||||||
let buffer;
|
let buffer;
|
||||||
// FIXME: Try harder to search for a matching tile.
|
// FIXME: Try harder to search for a matching tile.
|
||||||
|
@ -112,6 +114,7 @@ pub fn render_layers(layer_ref: *RenderLayer,
|
||||||
stride,
|
stride,
|
||||||
B8G8R8A8),
|
B8G8R8A8),
|
||||||
rect: tile_rect,
|
rect: tile_rect,
|
||||||
|
screen_pos: screen_rect,
|
||||||
stride: stride as uint
|
stride: stride as uint
|
||||||
};
|
};
|
||||||
//}
|
//}
|
||||||
|
|
|
@ -140,17 +140,24 @@ impl<C: Compositor + Owned> Renderer<C> {
|
||||||
|
|
||||||
// Apply the translation to render the tile we want.
|
// Apply the translation to render the tile we want.
|
||||||
let matrix: Matrix2D<AzFloat> = Matrix2D::identity();
|
let matrix: Matrix2D<AzFloat> = Matrix2D::identity();
|
||||||
let matrix = matrix.translate(&-(layer_buffer.rect.origin.x as AzFloat),
|
let scale = thread_render_context.opts.zoom as f32;
|
||||||
&-(layer_buffer.rect.origin.y as AzFloat));
|
|
||||||
|
let matrix = matrix.scale(scale as AzFloat, scale as AzFloat);
|
||||||
|
let matrix = matrix.translate(-(layer_buffer.rect.origin.x as f32) as AzFloat,
|
||||||
|
-(layer_buffer.rect.origin.y as f32) as AzFloat);
|
||||||
|
|
||||||
|
|
||||||
layer_buffer.draw_target.set_transform(&matrix);
|
layer_buffer.draw_target.set_transform(&matrix);
|
||||||
|
|
||||||
// Clear the buffer.
|
// Clear the buffer.
|
||||||
ctx.clear();
|
ctx.clear();
|
||||||
|
|
||||||
|
|
||||||
// Draw the display list.
|
// Draw the display list.
|
||||||
let render_layer: &RenderLayer = unsafe {
|
let render_layer: &RenderLayer = unsafe {
|
||||||
cast::transmute(render_layer_ref)
|
cast::transmute(render_layer_ref)
|
||||||
};
|
};
|
||||||
|
|
||||||
render_layer.display_list.draw_into_context(&ctx);
|
render_layer.display_list.draw_into_context(&ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -206,7 +206,7 @@ fn run_main_loop(port: Port<Msg>,
|
||||||
Some(_) => fail!(~"found unexpected layer kind"),
|
Some(_) => fail!(~"found unexpected layer kind"),
|
||||||
};
|
};
|
||||||
|
|
||||||
let origin = buffer.rect.origin;
|
let origin = buffer.screen_pos.origin;
|
||||||
let origin = Point2D(origin.x as f32, origin.y as f32);
|
let origin = Point2D(origin.x as f32, origin.y as f32);
|
||||||
|
|
||||||
// Set the layer's transform.
|
// Set the layer's transform.
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit ebf1cc8f2e8a39f31da2575981fad966aa7da904
|
Subproject commit 0b8ba61c6a9f33e6703be3e1e58bf4a74b248117
|
Loading…
Add table
Add a link
Reference in a new issue