aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/canvasrenderingcontext2d.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/canvasrenderingcontext2d.rs')
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs240
1 files changed, 147 insertions, 93 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs
index 7ac2fac20d3..5c89b58f276 100644
--- a/components/script/dom/canvasrenderingcontext2d.rs
+++ b/components/script/dom/canvasrenderingcontext2d.rs
@@ -27,7 +27,8 @@ use geom::point::Point2D;
use geom::rect::Rect;
use geom::size::Size2D;
-use canvas::canvas_paint_task::{CanvasMsg, CanvasPaintTask, FillOrStrokeStyle};
+use canvas::canvas_msg::{CanvasMsg, Canvas2dMsg, CanvasCommonMsg};
+use canvas::canvas_paint_task::{CanvasPaintTask, FillOrStrokeStyle};
use canvas::canvas_paint_task::{LinearGradientStyle, RadialGradientStyle};
use canvas::canvas_paint_task::{LineCapStyle, LineJoinStyle};
@@ -36,7 +37,7 @@ use net_traits::image_cache_task::{ImageResponseMsg, Msg};
use png::PixelsByColorType;
use std::borrow::ToOwned;
-use std::cell::Cell;
+use std::cell::RefCell;
use std::num::{Float, ToPrimitive};
use std::sync::{Arc};
use std::sync::mpsc::{channel, Sender};
@@ -52,40 +53,56 @@ pub struct CanvasRenderingContext2D {
global: GlobalField,
renderer: Sender<CanvasMsg>,
canvas: JS<HTMLCanvasElement>,
- global_alpha: Cell<f64>,
- image_smoothing_enabled: Cell<bool>,
- stroke_color: Cell<RGBA>,
- line_width: Cell<f64>,
- line_cap: Cell<LineCapStyle>,
- line_join: Cell<LineJoinStyle>,
- miter_limit: Cell<f64>,
- fill_color: Cell<RGBA>,
- transform: Cell<Matrix2D<f32>>,
+ state: RefCell<CanvasContextState>,
+ saved_states: RefCell<Vec<CanvasContextState>>,
}
-impl CanvasRenderingContext2D {
- fn new_inherited(global: GlobalRef, canvas: JSRef<HTMLCanvasElement>, size: Size2D<i32>)
- -> CanvasRenderingContext2D {
+#[derive(Clone)]
+#[jstraceable]
+struct CanvasContextState {
+ global_alpha: f64,
+ image_smoothing_enabled: bool,
+ stroke_color: RGBA,
+ line_width: f64,
+ line_cap: LineCapStyle,
+ line_join: LineJoinStyle,
+ miter_limit: f64,
+ fill_color: RGBA,
+ transform: Matrix2D<f32>,
+}
+
+impl CanvasContextState {
+ fn new() -> CanvasContextState {
let black = RGBA {
red: 0.0,
green: 0.0,
blue: 0.0,
alpha: 1.0,
};
+ CanvasContextState {
+ global_alpha: 1.0,
+ image_smoothing_enabled: true,
+ stroke_color: black,
+ line_width: 1.0,
+ line_cap: LineCapStyle::Butt,
+ line_join: LineJoinStyle::Miter,
+ miter_limit: 10.0,
+ fill_color: black,
+ transform: Matrix2D::identity(),
+ }
+ }
+}
+
+impl CanvasRenderingContext2D {
+ fn new_inherited(global: GlobalRef, canvas: JSRef<HTMLCanvasElement>, size: Size2D<i32>)
+ -> CanvasRenderingContext2D {
CanvasRenderingContext2D {
reflector_: Reflector::new(),
global: GlobalField::from_rooted(&global),
renderer: CanvasPaintTask::start(size),
canvas: JS::from_rooted(canvas),
- global_alpha: Cell::new(1.0),
- image_smoothing_enabled: Cell::new(true),
- stroke_color: Cell::new(black),
- line_width: Cell::new(1.0),
- line_cap: Cell::new(LineCapStyle::Butt),
- line_join: Cell::new(LineJoinStyle::Miter),
- miter_limit: Cell::new(10.0),
- fill_color: Cell::new(black),
- transform: Cell::new(Matrix2D::identity()),
+ state: RefCell::new(CanvasContextState::new()),
+ saved_states: RefCell::new(Vec::new()),
}
}
@@ -96,11 +113,11 @@ impl CanvasRenderingContext2D {
}
pub fn recreate(&self, size: Size2D<i32>) {
- self.renderer.send(CanvasMsg::Recreate(size)).unwrap();
+ self.renderer.send(CanvasMsg::Common(CanvasCommonMsg::Recreate(size))).unwrap();
}
fn update_transform(&self) {
- self.renderer.send(CanvasMsg::SetTransform(self.transform.get())).unwrap()
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetTransform(self.state.borrow().transform))).unwrap()
}
// It is used by DrawImage to calculate the size of the source and destination rectangles based
@@ -184,20 +201,20 @@ impl CanvasRenderingContext2D {
return Err(IndexSize)
}
- let smoothing_enabled = self.image_smoothing_enabled.get();
+ let smoothing_enabled = self.state.borrow().image_smoothing_enabled;
// If the source and target canvas are the same
let msg = if self.canvas.root().r() == canvas {
- CanvasMsg::DrawImageSelf(image_size, dest_rect, source_rect, smoothing_enabled)
+ CanvasMsg::Canvas2d(Canvas2dMsg::DrawImageSelf(image_size, dest_rect, source_rect, smoothing_enabled))
} else { // Source and target canvases are different
let context = canvas.get_2d_context().root();
let renderer = context.r().get_renderer();
let (sender, receiver) = channel::<Vec<u8>>();
// Reads pixels from source image
- renderer.send(CanvasMsg::GetImageData(source_rect, image_size, sender)).unwrap();
+ renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(source_rect, image_size, sender))).unwrap();
let imagedata = receiver.recv().unwrap();
// Writes pixels to destination canvas
- CanvasMsg::DrawImage(imagedata, source_rect.size, dest_rect, source_rect, smoothing_enabled)
+ CanvasMsg::Canvas2d(Canvas2dMsg::DrawImage(imagedata, source_rect.size, dest_rect, source_rect, smoothing_enabled))
};
self.renderer.send(msg).unwrap();
@@ -216,10 +233,10 @@ impl CanvasRenderingContext2D {
return Err(IndexSize)
}
- let smoothing_enabled = self.image_smoothing_enabled.get();
- self.renderer.send(CanvasMsg::DrawImage(
+ let smoothing_enabled = self.state.borrow().image_smoothing_enabled;
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::DrawImage(
image_data, image_size, dest_rect,
- source_rect, smoothing_enabled)).unwrap();
+ source_rect, smoothing_enabled))).unwrap();
Ok(())
}
@@ -318,13 +335,29 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
Temporary::new(self.canvas)
}
+ // https://html.spec.whatwg.org/multipage/#dom-context-2d-save
+ fn Save(self) {
+ self.saved_states.borrow_mut().push(self.state.borrow().clone());
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SaveContext)).unwrap();
+ }
+
+ // https://html.spec.whatwg.org/multipage/#dom-context-2d-restore
+ fn Restore(self) {
+ let mut saved_states = self.saved_states.borrow_mut();
+ if let Some(state) = saved_states.pop() {
+ self.state.borrow_mut().clone_from(&state);
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::RestoreContext)).unwrap();
+ }
+ }
+
// https://html.spec.whatwg.org/multipage/#dom-context-2d-scale
fn Scale(self, x: f64, y: f64) {
if !(x.is_finite() && y.is_finite()) {
return;
}
- self.transform.set(self.transform.get().scale(x as f32, y as f32));
+ let transform = self.state.borrow().transform;
+ self.state.borrow_mut().transform = transform.scale(x as f32, y as f32);
self.update_transform()
}
@@ -334,7 +367,8 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
return;
}
- self.transform.set(self.transform.get().translate(x as f32, y as f32));
+ let transform = self.state.borrow().transform;
+ self.state.borrow_mut().transform = transform.translate(x as f32, y as f32);
self.update_transform()
}
@@ -345,12 +379,13 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
return;
}
- self.transform.set(self.transform.get().mul(&Matrix2D::new(a as f32,
- b as f32,
- c as f32,
- d as f32,
- e as f32,
- f as f32)));
+ let transform = self.state.borrow().transform;
+ self.state.borrow_mut().transform = transform.mul(&Matrix2D::new(a as f32,
+ b as f32,
+ c as f32,
+ d as f32,
+ e as f32,
+ f as f32));
self.update_transform()
}
@@ -361,18 +396,19 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
return;
}
- self.transform.set(Matrix2D::new(a as f32,
- b as f32,
- c as f32,
- d as f32,
- e as f32,
- f as f32));
+ self.state.borrow_mut().transform = Matrix2D::new(a as f32,
+ b as f32,
+ c as f32,
+ d as f32,
+ e as f32,
+ f as f32);
self.update_transform()
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-globalalpha
fn GlobalAlpha(self) -> f64 {
- self.global_alpha.get()
+ let state = self.state.borrow();
+ state.global_alpha
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-globalalpha
@@ -381,49 +417,49 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
return;
}
- self.global_alpha.set(alpha);
- self.renderer.send(CanvasMsg::SetGlobalAlpha(alpha as f32)).unwrap()
+ self.state.borrow_mut().global_alpha = alpha;
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetGlobalAlpha(alpha as f32))).unwrap()
}
// 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.renderer.send(CanvasMsg::FillRect(rect)).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::FillRect(rect))).unwrap();
}
}
// 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.renderer.send(CanvasMsg::ClearRect(rect)).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::ClearRect(rect))).unwrap();
}
}
// 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.renderer.send(CanvasMsg::StrokeRect(rect)).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::StrokeRect(rect))).unwrap();
}
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-beginpath
fn BeginPath(self) {
- self.renderer.send(CanvasMsg::BeginPath).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::BeginPath)).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-closepath
fn ClosePath(self) {
- self.renderer.send(CanvasMsg::ClosePath).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::ClosePath)).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-fill
fn Fill(self, _: CanvasWindingRule) {
- self.renderer.send(CanvasMsg::Fill).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Fill)).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-stroke
fn Stroke(self) {
- self.renderer.send(CanvasMsg::Stroke).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Stroke)).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-drawimage
@@ -592,7 +628,7 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
return;
}
- self.renderer.send(CanvasMsg::MoveTo(Point2D(x as f32, y as f32))).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::MoveTo(Point2D(x as f32, y as f32)))).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-lineto
@@ -601,7 +637,16 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
return;
}
- self.renderer.send(CanvasMsg::LineTo(Point2D(x as f32, y as f32))).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::LineTo(Point2D(x as f32, y as f32)))).unwrap();
+ }
+
+ // https://html.spec.whatwg.org/multipage/#dom-context-2d-rect
+ fn Rect(self, x: f64, y: f64, width: f64, height: f64) {
+ if [x, y, width, height].iter().all(|val| val.is_finite()) {
+ let rect = Rect(Point2D(x as f32, y as f32),
+ Size2D(width as f32, height as f32));
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Rect(rect))).unwrap();
+ }
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-quadraticcurveto
@@ -611,8 +656,8 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
return;
}
- self.renderer.send(CanvasMsg::QuadraticCurveTo(Point2D(cpx as f32, cpy as f32),
- Point2D(x as f32, y as f32))).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::QuadraticCurveTo(Point2D(cpx as f32, cpy as f32),
+ Point2D(x as f32, y as f32)))).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-beziercurveto
@@ -622,9 +667,9 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
return;
}
- self.renderer.send(CanvasMsg::BezierCurveTo(Point2D(cp1x as f32, cp1y as f32),
- Point2D(cp2x as f32, cp2y as f32),
- Point2D(x as f32, y as f32))).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::BezierCurveTo(Point2D(cp1x as f32, cp1y as f32),
+ Point2D(cp2x as f32, cp2y as f32),
+ Point2D(x as f32, y as f32)))).unwrap();
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-arc
@@ -640,8 +685,8 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
return Err(IndexSize);
}
- self.renderer.send(CanvasMsg::Arc(Point2D(x as f32, y as f32), r as f32,
- start as f32, end as f32, ccw)).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Arc(Point2D(x as f32, y as f32), r as f32,
+ start as f32, end as f32, ccw))).unwrap();
Ok(())
}
@@ -653,20 +698,21 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
if r < 0.0 {
return Err(IndexSize);
}
- self.renderer.send(CanvasMsg::ArcTo(Point2D(cp1x as f32, cp1y as f32),
- Point2D(cp2x as f32, cp2y as f32),
- r as f32)).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::ArcTo(Point2D(cp1x as f32, cp1y as f32),
+ Point2D(cp2x as f32, cp2y as f32),
+ r as f32))).unwrap();
Ok(())
}
// https://html.spec.whatwg.org/#dom-context-2d-imagesmoothingenabled
fn ImageSmoothingEnabled(self) -> bool {
- self.image_smoothing_enabled.get()
+ let state = self.state.borrow();
+ state.image_smoothing_enabled
}
// https://html.spec.whatwg.org/#dom-context-2d-imagesmoothingenabled
fn SetImageSmoothingEnabled(self, value: bool) -> () {
- self.image_smoothing_enabled.set(value);
+ self.state.borrow_mut().image_smoothing_enabled = value;
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokestyle
@@ -675,7 +721,7 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
//
// https://html.spec.whatwg.org/multipage/#serialisation-of-a-colour
let mut result = String::new();
- self.stroke_color.get().to_css(&mut result).unwrap();
+ self.state.borrow().stroke_color.to_css(&mut result).unwrap();
StringOrCanvasGradientOrCanvasPattern::eString(result)
}
@@ -685,9 +731,9 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
StringOrCanvasGradientOrCanvasPattern::eString(string) => {
match parse_color(&string) {
Ok(rgba) => {
- self.stroke_color.set(rgba);
+ self.state.borrow_mut().stroke_color = rgba;
self.renderer
- .send(CanvasMsg::SetStrokeStyle(FillOrStrokeStyle::Color(rgba)))
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::SetStrokeStyle(FillOrStrokeStyle::Color(rgba))))
.unwrap();
}
_ => {}
@@ -705,7 +751,7 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
//
// https://html.spec.whatwg.org/multipage/#serialisation-of-a-colour
let mut result = String::new();
- self.stroke_color.get().to_css(&mut result).unwrap();
+ self.state.borrow().stroke_color.to_css(&mut result).unwrap();
StringOrCanvasGradientOrCanvasPattern::eString(result)
}
@@ -715,16 +761,16 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
StringOrCanvasGradientOrCanvasPattern::eString(string) => {
match parse_color(&string) {
Ok(rgba) => {
- self.fill_color.set(rgba);
+ self.state.borrow_mut().fill_color = rgba;
self.renderer
- .send(CanvasMsg::SetFillStyle(FillOrStrokeStyle::Color(rgba)))
+ .send(CanvasMsg::Canvas2d(Canvas2dMsg::SetFillStyle(FillOrStrokeStyle::Color(rgba))))
.unwrap()
}
_ => {}
}
}
StringOrCanvasGradientOrCanvasPattern::eCanvasGradient(gradient) => {
- self.renderer.send(CanvasMsg::SetFillStyle(gradient.root().r().to_fill_or_stroke_style())).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetFillStyle(gradient.root().r().to_fill_or_stroke_style()))).unwrap();
}
_ => {}
}
@@ -763,7 +809,7 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
let dest_rect = Rect(Point2D(sx as f64, sy as f64), Size2D(sw as f64, sh as f64));
let canvas_size = self.canvas.root().r().get_size();
let canvas_size = Size2D(canvas_size.width as f64, canvas_size.height as f64);
- self.renderer.send(CanvasMsg::GetImageData(dest_rect, canvas_size, sender)).unwrap();
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(dest_rect, canvas_size, sender))).unwrap();
let data = receiver.recv().unwrap();
Ok(ImageData::new(self.global.root().r(), sw.abs().to_u32().unwrap(), sh.abs().to_u32().unwrap(), Some(data)))
}
@@ -784,7 +830,7 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
let image_data_size = Size2D(image_data_size.width as f64, image_data_size.height as f64);
let image_data_rect = Rect(Point2D(dx, dy), image_data_size);
let dirty_rect = None;
- self.renderer.send(CanvasMsg::PutImageData(data, image_data_rect, dirty_rect)).unwrap()
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::PutImageData(data, image_data_rect, dirty_rect))).unwrap()
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata
@@ -809,7 +855,7 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
imagedata.Height() as f64));
let dirty_rect = Some(Rect(Point2D(dirtyX, dirtyY),
Size2D(dirtyWidth, dirtyHeight)));
- self.renderer.send(CanvasMsg::PutImageData(data, image_data_rect, dirty_rect)).unwrap()
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::PutImageData(data, image_data_rect, dirty_rect))).unwrap()
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-createlineargradient
@@ -846,7 +892,8 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
// https://html.spec.whatwg.org/multipage/#dom-context-2d-linewidth
fn LineWidth(self) -> f64 {
- self.line_width.get()
+ let state = self.state.borrow();
+ state.line_width
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-linewidth
@@ -855,43 +902,50 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
return;
}
- self.line_width.set(width);
- self.renderer.send(CanvasMsg::SetLineWidth(width as f32)).unwrap()
+ self.state.borrow_mut().line_width = width;
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetLineWidth(width as f32))).unwrap()
}
+ // https://html.spec.whatwg.org/multipage/#dom-context-2d-linecap
fn LineCap(self) -> DOMString {
- match self.line_cap.get() {
+ let state = self.state.borrow();
+ match state.line_cap {
LineCapStyle::Butt => "butt".to_owned(),
LineCapStyle::Round => "round".to_owned(),
LineCapStyle::Square => "square".to_owned(),
}
}
+ // https://html.spec.whatwg.org/multipage/#dom-context-2d-linecap
fn SetLineCap(self, cap_str: DOMString) {
if let Some(cap) = LineCapStyle::from_str(&cap_str) {
- self.line_cap.set(cap);
- self.renderer.send(CanvasMsg::SetLineCap(cap)).unwrap()
+ self.state.borrow_mut().line_cap = cap;
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetLineCap(cap))).unwrap()
}
}
+ // https://html.spec.whatwg.org/multipage/#dom-context-2d-linejoin
fn LineJoin(self) -> DOMString {
- match self.line_join.get() {
+ let state = self.state.borrow();
+ match state.line_join {
LineJoinStyle::Round => "round".to_owned(),
LineJoinStyle::Bevel => "bevel".to_owned(),
LineJoinStyle::Miter => "miter".to_owned(),
}
}
+ // https://html.spec.whatwg.org/multipage/#dom-context-2d-linejoin
fn SetLineJoin(self, join_str: DOMString) {
if let Some(join) = LineJoinStyle::from_str(&join_str) {
- self.line_join.set(join);
- self.renderer.send(CanvasMsg::SetLineJoin(join)).unwrap()
+ self.state.borrow_mut().line_join = join;
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetLineJoin(join))).unwrap()
}
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-miterlimit
fn MiterLimit(self) -> f64 {
- self.miter_limit.get()
+ let state = self.state.borrow();
+ state.miter_limit
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-miterlimit
@@ -900,15 +954,15 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
return;
}
- self.miter_limit.set(limit);
- self.renderer.send(CanvasMsg::SetMiterLimit(limit as f32)).unwrap()
+ self.state.borrow_mut().miter_limit = limit;
+ self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetMiterLimit(limit as f32))).unwrap()
}
}
#[unsafe_destructor]
impl Drop for CanvasRenderingContext2D {
fn drop(&mut self) {
- self.renderer.send(CanvasMsg::Close).unwrap();
+ self.renderer.send(CanvasMsg::Common(CanvasCommonMsg::Close)).unwrap();
}
}