diff options
Diffstat (limited to 'components/canvas/canvas_paint_task.rs')
-rw-r--r-- | components/canvas/canvas_paint_task.rs | 131 |
1 files changed, 54 insertions, 77 deletions
diff --git a/components/canvas/canvas_paint_task.rs b/components/canvas/canvas_paint_task.rs index f45c4d79c14..bbce09cea23 100644 --- a/components/canvas/canvas_paint_task.rs +++ b/components/canvas/canvas_paint_task.rs @@ -6,6 +6,7 @@ use azure::azure::AzFloat; use azure::azure_hl::{DrawTarget, SurfaceFormat, BackendType, StrokeOptions, DrawOptions, Pattern}; use azure::azure_hl::{ColorPattern, PathBuilder, JoinStyle, CapStyle, DrawSurfaceOptions, Filter}; use azure::azure_hl::{GradientStop, LinearGradientPattern, RadialGradientPattern, ExtendMode}; +use canvas_msg::{CanvasMsg, Canvas2dMsg, CanvasCommonMsg}; use geom::matrix2d::Matrix2D; use geom::point::Point2D; use geom::rect::Rect; @@ -20,40 +21,6 @@ use std::mem; use std::num::{Float, ToPrimitive}; use std::sync::mpsc::{channel, Sender}; -#[derive(Clone)] -pub enum CanvasMsg { - SaveContext, - RestoreContext, - FillRect(Rect<f32>), - ClearRect(Rect<f32>), - StrokeRect(Rect<f32>), - BeginPath, - ClosePath, - Fill, - Stroke, - DrawImage(Vec<u8>, Size2D<f64>, Rect<f64>, Rect<f64>, bool), - DrawImageSelf(Size2D<f64>, Rect<f64>, Rect<f64>, bool), - MoveTo(Point2D<f32>), - LineTo(Point2D<f32>), - QuadraticCurveTo(Point2D<f32>, Point2D<f32>), - BezierCurveTo(Point2D<f32>, Point2D<f32>, Point2D<f32>), - Arc(Point2D<f32>, f32, f32, f32, bool), - ArcTo(Point2D<f32>, Point2D<f32>, f32), - SetFillStyle(FillOrStrokeStyle), - SetStrokeStyle(FillOrStrokeStyle), - SetLineWidth(f32), - SetLineCap(LineCapStyle), - SetLineJoin(LineJoinStyle), - SetMiterLimit(f32), - SetTransform(Matrix2D<f32>), - SetGlobalAlpha(f32), - Recreate(Size2D<i32>), - SendPixelContents(Sender<Vec<u8>>), - GetImageData(Rect<f64>, Size2D<f64>, Sender<Vec<u8>>), - PutImageData(Vec<u8>, Rect<f64>, Option<Rect<f64>>), - Close, -} - impl<'a> CanvasPaintTask<'a> { /// It reads image data from the canvas /// canvas_size: The size of the canvas we're reading from @@ -236,49 +203,59 @@ impl<'a> CanvasPaintTask<'a> { loop { match port.recv().unwrap() { - CanvasMsg::SaveContext => painter.save_context_state(), - CanvasMsg::RestoreContext => painter.restore_context_state(), - CanvasMsg::FillRect(ref rect) => painter.fill_rect(rect), - CanvasMsg::StrokeRect(ref rect) => painter.stroke_rect(rect), - CanvasMsg::ClearRect(ref rect) => painter.clear_rect(rect), - CanvasMsg::BeginPath => painter.begin_path(), - CanvasMsg::ClosePath => painter.close_path(), - CanvasMsg::Fill => painter.fill(), - CanvasMsg::Stroke => painter.stroke(), - CanvasMsg::DrawImage(imagedata, image_size, dest_rect, source_rect, smoothing_enabled) => { - painter.draw_image(imagedata, image_size, dest_rect, source_rect, smoothing_enabled) - } - CanvasMsg::DrawImageSelf(image_size, dest_rect, source_rect, smoothing_enabled) => { - painter.draw_image_self(image_size, dest_rect, source_rect, smoothing_enabled) - } - CanvasMsg::MoveTo(ref point) => painter.move_to(point), - CanvasMsg::LineTo(ref point) => painter.line_to(point), - CanvasMsg::QuadraticCurveTo(ref cp, ref pt) => { - painter.quadratic_curve_to(cp, pt) - } - CanvasMsg::BezierCurveTo(ref cp1, ref cp2, ref pt) => { - painter.bezier_curve_to(cp1, cp2, pt) - } - CanvasMsg::Arc(ref center, radius, start, end, ccw) => { - painter.arc(center, radius, start, end, ccw) - } - CanvasMsg::ArcTo(ref cp1, ref cp2, radius) => { - painter.arc_to(cp1, cp2, radius) - } - CanvasMsg::SetFillStyle(style) => painter.set_fill_style(style), - CanvasMsg::SetStrokeStyle(style) => painter.set_stroke_style(style), - CanvasMsg::SetLineWidth(width) => painter.set_line_width(width), - CanvasMsg::SetLineCap(cap) => painter.set_line_cap(cap), - CanvasMsg::SetLineJoin(join) => painter.set_line_join(join), - CanvasMsg::SetMiterLimit(limit) => painter.set_miter_limit(limit), - CanvasMsg::SetTransform(ref matrix) => painter.set_transform(matrix), - CanvasMsg::SetGlobalAlpha(alpha) => painter.set_global_alpha(alpha), - CanvasMsg::Recreate(size) => painter.recreate(size), - CanvasMsg::SendPixelContents(chan) => painter.send_pixel_contents(chan), - CanvasMsg::GetImageData(dest_rect, canvas_size, chan) => painter.get_image_data(dest_rect, canvas_size, chan), - CanvasMsg::PutImageData(imagedata, image_data_rect, dirty_rect) - => painter.put_image_data(imagedata, image_data_rect, dirty_rect), - CanvasMsg::Close => break, + CanvasMsg::Canvas2d(message) => { + match message { + Canvas2dMsg::FillRect(ref rect) => painter.fill_rect(rect), + Canvas2dMsg::StrokeRect(ref rect) => painter.stroke_rect(rect), + Canvas2dMsg::ClearRect(ref rect) => painter.clear_rect(rect), + Canvas2dMsg::BeginPath => painter.begin_path(), + Canvas2dMsg::ClosePath => painter.close_path(), + Canvas2dMsg::Fill => painter.fill(), + Canvas2dMsg::Stroke => painter.stroke(), + Canvas2dMsg::DrawImage(imagedata, image_size, dest_rect, source_rect, smoothing_enabled) => { + painter.draw_image(imagedata, image_size, dest_rect, source_rect, smoothing_enabled) + } + Canvas2dMsg::DrawImageSelf(image_size, dest_rect, source_rect, smoothing_enabled) => { + painter.draw_image_self(image_size, dest_rect, source_rect, smoothing_enabled) + } + Canvas2dMsg::MoveTo(ref point) => painter.move_to(point), + Canvas2dMsg::LineTo(ref point) => painter.line_to(point), + Canvas2dMsg::QuadraticCurveTo(ref cp, ref pt) => { + painter.quadratic_curve_to(cp, pt) + } + Canvas2dMsg::BezierCurveTo(ref cp1, ref cp2, ref pt) => { + painter.bezier_curve_to(cp1, cp2, pt) + } + Canvas2dMsg::Arc(ref center, radius, start, end, ccw) => { + painter.arc(center, radius, start, end, ccw) + } + Canvas2dMsg::ArcTo(ref cp1, ref cp2, radius) => { + painter.arc_to(cp1, cp2, radius) + } + Canvas2dMsg::RestoreContext => painter.restore_context_state(), + Canvas2dMsg::SaveContext => painter.save_context_state(), + Canvas2dMsg::SetFillStyle(style) => painter.set_fill_style(style), + Canvas2dMsg::SetStrokeStyle(style) => painter.set_stroke_style(style), + Canvas2dMsg::SetLineWidth(width) => painter.set_line_width(width), + Canvas2dMsg::SetLineCap(cap) => painter.set_line_cap(cap), + Canvas2dMsg::SetLineJoin(join) => painter.set_line_join(join), + Canvas2dMsg::SetMiterLimit(limit) => painter.set_miter_limit(limit), + Canvas2dMsg::SetTransform(ref matrix) => painter.set_transform(matrix), + Canvas2dMsg::SetGlobalAlpha(alpha) => painter.set_global_alpha(alpha), + Canvas2dMsg::GetImageData(dest_rect, canvas_size, chan) => painter.get_image_data(dest_rect, canvas_size, chan), + Canvas2dMsg::PutImageData(imagedata, image_data_rect, dirty_rect) + => painter.put_image_data(imagedata, image_data_rect, dirty_rect), + } + }, + CanvasMsg::Common(message) => { + match message { + CanvasCommonMsg::Close => break, + CanvasCommonMsg::Recreate(size) => painter.recreate(size), + CanvasCommonMsg::SendPixelContents(chan) => + painter.send_pixel_contents(chan), + } + }, + CanvasMsg::WebGL(_) => panic!("Wrong message sent to Canvas2D task"), } } }); |