mirror of
https://github.com/servo/servo.git
synced 2025-07-25 16:20:36 +01:00
Auto merge of #6402 - hyowon:canvas_fill_stroke, r=pcwalton
Fill and stroke for all pattern types and check the zero size gradient. Depends on servo/rust-azure#170 which has been already merged. So this patch contains the update of rust-azure. r? @nox cc @yichoi <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/6402) <!-- Reviewable:end -->
This commit is contained in:
commit
e1b28d893e
6 changed files with 49 additions and 36 deletions
|
@ -250,6 +250,10 @@ impl<'a> CanvasPaintTask<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fill_rect(&self, rect: &Rect<f32>) {
|
fn fill_rect(&self, rect: &Rect<f32>) {
|
||||||
|
if is_zero_size_gradient(&self.state.fill_style) {
|
||||||
|
return; // Paint nothing if gradient size is zero.
|
||||||
|
}
|
||||||
|
|
||||||
let draw_rect = Rect::new(rect.origin,
|
let draw_rect = Rect::new(rect.origin,
|
||||||
match self.state.fill_style {
|
match self.state.fill_style {
|
||||||
Pattern::Surface(ref surface) => {
|
Pattern::Surface(ref surface) => {
|
||||||
|
@ -281,14 +285,19 @@ impl<'a> CanvasPaintTask<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn stroke_rect(&self, rect: &Rect<f32>) {
|
fn stroke_rect(&self, rect: &Rect<f32>) {
|
||||||
match self.state.stroke_style {
|
if is_zero_size_gradient(&self.state.stroke_style) {
|
||||||
Pattern::Color(ref color) => {
|
return; // Paint nothing if gradient size is zero.
|
||||||
self.drawtarget.stroke_rect(rect, color, &self.state.stroke_opts, &self.state.draw_options)
|
}
|
||||||
}
|
|
||||||
_ => {
|
if self.need_to_draw_shadow() {
|
||||||
// TODO(pcwalton)
|
self.draw_with_shadow(&rect, |new_draw_target: &DrawTarget| {
|
||||||
}
|
new_draw_target.stroke_rect(rect, self.state.stroke_style.to_pattern_ref(),
|
||||||
};
|
&self.state.stroke_opts, &self.state.draw_options);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
self.drawtarget.stroke_rect(rect, self.state.stroke_style.to_pattern_ref(),
|
||||||
|
&self.state.stroke_opts, &self.state.draw_options);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn begin_path(&mut self) {
|
fn begin_path(&mut self) {
|
||||||
|
@ -300,26 +309,24 @@ impl<'a> CanvasPaintTask<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fill(&self) {
|
fn fill(&self) {
|
||||||
match self.state.fill_style {
|
if is_zero_size_gradient(&self.state.fill_style) {
|
||||||
Pattern::Color(ref color) => {
|
return; // Paint nothing if gradient size is zero.
|
||||||
self.drawtarget.fill(&self.path_builder.finish(), color, &self.state.draw_options);
|
}
|
||||||
}
|
|
||||||
_ => {
|
self.drawtarget.fill(&self.path_builder.finish(),
|
||||||
// TODO(pcwalton)
|
self.state.fill_style.to_pattern_ref(),
|
||||||
}
|
&self.state.draw_options);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn stroke(&self) {
|
fn stroke(&self) {
|
||||||
match self.state.stroke_style {
|
if is_zero_size_gradient(&self.state.stroke_style) {
|
||||||
Pattern::Color(ref color) => {
|
return; // Paint nothing if gradient size is zero.
|
||||||
self.drawtarget.stroke(&self.path_builder.finish(),
|
}
|
||||||
color, &self.state.stroke_opts, &self.state.draw_options);
|
|
||||||
}
|
self.drawtarget.stroke(&self.path_builder.finish(),
|
||||||
_ => {
|
self.state.stroke_style.to_pattern_ref(),
|
||||||
// TODO
|
&self.state.stroke_opts,
|
||||||
}
|
&self.state.draw_options);
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn clip(&self) {
|
fn clip(&self) {
|
||||||
|
@ -733,6 +740,15 @@ fn write_pixels(draw_target: &DrawTarget,
|
||||||
draw_options);
|
draw_options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_zero_size_gradient(pattern: &Pattern) -> bool {
|
||||||
|
if let &Pattern::LinearGradient(ref gradient) = pattern {
|
||||||
|
if gradient.is_zero_size() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
pub trait SizeToi32 {
|
pub trait SizeToi32 {
|
||||||
fn to_i32(&self) -> Size2D<i32>;
|
fn to_i32(&self) -> Size2D<i32>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ use azure::azure_hl::{DrawOptions, DrawSurfaceOptions, DrawTarget, ExtendMode, F
|
||||||
use azure::azure_hl::{GaussianBlurAttribute, StrokeOptions, SurfaceFormat};
|
use azure::azure_hl::{GaussianBlurAttribute, StrokeOptions, SurfaceFormat};
|
||||||
use azure::azure_hl::{GaussianBlurInput, GradientStop, Filter, FilterNode, LinearGradientPattern};
|
use azure::azure_hl::{GaussianBlurInput, GradientStop, Filter, FilterNode, LinearGradientPattern};
|
||||||
use azure::azure_hl::{JoinStyle, CapStyle};
|
use azure::azure_hl::{JoinStyle, CapStyle};
|
||||||
use azure::azure_hl::{PatternRef, Path, PathBuilder, CompositionOp, AntialiasMode};
|
use azure::azure_hl::{Pattern, PatternRef, Path, PathBuilder, CompositionOp, AntialiasMode};
|
||||||
use azure::scaled_font::ScaledFont;
|
use azure::scaled_font::ScaledFont;
|
||||||
use azure::{AzFloat, struct__AzDrawOptions, struct__AzGlyph};
|
use azure::{AzFloat, struct__AzDrawOptions, struct__AzGlyph};
|
||||||
use azure::{struct__AzGlyphBuffer, struct__AzPoint, AzDrawTargetFillGlyphs};
|
use azure::{struct__AzGlyphBuffer, struct__AzPoint, AzDrawTargetFillGlyphs};
|
||||||
|
@ -291,7 +291,9 @@ impl<'a> PaintContext<'a> {
|
||||||
let mut path_builder = self.draw_target.create_path_builder();
|
let mut path_builder = self.draw_target.create_path_builder();
|
||||||
self.create_border_path_segment(&mut path_builder, bounds, direction, border, radii);
|
self.create_border_path_segment(&mut path_builder, bounds, direction, border, radii);
|
||||||
let draw_options = DrawOptions::new(1.0, CompositionOp::Over, AntialiasMode::None);
|
let draw_options = DrawOptions::new(1.0, CompositionOp::Over, AntialiasMode::None);
|
||||||
self.draw_target.fill(&path_builder.finish(), &ColorPattern::new(color), &draw_options);
|
self.draw_target.fill(&path_builder.finish(),
|
||||||
|
Pattern::Color(ColorPattern::new(color)).to_pattern_ref(),
|
||||||
|
&draw_options);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn push_rounded_rect_clip(&self, bounds: &Rect<f32>, radii: &BorderRadii<AzFloat>) {
|
fn push_rounded_rect_clip(&self, bounds: &Rect<f32>, radii: &BorderRadii<AzFloat>) {
|
||||||
|
@ -1023,7 +1025,7 @@ impl<'a> PaintContext<'a> {
|
||||||
|
|
||||||
// Draw the shadow, and blur if we need to.
|
// Draw the shadow, and blur if we need to.
|
||||||
temporary_draw_target.draw_target.fill(&path,
|
temporary_draw_target.draw_target.fill(&path,
|
||||||
&ColorPattern::new(color),
|
Pattern::Color(ColorPattern::new(color)).to_pattern_ref(),
|
||||||
&DrawOptions::new(1.0, CompositionOp::Over, AntialiasMode::None));
|
&DrawOptions::new(1.0, CompositionOp::Over, AntialiasMode::None));
|
||||||
self.blur_if_necessary(temporary_draw_target, blur_radius);
|
self.blur_if_necessary(temporary_draw_target, blur_radius);
|
||||||
|
|
||||||
|
|
2
components/servo/Cargo.lock
generated
2
components/servo/Cargo.lock
generated
|
@ -42,7 +42,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "azure"
|
name = "azure"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/servo/rust-azure#b9bb83c733507f3f57e2c334499f38432056e26c"
|
source = "git+https://github.com/servo/rust-azure#0e864697513c9e31bbe2213957d5713fd6139e69"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"core-foundation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"core-foundation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"core-graphics 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"core-graphics 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|
2
ports/cef/Cargo.lock
generated
2
ports/cef/Cargo.lock
generated
|
@ -41,7 +41,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "azure"
|
name = "azure"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/servo/rust-azure#b9bb83c733507f3f57e2c334499f38432056e26c"
|
source = "git+https://github.com/servo/rust-azure#0e864697513c9e31bbe2213957d5713fd6139e69"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"core-foundation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"core-foundation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"core-graphics 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"core-graphics 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|
2
ports/gonk/Cargo.lock
generated
2
ports/gonk/Cargo.lock
generated
|
@ -28,7 +28,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "azure"
|
name = "azure"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/servo/rust-azure#b9bb83c733507f3f57e2c334499f38432056e26c"
|
source = "git+https://github.com/servo/rust-azure#0e864697513c9e31bbe2213957d5713fd6139e69"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"core-foundation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"core-foundation 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"core-graphics 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"core-graphics 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[2d.gradient.interpolate.zerosize.fillRect.html]
|
|
||||||
type: testharness
|
|
||||||
[Canvas test: 2d.gradient.interpolate.zerosize.fillRect]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue