gfx: Move Cairo surfaces into the layer buffers

This commit is contained in:
Patrick Walton 2012-10-11 18:30:33 -07:00
parent 7f53e96b4f
commit e270a48694
4 changed files with 23 additions and 6 deletions

View file

@ -55,7 +55,11 @@ pub fn PngCompositor(output: Chan<~[u8]>) -> PngCompositor {
do spawn_listener |po: Port<Msg>| {
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 {

View file

@ -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);

View file

@ -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<uint>
}

View file

@ -105,7 +105,7 @@ fn mainloop(mode: Mode, po: comm::Port<Msg>) {
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<LayerBuffer>) {
// 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