mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +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>| {
|
do spawn_listener |po: Port<Msg>| {
|
||||||
let cairo_surface = ImageSurface(CAIRO_FORMAT_ARGB32, 800, 600);
|
let cairo_surface = ImageSurface(CAIRO_FORMAT_ARGB32, 800, 600);
|
||||||
let draw_target = DrawTarget(&cairo_surface);
|
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);
|
let layer_buffer = Cell(move layer_buffer);
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
|
|
|
@ -27,7 +27,11 @@ pub fn render_layers(layer: &RenderLayer,
|
||||||
layer.size.width as c_int,
|
layer.size.width as c_int,
|
||||||
layer.size.height as c_int);
|
layer.size.height as c_int);
|
||||||
let draw_target = DrawTarget(&cairo_surface);
|
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);
|
let _ = f(layer, &buffer);
|
||||||
|
|
|
@ -4,6 +4,7 @@ use au = gfx::geometry;
|
||||||
use au::au;
|
use au::au;
|
||||||
use azure::bindgen::AzDrawTargetFillGlyphs;
|
use azure::bindgen::AzDrawTargetFillGlyphs;
|
||||||
use azure::cairo::{cairo_font_face_t, cairo_scaled_font_t};
|
use azure::cairo::{cairo_font_face_t, cairo_scaled_font_t};
|
||||||
|
use azure::cairo_hl::ImageSurface;
|
||||||
use azure::{AzDrawOptions, AzFloat, AzGlyph, AzGlyphBuffer};
|
use azure::{AzDrawOptions, AzFloat, AzGlyph, AzGlyphBuffer};
|
||||||
use azure_hl::{AsAzureRect, B8G8R8A8, Color, ColorPattern, DrawOptions, DrawSurfaceOptions};
|
use azure_hl::{AsAzureRect, B8G8R8A8, Color, ColorPattern, DrawOptions, DrawSurfaceOptions};
|
||||||
use azure_hl::{DrawTarget, Linear};
|
use azure_hl::{DrawTarget, Linear};
|
||||||
|
@ -35,6 +36,10 @@ pub enum Msg {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct LayerBuffer {
|
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,
|
draw_target: DrawTarget,
|
||||||
size: Size2D<uint>
|
size: Size2D<uint>
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,7 @@ fn mainloop(mode: Mode, po: comm::Port<Msg>) {
|
||||||
return_surface(surfaces, dt);
|
return_surface(surfaces, dt);
|
||||||
lend_surface(surfaces, sender);
|
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,
|
let image = @layers::layers::Image(800, 600, layers::layers::ARGB32Format,
|
||||||
buffer);
|
buffer);
|
||||||
image_layer.set_image(image);
|
image_layer.set_image(image);
|
||||||
|
@ -186,6 +186,7 @@ fn lend_surface(surfaces: &SurfaceSet, receiver: pipes::Chan<LayerBuffer>) {
|
||||||
// Ok then take it
|
// Ok then take it
|
||||||
let draw_target_ref = &mut surfaces.front.layer_buffer.draw_target;
|
let draw_target_ref = &mut surfaces.front.layer_buffer.draw_target;
|
||||||
let layer_buffer = LayerBuffer {
|
let layer_buffer = LayerBuffer {
|
||||||
|
cairo_surface: surfaces.front.layer_buffer.cairo_surface.clone(),
|
||||||
draw_target: azure_hl::clone_mutable_draw_target(draw_target_ref),
|
draw_target: azure_hl::clone_mutable_draw_target(draw_target_ref),
|
||||||
size: copy surfaces.front.layer_buffer.size
|
size: copy surfaces.front.layer_buffer.size
|
||||||
};
|
};
|
||||||
|
@ -218,7 +219,6 @@ fn SurfaceSet() -> SurfaceSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Surface {
|
struct Surface {
|
||||||
cairo_surface: ImageSurface,
|
|
||||||
layer_buffer: LayerBuffer,
|
layer_buffer: LayerBuffer,
|
||||||
mut have: bool,
|
mut have: bool,
|
||||||
}
|
}
|
||||||
|
@ -226,8 +226,12 @@ struct Surface {
|
||||||
fn Surface() -> Surface {
|
fn Surface() -> Surface {
|
||||||
let cairo_surface = ImageSurface(cairo::CAIRO_FORMAT_RGB24, 800, 600);
|
let cairo_surface = ImageSurface(cairo::CAIRO_FORMAT_RGB24, 800, 600);
|
||||||
let draw_target = DrawTarget(&cairo_surface);
|
let draw_target = DrawTarget(&cairo_surface);
|
||||||
let layer_buffer = LayerBuffer { draw_target: move draw_target, size: Size2D(800u, 600u) };
|
let layer_buffer = LayerBuffer {
|
||||||
Surface { cairo_surface: cairo_surface, layer_buffer: move layer_buffer, have: true }
|
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
|
/// A function for spawning into the platform's main thread
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue