mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Summary: This change maps the three most used colors (black, white, clear) to corresponding predefined values in UIColor. This should meaningfully reduce the overall amount of allocated UIColor/CGColor objects. In my non-scientific measures, it reduces the number of CGColor objects from ~1500 to ~1000. And... it no much at least in terms of kilobytes. However, I still think it's a good idea to implement this because I hope that can remove some work from memory allocation infra and maybe enable some optimizations that UIKit hopefully does for black and white colors. (I tend to believe that this optimization exists because UIKit even has a classes called UIDeviceWhiteColor and UICachedDeviceWhiteColor.) Changelog: [Internal] Fabric-specific internal change. Reviewed By: JoshuaGross Differential Revision: D23753506 fbshipit-source-id: 46e58dc7e6b0dcab3c83d29c7257c90ffbd95246
193 lines
6.7 KiB
Objective-C
193 lines
6.7 KiB
Objective-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.
|
|
*/
|
|
|
|
#import <UIKit/UIKit.h>
|
|
|
|
#import <react/renderer/components/view/AccessibilityPrimitives.h>
|
|
#import <react/renderer/components/view/primitives.h>
|
|
#import <react/renderer/core/LayoutPrimitives.h>
|
|
#import <react/renderer/graphics/Color.h>
|
|
#import <react/renderer/graphics/Geometry.h>
|
|
#import <react/renderer/graphics/Transform.h>
|
|
|
|
NS_ASSUME_NONNULL_BEGIN
|
|
|
|
inline NSString *RCTNSStringFromString(
|
|
const std::string &string,
|
|
const NSStringEncoding &encoding = NSUTF8StringEncoding)
|
|
{
|
|
return [NSString stringWithCString:string.c_str() encoding:encoding];
|
|
}
|
|
|
|
inline NSString *_Nullable RCTNSStringFromStringNilIfEmpty(
|
|
const std::string &string,
|
|
const NSStringEncoding &encoding = NSUTF8StringEncoding)
|
|
{
|
|
return string.empty() ? nil : RCTNSStringFromString(string, encoding);
|
|
}
|
|
|
|
inline std::string RCTStringFromNSString(NSString *string)
|
|
{
|
|
return std::string{string.UTF8String ?: ""};
|
|
}
|
|
|
|
inline UIColor *_Nullable RCTUIColorFromSharedColor(facebook::react::SharedColor const &sharedColor)
|
|
{
|
|
if (!sharedColor) {
|
|
return nil;
|
|
}
|
|
|
|
if (*facebook::react::clearColor() == *sharedColor) {
|
|
return [UIColor clearColor];
|
|
}
|
|
|
|
if (*facebook::react::blackColor() == *sharedColor) {
|
|
return [UIColor blackColor];
|
|
}
|
|
|
|
if (*facebook::react::whiteColor() == *sharedColor) {
|
|
return [UIColor whiteColor];
|
|
}
|
|
|
|
auto components = facebook::react::colorComponentsFromColor(sharedColor);
|
|
return [UIColor colorWithRed:components.red green:components.green blue:components.blue alpha:components.alpha];
|
|
}
|
|
|
|
inline CF_RETURNS_RETAINED CGColorRef
|
|
RCTCreateCGColorRefFromSharedColor(const facebook::react::SharedColor &sharedColor)
|
|
{
|
|
return CGColorRetain(RCTUIColorFromSharedColor(sharedColor).CGColor);
|
|
}
|
|
|
|
inline CGPoint RCTCGPointFromPoint(const facebook::react::Point &point)
|
|
{
|
|
return {point.x, point.y};
|
|
}
|
|
|
|
inline CGSize RCTCGSizeFromSize(const facebook::react::Size &size)
|
|
{
|
|
return {size.width, size.height};
|
|
}
|
|
|
|
inline CGRect RCTCGRectFromRect(const facebook::react::Rect &rect)
|
|
{
|
|
return {RCTCGPointFromPoint(rect.origin), RCTCGSizeFromSize(rect.size)};
|
|
}
|
|
|
|
inline UIEdgeInsets RCTUIEdgeInsetsFromEdgeInsets(const facebook::react::EdgeInsets &edgeInsets)
|
|
{
|
|
return {edgeInsets.top, edgeInsets.left, edgeInsets.bottom, edgeInsets.right};
|
|
}
|
|
|
|
UIAccessibilityTraits const AccessibilityTraitSwitch = 0x20000000000001;
|
|
|
|
inline UIAccessibilityTraits RCTUIAccessibilityTraitsFromAccessibilityTraits(
|
|
facebook::react::AccessibilityTraits accessibilityTraits)
|
|
{
|
|
using AccessibilityTraits = facebook::react::AccessibilityTraits;
|
|
UIAccessibilityTraits result = UIAccessibilityTraitNone;
|
|
if ((accessibilityTraits & AccessibilityTraits::Button) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitButton;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::Link) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitLink;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::Image) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitImage;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::Selected) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitSelected;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::PlaysSound) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitPlaysSound;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::KeyboardKey) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitKeyboardKey;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::StaticText) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitStaticText;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::SummaryElement) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitSummaryElement;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::NotEnabled) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitNotEnabled;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::UpdatesFrequently) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitUpdatesFrequently;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::SearchField) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitSearchField;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::StartsMediaSession) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitStartsMediaSession;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::Adjustable) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitAdjustable;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::AllowsDirectInteraction) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitAllowsDirectInteraction;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::CausesPageTurn) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitCausesPageTurn;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::Header) != AccessibilityTraits::None) {
|
|
result |= UIAccessibilityTraitHeader;
|
|
}
|
|
if ((accessibilityTraits & AccessibilityTraits::Switch) != AccessibilityTraits::None) {
|
|
result |= AccessibilityTraitSwitch;
|
|
}
|
|
return result;
|
|
};
|
|
|
|
inline CATransform3D RCTCATransform3DFromTransformMatrix(const facebook::react::Transform &transformMatrix)
|
|
{
|
|
return {(CGFloat)transformMatrix.matrix[0],
|
|
(CGFloat)transformMatrix.matrix[1],
|
|
(CGFloat)transformMatrix.matrix[2],
|
|
(CGFloat)transformMatrix.matrix[3],
|
|
(CGFloat)transformMatrix.matrix[4],
|
|
(CGFloat)transformMatrix.matrix[5],
|
|
(CGFloat)transformMatrix.matrix[6],
|
|
(CGFloat)transformMatrix.matrix[7],
|
|
(CGFloat)transformMatrix.matrix[8],
|
|
(CGFloat)transformMatrix.matrix[9],
|
|
(CGFloat)transformMatrix.matrix[10],
|
|
(CGFloat)transformMatrix.matrix[11],
|
|
(CGFloat)transformMatrix.matrix[12],
|
|
(CGFloat)transformMatrix.matrix[13],
|
|
(CGFloat)transformMatrix.matrix[14],
|
|
(CGFloat)transformMatrix.matrix[15]};
|
|
}
|
|
|
|
inline facebook::react::Point RCTPointFromCGPoint(const CGPoint &point)
|
|
{
|
|
return {point.x, point.y};
|
|
}
|
|
|
|
inline facebook::react::Size RCTSizeFromCGSize(const CGSize &size)
|
|
{
|
|
return {size.width, size.height};
|
|
}
|
|
|
|
inline facebook::react::Rect RCTRectFromCGRect(const CGRect &rect)
|
|
{
|
|
return {RCTPointFromCGPoint(rect.origin), RCTSizeFromCGSize(rect.size)};
|
|
}
|
|
|
|
inline facebook::react::EdgeInsets RCTEdgeInsetsFromUIEdgeInsets(const UIEdgeInsets &edgeInsets)
|
|
{
|
|
return {edgeInsets.left, edgeInsets.top, edgeInsets.right, edgeInsets.bottom};
|
|
}
|
|
|
|
inline facebook::react::LayoutDirection RCTLayoutDirection(BOOL isRTL)
|
|
{
|
|
return isRTL ? facebook::react::LayoutDirection::RightToLeft : facebook::react::LayoutDirection::LeftToRight;
|
|
}
|
|
|
|
NS_ASSUME_NONNULL_END
|