Skip to content

Commit 63ff0de

Browse files
authored
[Embedder API] Add helper to create viewport metrics (flutter#51562)
_This is a refactoring with no semantic changes._ In a subsequent change, an `FlutterEngineAddView` embedder API will be introduced to add views. This API will need to create the view's initial engine viewport metrics, so this splits out the logic from `FlutterEngineSendWindowMetricsEvent` into a helper. Follow-up change that uses this new helper: flutter/engine#51523 Design doc: https://flutter.dev/go/multi-view-embedder-apis Prepares for: flutter#144806 [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
1 parent c118a69 commit 63ff0de

1 file changed

Lines changed: 50 additions & 36 deletions

File tree

shell/platform/embedder/embedder.cc

Lines changed: 50 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
13551400
struct _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

Comments
 (0)