mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Summary: `Overflow inset` is a field in LayoutMetrics that describes the external bounding box that covers area formed by all descendants of the view (that might stick out of the frame of the view). This information can be used for various optimizations across all rendering pipeline. Here is some of them: Improving hit-testing performance. Implementing a robust "remove invisible native views" feature. Improving `clipToBounds` performance. Improving View Flattening versatility. Most importantly, we need this for improving <ScrollView> performance (and memory footprint) which we have to do to match parity with Paper's `removeClippedSubviews` feature. Changelog: [Internal] Fabric-specific internal change. Reviewed By: sammy-SC Differential Revision: D22297325 fbshipit-source-id: cb238f0505d11ccabbe9db26f36a98b3172c70db
67 lines
1.8 KiB
C++
67 lines
1.8 KiB
C++
/*
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <react/core/LayoutPrimitives.h>
|
|
#include <react/graphics/Geometry.h>
|
|
|
|
namespace facebook {
|
|
namespace react {
|
|
|
|
/*
|
|
* Describes results of layout process for particular shadow node.
|
|
*/
|
|
struct LayoutMetrics {
|
|
Rect frame;
|
|
EdgeInsets contentInsets{0};
|
|
EdgeInsets borderWidth{0};
|
|
DisplayType displayType{DisplayType::Flex};
|
|
LayoutDirection layoutDirection{LayoutDirection::Undefined};
|
|
Float pointScaleFactor{1.0};
|
|
EdgeInsets overflowInset{};
|
|
|
|
Rect getContentFrame() const {
|
|
return Rect{
|
|
Point{contentInsets.left, contentInsets.top},
|
|
Size{frame.size.width - contentInsets.left - contentInsets.right,
|
|
frame.size.height - contentInsets.top - contentInsets.bottom}};
|
|
}
|
|
|
|
bool operator==(const LayoutMetrics &rhs) const {
|
|
return std::tie(
|
|
this->frame,
|
|
this->contentInsets,
|
|
this->borderWidth,
|
|
this->displayType,
|
|
this->layoutDirection,
|
|
this->pointScaleFactor) ==
|
|
std::tie(
|
|
rhs.frame,
|
|
rhs.contentInsets,
|
|
rhs.borderWidth,
|
|
rhs.displayType,
|
|
rhs.layoutDirection,
|
|
rhs.pointScaleFactor);
|
|
}
|
|
|
|
bool operator!=(const LayoutMetrics &rhs) const {
|
|
return !(*this == rhs);
|
|
}
|
|
};
|
|
|
|
/*
|
|
* Represents some undefined, not-yet-computed or meaningless value of
|
|
* `LayoutMetrics` type.
|
|
* The value is comparable by equality with any other `LayoutMetrics` value.
|
|
*/
|
|
static LayoutMetrics const EmptyLayoutMetrics = {
|
|
/* .frame = */ {{0, 0}, {-1.0, -1.0}}};
|
|
|
|
} // namespace react
|
|
} // namespace facebook
|