KiCad PCB EDA Suite
Loading...
Searching...
No Matches
color4d.h
Go to the documentation of this file.
1/*
2 * This program source code file is part of KICAD, a free EDA CAD application.
3 *
4 * Copyright (C) 2012 Torsten Hueter, torstenhtr <at> gmx.de
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * Color class
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, you may find one here:
21 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22 * or you may search the http://www.gnu.org website for the version 2 license,
23 * or you may write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25 */
26
27#ifndef COLOR4D_H_
28#define COLOR4D_H_
29
30#include <kicommon.h>
31#include <wx/debug.h>
32#include <wx/colour.h>
33#include <wx/string.h>
34#include <hash.h>
35#include <nlohmann/json_fwd.hpp>
36
37
83
84
86{
87 unsigned char m_Blue;
88 unsigned char m_Green;
89 unsigned char m_Red;
91 std::string m_ColorName;
93};
94
97
98
99namespace KIGFX
100{
105{
106public:
107 // Constructor (creates the Color 0,0,0,0)
109 r( 0 ),
110 g( 0 ),
111 b( 0 ),
112 a( 1.0 )
113 {
114 }
115
122 COLOR4D( double aRed, double aGreen, double aBlue, double aAlpha ) :
123 r( aRed ),
124 g( aGreen ),
125 b( aBlue ),
126 a( aAlpha )
127 {
128 wxASSERT( r >= 0.0 && r <= 1.0 );
129 wxASSERT( g >= 0.0 && g <= 1.0 );
130 wxASSERT( b >= 0.0 && b <= 1.0 );
131 wxASSERT( a >= 0.0 && a <= 1.0 );
132 }
133
138 COLOR4D( EDA_COLOR_T aColor );
139
147 COLOR4D& FromCSSRGBA( int aRed, int aGreen, int aBlue, double aAlpha = 1.0 );
148
153 COLOR4D( const wxString& aColorStr );
154
158 COLOR4D( const wxColour& aColor );
159
166 bool SetFromWxString( const wxString& aColorString );
167
168 wxString ToCSSString() const;
169
170 bool SetFromHexString( const wxString& aColorString );
171 wxString ToHexString() const;
172
173 wxColour ToColour() const;
174
183 COLOR4D LegacyMix( const COLOR4D& aColor ) const;
184
193 void ToHSL( double& aOutHue, double& aOutSaturation, double& aOutLightness ) const;
194
202 void FromHSL( double aInHue, double aInSaturation, double aInLightness );
203
210 COLOR4D& Brighten( double aFactor )
211 {
212 wxASSERT( aFactor >= 0.0 && aFactor <= 1.0 );
213
214 r = r * ( 1.0 - aFactor ) + aFactor;
215 g = g * ( 1.0 - aFactor ) + aFactor;
216 b = b * ( 1.0 - aFactor ) + aFactor;
217
218 return *this;
219 }
220
227 COLOR4D& Darken( double aFactor )
228 {
229 wxASSERT( aFactor >= 0.0 && aFactor <= 1.0 );
230
231 r = r * ( 1.0 - aFactor );
232 g = g * ( 1.0 - aFactor );
233 b = b * ( 1.0 - aFactor );
234
235 return *this;
236 }
237
244 {
245 r = ( 1.0 - r );
246 g = ( 1.0 - g );
247 b = ( 1.0 - b );
248
249 return *this;
250 }
251
255 COLOR4D& Saturate( double aFactor );
256
261 COLOR4D& Desaturate();
262
269 COLOR4D Brightened( double aFactor ) const
270 {
271 wxASSERT( aFactor >= 0.0 && aFactor <= 1.0 );
272
273 return COLOR4D( r * ( 1.0 - aFactor ) + aFactor, g * ( 1.0 - aFactor ) + aFactor,
274 b * ( 1.0 - aFactor ) + aFactor, a );
275 }
276
283 COLOR4D Darkened( double aFactor ) const
284 {
285 wxASSERT( aFactor >= 0.0 && aFactor <= 1.0 );
286
287 return COLOR4D( r * ( 1.0 - aFactor ), g * ( 1.0 - aFactor ), b * ( 1.0 - aFactor ), a );
288 }
289
296 COLOR4D Mix( const COLOR4D& aColor, double aFactor ) const
297 {
298 wxASSERT( aFactor >= 0.0 && aFactor <= 1.0 );
299
300 return COLOR4D( aColor.r * ( 1.0 - aFactor ) + r * aFactor,
301 aColor.g * ( 1.0 - aFactor ) + g * aFactor,
302 aColor.b * ( 1.0 - aFactor ) + b * aFactor,
303 a );
304 }
305
312 COLOR4D WithAlpha( double aAlpha ) const
313 {
314 wxASSERT( aAlpha >= 0.0 && aAlpha <= 1.0 );
315
316 return COLOR4D( r, g, b, aAlpha );
317 }
318
325 {
326 return COLOR4D( 1.0 - r, 1.0 - g, 1.0 - b, a );
327 }
328
334 double GetBrightness() const
335 {
336 // Weighted W3C formula
337 return r * 0.299 + g * 0.587 + b * 0.117;
338 }
339
352 void ToHSV( double& aOutHue, double& aOutSaturation, double& aOutValue,
353 bool aAlwaysDefineHue = false ) const;
354
362 void FromHSV( double aInH, double aInS, double aInV );
363
367 double Distance( const COLOR4D& other ) const;
368
369 int Compare( const COLOR4D& aRhs ) const;
370
376 double RelativeLuminance() const;
377
385 static double ContrastRatio( const COLOR4D& aLeft, const COLOR4D& aRight );
386
390 static EDA_COLOR_T FindNearestLegacyColor( int aR, int aG, int aB );
391
392 // Color components: red, green, blue, alpha
393 double r;
394 double g;
395 double b;
396 double a;
397
399 static const COLOR4D UNSPECIFIED;
400
401 // Declare a few color shortcuts that are used for comparisons frequently
402 static const COLOR4D WHITE;
403 static const COLOR4D BLACK;
404 static const COLOR4D CLEAR;
405};
406
408KICOMMON_API bool operator==( const COLOR4D& lhs, const COLOR4D& rhs );
409
411KICOMMON_API bool operator!=( const COLOR4D& lhs, const COLOR4D& rhs );
412
413KICOMMON_API bool operator<( const COLOR4D& lhs, const COLOR4D& rhs );
414
416KICOMMON_API std::ostream& operator<<( std::ostream& aStream, COLOR4D const& aColor );
417
418// to allow json( COLOR4D )
419KICOMMON_API void to_json( nlohmann::json& aJson, const COLOR4D& aColor );
420
421// To allow json::get<COLOR4D>()
422KICOMMON_API void from_json( const nlohmann::json& aJson, COLOR4D& aColor );
423
424} // namespace KIGFX
425
426template<>
427struct KICOMMON_API std::hash<KIGFX::COLOR4D>
428{
429 std::size_t operator()( const KIGFX::COLOR4D& aColor ) const
430 {
431 return hash_val( aColor.r, aColor.b, aColor.g, aColor.a );
432 }
433};
434
435#endif /* COLOR4D_H_ */
COLOR4D()
Definition color4d.h:108
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
double r
Red component.
Definition color4d.h:393
double g
Green component.
Definition color4d.h:394
COLOR4D WithAlpha(double aAlpha) const
Return a color with the same color, but the given alpha.
Definition color4d.h:312
static const COLOR4D CLEAR
Definition color4d.h:404
COLOR4D & Invert()
Makes the color inverted, alpha remains the same.
Definition color4d.h:243
COLOR4D & Darken(double aFactor)
Makes the color darker by a given factor.
Definition color4d.h:227
COLOR4D Darkened(double aFactor) const
Return a color that is darker by a given factor, without modifying object.
Definition color4d.h:283
COLOR4D Inverted() const
Returns an inverted color, alpha remains the same.
Definition color4d.h:324
COLOR4D & Brighten(double aFactor)
Makes the color brighter by a given factor.
Definition color4d.h:210
double GetBrightness() const
Returns the brightness value of the color ranged from 0.0 to 1.0.
Definition color4d.h:334
static const COLOR4D WHITE
Definition color4d.h:402
double a
Alpha component.
Definition color4d.h:396
COLOR4D Brightened(double aFactor) const
Return a color that is brighter by a given factor, without modifying object.
Definition color4d.h:269
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:399
COLOR4D(double aRed, double aGreen, double aBlue, double aAlpha)
Definition color4d.h:122
static const COLOR4D BLACK
Definition color4d.h:403
COLOR4D Mix(const COLOR4D &aColor, double aFactor) const
Return a color that is mixed with the input by a factor.
Definition color4d.h:296
double b
Blue component.
Definition color4d.h:395
KICOMMON_API const StructColors * colorRefs()
Global list of legacy color names, still used all over the place for constructing COLOR4D's.
Definition color4d.cpp:40
EDA_COLOR_T
Legacy color enumeration.
Definition color4d.h:42
@ HIGHLIGHT_FLAG
Definition color4d.h:80
@ LIGHTGREEN
Definition color4d.h:63
@ PUREORANGE
Definition color4d.h:78
@ BROWN
Definition color4d.h:61
@ PURECYAN
Definition color4d.h:70
@ LIGHTBLUE
Definition color4d.h:62
@ WHITE
Definition color4d.h:48
@ LIGHTERORANGE
Definition color4d.h:74
@ LIGHTORANGE
Definition color4d.h:77
@ BLUE
Definition color4d.h:56
@ LIGHTGRAY
Definition color4d.h:47
@ DARKGRAY
Definition color4d.h:46
@ MAGENTA
Definition color4d.h:60
@ DARKORANGE
Definition color4d.h:75
@ DARKMAGENTA
Definition color4d.h:54
@ LIGHTYELLOW
Definition color4d.h:49
@ DARKCYAN
Definition color4d.h:52
@ NBCOLORS
Number of colors.
Definition color4d.h:79
@ PURERED
Definition color4d.h:71
@ UNSPECIFIED_COLOR
Definition color4d.h:43
@ GREEN
Definition color4d.h:57
@ CYAN
Definition color4d.h:58
@ DARKRED
Definition color4d.h:53
@ DARKBLUE
Definition color4d.h:50
@ LIGHTCYAN
Definition color4d.h:64
@ DARKDARKGRAY
Definition color4d.h:45
@ ORANGE
Definition color4d.h:76
@ PUREGREEN
Definition color4d.h:69
@ LIGHTMAGENTA
Definition color4d.h:66
@ PUREYELLOW
Definition color4d.h:73
@ YELLOW
Definition color4d.h:67
@ PUREBLUE
Definition color4d.h:68
@ LIGHTRED
Definition color4d.h:65
@ MASKCOLOR
mask for color index into colorRefs()[]
Definition color4d.h:81
@ BLACK
Definition color4d.h:44
@ DARKGREEN
Definition color4d.h:51
@ PUREMAGENTA
Definition color4d.h:72
@ RED
Definition color4d.h:59
@ DARKBROWN
Definition color4d.h:55
static constexpr std::size_t hash_val(const Types &... args)
Definition hash.h:51
#define KICOMMON_API
Definition kicommon.h:28
The Cairo implementation of the graphics abstraction layer.
Definition eda_group.h:33
void from_json(const nlohmann::json &aJson, COLOR4D &aColor)
Definition color4d.cpp:288
bool operator==(const COLOR4D &lhs, const COLOR4D &rhs)
Equality operator, are two colors equal.
Definition color4d.cpp:249
void to_json(nlohmann::json &aJson, const COLOR4D &aColor)
Definition color4d.cpp:282
bool operator<(const COLOR4D &lhs, const COLOR4D &rhs)
Definition color4d.cpp:261
std::ostream & operator<<(std::ostream &aStream, COLOR4D const &aColor)
Syntactic sugar for outputting colors to strings.
Definition color4d.cpp:276
bool operator!=(const COLOR4D &lhs, const COLOR4D &rhs)
Not equality operator, are two colors not equal.
Definition color4d.cpp:255
STL namespace.
unsigned char m_Blue
Definition color4d.h:87
EDA_COLOR_T m_LightColor
Definition color4d.h:92
std::string m_ColorName
Definition color4d.h:91
EDA_COLOR_T m_Numcolor
Definition color4d.h:90
unsigned char m_Green
Definition color4d.h:88
unsigned char m_Red
Definition color4d.h:89
std::size_t operator()(const KIGFX::COLOR4D &aColor) const
Definition color4d.h:429