platform: Create an image layer for each buffer

This commit is contained in:
Patrick Walton 2012-10-25 17:08:57 -07:00
parent 38fb01b43f
commit 9135fbdd4a

View file

@ -97,9 +97,11 @@ fn mainloop(mode: Mode, po: comm::Port<Msg>, dom_event_chan: pipes::SharedChan<E
let image_data = @layers::layers::BasicImageData::new( let image_data = @layers::layers::BasicImageData::new(
Size2D(0u, 0u), 0, layers::layers::RGB24Format, ~[]); Size2D(0u, 0u), 0, layers::layers::RGB24Format, ~[]);
let image = @layers::layers::Image::new(image_data as @layers::layers::ImageData); let image = @layers::layers::Image::new(image_data as @layers::layers::ImageData);
let layers = @dvec::DVec();
let image_layer = @layers::layers::ImageLayer(image); let image_layer = @layers::layers::ImageLayer(image);
let original_layer_transform = image_layer.common.transform; let original_layer_transform = image_layer.common.transform;
image_layer.common.set_transform(original_layer_transform.scale(&800.0f32, &600.0f32, &1f32)); image_layer.common.set_transform(original_layer_transform.scale(&800.0f32, &600.0f32, &1f32));
layers.push(image_layer);
let scene = @layers::scene::Scene(layers::layers::ImageLayerKind(image_layer), let scene = @layers::scene::Scene(layers::layers::ImageLayerKind(image_layer),
Size2D(800.0f32, 600.0f32), Size2D(800.0f32, 600.0f32),
@ -123,20 +125,36 @@ fn mainloop(mode: Mode, po: comm::Port<Msg>, dom_event_chan: pipes::SharedChan<E
return_surface(surfaces, move dt); return_surface(surfaces, move dt);
lend_surface(surfaces, move sender); lend_surface(surfaces, move sender);
let buffers = &mut surfaces.front.layer_buffer_set.buffers; // Replace the image layer data with the buffer data.
let width = buffers[0].rect.size.width as uint; let buffers = replace(&mut surfaces.front.layer_buffer_set.buffers, ~[]);
let height = buffers[0].rect.size.height as uint; for buffers.eachi |i, buffer| {
let width = buffer.rect.size.width as uint;
let height = buffer.rect.size.height as uint;
let image_data = @CairoSurfaceImageData { let image_data = @CairoSurfaceImageData {
cairo_surface: buffers[0].cairo_surface.clone(), cairo_surface: buffers[0].cairo_surface.clone(),
size: Size2D(width, height) size: Size2D(width, height)
}; };
let image = @layers::layers::Image::new( let image = @layers::layers::Image::new(
image_data as @layers::layers::ImageData); image_data as @layers::layers::ImageData);
image_layer.set_image(image); // Find or create an image layer.
image_layer.common.set_transform(original_layer_transform.scale( let image_layer;
&(width as f32), &(height as f32), &1.0f32)); if i < layers.len() {
image_layer = layers[i];
image_layer.set_image(image);
} else {
image_layer = @layers::layers::ImageLayer(image);
}
// Set the layer's transform.
let x = buffer.rect.origin.x as f32;
let y = buffer.rect.origin.y as f32;
image_layer.common.set_transform(
original_layer_transform.translate(&x, &y, &0.0f32)
.scale(&(width as f32), &(height as f32), &1.0f32));
}
surfaces.front.layer_buffer_set.buffers = move buffers;
} }
Exit => { Exit => {
*done = true; *done = true;