Blender V5.0
BLI_color_types.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include <cstdint>
12
14
15namespace blender {
16
67
75
85
87template<typename ChannelStorageType, eSpace Space, eAlpha Alpha> class ColorRGBA {
88 public:
89 ChannelStorageType r, g, b, a;
90 constexpr ColorRGBA() = default;
91
92 constexpr ColorRGBA(const ChannelStorageType rgba[4])
93 : r(rgba[0]), g(rgba[1]), b(rgba[2]), a(rgba[3])
94 {
95 }
96
97 constexpr ColorRGBA(const ChannelStorageType r,
98 const ChannelStorageType g,
99 const ChannelStorageType b,
100 const ChannelStorageType a)
101 : r(r), g(g), b(b), a(a)
102 {
103 }
104
105 operator ChannelStorageType *()
106 {
107 return &r;
108 }
109
110 operator const ChannelStorageType *() const
111 {
112 return &r;
113 }
114
116
118 {
119 uint64_t x1 = *reinterpret_cast<const uint32_t *>(&r);
120 uint64_t x2 = *reinterpret_cast<const uint32_t *>(&g);
121 uint64_t x3 = *reinterpret_cast<const uint32_t *>(&b);
122 uint64_t x4 = *reinterpret_cast<const uint32_t *>(&a);
123 return (x1 * 1283591) ^ (x2 * 850177) ^ (x3 * 735391) ^ (x4 * 442319);
124 }
125};
126
127/* Forward declarations of concrete color classes. */
128
129template<eAlpha Alpha> class ColorSceneLinear4f;
130template<eAlpha Alpha> class ColorSceneLinearByteEncoded4b;
131template<typename ChannelStorageType> class ColorTheme4;
132
133template<eAlpha Alpha>
134class ColorSceneLinear4f final : public ColorRGBA<float, eSpace::SceneLinear, Alpha> {
135 public:
136 constexpr ColorSceneLinear4f() = default;
137
138 constexpr ColorSceneLinear4f(const float *rgba)
139 : ColorRGBA<float, eSpace::SceneLinear, Alpha>(rgba)
140 {
141 }
142
143 constexpr ColorSceneLinear4f(float r, float g, float b, float a)
144 : ColorRGBA<float, eSpace::SceneLinear, Alpha>(r, g, b, a)
145 {
146 }
147};
148
149template<eAlpha Alpha>
151 : public ColorRGBA<uint8_t, eSpace::SceneLinearByteEncoded, Alpha> {
152 public:
153 constexpr ColorSceneLinearByteEncoded4b() = default;
154
155 constexpr ColorSceneLinearByteEncoded4b(const uint8_t *rgba)
156 : ColorRGBA<uint8_t, eSpace::SceneLinearByteEncoded, Alpha>(rgba)
157 {
158 }
159
160 constexpr ColorSceneLinearByteEncoded4b(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
161 : ColorRGBA<uint8_t, eSpace::SceneLinearByteEncoded, Alpha>(r, g, b, a)
162 {
163 }
164};
165
175template<typename ChannelStorageType>
176class ColorTheme4 final : public ColorRGBA<ChannelStorageType, eSpace::Theme, eAlpha::Straight> {
177 public:
178 constexpr ColorTheme4() = default;
179
180 constexpr ColorTheme4(const ChannelStorageType *rgba)
181 : ColorRGBA<ChannelStorageType, eSpace::Theme, eAlpha::Straight>(rgba)
182 {
183 }
184
185 constexpr ColorTheme4(ChannelStorageType r,
186 ChannelStorageType g,
187 ChannelStorageType b,
188 ChannelStorageType a)
189 : ColorRGBA<ChannelStorageType, eSpace::Theme, eAlpha::Straight>(r, g, b, a)
190 {
191 }
192};
193
196
197/* Internal roles. For convenience to shorten the type names and hide complexity. */
198
203
204} // namespace blender
#define final(a, b, c)
Definition BLI_hash.h:19
#define BLI_STRUCT_EQUALITY_OPERATORS_4(Type, m1, m2, m3, m4)
unsigned long long int uint64_t
ChannelStorageType r
ChannelStorageType g
uint64_t hash() const
constexpr ColorRGBA(const ChannelStorageType r, const ChannelStorageType g, const ChannelStorageType b, const ChannelStorageType a)
ChannelStorageType b
constexpr ColorRGBA(const ChannelStorageType rgba[4])
ChannelStorageType a
constexpr ColorRGBA()=default
constexpr ColorSceneLinear4f(const float *rgba)
constexpr ColorSceneLinear4f()=default
constexpr ColorSceneLinear4f(float r, float g, float b, float a)
constexpr ColorSceneLinearByteEncoded4b(const uint8_t *rgba)
constexpr ColorSceneLinearByteEncoded4b(uint8_t r, uint8_t g, uint8_t b, uint8_t a)
constexpr ColorSceneLinearByteEncoded4b()=default
constexpr ColorTheme4(const ChannelStorageType *rgba)
constexpr ColorTheme4()=default
constexpr ColorTheme4(ChannelStorageType r, ChannelStorageType g, ChannelStorageType b, ChannelStorageType a)
nullptr float
ColorTheme4< uint8_t > ColorTheme4b
ColorSceneLinearByteEncoded4b< eAlpha::Straight > ColorPaint4b
ColorSceneLinear4f< eAlpha::Straight > ColorPaint4f
ColorSceneLinear4f< eAlpha::Premultiplied > ColorGeometry4f
ColorTheme4< float > ColorTheme4f
ColorSceneLinearByteEncoded4b< eAlpha::Premultiplied > ColorGeometry4b