67 int64_t flutter_view_id,
68 GrDirectContext* context,
69 const std::shared_ptr<impeller::AiksContext>& aiks_context,
70 std::unique_ptr<SurfaceFrame> frame) {
71 TRACE_EVENT0(
"flutter",
"AndroidExternalViewEmbedder2::SubmitFlutterView");
73 if (!FrameHasPlatformLayers()) {
76 [
this, jni_facade = jni_facade_,
77 views_visible_last_frame = views_visible_last_frame_]() {
81 this->HideOverlayLayerIfNeeded();
82 for (int64_t
view_id : views_visible_last_frame) {
83 jni_facade->hidePlatformView2(
view_id);
86 jni_facade->swapTransaction();
87 jni_facade->onEndFrame2();
89 views_visible_last_frame_.clear();
93 std::unordered_map<int64_t, DlRect> view_rects;
94 for (
auto platform_id : composition_order_) {
95 view_rects[platform_id] =
GetViewRect(platform_id, view_params_);
98 std::unordered_map<int64_t, DlRect> overlay_layers =
109 if (!surface_pool_->HasLayers()) {
110 std::shared_ptr<fml::CountDownLatch> latch =
111 std::make_shared<fml::CountDownLatch>(1u);
114 surface_pool_->GetLayer(context, android_context_, jni_facade_,
120 surface_pool_->ResetLayers();
124 std::unique_ptr<SurfaceFrame> overlay_frame;
125 if (surface_pool_->HasLayers()) {
126 for (
size_t i = 0;
i < composition_order_.size();
i++) {
127 int64_t
view_id = composition_order_[
i];
128 std::unordered_map<int64_t, DlRect>::const_iterator overlay =
131 if (overlay == overlay_layers.end()) {
134 if (overlay_frame ==
nullptr) {
135 std::shared_ptr<OverlayLayer> layer = surface_pool_->GetLayer(
136 context, android_context_, jni_facade_, surface_factory_);
137 overlay_frame = layer->surface->AcquireFrame(frame_size_);
141 DlCanvas* overlay_canvas = overlay_frame->Canvas();
143 overlay_canvas->
Save();
144 overlay_canvas->
ClipRect(overlay->second);
150 for (
size_t j =
i + 1; j < composition_order_.size(); j++) {
155 slices_[
view_id]->render_into(overlay_canvas);
159 bool overlay_layer_has_content_this_frame_;
160 if (overlay_frame !=
nullptr) {
161 overlay_frame->set_submit_info({.frame_boundary =
false});
162 overlay_frame->Submit();
163 overlay_layer_has_content_this_frame_ =
true;
165 overlay_layer_has_content_this_frame_ =
false;
170 [&, composition_order = composition_order_, view_params = view_params_,
171 jni_facade = jni_facade_, device_pixel_ratio = device_pixel_ratio_,
172 slices = std::move(slices_),
173 views_visible_last_frame = views_visible_last_frame_,
174 overlay_layer_has_content_this_frame_]()
mutable ->
void {
175 if (overlay_layer_has_content_this_frame_) {
176 ShowOverlayLayerIfNeeded();
178 HideOverlayLayerIfNeeded();
180 jni_facade->swapTransaction();
182 for (int64_t
view_id : composition_order) {
185 jni_facade->onDisplayPlatformView2(
191 params.sizePoints().width * device_pixel_ratio,
192 params.sizePoints().height * device_pixel_ratio,
196 views_visible_last_frame.erase(
view_id);
199 for (int64_t
view_id : views_visible_last_frame) {
200 jni_facade->hidePlatformView2(
view_id);
203 jni_facade_->onEndFrame2();
206 views_visible_last_frame_.clear();
207 views_visible_last_frame_.insert(composition_order_.begin(),
208 composition_order_.end());
Holds state that is shared across Android surfaces.
std::unordered_map< int64_t, DlRect > SliceViews(DlCanvas *background_canvas, const std::vector< int64_t > &composition_order, const std::unordered_map< int64_t, std::unique_ptr< EmbedderViewSlice > > &slices, const std::unordered_map< int64_t, DlRect > &view_rects, const std::unordered_set< int64_t > &views_with_underlay_preserved)
Compute the required overlay layers and clip the view slices according to the size and position of th...