diff --git a/packages/react-native/ReactCommon/react/renderer/graphics/Color.cpp b/packages/react-native/ReactCommon/react/renderer/graphics/Color.cpp index 8a2db8731511e5..6c18ade185355a 100644 --- a/packages/react-native/ReactCommon/react/renderer/graphics/Color.cpp +++ b/packages/react-native/ReactCommon/react/renderer/graphics/Color.cpp @@ -17,10 +17,12 @@ bool isColorMeaningful(const SharedColor& color) noexcept { return colorComponentsFromColor(color).alpha > 0; } +// Create Color from float RGBA values in [0, 1] range SharedColor colorFromComponents(ColorComponents components) { return {hostPlatformColorFromComponents(components)}; } +// Read Color components in [0, 1] range ColorComponents colorComponentsFromColor(SharedColor sharedColor) { return colorComponentsFromHostPlatformColor(*sharedColor); } diff --git a/packages/react-native/ReactCommon/react/renderer/graphics/platform/cxx/react/renderer/graphics/HostPlatformColor.h b/packages/react-native/ReactCommon/react/renderer/graphics/platform/cxx/react/renderer/graphics/HostPlatformColor.h index 6ea3c571ac5929..c79b7abd0a8986 100644 --- a/packages/react-native/ReactCommon/react/renderer/graphics/platform/cxx/react/renderer/graphics/HostPlatformColor.h +++ b/packages/react-native/ReactCommon/react/renderer/graphics/platform/cxx/react/renderer/graphics/HostPlatformColor.h @@ -9,6 +9,7 @@ #include #include +#include namespace facebook::react { @@ -19,21 +20,43 @@ static const facebook::react::Color UndefinedColor = std::numeric_limits::max(); } +inline Color +hostPlatformColorFromRGBA(uint8_t r, uint8_t g, uint8_t b, uint8_t a) { + return (a & 0xff) << 24 | (r & 0xff) << 16 | (g & 0xff) << 8 | (b & 0xff); +} + inline Color hostPlatformColorFromComponents(ColorComponents components) { float ratio = 255; - return ((int)std::round(components.alpha * ratio) & 0xff) << 24 | - ((int)std::round(components.red * ratio) & 0xff) << 16 | - ((int)std::round(components.green * ratio) & 0xff) << 8 | - ((int)std::round(components.blue * ratio) & 0xff); + return hostPlatformColorFromRGBA( + static_cast(std::round(components.red * ratio)), + static_cast(std::round(components.green * ratio)), + static_cast(std::round(components.blue * ratio)), + static_cast(std::round(components.alpha * ratio))); +} + +inline uint8_t alphaFromHostPlatformColor(Color color) { + return static_cast((color >> 24) & 0xff); +} + +inline uint8_t redFromHostPlatformColor(Color color) { + return static_cast((color >> 16) & 0xff); +} + +inline uint8_t greenFromHostPlatformColor(Color color) { + return static_cast((color >> 8) & 0xff); +} + +inline uint8_t blueFromHostPlatformColor(Color color) { + return static_cast((color >> 0) & 0xff); } inline ColorComponents colorComponentsFromHostPlatformColor(Color color) { float ratio = 255; return ColorComponents{ - (float)((color >> 16) & 0xff) / ratio, - (float)((color >> 8) & 0xff) / ratio, - (float)((color >> 0) & 0xff) / ratio, - (float)((color >> 24) & 0xff) / ratio}; + static_cast(redFromHostPlatformColor(color)) / ratio, + static_cast(greenFromHostPlatformColor(color)) / ratio, + static_cast(blueFromHostPlatformColor(color)) / ratio, + static_cast(alphaFromHostPlatformColor(color)) / ratio}; } } // namespace facebook::react