@@ -1352,6 +1352,51 @@ InferExternalViewEmbedderFromArgs(const FlutterCompositor* compositor,
13521352 false };
13531353}
13541354
1355+ // Translates embedder metrics to engine metrics, or returns a string on error.
1356+ static std::variant<flutter::ViewportMetrics, std::string>
1357+ MakeViewportMetricsFromWindowMetrics (
1358+ const FlutterWindowMetricsEvent* flutter_metrics) {
1359+ if (flutter_metrics == nullptr ) {
1360+ return " Invalid metrics handle." ;
1361+ }
1362+
1363+ flutter::ViewportMetrics metrics;
1364+
1365+ metrics.physical_width = SAFE_ACCESS (flutter_metrics, width, 0.0 );
1366+ metrics.physical_height = SAFE_ACCESS (flutter_metrics, height, 0.0 );
1367+ metrics.device_pixel_ratio = SAFE_ACCESS (flutter_metrics, pixel_ratio, 1.0 );
1368+ metrics.physical_view_inset_top =
1369+ SAFE_ACCESS (flutter_metrics, physical_view_inset_top, 0.0 );
1370+ metrics.physical_view_inset_right =
1371+ SAFE_ACCESS (flutter_metrics, physical_view_inset_right, 0.0 );
1372+ metrics.physical_view_inset_bottom =
1373+ SAFE_ACCESS (flutter_metrics, physical_view_inset_bottom, 0.0 );
1374+ metrics.physical_view_inset_left =
1375+ SAFE_ACCESS (flutter_metrics, physical_view_inset_left, 0.0 );
1376+ metrics.display_id = SAFE_ACCESS (flutter_metrics, display_id, 0 );
1377+
1378+ if (metrics.device_pixel_ratio <= 0.0 ) {
1379+ return " Device pixel ratio was invalid. It must be greater than zero." ;
1380+ }
1381+
1382+ if (metrics.physical_view_inset_top < 0 ||
1383+ metrics.physical_view_inset_right < 0 ||
1384+ metrics.physical_view_inset_bottom < 0 ||
1385+ metrics.physical_view_inset_left < 0 ) {
1386+ return " Physical view insets are invalid. They must be non-negative." ;
1387+ }
1388+
1389+ if (metrics.physical_view_inset_top > metrics.physical_height ||
1390+ metrics.physical_view_inset_right > metrics.physical_width ||
1391+ metrics.physical_view_inset_bottom > metrics.physical_height ||
1392+ metrics.physical_view_inset_left > metrics.physical_width ) {
1393+ return " Physical view insets are invalid. They cannot be greater than "
1394+ " physical height or width." ;
1395+ }
1396+
1397+ return metrics;
1398+ }
1399+
13551400struct _FlutterPlatformMessageResponseHandle {
13561401 std::unique_ptr<flutter::PlatformMessage> message;
13571402};
@@ -2209,44 +2254,13 @@ FlutterEngineResult FlutterEngineSendWindowMetricsEvent(
22092254 FlutterViewId view_id =
22102255 SAFE_ACCESS (flutter_metrics, view_id, kFlutterImplicitViewId );
22112256
2212- flutter::ViewportMetrics metrics;
2213-
2214- metrics.physical_width = SAFE_ACCESS (flutter_metrics, width, 0.0 );
2215- metrics.physical_height = SAFE_ACCESS (flutter_metrics, height, 0.0 );
2216- metrics.device_pixel_ratio = SAFE_ACCESS (flutter_metrics, pixel_ratio, 1.0 );
2217- metrics.physical_view_inset_top =
2218- SAFE_ACCESS (flutter_metrics, physical_view_inset_top, 0.0 );
2219- metrics.physical_view_inset_right =
2220- SAFE_ACCESS (flutter_metrics, physical_view_inset_right, 0.0 );
2221- metrics.physical_view_inset_bottom =
2222- SAFE_ACCESS (flutter_metrics, physical_view_inset_bottom, 0.0 );
2223- metrics.physical_view_inset_left =
2224- SAFE_ACCESS (flutter_metrics, physical_view_inset_left, 0.0 );
2225- metrics.display_id = SAFE_ACCESS (flutter_metrics, display_id, 0 );
2226-
2227- if (metrics.device_pixel_ratio <= 0.0 ) {
2228- return LOG_EMBEDDER_ERROR (
2229- kInvalidArguments ,
2230- " Device pixel ratio was invalid. It must be greater than zero." );
2231- }
2232-
2233- if (metrics.physical_view_inset_top < 0 ||
2234- metrics.physical_view_inset_right < 0 ||
2235- metrics.physical_view_inset_bottom < 0 ||
2236- metrics.physical_view_inset_left < 0 ) {
2237- return LOG_EMBEDDER_ERROR (
2238- kInvalidArguments ,
2239- " Physical view insets are invalid. They must be non-negative." );
2257+ std::variant<flutter::ViewportMetrics, std::string> metrics_or_error =
2258+ MakeViewportMetricsFromWindowMetrics (flutter_metrics);
2259+ if (const std::string* error = std::get_if<std::string>(&metrics_or_error)) {
2260+ return LOG_EMBEDDER_ERROR (kInvalidArguments , error->c_str ());
22402261 }
22412262
2242- if (metrics.physical_view_inset_top > metrics.physical_height ||
2243- metrics.physical_view_inset_right > metrics.physical_width ||
2244- metrics.physical_view_inset_bottom > metrics.physical_height ||
2245- metrics.physical_view_inset_left > metrics.physical_width ) {
2246- return LOG_EMBEDDER_ERROR (kInvalidArguments ,
2247- " Physical view insets are invalid. They cannot "
2248- " be greater than physical height or width." );
2249- }
2263+ auto metrics = std::get<flutter::ViewportMetrics>(metrics_or_error);
22502264
22512265 return reinterpret_cast <flutter::EmbedderEngine*>(engine)->SetViewportMetrics (
22522266 view_id, metrics)
0 commit comments