1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- /*
- * 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.
- */
- #include "ViewShadowNode.h"
- #include <react/components/view/primitives.h>
- namespace facebook {
- namespace react {
- char const ViewComponentName[] = "View";
- ViewShadowNode::ViewShadowNode(
- ShadowNodeFragment const &fragment,
- ShadowNodeFamily::Shared const &family,
- ShadowNodeTraits traits)
- : ConcreteViewShadowNode(fragment, family, traits) {
- initialize();
- }
- ViewShadowNode::ViewShadowNode(
- ShadowNode const &sourceShadowNode,
- ShadowNodeFragment const &fragment)
- : ConcreteViewShadowNode(sourceShadowNode, fragment) {
- initialize();
- }
- static bool isColorMeaningful(SharedColor const &color) noexcept {
- if (!color) {
- return false;
- }
- return colorComponentsFromColor(color).alpha > 0;
- }
- void ViewShadowNode::initialize() noexcept {
- auto &viewProps = static_cast<ViewProps const &>(*props_);
- bool formsStackingContext = !viewProps.collapsable ||
- viewProps.pointerEvents == PointerEventsMode::None ||
- !viewProps.nativeId.empty() || viewProps.accessible ||
- viewProps.opacity != 1.0 || viewProps.transform != Transform{} ||
- viewProps.zIndex != 0 || viewProps.getClipsContentToBounds() ||
- viewProps.yogaStyle.positionType() == YGPositionTypeAbsolute ||
- isColorMeaningful(viewProps.shadowColor);
- bool formsView = isColorMeaningful(viewProps.backgroundColor) ||
- isColorMeaningful(viewProps.foregroundColor) ||
- !(viewProps.yogaStyle.border() == YGStyle::Edges{});
- formsView = formsView || formsStackingContext;
- #ifdef ANDROID
- // Force `formsStackingContext` trait for nodes which have `formsView`.
- // TODO: T63560216 Investigate why/how `formsView` entangled with
- // `formsStackingContext`.
- formsStackingContext = formsStackingContext || formsView;
- #endif
- if (formsView) {
- traits_.set(ShadowNodeTraits::Trait::FormsView);
- } else {
- traits_.unset(ShadowNodeTraits::Trait::FormsView);
- }
- if (formsStackingContext) {
- traits_.set(ShadowNodeTraits::Trait::FormsStackingContext);
- } else {
- traits_.unset(ShadowNodeTraits::Trait::FormsStackingContext);
- }
- }
- } // namespace react
- } // namespace facebook
|