|  | // Copyright (c) 2020, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | library canvas_rendering_context_2d_test; | 
|  |  | 
|  | import 'dart:html'; | 
|  | import 'dart:math'; | 
|  |  | 
|  | import 'canvas_rendering_util.dart'; | 
|  | import 'package:expect/minitest.dart'; | 
|  |  | 
|  | main() { | 
|  | setUp(setupFunc); | 
|  | tearDown(tearDownFunc); | 
|  |  | 
|  | test('default arc should be clockwise', () { | 
|  | context.beginPath(); | 
|  | final r = 10; | 
|  |  | 
|  | // Center of arc. | 
|  | final cx = 20; | 
|  | final cy = 20; | 
|  | // Arc centered at (20, 20) with radius 10 will go clockwise | 
|  | // from (20 + r, 20) to (20, 20 + r), which is 1/4 of a circle. | 
|  | context.arc(cx, cy, r, 0, pi / 2); | 
|  |  | 
|  | context.strokeStyle = 'green'; | 
|  | context.lineWidth = 2; | 
|  | context.stroke(); | 
|  |  | 
|  | // Center should not be filled. | 
|  | expectPixelUnfilled(cx, cy); | 
|  |  | 
|  | // (cx + r, cy) should be filled. | 
|  | expectPixelFilled(cx + r, cy, true); | 
|  | // (cx, cy + r) should be filled. | 
|  | expectPixelFilled(cx, cy + r, true); | 
|  | // (cx - r, cy) should be empty. | 
|  | expectPixelFilled(cx - r, cy, false); | 
|  | // (cx, cy - r) should be empty. | 
|  | expectPixelFilled(cx, cy - r, false); | 
|  |  | 
|  | // (cx + r/SQRT2, cy + r/SQRT2) should be filled. | 
|  | expectPixelFilled((cx + r / sqrt2).toInt(), (cy + r / sqrt2).toInt(), true); | 
|  |  | 
|  | // (cx - r/SQRT2, cy - r/SQRT2) should be empty. | 
|  | expectPixelFilled( | 
|  | (cx - r / sqrt2).toInt(), (cy + r / sqrt2).toInt(), false); | 
|  |  | 
|  | // (cx + r/SQRT2, cy + r/SQRT2) should be empty. | 
|  | expectPixelFilled( | 
|  | (cx - r / sqrt2).toInt(), (cy - r / sqrt2).toInt(), false); | 
|  |  | 
|  | // (cx - r/SQRT2, cy - r/SQRT2) should be empty. | 
|  | expectPixelFilled( | 
|  | (cx + r / sqrt2).toInt(), (cy - r / sqrt2).toInt(), false); | 
|  | }); | 
|  |  | 
|  | test('arc anticlockwise', () { | 
|  | context.beginPath(); | 
|  | final r = 10; | 
|  |  | 
|  | // Center of arc. | 
|  | final cx = 20; | 
|  | final cy = 20; | 
|  | // Arc centered at (20, 20) with radius 10 will go anticlockwise | 
|  | // from (20 + r, 20) to (20, 20 + r), which is 3/4 of a circle. | 
|  | // Because of the way arc work, when going anti-clockwise, the end points | 
|  | // are not included, so small values are added to radius to make a little | 
|  | // more than a 3/4 circle. | 
|  | context.arc(cx, cy, r, .1, pi / 2 - .1, true); | 
|  |  | 
|  | context.strokeStyle = 'green'; | 
|  | context.lineWidth = 2; | 
|  | context.stroke(); | 
|  |  | 
|  | // Center should not be filled. | 
|  | expectPixelUnfilled(cx, cy); | 
|  |  | 
|  | // (cx + r, cy) should be filled. | 
|  | expectPixelFilled(cx + r, cy, true); | 
|  | // (cx, cy + r) should be filled. | 
|  | expectPixelFilled(cx, cy + r, true); | 
|  | // (cx - r, cy) should be filled. | 
|  | expectPixelFilled(cx - r, cy, true); | 
|  | // (cx, cy - r) should be filled. | 
|  | expectPixelFilled(cx, cy - r, true); | 
|  |  | 
|  | // (cx + r/SQRT2, cy + r/SQRT2) should be empty. | 
|  | expectPixelFilled( | 
|  | (cx + r / sqrt2).toInt(), (cy + r / sqrt2).toInt(), false); | 
|  |  | 
|  | // (cx - r/SQRT2, cy - r/SQRT2) should be filled. | 
|  | expectPixelFilled((cx - r / sqrt2).toInt(), (cy + r / sqrt2).toInt(), true); | 
|  |  | 
|  | // (cx + r/SQRT2, cy + r/SQRT2) should be filled. | 
|  | expectPixelFilled((cx - r / sqrt2).toInt(), (cy - r / sqrt2).toInt(), true); | 
|  |  | 
|  | // (cx - r/SQRT2, cy - r/SQRT2) should be filled. | 
|  | expectPixelFilled((cx + r / sqrt2).toInt(), (cy - r / sqrt2).toInt(), true); | 
|  | }); | 
|  | } |