[Bf-blender-cvs] [795b005a368] temp-explicit-colors: Color encoding + alpha conversions are not done automatically.
Jeroen Bakker
noreply at git.blender.org
Mon Apr 19 15:39:14 CEST 2021
Commit: 795b005a3689fee3a76835c9a095287103e93010
Author: Jeroen Bakker
Date: Mon Apr 19 15:38:36 2021 +0200
Branches: temp-explicit-colors
https://developer.blender.org/rB795b005a3689fee3a76835c9a095287103e93010
Color encoding + alpha conversions are not done automatically.
===================================================================
M source/blender/blenlib/BLI_color.hh
M source/blender/blenlib/tests/BLI_color_test.cc
M source/blender/functions/intern/cpp_types.cc
===================================================================
diff --git a/source/blender/blenlib/BLI_color.hh b/source/blender/blenlib/BLI_color.hh
index 6dc467feba4..a133b79cbe7 100644
--- a/source/blender/blenlib/BLI_color.hh
+++ b/source/blender/blenlib/BLI_color.hh
@@ -36,7 +36,7 @@ namespace blender {
* Convert an srgb byte color to a linearrgb premultiplied.
* ```
* Color4b<Srgb, eAlpha::Straight> srgb_color;
- * Color4f<LinearRGB, eAlpha::Premultiplied> linearrgb_color(srgb_color);
+ * Color4f<SceneLinear, eAlpha::Premultiplied> linearrgb_color(srgb_color);
* ```
*
* Common mistakes are:
@@ -52,19 +52,6 @@ namespace blender {
* - Add ColorXyz.
*/
-/* Spaces are defined as classes to be extended with meta-data in the future.
- * The meta data could contain CIE 1931 coordinates of whitepoints and the
- * individual components.
- */
-class Srgb {
-};
-
-class Rec709 {
-};
-
-/* Primary linear colorspace used in Blender. */
-using LinearRGB = Rec709;
-
/* Enumeration containing the different alpha modes. */
enum class eAlpha : uint8_t {
/* Alpha is unassociated (color is straight). */
@@ -76,49 +63,54 @@ enum class eAlpha : uint8_t {
template<typename Space, eAlpha Alpha> struct Color4f;
template<typename Space, eAlpha Alpha> struct Color4b;
-/* Internal roles. For convenience to shorten the type names and hide complexity
- * in areas where transformations are unlikely to happen. */
-using ColorRender = Color4f<LinearRGB, eAlpha::Premultiplied>;
-using ColorReference = Color4f<LinearRGB, eAlpha::Premultiplied>;
-using ColorCompositor = Color4f<LinearRGB, eAlpha::Premultiplied>;
-using ColorTheme = Color4b<Srgb, eAlpha::Straight>;
-using ColorGeometry4f = Color4f<LinearRGB, eAlpha::Premultiplied>;
+/* Predefinition of Spaces. */
+class Srgb;
+class SceneLinear;
+
+/* Spaces are defined as classes to be extended with meta-data in the future.
+ * The meta data could contain CIE 1931 coordinates of whitepoints and the
+ * individual components.
+ */
-namespace color_transfers_ {
+class ByteEncodingNotSupported;
-/**
- * Predefinition of transfer_color_ functions.
- *
- * These functions will be called from the template constructors.
- * They shouldn't be used directly.
- *
- * The defined transfer_color_ function will drive which storage classes are
- * suitable. For example Color4b<LinearRGB,...> isn't possible to create.
+class Srgb {
+ public:
+ using ByteEncodedSpace = ByteEncodingNotSupported;
+};
+
+BLI_INLINE void convert_space(const Color4f<Srgb, eAlpha::Straight> src,
+ Color4f<SceneLinear, eAlpha::Straight> &dst);
+
+class SceneLinearByteEncoded {
+};
+/* Primary linear colorspace used in Blender.
+ * Float precision color corresponding to the scene linear role in the OpenColorIO config.
*/
-MINLINE void transfer_color_(const Color4b<Srgb, eAlpha::Straight> &src,
- Color4f<Srgb, eAlpha::Straight> &r_out);
-MINLINE void transfer_color_(const Color4f<Srgb, eAlpha::Straight> &src,
- Color4b<Srgb, eAlpha::Straight> &r_out);
-MINLINE void transfer_color_(const Color4b<Srgb, eAlpha::Straight> &src,
- Color4f<LinearRGB, eAlpha::Straight> &r_out);
-MINLINE void transfer_color_(const Color4b<Srgb, eAlpha::Straight> &src,
- Color4f<LinearRGB, eAlpha::Premultiplied> &r_out);
-MINLINE void transfer_color_(const Color4b<Srgb, eAlpha::Straight> &src,
- Color4b<Srgb, eAlpha::Straight> &r_out);
-MINLINE void transfer_color_(const Color4f<LinearRGB, eAlpha::Straight> &src,
- Color4f<LinearRGB, eAlpha::Premultiplied> &r_out);
-MINLINE void transfer_color_(const Color4f<LinearRGB, eAlpha::Premultiplied> &src,
- Color4f<LinearRGB, eAlpha::Straight> &r_out);
-MINLINE void transfer_color_(const Color4f<LinearRGB, eAlpha::Premultiplied> &src,
- Color4b<Srgb, eAlpha::Straight> &r_out);
-MINLINE void transfer_color_(const Color4f<LinearRGB, eAlpha::Premultiplied> &src,
- Color4f<Srgb, eAlpha::Straight> &r_out);
-MINLINE void transfer_color_(const Color4f<LinearRGB, eAlpha::Straight> &src,
- Color4b<Srgb, eAlpha::Straight> &r_out);
-MINLINE void transfer_color_(const Color4f<LinearRGB, eAlpha::Straight> &src,
- Color4f<Srgb, eAlpha::Straight> &r_out);
-
-} // namespace color_transfers_
+class SceneLinear {
+ public:
+ using ByteEncodedSpace = SceneLinearByteEncoded;
+
+ BLI_INLINE void byte_encode(const float *decoded, uint8_t *r_byte_encoded)
+ {
+ float float_encoded[4];
+ linearrgb_to_srgb_v4(float_encoded, decoded);
+ rgba_float_to_uchar(r_byte_encoded, float_encoded);
+ }
+
+ BLI_INLINE void byte_decode(const uint8_t *byte_encoded, float *r_decoded)
+ {
+ float float_encoded[4];
+ rgba_uchar_to_float(float_encoded, byte_encoded);
+ srgb_to_linearrgb_v4(r_decoded, float_encoded);
+ }
+};
+BLI_INLINE void convert_space(const Color4f<SceneLinear, eAlpha::Straight> src,
+ Color4b<Srgb, eAlpha::Straight> &dst);
+BLI_INLINE void convert_space(const Color4f<SceneLinear, eAlpha::Straight> src,
+ Color4f<Srgb, eAlpha::Straight> &dst);
+BLI_INLINE void convert_space(const Color4f<SceneLinear, eAlpha::Premultiplied> src,
+ Color4f<SceneLinear, eAlpha::Premultiplied> &dst);
template<typename Space, eAlpha Alpha> struct Color4f {
float r, g, b, a;
@@ -133,16 +125,70 @@ template<typename Space, eAlpha Alpha> struct Color4f {
{
}
- template<typename OtherSpace, eAlpha OtherAlpha>
- explicit Color4f(const Color4b<OtherSpace, OtherAlpha> &src)
+ template<typename OtherSpace> explicit Color4f(Color4f<OtherSpace, Alpha> &src)
+ {
+ convert_space(src, *this);
+ }
+
+ /**
+ * Convert to another space.
+ *
+ * Doesn't allow altering of alpha mode. This needs to be done separately by calling
+ * premultiply/straight_alpha. Supported space conversions are implementing in the
+ *
+ * Usage:
+ */
+ // template<typename OtherSpace> Color4f<OtherSpace, Alpha> convert_space() const
+ // {
+ // Color4f<OtherSpace, Alpha> result;
+ // convert_space(*this, result);
+ // return result;
+ // }
+
+ // template<typename OtherSpace> Color4b<OtherSpace, Alpha> convert_space() const
+ // {
+ // Color4b<OtherSpace, Alpha> result;
+ // convert_space(*this, result);
+ // return result;
+ // }
+
+ Color4f<Space, eAlpha::Premultiplied> premultiply_alpha() const
+ {
+ BLI_assert(Alpha == eAlpha::Straight);
+ Color4f<Space, eAlpha::Premultiplied> premultiplied_alpha;
+ straight_to_premul_v4_v4(premultiplied_alpha, *this);
+ return premultiplied_alpha;
+ }
+
+ Color4f<Space, eAlpha::Straight> straight_alpha() const
+ {
+ BLI_assert(Alpha == eAlpha::Premultiplied);
+ Color4f<Space, eAlpha::Straight> straight_alpha;
+ premul_to_straight_v4_v4(straight_alpha, *this);
+ return straight_alpha;
+ }
+
+ /* Encode linear colors into 4 bytes.
+ * Only relevant spaces support byte encoding/decoding. */
+ Color4b<typename Space::ByteEncodedSpace, Alpha> encode() const
{
- color_transfers_::transfer_color_(src, *this);
+ Color4b<typename Space::ByteEncodedSpace, Alpha> result;
+ Space::byte_encode(*this, result);
+ return result;
}
- template<typename OtherSpace, eAlpha OtherAlpha>
- explicit Color4f(const Color4f<OtherSpace, OtherAlpha> &src)
+ /* Decode byte encoded spaces.
+ * Only relevant spaces support byte encoding/decoding. */
+ void decode(const Color4b<typename Space::ByteEncodedSpace, Alpha> &encoded)
{
- color_transfers_::transfer_color_(src, *this);
+ Space::byte_decode(encoded, *this);
+ }
+
+ Color4b<Space, Alpha> to_color4b() const
+ {
+ Color4b<Space, Alpha> result;
+ rgba_float_to_uchar(result, *this);
+ return result;
}
operator float *()
@@ -190,10 +236,18 @@ template<typename Space, eAlpha Alpha> struct Color4b {
{
}
- template<typename OtherSpace, eAlpha OtherAlpha>
- explicit Color4b(const Color4f<OtherSpace, OtherAlpha> &src)
+ template<typename OtherSpace> Color4f<OtherSpace, Alpha> convert_space() const
+ {
+ Color4f<OtherSpace, Alpha> result;
+ convert_space(this, result);
+ return result;
+ }
+
+ Color4f<Space, Alpha> to_color4f() const
{
- color_transfers_::transfer_color_(src, *this);
+ Color4f<Space, Alpha> result;
+ rgba_uchar_to_float(result, *this);
+ return result;
}
operator uint8_t *()
@@ -229,99 +283,39 @@ template<typename Space, eAlpha Alpha> struct Color4b {
}
};
-namespace color_transfers_ {
-
-MINLINE void associate_alpha_(const Color4f<LinearRGB, eAlpha::Straight> &src,
- Color4f<LinearRGB, eAlpha::Premultiplied> &r_out)
-{
- straight_to_premul_v4_v4(r_out, src);
-}
-
-MINLINE void unassociate_alpha_(const Color4f<LinearRGB, eAlpha::Premultiplied> &src,
- Color4f<LinearRGB, eAlpha::Straight> &r_out)
-{
- premul_to_straight_v4_v4(r_out, src);
-}
-
-/* Srgb byte <=> float. */
-MINLINE void transfer_color_(const Color4b<Srgb, eAlpha::Straight> &src,
- Color4f<Srgb, eAlpha::Straight> &r_out)
-{
- rgba_uchar_to_float(r_out, src);
-}
-
-MINLINE void transfer_color_(const Color4f<Srgb, eAlpha::Straight> &src,
- Color4b<Srgb, eAlpha::Straight> &r_out)
-{
- rgba_float_to_uchar(r_out, src);
-}
-
-MINLINE void transfer_color_(const Color4b<Srgb, eAlpha::Straight> &src,
- Color4f<LinearRGB, eAlpha::Premultiplied> &r_out)
-{
- Color4f<LinearRGB, eAlpha::Straight> intermediate(src);
- associate_alpha_(intermediate, r_out);
-}
-
-MINLINE void transfer_color_(const Color4b<Srgb, eAlpha::Straight> &src,
- Color4b<Srgb, eAlpha::Straight> &r_out)
-{
- r_out.r = src.r;
- r_out.g = src.g;
- r_out.b = src.b;
- r_out.a = src.a;
-}
-
-MINLINE void transfer_color_(const Color4f<LinearRGB, eAlpha::Premultiplied> &src,
- Color4f<LinearRGB, eAlpha::Straight> &r_out)
-{
- unassoc
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list