aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/canvasrenderingcontext2d.rs
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2016-05-28 13:53:09 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2016-06-16 18:24:04 +0100
commitf8c3fe10762989658e2e424977474e05821bf442 (patch)
tree288e05d89c954231a1ccefcd5d268de26fb357d2 /components/script/dom/canvasrenderingcontext2d.rs
parent2086d216ddf2cf87f44dd2da44281daaf810e0a0 (diff)
downloadservo-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.rs37
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(())
}