amis-rpc-design/node_modules/react-native/ReactCommon/react/renderer/components/view/ViewPropsMapBuffer.cpp
2023-10-07 19:42:30 +08:00

203 lines
5.9 KiB
C++

/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#ifdef ANDROID
#include "ViewPropsMapBuffer.h"
#include "ViewProps.h"
#include "viewPropConversions.h"
#include <react/renderer/core/graphicsConversions.h>
#include <react/renderer/mapbuffer/MapBufferBuilder.h>
namespace facebook {
namespace react {
// TODO: Currently unsupported: nextFocusForward/Left/Up/Right/Down
void ViewProps::propsDiffMapBuffer(
Props const *oldPropsPtr,
MapBufferBuilder &builder) const {
// Call with default props if necessary
if (oldPropsPtr == nullptr) {
ViewProps defaultProps{};
propsDiffMapBuffer(&defaultProps, builder);
return;
}
// Delegate to base classes
YogaStylableProps::propsDiffMapBuffer(oldPropsPtr, builder);
AccessibilityProps::propsDiffMapBuffer(oldPropsPtr, builder);
ViewProps const &oldProps = *(static_cast<const ViewProps *>(oldPropsPtr));
ViewProps const &newProps = *this;
if (oldProps.backfaceVisibility != newProps.backfaceVisibility) {
int value;
switch (newProps.backfaceVisibility) {
case BackfaceVisibility::Auto:
value = 0;
break;
case BackfaceVisibility::Visible:
value = 1;
break;
case BackfaceVisibility::Hidden:
value = 2;
break;
}
builder.putInt(VP_BACKFACE_VISIBILITY, value);
}
if (oldProps.backgroundColor != newProps.backgroundColor) {
builder.putInt(VP_BG_COLOR, toAndroidRepr(newProps.backgroundColor));
}
if (oldProps.foregroundColor != newProps.foregroundColor) {
builder.putInt(VP_FG_COLOR, toAndroidRepr(newProps.foregroundColor));
}
if (oldProps.borderCurves != newProps.borderCurves) {
builder.putMapBuffer(
VP_BORDER_CURVES, convertCascadedCorners(newProps.borderCurves));
}
if (oldProps.borderColors != newProps.borderColors) {
builder.putMapBuffer(
VP_BORDER_COLOR, convertBorderColors(newProps.borderColors));
}
if (oldProps.borderRadii != newProps.borderRadii) {
builder.putMapBuffer(
VP_BORDER_RADII, convertCascadedCorners(newProps.borderRadii));
}
if (oldProps.borderStyles != newProps.borderStyles) {
builder.putMapBuffer(
VP_BORDER_STYLE, convertCascadedEdges(newProps.borderStyles));
}
if (oldProps.elevation != newProps.elevation) {
builder.putDouble(VP_ELEVATION, newProps.elevation);
}
if (oldProps.focusable != newProps.focusable) {
builder.putBool(VP_FOCUSABLE, newProps.focusable);
}
if (oldProps.hasTVPreferredFocus != newProps.hasTVPreferredFocus) {
builder.putBool(VP_HAS_TV_FOCUS, newProps.hasTVPreferredFocus);
}
if (oldProps.hitSlop != newProps.hitSlop) {
builder.putMapBuffer(VP_HIT_SLOP, convertEdgeInsets(newProps.hitSlop));
}
if (oldProps.nativeBackground != newProps.nativeBackground) {
builder.putMapBuffer(
VP_NATIVE_BACKGROUND,
convertNativeBackground(newProps.nativeBackground));
}
if (oldProps.nativeForeground != newProps.nativeForeground) {
builder.putMapBuffer(
VP_NATIVE_FOREGROUND,
convertNativeBackground(newProps.nativeForeground));
}
if (oldProps.needsOffscreenAlphaCompositing !=
newProps.needsOffscreenAlphaCompositing) {
builder.putBool(
VP_OFFSCREEN_ALPHA_COMPOSITING,
newProps.needsOffscreenAlphaCompositing);
}
if (oldProps.opacity != newProps.opacity) {
builder.putDouble(VP_OPACITY, newProps.opacity);
}
if (oldProps.pointerEvents != newProps.pointerEvents) {
int value;
switch (newProps.pointerEvents) {
case PointerEventsMode::Auto:
value = 0;
break;
case PointerEventsMode::None:
value = 1;
break;
case PointerEventsMode::BoxNone:
value = 2;
break;
case PointerEventsMode::BoxOnly:
value = 3;
break;
}
builder.putInt(VP_POINTER_EVENTS, value);
}
if (oldProps.events != newProps.events) {
builder.putBool(
VP_POINTER_ENTER, newProps.events[ViewEvents::Offset::PointerEnter]);
builder.putBool(
VP_POINTER_LEAVE, newProps.events[ViewEvents::Offset::PointerLeave]);
builder.putBool(
VP_POINTER_MOVE, newProps.events[ViewEvents::Offset::PointerMove]);
builder.putBool(
VP_POINTER_ENTER_CAPTURE,
newProps.events[ViewEvents::Offset::PointerEnterCapture]);
builder.putBool(
VP_POINTER_LEAVE_CAPTURE,
newProps.events[ViewEvents::Offset::PointerLeaveCapture]);
builder.putBool(
VP_POINTER_MOVE_CAPTURE,
newProps.events[ViewEvents::Offset::PointerMoveCapture]);
builder.putBool(
VP_POINTER_OVER, newProps.events[ViewEvents::Offset::PointerOver]);
builder.putBool(
VP_POINTER_OVER_CAPTURE,
newProps.events[ViewEvents::Offset::PointerOverCapture]);
builder.putBool(
VP_POINTER_OUT, newProps.events[ViewEvents::Offset::PointerOut]);
builder.putBool(
VP_POINTER_OUT_CAPTURE,
newProps.events[ViewEvents::Offset::PointerOutCapture]);
}
if (oldProps.removeClippedSubviews != newProps.removeClippedSubviews) {
builder.putBool(VP_REMOVE_CLIPPED_SUBVIEW, newProps.removeClippedSubviews);
}
if (oldProps.renderToHardwareTextureAndroid !=
newProps.renderToHardwareTextureAndroid) {
builder.putBool(
VP_RENDER_TO_HARDWARE_TEXTURE, newProps.renderToHardwareTextureAndroid);
}
if (oldProps.shadowColor != newProps.shadowColor) {
builder.putInt(VP_SHADOW_COLOR, toAndroidRepr(newProps.shadowColor));
}
if (oldProps.testId != newProps.testId) {
builder.putString(VP_TEST_ID, newProps.testId);
}
if (oldProps.transform != newProps.transform) {
builder.putMapBuffer(VP_TRANSFORM, convertTransform(newProps.transform));
}
if (oldProps.zIndex != newProps.zIndex) {
builder.putInt(VP_ZINDEX, newProps.zIndex.value_or(0));
}
}
} // namespace react
} // namespace facebook
#endif