gfx: Send a RenderLayer instead of a display list from layout to GFX.

This is a step on the way to window resizing.
This commit is contained in:
Patrick Walton 2012-10-11 18:03:52 -07:00
parent 5752ae6783
commit 0e9c278196
4 changed files with 16 additions and 12 deletions

View file

@ -5,9 +5,9 @@ use js::jsapi::{JSContext, jsval, JSObject, JSBool, jsid, JSClass, JSFreeOp, JSP
use js::jsapi::bindgen::{JS_ValueToString, JS_GetStringCharsZAndLength, JS_ReportError,
JS_GetReservedSlot, JS_SetReservedSlot, JS_NewStringCopyN,
JS_DefineFunctions, JS_DefineProperty, JS_GetContextPrivate};
use js::jsval::{INT_TO_JSVAL, JSVAL_TO_PRIVATE};
use js::jsapi::bindgen::*;
use js::glue::bindgen::*;
use js::jsval::{INT_TO_JSVAL, JSVAL_TO_PRIVATE};
use dom::node::{Node, NodeScope, Text, Doctype, Comment, Element};
use utils::{rust_box, squirrel_away_unique, get_compartment, domstring_to_jsval, str};

View file

@ -29,6 +29,7 @@ use std::cell::Cell;
use core::io::BytesWriter;
use gfx::render_task::LayerBuffer;
use geom::size::Size2D;
use gfx::render_layers::RenderLayer;
pub type PngCompositor = Chan<Msg>;
@ -92,6 +93,7 @@ fn sanity_check() {
let renderer = RenderTask(compositor);
let dlist : DisplayList = DVec();
let render_layer = RenderLayer { display_list: move dlist, size: Size2D(800u, 600u) };
renderer.send(RenderMsg(dlist));
let (exit_chan, exit_response_from_engine) = pipes::stream();
renderer.send(render_task::ExitMsg(exit_chan));

View file

@ -30,7 +30,7 @@ use text::font_cache::FontCache;
pub type Renderer = comm::Chan<Msg>;
pub enum Msg {
RenderMsg(dl::DisplayList),
RenderMsg(RenderLayer),
ExitMsg(pipes::Chan<()>)
}
@ -60,7 +60,7 @@ pub fn RenderTask<C: Compositor Send>(compositor: C) -> RenderTask {
loop {
match po.recv() {
RenderMsg(move display_list) => {
RenderMsg(move render_layer) => {
#debug("renderer: got render request");
let layer_buffer_cell = Cell(layer_buffer_port.recv());
@ -68,18 +68,13 @@ pub fn RenderTask<C: Compositor Send>(compositor: C) -> RenderTask {
let layer_buffer_channel = Cell(move layer_buffer_channel);
layer_buffer_port = new_layer_buffer_port;
let display_list = Cell(move display_list);
let render_layer = Cell(move render_layer);
#debug("renderer: rendering");
do util::time::time(~"rendering") {
let layer_buffer = layer_buffer_cell.take();
let display_list = move display_list.take();
let render_layer = RenderLayer {
display_list: move display_list,
size: Size2D(800u, 600u)
};
let render_layer = move render_layer.take();
let layer_buffer =
for render_layers::render_layers(&render_layer, move layer_buffer)

View file

@ -16,6 +16,7 @@ use geom::point::Point2D;
use geom::rect::Rect;
use geom::size::Size2D;
use gfx::render_task;
use gfx::render_layers::RenderLayer;
use layout::box::RenderBox;
use layout::box_builder::LayoutTreeBuilder;
use layout::context::LayoutContext;
@ -166,10 +167,16 @@ impl Layout {
let builder = dl::DisplayListBuilder {
ctx: &layout_ctx,
};
let render_layer = RenderLayer {
display_list: move dlist,
size: Size2D(800u, 600u)
};
// TODO: set options on the builder before building
// TODO: be smarter about what needs painting
layout_root.build_display_list(&builder, &copy layout_root.d().position, &dlist);
self.render_task.send(render_task::RenderMsg(dlist));
layout_root.build_display_list(&builder, &copy layout_root.d().position,
&render_layer.display_list);
self.render_task.send(render_task::RenderMsg(move render_layer));
} // time(layout)
} // BuildMsg
} // match