31 std::shared_ptr<flutter::OverlayLayer>
layer;
33using LayersMap = std::unordered_map<int64_t, LayerData>;
40 NSObject<FlutterPlatformView>*
view;
47 CATransform3D
transform = CATransform3DIdentity;
75 layer.anchorPoint = CGPointZero;
76 layer.position = CGPointZero;
80 return CGRectMake(clipDlRect.GetLeft(),
82 clipDlRect.GetWidth(),
83 clipDlRect.GetHeight());
95@property(nonatomic, readonly)
96 std::unordered_map<int64_t, std::unique_ptr<flutter::EmbedderViewSlice>>& slices;
100@property(nonatomic, readonly)
101 std::unordered_map<std::string, NSObject<FlutterPlatformViewFactory>*>& factories;
104@property(nonatomic, readonly)
105 std::unordered_map<std::string, FlutterPlatformViewGestureRecognizersBlockingPolicy>&
106 gestureRecognizersBlockingPolicies;
109@property(nonatomic, assign) DlISize frameSize;
115@property(nonatomic, readonly) std::unordered_map<int64_t, PlatformViewData>& platformViews;
120@property(nonatomic, readonly)
121 std::unordered_map<int64_t, flutter::EmbeddedViewParams>& currentCompositionParams;
127@property(nonatomic, readonly) std::unordered_set<int64_t>& viewsToDispose;
132@property(nonatomic, readonly) std::vector<int64_t>& compositionOrder;
137@property(nonatomic, readonly) std::vector<int64_t>& visitedPlatformViews;
142@property(nonatomic, readonly) std::unordered_set<int64_t>& viewsToRecomposite;
147@property(nonatomic, readonly) std::vector<int64_t>& previousCompositionOrder;
156@property(nonatomic, assign)
BOOL hadPlatformViews;
161@property(nonatomic, assign)
BOOL canApplyBlurBackdrop;
166- (void)createMissingOverlays:(
size_t)requiredOverlayLayers
167 withIosContext:(const
std::shared_ptr<
flutter::IOSContext>&)iosContext;
170- (void)performSubmit:(const
LayersMap&)platformViewLayers
171 currentCompositionParams:
172 (
std::unordered_map<int64_t,
flutter::EmbeddedViewParams>&)currentCompositionParams
173 viewsToRecomposite:(const
std::unordered_set<int64_t>&)viewsToRecomposite
174 compositionOrder:(const
std::vector<int64_t>&)compositionOrder
176 (const
std::vector<
std::shared_ptr<
flutter::OverlayLayer>>&)unusedLayers
178 (const
std::vector<
std::unique_ptr<
flutter::SurfaceFrame>>&)surfaceFrames;
185- (void)clipViewSetMaskView:(UIView*)clipView;
199- (void)applyMutators:(const
flutter::MutatorsStack&)mutatorsStack
200 embeddedView:(UIView*)embeddedView
201 boundingRect:(const DlRect&)boundingRect;
205- (void)bringLayersIntoView:(const
LayersMap&)layerMap
206 withCompositionOrder:(const
std::vector<int64_t>&)compositionOrder;
208- (
std::shared_ptr<flutter::OverlayLayer>)nextLayerInPool;
211- (void)createLayerWithIosContext:(const
std::shared_ptr<
flutter::IOSContext>&)iosContext
212 pixelFormat:(MTLPixelFormat)pixelFormat;
216- (void)removeUnusedLayers:(const
std::vector<
std::shared_ptr<
flutter::OverlayLayer>>&)unusedLayers
217 withCompositionOrder:(const
std::vector<int64_t>&)compositionOrder;
223- (
std::vector<UIView*>)computeViewsToDispose;
226- (void)resetFrameState;
237 std::unique_ptr<flutter::OverlayLayerPool> _layerPool;
238 std::unordered_map<int64_t, std::unique_ptr<flutter::EmbedderViewSlice>>
_slices;
239 std::unordered_map<std::string, NSObject<FlutterPlatformViewFactory>*>
_factories;
240 std::unordered_map<std::string, FlutterPlatformViewGestureRecognizersBlockingPolicy>
253 if (
self = [super init]) {
254 _layerPool = std::make_unique<flutter::OverlayLayerPool>();
257 _hadPlatformViews = NO;
258 _canApplyBlurBackdrop = YES;
263- (const
fml::RefPtr<fml::TaskRunner>&)taskRunner {
267- (void)setTaskRunner:(const
fml::RefPtr<
fml::TaskRunner>&)platformTaskRunner {
272 if ([[call method] isEqualToString:
@"create"]) {
273 [
self onCreate:call result:result];
274 }
else if ([[call method] isEqualToString:
@"dispose"]) {
275 [
self onDispose:call result:result];
276 }
else if ([[call method] isEqualToString:
@"acceptGesture"]) {
277 [
self onAcceptGesture:call result:result];
278 }
else if ([[call method] isEqualToString:
@"rejectGesture"]) {
279 [
self onRejectGesture:call result:result];
288 int64_t viewId = [args[@"id"] longLongValue];
289 NSString* viewTypeString =
args[@"viewType"];
290 std::string viewType(viewTypeString.UTF8String);
292 if (
self.platformViews.count(viewId) != 0) {
294 message:
@"trying to create an already created view"
295 details:[NSString stringWithFormat:
@"view id: '%lld'", viewId]]);
299 NSObject<FlutterPlatformViewFactory>* factory =
self.factories[viewType];
300 if (factory == nil) {
302 errorWithCode:
@"unregistered_view_type"
303 message:[NSString stringWithFormat:
@"A UIKitView widget is trying to create a "
304 @"PlatformView with an unregistered type: < %@ >",
306 details:
@"If you are the author of the PlatformView, make sure `registerViewFactory` "
309 @"https://docs.flutter.dev/development/platform-integration/"
310 @"platform-views#on-the-platform-side-1 for more details.\n"
311 @"If you are not the author of the PlatformView, make sure to call "
312 @"`GeneratedPluginRegistrant.register`."]);
317 if ([factory respondsToSelector:@selector(createArgsCodec)]) {
318 NSObject<FlutterMessageCodec>* codec = [factory createArgsCodec];
319 if (codec != nil &&
args[
@"params"] != nil) {
321 params = [codec decode:paramsData.data];
325 NSObject<FlutterPlatformView>* embeddedView = [factory createWithFrame:CGRectZero
326 viewIdentifier:viewId
328 UIView* platformView = [embeddedView view];
330 platformView.accessibilityIdentifier = [NSString stringWithFormat:@"platform_view[%lld]", viewId];
333 initWithEmbeddedView:platformView
334 platformViewsController:self
335 gestureRecognizersBlockingPolicy:self.gestureRecognizersBlockingPolicies[viewType]];
338 [clippingView addSubview:touchInterceptor];
341 .
view = embeddedView,
342 .touch_interceptor = touchInterceptor,
343 .root_view = clippingView
351 int64_t viewId = [arg longLongValue];
353 if (
self.platformViews.count(viewId) == 0) {
355 message:
@"trying to dispose an unknown"
356 details:[NSString stringWithFormat:
@"view id: '%lld'", viewId]]);
360 self.viewsToDispose.insert(viewId);
366 int64_t viewId = [args[@"id"] longLongValue];
368 if (
self.platformViews.count(viewId) == 0) {
370 message:
@"trying to set gesture state for an unknown view"
371 details:[NSString stringWithFormat:
@"view id: '%lld'", viewId]]);
383 int64_t viewId = [args[@"id"] longLongValue];
385 if (
self.platformViews.count(viewId) == 0) {
387 message:
@"trying to set gesture state for an unknown view"
388 details:[NSString stringWithFormat:
@"view id: '%lld'", viewId]]);
399 withId:(NSString*)factoryId
400 gestureRecognizersBlockingPolicy:
402 std::string idString([factoryId UTF8String]);
404 self.factories[idString] = factory;
405 self.gestureRecognizersBlockingPolicies[idString] = gestureRecognizerBlockingPolicy;
408- (void)beginFrameWithSize:(
DlISize)frameSize {
409 [
self resetFrameState];
410 self.frameSize = frameSize;
414 [
self resetFrameState];
417- (
flutter::PostPrerollResult)postPrerollActionWithThreadMerger:
418 (const
fml::RefPtr<
fml::RasterThreadMerger>&)rasterThreadMerger {
422- (void)endFrameWithResubmit:(
BOOL)shouldResubmitFrame
423 threadMerger:(const
fml::RefPtr<
fml::RasterThreadMerger>&)rasterThreadMerger {
426- (void)pushFilterToVisitedPlatformViews:(const
std::shared_ptr<
flutter::DlImageFilter>&)filter
428 for (int64_t
id :
self.visitedPlatformViews) {
435- (void)prerollCompositeEmbeddedView:(int64_t)viewId
436 withParams:(
std::unique_ptr<
flutter::EmbeddedViewParams>)params {
437 DlRect viewBounds = DlRect::MakeSize(
self.frameSize);
438 std::unique_ptr<flutter::EmbedderViewSlice>
view;
439 view = std::make_unique<flutter::DisplayListEmbedderViewSlice>(viewBounds);
440 self.slices.insert_or_assign(viewId, std::move(
view));
442 self.compositionOrder.push_back(viewId);
444 if (
self.currentCompositionParams.count(viewId) == 1 &&
445 self.currentCompositionParams[viewId] == *
params.get()) {
450 self.viewsToRecomposite.insert(viewId);
453- (size_t)embeddedViewCount {
454 return self.compositionOrder.size();
457- (UIView*)platformViewForId:(int64_t)viewId {
458 return [
self flutterTouchInterceptingViewForId:viewId].embeddedView;
462 if (
self.platformViews.empty()) {
465 return self.platformViews[viewId].touch_interceptor;
468- (long)firstResponderPlatformViewId {
469 for (
auto const& [
id, platformViewData] :
self.platformViews) {
470 UIView* rootView = platformViewData.root_view;
471 if (rootView.flt_hasFirstResponderInViewHierarchySubtree) {
478- (void)clipViewSetMaskView:(UIView*)clipView {
479 FML_DCHECK([[NSThread currentThread] isMainThread]);
480 if (clipView.maskView) {
484 CGRectMake(-clipView.frame.origin.x, -clipView.frame.origin.y,
485 CGRectGetWidth(
self.flutterView.bounds), CGRectGetHeight(
self.flutterView.bounds));
486 clipView.maskView = [
self.maskViewPool getMaskViewWithFrame:frame];
489- (void)applyMutators:(const
flutter::MutatorsStack&)mutatorsStack
490 embeddedView:(UIView*)embeddedView
491 boundingRect:(const
DlRect&)boundingRect {
492 if (
self.flutterView == nil) {
500 NSMutableArray* blurFilters = [[NSMutableArray alloc] init];
501 NSMutableArray<PendingRRectClip*>* pendingClipRRects = [[NSMutableArray alloc] init];
505 if (clipView.maskView) {
506 [
self.maskViewPool insertViewToPoolIfNeeded:(FlutterClippingMaskView*)(clipView.maskView)];
507 clipView.maskView = nil;
509 CGFloat screenScale = [UIScreen mainScreen].scale;
510 auto iter = mutatorsStack.Begin();
511 while (iter != mutatorsStack.End()) {
512 switch ((*iter)->GetType()) {
514 transformMatrix = transformMatrix * (*iter)->GetMatrix();
519 (*iter)->GetRect(), transformMatrix, boundingRect)) {
522 [
self clipViewSetMaskView:clipView];
524 matrix:transformMatrix];
529 (*iter)->GetRRect(), transformMatrix, boundingRect)) {
532 [
self clipViewSetMaskView:clipView];
534 matrix:transformMatrix];
539 (*iter)->GetRSE(), transformMatrix, boundingRect)) {
542 [
self clipViewSetMaskView:clipView];
544 matrix:transformMatrix];
551 [
self clipViewSetMaskView:clipView];
553 matrix:transformMatrix];
557 embeddedView.alpha = (*iter)->GetAlphaFloat() * embeddedView.alpha;
561 if (!
self.canApplyBlurBackdrop || !(*iter)->GetFilterMutation().GetFilter().asBlur()) {
566 filterRect = CGRectApplyAffineTransform(
567 filterRect, CGAffineTransformMakeScale(1 / screenScale, 1 / screenScale));
571 if (CGRectIsNull(CGRectIntersection(filterRect, clipView.frame))) {
574 CGRect intersection = CGRectIntersection(filterRect, clipView.frame);
575 CGRect frameInClipView = [
self.flutterView convertRect:intersection toView:clipView];
580 CGFloat blurRadius = (*iter)->GetFilterMutation().GetFilter().asBlur()->sigma_x();
581 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc]
582 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
585 CGFloat cornerRadius = 0.0;
586 if ([pendingClipRRects count] > 0) {
587 cornerRadius = pendingClipRRects[0].topLeftRadius;
588 [pendingClipRRects removeAllObjects];
590 visualEffectView.layer.cornerRadius = cornerRadius;
591 visualEffectView.clipsToBounds = YES;
594 blurRadius:blurRadius
595 cornerRadius:cornerRadius
596 visualEffectView:visualEffectView];
598 self.canApplyBlurBackdrop = NO;
600 [blurFilters addObject:filter];
611 DlRoundRect rrect = (*iter)->GetBackdropClipRRect().rrect;
613 clip.
rect = boundingRect;
619 [pendingClipRRects addObject:clip];
634 if (
self.canApplyBlurBackdrop) {
635 [clipView applyBlurBackdropFilters:blurFilters];
644 transformMatrix = DlMatrix::MakeScale({pointScale, pointScale, 1}) * transformMatrix;
654 transformMatrix = DlMatrix::MakeTranslation(-origin) * transformMatrix;
659- (void)compositeView:(int64_t)viewId withParams:(const
flutter::EmbeddedViewParams&)params {
661 CGRect frame = CGRectMake(0, 0,
params.sizePoints().width,
params.sizePoints().height);
663 touchInterceptor.layer.transform = CATransform3DIdentity;
664 touchInterceptor.frame = frame;
665 touchInterceptor.alpha = 1;
668 UIView* clippingView =
self.platformViews[viewId].root_view;
674 CGFloat screenScale = [UIScreen mainScreen].scale;
675 clippingView.frame = CGRectMake(rect.GetX() / screenScale, rect.GetY() / screenScale,
676 rect.GetWidth() / screenScale, rect.GetHeight() / screenScale);
677 [
self applyMutators:mutatorStack embeddedView:touchInterceptor boundingRect:rect];
680- (
flutter::DlCanvas*)compositeEmbeddedViewWithId:(int64_t)viewId {
682 return self.slices[viewId]->canvas();
690 for (int64_t viewId : self.compositionOrder) {
691 [self.platformViews[viewId].root_view removeFromSuperview];
693 self.platformViews.clear();
694 self.previousCompositionOrder.clear();
697 self.compositionOrder.clear();
699 self.currentCompositionParams.clear();
700 self.viewsToRecomposite.clear();
701 self.layerPool->RecycleLayers();
702 self.visitedPlatformViews.clear();
705- (
BOOL)submitFrame:(
std::unique_ptr<
flutter::SurfaceFrame>)background_frame
706 withIosContext:(const
std::shared_ptr<
flutter::IOSContext>&)iosContext {
707 TRACE_EVENT0(
"flutter",
"PlatformViewsController::SubmitFrame");
710 if (
self.flutterView == nil || (
self.compositionOrder.empty() && !
self.hadPlatformViews)) {
713 if (
self.flutterView != nil) {
715 weakSelf.platformTaskRunner,
717 FlutterPlatformViewsController* strongSelf = weakSelf;
721 [strongSelf performResize:frameSize];
725 self.hadPlatformViews = NO;
726 return background_frame->Submit();
728 self.hadPlatformViews = !
self.compositionOrder.empty();
730 bool didEncode =
true;
732 std::vector<std::unique_ptr<flutter::SurfaceFrame>> surfaceFrames;
733 surfaceFrames.reserve(
self.compositionOrder.size());
734 std::unordered_map<int64_t, DlRect> viewRects;
736 for (int64_t viewId :
self.compositionOrder) {
737 viewRects[viewId] =
self.currentCompositionParams[viewId].finalBoundingRect();
740 std::unordered_map<int64_t, DlRect> overlayLayers =
741 SliceViews(background_frame->Canvas(),
self.compositionOrder,
self.slices, viewRects);
743 size_t requiredOverlayLayers = 0;
744 for (int64_t viewId :
self.compositionOrder) {
745 std::unordered_map<int64_t, DlRect>::const_iterator overlay = overlayLayers.find(viewId);
746 if (overlay == overlayLayers.end()) {
749 requiredOverlayLayers++;
755 [
self createMissingOverlays:requiredOverlayLayers withIosContext:iosContext];
757 int64_t overlayId = 0;
758 for (int64_t viewId :
self.compositionOrder) {
759 std::unordered_map<int64_t, DlRect>::const_iterator overlay = overlayLayers.find(viewId);
760 if (overlay == overlayLayers.end()) {
763 std::shared_ptr<flutter::OverlayLayer> layer =
self.nextLayerInPool;
768 std::unique_ptr<flutter::SurfaceFrame> frame = layer->surface->AcquireFrame(
self.frameSize);
775 overlayCanvas->
Save();
776 overlayCanvas->
ClipRect(overlay->second);
778 self.slices[viewId]->render_into(overlayCanvas);
783 frame->set_submit_info({.frame_boundary =
false, .present_with_transaction =
true});
784 layer->did_submit_last_frame = frame->Encode();
786 didEncode &= layer->did_submit_last_frame;
788 .
rect = overlay->second,
790 .overlay_id = overlayId,
793 surfaceFrames.push_back(std::move(frame));
797 auto previousSubmitInfo = background_frame->submit_info();
798 background_frame->set_submit_info({
799 .frame_damage = previousSubmitInfo.frame_damage,
800 .buffer_damage = previousSubmitInfo.buffer_damage,
801 .present_with_transaction =
true,
803 background_frame->Encode();
804 surfaceFrames.push_back(std::move(background_frame));
807 std::vector<std::shared_ptr<flutter::OverlayLayer>> unusedLayers =
808 self.layerPool->RemoveUnusedLayers();
809 self.layerPool->RecycleLayers();
811 platformViewLayers = std::move(platformViewLayers),
812 currentCompositionParams = self.currentCompositionParams,
813 viewsToRecomposite = self.viewsToRecomposite,
814 compositionOrder = self.compositionOrder,
815 unusedLayers = std::move(unusedLayers),
816 surfaceFrames = std::move(surfaceFrames)]()
mutable {
817 [
self performSubmit:platformViewLayers
818 currentCompositionParams:currentCompositionParams
819 viewsToRecomposite:viewsToRecomposite
820 compositionOrder:compositionOrder
821 unusedLayers:unusedLayers
822 surfaceFrames:surfaceFrames];
829- (void)createMissingOverlays:(
size_t)requiredOverlayLayers
830 withIosContext:(const
std::shared_ptr<
flutter::IOSContext>&)iosContext {
831 TRACE_EVENT0(
"flutter",
"PlatformViewsController::CreateMissingLayers");
833 if (requiredOverlayLayers <= self.layerPool->
size()) {
836 auto missingLayerCount = requiredOverlayLayers -
self.layerPool->
size();
840 auto latch = std::make_shared<fml::CountDownLatch>(1u);
842 self.platformTaskRunner, [
self, missingLayerCount, iosContext, latch]() {
843 for (auto i = 0u; i < missingLayerCount; i++) {
844 [self createLayerWithIosContext:iosContext
845 pixelFormat:((FlutterView*)self.flutterView).pixelFormat];
849 if (![[NSThread currentThread] isMainThread]) {
855 TRACE_EVENT0(
"flutter",
"PlatformViewsController::PerformResize");
856 FML_DCHECK([[NSThread currentThread] isMainThread]);
858 if (
self.flutterView != nil) {
860 setIntrinsicContentSize:CGSizeMake(frameSize.width, frameSize.height)];
864- (void)performSubmit:(const
LayersMap&)platformViewLayers
865 currentCompositionParams:
866 (
std::unordered_map<int64_t,
flutter::EmbeddedViewParams>&)currentCompositionParams
867 viewsToRecomposite:(const
std::unordered_set<int64_t>&)viewsToRecomposite
868 compositionOrder:(const
std::vector<int64_t>&)compositionOrder
870 (const
std::vector<
std::shared_ptr<
flutter::OverlayLayer>>&)unusedLayers
872 (const
std::vector<
std::unique_ptr<
flutter::SurfaceFrame>>&)surfaceFrames {
873 TRACE_EVENT0(
"flutter",
"PlatformViewsController::PerformSubmit");
874 FML_DCHECK([[NSThread currentThread] isMainThread]);
876 [CATransaction begin];
879 for (
const auto& [viewId, layerData] : platformViewLayers) {
880 layerData.layer->UpdateViewState(
self.flutterView,
888 for (
auto&
view : [
self computeViewsToDispose]) {
889 [view removeFromSuperview];
893 for (int64_t viewId : viewsToRecomposite) {
894 [
self compositeView:viewId withParams:currentCompositionParams[viewId]];
898 for (
const auto& frame : surfaceFrames) {
904 [
self removeUnusedLayers:unusedLayers withCompositionOrder:compositionOrder];
907 [
self bringLayersIntoView:platformViewLayers withCompositionOrder:compositionOrder];
909 [CATransaction commit];
912- (void)bringLayersIntoView:(const
LayersMap&)layerMap
913 withCompositionOrder:(const
std::vector<int64_t>&)compositionOrder {
915 UIView* flutterView =
self.flutterView;
917 self.previousCompositionOrder.clear();
918 NSMutableArray* desiredPlatformSubviews = [NSMutableArray array];
919 for (int64_t platformViewId : compositionOrder) {
920 self.previousCompositionOrder.push_back(platformViewId);
921 UIView* platformViewRoot =
self.platformViews[platformViewId].root_view;
922 if (platformViewRoot != nil) {
923 [desiredPlatformSubviews addObject:platformViewRoot];
926 auto maybeLayerData = layerMap.find(platformViewId);
927 if (maybeLayerData != layerMap.end()) {
928 auto view = maybeLayerData->second.layer->overlay_view_wrapper;
930 [desiredPlatformSubviews addObject:view];
935 NSSet* desiredPlatformSubviewsSet = [NSSet setWithArray:desiredPlatformSubviews];
936 NSArray* existingPlatformSubviews = [flutterView.subviews
937 filteredArrayUsingPredicate:[NSPredicate
938 predicateWithBlock:^BOOL(id object, NSDictionary* bindings) {
939 return [desiredPlatformSubviewsSet containsObject:object];
946 if (![desiredPlatformSubviews isEqualToArray:existingPlatformSubviews]) {
947 for (UIView* subview in desiredPlatformSubviews) {
949 [flutterView addSubview:subview];
954- (
std::shared_ptr<flutter::OverlayLayer>)nextLayerInPool {
955 return self.layerPool->GetNextLayer();
958- (void)createLayerWithIosContext:(const
std::shared_ptr<
flutter::IOSContext>&)iosContext
959 pixelFormat:(MTLPixelFormat)pixelFormat {
960 self.layerPool->CreateLayer(iosContext, pixelFormat);
963- (void)removeUnusedLayers:(const
std::vector<
std::shared_ptr<
flutter::OverlayLayer>>&)unusedLayers
964 withCompositionOrder:(const
std::vector<int64_t>&)compositionOrder {
965 for (
const std::shared_ptr<flutter::OverlayLayer>& layer : unusedLayers) {
966 [layer->overlay_view_wrapper removeFromSuperview];
969 std::unordered_set<int64_t> compositionOrderSet;
970 for (int64_t viewId : compositionOrder) {
971 compositionOrderSet.insert(viewId);
974 for (int64_t viewId :
self.previousCompositionOrder) {
975 if (compositionOrderSet.find(viewId) == compositionOrderSet.end()) {
976 UIView* platformViewRoot =
self.platformViews[viewId].root_view;
977 [platformViewRoot removeFromSuperview];
982- (
std::vector<UIView*>)computeViewsToDispose {
983 std::vector<UIView*> views;
984 if (
self.viewsToDispose.empty()) {
988 std::unordered_set<int64_t> viewsToComposite(
self.compositionOrder.begin(),
989 self.compositionOrder.end());
990 std::unordered_set<int64_t> viewsToDelayDispose;
991 for (int64_t viewId :
self.viewsToDispose) {
992 if (viewsToComposite.count(viewId)) {
993 viewsToDelayDispose.insert(viewId);
996 UIView* rootView =
self.platformViews[viewId].root_view;
997 views.push_back(rootView);
998 self.currentCompositionParams.erase(viewId);
999 self.viewsToRecomposite.erase(viewId);
1000 self.platformViews.erase(viewId);
1002 self.viewsToDispose = std::move(viewsToDelayDispose);
1006- (void)resetFrameState {
1007 self.slices.clear();
1008 self.compositionOrder.clear();
1009 self.visitedPlatformViews.clear();
1012- (void)pushVisitedPlatformViewId:(int64_t)viewId {
1013 self.visitedPlatformViews.push_back(viewId);
1016- (void)pushClipRectToVisitedPlatformViews:(const
flutter::
DlRect&)clipRect {
1017 for (int64_t
id :
self.visitedPlatformViews) {
1025 for (int64_t
id :
self.visitedPlatformViews) {
1033 for (int64_t
id :
self.visitedPlatformViews) {
1040- (void)pushClipPathToVisitedPlatformViews:(const
flutter::
DlPath&)clipPath {
1041 for (int64_t
id :
self.visitedPlatformViews) {
1048- (const
flutter::EmbeddedViewParams&)compositionParamsForView:(int64_t)viewId {
1049 return self.currentCompositionParams.find(viewId)->second;
1052#pragma mark - Properties
1054- (
flutter::OverlayLayerPool*)layerPool {
1055 return _layerPool.get();
1058- (
std::unordered_map<int64_t, std::unique_ptr<flutter::EmbedderViewSlice>>&)slices {
1062- (
std::unordered_map<std::string, NSObject<FlutterPlatformViewFactory>*>&)factories {
1065- (
std::unordered_map<std::string, FlutterPlatformViewGestureRecognizersBlockingPolicy>&)
1066 gestureRecognizersBlockingPolicies {
1070- (
std::unordered_map<int64_t, PlatformViewData>&)platformViews {
1074- (
std::unordered_map<int64_t, flutter::EmbeddedViewParams>&)currentCompositionParams {
1078- (
std::unordered_set<int64_t>&)viewsToDispose {
1082- (
std::vector<int64_t>&)compositionOrder {
1086- (
std::vector<int64_t>&)visitedPlatformViews {
1090- (
std::unordered_set<int64_t>&)viewsToRecomposite {
1094- (
std::vector<int64_t>&)previousCompositionOrder {
void(^ FlutterResult)(id _Nullable result)
FLUTTER_DARWIN_EXPORT NSObject const * FlutterMethodNotImplemented
FlutterPlatformViewGestureRecognizersBlockingPolicy
CGFloat bottomRightRadius
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)
void PushPlatformViewClipRRect(const DlRoundRect &clip_rrect)
void PushPlatformViewClipPath(const DlPath &clip_path)
void PushPlatformViewClipRSuperellipse(const DlRoundSuperellipse &clip_rse)
void PushPlatformViewClipRect(const DlRect &clip_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
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::RoundRect DlRoundRect
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
impeller::RoundSuperellipse DlRoundSuperellipse
@ kBackdropClipRSuperellipse
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)