aboutsummaryrefslogtreecommitdiffstats
path: root/components/canvas/canvas_paint_task.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/canvas/canvas_paint_task.rs')
-rw-r--r--components/canvas/canvas_paint_task.rs353
1 files changed, 14 insertions, 339 deletions
diff --git a/components/canvas/canvas_paint_task.rs b/components/canvas/canvas_paint_task.rs
index 6906b96aa5c..07860fe93cc 100644
--- a/components/canvas/canvas_paint_task.rs
+++ b/components/canvas/canvas_paint_task.rs
@@ -5,19 +5,18 @@
use azure::azure::AzFloat;
use azure::azure_hl::{DrawTarget, SurfaceFormat, BackendType, StrokeOptions, DrawOptions, Pattern};
use azure::azure_hl::{ColorPattern, PathBuilder, DrawSurfaceOptions, Filter};
-use azure::azure_hl::{GradientStop, LinearGradientPattern, RadialGradientPattern, ExtendMode};
-use azure::azure_hl::{JoinStyle, CapStyle, CompositionOp};
-use canvas_msg::{CanvasMsg, Canvas2dMsg, CanvasCommonMsg};
+use azure::azure_hl::{JoinStyle, CapStyle};
+use canvas_traits::*;
use geom::matrix2d::Matrix2D;
use geom::point::Point2D;
use geom::rect::Rect;
use geom::size::Size2D;
-use gfx::color;
+use layers::platform::surface::NativeSurface;
+use gfx_traits::color;
use num::ToPrimitive;
use util::task::spawn_named;
use util::vec::byte_swap;
-use cssparser::RGBA;
use std::borrow::ToOwned;
use std::mem;
use std::sync::mpsc::{channel, Sender};
@@ -257,6 +256,8 @@ impl<'a> CanvasPaintTask<'a> {
CanvasCommonMsg::Recreate(size) => painter.recreate(size),
CanvasCommonMsg::SendPixelContents(chan) =>
painter.send_pixel_contents(chan),
+ CanvasCommonMsg::SendNativeSurface(chan) =>
+ painter.send_native_surface(chan),
}
},
CanvasMsg::WebGL(_) => panic!("Wrong message sent to Canvas2D task"),
@@ -497,6 +498,14 @@ impl<'a> CanvasPaintTask<'a> {
})
}
+ fn send_native_surface(&self, chan: Sender<NativeSurface>) {
+ let mut native_surface: NativeSurface =
+ NativeSurface::from_draw_target_backing(self.drawtarget.backing.clone());
+ native_surface.mark_wont_leak();
+
+ chan.send(native_surface).unwrap();
+ }
+
fn get_image_data(&self, mut dest_rect: Rect<f64>, canvas_size: Size2D<f64>, chan: Sender<Vec<u8>>) {
if dest_rect.size.width < 0.0 {
dest_rect.size.width = -dest_rect.size.width;
@@ -566,340 +575,6 @@ impl<'a> CanvasPaintTask<'a> {
}
}
-#[derive(Clone)]
-pub struct CanvasGradientStop {
- pub offset: f64,
- pub color: RGBA,
-}
-
-#[derive(Clone)]
-pub struct LinearGradientStyle {
- pub x0: f64,
- pub y0: f64,
- pub x1: f64,
- pub y1: f64,
- pub stops: Vec<CanvasGradientStop>
-}
-
-impl LinearGradientStyle {
- pub fn new(x0: f64, y0: f64, x1: f64, y1: f64, stops: Vec<CanvasGradientStop>)
- -> LinearGradientStyle {
- LinearGradientStyle {
- x0: x0,
- y0: y0,
- x1: x1,
- y1: y1,
- stops: stops,
- }
- }
-}
-
-#[derive(Clone)]
-pub struct RadialGradientStyle {
- pub x0: f64,
- pub y0: f64,
- pub r0: f64,
- pub x1: f64,
- pub y1: f64,
- pub r1: f64,
- pub stops: Vec<CanvasGradientStop>
-}
-
-impl RadialGradientStyle {
- pub fn new(x0: f64, y0: f64, r0: f64, x1: f64, y1: f64, r1: f64, stops: Vec<CanvasGradientStop>)
- -> RadialGradientStyle {
- RadialGradientStyle {
- x0: x0,
- y0: y0,
- r0: r0,
- x1: x1,
- y1: y1,
- r1: r1,
- stops: stops,
- }
- }
-}
-
-#[derive(Clone)]
-pub enum FillOrStrokeStyle {
- Color(RGBA),
- LinearGradient(LinearGradientStyle),
- RadialGradient(RadialGradientStyle),
-}
-
-impl FillOrStrokeStyle {
- fn to_azure_pattern(&self, drawtarget: &DrawTarget) -> Pattern {
- match *self {
- FillOrStrokeStyle::Color(ref color) => {
- Pattern::Color(ColorPattern::new(color::new(color.red,
- color.green,
- color.blue,
- color.alpha)))
- },
- FillOrStrokeStyle::LinearGradient(ref linear_gradient_style) => {
- let gradient_stops: Vec<GradientStop> = linear_gradient_style.stops.iter().map(|s| {
- GradientStop {
- offset: s.offset as AzFloat,
- color: color::new(s.color.red, s.color.green, s.color.blue, s.color.alpha)
- }
- }).collect();
-
- Pattern::LinearGradient(LinearGradientPattern::new(
- &Point2D(linear_gradient_style.x0 as AzFloat, linear_gradient_style.y0 as AzFloat),
- &Point2D(linear_gradient_style.x1 as AzFloat, linear_gradient_style.y1 as AzFloat),
- drawtarget.create_gradient_stops(&gradient_stops, ExtendMode::Clamp),
- &Matrix2D::identity()))
- },
- FillOrStrokeStyle::RadialGradient(ref radial_gradient_style) => {
- let gradient_stops: Vec<GradientStop> = radial_gradient_style.stops.iter().map(|s| {
- GradientStop {
- offset: s.offset as AzFloat,
- color: color::new(s.color.red, s.color.green, s.color.blue, s.color.alpha)
- }
- }).collect();
-
- Pattern::RadialGradient(RadialGradientPattern::new(
- &Point2D(radial_gradient_style.x0 as AzFloat, radial_gradient_style.y0 as AzFloat),
- &Point2D(radial_gradient_style.x1 as AzFloat, radial_gradient_style.y1 as AzFloat),
- radial_gradient_style.r0 as AzFloat, radial_gradient_style.r1 as AzFloat,
- drawtarget.create_gradient_stops(&gradient_stops, ExtendMode::Clamp),
- &Matrix2D::identity()))
- }
- }
- }
-}
-
-#[derive(Copy, Clone, PartialEq)]
-pub enum LineCapStyle {
- Butt = 0,
- Round = 1,
- Square = 2,
-}
-
-impl LineCapStyle {
- fn to_azure_style(&self) -> CapStyle {
- match *self {
- LineCapStyle::Butt => CapStyle::Butt,
- LineCapStyle::Round => CapStyle::Round,
- LineCapStyle::Square => CapStyle::Square,
- }
- }
-
- pub fn from_str(string: &str) -> Option<LineCapStyle> {
- match string {
- "butt" => Some(LineCapStyle::Butt),
- "round" => Some(LineCapStyle::Round),
- "square" => Some(LineCapStyle::Square),
- _ => None
- }
- }
-}
-
-#[derive(Copy, Clone, PartialEq)]
-pub enum LineJoinStyle {
- Round = 0,
- Bevel = 1,
- Miter = 2,
-}
-
-impl LineJoinStyle {
- fn to_azure_style(&self) -> JoinStyle {
- match *self {
- LineJoinStyle::Round => JoinStyle::Round,
- LineJoinStyle::Bevel => JoinStyle::Bevel,
- LineJoinStyle::Miter => JoinStyle::Miter,
- }
- }
-
- pub fn from_str(string: &str) -> Option<LineJoinStyle> {
- match string {
- "round" => Some(LineJoinStyle::Round),
- "bevel" => Some(LineJoinStyle::Bevel),
- "miter" => Some(LineJoinStyle::Miter),
- _ => None
- }
- }
-}
-
-#[derive(Copy, Clone, PartialEq)]
-pub enum CompositionStyle {
- SrcIn,
- SrcOut,
- SrcOver,
- SrcAtop,
- DestIn,
- DestOut,
- DestOver,
- DestAtop,
- Copy,
- Lighter,
- Xor,
-}
-
-impl CompositionStyle {
- fn to_azure_style(&self) -> CompositionOp {
- match *self {
- CompositionStyle::SrcIn => CompositionOp::In,
- CompositionStyle::SrcOut => CompositionOp::Out,
- CompositionStyle::SrcOver => CompositionOp::Over,
- CompositionStyle::SrcAtop => CompositionOp::Atop,
- CompositionStyle::DestIn => CompositionOp::DestIn,
- CompositionStyle::DestOut => CompositionOp::DestOut,
- CompositionStyle::DestOver => CompositionOp::DestOver,
- CompositionStyle::DestAtop => CompositionOp::DestAtop,
- CompositionStyle::Copy => CompositionOp::Source,
- CompositionStyle::Lighter => CompositionOp::Add,
- CompositionStyle::Xor => CompositionOp::Xor,
- }
- }
-
- pub fn from_str(string: &str) -> Option<CompositionStyle> {
- match string {
- "source-in" => Some(CompositionStyle::SrcIn),
- "source-out" => Some(CompositionStyle::SrcOut),
- "source-over" => Some(CompositionStyle::SrcOver),
- "source-atop" => Some(CompositionStyle::SrcAtop),
- "destination-in" => Some(CompositionStyle::DestIn),
- "destination-out" => Some(CompositionStyle::DestOut),
- "destination-over" => Some(CompositionStyle::DestOver),
- "destination-atop" => Some(CompositionStyle::DestAtop),
- "copy" => Some(CompositionStyle::Copy),
- "lighter" => Some(CompositionStyle::Lighter),
- "xor" => Some(CompositionStyle::Xor),
- _ => None
- }
- }
-
- pub fn to_str(&self) -> &str {
- match *self {
- CompositionStyle::SrcIn => "source-in",
- CompositionStyle::SrcOut => "source-out",
- CompositionStyle::SrcOver => "source-over",
- CompositionStyle::SrcAtop => "source-atop",
- CompositionStyle::DestIn => "destination-in",
- CompositionStyle::DestOut => "destination-out",
- CompositionStyle::DestOver => "destination-over",
- CompositionStyle::DestAtop => "destination-atop",
- CompositionStyle::Copy => "copy",
- CompositionStyle::Lighter => "lighter",
- CompositionStyle::Xor => "xor",
- }
- }
-}
-
-#[derive(Copy, Clone, PartialEq)]
-pub enum BlendingStyle {
- Multiply,
- Screen,
- Overlay,
- Darken,
- Lighten,
- ColorDodge,
- ColorBurn,
- HardLight,
- SoftLight,
- Difference,
- Exclusion,
- Hue,
- Saturation,
- Color,
- Luminosity,
-}
-
-impl BlendingStyle {
- fn to_azure_style(&self) -> CompositionOp {
- match *self {
- BlendingStyle::Multiply => CompositionOp::Multiply,
- BlendingStyle::Screen => CompositionOp::Screen,
- BlendingStyle::Overlay => CompositionOp::Overlay,
- BlendingStyle::Darken => CompositionOp::Darken,
- BlendingStyle::Lighten => CompositionOp::Lighten,
- BlendingStyle::ColorDodge => CompositionOp::ColorDodge,
- BlendingStyle::ColorBurn => CompositionOp::ColorBurn,
- BlendingStyle::HardLight => CompositionOp::HardLight,
- BlendingStyle::SoftLight => CompositionOp::SoftLight,
- BlendingStyle::Difference => CompositionOp::Difference,
- BlendingStyle::Exclusion => CompositionOp::Exclusion,
- BlendingStyle::Hue => CompositionOp::Hue,
- BlendingStyle::Saturation => CompositionOp::Saturation,
- BlendingStyle::Color => CompositionOp::Color,
- BlendingStyle::Luminosity => CompositionOp::Luminosity,
- }
- }
-
- pub fn from_str(string: &str) -> Option<BlendingStyle> {
- match string {
- "multiply" => Some(BlendingStyle::Multiply),
- "screen" => Some(BlendingStyle::Screen),
- "overlay" => Some(BlendingStyle::Overlay),
- "darken" => Some(BlendingStyle::Darken),
- "lighten" => Some(BlendingStyle::Lighten),
- "color-dodge" => Some(BlendingStyle::ColorDodge),
- "color-burn" => Some(BlendingStyle::ColorBurn),
- "hard-light" => Some(BlendingStyle::HardLight),
- "soft-light" => Some(BlendingStyle::SoftLight),
- "difference" => Some(BlendingStyle::Difference),
- "exclusion" => Some(BlendingStyle::Exclusion),
- "hue" => Some(BlendingStyle::Hue),
- "saturation" => Some(BlendingStyle::Saturation),
- "color" => Some(BlendingStyle::Color),
- "luminosity" => Some(BlendingStyle::Luminosity),
- _ => None
- }
- }
-
- pub fn to_str(&self) -> &str {
- match *self {
- BlendingStyle::Multiply => "multiply",
- BlendingStyle::Screen => "screen",
- BlendingStyle::Overlay => "overlay",
- BlendingStyle::Darken => "darken",
- BlendingStyle::Lighten => "lighten",
- BlendingStyle::ColorDodge => "color-dodge",
- BlendingStyle::ColorBurn => "color-burn",
- BlendingStyle::HardLight => "hard-light",
- BlendingStyle::SoftLight => "soft-light",
- BlendingStyle::Difference => "difference",
- BlendingStyle::Exclusion => "exclusion",
- BlendingStyle::Hue => "hue",
- BlendingStyle::Saturation => "saturation",
- BlendingStyle::Color => "color",
- BlendingStyle::Luminosity => "luminosity",
- }
- }
-}
-
-#[derive(Copy, Clone, PartialEq)]
-pub enum CompositionOrBlending {
- Composition(CompositionStyle),
- Blending(BlendingStyle),
-}
-
-impl CompositionOrBlending {
- fn to_azure_style(&self) -> CompositionOp {
- match *self {
- CompositionOrBlending::Composition(op) => op.to_azure_style(),
- CompositionOrBlending::Blending(op) => op.to_azure_style(),
- }
- }
-
- pub fn default() -> CompositionOrBlending {
- CompositionOrBlending::Composition(CompositionStyle::SrcOver)
- }
-
- pub fn from_str(string: &str) -> Option<CompositionOrBlending> {
- if let Some(op) = CompositionStyle::from_str(string) {
- return Some(CompositionOrBlending::Composition(op));
- }
-
- if let Some(op) = BlendingStyle::from_str(string) {
- return Some(CompositionOrBlending::Blending(op));
- }
-
- None
- }
-}
-
/// Used by drawImage to get rid of the extra pixels of the image data that
/// won't be copied to the canvas
/// image_data: Color pixel data of the image