From 86ba0b1b9475fa179e1d4bce7182ce71f0d5a4cb Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 19 Jun 2020 13:49:02 -0700 Subject: [PATCH 1/8] GetBoundingRectAfterMutations --- flow/BUILD.gn | 1 + flow/embedd_view_params_unittests.cc | 121 +++++++++++++++++++++++++++ flow/embedded_views.h | 27 ++++++ 3 files changed, 149 insertions(+) create mode 100644 flow/embedd_view_params_unittests.cc diff --git a/flow/BUILD.gn b/flow/BUILD.gn index a8c3592ccecbf..6fcd3e6cf9082 100644 --- a/flow/BUILD.gn +++ b/flow/BUILD.gn @@ -130,6 +130,7 @@ executable("flow_unittests") { testonly = true sources = [ + "embedd_view_params_unittests.cc", "flow_run_all_unittests.cc", "flow_test_utils.cc", "flow_test_utils.h", diff --git a/flow/embedd_view_params_unittests.cc b/flow/embedd_view_params_unittests.cc new file mode 100644 index 0000000000000..7c2d72452cb4d --- /dev/null +++ b/flow/embedd_view_params_unittests.cc @@ -0,0 +1,121 @@ +// 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. + +#include "flutter/flow/embedded_views.h" +#include "gtest/gtest.h" +#include "flutter/fml/logging.h" + + +namespace flutter { +namespace testing { + +TEST(EmbeddedViewParams, GetBoundingRectWithNoMutations) { + MutatorsStack stack; + EmbeddedViewParams params; + params.sizePoints = SkSize::Make(1, 1);; + params.offsetPixels = SkPoint::Make(0, 0); + params.mutatorsStack = stack; + + SkRect rect = params.GetBoundingRect(); + ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), 0)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 0)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), 1)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.height(), 1)); +} + +TEST(EmbeddedViewParams, GetBoundingRectWithScale) { + MutatorsStack stack; + SkMatrix scale = SkMatrix::Scale(2, 2); + stack.PushTransform(scale); + + EmbeddedViewParams params; + params.sizePoints = SkSize::Make(1, 1);; + params.offsetPixels = SkPoint::Make(0, 0); + params.mutatorsStack = stack; + + SkRect rect = params.GetBoundingRect(); + ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), 0)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 0)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), 2)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.height(), 2)); +} + +TEST(EmbeddedViewParams, GetBoundingRectWithTranslate) { + MutatorsStack stack; + SkMatrix trans = SkMatrix::MakeTrans(1, 1); + stack.PushTransform(trans); + + EmbeddedViewParams params; + params.sizePoints = SkSize::Make(1, 1);; + params.offsetPixels = SkPoint::Make(0, 0); + params.mutatorsStack = stack; + + SkRect rect = params.GetBoundingRect(); + ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), 1)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 1)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), 1)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.height(), 1)); +} + +TEST(EmbeddedViewParams, GetBoundingRectWithRotation90) { + MutatorsStack stack; + SkMatrix rotate; + rotate.setRotate(90); + stack.PushTransform(rotate); + + EmbeddedViewParams params; + params.sizePoints = SkSize::Make(1, 1);; + params.offsetPixels = SkPoint::Make(0, 0); + params.mutatorsStack = stack; + + SkRect rect = params.GetBoundingRect(); + FML_DLOG(ERROR) << rect.x(); + ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), -1)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 0)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), 1)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.height(), 1)); +} + +TEST(EmbeddedViewParams, GetBoundingRectWithRotation45) { + MutatorsStack stack; + SkMatrix rotate; + rotate.setRotate(45); + stack.PushTransform(rotate); + + EmbeddedViewParams params; + params.sizePoints = SkSize::Make(1, 1);; + params.offsetPixels = SkPoint::Make(0, 0); + params.mutatorsStack = stack; + + SkRect rect = params.GetBoundingRect(); + ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), -sqrt(2)/2)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 0)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), sqrt(2))); + ASSERT_TRUE(SkScalarNearlyEqual(rect.height(), sqrt(2))); +} + +TEST(EmbeddedViewParams, GetBoundingRectWithTranslateScalingAndRotation) { + MutatorsStack stack; + SkMatrix translate = SkMatrix::MakeTrans(2, 2); + SkMatrix scale = SkMatrix::MakeScale(3, 3); + SkMatrix rotate; + rotate.setRotate(90); + stack.PushTransform(translate); + stack.PushTransform(scale); + stack.PushTransform(rotate); + + EmbeddedViewParams params; + params.sizePoints = SkSize::Make(1, 1);; + params.offsetPixels = SkPoint::Make(0, 0); + params.mutatorsStack = stack; + + SkRect rect = params.GetBoundingRect(); + ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), -1)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 2)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), 3)); + ASSERT_TRUE(SkScalarNearlyEqual(rect.height(), 3)); +} + +} // namespace testing +} // namespace flutter diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 8bbef5a0a3f4d..b6159b0caefcd 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -201,6 +201,33 @@ class EmbeddedViewParams { sizePoints == other.sizePoints && mutatorsStack == other.mutatorsStack; } + + // Clippings are ignored in this operation + // TODO(cyanglaz): Factoring clipping. + // + SkRect GetBoundingRectAfterMutations() const { + SkPath path; + SkRect starting_rect = SkRect::MakeSize(sizePoints); + path.addRect(starting_rect); + std::vector>::const_reverse_iterator iter = + mutatorsStack.Bottom(); + while (iter != mutatorsStack.Top()) { + switch ((*iter)->GetType()) { + case transform: { + const SkMatrix& matrix = (*iter)->GetMatrix(); + path.transform(matrix); + break; + } + case clip_rect: + case clip_rrect: + case clip_path: + case opacity: + break; + } + ++iter; + } + return path.computeTightBounds(); + } }; enum class PostPrerollResult { kResubmitFrame, kSuccess }; From 2752b1954bbdc4a9775695702bb82cc3bc978314 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 19 Jun 2020 13:49:34 -0700 Subject: [PATCH 2/8] link todo to issue --- flow/embedded_views.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index b6159b0caefcd..69ceef3a7d912 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -204,7 +204,7 @@ class EmbeddedViewParams { // Clippings are ignored in this operation // TODO(cyanglaz): Factoring clipping. - // + // https://github.com/flutter/flutter/issues/59821 SkRect GetBoundingRectAfterMutations() const { SkPath path; SkRect starting_rect = SkRect::MakeSize(sizePoints); From 617ead72176e3f6cd7677d276cbbc140c0d09281 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 19 Jun 2020 13:52:59 -0700 Subject: [PATCH 3/8] fix typo --- flow/BUILD.gn | 2 +- ...ew_params_unittests.cc => embedded_view_params_unittests.cc} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename flow/{embedd_view_params_unittests.cc => embedded_view_params_unittests.cc} (100%) diff --git a/flow/BUILD.gn b/flow/BUILD.gn index 6fcd3e6cf9082..85c55d2cfba0b 100644 --- a/flow/BUILD.gn +++ b/flow/BUILD.gn @@ -130,7 +130,7 @@ executable("flow_unittests") { testonly = true sources = [ - "embedd_view_params_unittests.cc", + "embedded_view_params_unittests.cc", "flow_run_all_unittests.cc", "flow_test_utils.cc", "flow_test_utils.h", diff --git a/flow/embedd_view_params_unittests.cc b/flow/embedded_view_params_unittests.cc similarity index 100% rename from flow/embedd_view_params_unittests.cc rename to flow/embedded_view_params_unittests.cc From 60d9b7beab71b8779cd42266231c91c98f867bcb Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 19 Jun 2020 14:03:04 -0700 Subject: [PATCH 4/8] fix unittest typo --- flow/embedded_view_params_unittests.cc | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/flow/embedded_view_params_unittests.cc b/flow/embedded_view_params_unittests.cc index 7c2d72452cb4d..ca191bf0bb187 100644 --- a/flow/embedded_view_params_unittests.cc +++ b/flow/embedded_view_params_unittests.cc @@ -10,21 +10,21 @@ namespace flutter { namespace testing { -TEST(EmbeddedViewParams, GetBoundingRectWithNoMutations) { +TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithNoMutations) { MutatorsStack stack; EmbeddedViewParams params; params.sizePoints = SkSize::Make(1, 1);; params.offsetPixels = SkPoint::Make(0, 0); params.mutatorsStack = stack; - SkRect rect = params.GetBoundingRect(); + SkRect rect = params.GetBoundingRectAfterMutations(); ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), 0)); ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 0)); ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), 1)); ASSERT_TRUE(SkScalarNearlyEqual(rect.height(), 1)); } -TEST(EmbeddedViewParams, GetBoundingRectWithScale) { +TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithScale) { MutatorsStack stack; SkMatrix scale = SkMatrix::Scale(2, 2); stack.PushTransform(scale); @@ -34,14 +34,14 @@ TEST(EmbeddedViewParams, GetBoundingRectWithScale) { params.offsetPixels = SkPoint::Make(0, 0); params.mutatorsStack = stack; - SkRect rect = params.GetBoundingRect(); + SkRect rect = params.GetBoundingRectAfterMutations(); ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), 0)); ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 0)); ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), 2)); ASSERT_TRUE(SkScalarNearlyEqual(rect.height(), 2)); } -TEST(EmbeddedViewParams, GetBoundingRectWithTranslate) { +TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithTranslate) { MutatorsStack stack; SkMatrix trans = SkMatrix::MakeTrans(1, 1); stack.PushTransform(trans); @@ -51,14 +51,14 @@ TEST(EmbeddedViewParams, GetBoundingRectWithTranslate) { params.offsetPixels = SkPoint::Make(0, 0); params.mutatorsStack = stack; - SkRect rect = params.GetBoundingRect(); + SkRect rect = params.GetBoundingRectAfterMutations(); ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), 1)); ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 1)); ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), 1)); ASSERT_TRUE(SkScalarNearlyEqual(rect.height(), 1)); } -TEST(EmbeddedViewParams, GetBoundingRectWithRotation90) { +TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithRotation90) { MutatorsStack stack; SkMatrix rotate; rotate.setRotate(90); @@ -69,7 +69,7 @@ TEST(EmbeddedViewParams, GetBoundingRectWithRotation90) { params.offsetPixels = SkPoint::Make(0, 0); params.mutatorsStack = stack; - SkRect rect = params.GetBoundingRect(); + SkRect rect = params.GetBoundingRectAfterMutations(); FML_DLOG(ERROR) << rect.x(); ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), -1)); ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 0)); @@ -77,7 +77,7 @@ TEST(EmbeddedViewParams, GetBoundingRectWithRotation90) { ASSERT_TRUE(SkScalarNearlyEqual(rect.height(), 1)); } -TEST(EmbeddedViewParams, GetBoundingRectWithRotation45) { +TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithRotation45) { MutatorsStack stack; SkMatrix rotate; rotate.setRotate(45); @@ -88,14 +88,14 @@ TEST(EmbeddedViewParams, GetBoundingRectWithRotation45) { params.offsetPixels = SkPoint::Make(0, 0); params.mutatorsStack = stack; - SkRect rect = params.GetBoundingRect(); + SkRect rect = params.GetBoundingRectAfterMutations(); ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), -sqrt(2)/2)); ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 0)); ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), sqrt(2))); ASSERT_TRUE(SkScalarNearlyEqual(rect.height(), sqrt(2))); } -TEST(EmbeddedViewParams, GetBoundingRectWithTranslateScalingAndRotation) { +TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithTranslateScalingAndRotation) { MutatorsStack stack; SkMatrix translate = SkMatrix::MakeTrans(2, 2); SkMatrix scale = SkMatrix::MakeScale(3, 3); @@ -110,7 +110,7 @@ TEST(EmbeddedViewParams, GetBoundingRectWithTranslateScalingAndRotation) { params.offsetPixels = SkPoint::Make(0, 0); params.mutatorsStack = stack; - SkRect rect = params.GetBoundingRect(); + SkRect rect = params.GetBoundingRectAfterMutations(); ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), -1)); ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 2)); ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), 3)); From 9eb1d3a1d0d955233686d614ab0a9ecc1db9747f Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 19 Jun 2020 17:15:06 -0700 Subject: [PATCH 5/8] cache make bounding rect --- flow/embedded_view_params_unittests.cc | 89 +++++++------------ flow/embedded_views.h | 70 +++++++-------- flow/layers/platform_view_layer.cc | 7 +- .../framework/Source/FlutterPlatformViews.mm | 7 +- shell/platform/embedder/embedder_layers.cc | 10 +-- 5 files changed, 79 insertions(+), 104 deletions(-) diff --git a/flow/embedded_view_params_unittests.cc b/flow/embedded_view_params_unittests.cc index ca191bf0bb187..cb94936e17ddf 100644 --- a/flow/embedded_view_params_unittests.cc +++ b/flow/embedded_view_params_unittests.cc @@ -3,21 +3,18 @@ // found in the LICENSE file. #include "flutter/flow/embedded_views.h" -#include "gtest/gtest.h" #include "flutter/fml/logging.h" - +#include "gtest/gtest.h" namespace flutter { namespace testing { TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithNoMutations) { MutatorsStack stack; - EmbeddedViewParams params; - params.sizePoints = SkSize::Make(1, 1);; - params.offsetPixels = SkPoint::Make(0, 0); - params.mutatorsStack = stack; + SkMatrix matrix; - SkRect rect = params.GetBoundingRectAfterMutations(); + EmbeddedViewParams params(matrix, SkSize::Make(1, 1), stack); + const SkRect& rect = params.finalBoundingRect(); ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), 0)); ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 0)); ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), 1)); @@ -26,15 +23,11 @@ TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithNoMutations) { TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithScale) { MutatorsStack stack; - SkMatrix scale = SkMatrix::Scale(2, 2); - stack.PushTransform(scale); - - EmbeddedViewParams params; - params.sizePoints = SkSize::Make(1, 1);; - params.offsetPixels = SkPoint::Make(0, 0); - params.mutatorsStack = stack; + SkMatrix matrix = SkMatrix::Scale(2, 2); + stack.PushTransform(matrix); - SkRect rect = params.GetBoundingRectAfterMutations(); + EmbeddedViewParams params(matrix, SkSize::Make(1, 1), stack); + const SkRect& rect = params.finalBoundingRect(); ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), 0)); ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 0)); ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), 2)); @@ -43,15 +36,11 @@ TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithScale) { TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithTranslate) { MutatorsStack stack; - SkMatrix trans = SkMatrix::MakeTrans(1, 1); - stack.PushTransform(trans); + SkMatrix matrix = SkMatrix::MakeTrans(1, 1); + stack.PushTransform(matrix); - EmbeddedViewParams params; - params.sizePoints = SkSize::Make(1, 1);; - params.offsetPixels = SkPoint::Make(0, 0); - params.mutatorsStack = stack; - - SkRect rect = params.GetBoundingRectAfterMutations(); + EmbeddedViewParams params(matrix, SkSize::Make(1, 1), stack); + const SkRect& rect = params.finalBoundingRect(); ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), 1)); ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 1)); ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), 1)); @@ -60,16 +49,13 @@ TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithTranslate) { TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithRotation90) { MutatorsStack stack; - SkMatrix rotate; - rotate.setRotate(90); - stack.PushTransform(rotate); + SkMatrix matrix; + matrix.setRotate(90); + stack.PushTransform(matrix); - EmbeddedViewParams params; - params.sizePoints = SkSize::Make(1, 1);; - params.offsetPixels = SkPoint::Make(0, 0); - params.mutatorsStack = stack; + EmbeddedViewParams params(matrix, SkSize::Make(1, 1), stack); + const SkRect& rect = params.finalBoundingRect(); - SkRect rect = params.GetBoundingRectAfterMutations(); FML_DLOG(ERROR) << rect.x(); ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), -1)); ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 0)); @@ -79,38 +65,29 @@ TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithRotation90) { TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithRotation45) { MutatorsStack stack; - SkMatrix rotate; - rotate.setRotate(45); - stack.PushTransform(rotate); - - EmbeddedViewParams params; - params.sizePoints = SkSize::Make(1, 1);; - params.offsetPixels = SkPoint::Make(0, 0); - params.mutatorsStack = stack; + SkMatrix matrix; + matrix.setRotate(45); + stack.PushTransform(matrix); - SkRect rect = params.GetBoundingRectAfterMutations(); - ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), -sqrt(2)/2)); + EmbeddedViewParams params(matrix, SkSize::Make(1, 1), stack); + const SkRect& rect = params.finalBoundingRect(); + ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), -sqrt(2) / 2)); ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 0)); ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), sqrt(2))); ASSERT_TRUE(SkScalarNearlyEqual(rect.height(), sqrt(2))); } -TEST(EmbeddedViewParams, GetBoundingRectAfterMutationsWithTranslateScalingAndRotation) { +TEST(EmbeddedViewParams, + GetBoundingRectAfterMutationsWithTranslateScaleAndRotation) { + SkMatrix matrix = SkMatrix::MakeTrans(2, 2); + matrix.preScale(3, 3); + matrix.preRotate(90); + MutatorsStack stack; - SkMatrix translate = SkMatrix::MakeTrans(2, 2); - SkMatrix scale = SkMatrix::MakeScale(3, 3); - SkMatrix rotate; - rotate.setRotate(90); - stack.PushTransform(translate); - stack.PushTransform(scale); - stack.PushTransform(rotate); - - EmbeddedViewParams params; - params.sizePoints = SkSize::Make(1, 1);; - params.offsetPixels = SkPoint::Make(0, 0); - params.mutatorsStack = stack; - - SkRect rect = params.GetBoundingRectAfterMutations(); + stack.PushTransform(matrix); + + EmbeddedViewParams params(matrix, SkSize::Make(1, 1), stack); + const SkRect& rect = params.finalBoundingRect(); ASSERT_TRUE(SkScalarNearlyEqual(rect.x(), -1)); ASSERT_TRUE(SkScalarNearlyEqual(rect.y(), 2)); ASSERT_TRUE(SkScalarNearlyEqual(rect.width(), 3)); diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 69ceef3a7d912..1fbf4454f89de 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -186,48 +186,48 @@ class EmbeddedViewParams { public: EmbeddedViewParams() = default; + EmbeddedViewParams(SkMatrix matrix, + SkSize size_points, + MutatorsStack mutators_stack) + : matrix_(matrix), + size_points_(size_points), + mutators_stack_(mutators_stack) { + offset_pixels_ = + SkPoint::Make(matrix.getTranslateX(), matrix.getTranslateY()); + SkPath path; + SkRect starting_rect = SkRect::MakeSize(size_points); + path.addRect(starting_rect); + path.transform(matrix); + final_bounding_rect_ = path.computeTightBounds(); + } + EmbeddedViewParams(const EmbeddedViewParams& other) { - offsetPixels = other.offsetPixels; - sizePoints = other.sizePoints; - mutatorsStack = other.mutatorsStack; + offset_pixels_ = other.offset_pixels_; + size_points_ = other.size_points_; + mutators_stack_ = other.mutators_stack_; + matrix_ = other.matrix_; + final_bounding_rect_ = other.final_bounding_rect_; }; - SkPoint offsetPixels; - SkSize sizePoints; - MutatorsStack mutatorsStack; + const SkPoint& offsetPixels() const { return offset_pixels_; }; + const SkSize& sizePoints() const { return size_points_; }; + const MutatorsStack& mutatorsStack() const { return mutators_stack_; }; + const SkRect& finalBoundingRect() const { return final_bounding_rect_; } bool operator==(const EmbeddedViewParams& other) const { - return offsetPixels == other.offsetPixels && - sizePoints == other.sizePoints && - mutatorsStack == other.mutatorsStack; + return offset_pixels_ == other.offset_pixels_ && + size_points_ == other.size_points_ && + mutators_stack_ == other.mutators_stack_ && + final_bounding_rect_ == other.final_bounding_rect_ && + matrix_ == other.matrix_; } - // Clippings are ignored in this operation - // TODO(cyanglaz): Factoring clipping. - // https://github.com/flutter/flutter/issues/59821 - SkRect GetBoundingRectAfterMutations() const { - SkPath path; - SkRect starting_rect = SkRect::MakeSize(sizePoints); - path.addRect(starting_rect); - std::vector>::const_reverse_iterator iter = - mutatorsStack.Bottom(); - while (iter != mutatorsStack.Top()) { - switch ((*iter)->GetType()) { - case transform: { - const SkMatrix& matrix = (*iter)->GetMatrix(); - path.transform(matrix); - break; - } - case clip_rect: - case clip_rrect: - case clip_path: - case opacity: - break; - } - ++iter; - } - return path.computeTightBounds(); - } + private: + SkMatrix matrix_; + SkPoint offset_pixels_; + SkSize size_points_; + MutatorsStack mutators_stack_; + SkRect final_bounding_rect_; }; enum class PostPrerollResult { kResubmitFrame, kSuccess }; diff --git a/flow/layers/platform_view_layer.cc b/flow/layers/platform_view_layer.cc index 81c40a99f0d89..551a270b16542 100644 --- a/flow/layers/platform_view_layer.cc +++ b/flow/layers/platform_view_layer.cc @@ -27,11 +27,8 @@ void PlatformViewLayer::Preroll(PrerollContext* context, } context->has_platform_view = true; std::unique_ptr params = - std::make_unique(); - params->offsetPixels = - SkPoint::Make(matrix.getTranslateX(), matrix.getTranslateY()); - params->sizePoints = size_; - params->mutatorsStack = context->mutators_stack; + std::make_unique(matrix, size_, + context->mutators_stack); context->view_embedder->PrerollCompositeEmbeddedView(view_id_, std::move(params)); } diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index f590701e7e2cb..474e9f084c1ee 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -407,13 +407,14 @@ void FlutterPlatformViewsController::CompositeWithParams(int view_id, const EmbeddedViewParams& params) { - CGRect frame = CGRectMake(0, 0, params.sizePoints.width(), params.sizePoints.height()); + CGRect frame = CGRectMake(0, 0, params.sizePoints().width(), params.sizePoints().height()); UIView* touchInterceptor = touch_interceptors_[view_id].get(); touchInterceptor.layer.transform = CATransform3DIdentity; touchInterceptor.frame = frame; touchInterceptor.alpha = 1; - int currentClippingCount = CountClips(params.mutatorsStack); + const MutatorsStack& mutatorStack = params.mutatorsStack(); + int currentClippingCount = CountClips(mutatorStack); int previousClippingCount = clip_count_[view_id]; if (currentClippingCount != previousClippingCount) { clip_count_[view_id] = currentClippingCount; @@ -424,7 +425,7 @@ ReconstructClipViewsChain(currentClippingCount, touchInterceptor, oldPlatformViewRoot); root_views_[view_id] = fml::scoped_nsobject([newPlatformViewRoot retain]); } - ApplyMutators(params.mutatorsStack, touchInterceptor); + ApplyMutators(mutatorStack, touchInterceptor); } SkCanvas* FlutterPlatformViewsController::CompositeEmbeddedView(int view_id) { diff --git a/shell/platform/embedder/embedder_layers.cc b/shell/platform/embedder/embedder_layers.cc index 3b634235f820a..79dfd232fa788 100644 --- a/shell/platform/embedder/embedder_layers.cc +++ b/shell/platform/embedder/embedder_layers.cc @@ -108,7 +108,7 @@ void EmbedderLayers::PushPlatformViewLayer( view.struct_size = sizeof(FlutterPlatformView); view.identifier = identifier; - const auto& mutators = params.mutatorsStack; + const auto& mutators = params.mutatorsStack(); std::vector mutations_array; @@ -180,10 +180,10 @@ void EmbedderLayers::PushPlatformViewLayer( layer.platform_view = platform_views_referenced_.back().get(); const auto layer_bounds = - SkRect::MakeXYWH(params.offsetPixels.x(), // - params.offsetPixels.y(), // - params.sizePoints.width() * device_pixel_ratio_, // - params.sizePoints.height() * device_pixel_ratio_ // + SkRect::MakeXYWH(params.offsetPixels().x(), // + params.offsetPixels().y(), // + params.sizePoints().width() * device_pixel_ratio_, // + params.sizePoints().height() * device_pixel_ratio_ // ); const auto transformed_layer_bounds = From 822d11c292089bbb5aa6bd3bbf4bf969186f6c26 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Fri, 19 Jun 2020 22:29:31 -0700 Subject: [PATCH 6/8] fix license golden --- ci/licenses_golden/licenses_flutter | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index eb2713c557b90..bb5319f176fa2 100755 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -26,6 +26,7 @@ FILE: ../../../flutter/common/task_runners.cc FILE: ../../../flutter/common/task_runners.h FILE: ../../../flutter/flow/compositor_context.cc FILE: ../../../flutter/flow/compositor_context.h +FILE: ../../../flutter/flow/embedded_view_params_unittests.cc FILE: ../../../flutter/flow/embedded_views.cc FILE: ../../../flutter/flow/embedded_views.h FILE: ../../../flutter/flow/gl_context_switch.cc From ff81b8548594d8352c1d15e75b031f8c58ecee61 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Sat, 20 Jun 2020 11:59:25 -0700 Subject: [PATCH 7/8] add docs --- flow/embedded_views.h | 13 ++++++------- shell/platform/embedder/embedder_layers.cc | 4 ++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 1fbf4454f89de..35e38d71410e7 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -192,8 +192,6 @@ class EmbeddedViewParams { : matrix_(matrix), size_points_(size_points), mutators_stack_(mutators_stack) { - offset_pixels_ = - SkPoint::Make(matrix.getTranslateX(), matrix.getTranslateY()); SkPath path; SkRect starting_rect = SkRect::MakeSize(size_points); path.addRect(starting_rect); @@ -202,21 +200,23 @@ class EmbeddedViewParams { } EmbeddedViewParams(const EmbeddedViewParams& other) { - offset_pixels_ = other.offset_pixels_; size_points_ = other.size_points_; mutators_stack_ = other.mutators_stack_; matrix_ = other.matrix_; final_bounding_rect_ = other.final_bounding_rect_; }; - const SkPoint& offsetPixels() const { return offset_pixels_; }; + // The original size of the platform view before any mutation matrix is applied. const SkSize& sizePoints() const { return size_points_; }; + // The mutators stack contains the detailed step by step mutations for this platform view. const MutatorsStack& mutatorsStack() const { return mutators_stack_; }; + // The bounding rect of the platform view after applying all the mutations. + // + // Clippings are ignored. const SkRect& finalBoundingRect() const { return final_bounding_rect_; } bool operator==(const EmbeddedViewParams& other) const { - return offset_pixels_ == other.offset_pixels_ && - size_points_ == other.size_points_ && + return size_points_ == other.size_points_ && mutators_stack_ == other.mutators_stack_ && final_bounding_rect_ == other.final_bounding_rect_ && matrix_ == other.matrix_; @@ -224,7 +224,6 @@ class EmbeddedViewParams { private: SkMatrix matrix_; - SkPoint offset_pixels_; SkSize size_points_; MutatorsStack mutators_stack_; SkRect final_bounding_rect_; diff --git a/shell/platform/embedder/embedder_layers.cc b/shell/platform/embedder/embedder_layers.cc index 79dfd232fa788..00717cd0546ef 100644 --- a/shell/platform/embedder/embedder_layers.cc +++ b/shell/platform/embedder/embedder_layers.cc @@ -180,8 +180,8 @@ void EmbedderLayers::PushPlatformViewLayer( layer.platform_view = platform_views_referenced_.back().get(); const auto layer_bounds = - SkRect::MakeXYWH(params.offsetPixels().x(), // - params.offsetPixels().y(), // + SkRect::MakeXYWH(params.finalBoundingRect().x(), // + params.finalBoundingRect().y(), // params.sizePoints().width() * device_pixel_ratio_, // params.sizePoints().height() * device_pixel_ratio_ // ); From 15056ff717a9032140c89e203a29badb6018ca98 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Sat, 20 Jun 2020 12:38:58 -0700 Subject: [PATCH 8/8] formatting --- flow/embedded_views.h | 6 ++++-- shell/platform/embedder/embedder_layers.cc | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/flow/embedded_views.h b/flow/embedded_views.h index 35e38d71410e7..a8cf65481da0e 100644 --- a/flow/embedded_views.h +++ b/flow/embedded_views.h @@ -206,9 +206,11 @@ class EmbeddedViewParams { final_bounding_rect_ = other.final_bounding_rect_; }; - // The original size of the platform view before any mutation matrix is applied. + // The original size of the platform view before any mutation matrix is + // applied. const SkSize& sizePoints() const { return size_points_; }; - // The mutators stack contains the detailed step by step mutations for this platform view. + // The mutators stack contains the detailed step by step mutations for this + // platform view. const MutatorsStack& mutatorsStack() const { return mutators_stack_; }; // The bounding rect of the platform view after applying all the mutations. // diff --git a/shell/platform/embedder/embedder_layers.cc b/shell/platform/embedder/embedder_layers.cc index 00717cd0546ef..4716ea15683dd 100644 --- a/shell/platform/embedder/embedder_layers.cc +++ b/shell/platform/embedder/embedder_layers.cc @@ -180,8 +180,8 @@ void EmbedderLayers::PushPlatformViewLayer( layer.platform_view = platform_views_referenced_.back().get(); const auto layer_bounds = - SkRect::MakeXYWH(params.finalBoundingRect().x(), // - params.finalBoundingRect().y(), // + SkRect::MakeXYWH(params.finalBoundingRect().x(), // + params.finalBoundingRect().y(), // params.sizePoints().width() * device_pixel_ratio_, // params.sizePoints().height() * device_pixel_ratio_ // );