mirror of
https://github.com/servo/servo.git
synced 2025-08-03 20:50:07 +01:00
Render to PNG file when using -o flag
This commit is contained in:
parent
e0149a6043
commit
7a8305dc16
5 changed files with 98 additions and 27 deletions
36
src/servo/engine.rs
Normal file
36
src/servo/engine.rs
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
import gfx::renderer;
|
||||||
|
|
||||||
|
enum msg {
|
||||||
|
load_url(str),
|
||||||
|
exit(comm::chan<()>)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn engine<S: renderer::sink send>(sink: S) -> comm::chan<msg> {
|
||||||
|
|
||||||
|
task::spawn_listener::<msg> {|self_ch|
|
||||||
|
// The renderer
|
||||||
|
let renderer = renderer::renderer(sink);
|
||||||
|
|
||||||
|
// The layout task
|
||||||
|
let layout = layout::layout::layout(renderer);
|
||||||
|
|
||||||
|
// The content task
|
||||||
|
let content = content::content(layout);
|
||||||
|
|
||||||
|
loop {
|
||||||
|
alt self_ch.recv() {
|
||||||
|
load_url(url) { content.send(content::parse(url)) }
|
||||||
|
exit(sender) {
|
||||||
|
content.send(content::exit);
|
||||||
|
layout.send(layout::layout::exit);
|
||||||
|
listen {|resp_ch|
|
||||||
|
renderer.send(renderer::exit(resp_ch));
|
||||||
|
resp_ch.recv();
|
||||||
|
}
|
||||||
|
sender.send(());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -41,9 +41,11 @@ fn pngsink(output: chan<[u8]>) -> chan<msg> {
|
||||||
loop {
|
loop {
|
||||||
alt po.recv() {
|
alt po.recv() {
|
||||||
begin_drawing(sender) {
|
begin_drawing(sender) {
|
||||||
|
#debug("pngsink: begin_drawing");
|
||||||
sender.send(draw_target);
|
sender.send(draw_target);
|
||||||
}
|
}
|
||||||
draw(sender, dt) {
|
draw(sender, dt) {
|
||||||
|
#debug("pngsink: draw");
|
||||||
do_draw(sender, dt, output, cairo_surf);
|
do_draw(sender, dt, output, cairo_surf);
|
||||||
}
|
}
|
||||||
exit { break }
|
exit { break }
|
||||||
|
|
|
@ -12,7 +12,7 @@ type opts = {
|
||||||
|
|
||||||
enum render_mode {
|
enum render_mode {
|
||||||
screen,
|
screen,
|
||||||
file(str)
|
png(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn from_cmdline_args(args: [str]) -> opts {
|
fn from_cmdline_args(args: [str]) -> opts {
|
||||||
|
@ -36,7 +36,7 @@ fn from_cmdline_args(args: [str]) -> opts {
|
||||||
};
|
};
|
||||||
|
|
||||||
let render_mode = alt getopts::opt_maybe_str(match, "o") {
|
let render_mode = alt getopts::opt_maybe_str(match, "o") {
|
||||||
some(output_file) { file(output_file) }
|
some(output_file) { png(output_file) }
|
||||||
none { screen }
|
none { screen }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -50,3 +50,4 @@ mod util {
|
||||||
|
|
||||||
mod content;
|
mod content;
|
||||||
mod opts;
|
mod opts;
|
||||||
|
mod engine;
|
|
@ -11,41 +11,73 @@ fn main(args: [str]) {
|
||||||
|
|
||||||
fn run(opts: opts::opts) {
|
fn run(opts: opts::opts) {
|
||||||
|
|
||||||
|
alt opts.render_mode {
|
||||||
|
opts::screen {
|
||||||
|
run_pipeline_screen(opts.urls)
|
||||||
|
}
|
||||||
|
opts::png(outfile) {
|
||||||
|
assert opts.urls.is_not_empty();
|
||||||
|
if opts.urls.len() > 1u {
|
||||||
|
fail "servo asks that you stick to a single URL in PNG output mode"
|
||||||
|
}
|
||||||
|
run_pipeline_png(opts.urls.head(), outfile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_pipeline_screen(urls: [str]) {
|
||||||
|
|
||||||
|
// Use the platform thread as the renderer sink
|
||||||
|
import osmain::gfxsink;
|
||||||
|
|
||||||
// The platform event handler thread
|
// The platform event handler thread
|
||||||
let osmain = osmain::osmain();
|
let osmain = osmain::osmain();
|
||||||
|
|
||||||
// The renderer
|
// Create a serve instance
|
||||||
let renderer = {
|
let engine = engine::engine(osmain);
|
||||||
// Use the platform thread as the renderer sink
|
|
||||||
import osmain::gfxsink;
|
|
||||||
renderer::renderer(osmain)
|
|
||||||
};
|
|
||||||
|
|
||||||
// The layout task
|
|
||||||
let layout = layout::layout::layout(renderer);
|
|
||||||
|
|
||||||
// The content task
|
|
||||||
let content = content::content(layout);
|
|
||||||
|
|
||||||
// Send each file to render then wait for keypress
|
// Send each file to render then wait for keypress
|
||||||
for opts.urls.each { |filename|
|
|
||||||
#debug["master: Sending filename `%s`", filename];
|
|
||||||
content.send(content::parse(filename));
|
|
||||||
#debug["master: Waiting for keypress"];
|
|
||||||
listen {|key_ch|
|
listen {|key_ch|
|
||||||
osmain.send(platform::osmain::add_key_handler(key_ch));
|
osmain.send(platform::osmain::add_key_handler(key_ch));
|
||||||
|
|
||||||
|
for urls.each { |filename|
|
||||||
|
#debug["master: Sending filename `%s`", filename];
|
||||||
|
engine.send(engine::load_url(filename));
|
||||||
|
#debug["master: Waiting for keypress"];
|
||||||
key_ch.recv();
|
key_ch.recv();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shut everything down
|
// Shut everything down
|
||||||
#debug["master: Shut down"];
|
#debug["master: Shut down"];
|
||||||
content.send(content::exit);
|
listen {|resp_ch|
|
||||||
layout.send(layout::layout::exit);
|
engine.send(engine::exit(resp_ch));
|
||||||
|
resp_ch.recv();
|
||||||
listen {|wait_ch|
|
|
||||||
renderer.send(gfx::renderer::exit(wait_ch));
|
|
||||||
wait_ch.recv();
|
|
||||||
}
|
}
|
||||||
osmain.send(platform::osmain::exit);
|
osmain.send(platform::osmain::exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn run_pipeline_png(url: str, outfile: str) {
|
||||||
|
|
||||||
|
// Use a PNG encoder as the graphics sink
|
||||||
|
import gfx::pngsink;
|
||||||
|
import pngsink::pngsink;
|
||||||
|
|
||||||
|
listen {|pngdata|
|
||||||
|
let sink = pngsink::pngsink(pngdata);
|
||||||
|
let engine = engine::engine(sink);
|
||||||
|
engine.send(engine::load_url(url));
|
||||||
|
alt io::buffered_file_writer(outfile) {
|
||||||
|
result::ok(writer) {
|
||||||
|
import io::writer;
|
||||||
|
writer.write(pngdata.recv())
|
||||||
|
}
|
||||||
|
result::err(e) { fail e }
|
||||||
|
}
|
||||||
|
listen {|resp_ch|
|
||||||
|
engine.send(engine::exit(resp_ch));
|
||||||
|
resp_ch.recv();
|
||||||
|
}
|
||||||
|
sink.send(pngsink::exit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue