32#define TS( string ) wxString( _HKI( string ) ).ToStdString()
82 if( aColor <= UNSPECIFIED_COLOR || aColor >=
NBCOLORS )
90 for( ; candidate <
NBCOLORS; ++candidate )
92 if(
colorRefs()[candidate].m_Numcolor == aColor )
113 m_text = std::make_shared<wxString>( aColorStr );
119 r = aColor.Red() / 255.0;
120 g = aColor.Green() / 255.0;
121 b = aColor.Blue() / 255.0;
122 a = aColor.Alpha() / 255.0;
131 if( c.Set( aColorString ) )
134 g = c.Green() / 255.0;
135 b = c.Blue() / 255.0;
136 a = c.Alpha() / 255.0;
151 const int red = c.Red();
152 const int green = c.Green();
153 const int blue = c.Blue();
154 const int alpha = c.Alpha();
156 if ( alpha == wxALPHA_OPAQUE )
158 str.Printf( wxT(
"rgb(%d, %d, %d)" ),
red,
green,
blue );
162 wxString alpha_str = wxString::FromCDouble( alpha / 255.0, 3 );
167 alpha_str.Replace( wxT(
"," ), wxT(
"." ) );
169 str.Printf( wxT(
"rgba(%d, %d, %d, %s)" ),
red,
green,
blue, alpha_str );
178 wxString str = aColorString;
182 if( str.length() < 7 || !str.StartsWith(
'#' ) )
187 if( wxSscanf( str.wx_str() + 1, wxT(
"%lx" ), &tmp ) != 1 )
190 if( str.length() >= 9 )
192 r = ( (tmp >> 24) & 0xFF ) / 255.0;
193 g = ( (tmp >> 16) & 0xFF ) / 255.0;
194 b = ( (tmp >> 8) & 0xFF ) / 255.0;
195 a = ( tmp & 0xFF ) / 255.0;
199 r = ( (tmp >> 16) & 0xFF ) / 255.0;
200 g = ( (tmp >> 8) & 0xFF ) / 255.0;
201 b = ( tmp & 0xFF ) / 255.0;
213 return wxString::Format( wxT(
"#%02X%02X%02X%02X" ),
223 using CHAN_T = wxColourBase::ChannelType;
225 const wxColour colour(
226 static_cast<CHAN_T
>(
r * 255 + 0.5 ),
static_cast<CHAN_T
>(
g * 255 + 0.5 ),
227 static_cast<CHAN_T
>(
b * 255 + 0.5 ),
static_cast<CHAN_T
>(
a * 255 + 0.5 ) );
237 candidate.
r = ( (unsigned) ( 255.0 *
r ) | (unsigned) ( 255.0 * aColor.
r ) ) / 255.0,
238 candidate.
g = ( (
unsigned) ( 255.0 *
g ) | (
unsigned) ( 255.0 * aColor.
g ) ) / 255.0,
239 candidate.
b = ( (unsigned) ( 255.0 *
b ) | (unsigned) ( 255.0 * aColor.
b ) ) / 255.0,
242 candidate.
a = ( aColor.
a +
a ) / 2;
255 return lhs.
a == rhs.
a && lhs.
r == rhs.
r && lhs.
g == rhs.
g && lhs.
b == rhs.
b;
261 return !( lhs == rhs );
271 return lhs.
r < rhs.
r;
274 return lhs.
g < rhs.
g;
277 return lhs.
b < rhs.
b;
279 return lhs.
a < rhs.
a;
286 return aStream << *aColor.
m_text;
295 aJson = nlohmann::json( aColor.
m_text->ToStdString() );
297 aJson = nlohmann::json( aColor.
ToCSSString().ToStdString() );
309void COLOR4D::ToHSL(
double& aOutHue,
double& aOutSaturation,
double& aOutLightness )
const
311 auto min = std::min(
r, std::min(
g,
b ) );
312 auto max = std::max(
r, std::max(
g,
b ) );
313 auto diff = max - min;
315 aOutLightness = ( max + min ) / 2.0;
317 if( aOutLightness >= 1.0 )
318 aOutSaturation = 0.0;
320 aOutSaturation = diff / ( 1.0 -
std::abs( 2.0 * aOutLightness - 1.0 ) );
327 hue = (
g -
b ) / diff;
329 hue = (
b -
r ) / diff + 2.0;
331 hue = (
r -
g ) / diff + 4.0;
333 aOutHue = hue > 0.0 ? hue * 60.0 : hue * 60.0 + 360.0;
335 while( aOutHue < 0.0 )
342 const auto P = ( 1.0 -
std::abs( 2.0 * aInLightness - 1.0 ) ) * aInSaturation;
343 const auto scaled_hue = aInHue / 60.0;
344 const auto Q = P * ( 1.0 -
std::abs( std::fmod( scaled_hue, 2.0 ) - 1.0 ) );
346 r =
g =
b = aInLightness - P / 2.0;
348 if (scaled_hue < 1.0)
353 else if (scaled_hue < 2.0)
358 else if (scaled_hue < 3.0)
363 else if (scaled_hue < 4.0)
368 else if (scaled_hue < 5.0)
384 bool aAlwaysDefineHue )
const
386 double min, max,
delta;
389 min = min <
b ? min :
b;
392 max = max >
b ? max :
b;
399 aOutSaturation = (
delta / max );
403 aOutSaturation = 0.0;
404 aOutHue = aAlwaysDefineHue ? 0.0 : NAN;
421 aOutHue = 2.0 + (
b -
r ) /
delta;
423 aOutHue = 4.0 + (
r -
g ) /
delta;
432 aOutHue = aAlwaysDefineHue ? 0.0 : NAN;
465 double p = aInV * ( 1.0 - aInS );
466 double q = aInV * ( 1.0 - ( aInS * ff ) );
467 double t = aInV * ( 1.0 - ( aInS * ( 1.0 - ff ) ) );
516 if(
r ==
g &&
r ==
b )
521 ToHSV( h, s, v,
true );
531 if(
r ==
g &&
r ==
b )
551 return (
r - other.
r ) * (
r - other.
r )
552 + (
g - other.
g ) * (
g - other.
g )
553 + (
b - other.
b ) * (
b - other.
b );
572 int nearest_distance = 255 * 255 * 3 + 1;
575 trying =
static_cast<EDA_COLOR_T>( int( trying ) + 1 ) )
596 r = std::clamp( aRed, 0, 255 ) / 255.0;
597 g = std::clamp( aGreen, 0, 255 ) / 255.0;
598 b = std::clamp( aBlue, 0, 255 ) / 255.0;
599 a = std::clamp( aAlpha, 0.0, 1.0 );
614 return (
r < aRhs.
r ) ? -1 : 1;
617 return (
g < aRhs.
g ) ? -1 : 1;
620 return (
b < aRhs.
b ) ? -1 : 1;
623 return (
a < aRhs.
a ) ? -1 : 1;
632 double cr = (
r <= 0.04045 ) ? (
r / 12.92 ) : std::pow( (
r + 0.055 ) / 1.055, 2.4 );
633 double cg = (
g <= 0.04045 ) ? (
g / 12.92 ) : std::pow( (
g + 0.055 ) / 1.055, 2.4 );
634 double cb = (
b <= 0.04045 ) ? (
b / 12.92 ) : std::pow( (
b + 0.055 ) / 1.055, 2.4 );
636 return 0.2126 * cr + 0.7152 * cg + 0.0722 * cb;
647 return ( aRL + 0.05 ) / ( bRL + 0.05 );
649 return ( bRL + 0.05 ) / ( aRL + 0.05 );
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
A color representation with 4 components: red, green, blue, alpha.
static const COLOR4D CLEAR
void ToHSV(double &aOutHue, double &aOutSaturation, double &aOutValue, bool aAlwaysDefineHue=false) const
Convert current color (stored in RGB) to HSV format.
static double ContrastRatio(const COLOR4D &aLeft, const COLOR4D &aRight)
Compute the contrast ration between two colors using the formula from WCAG21.
void ToHSL(double &aOutHue, double &aOutSaturation, double &aOutLightness) const
Converts current color (stored in RGB) to HSL format.
bool SetFromWxString(const wxString &aColorString)
Set color values by parsing a string using wxColour::Set().
bool SetFromHexString(const wxString &aColorString)
COLOR4D LegacyMix(const COLOR4D &aColor) const
Mix this COLOR4D with an input COLOR4D using the OR-mixing of legacy canvas.
static EDA_COLOR_T FindNearestLegacyColor(int aR, int aG, int aB)
Returns a legacy color ID that is closest to the given 8-bit RGB values.
void FromHSV(double aInH, double aInS, double aInV)
Changes currently used color to the one given by hue, saturation and value parameters.
wxString ToHexString() const
wxString ToCSSString() const
int Compare(const COLOR4D &aRhs) const
static const COLOR4D WHITE
std::shared_ptr< wxString > m_text
double RelativeLuminance() const
Compute the relative luminance of a color using the formula from WCAG21.
wxColour ToColour() const
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
COLOR4D & Desaturate()
Removes color (in HSL model)
double Distance(const COLOR4D &other) const
Returns the distance (in RGB space) between two colors.
void FromHSL(double aInHue, double aInSaturation, double aInLightness)
Change currently used color to the one given by hue, saturation and lightness parameters.
static const COLOR4D BLACK
COLOR4D & FromCSSRGBA(int aRed, int aGreen, int aBlue, double aAlpha=1.0)
Initialize the color from a RGBA value with 0-255 red/green/blue and 0-1 alpha.
COLOR4D & Saturate(double aFactor)
Saturates the color to a given factor (in HSV model)
const StructColors * colorRefs()
Global list of legacy color names, still used all over the place for constructing COLOR4D's.
EDA_COLOR_T
Legacy color enumeration.
@ NBCOLORS
Number of colors.
Some functions to handle hotkeys in KiCad.
The Cairo implementation of the graphics abstraction layer.
void from_json(const nlohmann::json &aJson, COLOR4D &aColor)
bool operator==(const COLOR4D &lhs, const COLOR4D &rhs)
Equality operator, are two colors equal.
void to_json(nlohmann::json &aJson, const COLOR4D &aColor)
bool operator<(const COLOR4D &lhs, const COLOR4D &rhs)
std::ostream & operator<<(std::ostream &aStream, COLOR4D const &aColor)
Syntactic sugar for outputting colors to strings.
bool operator!=(const COLOR4D &lhs, const COLOR4D &rhs)
Not equality operator, are two colors not equal.
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
static float distance(const SFVEC2UI &a, const SFVEC2UI &b)