diff --git a/lib/web_ui/dev/goldens_lock.yaml b/lib/web_ui/dev/goldens_lock.yaml index 4779b21430011..280ea2ccba9e0 100644 --- a/lib/web_ui/dev/goldens_lock.yaml +++ b/lib/web_ui/dev/goldens_lock.yaml @@ -1,2 +1,2 @@ repository: https://github.com/flutter/goldens.git -revision: ac75f12c6e93461369e1391da6cc20bf8cb08829 +revision: c808c28c81b6c3143ae969e8c49bed4a6d49aabb diff --git a/lib/web_ui/lib/src/engine/canvaskit/shader.dart b/lib/web_ui/lib/src/engine/canvaskit/shader.dart index efcecf9f1e70b..549d46ddc1d96 100644 --- a/lib/web_ui/lib/src/engine/canvaskit/shader.dart +++ b/lib/web_ui/lib/src/engine/canvaskit/shader.dart @@ -35,6 +35,7 @@ class CkGradientSweep extends CkShader implements ui.Gradient { @override SkShader createDefault() { + const double toDegrees = 180.0 / math.pi; return canvasKit.Shader.MakeSweepGradient( center.dx, center.dy, @@ -43,8 +44,8 @@ class CkGradientSweep extends CkShader implements ui.Gradient { toSkTileMode(tileMode), matrix4 != null ? toSkMatrixFromFloat32(matrix4!) : null, 0, - startAngle, - endAngle, + toDegrees * startAngle, + toDegrees * endAngle, ); } diff --git a/lib/web_ui/test/canvaskit/sweep_gradient_golden_test.dart b/lib/web_ui/test/canvaskit/sweep_gradient_golden_test.dart new file mode 100644 index 0000000000000..1e2d034206bfd --- /dev/null +++ b/lib/web_ui/test/canvaskit/sweep_gradient_golden_test.dart @@ -0,0 +1,75 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// @dart = 2.12 +import 'dart:math' as math; + +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; +import 'package:ui/src/engine.dart'; +import 'package:ui/ui.dart' as ui; + +import 'package:web_engine_tester/golden_tester.dart'; + +import 'common.dart'; + +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +const ui.Rect region = const ui.Rect.fromLTRB(0, 0, 500, 250); + +Future matchPictureGolden(String goldenFile, CkPicture picture, + {bool write = false}) async { + final EnginePlatformDispatcher dispatcher = + ui.window.platformDispatcher as EnginePlatformDispatcher; + final LayerSceneBuilder sb = LayerSceneBuilder(); + sb.pushOffset(0, 0); + sb.addPicture(ui.Offset.zero, picture); + dispatcher.rasterizer!.draw(sb.build().layerTree); + await matchGoldenFile(goldenFile, region: region, write: write); +} + +void testMain() { + group('SweepGradient', () { + setUpCanvasKitTest(); + + test('is correctly rendered', () async { + final CkPictureRecorder recorder = CkPictureRecorder(); + final CkCanvas canvas = recorder.beginRecording(region); + + final CkGradientSweep gradient = CkGradientSweep( + ui.Offset(250, 125), + [ + ui.Color(0xFF4285F4), + ui.Color(0xFF34A853), + ui.Color(0xFFFBBC05), + ui.Color(0xFFEA4335), + ui.Color(0xFF4285F4), + ], + [ + 0.0, + 0.25, + 0.5, + 0.75, + 1.0, + ], + ui.TileMode.clamp, + -(math.pi / 2), + math.pi * 2 - (math.pi / 2), + null); + + final CkPaint paint = CkPaint()..shader = gradient; + + canvas.drawRect(region, paint); + + await matchPictureGolden( + 'canvaskit_sweep_gradient.png', + recorder.endRecording(), + ); + }); + // TODO: https://github.com/flutter/flutter/issues/60040 + // TODO: https://github.com/flutter/flutter/issues/71520 + }, skip: isIosSafari || isFirefox); +}