29 std::shared_ptr<flutter::OverlayLayer>
layer;
31using LayersMap = std::unordered_map<int64_t, LayerData>;
38 NSObject<FlutterPlatformView>*
view;
45 CATransform3D
transform = CATransform3DIdentity;
73 layer.anchorPoint = CGPointZero;
74 layer.position = CGPointZero;
78 return CGRectMake(clipDlRect.GetLeft(),
80 clipDlRect.GetWidth(),
81 clipDlRect.GetHeight());
93@property(nonatomic, readonly)
94 std::unordered_map<int64_t, std::unique_ptr<flutter::EmbedderViewSlice>>& slices;
98@property(nonatomic, readonly)
99 std::unordered_map<std::string, NSObject<FlutterPlatformViewFactory>*>& factories;
102@property(nonatomic, readonly)
103 std::unordered_map<std::string, FlutterPlatformViewGestureRecognizersBlockingPolicy>&
104 gestureRecognizersBlockingPolicies;
107@property(nonatomic, assign) DlISize frameSize;
113@property(nonatomic, readonly) std::unordered_map<int64_t, PlatformViewData>& platformViews;
118@property(nonatomic, readonly)
119 std::unordered_map<int64_t, flutter::EmbeddedViewParams>& currentCompositionParams;
125@property(nonatomic, readonly) std::unordered_set<int64_t>& viewsToDispose;
130@property(nonatomic, readonly) std::vector<int64_t>& compositionOrder;
135@property(nonatomic, readonly) std::vector<int64_t>& visitedPlatformViews;
140@property(nonatomic, readonly) std::unordered_set<int64_t>& viewsToRecomposite;
145@property(nonatomic, readonly) std::vector<int64_t>& previousCompositionOrder;
154@property(nonatomic, assign)
BOOL hadPlatformViews;
159@property(nonatomic, assign)
BOOL canApplyBlurBackdrop;
164- (void)createMissingOverlays:(
size_t)requiredOverlayLayers
165 withIosContext:(const
std::shared_ptr<
flutter::IOSContext>&)iosContext;
168- (void)performSubmit:(const
LayersMap&)platformViewLayers
169 currentCompositionParams:
170 (
std::unordered_map<int64_t,
flutter::EmbeddedViewParams>&)currentCompositionParams
171 viewsToRecomposite:(const
std::unordered_set<int64_t>&)viewsToRecomposite
172 compositionOrder:(const
std::vector<int64_t>&)compositionOrder
174 (const
std::vector<
std::shared_ptr<
flutter::OverlayLayer>>&)unusedLayers
176 (const
std::vector<
std::unique_ptr<
flutter::SurfaceFrame>>&)surfaceFrames;
183- (void)clipViewSetMaskView:(UIView*)clipView;
197- (void)applyMutators:(const
flutter::MutatorsStack&)mutatorsStack
198 embeddedView:(UIView*)embeddedView
199 boundingRect:(const DlRect&)boundingRect;
203- (void)bringLayersIntoView:(const
LayersMap&)layerMap
204 withCompositionOrder:(const
std::vector<int64_t>&)compositionOrder;
206- (
std::shared_ptr<flutter::OverlayLayer>)nextLayerInPool;
209- (void)createLayerWithIosContext:(const
std::shared_ptr<
flutter::IOSContext>&)iosContext
210 pixelFormat:(MTLPixelFormat)pixelFormat;
214- (void)removeUnusedLayers:(const
std::vector<
std::shared_ptr<
flutter::OverlayLayer>>&)unusedLayers
215 withCompositionOrder:(const
std::vector<int64_t>&)compositionOrder;
221- (
std::vector<UIView*>)computeViewsToDispose;
224- (void)resetFrameState;
235 std::unique_ptr<flutter::OverlayLayerPool> _layerPool;
236 std::unordered_map<int64_t, std::unique_ptr<flutter::EmbedderViewSlice>>
_slices;
237 std::unordered_map<std::string, NSObject<FlutterPlatformViewFactory>*>
_factories;
238 std::unordered_map<std::string, FlutterPlatformViewGestureRecognizersBlockingPolicy>
251 if (
self = [super init]) {
252 _layerPool = std::make_unique<flutter::OverlayLayerPool>();
255 _hadPlatformViews = NO;
256 _canApplyBlurBackdrop = YES;
261- (const
fml::RefPtr<fml::TaskRunner>&)taskRunner {
265- (void)setTaskRunner:(const
fml::RefPtr<
fml::TaskRunner>&)platformTaskRunner {
270 if ([[call method] isEqualToString:
@"create"]) {
271 [
self onCreate:call result:result];
272 }
else if ([[call method] isEqualToString:
@"dispose"]) {
273 [
self onDispose:call result:result];
274 }
else if ([[call method] isEqualToString:
@"acceptGesture"]) {
275 [
self onAcceptGesture:call result:result];
276 }
else if ([[call method] isEqualToString:
@"rejectGesture"]) {
277 [
self onRejectGesture:call result:result];
286 int64_t viewId = [args[@"id"] longLongValue];
287 NSString* viewTypeString =
args[@"viewType"];
288 std::string viewType(viewTypeString.UTF8String);
290 if (
self.platformViews.count(viewId) != 0) {
292 message:
@"trying to create an already created view"
293 details:[NSString stringWithFormat:
@"view id: '%lld'", viewId]]);
297 NSObject<FlutterPlatformViewFactory>* factory =
self.factories[viewType];
298 if (factory == nil) {
300 errorWithCode:
@"unregistered_view_type"
301 message:[NSString stringWithFormat:
@"A UIKitView widget is trying to create a "
302 @"PlatformView with an unregistered type: < %@ >",
304 details:
@"If you are the author of the PlatformView, make sure `registerViewFactory` "
307 @"https://docs.flutter.dev/development/platform-integration/"
308 @"platform-views#on-the-platform-side-1 for more details.\n"
309 @"If you are not the author of the PlatformView, make sure to call "
310 @"`GeneratedPluginRegistrant.register`."]);
315 if ([factory respondsToSelector:@selector(createArgsCodec)]) {
316 NSObject<FlutterMessageCodec>* codec = [factory createArgsCodec];
317 if (codec != nil &&
args[
@"params"] != nil) {
319 params = [codec decode:paramsData.data];
323 NSObject<FlutterPlatformView>* embeddedView = [factory createWithFrame:CGRectZero
324 viewIdentifier:viewId
326 UIView* platformView = [embeddedView view];
328 platformView.accessibilityIdentifier = [NSString stringWithFormat:@"platform_view[%lld]", viewId];
331 initWithEmbeddedView:platformView
332 platformViewsController:self
333 gestureRecognizersBlockingPolicy:self.gestureRecognizersBlockingPolicies[viewType]];
336 [clippingView addSubview:touchInterceptor];
339 .
view = embeddedView,
340 .touch_interceptor = touchInterceptor,
341 .root_view = clippingView
349 int64_t viewId = [arg longLongValue];
351 if (
self.platformViews.count(viewId) == 0) {
353 message:
@"trying to dispose an unknown"
354 details:[NSString stringWithFormat:
@"view id: '%lld'", viewId]]);
358 self.viewsToDispose.insert(viewId);
364 int64_t viewId = [args[@"id"] longLongValue];
366 if (
self.platformViews.count(viewId) == 0) {
368 message:
@"trying to set gesture state for an unknown view"
369 details:[NSString stringWithFormat:
@"view id: '%lld'", viewId]]);
381 int64_t viewId = [args[@"id"] longLongValue];
383 if (
self.platformViews.count(viewId) == 0) {
385 message:
@"trying to set gesture state for an unknown view"
386 details:[NSString stringWithFormat:
@"view id: '%lld'", viewId]]);
397 withId:(NSString*)factoryId
398 gestureRecognizersBlockingPolicy:
400 std::string idString([factoryId UTF8String]);
402 self.factories[idString] = factory;
403 self.gestureRecognizersBlockingPolicies[idString] = gestureRecognizerBlockingPolicy;
406- (void)beginFrameWithSize:(
DlISize)frameSize {
407 [
self resetFrameState];
408 self.frameSize = frameSize;
412 [
self resetFrameState];
415- (
flutter::PostPrerollResult)postPrerollActionWithThreadMerger:
416 (const
fml::RefPtr<
fml::RasterThreadMerger>&)rasterThreadMerger {
420- (void)endFrameWithResubmit:(
BOOL)shouldResubmitFrame
421 threadMerger:(const
fml::RefPtr<
fml::RasterThreadMerger>&)rasterThreadMerger {
424- (void)pushFilterToVisitedPlatformViews:(const
std::shared_ptr<
flutter::DlImageFilter>&)filter
426 for (int64_t
id :
self.visitedPlatformViews) {
433- (void)prerollCompositeEmbeddedView:(int64_t)viewId
434 withParams:(
std::unique_ptr<
flutter::EmbeddedViewParams>)params {
435 DlRect viewBounds = DlRect::MakeSize(
self.frameSize);
436 std::unique_ptr<flutter::EmbedderViewSlice>
view;
437 view = std::make_unique<flutter::DisplayListEmbedderViewSlice>(viewBounds);
438 self.slices.insert_or_assign(viewId, std::move(
view));
440 self.compositionOrder.push_back(viewId);
442 if (
self.currentCompositionParams.count(viewId) == 1 &&
443 self.currentCompositionParams[viewId] == *
params.get()) {
448 self.viewsToRecomposite.insert(viewId);
451- (size_t)embeddedViewCount {
452 return self.compositionOrder.size();
455- (UIView*)platformViewForId:(int64_t)viewId {
456 return [
self flutterTouchInterceptingViewForId:viewId].embeddedView;
460 if (
self.platformViews.empty()) {
463 return self.platformViews[viewId].touch_interceptor;
466- (long)firstResponderPlatformViewId {
467 for (
auto const& [
id, platformViewData] :
self.platformViews) {
468 UIView* rootView = platformViewData.root_view;
469 if (rootView.flt_hasFirstResponderInViewHierarchySubtree) {
476- (void)clipViewSetMaskView:(UIView*)clipView {
477 FML_DCHECK([[NSThread currentThread] isMainThread]);
478 if (clipView.maskView) {
482 CGRectMake(-clipView.frame.origin.x, -clipView.frame.origin.y,
483 CGRectGetWidth(
self.flutterView.bounds), CGRectGetHeight(
self.flutterView.bounds));
484 clipView.maskView = [
self.maskViewPool getMaskViewWithFrame:frame];
487- (void)applyMutators:(const
flutter::MutatorsStack&)mutatorsStack
488 embeddedView:(UIView*)embeddedView
489 boundingRect:(const
DlRect&)boundingRect {
490 if (
self.flutterView == nil) {
498 NSMutableArray* blurFilters = [[NSMutableArray alloc] init];
501 if (clipView.maskView) {
502 [
self.maskViewPool insertViewToPoolIfNeeded:(FlutterClippingMaskView*)(clipView.maskView)];
503 clipView.maskView = nil;
505 CGFloat screenScale = [UIScreen mainScreen].scale;
506 auto iter = mutatorsStack.Begin();
507 while (iter != mutatorsStack.End()) {
508 switch ((*iter)->GetType()) {
510 transformMatrix = transformMatrix * (*iter)->GetMatrix();
515 (*iter)->GetRect(), transformMatrix, boundingRect)) {
518 [
self clipViewSetMaskView:clipView];
520 matrix:transformMatrix];
525 (*iter)->GetRRect(), transformMatrix, boundingRect)) {
528 [
self clipViewSetMaskView:clipView];
530 matrix:transformMatrix];
535 (*iter)->GetRSE(), transformMatrix, boundingRect)) {
538 [
self clipViewSetMaskView:clipView];
540 matrix:transformMatrix];
547 [
self clipViewSetMaskView:clipView];
549 matrix:transformMatrix];
553 embeddedView.alpha = (*iter)->GetAlphaFloat() * embeddedView.alpha;
557 if (!
self.canApplyBlurBackdrop || !(*iter)->GetFilterMutation().GetFilter().asBlur()) {
562 filterRect = CGRectApplyAffineTransform(
563 filterRect, CGAffineTransformMakeScale(1 / screenScale, 1 / screenScale));
567 if (CGRectIsNull(CGRectIntersection(filterRect, clipView.frame))) {
570 CGRect intersection = CGRectIntersection(filterRect, clipView.frame);
571 CGRect frameInClipView = [
self.flutterView convertRect:intersection toView:clipView];
576 CGFloat blurRadius = (*iter)->GetFilterMutation().GetFilter().asBlur()->sigma_x();
577 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc]
578 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
580 blurRadius:blurRadius
581 visualEffectView:visualEffectView];
583 self.canApplyBlurBackdrop = NO;
585 [blurFilters addObject:filter];
593 if (
self.canApplyBlurBackdrop) {
594 [clipView applyBlurBackdropFilters:blurFilters];
603 transformMatrix = DlMatrix::MakeScale({pointScale, pointScale, 1}) * transformMatrix;
613 transformMatrix = DlMatrix::MakeTranslation(-origin) * transformMatrix;
618- (void)compositeView:(int64_t)viewId withParams:(const
flutter::EmbeddedViewParams&)params {
620 CGRect frame = CGRectMake(0, 0,
params.sizePoints().width,
params.sizePoints().height);
622 touchInterceptor.layer.transform = CATransform3DIdentity;
623 touchInterceptor.frame = frame;
624 touchInterceptor.alpha = 1;
627 UIView* clippingView =
self.platformViews[viewId].root_view;
633 CGFloat screenScale = [UIScreen mainScreen].scale;
634 clippingView.frame = CGRectMake(rect.GetX() / screenScale, rect.GetY() / screenScale,
635 rect.GetWidth() / screenScale, rect.GetHeight() / screenScale);
636 [
self applyMutators:mutatorStack embeddedView:touchInterceptor boundingRect:rect];
639- (
flutter::DlCanvas*)compositeEmbeddedViewWithId:(int64_t)viewId {
641 return self.slices[viewId]->canvas();
649 for (int64_t viewId : self.compositionOrder) {
650 [self.platformViews[viewId].root_view removeFromSuperview];
652 self.platformViews.clear();
653 self.previousCompositionOrder.clear();
656 self.compositionOrder.clear();
658 self.currentCompositionParams.clear();
659 self.viewsToRecomposite.clear();
660 self.layerPool->RecycleLayers();
661 self.visitedPlatformViews.clear();
664- (
BOOL)submitFrame:(
std::unique_ptr<
flutter::SurfaceFrame>)background_frame
665 withIosContext:(const
std::shared_ptr<
flutter::IOSContext>&)iosContext {
666 TRACE_EVENT0(
"flutter",
"PlatformViewsController::SubmitFrame");
669 if (
self.flutterView == nil || (
self.compositionOrder.empty() && !
self.hadPlatformViews)) {
670 self.hadPlatformViews = NO;
671 return background_frame->Submit();
673 self.hadPlatformViews = !
self.compositionOrder.empty();
675 bool didEncode =
true;
677 std::vector<std::unique_ptr<flutter::SurfaceFrame>> surfaceFrames;
678 surfaceFrames.reserve(
self.compositionOrder.size());
679 std::unordered_map<int64_t, DlRect> viewRects;
681 for (int64_t viewId :
self.compositionOrder) {
682 viewRects[viewId] =
self.currentCompositionParams[viewId].finalBoundingRect();
685 std::unordered_map<int64_t, DlRect> overlayLayers =
686 SliceViews(background_frame->Canvas(),
self.compositionOrder,
self.slices, viewRects);
688 size_t requiredOverlayLayers = 0;
689 for (int64_t viewId :
self.compositionOrder) {
690 std::unordered_map<int64_t, DlRect>::const_iterator overlay = overlayLayers.find(viewId);
691 if (overlay == overlayLayers.end()) {
694 requiredOverlayLayers++;
700 [
self createMissingOverlays:requiredOverlayLayers withIosContext:iosContext];
702 int64_t overlayId = 0;
703 for (int64_t viewId :
self.compositionOrder) {
704 std::unordered_map<int64_t, DlRect>::const_iterator overlay = overlayLayers.find(viewId);
705 if (overlay == overlayLayers.end()) {
708 std::shared_ptr<flutter::OverlayLayer> layer =
self.nextLayerInPool;
713 std::unique_ptr<flutter::SurfaceFrame> frame = layer->surface->AcquireFrame(
self.frameSize);
720 overlayCanvas->
Save();
721 overlayCanvas->
ClipRect(overlay->second);
723 self.slices[viewId]->render_into(overlayCanvas);
728 frame->set_submit_info({.frame_boundary =
false, .present_with_transaction =
true});
729 layer->did_submit_last_frame = frame->Encode();
731 didEncode &= layer->did_submit_last_frame;
733 .
rect = overlay->second,
735 .overlay_id = overlayId,
738 surfaceFrames.push_back(std::move(frame));
742 auto previousSubmitInfo = background_frame->submit_info();
743 background_frame->set_submit_info({
744 .frame_damage = previousSubmitInfo.frame_damage,
745 .buffer_damage = previousSubmitInfo.buffer_damage,
746 .present_with_transaction =
true,
748 background_frame->Encode();
749 surfaceFrames.push_back(std::move(background_frame));
752 std::vector<std::shared_ptr<flutter::OverlayLayer>> unusedLayers =
753 self.layerPool->RemoveUnusedLayers();
754 self.layerPool->RecycleLayers();
757 platformViewLayers = std::move(platformViewLayers),
758 currentCompositionParams = self.currentCompositionParams,
759 viewsToRecomposite = self.viewsToRecomposite,
760 compositionOrder = self.compositionOrder,
761 unusedLayers = std::move(unusedLayers),
762 surfaceFrames = std::move(surfaceFrames)
764 [
self performSubmit:platformViewLayers
765 currentCompositionParams:currentCompositionParams
766 viewsToRecomposite:viewsToRecomposite
767 compositionOrder:compositionOrder
768 unusedLayers:unusedLayers
769 surfaceFrames:surfaceFrames];
777- (void)createMissingOverlays:(
size_t)requiredOverlayLayers
778 withIosContext:(const
std::shared_ptr<
flutter::IOSContext>&)iosContext {
779 TRACE_EVENT0(
"flutter",
"PlatformViewsController::CreateMissingLayers");
781 if (requiredOverlayLayers <= self.layerPool->
size()) {
784 auto missingLayerCount = requiredOverlayLayers -
self.layerPool->
size();
788 auto latch = std::make_shared<fml::CountDownLatch>(1u);
790 self.platformTaskRunner, [
self, missingLayerCount, iosContext, latch]() {
791 for (auto i = 0u; i < missingLayerCount; i++) {
792 [self createLayerWithIosContext:iosContext
793 pixelFormat:((FlutterView*)self.flutterView).pixelFormat];
797 if (![[NSThread currentThread] isMainThread]) {
802- (void)performSubmit:(const
LayersMap&)platformViewLayers
803 currentCompositionParams:
804 (
std::unordered_map<int64_t,
flutter::EmbeddedViewParams>&)currentCompositionParams
805 viewsToRecomposite:(const
std::unordered_set<int64_t>&)viewsToRecomposite
806 compositionOrder:(const
std::vector<int64_t>&)compositionOrder
808 (const
std::vector<
std::shared_ptr<
flutter::OverlayLayer>>&)unusedLayers
810 (const
std::vector<
std::unique_ptr<
flutter::SurfaceFrame>>&)surfaceFrames {
811 TRACE_EVENT0(
"flutter",
"PlatformViewsController::PerformSubmit");
812 FML_DCHECK([[NSThread currentThread] isMainThread]);
814 [CATransaction begin];
817 for (
const auto& [viewId, layerData] : platformViewLayers) {
818 layerData.layer->UpdateViewState(
self.flutterView,
826 for (
auto&
view : [
self computeViewsToDispose]) {
827 [view removeFromSuperview];
831 for (int64_t viewId : viewsToRecomposite) {
832 [
self compositeView:viewId withParams:currentCompositionParams[viewId]];
836 for (
const auto& frame : surfaceFrames) {
842 [
self removeUnusedLayers:unusedLayers withCompositionOrder:compositionOrder];
845 [
self bringLayersIntoView:platformViewLayers withCompositionOrder:compositionOrder];
847 [CATransaction commit];
850- (void)bringLayersIntoView:(const
LayersMap&)layerMap
851 withCompositionOrder:(const
std::vector<int64_t>&)compositionOrder {
853 UIView* flutterView =
self.flutterView;
855 self.previousCompositionOrder.clear();
856 NSMutableArray* desiredPlatformSubviews = [NSMutableArray array];
857 for (int64_t platformViewId : compositionOrder) {
858 self.previousCompositionOrder.push_back(platformViewId);
859 UIView* platformViewRoot =
self.platformViews[platformViewId].root_view;
860 if (platformViewRoot != nil) {
861 [desiredPlatformSubviews addObject:platformViewRoot];
864 auto maybeLayerData = layerMap.find(platformViewId);
865 if (maybeLayerData != layerMap.end()) {
866 auto view = maybeLayerData->second.layer->overlay_view_wrapper;
868 [desiredPlatformSubviews addObject:view];
873 NSSet* desiredPlatformSubviewsSet = [NSSet setWithArray:desiredPlatformSubviews];
874 NSArray* existingPlatformSubviews = [flutterView.subviews
875 filteredArrayUsingPredicate:[NSPredicate
876 predicateWithBlock:^BOOL(id object, NSDictionary* bindings) {
877 return [desiredPlatformSubviewsSet containsObject:object];
884 if (![desiredPlatformSubviews isEqualToArray:existingPlatformSubviews]) {
885 for (UIView* subview in desiredPlatformSubviews) {
887 [flutterView addSubview:subview];
892- (
std::shared_ptr<flutter::OverlayLayer>)nextLayerInPool {
893 return self.layerPool->GetNextLayer();
896- (void)createLayerWithIosContext:(const
std::shared_ptr<
flutter::IOSContext>&)iosContext
897 pixelFormat:(MTLPixelFormat)pixelFormat {
898 self.layerPool->CreateLayer(iosContext, pixelFormat);
901- (void)removeUnusedLayers:(const
std::vector<
std::shared_ptr<
flutter::OverlayLayer>>&)unusedLayers
902 withCompositionOrder:(const
std::vector<int64_t>&)compositionOrder {
903 for (
const std::shared_ptr<flutter::OverlayLayer>& layer : unusedLayers) {
904 [layer->overlay_view_wrapper removeFromSuperview];
907 std::unordered_set<int64_t> compositionOrderSet;
908 for (int64_t viewId : compositionOrder) {
909 compositionOrderSet.insert(viewId);
912 for (int64_t viewId :
self.previousCompositionOrder) {
913 if (compositionOrderSet.find(viewId) == compositionOrderSet.end()) {
914 UIView* platformViewRoot =
self.platformViews[viewId].root_view;
915 [platformViewRoot removeFromSuperview];
920- (
std::vector<UIView*>)computeViewsToDispose {
921 std::vector<UIView*> views;
922 if (
self.viewsToDispose.empty()) {
926 std::unordered_set<int64_t> viewsToComposite(
self.compositionOrder.begin(),
927 self.compositionOrder.end());
928 std::unordered_set<int64_t> viewsToDelayDispose;
929 for (int64_t viewId :
self.viewsToDispose) {
930 if (viewsToComposite.count(viewId)) {
931 viewsToDelayDispose.insert(viewId);
934 UIView* rootView =
self.platformViews[viewId].root_view;
935 views.push_back(rootView);
936 self.currentCompositionParams.erase(viewId);
937 self.viewsToRecomposite.erase(viewId);
938 self.platformViews.erase(viewId);
940 self.viewsToDispose = std::move(viewsToDelayDispose);
944- (void)resetFrameState {
946 self.compositionOrder.clear();
947 self.visitedPlatformViews.clear();
950- (void)pushVisitedPlatformViewId:(int64_t)viewId {
951 self.visitedPlatformViews.push_back(viewId);
954- (const
flutter::EmbeddedViewParams&)compositionParamsForView:(int64_t)viewId {
955 return self.currentCompositionParams.find(viewId)->second;
958#pragma mark - Properties
960- (
flutter::OverlayLayerPool*)layerPool {
961 return _layerPool.get();
964- (
std::unordered_map<int64_t, std::unique_ptr<flutter::EmbedderViewSlice>>&)slices {
968- (
std::unordered_map<std::string, NSObject<FlutterPlatformViewFactory>*>&)factories {
971- (
std::unordered_map<std::string, FlutterPlatformViewGestureRecognizersBlockingPolicy>&)
972 gestureRecognizersBlockingPolicies {
976- (
std::unordered_map<int64_t, PlatformViewData>&)platformViews {
980- (
std::unordered_map<int64_t, flutter::EmbeddedViewParams>&)currentCompositionParams {
984- (
std::unordered_set<int64_t>&)viewsToDispose {
988- (
std::vector<int64_t>&)compositionOrder {
992- (
std::vector<int64_t>&)visitedPlatformViews {
996- (
std::unordered_set<int64_t>&)viewsToRecomposite {
1000- (
std::vector<int64_t>&)previousCompositionOrder {
void(^ FlutterResult)(id _Nullable result)
FLUTTER_DARWIN_EXPORT NSObject const * FlutterMethodNotImplemented
FlutterPlatformViewGestureRecognizersBlockingPolicy
static bool TransformedRectCoversBounds(const DlRect &local_rect, const DlMatrix &matrix, const DlRect &cull_bounds)
Checks if the local rect, when transformed by the matrix, completely covers the indicated culling bou...
static bool TransformedRoundSuperellipseCoversBounds(const DlRoundSuperellipse &local_rse, const DlMatrix &matrix, const DlRect &cull_bounds)
Checks if the local round superellipse, when transformed by the matrix, completely covers the indicat...
static bool TransformedRRectCoversBounds(const DlRoundRect &local_rrect, const DlMatrix &matrix, const DlRect &cull_bounds)
Checks if the local round rect, when transformed by the matrix, completely covers the indicated culli...
Developer-facing API for rendering anything within the engine.
virtual void ClipRect(const DlRect &rect, DlClipOp clip_op=DlClipOp::kIntersect, bool is_aa=false)=0
virtual int GetSaveCount() const =0
virtual void RestoreToCount(int restore_count)=0
void Clear(DlColor color)
void PushImageFilter(const std::shared_ptr< DlImageFilter > &filter, const DlRect &filter_rect)
Storage for Overlay layers across frames.
static void RunNowOrPostTask(const fml::RefPtr< fml::TaskRunner > &runner, const fml::closure &task)
const EmbeddedViewParams * params
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
G_BEGIN_DECLS GBytes * message
HWND(* FlutterPlatformViewFactory)(const FlutterPlatformViewCreationParameters *)
#define FML_CHECK(condition)
#define FML_DCHECK(condition)
impeller::Scalar DlScalar
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)
Compute the required overlay layers and clip the view slices according to the size and position of th...
impeller::Matrix DlMatrix
impeller::ISize32 DlISize
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
internal::CopyableLambda< T > MakeCopyable(T lambda)
std::shared_ptr< flutter::OverlayLayer > layer
static constexpr DlColor kTransparent()
A 4x4 matrix using column-major storage.
#define TRACE_EVENT0(category_group, name)