160 class CLASS_DECL_ACME color :
166 constexpr color() { m_u8Red = m_u8Green = m_u8Blue = m_u8Opacity = 0; }
168 template < prototype_number GRAY, prototype_number ALPHA >
169 constexpr color(GRAY gray, ALPHA u8Opacity) { set_red(gray); set_green(gray); set_blue(gray); set_opacity(u8Opacity); }
174 constexpr color(const ::color32_t & color32) { set(color32); }
175 constexpr color(const ::rgba_t & rgba) { set(rgba); }
176 constexpr color(const ::bgra_t & bgra) { set(bgra); }
177 constexpr color(const ::color::color & color) { m_u32 = color.m_u32; }
178 constexpr color(const ::color::color & color,
const class ::opacity&
opacity) { m_u32 = color.m_u32; m_u8Opacity =
opacity.u8_opacity(); }
181 constexpr color(enum_plain_color eplaincolor);
182 constexpr color(enum_plain_color eplaincolor, ::u8 u8Opacity) : color(eplaincolor) { m_u8Opacity = u8Opacity; }
183 color(
const hls &
hls, ::u8 A = 255);
184 color(
const hsv &
hsv, ::u8 A = 255);
189 constexpr ::u8 u8_red()
const {
return m_u8Red; }
190 constexpr ::u8 u8_green()
const {
return m_u8Green; }
191 constexpr ::u8 u8_blue()
const {
return m_u8Blue; }
192 constexpr ::u8 u8_opacity()
const {
return m_u8Opacity; }
193 constexpr ::f32 f32_red()
const {
return m_u8Red / 255.f; }
194 constexpr ::f32 f32_green()
const {
return m_u8Green / 255.f; }
195 constexpr ::f32 f32_blue()
const {
return m_u8Blue / 255.f; }
196 constexpr ::f32 f32_opacity()
const {
return m_u8Opacity / 255.f; }
197 constexpr ::f64 f64_red()
const {
return m_u8Red / 255.; }
198 constexpr ::f64 f64_green()
const {
return m_u8Green / 255.; }
199 constexpr ::f64 f64_blue()
const {
return m_u8Blue / 255.; }
200 constexpr ::f64 f64_opacity()
const {
return m_u8Opacity / 255.; }
202 constexpr color contrasting_color()
const {
203 ::f32 luminance = 0.299f * f32_red() + 0.587f * f32_green() + 0.144f * f32_blue();
204 return color(luminance < 0.5f ? 255 : 0, 255);
207 color & operator =(const ::payload &
payload);
222 constexpr bool is_opaque()
const {
return m_u8Opacity == 255; }
223 constexpr bool is_translucent()
const {
return m_u8Opacity > 0 && m_u8Opacity < 255; }
224 constexpr bool is_transparent()
const {
return m_u8Opacity == 0; }
225 constexpr bool non_transparent()
const {
return m_u8Opacity > 0; }
226 constexpr bool has_opacity()
const {
return non_transparent(); }
229 void hls_mult(::f64 dRateH, ::f64 dRateL, ::f64 dRateS);
230 void hls_rate(::f64 dRateH, ::f64 dRateL, ::f64 dRateS);
231 void hue_rate(::f64 dRateL);
232 void lightness_rate(::f64 dRateL);
233 void saturation_rate(::f64 dRateL);
234 constexpr void set(::rgba_t rgba);
237 constexpr void set(::bgra_t bgra);
238 void get_hls(::f64 & dHue, ::f64 & dLightness, ::f64 & dSaturation)
const;
239 void get_hsv(::f64 & dHue, ::f64 & dBlack, ::f64 & dWhite)
const;
241 static ::color::color from_hue(::f64 dHue);
243 void set_hls(::f64 dHue, ::f64 dLightness, ::f64 dSaturation);
244 void set_hsv(::f64 dHue, ::f64 dBlack, ::f64 dWhite);
245 void hls_mult(hls & hls);
246 void hls_rate(hls & hls);
247 void get_hls(hls & hls)
const;
248 void get_hsv(hsv & hsv)
const;
249 void set_hls(
const hls & hls);
250 void set_hsv(
const hsv & hsv);
254 ::color::hls get_hls()
const { hls hls; get_hls(hls);
return hls; }
256 ::color::hsv get_hsv()
const { hsv hsv; get_hsv(hsv);
return hsv; }
258 constexpr ::rgba_t rgba()
const;
259 constexpr ::bgra_t bgra()
const;
260 constexpr ::rgba_t rgb()
const;
261 constexpr ::bgra_t bgr()
const;
262 constexpr ::color32_t color32()
const
265 return argb32_color32(
278 template <
typename R,
typename G,
typename B >
279 constexpr void set(R r, G g, B b) { set_red(r); set_green(g); set_blue(b); }
281 template <
typename R,
typename G,
typename B,
typename A >
282 constexpr void set(R r, G g, B b, A a) { set_red(r); set_green(g); set_blue(b); set_opacity(a); }
284 constexpr ::u8 set_red(::u8 r) {
return this->m_u8Red = r; }
286 constexpr ::u8 set_green(::u8 g) {
return this->m_u8Green = g; }
288 constexpr ::u8 set_blue(::u8 b) {
return this->m_u8Blue = b; }
290 constexpr ::u8 set_opacity(::u8 a) {
return this->m_u8Opacity = a; }
292 constexpr ::u16 set_red(::u16 r) { this->m_u8Red = r >> 8;
return r; }
294 constexpr ::u16 set_green(::u16 g) { this->m_u8Green = g >> 8;
return g;}
296 constexpr ::u16 set_blue(::u16 b) { this->m_u8Blue = b >> 8;
return b;}
298 constexpr ::u16 set_opacity(::u16 a) { this->m_u8Opacity = a >> 8;
return a;}
300 constexpr ::i32 set_red(::i32 r) { this->m_u8Red = r;
return r; }
302 constexpr ::i32 set_green(::i32 g) { this->m_u8Green = g;
return g; }
304 constexpr ::i32 set_blue(::i32 b) { this->m_u8Blue = b;
return b;}
306 constexpr ::i32 set_opacity(::i32 a) { this->m_u8Opacity = a;
return a;}
308 constexpr ::f32 set_red(::f32 f) { this->m_u8Red = (::u8)(f * 255.0f);
return f; }
310 constexpr ::f32 set_green(::f32 f) { this->m_u8Green = (::u8)(f * 255.0f);
return f; }
312 constexpr ::f32 set_blue(::f32 f) { this->m_u8Blue = (::u8)(f * 255.0f);
return f; }
314 constexpr ::f32 set_opacity(::f32 f) { this->m_u8Opacity = (::u8)(f * 255.0f);
return f; }
316 constexpr ::f64 set_red(::f64 f) { this->m_u8Red = (::u8)(f * 255.0);
return f; }
318 constexpr ::f64 set_green(::f64 f) { this->m_u8Green = (::u8)(f * 255.0);
return f; }
320 constexpr ::f64 set_blue(::f64 f) { this->m_u8Blue = (::u8)(f * 255.0);
return f; }
322 constexpr ::f64 set_opacity(::f64 f) { this->m_u8Opacity = (::u8)(f * 255.0);
return f; }
324 constexpr void set_opacity(class ::opacity opacity) { this->m_u8Opacity = (::u8)(opacity.u8_opacity() * 255.0); }
326 constexpr void set_opaque() { this->m_u8Opacity = 255; }
328 constexpr void set_unsigned_char(::u8 R, ::u8 G, ::u8 B) { m_u8Red = R; m_u8Green = G; m_u8Blue = B; m_u8Opacity = 255; }
329 constexpr void set_unsigned_char(::u8 R, ::u8 G, ::u8 B, ::u8 A) { m_u8Red = R; m_u8Green = G; m_u8Blue = B; m_u8Opacity = A; }
330 constexpr void set_f64(::f64 R, ::f64 G, ::f64 B) { m_u8Red = (::u8) (R * 255.); m_u8Green = (::u8) (G * 255.); m_u8Blue = (::u8) (B * 255.); m_u8Opacity = 255; }
331 constexpr void set_f64(::f64 R, ::f64 G, ::f64 B, ::f64 A) { m_u8Red = (::u8)(R * 255.); m_u8Green = (::u8) (G * 255.); m_u8Blue = (::u8) (B * 255.); m_u8Opacity = (::u8) (A * 255.); }
333 void make_black_and_white();
335 constexpr operator ::color32_t()
const
338 return this->color32();
343 constexpr void set(::color32_t color32)
346 m_u8Red = color32.u8_red();
347 m_u8Green = color32.u8_green();
348 m_u8Blue = color32.u8_blue();
349 m_u8Opacity = color32.u8_opacity();
354 constexpr void set(const ::color::color & color)
362 constexpr color & operator = (const ::color::color & color);
363 constexpr color & operator = (::color32_t color32);
364 constexpr color & operator = (enum_plain_color ecolor);
365 color & operator = (
const hls & hls);
366 color & operator = (
const hsv & hsv);
368 bool parse_color(const ::scoped_string & scopedstr);
372 void hue_offset(::f64 dRadians);
375 constexpr auto byte_minimum_rgb()
const {
return minimum({ u8_red(), u8_green(), u8_blue() }); }
376 constexpr auto byte_maximum_rgb()
const {
return maximum({ u8_red(), u8_green(), u8_blue() }); }
377 constexpr auto f32_minimum_rgb()
const {
return byte_minimum_rgb() / 255.f; }
378 constexpr auto f32_maximum_rgb()
const {
return byte_maximum_rgb() / 255.f; }
379 constexpr auto f64_minimum_rgb()
const {
return byte_minimum_rgb() / 255.; }
380 constexpr auto f64_maximum_rgb()
const {
return byte_maximum_rgb() / 255.; }
383 constexpr ::color::color & rate_rgb_set_opacity(class ::opacity opacity, ::f64 dRate)
390 set_opacity(opacity);
397 constexpr void rate_red(::f64 dRate) { m_u8Red = (::u8)(m_u8Red * dRate); }
398 constexpr void rate_green(::f64 dRate) { m_u8Green = (::u8)(m_u8Green * dRate); }
399 constexpr void rate_blue(::f64 dRate) { m_u8Blue = (::u8)(m_u8Blue * dRate); }
400 constexpr void rate_opacity(::f64 dRate) { m_u8Opacity = (::u8)(m_u8Opacity * dRate); }
403 inline static bool similar_color_component(::f64 d1, ::f64 d2) {
return fabs(d2 - d1) < (1.0 / 255.0); }
405 constexpr bool operator == (const ::color::color& color)
const {
return m_u32 == color.m_u32; }
406 constexpr bool operator == (::color32_t color32)
const {
return this->
operator color32_t().m_u32 == color32.m_u32; }
407 constexpr bool operator == (enum_plain_color ecolor)
const {
return m_u32 == ::color::color(ecolor).m_u32; }
408 bool operator == (
const hls & hls)
const
411 auto hlsThis = get_hls();
413 return similar_color_component(hlsThis.m_dH, hls.m_dH)
414 && similar_color_component(hlsThis.m_dL, hls.m_dL)
415 && similar_color_component(hlsThis.m_dS, hls.m_dS);
425 void blend(const ::color::color & color, ::f64 dRate)
428 ::f64 dComplement = 1.0 - dRate;
430 m_u8Red = (::u8)(m_u8Red * dComplement + color.m_u8Red * dRate);
431 m_u8Green = (::u8)(m_u8Green * dComplement + color.m_u8Green * dRate);
432 m_u8Blue = (::u8)(m_u8Blue * dComplement + color.m_u8Blue * dRate);
433 m_u8Opacity = (::u8)(m_u8Opacity * dComplement + color.m_u8Opacity * dRate);
437 ::color::color get_blend(const ::color::color& color, ::f64 dRate)
const
440 ::color::color colorResult(*
this);
442 colorResult.blend(color, dRate);
453 constexpr ::f64 get_luminance()
const {
return (m_u8Red + m_u8Green + m_u8Blue) / (255.0 * 3.0); }
454 ::f64 get_saturation()
const {
return get_hls().m_dS; }
455 ::f64 get_hue()
const {
return get_hls().m_dH; }
457 constexpr auto opaque()
const {
return *
this & ::opacity(255); }
460 constexpr color & operator &=(
const class ::opacity & opacity)
463 this->m_u8Opacity = opacity.u8_opacity();
479 constexpr color operator &(
const class ::opacity & opacity)
const