[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