Flutter iOS Embedder
ios_external_view_embedder.mm
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
6 #include "fml/task_runner.h"
7 
8 #include "flutter/common/constants.h"
9 
11 
12 namespace flutter {
13 
15  __weak FlutterPlatformViewsController* platform_views_controller,
16  const std::shared_ptr<IOSContext>& context)
17  : platform_views_controller_(platform_views_controller), ios_context_(context) {
18  FML_CHECK(ios_context_);
19 }
20 
22 
23 // |ExternalViewEmbedder|
24 DlCanvas* IOSExternalViewEmbedder::GetRootCanvas() {
25  // On iOS, the root surface is created from the on-screen render target. Only the surfaces for the
26  // various overlays are controlled by this class.
27  return nullptr;
28 }
29 
30 // |ExternalViewEmbedder|
31 void IOSExternalViewEmbedder::CancelFrame() {
32  TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::CancelFrame");
33  FML_CHECK(platform_views_controller_);
34  [platform_views_controller_ cancelFrame];
35 }
36 
37 // |ExternalViewEmbedder|
38 void IOSExternalViewEmbedder::BeginFrame(
39  GrDirectContext* context,
40  const fml::RefPtr<fml::RasterThreadMerger>& raster_thread_merger) {}
41 
42 // |ExternalViewEmbedder|
43 void IOSExternalViewEmbedder::PrepareFlutterView(SkISize frame_size, double device_pixel_ratio) {
44  FML_CHECK(platform_views_controller_);
45  [platform_views_controller_ beginFrameWithSize:frame_size];
46 }
47 
48 // |ExternalViewEmbedder|
49 void IOSExternalViewEmbedder::PrerollCompositeEmbeddedView(
50  int64_t view_id,
51  std::unique_ptr<EmbeddedViewParams> params) {
52  TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::PrerollCompositeEmbeddedView");
53  FML_CHECK(platform_views_controller_);
54  [platform_views_controller_ prerollCompositeEmbeddedView:view_id withParams:std::move(params)];
55 }
56 
57 // |ExternalViewEmbedder|
58 PostPrerollResult IOSExternalViewEmbedder::PostPrerollAction(
59  const fml::RefPtr<fml::RasterThreadMerger>& raster_thread_merger) {
60  TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::PostPrerollAction");
61  FML_CHECK(platform_views_controller_);
62  BOOL impeller_enabled = ios_context_->GetBackend() != IOSRenderingBackend::kSkia;
63  PostPrerollResult result =
64  [platform_views_controller_ postPrerollActionWithThreadMerger:raster_thread_merger
65  impellerEnabled:impeller_enabled];
66  return result;
67 }
68 
69 // |ExternalViewEmbedder|
70 DlCanvas* IOSExternalViewEmbedder::CompositeEmbeddedView(int64_t view_id) {
71  TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::CompositeEmbeddedView");
72  FML_CHECK(platform_views_controller_);
73  return [platform_views_controller_ compositeEmbeddedViewWithId:view_id];
74 }
75 
76 // |ExternalViewEmbedder|
77 void IOSExternalViewEmbedder::SubmitFlutterView(
78  int64_t flutter_view_id,
79  GrDirectContext* context,
80  const std::shared_ptr<impeller::AiksContext>& aiks_context,
81  std::unique_ptr<SurfaceFrame> frame) {
82  TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::SubmitFlutterView");
83 
84  // TODO(dkwingsmt): This class only supports rendering into the implicit view.
85  // Properly support multi-view in the future.
86  FML_DCHECK(flutter_view_id == kFlutterImplicitViewId);
87  FML_CHECK(platform_views_controller_);
88  [platform_views_controller_ submitFrame:std::move(frame)
89  withIosContext:ios_context_
90  grContext:context];
91  TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::DidSubmitFrame");
92 }
93 
94 // |ExternalViewEmbedder|
95 void IOSExternalViewEmbedder::EndFrame(
96  bool should_resubmit_frame,
97  const fml::RefPtr<fml::RasterThreadMerger>& raster_thread_merger) {
98  TRACE_EVENT0("flutter", "IOSExternalViewEmbedder::EndFrame");
99  BOOL impeller_enabled = ios_context_->GetBackend() != IOSRenderingBackend::kSkia;
100  [platform_views_controller_ endFrameWithResubmit:should_resubmit_frame
101  threadMerger:raster_thread_merger
102  impellerEnabled:impeller_enabled];
103 }
104 
105 // |ExternalViewEmbedder|
106 bool IOSExternalViewEmbedder::SupportsDynamicThreadMerging() {
107 // TODO(jonahwilliams): remove this once Software backend is removed for iOS Sim.
108 #if FML_OS_IOS_SIMULATOR
109  return true;
110 #else
111  return ios_context_->GetBackend() == IOSRenderingBackend::kSkia;
112 #endif // FML_OS_IOS_SIMULATOR
113 }
114 
115 // |ExternalViewEmbedder|
116 void IOSExternalViewEmbedder::PushFilterToVisitedPlatformViews(
117  const std::shared_ptr<DlImageFilter>& filter,
118  const SkRect& filter_rect) {
119  [platform_views_controller_ pushFilterToVisitedPlatformViews:filter withRect:filter_rect];
120 }
121 
122 // |ExternalViewEmbedder|
123 void IOSExternalViewEmbedder::PushVisitedPlatformView(int64_t view_id) {
124  [platform_views_controller_ pushVisitedPlatformViewId:view_id];
125 }
126 
127 } // namespace flutter
flutter::IOSRenderingBackend::kSkia
@ kSkia
ios_external_view_embedder.h
flutter::IOSExternalViewEmbedder::~IOSExternalViewEmbedder
virtual ~IOSExternalViewEmbedder() override
flutter::IOSExternalViewEmbedder::IOSExternalViewEmbedder
IOSExternalViewEmbedder(__weak FlutterPlatformViewsController *platform_views_controller, const std::shared_ptr< IOSContext > &context)
Definition: ios_external_view_embedder.mm:14
flutter
Definition: accessibility_bridge.h:27
FlutterPlatformViewsController
Definition: FlutterPlatformViewsController.h:31
FLUTTER_ASSERT_ARC
Definition: FlutterChannelKeyResponder.mm:13