From 8f1f4f479d553fe5a92120bd4186170fe41158d0 Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Fri, 13 Jul 2012 00:12:58 -0700 Subject: [PATCH] Use pipes for drawing interface --- src/servo/gfx/pngsink.rs | 10 +++---- src/servo/gfx/renderer.rs | 53 ++++++++++++++++++++---------------- src/servo/platform/osmain.rs | 10 +++---- 3 files changed, 40 insertions(+), 33 deletions(-) diff --git a/src/servo/gfx/pngsink.rs b/src/servo/gfx/pngsink.rs index adec1e64a62..c717fbb4f09 100644 --- a/src/servo/gfx/pngsink.rs +++ b/src/servo/gfx/pngsink.rs @@ -30,16 +30,16 @@ import layout::display_list::display_list; type PngSink = chan; enum Msg { - BeginDrawing(chan), - Draw(chan, AzDrawTargetRef), + BeginDrawing(pipes::chan), + Draw(pipes::chan, AzDrawTargetRef), Exit } impl PngSink of Sink for chan { - fn begin_drawing(next_dt: chan) { + fn begin_drawing(+next_dt: pipes::chan) { self.send(BeginDrawing(next_dt)) } - fn draw(next_dt: chan, draw_me: AzDrawTargetRef) { + fn draw(+next_dt: pipes::chan, draw_me: AzDrawTargetRef) { self.send(Draw(next_dt, draw_me)) } fn add_event_listener(_listener: chan) { @@ -76,7 +76,7 @@ fn PngSink(output: chan<~[u8]>) -> PngSink { }) } -fn do_draw(sender: chan, +fn do_draw(sender: pipes::chan, dt: AzDrawTargetRef, output: chan<~[u8]>, cairo_surf: *cairo_surface_t) { diff --git a/src/servo/gfx/renderer.rs b/src/servo/gfx/renderer.rs index 5a9146e33fa..a4706bc4c72 100644 --- a/src/servo/gfx/renderer.rs +++ b/src/servo/gfx/renderer.rs @@ -31,38 +31,45 @@ each rendered frame and submit them to be drawn to the display FIXME: Change this name to Compositor. "] iface Sink { - fn begin_drawing(next_dt: comm::chan); - fn draw(next_dt: comm::chan, draw_me: AzDrawTargetRef); + fn begin_drawing(+next_dt: pipes::chan); + fn draw(+next_dt: pipes::chan, draw_me: AzDrawTargetRef); fn add_event_listener(listener: comm::chan); } fn Renderer(sink: S) -> comm::chan { task::spawn_listener::(|po| { - listen(|draw_target_ch| { - #debug("renderer: beginning rendering loop"); - sink.begin_drawing(draw_target_ch); + let (draw_target_ch, draw_target_po) = pipes::stream(); + let mut draw_target_ch = draw_target_ch; + let mut draw_target_po = draw_target_po; - loop { - alt po.recv() { - RenderMsg(display_list) { - #debug("renderer: got render request"); - let draw_target = draw_target_ch.recv(); - #debug("renderer: rendering"); + #debug("renderer: beginning rendering loop"); + sink.begin_drawing(draw_target_ch); - do util::time::time(~"rendering") { - clear(draw_target); - draw_display_list(draw_target, display_list); - #debug("renderer: returning surface"); - sink.draw(draw_target_ch, draw_target); - } - } - ExitMsg(response_ch) { - response_ch.send(()); - break; - } + loop { + alt po.recv() { + RenderMsg(display_list) { + #debug("renderer: got render request"); + let draw_target = draw_target_po.recv(); + let (ch, po) = pipes::stream(); + let mut draw_target_ch_ = some(ch); + draw_target_po = po; + #debug("renderer: rendering"); + do util::time::time(~"rendering") { + let mut draw_target_ch = none; + draw_target_ch_ <-> draw_target_ch; + let draw_target_ch = option::unwrap(draw_target_ch); + clear(draw_target); + draw_display_list(draw_target, display_list); + #debug("renderer: returning surface"); + sink.draw(draw_target_ch, draw_target); } + } + ExitMsg(response_ch) { + response_ch.send(()); + break; + } } - }) + } }) } diff --git a/src/servo/platform/osmain.rs b/src/servo/platform/osmain.rs index b193b3167c1..52d6aafe885 100644 --- a/src/servo/platform/osmain.rs +++ b/src/servo/platform/osmain.rs @@ -21,8 +21,8 @@ import pipes::chan; type OSMain = comm::chan; enum Msg { - BeginDrawing(comm::chan), - Draw(comm::chan, AzDrawTargetRef), + BeginDrawing(pipes::chan), + Draw(pipes::chan, AzDrawTargetRef), AddKeyHandler(pipes::chan<()>), AddEventListener(comm::chan), Exit @@ -138,10 +138,10 @@ Implementation to allow the osmain channel to be used as a graphics sink for the renderer "] impl OSMain of Sink for OSMain { - fn begin_drawing(next_dt: comm::chan) { + fn begin_drawing(+next_dt: pipes::chan) { self.send(BeginDrawing(next_dt)) } - fn draw(next_dt: comm::chan, draw_me: AzDrawTargetRef) { + fn draw(+next_dt: pipes::chan, draw_me: AzDrawTargetRef) { self.send(Draw(next_dt, draw_me)) } fn add_event_listener(listener: comm::chan) { @@ -160,7 +160,7 @@ type surface_set = { } }; -fn lend_surface(surfaces: surface_set, recvr: comm::chan) { +fn lend_surface(surfaces: surface_set, recvr: pipes::chan) { // We are in a position to lend out the surface? assert surfaces.s1.have; // Ok then take it