| Flutter iOS Embedder |

FlutterPlatformViews_Internal.h
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
5 #ifndef FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERPLATFORMVIEWS_INTERNAL_H_
6 #define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERPLATFORMVIEWS_INTERNAL_H_
7
8 #include <Metal/Metal.h>
9 #include "flutter/flow/embedded_views.h"
10 #include "flutter/fml/platform/darwin/scoped_nsobject.h"
11 #include "flutter/shell/common/shell.h"
12 #import "flutter/shell/platform/darwin/common/framework/Headers/FlutterBinaryMessenger.h"
13 #import "flutter/shell/platform/darwin/common/framework/Headers/FlutterChannels.h"
14 #import "flutter/shell/platform/darwin/ios/framework/Headers/FlutterPlatformViews.h"
15 #import "flutter/shell/platform/darwin/ios/framework/Headers/FlutterPlugin.h"
16 #import "flutter/shell/platform/darwin/ios/framework/Source/SemanticsObject.h"
17 #import "flutter/shell/platform/darwin/ios/ios_context.h"
18
19 @class FlutterTouchInterceptingView;
20
21 // A UIView that acts as a clipping mask for the |ChildClippingView|.
22 //
23 // On the [UIView drawRect:] method, this view performs a series of clipping operations and sets the
24 // alpha channel to the final resulting area to be 1; it also sets the "clipped out" area's alpha
25 // channel to be 0.
26 //
27 // When a UIView sets a |FlutterClippingMaskView| as its `maskView`, the alpha channel of the UIView
28 // is replaced with the alpha channel of the |FlutterClippingMaskView|.
29 @interface FlutterClippingMaskView : UIView
30
31 - (instancetype)initWithFrame:(CGRect)frame screenScale:(CGFloat)screenScale;
32
33 - (void)reset;
34
35 // Adds a clip rect operation to the queue.
36 //
37 // The `clipSkRect` is transformed with the `matrix` before adding to the queue.
38 - (void)clipRect:(const SkRect&)clipSkRect matrix:(const SkMatrix&)matrix;
39
40 // Adds a clip rrect operation to the queue.
41 //
42 // The `clipSkRRect` is transformed with the `matrix` before adding to the queue.
43 - (void)clipRRect:(const SkRRect&)clipSkRRect matrix:(const SkMatrix&)matrix;
44
45 // Adds a clip path operation to the queue.
46 //
47 // The `path` is transformed with the `matrix` before adding to the queue.
48 - (void)clipPath:(const SkPath&)path matrix:(const SkMatrix&)matrix;
49
50 @end
51
52 // A pool that provides |FlutterClippingMaskView|s.
53 //
54 // The pool has a capacity that can be set in the initializer.
55 // When requesting a FlutterClippingMaskView, the pool will first try to reuse an available maskView
56 // in the pool. If there are none available, a new FlutterClippingMaskView is constructed. If the
57 // capacity is reached, the newly constructed FlutterClippingMaskView is not added to the pool.
58 //
59 // Call |insertViewToPoolIfNeeded:| to return a maskView to the pool.
60 @interface FlutterClippingMaskViewPool : NSObject
61
62 // Initialize the pool with `capacity`. When the `capacity` is reached, a FlutterClippingMaskView is
63 // constructed when requested, and it is not added to the pool.
64 - (instancetype)initWithCapacity:(NSInteger)capacity;
65
66 // Reuse a maskView from the pool, or allocate a new one.
67 - (FlutterClippingMaskView*)getMaskViewWithFrame:(CGRect)frame;
68
69 // Insert the `maskView` into the pool.
70 - (void)insertViewToPoolIfNeeded:(FlutterClippingMaskView*)maskView;
71
72 @end
73
74 // An object represents a blur filter.
75 //
76 // This object produces a `backdropFilterView`.
77 // To blur a View, add `backdropFilterView` as a subView of the View.
78 @interface PlatformViewFilter : NSObject
79
80 // Determines the rect of the blur effect in the coordinate system of `backdropFilterView`'s
81 // parentView.
82 @property(assign, nonatomic, readonly) CGRect frame;
83
84 // Determines the blur intensity.
85 //
86 // It is set as the value of `inputRadius` of the `gaussianFilter` that is internally used.
87 @property(assign, nonatomic, readonly) CGFloat blurRadius;
88
89 // This is the view to use to blur the PlatformView.
90 //
91 // It is a modified version of UIKit's `UIVisualEffectView`.
92 // The inputRadius can be customized and it doesn't add any color saturation to the blurred view.
93 @property(nonatomic, retain, readonly) UIVisualEffectView* backdropFilterView;
94
95 // For testing only.
96 + (void)resetPreparation;
97
98 - (instancetype)init NS_UNAVAILABLE;
99
100 // Initialize the filter object.
101 //
102 // The `frame` determines the rect of the blur effect in the coordinate system of
103 // `backdropFilterView`'s parentView. The `blurRadius` determines the blur intensity. It is set as
104 // the value of `inputRadius` of the `gaussianFilter` that is internally used. The
105 // `UIVisualEffectView` is the view that is used to add the blur effects. It is modified to become
106 // `backdropFilterView`, which better supports the need of Flutter.
107 //
108 // Note: if the implementation of UIVisualEffectView changes in a way that affects the
109 // implementation in `PlatformViewFilter`, this method will return nil.
110 - (instancetype)initWithFrame:(CGRect)frame
111 blurRadius:(CGFloat)blurRadius
112 visualEffectView:(UIVisualEffectView*)visualEffectView NS_DESIGNATED_INITIALIZER;
113
114 @end
115
116 // The parent view handles clipping to its subViews.
117 @interface ChildClippingView : UIView
118
119 // Applies blur backdrop filters to the ChildClippingView with blur values from
120 // filters.
121 - (void)applyBlurBackdropFilters:(NSArray<PlatformViewFilter*>*)filters;
122
123 // For testing only.
124 - (NSMutableArray*)backdropFilterSubviews;
125 @end
126
127 namespace flutter {
128 // Converts a SkMatrix to CATransform3D.
129 // Certain fields are ignored in CATransform3D since SkMatrix is 3x3 and CATransform3D is 4x4.
130 CATransform3D GetCATransform3DFromSkMatrix(const SkMatrix& matrix);
131
132 // Reset the anchor of `layer` to match the transform operation from flow.
133 // The position of the `layer` should be unchanged after resetting the anchor.
134 void ResetAnchor(CALayer* layer);
135
136 CGRect GetCGRectFromSkRect(const SkRect& clipSkRect);
137 BOOL BlurRadiusEqualToBlurRadius(CGFloat radius1, CGFloat radius2);
138
139 class IOSContextGL;
140 class IOSSurface;
141
142 struct FlutterPlatformViewLayer {
143 FlutterPlatformViewLayer(const fml::scoped_nsobject<UIView>& overlay_view,
144 const fml::scoped_nsobject<UIView>& overlay_view_wrapper,
145 std::unique_ptr<IOSSurface> ios_surface,
146 std::unique_ptr<Surface> surface);
147
148 ~FlutterPlatformViewLayer();
149
150 fml::scoped_nsobject<UIView> overlay_view;
151 fml::scoped_nsobject<UIView> overlay_view_wrapper;
152 std::unique_ptr<IOSSurface> ios_surface;
153 std::unique_ptr<Surface> surface;
154
155 // Whether a frame for this layer was submitted.
156 bool did_submit_last_frame;
157
158 // The GrContext that is currently used by the overlay surfaces.
159 // We track this to know when the GrContext for the Flutter app has changed
160 // so we can update the overlay with the new context.
161 GrDirectContext* gr_context;
162 };
163
164 // This class isn't thread safe.
165 class FlutterPlatformViewLayerPool {
166 public:
167 FlutterPlatformViewLayerPool() = default;
168
169 ~FlutterPlatformViewLayerPool() = default;
170
171 // Gets a layer from the pool if available, or allocates a new one.
172 // Finally, it marks the layer as used. That is, it increments `available_layer_index_`.
173 std::shared_ptr<FlutterPlatformViewLayer> GetLayer(GrDirectContext* gr_context,
174 const std::shared_ptr<IOSContext>& ios_context,
175 MTLPixelFormat pixel_format);
176
177 // Gets the layers in the pool that aren't currently used.
178 // This method doesn't mark the layers as unused.
179 std::vector<std::shared_ptr<FlutterPlatformViewLayer>> GetUnusedLayers();
180
181 // Marks the layers in the pool as available for reuse.
182 void RecycleLayers();
183
184 private:
185 // The index of the entry in the layers_ vector that determines the beginning of the unused
186 // layers. For example, consider the following vector:
187 // _____
188 // | 0 |
189 /// |---|
190 /// | 1 | <-- available_layer_index_
191 /// |---|
192 /// | 2 |
193 /// |---|
194 ///
195 /// This indicates that entries starting from 1 can be reused meanwhile the entry at position 0
196 /// cannot be reused.
197 size_t available_layer_index_ = 0;
198 std::vector<std::shared_ptr<FlutterPlatformViewLayer>> layers_;
199
200 FML_DISALLOW_COPY_AND_ASSIGN(FlutterPlatformViewLayerPool);
201 };
202
203 class FlutterPlatformViewsController {
204 public:
205 FlutterPlatformViewsController();
206
207 ~FlutterPlatformViewsController();
208
209 fml::WeakPtr<flutter::FlutterPlatformViewsController> GetWeakPtr();
210
211 void SetFlutterView(UIView* flutter_view);
212
213 void SetFlutterViewController(UIViewController* flutter_view_controller);
214
215 UIViewController* getFlutterViewController();
216
217 void RegisterViewFactory(
218 NSObject<FlutterPlatformViewFactory>* factory,
219 NSString* factoryId,
220 FlutterPlatformViewGestureRecognizersBlockingPolicy gestureRecognizerBlockingPolicy);
221
222 // Called at the beginning of each frame.
223 void BeginFrame(SkISize frame_size);
224
225 // Indicates that we don't compisite any platform views or overlays during this frame.
226 // Also reverts the composition_order_ to its original state at the beginning of the frame.
227 void CancelFrame();
228
229 void PrerollCompositeEmbeddedView(int64_t view_id,
230 std::unique_ptr<flutter::EmbeddedViewParams> params);
231
232 size_t EmbeddedViewCount();
233
234 // Returns the `FlutterPlatformView`'s `view` object associated with the view_id.
235 //
236 // If the `FlutterPlatformViewsController` does not contain any `FlutterPlatformView` object or
237 // a `FlutterPlatformView` object associated with the view_id cannot be found, the method
238 // returns nil.
239 UIView* GetPlatformViewByID(int64_t view_id);
240
241 // Returns the `FlutterTouchInterceptingView` with the view_id.
242 //
243 // If the `FlutterPlatformViewsController` does not contain any `FlutterPlatformView` object or
244 // a `FlutterPlatformView` object associated with the view_id cannot be found, the method
245 // returns nil.
246 FlutterTouchInterceptingView* GetFlutterTouchInterceptingViewByID(int64_t view_id);
247
248 PostPrerollResult PostPrerollAction(
249 const fml::RefPtr<fml::RasterThreadMerger>& raster_thread_merger);
250
251 void EndFrame(bool should_resubmit_frame,
252 const fml::RefPtr<fml::RasterThreadMerger>& raster_thread_merger);
253
254 DlCanvas* CompositeEmbeddedView(int64_t view_id);
255
256 // The rect of the platform view at index view_id. This rect has been translated into the
257 // host view coordinate system. Units are device screen pixels.
258 SkRect GetPlatformViewRect(int64_t view_id);
259
260 // Discards all platform views instances and auxiliary resources.
261 void Reset();
262
263 bool SubmitFrame(GrDirectContext* gr_context,
264 const std::shared_ptr<IOSContext>& ios_context,
265 std::unique_ptr<SurfaceFrame> frame);
266
267 void OnMethodCall(FlutterMethodCall* call, FlutterResult result);
268
269 // Returns the platform view id if the platform view (or any of its descendant view) is the first
270 // responder. Returns -1 if no such platform view is found.
271 long FindFirstResponderPlatformViewId();
272
273 // Pushes backdrop filter mutation to the mutator stack of each visited platform view.
274 void PushFilterToVisitedPlatformViews(const std::shared_ptr<const DlImageFilter>& filter,
275 const SkRect& filter_rect);
276
277 // Pushes the view id of a visted platform view to the list of visied platform views.
278 void PushVisitedPlatformView(int64_t view_id) { visited_platform_views_.push_back(view_id); }
279
280 private:
281 static const size_t kMaxLayerAllocations = 2;
282
283 using LayersMap = std::map<int64_t, std::vector<std::shared_ptr<FlutterPlatformViewLayer>>>;
284
285 void OnCreate(FlutterMethodCall* call, FlutterResult result);
286 void OnDispose(FlutterMethodCall* call, FlutterResult result);
287 void OnAcceptGesture(FlutterMethodCall* call, FlutterResult result);
288 void OnRejectGesture(FlutterMethodCall* call, FlutterResult result);
289 // Dispose the views in `views_to_dispose_`.
290 void DisposeViews();
291
292 // Returns true if there are embedded views in the scene at current frame
293 // Or there will be embedded views in the next frame.
294 // TODO(cyanglaz): https://github.com/flutter/flutter/issues/56474
295 // Make this method check if there are pending view operations instead.
296 // Also rename it to `HasPendingViewOperations`.
297 bool HasPlatformViewThisOrNextFrame();
298
299 // Traverse the `mutators_stack` and return the number of clip operations.
300 int CountClips(const MutatorsStack& mutators_stack);
301
302 void ClipViewSetMaskView(UIView* clipView);
303
304 // Applies the mutators in the mutators_stack to the UIView chain that was constructed by
305 // `ReconstructClipViewsChain`
306 //
307 // Clips are applied to the `embedded_view`'s super view(|ChildClippingView|) using a
308 // |FlutterClippingMaskView|. Transforms are applied to `embedded_view`
309 //
310 // The `bounding_rect` is the final bounding rect of the PlatformView
311 // (EmbeddedViewParams::finalBoundingRect). If a clip mutator's rect contains the final bounding
312 // rect of the PlatformView, the clip mutator is not applied for performance optimization.
313 void ApplyMutators(const MutatorsStack& mutators_stack,
314 UIView* embedded_view,
315 const SkRect& bounding_rect);
316
317 void CompositeWithParams(int64_t view_id, const EmbeddedViewParams& params);
318
319 // Allocates a new FlutterPlatformViewLayer if needed, draws the pixels within the rect from
320 // the picture on the layer's canvas.
321 std::shared_ptr<FlutterPlatformViewLayer> GetLayer(GrDirectContext* gr_context,
322 const std::shared_ptr<IOSContext>& ios_context,
323 EmbedderViewSlice* slice,
324 SkIRect rect,
325 int64_t view_id,
326 int64_t overlay_id,
327 MTLPixelFormat pixel_format);
328 // Removes overlay views and platform views that aren't needed in the current frame.
329 // Must run on the platform thread.
330 void RemoveUnusedLayers();
331 // Appends the overlay views and platform view and sets their z index based on the composition
332 // order.
333 void BringLayersIntoView(LayersMap layer_map);
334
335 // Begin a CATransaction.
336 // This transaction needs to be balanced with |CommitCATransactionIfNeeded|.
337 void BeginCATransaction();
338
339 // Commit a CATransaction if |BeginCATransaction| has been called during the frame.
340 void CommitCATransactionIfNeeded();
341
342 // Resets the state of the frame.
343 void ResetFrameState();
344
345 // The pool of reusable view layers. The pool allows to recycle layer in each frame.
346 std::unique_ptr<FlutterPlatformViewLayerPool> layer_pool_;
347
348 // The platform view's |EmbedderViewSlice| keyed off the view id, which contains any subsequent
349 // operation until the next platform view or the end of the last leaf node in the layer tree.
350 //
351 // The Slices are deleted by the FlutterPlatformViewsController.reset().
352 std::map<int64_t, std::unique_ptr<EmbedderViewSlice>> slices_;
353
354 fml::scoped_nsobject<FlutterMethodChannel> channel_;
355 fml::scoped_nsobject<UIView> flutter_view_;
356 fml::scoped_nsobject<UIViewController> flutter_view_controller_;
357 fml::scoped_nsobject<FlutterClippingMaskViewPool> mask_view_pool_;
358 std::map<std::string, fml::scoped_nsobject<NSObject<FlutterPlatformViewFactory>>> factories_;
359 std::map<int64_t, fml::scoped_nsobject<NSObject<FlutterPlatformView>>> views_;
360 std::map<int64_t, fml::scoped_nsobject<FlutterTouchInterceptingView>> touch_interceptors_;
361 // Mapping a platform view ID to the top most parent view (root_view) of a platform view. In
362 // |SubmitFrame|, root_views_ are added to flutter_view_ as child views.
363 //
364 // The platform view with the view ID is a child of the root view; If the platform view is not
365 // clipped, and no clipping view is added, the root view will be the intercepting view.
366 std::map<int64_t, fml::scoped_nsobject<UIView>> root_views_;
367 // Mapping a platform view ID to its latest composition params.
368 std::map<int64_t, EmbeddedViewParams> current_composition_params_;
369 // Mapping a platform view ID to the count of the clipping operations that were applied to the
370 // platform view last time it was composited.
371 std::map<int64_t, int64_t> clip_count_;
372 SkISize frame_size_;
373
374 // The number of frames the rasterizer task runner will continue
375 // to run on the platform thread after no platform view is rendered.
376 //
377 // Note: this is an arbitrary number that attempts to account for cases
378 // where the platform view might be momentarily off the screen.
379 static const int kDefaultMergedLeaseDuration = 10;
380
381 // Method channel `OnDispose` calls adds the views to be disposed to this set to be disposed on
382 // the next frame.
383 std::unordered_set<int64_t> views_to_dispose_;
384
385 // A vector of embedded view IDs according to their composition order.
386 // The last ID in this vector belond to the that is composited on top of all others.
387 std::vector<int64_t> composition_order_;
388
389 // A vector of visited platform view IDs.
390 std::vector<int64_t> visited_platform_views_;
391
392 // The latest composition order that was presented in Present().
393 std::vector<int64_t> active_composition_order_;
394
395 // Only compoiste platform views in this set.
396 std::unordered_set<int64_t> views_to_recomposite_;
397
398 // The FlutterPlatformViewGestureRecognizersBlockingPolicy for each type of platform view.
399 std::map<std::string, FlutterPlatformViewGestureRecognizersBlockingPolicy>
400 gesture_recognizers_blocking_policies_;
401
402 bool catransaction_added_ = false;
403
404 // WeakPtrFactory must be the last member.
405 std::unique_ptr<fml::WeakPtrFactory<FlutterPlatformViewsController>> weak_factory_;
406
407 #if FLUTTER_RUNTIME_MODE == FLUTTER_RUNTIME_MODE_DEBUG
408 // A set to keep track of embedded views that does not have (0, 0) origin.
409 // An insertion triggers a warning message about non-zero origin logged on the debug console.
410 // See https://github.com/flutter/flutter/issues/109700 for details.
411 std::unordered_set<int64_t> non_zero_origin_views_;
412 #endif
413
414 FML_DISALLOW_COPY_AND_ASSIGN(FlutterPlatformViewsController);
415 };
416
417 } // namespace flutter
418
419 // A UIView that is used as the parent for embedded UIViews.
420 //
421 // This view has 2 roles:
422 // 1. Delay or prevent touch events from arriving the embedded view.
423 // 2. Dispatching all events that are hittested to the embedded view to the FlutterView.
424 @interface FlutterTouchInterceptingView : UIView
425 - (instancetype)initWithEmbeddedView:(UIView*)embeddedView
426 platformViewsController:
427 (fml::WeakPtr<flutter::FlutterPlatformViewsController>)platformViewsController
428 gestureRecognizersBlockingPolicy:
429 (FlutterPlatformViewGestureRecognizersBlockingPolicy)blockingPolicy;
430
431 // Stop delaying any active touch sequence (and let it arrive the embedded view).
432 - (void)releaseGesture;
433
434 // Prevent the touch sequence from ever arriving to the embedded view.
435 - (void)blockGesture;
436
437 // Get embedded view
438 - (UIView*)embeddedView;
439
440 // Sets flutterAccessibilityContainer as this view's accessibilityContainer.
441 - (void)setFlutterAccessibilityContainer:(NSObject*)flutterAccessibilityContainer;
442 @end
443
444 @interface UIView (FirstResponder)
445 // Returns YES if a view or any of its descendant view is the first responder. Returns NO otherwise.
446 @property(nonatomic, readonly) BOOL flt_hasFirstResponderInViewHierarchySubtree;
447 @end
448
449 #endif // FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERPLATFORMVIEWS_INTERNAL_H_
UIView(FirstResponder)::flt_hasFirstResponderInViewHierarchySubtree
BOOL flt_hasFirstResponderInViewHierarchySubtree
Definition: FlutterPlatformViews_Internal.h:446
FlutterPlatformViews.h
flutter::FlutterPlatformViewLayer::ios_surface
std::unique_ptr< IOSSurface > ios_surface
Definition: FlutterPlatformViews_Internal.h:152
-[FlutterTouchInterceptingView blockGesture]
void blockGesture()
Definition: FlutterPlatformViews.mm:1035
-[FlutterTouchInterceptingView releaseGesture]
void releaseGesture()
Definition: FlutterPlatformViews.mm:1031
PlatformViewFilter::frame
CGRect frame
Definition: FlutterPlatformViews_Internal.h:82
flutter::FlutterPlatformViewLayer::did_submit_last_frame
bool did_submit_last_frame
Definition: FlutterPlatformViews_Internal.h:156
flutter::BlurRadiusEqualToBlurRadius
BOOL BlurRadiusEqualToBlurRadius(CGFloat radius1, CGFloat radius2)
Definition: FlutterPlatformViews_Internal.mm:67
FlutterChannels.h
-[FlutterTouchInterceptingView embeddedView]
UIView * embeddedView()
Definition: FlutterPlatformViews.mm:1027
flutter::FlutterPlatformViewLayer::overlay_view_wrapper
fml::scoped_nsobject< UIView > overlay_view_wrapper
Definition: FlutterPlatformViews_Internal.h:151
initWithFrame
instancetype initWithFrame
Definition: FlutterTextInputPlugin.h:167
flutter::FlutterPlatformViewLayer::gr_context
GrDirectContext * gr_context
Definition: FlutterPlatformViews_Internal.h:161
flutter::ResetAnchor
void ResetAnchor(CALayer *layer)
Definition: FlutterPlatformViews_Internal.mm:56
-[ChildClippingView backdropFilterSubviews]
NSMutableArray * backdropFilterSubviews()
Definition: FlutterPlatformViews_Internal.mm:237
FlutterPlugin.h
PlatformViewFilter::blurRadius
CGFloat blurRadius
Definition: FlutterPlatformViews_Internal.h:87
flutter::FlutterPlatformViewLayerPool
Definition: FlutterPlatformViews_Internal.h:165
flutter::FlutterPlatformViewLayer::overlay_view
fml::scoped_nsobject< UIView > overlay_view
Definition: FlutterPlatformViews_Internal.h:150
-[PlatformViewFilter NS_UNAVAILABLE]
instancetype NS_UNAVAILABLE()
FlutterMethodCall
Definition: FlutterCodecs.h:220
-[FlutterClippingMaskView reset]
void reset()
Definition: FlutterPlatformViews_Internal.mm:278
PlatformViewFilter::backdropFilterView
UIVisualEffectView * backdropFilterView
Definition: FlutterPlatformViews_Internal.h:93
flutter
Definition: accessibility_bridge.h:28
FlutterBinaryMessenger.h
flutter::FlutterPlatformViewLayer
Definition: FlutterPlatformViews_Internal.h:142
FlutterResult
void(^ FlutterResult)(id _Nullable result)
Definition: FlutterChannels.h:194
flutter::FlutterPlatformViewLayer::surface
std::unique_ptr< Surface > surface
Definition: FlutterPlatformViews_Internal.h:153
FlutterPlatformViewGestureRecognizersBlockingPolicy
FlutterPlatformViewGestureRecognizersBlockingPolicy
Definition: FlutterPlugin.h:252
FlutterClippingMaskViewPool
Definition: FlutterPlatformViews_Internal.h:60
UIView(FirstResponder)
Definition: FlutterPlatformViews.mm:22
ChildClippingView
Definition: FlutterPlatformViews_Internal.h:117
-[flutter::FlutterPlatformViewsController PushVisitedPlatformView]
void PushVisitedPlatformView(int64_t view_id)
Definition: FlutterPlatformViews_Internal.h:278
SemanticsObject.h
+[PlatformViewFilter resetPreparation]
void resetPreparation()
Definition: FlutterPlatformViews_Internal.mm:114
FlutterTouchInterceptingView
Definition: FlutterPlatformViews.mm:988
flutter::GetCATransform3DFromSkMatrix
CATransform3D GetCATransform3DFromSkMatrix(const SkMatrix &matrix)
Definition: FlutterPlatformViews_Internal.mm:41
flutter::GetCGRectFromSkRect
CGRect GetCGRectFromSkRect(const SkRect &clipSkRect)
Definition: FlutterPlatformViews_Internal.mm:62
PlatformViewFilter
Definition: FlutterPlatformViews_Internal.h:78
ios_context.h
flutter::FlutterPlatformViewsController
Definition: FlutterPlatformViews_Internal.h:203
FlutterClippingMaskView
Definition: FlutterPlatformViews_Internal.h:29