mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
This PR connects the view ID provided by the rasterizer to `EmbedderExternalViewEmbedder`'s presenting call (see `embedder_external_view_embedder.cc`). This PR also contains a refactor (which actually takes the majority of LOC) that moves the specification of view ID from `PrepareFlutterView` to `SubmitFlutterView`. The `flutter_view_id` parameter in `PrepareFlutterView` was added in https://github.com/flutter/engine/pull/46169. It turns out that we don't need the view ID throughout the preparation phase, so we can delay the specification to submission, which makes it feel cleaner. ### Tests Existing tests are changed to verify that `SubmitFlutterView` receive the correct view ID. The feature that `EmbedderExternalViewEmbedder` sends the view ID to the presenting API is not tested for now, because `EmbedderExternalViewEmbedder` is typically tested in `embedder_unittests`, but it requires the embedder API `AddView`. It will be tested in later changes to `EmbedderExternalViewEmbedder`. [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
123 lines
3.2 KiB
C++
123 lines
3.2 KiB
C++
// 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"
|
|
|
|
namespace flutter {
|
|
|
|
DisplayListEmbedderViewSlice::DisplayListEmbedderViewSlice(SkRect view_bounds) {
|
|
builder_ = std::make_unique<DisplayListBuilder>(
|
|
/*bounds=*/view_bounds,
|
|
/*prepare_rtree=*/true);
|
|
}
|
|
|
|
DlCanvas* DisplayListEmbedderViewSlice::canvas() {
|
|
return builder_ ? builder_.get() : nullptr;
|
|
}
|
|
|
|
void DisplayListEmbedderViewSlice::end_recording() {
|
|
display_list_ = builder_->Build();
|
|
FML_DCHECK(display_list_->has_rtree());
|
|
builder_ = nullptr;
|
|
}
|
|
|
|
const DlRegion& DisplayListEmbedderViewSlice::getRegion() const {
|
|
return display_list_->rtree()->region();
|
|
}
|
|
|
|
void DisplayListEmbedderViewSlice::render_into(DlCanvas* canvas) {
|
|
canvas->DrawDisplayList(display_list_);
|
|
}
|
|
|
|
void DisplayListEmbedderViewSlice::dispatch(DlOpReceiver& receiver) {
|
|
display_list_->Dispatch(receiver);
|
|
}
|
|
|
|
bool DisplayListEmbedderViewSlice::is_empty() {
|
|
return display_list_->bounds().isEmpty();
|
|
}
|
|
|
|
bool DisplayListEmbedderViewSlice::recording_ended() {
|
|
return builder_ == nullptr;
|
|
}
|
|
|
|
void ExternalViewEmbedder::SubmitFlutterView(
|
|
int64_t flutter_view_id,
|
|
GrDirectContext* context,
|
|
const std::shared_ptr<impeller::AiksContext>& aiks_context,
|
|
std::unique_ptr<SurfaceFrame> frame) {
|
|
frame->Submit();
|
|
}
|
|
|
|
bool ExternalViewEmbedder::SupportsDynamicThreadMerging() {
|
|
return false;
|
|
}
|
|
|
|
void ExternalViewEmbedder::Teardown() {}
|
|
|
|
void MutatorsStack::PushClipRect(const SkRect& rect) {
|
|
std::shared_ptr<Mutator> element = std::make_shared<Mutator>(rect);
|
|
vector_.push_back(element);
|
|
}
|
|
|
|
void MutatorsStack::PushClipRRect(const SkRRect& rrect) {
|
|
std::shared_ptr<Mutator> element = std::make_shared<Mutator>(rrect);
|
|
vector_.push_back(element);
|
|
}
|
|
|
|
void MutatorsStack::PushClipPath(const SkPath& path) {
|
|
std::shared_ptr<Mutator> element = std::make_shared<Mutator>(path);
|
|
vector_.push_back(element);
|
|
}
|
|
|
|
void MutatorsStack::PushTransform(const SkMatrix& matrix) {
|
|
std::shared_ptr<Mutator> element = std::make_shared<Mutator>(matrix);
|
|
vector_.push_back(element);
|
|
}
|
|
|
|
void MutatorsStack::PushOpacity(const int& alpha) {
|
|
std::shared_ptr<Mutator> element = std::make_shared<Mutator>(alpha);
|
|
vector_.push_back(element);
|
|
}
|
|
|
|
void MutatorsStack::PushBackdropFilter(
|
|
const std::shared_ptr<const DlImageFilter>& filter,
|
|
const SkRect& filter_rect) {
|
|
std::shared_ptr<Mutator> element =
|
|
std::make_shared<Mutator>(filter, filter_rect);
|
|
vector_.push_back(element);
|
|
}
|
|
|
|
void MutatorsStack::Pop() {
|
|
vector_.pop_back();
|
|
}
|
|
|
|
void MutatorsStack::PopTo(size_t stack_count) {
|
|
while (vector_.size() > stack_count) {
|
|
Pop();
|
|
}
|
|
}
|
|
|
|
const std::vector<std::shared_ptr<Mutator>>::const_reverse_iterator
|
|
MutatorsStack::Top() const {
|
|
return vector_.rend();
|
|
}
|
|
|
|
const std::vector<std::shared_ptr<Mutator>>::const_reverse_iterator
|
|
MutatorsStack::Bottom() const {
|
|
return vector_.rbegin();
|
|
}
|
|
|
|
const std::vector<std::shared_ptr<Mutator>>::const_iterator
|
|
MutatorsStack::Begin() const {
|
|
return vector_.begin();
|
|
}
|
|
|
|
const std::vector<std::shared_ptr<Mutator>>::const_iterator MutatorsStack::End()
|
|
const {
|
|
return vector_.end();
|
|
}
|
|
|
|
} // namespace flutter
|