diff --git a/dev/integration_tests/wide_gamut_test/integration_test/app_test.dart b/dev/integration_tests/wide_gamut_test/integration_test/app_test.dart index 834a54b06b9..9012c95aa40 100644 --- a/dev/integration_tests/wide_gamut_test/integration_test/app_test.dart +++ b/dev/integration_tests/wide_gamut_test/integration_test/app_test.dart @@ -166,6 +166,15 @@ void main() { app.run(app.Setup.drawnImage); await tester.pumpAndSettle(const Duration(seconds: 2)); + const MethodChannel channel = MethodChannel('flutter/screenshot'); + final List result = + await channel.invokeMethod('test') as List; + expect(_findColor(result, [0.0, 1.0, 0.0]), isTrue); + }); + testWidgets('draw image with wide gamut works ontop of platform view with blur', (WidgetTester tester) async { + app.run(app.Setup.drawnImageAndPlatformView); + await tester.pumpAndSettle(const Duration(seconds: 2)); + const MethodChannel channel = MethodChannel('flutter/screenshot'); final List result = await channel.invokeMethod('test') as List; diff --git a/dev/integration_tests/wide_gamut_test/ios/Runner/AppDelegate.swift b/dev/integration_tests/wide_gamut_test/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000000..ae86984b8b0 --- /dev/null +++ b/dev/integration_tests/wide_gamut_test/ios/Runner/AppDelegate.swift @@ -0,0 +1,24 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + + var registrar = self.registrar(forPlugin: "plugin-name") + let factory = FLNativeViewFactory(messenger: registrar!.messenger()) + self.registrar(forPlugin: "")!.register( + factory, + withId: "") + + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/dev/integration_tests/wide_gamut_test/ios/Runner/DummyPlatformView.swift b/dev/integration_tests/wide_gamut_test/ios/Runner/DummyPlatformView.swift new file mode 100644 index 00000000000..e446c7f1fb2 --- /dev/null +++ b/dev/integration_tests/wide_gamut_test/ios/Runner/DummyPlatformView.swift @@ -0,0 +1,68 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import Foundation + +import Flutter +import UIKit + +class FLNativeViewFactory: NSObject, FlutterPlatformViewFactory { + private var messenger: FlutterBinaryMessenger + + init(messenger: FlutterBinaryMessenger) { + self.messenger = messenger + super.init() + } + + func create( + withFrame frame: CGRect, + viewIdentifier viewId: Int64, + arguments args: Any? + ) -> FlutterPlatformView { + return FLNativeView( + frame: frame, + viewIdentifier: viewId, + arguments: args, + binaryMessenger: messenger) + } + + public func createArgsCodec() -> FlutterMessageCodec & NSObjectProtocol { + return FlutterStandardMessageCodec.sharedInstance() + } +} + +class SolidColorView: UIView { + override init(frame: CGRect) { + super.init(frame: frame) + setupView() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + setupView() + } + + private func setupView() { + backgroundColor = .blue + } +} + + +class FLNativeView: NSObject, FlutterPlatformView { + private var view: UIView + + init( + frame: CGRect, + viewIdentifier viewId: Int64, + arguments args: Any?, + binaryMessenger messenger: FlutterBinaryMessenger? + ) { + view = SolidColorView() + super.init() + } + + func view() -> UIView { + return view + } +} diff --git a/dev/integration_tests/wide_gamut_test/lib/main.dart b/dev/integration_tests/wide_gamut_test/lib/main.dart index 696e8a34291..b84afab6725 100644 --- a/dev/integration_tests/wide_gamut_test/lib/main.dart +++ b/dev/integration_tests/wide_gamut_test/lib/main.dart @@ -145,6 +145,7 @@ enum Setup { canvasSaveLayer, blur, drawnImage, + drawnImageAndPlatformView } void run(Setup setup) { @@ -244,6 +245,19 @@ Future _loadImage() async { return (await codec.getNextFrame()).image; } +class DummyPlatformView extends StatelessWidget { + const DummyPlatformView({super.key}); + + @override + Widget build(BuildContext context) { + return const SizedBox( + width: 400, + height: 400, + child: UiKitView(viewType: ''), + ); + } +} + class MyHomePage extends StatefulWidget { const MyHomePage(this.setup, {super.key, required this.title}); @@ -285,6 +299,14 @@ class _MyHomePageState extends State { imageWidget = Image.memory(base64Decode(_displayP3Logo)); case Setup.drawnImage: imageWidget = CustomPaint(painter: _SaveLayerDrawer(_image)); + case Setup.drawnImageAndPlatformView: + imageWidget = Stack( + children: [ + const DummyPlatformView(), + Image.memory(base64Decode(_displayP3Logo)), + BackdropFilter(filter: ui.ImageFilter.blur(sigmaX: 6, sigmaY: 6), child: const SizedBox(width: 400, height: 400)), + ], + ); case Setup.canvasSaveLayer: imageWidget = CustomPaint(painter: _SaveLayerDrawer(_image)); case Setup.blur: