Fabric: Proper way to represent (and parse) borders in ViewProps

Summary:
@public
Previously, ViewProps class coundn't represent whole spectre of possible values of border metrics (e.g. the border color was unified).
Now it's complete and direction-specific.

Reviewed By: sahrens

Differential Revision: D9628361

fbshipit-source-id: 6d3b3d4d7e3008e2168cbca732ff99fe5ea595e8
This commit is contained in:
Valentin Shergin
2018-09-07 11:12:11 -07:00
committed by Facebook Github Bot
parent 6e7ffff4a5
commit ca1e9032a4
5 changed files with 202 additions and 25 deletions

View File

@@ -137,10 +137,10 @@ using namespace facebook::react;
// `border`
if (
oldViewProps.borderWidth != newViewProps.borderWidth ||
oldViewProps.borderStyle != newViewProps.borderStyle ||
oldViewProps.borderRadius != newViewProps.borderRadius ||
oldViewProps.borderColor != newViewProps.borderColor
oldViewProps.borderWidths != newViewProps.borderWidths ||
oldViewProps.borderStyles != newViewProps.borderStyles ||
oldViewProps.borderRadii != newViewProps.borderRadii ||
oldViewProps.borderColors != newViewProps.borderColors
) {
[self invalidateBorder];
}
@@ -174,10 +174,15 @@ using namespace facebook::react;
{
const auto &props = *std::dynamic_pointer_cast<const ViewProps>(_props);
bool useCoreAnimationBorderRendering =
props.borderStyle == BorderStyle::Solid &&
props.borderWidth.isUniform() &&
props.borderRadius.isUniform();
const auto borderMetrics =
props.resolveBorderMetrics(_layoutMetrics.layoutDirection == LayoutDirection::RightToLeft);
const bool useCoreAnimationBorderRendering =
borderMetrics.borderColors.isUniform() &&
borderMetrics.borderWidths.isUniform() &&
borderMetrics.borderStyles.isUniform() &&
borderMetrics.borderRadii.isUniform() &&
borderMetrics.borderStyles.left == BorderStyle::Solid;
CALayer *layer = self.layer;
if (_isCoreAnimationBorderRenderingEnabled != useCoreAnimationBorderRendering) {
@@ -190,11 +195,10 @@ using namespace facebook::react;
}
if (useCoreAnimationBorderRendering) {
layer.borderWidth = (CGFloat)props.borderWidth.left;
layer.borderColor = RCTCGColorRefFromSharedColor(props.borderColor);
layer.cornerRadius = (CGFloat)props.borderRadius.topLeft;
_contentView.layer.cornerRadius = (CGFloat)props.borderRadius.topLeft;
_contentView.layer.masksToBounds = YES;
layer.borderWidth = (CGFloat)borderMetrics.borderWidths.left;
layer.borderColor = RCTCGColorRefFromSharedColor(borderMetrics.borderColors.left);
layer.cornerRadius = (CGFloat)borderMetrics.borderRadii.topLeft;
_contentView.layer.cornerRadius = (CGFloat)borderMetrics.borderRadii.topLeft;
} else {
// Not supported yet.
}