mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
gfx: Move Cairo surfaces into the layer buffers
This commit is contained in:
parent
7f53e96b4f
commit
e270a48694
4 changed files with 23 additions and 6 deletions
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue