From 945bb0d94df96af30e5bdbd198605dc7ebb104dd Mon Sep 17 00:00:00 2001 From: Dan Field Date: Mon, 3 Apr 2023 17:03:08 -0700 Subject: [PATCH 1/5] Exit early on invalid gn CPU argument combos for simulators --- tools/gn | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/tools/gn b/tools/gn index b6c603e9949d9..5d302127ea590 100755 --- a/tools/gn +++ b/tools/gn @@ -85,15 +85,6 @@ def to_command_line(gn_args): return [merge(x, y) for x, y in gn_args.items()] -def cpu_for_target_arch(arch): - if arch in ['ia32', 'x86', 'arm', 'armv6', 'armv5te', 'mips', 'simarm', - 'simarmv6', 'simarmv5te', 'simmips', 'simdbc', 'armsimdbc']: - return 'x86' - if arch in ['x64', 'arm64', 'simarm64', 'simdbc64', 'armsimdbc64']: - return 'x64' - return None - - def is_host_build(args): # If target_os == None, then this is a host build. if args.target_os is None: @@ -1040,8 +1031,27 @@ def parse_args(args): return parser.parse_args(args) +def validate_args(args): + valid = True + if args.simulator: + if args.mac_cpu != 'x64': + print( + "Specified a non-default mac-cpu for a simulator build. Did you mean to use `--simulator-cpu`?" + ) + valid = False + if args.ios_cpu != 'arm64': + print( + "Specified a non-default ios-cpu for a simulator build. Did you mean to use `--simulator-cpu`?" + ) + valid = False + + if not valid: + sys.exit(-1) + + def main(argv): args = parse_args(argv) + validate_args(args) exe = '.exe' if sys.platform.startswith(('cygwin', 'win')) else '' From 11e821ec2027bf2917d02c36f7559703b52dde0b Mon Sep 17 00:00:00 2001 From: Dan Field Date: Mon, 3 Apr 2023 17:22:31 -0700 Subject: [PATCH 2/5] long strings --- tools/gn | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/gn b/tools/gn index 5d302127ea590..366ec6bdd3ad4 100755 --- a/tools/gn +++ b/tools/gn @@ -1036,12 +1036,14 @@ def validate_args(args): if args.simulator: if args.mac_cpu != 'x64': print( - "Specified a non-default mac-cpu for a simulator build. Did you mean to use `--simulator-cpu`?" + 'Specified a non-default mac-cpu for a simulator build. Did you mean ' + 'to use `--simulator-cpu`?' ) valid = False if args.ios_cpu != 'arm64': print( - "Specified a non-default ios-cpu for a simulator build. Did you mean to use `--simulator-cpu`?" + 'Specified a non-default ios-cpu for a simulator build. Did you mean ' + 'to use `--simulator-cpu`?' ) valid = False From d932742a572085f718cb21d6c226aaae56ecc0a7 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Tue, 4 Apr 2023 10:47:29 -0700 Subject: [PATCH 3/5] Fix coverage for strokes when transform has negative values and stroke has round caps --- impeller/aiks/aiks_unittests.cc | 28 ++++++++++++++++++++++++++++ impeller/entity/entity_unittests.cc | 16 ++++++++++++++++ impeller/entity/geometry.cc | 12 +++++++----- 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc index f8db238978e00..c3d2295b72510 100644 --- a/impeller/aiks/aiks_unittests.cc +++ b/impeller/aiks/aiks_unittests.cc @@ -47,6 +47,34 @@ using AiksTest = AiksPlayground; #endif INSTANTIATE_PLAYGROUND_SUITE(AiksTest); +TEST_P(AiksTest, RotateColorFilteredPath) { + Canvas canvas; + canvas.Concat(Matrix::MakeTranslation({300, 300})); + canvas.Concat(Matrix::MakeRotationZ(Radians(kPiOver2))); + auto arrow_stem = + PathBuilder{}.MoveTo({120, 190}).LineTo({120, 50}).TakePath(); + auto arrow_head = PathBuilder{} + .MoveTo({50, 120}) + .LineTo({120, 190}) + .LineTo({190, 120}) + .TakePath(); + auto paint = Paint{ + .stroke_width = 15.0, + .stroke_cap = Cap::kRound, + .stroke_join = Join::kRound, + .style = Paint::Style::kStroke, + .color_filter = + [](FilterInput::Ref input) { + return ColorFilterContents::MakeBlend( + BlendMode::kSourceIn, {std::move(input)}, Color::White()); + }, + }; + + canvas.DrawPath(arrow_stem, paint); + canvas.DrawPath(arrow_head, paint); + ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture())); +} + TEST_P(AiksTest, CanvasCTMCanBeUpdated) { Canvas canvas; Matrix identity; diff --git a/impeller/entity/entity_unittests.cc b/impeller/entity/entity_unittests.cc index ab4ab77b1d9de..5353417ea5095 100644 --- a/impeller/entity/entity_unittests.cc +++ b/impeller/entity/entity_unittests.cc @@ -2467,5 +2467,21 @@ TEST_P(EntityTest, ColorFilterWithForegroundColorAdvancedBlend) { ASSERT_TRUE(OpenPlaygroundHere(callback)); } +TEST_P(EntityTest, CoverageForStrokePathWithNegativeValuesInTransform) { + auto arrow_head = PathBuilder{} + .MoveTo({50, 120}) + .LineTo({120, 190}) + .LineTo({190, 120}) + .TakePath(); + auto geometry = Geometry::MakeStrokePath(arrow_head, 15.0, 4.0, Cap::kRound, + Join::kRound); + + auto transform = Matrix::MakeTranslation({300, 300}) * + Matrix::MakeRotationZ(Radians(kPiOver2)); + EXPECT_LT(transform.e[0][0], 0.f); + auto coverage = geometry->GetCoverage(transform); + ASSERT_RECT_NEAR(coverage.value(), Rect::MakeXYWH(102.5, 342.5, 85, 155)); +} + } // namespace testing } // namespace impeller diff --git a/impeller/entity/geometry.cc b/impeller/entity/geometry.cc index 7e8ed784cb4da..58d4697119e1e 100644 --- a/impeller/entity/geometry.cc +++ b/impeller/entity/geometry.cc @@ -620,12 +620,14 @@ std::optional StrokePathGeometry::GetCoverage( return std::nullopt; } Scalar min_size = 1.0f / sqrt(std::abs(determinant)); - Vector2 max_radius_xy = transform.TransformDirection( - Vector2(max_radius, max_radius) * std::max(stroke_width_, min_size)); - + Vector2 max_radius_xy = + transform + .TransformDirection(Vector2(max_radius, max_radius) * + std::max(stroke_width_, min_size)) + .Abs(); return Rect(path_coverage.origin - max_radius_xy, - Size(path_coverage.size.width + max_radius_xy.x * 2, - path_coverage.size.height + max_radius_xy.y * 2)); + Size(path_coverage.size.width + std::abs(max_radius_xy.x * 2), + path_coverage.size.height + std::abs(max_radius_xy.y * 2))); } /////// Cover Geometry /////// From 83465cf792cce5d939b94a8da813a89719756e51 Mon Sep 17 00:00:00 2001 From: Dan Field Date: Tue, 4 Apr 2023 10:52:33 -0700 Subject: [PATCH 4/5] stray code --- impeller/entity/geometry.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/impeller/entity/geometry.cc b/impeller/entity/geometry.cc index 58d4697119e1e..612d9cb3a1af2 100644 --- a/impeller/entity/geometry.cc +++ b/impeller/entity/geometry.cc @@ -626,8 +626,8 @@ std::optional StrokePathGeometry::GetCoverage( std::max(stroke_width_, min_size)) .Abs(); return Rect(path_coverage.origin - max_radius_xy, - Size(path_coverage.size.width + std::abs(max_radius_xy.x * 2), - path_coverage.size.height + std::abs(max_radius_xy.y * 2))); + Size(path_coverage.size.width + max_radius_xy.x * 2, + path_coverage.size.height + max_radius_xy.y * 2)); } /////// Cover Geometry /////// From 89e24d777c42ac9f69238c51d4523a7b555fd62f Mon Sep 17 00:00:00 2001 From: Dan Field Date: Tue, 4 Apr 2023 20:51:31 -0700 Subject: [PATCH 5/5] Update aiks_unittests.cc --- impeller/aiks/aiks_unittests.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc index c2b95985a6959..eebf34fe76db2 100644 --- a/impeller/aiks/aiks_unittests.cc +++ b/impeller/aiks/aiks_unittests.cc @@ -66,7 +66,7 @@ TEST_P(AiksTest, RotateColorFilteredPath) { .color_filter = [](FilterInput::Ref input) { return ColorFilterContents::MakeBlend( - BlendMode::kSourceIn, {std::move(input)}, Color::White()); + BlendMode::kSourceIn, {std::move(input)}, Color::AliceBlue()); }, };