diff --git a/src/servo/gfx/png_compositor.rs b/src/servo/gfx/png_compositor.rs index 903af4dd486..7ae22518895 100644 --- a/src/servo/gfx/png_compositor.rs +++ b/src/servo/gfx/png_compositor.rs @@ -55,7 +55,11 @@ pub fn PngCompositor(output: Chan<~[u8]>) -> PngCompositor { do spawn_listener |po: Port| { let cairo_surface = ImageSurface(CAIRO_FORMAT_ARGB32, 800, 600); let draw_target = DrawTarget(&cairo_surface); - let layer_buffer = LayerBuffer { draw_target: move draw_target, size: Size2D(800u, 600u) }; + let layer_buffer = LayerBuffer { + cairo_surface: cairo_surface.clone(), + draw_target: move draw_target, + size: Size2D(800u, 600u) + }; let layer_buffer = Cell(move layer_buffer); loop { diff --git a/src/servo/gfx/render_layers.rs b/src/servo/gfx/render_layers.rs index 7e2cc12abc7..6dc319f9386 100644 --- a/src/servo/gfx/render_layers.rs +++ b/src/servo/gfx/render_layers.rs @@ -27,7 +27,11 @@ pub fn render_layers(layer: &RenderLayer, layer.size.width as c_int, layer.size.height as c_int); let draw_target = DrawTarget(&cairo_surface); - buffer = LayerBuffer { draw_target: move draw_target, size: copy layer.size }; + buffer = LayerBuffer { + cairo_surface: move cairo_surface, + draw_target: move draw_target, + size: copy layer.size + }; } let _ = f(layer, &buffer); diff --git a/src/servo/gfx/render_task.rs b/src/servo/gfx/render_task.rs index 1b6e78f2b03..20b7c85eb36 100644 --- a/src/servo/gfx/render_task.rs +++ b/src/servo/gfx/render_task.rs @@ -4,6 +4,7 @@ use au = gfx::geometry; use au::au; use azure::bindgen::AzDrawTargetFillGlyphs; use azure::cairo::{cairo_font_face_t, cairo_scaled_font_t}; +use azure::cairo_hl::ImageSurface; use azure::{AzDrawOptions, AzFloat, AzGlyph, AzGlyphBuffer}; use azure_hl::{AsAzureRect, B8G8R8A8, Color, ColorPattern, DrawOptions, DrawSurfaceOptions}; use azure_hl::{DrawTarget, Linear}; @@ -35,6 +36,10 @@ pub enum Msg { } 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, size: Size2D } diff --git a/src/servo/platform/osmain.rs b/src/servo/platform/osmain.rs index a70d5a98ea7..669dadc7978 100644 --- a/src/servo/platform/osmain.rs +++ b/src/servo/platform/osmain.rs @@ -105,7 +105,7 @@ fn mainloop(mode: Mode, po: comm::Port) { return_surface(surfaces, dt); lend_surface(surfaces, sender); - let buffer = surfaces.front.cairo_surface.data(); + let buffer = surfaces.front.layer_buffer.cairo_surface.data(); let image = @layers::layers::Image(800, 600, layers::layers::ARGB32Format, buffer); image_layer.set_image(image); @@ -186,6 +186,7 @@ fn lend_surface(surfaces: &SurfaceSet, receiver: pipes::Chan) { // Ok then take it let draw_target_ref = &mut surfaces.front.layer_buffer.draw_target; let layer_buffer = LayerBuffer { + cairo_surface: surfaces.front.layer_buffer.cairo_surface.clone(), draw_target: azure_hl::clone_mutable_draw_target(draw_target_ref), size: copy surfaces.front.layer_buffer.size }; @@ -218,7 +219,6 @@ fn SurfaceSet() -> SurfaceSet { } struct Surface { - cairo_surface: ImageSurface, layer_buffer: LayerBuffer, mut have: bool, } @@ -226,8 +226,12 @@ 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 { draw_target: move draw_target, size: Size2D(800u, 600u) }; - Surface { cairo_surface: cairo_surface, layer_buffer: move layer_buffer, have: true } + let layer_buffer = LayerBuffer { + cairo_surface: move cairo_surface, + draw_target: move draw_target, + size: Size2D(800u, 600u) + }; + Surface { layer_buffer: move layer_buffer, have: true } } /// A function for spawning into the platform's main thread