зеркало из https://github.com/mozilla/gecko-dev.git
servo: Merge #5563 - Canvas: added support for the globalAlpha attribute (from mmatyas:canvas_globalalpha); r=jdm
A patch somewhat similar to #5562 Source-Repo: https://github.com/servo/servo Source-Revision: ee7d76221345362c069a6946e01b9ec7d4b42ce3
This commit is contained in:
Родитель
f4d030facd
Коммит
3b19a4cdea
|
@ -40,6 +40,7 @@ pub enum CanvasMsg {
|
|||
SetStrokeStyle(FillOrStrokeStyle),
|
||||
SetLineWidth(f32),
|
||||
SetTransform(Matrix2D<f32>),
|
||||
SetGlobalAlpha(f32),
|
||||
Recreate(Size2D<i32>),
|
||||
SendPixelContents(Sender<Vec<u8>>),
|
||||
GetImageData(Rect<f64>, Size2D<f64>, Sender<Vec<u8>>),
|
||||
|
@ -105,7 +106,7 @@ impl<'a> CanvasPaintTask<'a> {
|
|||
image_size, image_size.width * 4, SurfaceFormat::B8G8R8A8);
|
||||
|
||||
let draw_surface_options = DrawSurfaceOptions::new(filter, true);
|
||||
let draw_options = DrawOptions::new(1.0f64 as AzFloat, 0);
|
||||
let draw_options = DrawOptions::new(self.draw_options.alpha, 0);
|
||||
|
||||
self.drawtarget.draw_surface(source_surface,
|
||||
dest_rect.to_azfloat(),
|
||||
|
@ -182,6 +183,7 @@ impl<'a> CanvasPaintTask<'a> {
|
|||
|
||||
pub struct CanvasPaintTask<'a> {
|
||||
drawtarget: DrawTarget,
|
||||
draw_options: DrawOptions,
|
||||
fill_style: Pattern,
|
||||
stroke_style: Pattern,
|
||||
stroke_opts: StrokeOptions<'a>,
|
||||
|
@ -197,6 +199,7 @@ impl<'a> CanvasPaintTask<'a> {
|
|||
let path_builder = draw_target.create_path_builder();
|
||||
CanvasPaintTask {
|
||||
drawtarget: draw_target,
|
||||
draw_options: DrawOptions::new(1.0, 0),
|
||||
fill_style: Pattern::Color(ColorPattern::new(color::black())),
|
||||
stroke_style: Pattern::Color(ColorPattern::new(color::black())),
|
||||
stroke_opts: StrokeOptions::new(1.0, JoinStyle::MiterOrBevel, CapStyle::Butt, 1.0, &[]),
|
||||
|
@ -243,6 +246,7 @@ impl<'a> CanvasPaintTask<'a> {
|
|||
CanvasMsg::SetStrokeStyle(style) => painter.set_stroke_style(style),
|
||||
CanvasMsg::SetLineWidth(width) => painter.set_line_width(width),
|
||||
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),
|
||||
|
@ -256,8 +260,7 @@ impl<'a> CanvasPaintTask<'a> {
|
|||
}
|
||||
|
||||
fn fill_rect(&self, rect: &Rect<f32>) {
|
||||
let drawopts = DrawOptions::new(1.0, 0);
|
||||
self.drawtarget.fill_rect(rect, self.fill_style.to_pattern_ref(), Some(&drawopts));
|
||||
self.drawtarget.fill_rect(rect, self.fill_style.to_pattern_ref(), Some(&self.draw_options));
|
||||
}
|
||||
|
||||
fn clear_rect(&self, rect: &Rect<f32>) {
|
||||
|
@ -265,10 +268,9 @@ impl<'a> CanvasPaintTask<'a> {
|
|||
}
|
||||
|
||||
fn stroke_rect(&self, rect: &Rect<f32>) {
|
||||
let drawopts = DrawOptions::new(1.0, 0);
|
||||
match self.stroke_style {
|
||||
Pattern::Color(ref color) => {
|
||||
self.drawtarget.stroke_rect(rect, color, &self.stroke_opts, &drawopts)
|
||||
self.drawtarget.stroke_rect(rect, color, &self.stroke_opts, &self.draw_options)
|
||||
}
|
||||
_ => {
|
||||
// TODO(pcwalton)
|
||||
|
@ -285,10 +287,9 @@ impl<'a> CanvasPaintTask<'a> {
|
|||
}
|
||||
|
||||
fn fill(&self) {
|
||||
let draw_options = DrawOptions::new(1.0, 0);
|
||||
match self.fill_style {
|
||||
Pattern::Color(ref color) => {
|
||||
self.drawtarget.fill(&self.path_builder.finish(), color, &draw_options);
|
||||
self.drawtarget.fill(&self.path_builder.finish(), color, &self.draw_options);
|
||||
}
|
||||
_ => {
|
||||
// TODO(pcwalton)
|
||||
|
@ -297,11 +298,10 @@ impl<'a> CanvasPaintTask<'a> {
|
|||
}
|
||||
|
||||
fn stroke(&self) {
|
||||
let draw_options = DrawOptions::new(1.0, 0);
|
||||
match self.stroke_style {
|
||||
Pattern::Color(ref color) => {
|
||||
self.drawtarget.stroke(&self.path_builder.finish(),
|
||||
color, &self.stroke_opts, &draw_options);
|
||||
color, &self.stroke_opts, &self.draw_options);
|
||||
}
|
||||
_ => {
|
||||
// TODO
|
||||
|
@ -430,6 +430,10 @@ impl<'a> CanvasPaintTask<'a> {
|
|||
self.drawtarget.set_transform(transform)
|
||||
}
|
||||
|
||||
fn set_global_alpha(&mut self, alpha: f32) {
|
||||
self.draw_options.alpha = alpha;
|
||||
}
|
||||
|
||||
fn create(size: Size2D<i32>) -> DrawTarget {
|
||||
DrawTarget::new(BackendType::Skia, size, SurfaceFormat::B8G8R8A8)
|
||||
}
|
||||
|
|
|
@ -49,6 +49,7 @@ 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>,
|
||||
|
@ -70,6 +71,7 @@ impl CanvasRenderingContext2D {
|
|||
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),
|
||||
|
@ -342,6 +344,19 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
|||
self.update_transform()
|
||||
}
|
||||
|
||||
fn GlobalAlpha(self) -> f64 {
|
||||
self.global_alpha.get()
|
||||
}
|
||||
|
||||
fn SetGlobalAlpha(self, alpha: f64) {
|
||||
if !alpha.is_finite() || alpha > 1.0 || alpha < 0.0 {
|
||||
return;
|
||||
}
|
||||
|
||||
self.global_alpha.set(alpha);
|
||||
self.renderer.send(CanvasMsg::SetGlobalAlpha(alpha as f32)).unwrap()
|
||||
}
|
||||
|
||||
fn FillRect(self, x: f64, y: f64, width: f64, height: f64) {
|
||||
if !(x.is_finite() && y.is_finite() &&
|
||||
width.is_finite() && height.is_finite()) {
|
||||
|
|
|
@ -49,7 +49,7 @@ interface CanvasRenderingContext2D {
|
|||
//void resetTransform();
|
||||
|
||||
// compositing
|
||||
// attribute unrestricted double globalAlpha; // (default 1.0)
|
||||
attribute unrestricted double globalAlpha; // (default 1.0)
|
||||
// attribute DOMString globalCompositeOperation; // (default source-over)
|
||||
|
||||
// image smoothing
|
||||
|
|
Загрузка…
Ссылка в новой задаче