diff options
-rw-r--r-- | components/canvas/canvas_data.rs | 17 | ||||
-rw-r--r-- | components/canvas_traits/canvas.rs | 4 | ||||
-rw-r--r-- | components/script/dom/canvasrenderingcontext2d.rs | 6 | ||||
-rw-r--r-- | components/script/dom/htmlcanvaselement.rs | 7 | ||||
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 10 |
5 files changed, 21 insertions, 23 deletions
diff --git a/components/canvas/canvas_data.rs b/components/canvas/canvas_data.rs index 11bd15935a0..2c8418d38af 100644 --- a/components/canvas/canvas_data.rs +++ b/components/canvas/canvas_data.rs @@ -13,9 +13,8 @@ use azure::azure_hl::{ExtendMode, GradientStop, LinearGradientPattern, RadialGra use canvas_traits::canvas::*; use cssparser::RGBA; use euclid::{Point2D, Rect, Size2D, Transform2D, Vector2D}; -use ipc_channel::ipc::IpcSender; +use ipc_channel::ipc::{IpcSender, IpcSharedMemory}; use num_traits::ToPrimitive; -use serde_bytes::ByteBuf; use std::mem; use std::sync::Arc; @@ -451,15 +450,11 @@ impl<'a> CanvasData<'a> { } #[allow(unsafe_code)] - pub fn send_pixels(&mut self, chan: IpcSender<Option<ByteBuf>>) { - let data = unsafe { - self.drawtarget - .snapshot() - .get_data_surface() - .data() - .to_vec() - }; - chan.send(Some(data.into())).unwrap(); + pub fn send_pixels(&mut self, chan: IpcSender<IpcSharedMemory>) { + let data = IpcSharedMemory::from_bytes(unsafe { + self.drawtarget.snapshot().get_data_surface().data() + }); + chan.send(data).unwrap(); } #[allow(unsafe_code)] diff --git a/components/canvas_traits/canvas.rs b/components/canvas_traits/canvas.rs index b29bbec8769..49f4690f015 100644 --- a/components/canvas_traits/canvas.rs +++ b/components/canvas_traits/canvas.rs @@ -4,7 +4,7 @@ use cssparser::RGBA; use euclid::{Point2D, Rect, Size2D, Transform2D}; -use ipc_channel::ipc::{IpcBytesReceiver, IpcBytesSender, IpcSender}; +use ipc_channel::ipc::{IpcBytesReceiver, IpcBytesSender, IpcSender, IpcSharedMemory}; use serde_bytes::ByteBuf; use std::default::Default; use std::str::FromStr; @@ -87,7 +87,7 @@ pub enum FromLayoutMsg { #[derive(Clone, Debug, Deserialize, Serialize)] pub enum FromScriptMsg { - SendPixels(IpcSender<Option<ByteBuf>>), + SendPixels(IpcSender<IpcSharedMemory>), } #[derive(Clone, Debug, Deserialize, MallocSizeOf, Serialize)] diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index 4840966dfb4..a50cce88870 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -1296,7 +1296,11 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { .ok_or(Error::InvalidState)? }, CanvasImageSource::HTMLCanvasElement(ref canvas) => { - canvas.fetch_all_data().ok_or(Error::InvalidState)? + let (data, size) = canvas.fetch_all_data().ok_or(Error::InvalidState)?; + let data = data + .map(|data| data.to_vec()) + .unwrap_or_else(|| vec![0; size.area() as usize * 4]); + (data, size) }, CanvasImageSource::CSSStyleValue(ref value) => value .get_url(self.base_url.clone()) diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 850f15bdc9e..1dbb0806728 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -36,6 +36,7 @@ use euclid::{Rect, Size2D}; use html5ever::{LocalName, Prefix}; use image::png::PNGEncoder; use image::ColorType; +use ipc_channel::ipc::IpcSharedMemory; use js::error::throw_type_error; use js::jsapi::JSContext; use js::rust::HandleValue; @@ -280,7 +281,7 @@ impl HTMLCanvasElement { self.Height() != 0 && self.Width() != 0 } - pub fn fetch_all_data(&self) -> Option<(Vec<u8>, Size2D<u32>)> { + pub fn fetch_all_data(&self) -> Option<(Option<IpcSharedMemory>, Size2D<u32>)> { let size = self.get_size(); if size.width == 0 || size.height == 0 { @@ -297,7 +298,7 @@ impl HTMLCanvasElement { ); context.get_ipc_renderer().send(msg).unwrap(); - receiver.recv().unwrap()?.into() + Some(receiver.recv().unwrap()) }, Some(&CanvasContext::WebGL(_)) => { // TODO: add a method in WebGLRenderingContext to get the pixels. @@ -307,7 +308,7 @@ impl HTMLCanvasElement { // TODO: add a method in WebGL2RenderingContext to get the pixels. return None; }, - None => vec![0; size.height as usize * size.width as usize * 4], + None => None, }; Some((data, size)) diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 07ab777e631..c7896b42436 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -569,12 +569,10 @@ impl WebGLRenderingContext { return Err(Error::Security); } if let Some((data, size)) = canvas.fetch_all_data() { - TexPixels::new( - IpcSharedMemory::from_bytes(&data), - size, - PixelFormat::BGRA8, - true, - ) + let data = data.unwrap_or_else(|| { + IpcSharedMemory::from_bytes(&vec![0; size.area() as usize * 4]) + }); + TexPixels::new(data, size, PixelFormat::BGRA8, true) } else { return Ok(None); } |