aboutsummaryrefslogtreecommitdiffstats
path: root/components/canvas/canvas_data.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/canvas/canvas_data.rs')
-rw-r--r--components/canvas/canvas_data.rs100
1 files changed, 44 insertions, 56 deletions
diff --git a/components/canvas/canvas_data.rs b/components/canvas/canvas_data.rs
index 492a8da150a..b1768fe8744 100644
--- a/components/canvas/canvas_data.rs
+++ b/components/canvas/canvas_data.rs
@@ -85,21 +85,6 @@ impl<'a> CanvasData<'a> {
}
}
- pub fn draw_image_self(
- &self,
- image_size: Size2D<f64>,
- dest_rect: Rect<f64>,
- source_rect: Rect<f64>,
- smoothing_enabled: bool
- ) {
- // Reads pixels from source image
- // In this case source and target are the same canvas
- let image_data = self.read_pixels(source_rect.to_i32(), image_size);
-
- // The dimensions of image_data are source_rect.size
- self.draw_image(image_data, source_rect.size, dest_rect, source_rect, smoothing_enabled);
- }
-
pub fn save_context_state(&mut self) {
self.saved_states.push(self.state.clone());
}
@@ -405,51 +390,52 @@ impl<'a> CanvasData<'a> {
}
}
+ #[allow(unsafe_code)]
pub fn send_pixels(&mut self, chan: IpcSender<Option<ByteBuf>>) {
- self.drawtarget.snapshot().get_data_surface().with_data(|element| {
- chan.send(Some(Vec::from(element).into())).unwrap();
- })
+ let data = unsafe { self.drawtarget.snapshot().get_data_surface().data().to_vec() };
+ chan.send(Some(data.into())).unwrap();
}
+ #[allow(unsafe_code)]
pub fn send_data(&mut self, chan: IpcSender<CanvasImageData>) {
- self.drawtarget.snapshot().get_data_surface().with_data(|element| {
- let size = self.drawtarget.get_size();
-
- let descriptor = webrender_api::ImageDescriptor {
- size: webrender_api::DeviceUintSize::new(size.width as u32, size.height as u32),
- stride: None,
- format: webrender_api::ImageFormat::BGRA8,
- offset: 0,
- is_opaque: false,
- allow_mipmaps: false,
- };
- let data = webrender_api::ImageData::Raw(Arc::new(element.into()));
-
- let mut txn = webrender_api::Transaction::new();
-
- match self.image_key {
- Some(image_key) => {
- debug!("Updating image {:?}.", image_key);
- txn.update_image(image_key, descriptor, data, None);
- }
- None => {
- self.image_key = Some(self.webrender_api.generate_image_key());
- debug!("New image {:?}.", self.image_key);
- txn.add_image(self.image_key.unwrap(), descriptor, data, None);
- }
- }
+ let size = self.drawtarget.get_size();
+
+ let descriptor = webrender_api::ImageDescriptor {
+ size: webrender_api::DeviceUintSize::new(size.width as u32, size.height as u32),
+ stride: None,
+ format: webrender_api::ImageFormat::BGRA8,
+ offset: 0,
+ is_opaque: false,
+ allow_mipmaps: false,
+ };
+ let data = webrender_api::ImageData::Raw(Arc::new(
+ unsafe { self.drawtarget.snapshot().get_data_surface().data().into() },
+ ));
- if let Some(image_key) = mem::replace(&mut self.very_old_image_key, self.old_image_key.take()) {
- txn.delete_image(image_key);
+ let mut txn = webrender_api::Transaction::new();
+
+ match self.image_key {
+ Some(image_key) => {
+ debug!("Updating image {:?}.", image_key);
+ txn.update_image(image_key, descriptor, data, None);
+ }
+ None => {
+ self.image_key = Some(self.webrender_api.generate_image_key());
+ debug!("New image {:?}.", self.image_key);
+ txn.add_image(self.image_key.unwrap(), descriptor, data, None);
}
+ }
- self.webrender_api.update_resources(txn.resource_updates);
+ if let Some(image_key) = mem::replace(&mut self.very_old_image_key, self.old_image_key.take()) {
+ txn.delete_image(image_key);
+ }
- let data = CanvasImageData {
- image_key: self.image_key.unwrap(),
- };
- chan.send(data).unwrap();
- })
+ self.webrender_api.update_resources(txn.resource_updates);
+
+ let data = CanvasImageData {
+ image_key: self.image_key.unwrap(),
+ };
+ chan.send(data).unwrap();
}
pub fn image_data(
@@ -606,23 +592,25 @@ impl<'a> CanvasData<'a> {
/// It reads image data from the canvas
/// canvas_size: The size of the canvas we're reading from
/// read_rect: The area of the canvas we want to read from
+ #[allow(unsafe_code)]
pub fn read_pixels(&self, read_rect: Rect<i32>, canvas_size: Size2D<f64>) -> Vec<u8> {
let canvas_size = canvas_size.to_i32();
let canvas_rect = Rect::new(Point2D::new(0i32, 0i32), canvas_size);
let src_read_rect = canvas_rect.intersection(&read_rect).unwrap_or(Rect::zero());
- let mut image_data = vec![];
if src_read_rect.is_empty() || canvas_size.width <= 0 && canvas_size.height <= 0 {
- return image_data;
+ return vec![];
}
let data_surface = self.drawtarget.snapshot().get_data_surface();
- let mut src_data = Vec::new();
- data_surface.with_data(|element| { src_data = element.to_vec(); });
+ let src_data = unsafe { data_surface.data() };
let stride = data_surface.stride();
//start offset of the copyable rectangle
let mut src = (src_read_rect.origin.y * stride + src_read_rect.origin.x * 4) as usize;
+ let mut image_data = Vec::with_capacity(
+ (src_read_rect.size.width * src_read_rect.size.height * 4) as usize,
+ );
//copy the data to the destination vector
for _ in 0..src_read_rect.size.height {
let row = &src_data[src .. src + (4 * src_read_rect.size.width) as usize];