From b080ed1880a79fdbcf9b55a9f1946dc35fa4ea68 Mon Sep 17 00:00:00 2001 From: Harry Terkelsen Date: Fri, 11 Dec 2020 16:54:54 -0800 Subject: [PATCH] Pass angles for SweepGradient in degrees, not radians (flutter/engine#21677) --- .../lib/src/engine/canvaskit/shader.dart | 5 +- .../canvaskit/sweep_gradient_golden_test.dart | 75 +++++++++++++++++++ 2 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 engine/src/flutter/lib/web_ui/test/canvaskit/sweep_gradient_golden_test.dart diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/shader.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/shader.dart index efcecf9f1e7..549d46ddc1d 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/canvaskit/shader.dart +++ b/engine/src/flutter/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/engine/src/flutter/lib/web_ui/test/canvaskit/sweep_gradient_golden_test.dart b/engine/src/flutter/lib/web_ui/test/canvaskit/sweep_gradient_golden_test.dart new file mode 100644 index 00000000000..1e2d034206b --- /dev/null +++ b/engine/src/flutter/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); +}