mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
servo: Remove the type parameter from the compositor, rename OSMain, and refactor engine a bit
This commit is contained in:
parent
7e933b7464
commit
0a6b537c5f
3 changed files with 73 additions and 71 deletions
|
@ -21,10 +21,8 @@ pub struct LayerBufferSet {
|
|||
buffers: ~[LayerBuffer]
|
||||
}
|
||||
|
||||
/**
|
||||
The interface used to by the renderer to aquire draw targets for
|
||||
each rendered frame and submit them to be drawn to the display
|
||||
*/
|
||||
/// The interface used to by the renderer to acquire draw targets for each rendered frame and
|
||||
/// submit them to be drawn to the display.
|
||||
pub trait Compositor {
|
||||
fn begin_drawing(&self, next_dt: comm::Chan<LayerBufferSet>);
|
||||
fn draw(&self, next_dt: comm::Chan<LayerBufferSet>, +draw_me: LayerBufferSet);
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use compositing::CompositorImpl;
|
||||
use content::content_task::{ContentTask, ExecuteMsg, ParseMsg};
|
||||
use content::content_task;
|
||||
use dom::event::Event;
|
||||
|
@ -13,7 +14,7 @@ use resource::resource_task;
|
|||
use util::task::spawn_listener;
|
||||
|
||||
use core::cell::Cell;
|
||||
use core::comm::{Port, Chan};
|
||||
use core::comm::{Chan, Port, SharedChan};
|
||||
use gfx::compositor::Compositor;
|
||||
use gfx::opts::Opts;
|
||||
use gfx::render_task::RenderTask;
|
||||
|
@ -23,13 +24,13 @@ use std::net::url::Url;
|
|||
pub type EngineTask = Chan<Msg>;
|
||||
|
||||
pub enum Msg {
|
||||
LoadURLMsg(Url),
|
||||
LoadUrlMsg(Url),
|
||||
ExitMsg(Chan<()>)
|
||||
}
|
||||
|
||||
pub struct Engine<C> {
|
||||
pub struct Engine {
|
||||
request_port: Port<Msg>,
|
||||
compositor: C,
|
||||
compositor: CompositorImpl,
|
||||
render_task: RenderTask,
|
||||
resource_task: ResourceTask,
|
||||
image_cache_task: ImageCacheTask,
|
||||
|
@ -37,39 +38,42 @@ pub struct Engine<C> {
|
|||
content_task: ContentTask
|
||||
}
|
||||
|
||||
pub fn Engine<C:Compositor + Owned + Clone>(compositor: C,
|
||||
opts: &Opts,
|
||||
dom_event_port: comm::Port<Event>,
|
||||
dom_event_chan: comm::SharedChan<Event>,
|
||||
resource_task: ResourceTask,
|
||||
image_cache_task: ImageCacheTask)
|
||||
-> EngineTask {
|
||||
let dom_event_port = Cell(dom_event_port);
|
||||
let dom_event_chan = Cell(dom_event_chan);
|
||||
impl Engine {
|
||||
pub fn start(compositor: CompositorImpl,
|
||||
opts: &Opts,
|
||||
dom_event_port: Port<Event>,
|
||||
dom_event_chan: SharedChan<Event>,
|
||||
resource_task: ResourceTask,
|
||||
image_cache_task: ImageCacheTask)
|
||||
-> EngineTask {
|
||||
let dom_event_port = Cell(dom_event_port);
|
||||
let dom_event_chan = Cell(dom_event_chan);
|
||||
|
||||
let opts = Cell(copy *opts);
|
||||
do spawn_listener::<Msg> |request| {
|
||||
let render_task = RenderTask(compositor.clone(), opts.with_ref(|o| copy *o));
|
||||
let layout_task = LayoutTask(render_task.clone(), image_cache_task.clone(), opts.take());
|
||||
let content_task = ContentTask(layout_task.clone(),
|
||||
dom_event_port.take(),
|
||||
dom_event_chan.take(),
|
||||
resource_task.clone(),
|
||||
image_cache_task.clone());
|
||||
let opts = Cell(copy *opts);
|
||||
do spawn_listener::<Msg> |request| {
|
||||
let render_task = RenderTask(compositor.clone(), opts.with_ref(|o| copy *o));
|
||||
|
||||
Engine {
|
||||
request_port: request,
|
||||
compositor: compositor.clone(),
|
||||
render_task: render_task,
|
||||
resource_task: resource_task.clone(),
|
||||
image_cache_task: image_cache_task.clone(),
|
||||
layout_task: layout_task,
|
||||
content_task: content_task
|
||||
}.run();
|
||||
let opts = opts.take();
|
||||
let layout_task = LayoutTask(render_task.clone(), image_cache_task.clone(), opts);
|
||||
|
||||
let content_task = ContentTask(layout_task.clone(),
|
||||
dom_event_port.take(),
|
||||
dom_event_chan.take(),
|
||||
resource_task.clone(),
|
||||
image_cache_task.clone());
|
||||
|
||||
Engine {
|
||||
request_port: request,
|
||||
compositor: compositor.clone(),
|
||||
render_task: render_task,
|
||||
resource_task: resource_task.clone(),
|
||||
image_cache_task: image_cache_task.clone(),
|
||||
layout_task: layout_task,
|
||||
content_task: content_task,
|
||||
}.run()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<C:Compositor + Owned + Clone> Engine<C> {
|
||||
fn run(&self) {
|
||||
while self.handle_request(self.request_port.recv()) {
|
||||
// Go on...
|
||||
|
@ -78,30 +82,30 @@ impl<C:Compositor + Owned + Clone> Engine<C> {
|
|||
|
||||
fn handle_request(&self, request: Msg) -> bool {
|
||||
match request {
|
||||
LoadURLMsg(url) => {
|
||||
if url.path.ends_with(".js") {
|
||||
self.content_task.send(ExecuteMsg(url))
|
||||
} else {
|
||||
self.content_task.send(ParseMsg(url))
|
||||
LoadUrlMsg(url) => {
|
||||
if url.path.ends_with(".js") {
|
||||
self.content_task.send(ExecuteMsg(url))
|
||||
} else {
|
||||
self.content_task.send(ParseMsg(url))
|
||||
}
|
||||
return true
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
ExitMsg(sender) => {
|
||||
self.content_task.send(content_task::ExitMsg);
|
||||
self.layout_task.send(layout_task::ExitMsg);
|
||||
|
||||
let (response_port, response_chan) = comm::stream();
|
||||
ExitMsg(sender) => {
|
||||
self.content_task.send(content_task::ExitMsg);
|
||||
self.layout_task.send(layout_task::ExitMsg);
|
||||
|
||||
self.render_task.send(render_task::ExitMsg(response_chan));
|
||||
response_port.recv();
|
||||
let (response_port, response_chan) = comm::stream();
|
||||
|
||||
self.image_cache_task.exit();
|
||||
self.resource_task.send(resource_task::Exit);
|
||||
self.render_task.send(render_task::ExitMsg(response_chan));
|
||||
response_port.recv();
|
||||
|
||||
sender.send(());
|
||||
return false;
|
||||
}
|
||||
self.image_cache_task.exit();
|
||||
self.resource_task.send(resource_task::Exit);
|
||||
|
||||
sender.send(());
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,8 +33,8 @@ extern mod core_graphics;
|
|||
#[cfg(target_os="macos")]
|
||||
extern mod core_text;
|
||||
|
||||
use compositing::{AddKeyHandler, OSMain};
|
||||
use engine::{Engine, LoadURLMsg};
|
||||
use compositing::{AddKeyHandler, CompositorImpl};
|
||||
use engine::{Engine, LoadUrlMsg};
|
||||
|
||||
pub use gfx::opts::{Opts, Png, Screen}; // FIXME: Do we really want "Screen" and "Png" visible?
|
||||
pub use gfx::resource;
|
||||
|
@ -145,29 +145,29 @@ fn run_pipeline_screen(opts: &Opts) {
|
|||
let dom_event_chan = comm::SharedChan::new(dom_event_chan);
|
||||
|
||||
// The platform event handler thread
|
||||
let osmain = OSMain(dom_event_chan.clone(), copy *opts);
|
||||
let compositor = CompositorImpl::new(dom_event_chan.clone(), copy *opts);
|
||||
|
||||
// Send each file to render then wait for keypress
|
||||
let (keypress_from_osmain, keypress_to_engine) = comm::stream();
|
||||
osmain.chan.send(AddKeyHandler(keypress_to_engine));
|
||||
let (keypress_from_compositor, keypress_to_engine) = comm::stream();
|
||||
compositor.chan.send(AddKeyHandler(keypress_to_engine));
|
||||
|
||||
// Create a servo instance
|
||||
let resource_task = ResourceTask();
|
||||
let image_cache_task = ImageCacheTask(resource_task.clone());
|
||||
let engine_task = Engine(osmain.clone(),
|
||||
opts,
|
||||
dom_event_port,
|
||||
dom_event_chan,
|
||||
resource_task,
|
||||
image_cache_task);
|
||||
let engine_task = Engine::start(compositor.clone(),
|
||||
opts,
|
||||
dom_event_port,
|
||||
dom_event_chan,
|
||||
resource_task,
|
||||
image_cache_task);
|
||||
|
||||
for opts.urls.each |filename| {
|
||||
let url = make_url(copy *filename, None);
|
||||
debug!("master: Sending url `%s`", url.to_str());
|
||||
engine_task.send(LoadURLMsg(url));
|
||||
engine_task.send(LoadUrlMsg(url));
|
||||
debug!("master: Waiting for keypress");
|
||||
|
||||
match keypress_from_osmain.try_recv() {
|
||||
match keypress_from_compositor.try_recv() {
|
||||
Some(*) => { }
|
||||
None => { error!("keypress stream closed unexpectedly") }
|
||||
};
|
||||
|
@ -179,7 +179,7 @@ fn run_pipeline_screen(opts: &Opts) {
|
|||
engine_task.send(engine::ExitMsg(exit_chan));
|
||||
exit_response_from_engine.recv();
|
||||
|
||||
osmain.chan.send(compositing::Exit);
|
||||
compositor.chan.send(compositing::Exit);
|
||||
}
|
||||
|
||||
fn run_pipeline_png(_opts: &Opts, _outfile: &str) {
|
||||
|
@ -209,7 +209,7 @@ fn run_pipeline_png(url: ~str, outfile: &str) {
|
|||
dom_event_chan,
|
||||
resource_task,
|
||||
image_cache_task);
|
||||
engine_task.send(LoadURLMsg(make_url(copy url, None)));
|
||||
engine_task.send(LoadUrlMsg(make_url(copy url, None)));
|
||||
|
||||
match buffered_file_writer(&Path(outfile)) {
|
||||
Ok(writer) => writer.write(pngdata_from_compositor.recv()),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue