diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 681868ba215f5..9a2ccfceda885 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 abb7fe16c4d9f..539b4d48cc045 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 0000000000000..149eea084895d Binary files /dev/null and b/shell/platform/embedder/fixtures/arc_end_caps.png differ diff --git a/shell/platform/embedder/fixtures/main.dart b/shell/platform/embedder/fixtures/main.dart index d7dd20d7295ee..b2ac3928b105c 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 3631dee2563ab..f899d3f7b39e0 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