diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2016-05-28 13:53:09 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2016-06-16 18:24:04 +0100 |
commit | f8c3fe10762989658e2e424977474e05821bf442 (patch) | |
tree | 288e05d89c954231a1ccefcd5d268de26fb357d2 /components/script/dom/canvasrenderingcontext2d.rs | |
parent | 2086d216ddf2cf87f44dd2da44281daaf810e0a0 (diff) | |
download | servo-f8c3fe10762989658e2e424977474e05821bf442.tar.gz servo-f8c3fe10762989658e2e424977474e05821bf442.zip |
Make canvas send their data themselves to other canvas
Diffstat (limited to 'components/script/dom/canvasrenderingcontext2d.rs')
-rw-r--r-- | components/script/dom/canvasrenderingcontext2d.rs | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index cd3583edf4f..fc6afdc2b25 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -2,7 +2,6 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use canvas::canvas_paint_thread::RectToi32; use canvas_traits::{Canvas2dMsg, CanvasCommonMsg, CanvasMsg}; use canvas_traits::{CompositionOrBlending, LineCapStyle, LineJoinStyle}; use canvas_traits::{FillOrStrokeStyle, FillRule, LinearGradientStyle, RadialGradientStyle, RepetitionStyle}; @@ -363,36 +362,30 @@ impl CanvasRenderingContext2D { let smoothing_enabled = self.state.borrow().image_smoothing_enabled; - // If the source and target canvas are the same - let msg = if &*self.canvas == canvas { - CanvasMsg::Canvas2d(Canvas2dMsg::DrawImageSelf(image_size, - dest_rect, - source_rect, - smoothing_enabled)) + if &*self.canvas == canvas { + let msg = CanvasMsg::Canvas2d(Canvas2dMsg::DrawImageSelf( + image_size, dest_rect, source_rect, smoothing_enabled)); + self.ipc_renderer.send(msg).unwrap(); } else { - // Source and target canvases are different let context = match canvas.get_or_init_2d_context() { Some(context) => context, None => return Err(Error::InvalidState), }; + let (sender, receiver) = ipc::channel().unwrap(); + let msg = CanvasMsg::Canvas2d(Canvas2dMsg::DrawImageInOther( + self.ipc_renderer.clone(), + image_size, + dest_rect, + source_rect, + smoothing_enabled, + sender)); + let renderer = context.get_ipc_renderer(); - let (sender, receiver) = ipc::channel::<Vec<u8>>().unwrap(); - // Reads pixels from source image - renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(source_rect.to_i32(), - image_size, - sender))) - .unwrap(); - let imagedata = receiver.recv().unwrap(); - // Writes pixels to destination canvas - CanvasMsg::Canvas2d(Canvas2dMsg::DrawImage(imagedata, - source_rect.size, - dest_rect, - source_rect, - smoothing_enabled)) + renderer.send(msg).unwrap(); + receiver.recv().unwrap(); }; - self.ipc_renderer.send(msg).unwrap(); self.mark_as_dirty(); Ok(()) } |