gfx: De-Cairo layers

This commit is contained in:
Patrick Walton 2012-11-08 16:32:50 -08:00
parent 3cbb257ef9
commit aa8de5041b
3 changed files with 26 additions and 34 deletions

View file

@ -4,10 +4,6 @@ use dom::event::Event;
use geom::rect::Rect;
struct LayerBuffer {
// TODO: We should not be coupled to Cairo this tightly. Instead we should pull the buffer out
// of the draw target with the Azure API.
cairo_surface: ImageSurface,
draw_target: DrawTarget,
// The rect in the containing RenderLayer that this represents.

View file

@ -2,9 +2,7 @@ use gfx::display_list::DisplayList;
use gfx::compositor::{LayerBuffer, LayerBufferSet};
use azure::AzFloat;
use azure::azure_hl::DrawTarget;
use cairo::CAIRO_FORMAT_RGB24;
use cairo::cairo_hl::ImageSurface;
use azure::azure_hl::{B8G8R8A8, CairoBackend, DrawTarget};
use core::libc::c_int;
use geom::matrix2d::Matrix2D;
use geom::point::Point2D;
@ -61,14 +59,9 @@ pub fn render_layers(layer: &RenderLayer,
} else {
// Create a new buffer.
debug!("creating tile, (%u, %u)", x, y);
let cairo_surface = ImageSurface(
CAIRO_FORMAT_RGB24, stride as c_int, height as c_int);
let draw_target = DrawTarget(&cairo_surface);
let size = Size2D(stride as i32, height as i32);
buffer = LayerBuffer {
cairo_surface: move cairo_surface,
draw_target: move draw_target,
draw_target: DrawTarget::new(CairoBackend, size, B8G8R8A8),
rect: tile_rect,
stride: stride
};

View file

@ -1,6 +1,6 @@
use ShareGlContext = sharegl::platform::Context;
use azure::azure_hl;
use azure::azure_hl::DrawTarget;
use azure::azure_hl::{B8G8R8A8, CairoBackend, DataSourceSurface, DrawTarget, SourceSurfaceMethods};
use cairo::cairo_hl::ImageSurface;
use cairo::cairo_surface_t;
use core::util::replace;
@ -57,17 +57,25 @@ fn OSMain(dom_event_chan: pipes::SharedChan<Event>) -> OSMain {
}
}
/// Cairo surface wrapping to work with layers
struct CairoSurfaceImageData {
cairo_surface: ImageSurface,
/// Azure surface wrapping to work with the layers infrastructure.
struct AzureDrawTargetImageData {
draw_target: DrawTarget,
data_source_surface: DataSourceSurface,
size: Size2D<uint>
}
impl CairoSurfaceImageData : layers::layers::ImageData {
impl AzureDrawTargetImageData : layers::layers::ImageData {
fn size() -> Size2D<uint> { self.size }
fn stride() -> uint { self.cairo_surface.width() as uint }
fn format() -> layers::layers::Format { layers::layers::ARGB32Format }
fn with_data(f: layers::layers::WithDataFn) { f(self.cairo_surface.data()) }
fn stride() -> uint { self.data_source_surface.get_size().width as uint }
fn format() -> layers::layers::Format {
// FIXME: This is not always correct. We should query the Azure draw target for the format.
layers::layers::ARGB32Format
}
fn with_data(f: layers::layers::WithDataFn) {
do self.data_source_surface.with_data |data| {
f(data);
}
}
}
fn mainloop(mode: Mode, po: comm::Port<Msg>, dom_event_chan: pipes::SharedChan<Event>) {
@ -121,9 +129,9 @@ fn mainloop(mode: Mode, po: comm::Port<Msg>, dom_event_chan: pipes::SharedChan<E
match po.recv() {
AddKeyHandler(move key_ch) => key_handlers.push(move key_ch),
BeginDrawing(move sender) => lend_surface(surfaces, move sender),
Draw(move sender, move dt) => {
Draw(move sender, move draw_target) => {
#debug("osmain: received new frame");
return_surface(surfaces, move dt);
return_surface(surfaces, move draw_target);
lend_surface(surfaces, move sender);
// Iterate over the children of the container layer.
@ -135,12 +143,11 @@ fn mainloop(mode: Mode, po: comm::Port<Msg>, dom_event_chan: pipes::SharedChan<E
let width = buffer.rect.size.width as uint;
let height = buffer.rect.size.height as uint;
debug!("osmain: compositing buffer rect %?, cairo surface %?",
&buffer.rect,
&buffer.cairo_surface);
debug!("osmain: compositing buffer rect %?", &buffer.rect);
let image_data = @CairoSurfaceImageData {
cairo_surface: buffer.cairo_surface.clone(),
let image_data = @AzureDrawTargetImageData {
draw_target: buffer.draw_target.clone(),
data_source_surface: buffer.draw_target.snapshot().get_data_surface(),
size: Size2D(width, height)
};
let image = @layers::layers::Image::new(
@ -266,7 +273,6 @@ fn lend_surface(surfaces: &SurfaceSet, receiver: pipes::Chan<LayerBufferSet>) {
let new_layer_buffers = do old_layer_buffers.map |layer_buffer| {
let draw_target_ref = &layer_buffer.draw_target;
let layer_buffer = LayerBuffer {
cairo_surface: layer_buffer.cairo_surface.clone(),
draw_target: draw_target_ref.clone(),
rect: copy layer_buffer.rect,
stride: layer_buffer.stride
@ -308,11 +314,8 @@ struct Surface {
}
fn Surface() -> Surface {
let cairo_surface = ImageSurface(cairo::CAIRO_FORMAT_RGB24, 800, 600);
let draw_target = DrawTarget(&cairo_surface);
let layer_buffer = LayerBuffer {
cairo_surface: move cairo_surface,
draw_target: move draw_target,
draw_target: DrawTarget::new(CairoBackend, Size2D(800i32, 600i32), B8G8R8A8),
rect: Rect(Point2D(0u, 0u), Size2D(800u, 600u)),
stride: 800
};