aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/canvas/canvas_paint_thread.rs26
-rw-r--r--components/canvas_traits/lib.rs2
-rw-r--r--components/script/Cargo.toml1
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs37
-rw-r--r--components/script/lib.rs1
-rw-r--r--components/servo/Cargo.lock1
6 files changed, 43 insertions, 25 deletions
diff --git a/components/canvas/canvas_paint_thread.rs b/components/canvas/canvas_paint_thread.rs
index 6e15a5ab489..1faf41a9aed 100644
--- a/components/canvas/canvas_paint_thread.rs
+++ b/components/canvas/canvas_paint_thread.rs
@@ -148,6 +148,12 @@ impl<'a> CanvasPaintThread<'a> {
Canvas2dMsg::DrawImageSelf(image_size, dest_rect, source_rect, smoothing_enabled) => {
painter.draw_image_self(image_size, dest_rect, source_rect, smoothing_enabled)
}
+ Canvas2dMsg::DrawImageInOther(
+ renderer, image_size, dest_rect, source_rect, smoothing, sender
+ ) => {
+ painter.draw_image_in_other(
+ renderer, image_size, dest_rect, source_rect, smoothing, sender)
+ }
Canvas2dMsg::MoveTo(ref point) => painter.move_to(point),
Canvas2dMsg::LineTo(ref point) => painter.line_to(point),
Canvas2dMsg::Rect(ref rect) => painter.rect(rect),
@@ -371,6 +377,26 @@ impl<'a> CanvasPaintThread<'a> {
}
}
+ fn draw_image_in_other(&self,
+ renderer: IpcSender<CanvasMsg>,
+ image_size: Size2D<f64>,
+ dest_rect: Rect<f64>,
+ source_rect: Rect<f64>,
+ smoothing_enabled: bool,
+ sender: IpcSender<()>) {
+ let mut image_data = self.read_pixels(source_rect.to_i32(), image_size);
+ // TODO: avoid double byte_swap.
+ byte_swap(&mut image_data);
+
+ let msg = CanvasMsg::Canvas2d(Canvas2dMsg::DrawImage(
+ image_data, source_rect.size, dest_rect, source_rect, smoothing_enabled));
+ renderer.send(msg).unwrap();
+ // We acknowledge to the caller here that the data was sent to the
+ // other canvas so that if JS immediately afterwards try to get the
+ // pixels of the other one, it won't retrieve the other values.
+ sender.send(()).unwrap();
+ }
+
fn move_to(&self, point: &Point2D<AzFloat>) {
self.path_builder.move_to(*point)
}
diff --git a/components/canvas_traits/lib.rs b/components/canvas_traits/lib.rs
index 8bf7fa0fba9..98eaa159077 100644
--- a/components/canvas_traits/lib.rs
+++ b/components/canvas_traits/lib.rs
@@ -79,6 +79,8 @@ pub enum Canvas2dMsg {
ArcTo(Point2D<f32>, Point2D<f32>, f32),
DrawImage(Vec<u8>, Size2D<f64>, Rect<f64>, Rect<f64>, bool),
DrawImageSelf(Size2D<f64>, Rect<f64>, Rect<f64>, bool),
+ DrawImageInOther(
+ IpcSender<CanvasMsg>, Size2D<f64>, Rect<f64>, Rect<f64>, bool, IpcSender<()>),
BeginPath,
BezierCurveTo(Point2D<f32>, Point2D<f32>, Point2D<f32>),
ClearRect(Rect<f32>),
diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml
index 95f1044fd36..9aa39fc12af 100644
--- a/components/script/Cargo.toml
+++ b/components/script/Cargo.toml
@@ -20,7 +20,6 @@ tinyfiledialogs = {git = "https://github.com/jdm/tinyfiledialogs"}
angle = {git = "https://github.com/servo/angle", branch = "servo"}
app_units = {version = "0.2.3", features = ["plugins"]}
bitflags = "0.7"
-canvas = {path = "../canvas"}
canvas_traits = {path = "../canvas_traits"}
caseless = "0.1.0"
cssparser = {version = "0.5.4", features = ["heap_size", "serde-serialization"]}
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(())
}
diff --git a/components/script/lib.rs b/components/script/lib.rs
index 2f76a112c0a..267ab46aafb 100644
--- a/components/script/lib.rs
+++ b/components/script/lib.rs
@@ -34,7 +34,6 @@ extern crate app_units;
#[allow(unused_extern_crates)]
#[macro_use]
extern crate bitflags;
-extern crate canvas;
extern crate canvas_traits;
extern crate caseless;
extern crate core;
diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock
index c1c7463301b..b973dc19cbd 100644
--- a/components/servo/Cargo.lock
+++ b/components/servo/Cargo.lock
@@ -1874,7 +1874,6 @@ dependencies = [
"angle 0.1.0 (git+https://github.com/servo/angle?branch=servo)",
"app_units 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
- "canvas 0.0.1",
"canvas_traits 0.0.1",
"caseless 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"cssparser 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",