From 0a40f3d784f7e671b5b5b26d019654eddad7fc7a Mon Sep 17 00:00:00 2001 From: Chinmay Garde Date: Wed, 11 Dec 2019 15:17:34 -0800 Subject: [PATCH] Assert that arc end caps on canvases with root surface transformations are drawn correctly. (#14359) Verifies that the Skia commit https://skia-review.googlesource.com/c/skia/+/259174 has been pulled into the engine. This should have happened in the roll https://github.com/flutter/engine/pull/14345. Fixes https://github.com/flutter/flutter/issues/46691 Fixes b/142280381 --- ci/licenses_golden/licenses_flutter | 1 + shell/platform/embedder/BUILD.gn | 1 + .../embedder/fixtures/arc_end_caps.png | Bin 0 -> 6006 bytes shell/platform/embedder/fixtures/main.dart | 27 ++++++++++++ .../embedder/tests/embedder_unittests.cc | 41 ++++++++++++++++++ 5 files changed, 70 insertions(+) create mode 100644 shell/platform/embedder/fixtures/arc_end_caps.png diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 681868ba215f..9a2ccfceda88 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -908,6 +908,7 @@ FILE: ../../../flutter/shell/platform/embedder/embedder_task_runner.cc FILE: ../../../flutter/shell/platform/embedder/embedder_task_runner.h FILE: ../../../flutter/shell/platform/embedder/embedder_thread_host.cc FILE: ../../../flutter/shell/platform/embedder/embedder_thread_host.h +FILE: ../../../flutter/shell/platform/embedder/fixtures/arc_end_caps.png FILE: ../../../flutter/shell/platform/embedder/fixtures/compositor.png FILE: ../../../flutter/shell/platform/embedder/fixtures/compositor_root_surface_xformation.png FILE: ../../../flutter/shell/platform/embedder/fixtures/compositor_software.png diff --git a/shell/platform/embedder/BUILD.gn b/shell/platform/embedder/BUILD.gn index abb7fe16c4d9..539b4d48cc04 100644 --- a/shell/platform/embedder/BUILD.gn +++ b/shell/platform/embedder/BUILD.gn @@ -88,6 +88,7 @@ config("embedder_prefix_config") { test_fixtures("fixtures") { dart_main = "fixtures/main.dart" fixtures = [ + "fixtures/arc_end_caps.png", "fixtures/compositor.png", "fixtures/compositor_root_surface_xformation.png", "fixtures/compositor_software.png", diff --git a/shell/platform/embedder/fixtures/arc_end_caps.png b/shell/platform/embedder/fixtures/arc_end_caps.png new file mode 100644 index 0000000000000000000000000000000000000000..149eea084895d2d90a42fa2d6e1af5313966a4cd GIT binary patch literal 6006 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 literal 0 HcmV?d00001 diff --git a/shell/platform/embedder/fixtures/main.dart b/shell/platform/embedder/fixtures/main.dart index d7dd20d7295e..b2ac3928b105 100644 --- a/shell/platform/embedder/fixtures/main.dart +++ b/shell/platform/embedder/fixtures/main.dart @@ -620,3 +620,30 @@ void scene_with_no_container() { }; window.scheduleFrame(); } + +Picture CreateArcEndCapsPicture() { + PictureRecorder baseRecorder = PictureRecorder(); + Canvas canvas = Canvas(baseRecorder); + + var style = Paint() + ..strokeWidth = 12.0 + ..style = PaintingStyle.stroke + ..strokeCap = StrokeCap.round + ..strokeJoin = StrokeJoin.miter; + + style.color = Color.fromARGB(255, 255, 0, 0); + canvas.drawArc(Rect.fromLTRB(0.0, 0.0, 500.0, 500.0), 1.57, 1.0, false, style); + + return baseRecorder.endRecording(); + +} + +@pragma('vm:entry-point') +void arc_end_caps_correct() { + window.onBeginFrame = (Duration duration) { + SceneBuilder builder = SceneBuilder(); + builder.addPicture(Offset(0.0, 0.0), CreateArcEndCapsPicture()); + window.render(builder.build()); + }; + window.scheduleFrame(); +} diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index 3631dee2563a..f899d3f7b39e 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -3550,5 +3550,46 @@ TEST_F(EmbedderTest, SceneWithNoRootContainerIsAcceptable) { latch.Wait(); } +// Verifies that https://skia-review.googlesource.com/c/skia/+/259174 is pulled +// into the engine. +TEST_F(EmbedderTest, ArcEndCapsAreDrawnCorrectly) { + auto& context = GetEmbedderContext(); + + EmbedderConfigBuilder builder(context); + builder.SetOpenGLRendererConfig(SkISize::Make(800, 1024)); + builder.SetCompositor(); + builder.SetDartEntrypoint("arc_end_caps_correct"); + + const auto root_surface_transformation = SkMatrix() + .preScale(1.0, -1.0) + .preTranslate(1024.0, -800.0) + .preRotate(90.0); + + context.SetRootSurfaceTransformation(root_surface_transformation); + + auto engine = builder.LaunchEngine(); + + fml::AutoResetWaitableEvent latch; + sk_sp scene_image; + context.SetNextSceneCallback([&](sk_sp scene) { + scene_image = std::move(scene); + latch.Signal(); + }); + + ASSERT_TRUE(engine.is_valid()); + + FlutterWindowMetricsEvent event = {}; + event.struct_size = sizeof(event); + event.width = 1024; + event.height = 800; + event.pixel_ratio = 1.0; + ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), + kSuccess); + + latch.Wait(); + + ASSERT_TRUE(ImageMatchesFixture("arc_end_caps.png", scene_image)); +} + } // namespace testing } // namespace flutter