mirror of
https://github.com/servo/servo.git
synced 2025-08-05 13:40:08 +01:00
Auto merge of #6065 - mmatyas:canvas_antialias, r=jdm
This patch turns on antialiasing for the canvas, and updates the painting code to use the updated Azure DrawOptions defined in servo/rust-azure#158. <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/6065) <!-- Reviewable:end -->
This commit is contained in:
commit
c97c0a9f94
11 changed files with 50 additions and 28 deletions
|
@ -5,7 +5,7 @@
|
||||||
use azure::azure::AzFloat;
|
use azure::azure::AzFloat;
|
||||||
use azure::azure_hl::{DrawTarget, SurfaceFormat, BackendType, StrokeOptions, DrawOptions, Pattern};
|
use azure::azure_hl::{DrawTarget, SurfaceFormat, BackendType, StrokeOptions, DrawOptions, Pattern};
|
||||||
use azure::azure_hl::{ColorPattern, PathBuilder, DrawSurfaceOptions, Filter};
|
use azure::azure_hl::{ColorPattern, PathBuilder, DrawSurfaceOptions, Filter};
|
||||||
use azure::azure_hl::{JoinStyle, CapStyle};
|
use azure::azure_hl::{JoinStyle, CapStyle, CompositionOp, AntialiasMode};
|
||||||
use canvas_traits::*;
|
use canvas_traits::*;
|
||||||
use geom::matrix2d::Matrix2D;
|
use geom::matrix2d::Matrix2D;
|
||||||
use geom::point::Point2D;
|
use geom::point::Point2D;
|
||||||
|
@ -14,6 +14,7 @@ use geom::size::Size2D;
|
||||||
use layers::platform::surface::NativeSurface;
|
use layers::platform::surface::NativeSurface;
|
||||||
use gfx_traits::color;
|
use gfx_traits::color;
|
||||||
use num::ToPrimitive;
|
use num::ToPrimitive;
|
||||||
|
use util::opts;
|
||||||
use util::task::spawn_named;
|
use util::task::spawn_named;
|
||||||
use util::vec::byte_swap;
|
use util::vec::byte_swap;
|
||||||
|
|
||||||
|
@ -79,7 +80,7 @@ impl<'a> CanvasPaintTask<'a> {
|
||||||
image_size, image_size.width * 4, SurfaceFormat::B8G8R8A8);
|
image_size, image_size.width * 4, SurfaceFormat::B8G8R8A8);
|
||||||
|
|
||||||
let draw_surface_options = DrawSurfaceOptions::new(filter, true);
|
let draw_surface_options = DrawSurfaceOptions::new(filter, true);
|
||||||
let draw_options = DrawOptions::new(self.state.draw_options.alpha, 0);
|
let draw_options = DrawOptions::new(self.state.draw_options.alpha, CompositionOp::Over, AntialiasMode::None);
|
||||||
|
|
||||||
self.drawtarget.draw_surface(source_surface,
|
self.drawtarget.draw_surface(source_surface,
|
||||||
dest_rect.to_azfloat(),
|
dest_rect.to_azfloat(),
|
||||||
|
@ -174,8 +175,14 @@ struct CanvasPaintState<'a> {
|
||||||
|
|
||||||
impl<'a> CanvasPaintState<'a> {
|
impl<'a> CanvasPaintState<'a> {
|
||||||
fn new() -> CanvasPaintState<'a> {
|
fn new() -> CanvasPaintState<'a> {
|
||||||
|
let antialias = if opts::get().enable_canvas_antialiasing {
|
||||||
|
AntialiasMode::Default
|
||||||
|
} else {
|
||||||
|
AntialiasMode::None
|
||||||
|
};
|
||||||
|
|
||||||
CanvasPaintState {
|
CanvasPaintState {
|
||||||
draw_options: DrawOptions::new(1.0, 0),
|
draw_options: DrawOptions::new(1.0, CompositionOp::Over, antialias),
|
||||||
fill_style: Pattern::Color(ColorPattern::new(color::black())),
|
fill_style: Pattern::Color(ColorPattern::new(color::black())),
|
||||||
stroke_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, 10.0, &[]),
|
stroke_opts: StrokeOptions::new(1.0, JoinStyle::MiterOrBevel, CapStyle::Butt, 10.0, &[]),
|
||||||
|
|
|
@ -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};
|
use azure::azure_hl::{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};
|
||||||
|
@ -28,7 +28,7 @@ use geom::point::Point2D;
|
||||||
use geom::rect::Rect;
|
use geom::rect::Rect;
|
||||||
use geom::side_offsets::SideOffsets2D;
|
use geom::side_offsets::SideOffsets2D;
|
||||||
use geom::size::Size2D;
|
use geom::size::Size2D;
|
||||||
use libc::types::common::c99::{uint16_t, uint32_t};
|
use libc::types::common::c99::uint32_t;
|
||||||
use net_traits::image::base::Image;
|
use net_traits::image::base::Image;
|
||||||
use png::PixelsByColorType;
|
use png::PixelsByColorType;
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
@ -159,7 +159,7 @@ impl<'a> PaintContext<'a> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let draw_options = DrawOptions::new(1.0, 0);
|
let draw_options = DrawOptions::new(1.0, CompositionOp::Over, AntialiasMode::None);
|
||||||
draw_target_ref.draw_surface(azure_surface,
|
draw_target_ref.draw_surface(azure_surface,
|
||||||
dest_rect,
|
dest_rect,
|
||||||
source_rect,
|
source_rect,
|
||||||
|
@ -173,7 +173,7 @@ impl<'a> PaintContext<'a> {
|
||||||
self.page_rect.origin.y as AzFloat),
|
self.page_rect.origin.y as AzFloat),
|
||||||
Size2D(self.screen_rect.size.width as AzFloat,
|
Size2D(self.screen_rect.size.width as AzFloat,
|
||||||
self.screen_rect.size.height as AzFloat));
|
self.screen_rect.size.height as AzFloat));
|
||||||
let mut draw_options = DrawOptions::new(1.0, 0);
|
let mut draw_options = DrawOptions::new(1.0, CompositionOp::Over, AntialiasMode::None);
|
||||||
draw_options.set_composition_op(CompositionOp::Source);
|
draw_options.set_composition_op(CompositionOp::Source);
|
||||||
self.draw_target.make_current();
|
self.draw_target.make_current();
|
||||||
self.draw_target.fill_rect(&rect, PatternRef::Color(&pattern), Some(&draw_options));
|
self.draw_target.fill_rect(&rect, PatternRef::Color(&pattern), Some(&draw_options));
|
||||||
|
@ -290,7 +290,7 @@ impl<'a> PaintContext<'a> {
|
||||||
color: Color) {
|
color: Color) {
|
||||||
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, 0);
|
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(), &ColorPattern::new(color), &draw_options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -617,7 +617,7 @@ impl<'a> PaintContext<'a> {
|
||||||
color: Color,
|
color: Color,
|
||||||
dash_size: DashSize) {
|
dash_size: DashSize) {
|
||||||
let rect = bounds.to_nearest_azure_rect();
|
let rect = bounds.to_nearest_azure_rect();
|
||||||
let draw_opts = DrawOptions::new(1 as AzFloat, 0 as uint16_t);
|
let draw_opts = DrawOptions::new(1.0, CompositionOp::Over, AntialiasMode::None);
|
||||||
let border_width = match direction {
|
let border_width = match direction {
|
||||||
Direction::Top => border.top,
|
Direction::Top => border.top,
|
||||||
Direction::Left => border.left,
|
Direction::Left => border.left,
|
||||||
|
@ -960,7 +960,7 @@ impl<'a> PaintContext<'a> {
|
||||||
&mut accum_blur);
|
&mut accum_blur);
|
||||||
|
|
||||||
// Perform the blit operation.
|
// Perform the blit operation.
|
||||||
let mut draw_options = DrawOptions::new(opacity, 0);
|
let mut draw_options = DrawOptions::new(opacity, CompositionOp::Over, AntialiasMode::None);
|
||||||
draw_options.set_composition_op(blend_mode.to_azure_composition_op());
|
draw_options.set_composition_op(blend_mode.to_azure_composition_op());
|
||||||
|
|
||||||
// If there is a blur expansion, shift the transform and update the size.
|
// If there is a blur expansion, shift the transform and update the size.
|
||||||
|
@ -1024,7 +1024,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),
|
&ColorPattern::new(color),
|
||||||
&DrawOptions::new(1.0, 0));
|
&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);
|
||||||
|
|
||||||
// Undo the draw target's clip if we need to, and push back the stacking context clip.
|
// Undo the draw target's clip if we need to, and push back the stacking context clip.
|
||||||
|
@ -1221,15 +1221,11 @@ impl ScaledFontExtensionMethods for ScaledFont {
|
||||||
let azure_pattern = pattern.azure_color_pattern;
|
let azure_pattern = pattern.azure_color_pattern;
|
||||||
assert!(!azure_pattern.is_null());
|
assert!(!azure_pattern.is_null());
|
||||||
|
|
||||||
let fields = if antialias {
|
|
||||||
0x0200
|
|
||||||
} else {
|
|
||||||
0
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut options = struct__AzDrawOptions {
|
let mut options = struct__AzDrawOptions {
|
||||||
mAlpha: 1f64 as AzFloat,
|
mAlpha: 1f64 as AzFloat,
|
||||||
fields: fields,
|
mCompositionOp: CompositionOp::Over as u8,
|
||||||
|
mAntialiasMode: if antialias { AntialiasMode::Subpixel as u8 }
|
||||||
|
else { AntialiasMode::None as u8 }
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut origin = baseline_origin.clone();
|
let mut origin = baseline_origin.clone();
|
||||||
|
@ -1418,7 +1414,7 @@ impl TemporaryDrawTarget {
|
||||||
main_draw_target.draw_filter(&filter,
|
main_draw_target.draw_filter(&filter,
|
||||||
&Rect(Point2D(0.0, 0.0), temporary_draw_target_size),
|
&Rect(Point2D(0.0, 0.0), temporary_draw_target_size),
|
||||||
&self.offset,
|
&self.offset,
|
||||||
DrawOptions::new(1.0, 0));
|
DrawOptions::new(1.0, CompositionOp::Over, AntialiasMode::None));
|
||||||
main_draw_target.set_transform(&main_draw_target_transform);
|
main_draw_target.set_transform(&main_draw_target_transform);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
4
components/servo/Cargo.lock
generated
4
components/servo/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#f1c5e98201e4c2d7684a388596979ce862788a9e"
|
source = "git+https://github.com/servo/rust-azure#5b9f2dbe7517196a82ea3c9c4dc4cf9fbd7d0867"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"core_foundation 0.1.0 (git+https://github.com/servo/rust-core-foundation)",
|
"core_foundation 0.1.0 (git+https://github.com/servo/rust-core-foundation)",
|
||||||
"core_graphics 0.1.0 (git+https://github.com/servo/rust-core-graphics)",
|
"core_graphics 0.1.0 (git+https://github.com/servo/rust-core-graphics)",
|
||||||
|
@ -52,7 +52,7 @@ dependencies = [
|
||||||
"geom 0.1.0 (git+https://github.com/servo/rust-geom)",
|
"geom 0.1.0 (git+https://github.com/servo/rust-geom)",
|
||||||
"libc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"skia 0.0.20130412 (git+https://github.com/servo/skia)",
|
"skia 0.0.20130412 (git+https://github.com/servo/skia)",
|
||||||
"xlib 0.1.0 (git+https://github.com/servo/rust-xlib)",
|
"x11 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -99,6 +99,10 @@ pub struct Opts {
|
||||||
/// font for layout tests.
|
/// font for layout tests.
|
||||||
pub enable_text_antialiasing: bool,
|
pub enable_text_antialiasing: bool,
|
||||||
|
|
||||||
|
/// If set with --disable-canvas-aa, disable antialiasing on the HTML canvas element.
|
||||||
|
/// Like --disable-text-aa, this is useful for reftests where pixel perfect results are required.
|
||||||
|
pub enable_canvas_antialiasing: bool,
|
||||||
|
|
||||||
/// True if each step of layout is traced to an external JSON file
|
/// True if each step of layout is traced to an external JSON file
|
||||||
/// for debugging purposes. Settings this implies sequential layout
|
/// for debugging purposes. Settings this implies sequential layout
|
||||||
/// and paint.
|
/// and paint.
|
||||||
|
@ -220,6 +224,7 @@ pub fn default_opts() -> Opts {
|
||||||
show_debug_parallel_layout: false,
|
show_debug_parallel_layout: false,
|
||||||
paint_flashing: false,
|
paint_flashing: false,
|
||||||
enable_text_antialiasing: false,
|
enable_text_antialiasing: false,
|
||||||
|
enable_canvas_antialiasing: false,
|
||||||
trace_layout: false,
|
trace_layout: false,
|
||||||
devtools_port: None,
|
devtools_port: None,
|
||||||
webdriver_port: None,
|
webdriver_port: None,
|
||||||
|
@ -398,6 +403,7 @@ pub fn from_cmdline_args(args: &[String]) -> bool {
|
||||||
show_debug_parallel_layout: debug_options.contains(&"show-parallel-layout"),
|
show_debug_parallel_layout: debug_options.contains(&"show-parallel-layout"),
|
||||||
paint_flashing: debug_options.contains(&"paint-flashing"),
|
paint_flashing: debug_options.contains(&"paint-flashing"),
|
||||||
enable_text_antialiasing: !debug_options.contains(&"disable-text-aa"),
|
enable_text_antialiasing: !debug_options.contains(&"disable-text-aa"),
|
||||||
|
enable_canvas_antialiasing: !debug_options.contains(&"disable-canvas-aa"),
|
||||||
dump_flow_tree: debug_options.contains(&"dump-flow-tree"),
|
dump_flow_tree: debug_options.contains(&"dump-flow-tree"),
|
||||||
dump_display_list: debug_options.contains(&"dump-display-list"),
|
dump_display_list: debug_options.contains(&"dump-display-list"),
|
||||||
dump_display_list_optimized: debug_options.contains(&"dump-display-list-optimized"),
|
dump_display_list_optimized: debug_options.contains(&"dump-display-list-optimized"),
|
||||||
|
|
4
ports/cef/Cargo.lock
generated
4
ports/cef/Cargo.lock
generated
|
@ -40,7 +40,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#f1c5e98201e4c2d7684a388596979ce862788a9e"
|
source = "git+https://github.com/servo/rust-azure#5b9f2dbe7517196a82ea3c9c4dc4cf9fbd7d0867"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"core_foundation 0.1.0 (git+https://github.com/servo/rust-core-foundation)",
|
"core_foundation 0.1.0 (git+https://github.com/servo/rust-core-foundation)",
|
||||||
"core_graphics 0.1.0 (git+https://github.com/servo/rust-core-graphics)",
|
"core_graphics 0.1.0 (git+https://github.com/servo/rust-core-graphics)",
|
||||||
|
@ -51,7 +51,7 @@ dependencies = [
|
||||||
"geom 0.1.0 (git+https://github.com/servo/rust-geom)",
|
"geom 0.1.0 (git+https://github.com/servo/rust-geom)",
|
||||||
"libc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"skia 0.0.20130412 (git+https://github.com/servo/skia)",
|
"skia 0.0.20130412 (git+https://github.com/servo/skia)",
|
||||||
"xlib 0.1.0 (git+https://github.com/servo/rust-xlib)",
|
"x11 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -73,6 +73,7 @@ pub extern "C" fn cef_initialize(args: *const cef_main_args_t,
|
||||||
temp_opts.headless = false;
|
temp_opts.headless = false;
|
||||||
temp_opts.hard_fail = false;
|
temp_opts.hard_fail = false;
|
||||||
temp_opts.enable_text_antialiasing = true;
|
temp_opts.enable_text_antialiasing = true;
|
||||||
|
temp_opts.enable_canvas_antialiasing = true;
|
||||||
temp_opts.resources_path = None;
|
temp_opts.resources_path = None;
|
||||||
temp_opts.url = None;
|
temp_opts.url = None;
|
||||||
opts::set(temp_opts);
|
opts::set(temp_opts);
|
||||||
|
|
4
ports/gonk/Cargo.lock
generated
4
ports/gonk/Cargo.lock
generated
|
@ -27,7 +27,7 @@ dependencies = [
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "azure"
|
name = "azure"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
source = "git+https://github.com/servo/rust-azure#f1c5e98201e4c2d7684a388596979ce862788a9e"
|
source = "git+https://github.com/servo/rust-azure#5b9f2dbe7517196a82ea3c9c4dc4cf9fbd7d0867"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"core_foundation 0.1.0 (git+https://github.com/servo/rust-core-foundation)",
|
"core_foundation 0.1.0 (git+https://github.com/servo/rust-core-foundation)",
|
||||||
"core_graphics 0.1.0 (git+https://github.com/servo/rust-core-graphics)",
|
"core_graphics 0.1.0 (git+https://github.com/servo/rust-core-graphics)",
|
||||||
|
@ -38,7 +38,7 @@ dependencies = [
|
||||||
"geom 0.1.0 (git+https://github.com/servo/rust-geom)",
|
"geom 0.1.0 (git+https://github.com/servo/rust-geom)",
|
||||||
"libc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"skia 0.0.20130412 (git+https://github.com/servo/skia)",
|
"skia 0.0.20130412 (git+https://github.com/servo/skia)",
|
||||||
"xlib 0.1.0 (git+https://github.com/servo/rust-xlib)",
|
"x11 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -250,9 +250,9 @@ fn capture(reftest: &Reftest, side: usize) -> (u32, u32, Vec<u8>) {
|
||||||
.stdout(Stdio::null())
|
.stdout(Stdio::null())
|
||||||
.stderr(Stdio::null())
|
.stderr(Stdio::null())
|
||||||
.args(&reftest.servo_args[..])
|
.args(&reftest.servo_args[..])
|
||||||
// Allows pixel perfect rendering of Ahem font for reftests.
|
// Allows pixel perfect rendering of Ahem font and the HTML canvas for reftests.
|
||||||
.arg("-Z")
|
.arg("-Z")
|
||||||
.arg("disable-text-aa")
|
.arg("disable-text-aa,disable-canvas-aa")
|
||||||
.args(&["-f", "-o"])
|
.args(&["-f", "-o"])
|
||||||
.arg(&png_filename)
|
.arg(&png_filename)
|
||||||
.arg(&{
|
.arg(&{
|
||||||
|
|
|
@ -186,7 +186,7 @@ class ServoRefTestExecutor(ProcessTestExecutor):
|
||||||
|
|
||||||
with TempFilename(self.tempdir) as output_path:
|
with TempFilename(self.tempdir) as output_path:
|
||||||
self.command = [self.binary, "--cpu", "--hard-fail", "--exit",
|
self.command = [self.binary, "--cpu", "--hard-fail", "--exit",
|
||||||
"-Z", "disable-text-aa", "--output=%s" % output_path,
|
"-Z", "disable-text-aa,disable-canvas-aa", "--output=%s" % output_path,
|
||||||
full_url]
|
full_url]
|
||||||
|
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
[2d.path.arcTo.shape.curve1.html]
|
||||||
|
type: testharness
|
||||||
|
[arcTo() curves in the right kind of shape]
|
||||||
|
expected:
|
||||||
|
FAIL
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
[2d.path.arcTo.shape.curve2.html]
|
||||||
|
type: testharness
|
||||||
|
[arcTo() curves in the right kind of shape]
|
||||||
|
expected:
|
||||||
|
FAIL
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue