222 lines
4.8 KiB
C++
222 lines
4.8 KiB
C++
/// @file crgb.hpp
|
|
/// Defines utility functions for the red, green, and blue (RGB) pixel struct
|
|
|
|
#pragma once
|
|
|
|
#include "fl/stdint.h"
|
|
#include "chsv.h"
|
|
#include "crgb.h"
|
|
#include "lib8tion.h"
|
|
#include "fl/namespace.h"
|
|
#include "fl/force_inline.h"
|
|
#include "fl/str.h"
|
|
|
|
#include "fl/compiler_control.h"
|
|
|
|
FL_DISABLE_WARNING_PUSH
|
|
FL_DISABLE_WARNING_UNUSED_PARAMETER
|
|
FL_DISABLE_WARNING_RETURN_TYPE
|
|
FL_DISABLE_WARNING_IMPLICIT_INT_CONVERSION
|
|
FL_DISABLE_WARNING_FLOAT_CONVERSION
|
|
FL_DISABLE_WARNING_SIGN_CONVERSION
|
|
|
|
#if FASTLED_IS_USING_NAMESPACE
|
|
#define FUNCTION_SCALE8(a,b) FASTLED_NAMESPACE::scale8(a,b)
|
|
#else
|
|
#define FUNCTION_SCALE8(a,b) ::scale8(a,b)
|
|
#endif
|
|
|
|
FASTLED_NAMESPACE_BEGIN
|
|
|
|
FASTLED_FORCE_INLINE CRGB& CRGB::addToRGB (uint8_t d )
|
|
{
|
|
r = qadd8( r, d);
|
|
g = qadd8( g, d);
|
|
b = qadd8( b, d);
|
|
return *this;
|
|
}
|
|
|
|
FASTLED_FORCE_INLINE CRGB& CRGB::operator-= (const CRGB& rhs )
|
|
{
|
|
r = qsub8( r, rhs.r);
|
|
g = qsub8( g, rhs.g);
|
|
b = qsub8( b, rhs.b);
|
|
return *this;
|
|
}
|
|
|
|
/// Add a constant of '1' from each channel, saturating at 0xFF
|
|
FASTLED_FORCE_INLINE CRGB& CRGB::operator++ ()
|
|
{
|
|
addToRGB(1);
|
|
return *this;
|
|
}
|
|
|
|
/// @copydoc operator++
|
|
FASTLED_FORCE_INLINE CRGB CRGB::operator++ (int )
|
|
{
|
|
CRGB retval(*this);
|
|
++(*this);
|
|
return retval;
|
|
}
|
|
|
|
FASTLED_FORCE_INLINE CRGB& CRGB::subtractFromRGB(uint8_t d)
|
|
{
|
|
r = qsub8( r, d);
|
|
g = qsub8( g, d);
|
|
b = qsub8( b, d);
|
|
return *this;
|
|
}
|
|
|
|
FASTLED_FORCE_INLINE CRGB& CRGB::operator*= (uint8_t d )
|
|
{
|
|
r = qmul8( r, d);
|
|
g = qmul8( g, d);
|
|
b = qmul8( b, d);
|
|
return *this;
|
|
}
|
|
|
|
FASTLED_FORCE_INLINE CRGB& CRGB::nscale8_video(uint8_t scaledown )
|
|
{
|
|
nscale8x3_video( r, g, b, scaledown);
|
|
return *this;
|
|
}
|
|
|
|
FASTLED_FORCE_INLINE CRGB& CRGB::operator%= (uint8_t scaledown )
|
|
{
|
|
nscale8x3_video( r, g, b, scaledown);
|
|
return *this;
|
|
}
|
|
|
|
FASTLED_FORCE_INLINE CRGB& CRGB::fadeLightBy (uint8_t fadefactor )
|
|
{
|
|
nscale8x3_video( r, g, b, 255 - fadefactor);
|
|
return *this;
|
|
}
|
|
|
|
/// Subtract a constant of '1' from each channel, saturating at 0x00
|
|
FASTLED_FORCE_INLINE CRGB& CRGB::operator-- ()
|
|
{
|
|
subtractFromRGB(1);
|
|
return *this;
|
|
}
|
|
|
|
/// @copydoc operator--
|
|
FASTLED_FORCE_INLINE CRGB CRGB::operator-- (int )
|
|
{
|
|
CRGB retval(*this);
|
|
--(*this);
|
|
return retval;
|
|
}
|
|
|
|
|
|
constexpr CRGB CRGB::nscale8_constexpr(const CRGB scaledown) const
|
|
{
|
|
return CRGB(
|
|
scale8_constexpr(r, scaledown.r),
|
|
scale8_constexpr(g, scaledown.g),
|
|
scale8_constexpr(b, scaledown.b)
|
|
);
|
|
}
|
|
|
|
|
|
FASTLED_FORCE_INLINE CRGB& CRGB::nscale8 (const CRGB & scaledown )
|
|
{
|
|
r = FUNCTION_SCALE8(r, scaledown.r);
|
|
g = FUNCTION_SCALE8(g, scaledown.g);
|
|
b = FUNCTION_SCALE8(b, scaledown.b);
|
|
return *this;
|
|
}
|
|
|
|
FASTLED_FORCE_INLINE CRGB CRGB::scale8 (uint8_t scaledown ) const
|
|
{
|
|
CRGB out = *this;
|
|
nscale8x3( out.r, out.g, out.b, scaledown);
|
|
return out;
|
|
}
|
|
|
|
FASTLED_FORCE_INLINE CRGB CRGB::scale8 (const CRGB & scaledown ) const
|
|
{
|
|
CRGB out;
|
|
out.r = FUNCTION_SCALE8(r, scaledown.r);
|
|
out.g = FUNCTION_SCALE8(g, scaledown.g);
|
|
out.b = FUNCTION_SCALE8(b, scaledown.b);
|
|
return out;
|
|
}
|
|
|
|
|
|
FASTLED_FORCE_INLINE uint8_t CRGB::getLuma( ) const {
|
|
//Y' = 0.2126 R' + 0.7152 G' + 0.0722 B'
|
|
// 54 183 18 (!)
|
|
|
|
uint8_t luma = scale8_LEAVING_R1_DIRTY( r, 54) + \
|
|
scale8_LEAVING_R1_DIRTY( g, 183) + \
|
|
scale8_LEAVING_R1_DIRTY( b, 18);
|
|
cleanup_R1();
|
|
return luma;
|
|
}
|
|
|
|
FASTLED_FORCE_INLINE uint8_t CRGB::getAverageLight( ) const {
|
|
#if FASTLED_SCALE8_FIXED == 1
|
|
const uint8_t eightyfive = 85;
|
|
#else
|
|
const uint8_t eightyfive = 86;
|
|
#endif
|
|
uint8_t avg = scale8_LEAVING_R1_DIRTY( r, eightyfive) + \
|
|
scale8_LEAVING_R1_DIRTY( g, eightyfive) + \
|
|
scale8_LEAVING_R1_DIRTY( b, eightyfive);
|
|
cleanup_R1();
|
|
return avg;
|
|
}
|
|
|
|
|
|
|
|
FASTLED_FORCE_INLINE CRGB CRGB::lerp16( const CRGB& other, fract16 frac) const
|
|
{
|
|
CRGB ret;
|
|
|
|
ret.r = lerp16by16(r<<8,other.r<<8,frac)>>8;
|
|
ret.g = lerp16by16(g<<8,other.g<<8,frac)>>8;
|
|
ret.b = lerp16by16(b<<8,other.b<<8,frac)>>8;
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
/// @copydoc CRGB::operator+=
|
|
FASTLED_FORCE_INLINE CRGB operator+( const CRGB& p1, const CRGB& p2)
|
|
{
|
|
return CRGB( qadd8( p1.r, p2.r),
|
|
qadd8( p1.g, p2.g),
|
|
qadd8( p1.b, p2.b));
|
|
}
|
|
|
|
/// @copydoc CRGB::operator-=
|
|
FASTLED_FORCE_INLINE CRGB operator-( const CRGB& p1, const CRGB& p2)
|
|
{
|
|
return CRGB( qsub8( p1.r, p2.r),
|
|
qsub8( p1.g, p2.g),
|
|
qsub8( p1.b, p2.b));
|
|
}
|
|
|
|
/// @copydoc CRGB::operator*=
|
|
FASTLED_FORCE_INLINE CRGB operator*( const CRGB& p1, uint8_t d)
|
|
{
|
|
return CRGB( qmul8( p1.r, d),
|
|
qmul8( p1.g, d),
|
|
qmul8( p1.b, d));
|
|
}
|
|
|
|
/// Scale using CRGB::nscale8_video()
|
|
FASTLED_FORCE_INLINE CRGB operator%( const CRGB& p1, uint8_t d)
|
|
{
|
|
CRGB retval( p1);
|
|
retval.nscale8_video( d);
|
|
return retval;
|
|
}
|
|
|
|
FASTLED_NAMESPACE_END
|
|
|
|
#undef FUNCTION_SCALE8
|
|
|
|
FL_DISABLE_WARNING_POP
|