mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
Add unique canvas IDs to all canvas operations.
This commit is contained in:
parent
a69eceefc9
commit
8a1590efc6
13 changed files with 334 additions and 155 deletions
|
@ -2,7 +2,7 @@
|
|||
* 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_traits::canvas::{Canvas2dMsg, CanvasMsg};
|
||||
use canvas_traits::canvas::{Canvas2dMsg, CanvasMsg, CanvasId};
|
||||
use canvas_traits::canvas::{CompositionOrBlending, FillOrStrokeStyle, FillRule};
|
||||
use canvas_traits::canvas::{LineCapStyle, LineJoinStyle, LinearGradientStyle};
|
||||
use canvas_traits::canvas::{RadialGradientStyle, RepetitionStyle, byte_swap_and_premultiply};
|
||||
|
@ -78,6 +78,7 @@ pub struct CanvasRenderingContext2D {
|
|||
state: DomRefCell<CanvasContextState>,
|
||||
saved_states: DomRefCell<Vec<CanvasContextState>>,
|
||||
origin_clean: Cell<bool>,
|
||||
canvas_id: CanvasId,
|
||||
}
|
||||
|
||||
#[must_root]
|
||||
|
@ -133,7 +134,7 @@ impl CanvasRenderingContext2D {
|
|||
let script_to_constellation_chan = global.script_to_constellation_chan();
|
||||
debug!("Asking constellation to create new canvas thread.");
|
||||
script_to_constellation_chan.send(ScriptMsg::CreateCanvasPaintThread(size, sender)).unwrap();
|
||||
let ipc_renderer = receiver.recv().unwrap();
|
||||
let (ipc_renderer, canvas_id) = receiver.recv().unwrap();
|
||||
debug!("Done.");
|
||||
CanvasRenderingContext2D {
|
||||
reflector_: Reflector::new(),
|
||||
|
@ -145,6 +146,7 @@ impl CanvasRenderingContext2D {
|
|||
state: DomRefCell::new(CanvasContextState::new()),
|
||||
saved_states: DomRefCell::new(Vec::new()),
|
||||
origin_clean: Cell::new(true),
|
||||
canvas_id: canvas_id,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -165,7 +167,7 @@ impl CanvasRenderingContext2D {
|
|||
pub fn set_bitmap_dimensions(&self, size: Size2D<i32>) {
|
||||
self.reset_to_initial_state();
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Recreate(size))
|
||||
.send(CanvasMsg::Recreate(size, self.get_canvas_id()))
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
|
@ -182,9 +184,7 @@ impl CanvasRenderingContext2D {
|
|||
}
|
||||
|
||||
fn update_transform(&self) {
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetTransform(self.state.borrow().transform)))
|
||||
.unwrap()
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetTransform(self.state.borrow().transform))
|
||||
}
|
||||
|
||||
// It is used by DrawImage to calculate the size of the source and destination rectangles based
|
||||
|
@ -363,9 +363,8 @@ impl CanvasRenderingContext2D {
|
|||
let smoothing_enabled = self.state.borrow().image_smoothing_enabled;
|
||||
|
||||
if self.canvas.as_ref().map_or(false, |c| &**c == canvas) {
|
||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::DrawImageSelf(
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::DrawImageSelf(
|
||||
image_size, dest_rect, source_rect, smoothing_enabled));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
} else {
|
||||
let context = match canvas.get_or_init_2d_context() {
|
||||
Some(context) => context,
|
||||
|
@ -375,11 +374,13 @@ impl CanvasRenderingContext2D {
|
|||
let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap();
|
||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::DrawImageInOther(
|
||||
self.ipc_renderer.clone(),
|
||||
self.get_canvas_id(),
|
||||
image_size,
|
||||
dest_rect,
|
||||
source_rect,
|
||||
smoothing_enabled,
|
||||
sender));
|
||||
sender),
|
||||
context.get_canvas_id());
|
||||
|
||||
let renderer = context.get_ipc_renderer();
|
||||
renderer.send(msg).unwrap();
|
||||
|
@ -453,13 +454,13 @@ impl CanvasRenderingContext2D {
|
|||
}
|
||||
|
||||
let smoothing_enabled = self.state.borrow().image_smoothing_enabled;
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::DrawImage(
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::DrawImage(
|
||||
image_data.into(),
|
||||
image_size,
|
||||
dest_rect,
|
||||
source_rect,
|
||||
smoothing_enabled,
|
||||
))).unwrap();
|
||||
));
|
||||
self.mark_as_dirty();
|
||||
Ok(())
|
||||
}
|
||||
|
@ -557,6 +558,14 @@ impl CanvasRenderingContext2D {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn get_canvas_id(&self) -> CanvasId {
|
||||
self.canvas_id.clone()
|
||||
}
|
||||
|
||||
pub fn send_canvas_2d_msg(&self, msg: Canvas2dMsg) {
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(msg, self.get_canvas_id())).unwrap()
|
||||
}
|
||||
|
||||
pub fn get_ipc_renderer(&self) -> IpcSender<CanvasMsg> {
|
||||
self.ipc_renderer.clone()
|
||||
}
|
||||
|
@ -573,6 +582,8 @@ impl CanvasRenderingContext2D {
|
|||
pub trait LayoutCanvasRenderingContext2DHelpers {
|
||||
#[allow(unsafe_code)]
|
||||
unsafe fn get_ipc_renderer(&self) -> IpcSender<CanvasMsg>;
|
||||
#[allow(unsafe_code)]
|
||||
unsafe fn get_canvas_id(&self) -> CanvasId;
|
||||
}
|
||||
|
||||
impl LayoutCanvasRenderingContext2DHelpers for LayoutDom<CanvasRenderingContext2D> {
|
||||
|
@ -580,6 +591,11 @@ impl LayoutCanvasRenderingContext2DHelpers for LayoutDom<CanvasRenderingContext2
|
|||
unsafe fn get_ipc_renderer(&self) -> IpcSender<CanvasMsg> {
|
||||
(*self.unsafe_get()).ipc_renderer.clone()
|
||||
}
|
||||
|
||||
#[allow(unsafe_code)]
|
||||
unsafe fn get_canvas_id(&self) -> CanvasId {
|
||||
(*self.unsafe_get()).canvas_id.clone()
|
||||
}
|
||||
}
|
||||
|
||||
// We add a guard to each of methods by the spec:
|
||||
|
@ -602,7 +618,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-save
|
||||
fn Save(&self) {
|
||||
self.saved_states.borrow_mut().push(self.state.borrow().clone());
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SaveContext)).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SaveContext);
|
||||
}
|
||||
|
||||
#[allow(unrooted_must_root)]
|
||||
|
@ -611,7 +627,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
let mut saved_states = self.saved_states.borrow_mut();
|
||||
if let Some(state) = saved_states.pop() {
|
||||
self.state.borrow_mut().clone_from(&state);
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::RestoreContext)).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::RestoreContext);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -696,9 +712,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
}
|
||||
|
||||
self.state.borrow_mut().global_alpha = alpha;
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetGlobalAlpha(alpha as f32)))
|
||||
.unwrap()
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetGlobalAlpha(alpha as f32))
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-globalcompositeoperation
|
||||
|
@ -714,16 +728,14 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
fn SetGlobalCompositeOperation(&self, op_str: DOMString) {
|
||||
if let Ok(op) = CompositionOrBlending::from_str(&op_str) {
|
||||
self.state.borrow_mut().global_composition = op;
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetGlobalComposition(op)))
|
||||
.unwrap()
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetGlobalComposition(op))
|
||||
}
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-fillrect
|
||||
fn FillRect(&self, x: f64, y: f64, width: f64, height: f64) {
|
||||
if let Some(rect) = self.create_drawable_rect(x, y, width, height) {
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::FillRect(rect))).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::FillRect(rect));
|
||||
self.mark_as_dirty();
|
||||
}
|
||||
}
|
||||
|
@ -731,9 +743,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-clearrect
|
||||
fn ClearRect(&self, x: f64, y: f64, width: f64, height: f64) {
|
||||
if let Some(rect) = self.create_drawable_rect(x, y, width, height) {
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::ClearRect(rect)))
|
||||
.unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::ClearRect(rect));
|
||||
self.mark_as_dirty();
|
||||
}
|
||||
}
|
||||
|
@ -741,40 +751,38 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokerect
|
||||
fn StrokeRect(&self, x: f64, y: f64, width: f64, height: f64) {
|
||||
if let Some(rect) = self.create_drawable_rect(x, y, width, height) {
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::StrokeRect(rect)))
|
||||
.unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::StrokeRect(rect));
|
||||
self.mark_as_dirty();
|
||||
}
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-beginpath
|
||||
fn BeginPath(&self) {
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::BeginPath)).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::BeginPath);
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-closepath
|
||||
fn ClosePath(&self) {
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::ClosePath)).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::ClosePath);
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-fill
|
||||
fn Fill(&self, _: CanvasFillRule) {
|
||||
// TODO: Process fill rule
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Fill)).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::Fill);
|
||||
self.mark_as_dirty();
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-stroke
|
||||
fn Stroke(&self) {
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Stroke)).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::Stroke);
|
||||
self.mark_as_dirty();
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-clip
|
||||
fn Clip(&self, _: CanvasFillRule) {
|
||||
// TODO: Process fill rule
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Clip)).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::Clip);
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-ispointinpath
|
||||
|
@ -784,16 +792,14 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
CanvasFillRule::Evenodd => FillRule::Evenodd,
|
||||
};
|
||||
let (sender, receiver) = ipc::channel::<bool>(self.global().time_profiler_chan().clone()).unwrap();
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::IsPointInPath(x, y, fill_rule, sender)))
|
||||
.unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::IsPointInPath(x, y, fill_rule, sender));
|
||||
receiver.recv().unwrap()
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-filltext
|
||||
fn FillText(&self, text: DOMString, x: f64, y: f64, max_width: Option<f64>) {
|
||||
let parsed_text: String = text.into();
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::FillText(parsed_text, x, y, max_width))).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::FillText(parsed_text, x, y, max_width));
|
||||
self.mark_as_dirty();
|
||||
}
|
||||
|
||||
|
@ -858,9 +864,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
if !(x.is_finite() && y.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::MoveTo(Point2D::new(x as f32, y as f32)));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::MoveTo(Point2D::new(x as f32, y as f32)));
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-lineto
|
||||
|
@ -868,9 +872,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
if !(x.is_finite() && y.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::LineTo(Point2D::new(x as f32, y as f32)));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::LineTo(Point2D::new(x as f32, y as f32)));
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-rect
|
||||
|
@ -878,8 +880,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
if [x, y, width, height].iter().all(|val| val.is_finite()) {
|
||||
let rect = Rect::new(Point2D::new(x as f32, y as f32),
|
||||
Size2D::new(width as f32, height as f32));
|
||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::Rect(rect));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::Rect(rect));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -888,12 +889,10 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
if !(cpx.is_finite() && cpy.is_finite() && x.is_finite() && y.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::QuadraticCurveTo(Point2D::new(cpx as f32,
|
||||
cpy as f32),
|
||||
Point2D::new(x as f32,
|
||||
y as f32)));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::QuadraticCurveTo(Point2D::new(cpx as f32,
|
||||
cpy as f32),
|
||||
Point2D::new(x as f32,
|
||||
y as f32)));
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-beziercurveto
|
||||
|
@ -902,13 +901,11 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
x.is_finite() && y.is_finite()) {
|
||||
return;
|
||||
}
|
||||
|
||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::BezierCurveTo(Point2D::new(cp1x as f32,
|
||||
cp1y as f32),
|
||||
Point2D::new(cp2x as f32,
|
||||
cp2y as f32),
|
||||
Point2D::new(x as f32, y as f32)));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::BezierCurveTo(Point2D::new(cp1x as f32,
|
||||
cp1y as f32),
|
||||
Point2D::new(cp2x as f32,
|
||||
cp2y as f32),
|
||||
Point2D::new(x as f32, y as f32)));
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-arc
|
||||
|
@ -921,13 +918,11 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
return Err(Error::IndexSize);
|
||||
}
|
||||
|
||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::Arc(Point2D::new(x as f32, y as f32),
|
||||
r as f32,
|
||||
start as f32,
|
||||
end as f32,
|
||||
ccw));
|
||||
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::Arc(Point2D::new(x as f32, y as f32),
|
||||
r as f32,
|
||||
start as f32,
|
||||
end as f32,
|
||||
ccw));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -940,10 +935,9 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
return Err(Error::IndexSize);
|
||||
}
|
||||
|
||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::ArcTo(Point2D::new(cp1x as f32, cp1y as f32),
|
||||
Point2D::new(cp2x as f32, cp2y as f32),
|
||||
r as f32));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::ArcTo(Point2D::new(cp1x as f32, cp1y as f32),
|
||||
Point2D::new(cp2x as f32, cp2y as f32),
|
||||
r as f32));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -956,14 +950,13 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
return Err(Error::IndexSize);
|
||||
}
|
||||
|
||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::Ellipse(Point2D::new(x as f32, y as f32),
|
||||
rx as f32,
|
||||
ry as f32,
|
||||
rotation as f32,
|
||||
start as f32,
|
||||
end as f32,
|
||||
ccw));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::Ellipse(Point2D::new(x as f32, y as f32),
|
||||
rx as f32,
|
||||
ry as f32,
|
||||
rotation as f32,
|
||||
start as f32,
|
||||
end as f32,
|
||||
ccw));
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -1001,25 +994,19 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
StringOrCanvasGradientOrCanvasPattern::String(string) => {
|
||||
if let Ok(rgba) = self.parse_color(&string) {
|
||||
self.state.borrow_mut().stroke_style = CanvasFillOrStrokeStyle::Color(rgba);
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetStrokeStyle(
|
||||
FillOrStrokeStyle::Color(rgba))))
|
||||
.unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetStrokeStyle(
|
||||
FillOrStrokeStyle::Color(rgba)));
|
||||
}
|
||||
},
|
||||
StringOrCanvasGradientOrCanvasPattern::CanvasGradient(gradient) => {
|
||||
self.state.borrow_mut().stroke_style =
|
||||
CanvasFillOrStrokeStyle::Gradient(Dom::from_ref(&*gradient));
|
||||
let msg = CanvasMsg::Canvas2d(
|
||||
Canvas2dMsg::SetStrokeStyle(gradient.to_fill_or_stroke_style()));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetStrokeStyle(gradient.to_fill_or_stroke_style()));
|
||||
},
|
||||
StringOrCanvasGradientOrCanvasPattern::CanvasPattern(pattern) => {
|
||||
self.state.borrow_mut().stroke_style =
|
||||
CanvasFillOrStrokeStyle::Pattern(Dom::from_ref(&*pattern));
|
||||
let msg = CanvasMsg::Canvas2d(
|
||||
Canvas2dMsg::SetStrokeStyle(pattern.to_fill_or_stroke_style()));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetStrokeStyle(pattern.to_fill_or_stroke_style()));
|
||||
if !pattern.origin_is_clean() {
|
||||
self.set_origin_unclean();
|
||||
}
|
||||
|
@ -1050,25 +1037,19 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
StringOrCanvasGradientOrCanvasPattern::String(string) => {
|
||||
if let Ok(rgba) = self.parse_color(&string) {
|
||||
self.state.borrow_mut().fill_style = CanvasFillOrStrokeStyle::Color(rgba);
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetFillStyle(
|
||||
FillOrStrokeStyle::Color(rgba))))
|
||||
.unwrap()
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetFillStyle(
|
||||
FillOrStrokeStyle::Color(rgba)))
|
||||
}
|
||||
}
|
||||
StringOrCanvasGradientOrCanvasPattern::CanvasGradient(gradient) => {
|
||||
self.state.borrow_mut().fill_style =
|
||||
CanvasFillOrStrokeStyle::Gradient(Dom::from_ref(&*gradient));
|
||||
let msg = CanvasMsg::Canvas2d(
|
||||
Canvas2dMsg::SetFillStyle(gradient.to_fill_or_stroke_style()));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetFillStyle(gradient.to_fill_or_stroke_style()));
|
||||
}
|
||||
StringOrCanvasGradientOrCanvasPattern::CanvasPattern(pattern) => {
|
||||
self.state.borrow_mut().fill_style =
|
||||
CanvasFillOrStrokeStyle::Pattern(Dom::from_ref(&*pattern));
|
||||
let msg = CanvasMsg::Canvas2d(
|
||||
Canvas2dMsg::SetFillStyle(pattern.to_fill_or_stroke_style()));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetFillStyle(pattern.to_fill_or_stroke_style()));
|
||||
if !pattern.origin_is_clean() {
|
||||
self.set_origin_unclean();
|
||||
}
|
||||
|
@ -1132,10 +1113,8 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
Size2D::new(sw as i32, sh as i32));
|
||||
let canvas_size = self.canvas.as_ref().map(|c| c.get_size()).unwrap_or(Size2D::zero());
|
||||
let canvas_size = Size2D::new(canvas_size.width as f64, canvas_size.height as f64);
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(dest_rect, canvas_size, sender)))
|
||||
.unwrap();
|
||||
let mut data = Vec::from(receiver.recv().unwrap());
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::GetImageData(dest_rect, canvas_size, sender));
|
||||
let mut data = receiver.recv().unwrap();
|
||||
|
||||
// Un-premultiply alpha
|
||||
for chunk in data.chunks_mut(4) {
|
||||
|
@ -1145,7 +1124,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
chunk[2] = UNPREMULTIPLY_TABLE[256 * alpha + chunk[2] as usize];
|
||||
}
|
||||
|
||||
ImageData::new(&self.global(), sw, sh, Some(data))
|
||||
ImageData::new(&self.global(), sw, sh, Some(data.to_vec()))
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata
|
||||
|
@ -1174,13 +1153,10 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
|
||||
let dirty_rect = Rect::new(Point2D::new(*dirty_x, *dirty_y),
|
||||
Size2D::new(*dirty_width, *dirty_height));
|
||||
let msg = CanvasMsg::Canvas2d(Canvas2dMsg::PutImageData(
|
||||
data.into(),
|
||||
offset,
|
||||
image_data_size,
|
||||
dirty_rect,
|
||||
));
|
||||
self.ipc_renderer.send(msg).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::PutImageData(data.into(),
|
||||
offset,
|
||||
image_data_size,
|
||||
dirty_rect));
|
||||
self.mark_as_dirty();
|
||||
}
|
||||
|
||||
|
@ -1282,9 +1258,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
}
|
||||
|
||||
self.state.borrow_mut().line_width = width;
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetLineWidth(width as f32)))
|
||||
.unwrap()
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetLineWidth(width as f32))
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-linecap
|
||||
|
@ -1304,7 +1278,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
CanvasLineCap::Square => LineCapStyle::Square,
|
||||
};
|
||||
self.state.borrow_mut().line_cap = line_cap;
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetLineCap(line_cap))).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetLineCap(line_cap));
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-linejoin
|
||||
|
@ -1324,7 +1298,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
CanvasLineJoin::Miter => LineJoinStyle::Miter,
|
||||
};
|
||||
self.state.borrow_mut().line_join = line_join;
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetLineJoin(line_join))).unwrap();
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetLineJoin(line_join));
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-miterlimit
|
||||
|
@ -1340,9 +1314,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
}
|
||||
|
||||
self.state.borrow_mut().miter_limit = limit;
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetMiterLimit(limit as f32)))
|
||||
.unwrap()
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetMiterLimit(limit as f32))
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowoffsetx
|
||||
|
@ -1356,7 +1328,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
return;
|
||||
}
|
||||
self.state.borrow_mut().shadow_offset_x = value;
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowOffsetX(value))).unwrap()
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetShadowOffsetX(value))
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowoffsety
|
||||
|
@ -1370,7 +1342,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
return;
|
||||
}
|
||||
self.state.borrow_mut().shadow_offset_y = value;
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowOffsetY(value))).unwrap()
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetShadowOffsetY(value))
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowblur
|
||||
|
@ -1384,7 +1356,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
return;
|
||||
}
|
||||
self.state.borrow_mut().shadow_blur = value;
|
||||
self.ipc_renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowBlur(value))).unwrap()
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetShadowBlur(value))
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowcolor
|
||||
|
@ -1398,16 +1370,14 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D {
|
|||
fn SetShadowColor(&self, value: DOMString) {
|
||||
if let Ok(color) = parse_color(&value) {
|
||||
self.state.borrow_mut().shadow_color = color;
|
||||
self.ipc_renderer
|
||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowColor(color)))
|
||||
.unwrap()
|
||||
self.send_canvas_2d_msg(Canvas2dMsg::SetShadowColor(color))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for CanvasRenderingContext2D {
|
||||
fn drop(&mut self) {
|
||||
if let Err(err) = self.ipc_renderer.send(CanvasMsg::Close) {
|
||||
if let Err(err) = self.ipc_renderer.send(CanvasMsg::Close(self.get_canvas_id())) {
|
||||
warn!("Could not close canvas: {}", err)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue