diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 3ea1a8beab..0da05b05cb 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -107,8 +107,7 @@ add_library( singletop STATIC EXCLUDE_FROM_ALL # Functions and data all need to use the #include and be declared # as APIEXPORT set( LIB_KICAD_SRCS - colors.cpp - string.cpp + string.cpp ) if( future ) @@ -272,8 +271,7 @@ set( COMMON_SRCS bitmap_base.cpp board_printout.cpp build_version.cpp - colors.cpp - commit.cpp + commit.cpp common.cpp config_params.cpp confirm.cpp diff --git a/common/colors.cpp b/common/colors.cpp deleted file mode 100644 index 0cc6042542..0000000000 --- a/common/colors.cpp +++ /dev/null @@ -1,184 +0,0 @@ -/* - * This program source code file is part of KiCad, a free EDA CAD application. - * - * Copyright (C) 2014 Jean-Pierre Charras, jp.charras at wanadoo.fr - * Copyright (C) 2014 KiCad Developers, see CHANGELOG.TXT for contributors. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you may find one here: - * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html - * or you may search the http://www.gnu.org website for the version 2 license, - * or you may write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include -#include - - -/** - * The predefined colors used in KiCad. - * Please: if you change a value, remember these values are carefully chosen - * to have good results in Pcbnew, that uses the ORed value of basic colors - * when displaying superimposed objects - * This list must have exactly NBCOLORS items - */ - -const StructColors g_ColorRefs[NBCOLORS] = -{ - { 0, 0, 0, BLACK, _HKI( "Black" ), DARKDARKGRAY }, - { 72, 72, 72, DARKDARKGRAY, _HKI( "Gray 1" ), DARKGRAY }, - { 132, 132, 132, DARKGRAY, _HKI( "Gray 2" ), LIGHTGRAY }, - { 194, 194, 194, LIGHTGRAY, _HKI( "Gray 3" ), WHITE }, - { 255, 255, 255, WHITE, _HKI( "White" ), WHITE }, - { 194, 255, 255, LIGHTYELLOW, _HKI( "L.Yellow" ), WHITE }, - { 72, 0, 0, DARKBLUE, _HKI( "Blue 1" ), BLUE }, - { 0, 72, 0, DARKGREEN, _HKI( "Green 1" ), GREEN }, - { 72, 72, 0, DARKCYAN, _HKI( "Cyan 1" ), CYAN }, - { 0, 0, 72, DARKRED, _HKI( "Red 1" ), RED }, - { 72, 0, 72, DARKMAGENTA, _HKI( "Magenta 1" ), MAGENTA }, - { 0, 72, 72, DARKBROWN, _HKI( "Brown 1" ), BROWN }, - { 132, 0, 0, BLUE, _HKI( "Blue 2" ), LIGHTBLUE }, - { 0, 132, 0, GREEN, _HKI( "Green 2" ), LIGHTGREEN }, - { 132, 132, 0, CYAN, _HKI( "Cyan 2" ), LIGHTCYAN }, - { 0, 0, 132, RED, _HKI( "Red 2" ), LIGHTRED }, - { 132, 0, 132, MAGENTA, _HKI( "Magenta 2" ), LIGHTMAGENTA }, - { 0, 132, 132, BROWN, _HKI( "Brown 2" ), YELLOW }, - { 194, 0, 0, LIGHTBLUE, _HKI( "Blue 3" ), PUREBLUE, }, - { 0, 194, 0, LIGHTGREEN, _HKI( "Green 3" ), PUREGREEN }, - { 194, 194, 0, LIGHTCYAN, _HKI( "Cyan 3" ), PURECYAN }, - { 0, 0, 194, LIGHTRED, _HKI( "Red 3" ), PURERED }, - { 194, 0, 194, LIGHTMAGENTA, _HKI( "Magenta 3" ), PUREMAGENTA }, - { 0, 194, 194, YELLOW, _HKI( "Yellow 3" ), PUREYELLOW }, - { 255, 0, 0, PUREBLUE, _HKI( "Blue 4" ), WHITE }, - { 0, 255, 0, PUREGREEN, _HKI( "Green 4" ), WHITE }, - { 255, 255, 0, PURECYAN, _HKI( "Cyan 4" ), WHITE }, - { 0, 0, 255, PURERED, _HKI( "Red 4" ), WHITE }, - { 255, 0, 255, PUREMAGENTA, _HKI( "Magenta 4" ), WHITE }, - { 0, 255, 255, PUREYELLOW, _HKI( "Yellow 4" ), WHITE }, -}; - - -EDA_COLOR_T ColorByName( const wxString& aName ) -{ - // look for a match in the palette itself - for( EDA_COLOR_T trying = BLACK; trying < NBCOLORS; trying = NextColor(trying) ) - { - if( 0 == aName.CmpNoCase( ColorGetName( trying ) ) ) - return trying; - } - - // Not found, no idea... - return UNSPECIFIED_COLOR; -} - - -bool ColorIsLight( EDA_COLOR_T aColor ) -{ - const StructColors &c = g_ColorRefs[ColorGetBase( aColor )]; - int r = c.m_Red; - int g = c.m_Green; - int b = c.m_Blue; - return ((r * r) + (g * g) + (b * b)) > (128 * 128 * 3); -} - - -EDA_COLOR_T ColorFindNearest( const wxColour &aColor ) -{ - return ColorFindNearest( aColor.Red(), aColor.Green(), aColor.Blue() ); -} - - -EDA_COLOR_T ColorFindNearest( int aR, int aG, int aB ) -{ - EDA_COLOR_T candidate = BLACK; - - /* Find the 'nearest' color in the palette. This is fun. There is - a gazilion of metrics for the color space and no one of the - useful one is in the RGB color space. Who cares, this is a CAD, - not a photosomething... - - I hereby declare that the distance is the sum of the square of the - component difference. Think about the RGB color cube. Now get the - euclidean distance, but without the square root... for ordering - purposes it's the same, obviously. Also each component can't be - less of the target one, since I found this currently work better... - */ - int nearest_distance = 255 * 255 * 3 + 1; // Can't beat this - - for( EDA_COLOR_T trying = BLACK; trying < NBCOLORS; trying = NextColor(trying) ) - { - const StructColors &c = g_ColorRefs[trying]; - int distance = (aR - c.m_Red) * (aR - c.m_Red) + - (aG - c.m_Green) * (aG - c.m_Green) + - (aB - c.m_Blue) * (aB - c.m_Blue); - - if( distance < nearest_distance && c.m_Red >= aR && - c.m_Green >= aG && c.m_Blue >= aB ) - { - nearest_distance = distance; - candidate = trying; - } - } - - return candidate; -} - - -EDA_COLOR_T ColorMix( EDA_COLOR_T aColor1, EDA_COLOR_T aColor2 ) -{ - /* Memoization storage. This could be potentially called for each - * color merge so a cache is useful (there are few colours anyway) */ - static EDA_COLOR_T mix_cache[NBCOLORS][NBCOLORS]; - - // TODO how is alpha used? it's a mac only thing, I have no idea - aColor1 = ColorGetBase( aColor1 ); - aColor2 = ColorGetBase( aColor2 ); - - // First easy thing: a black gives always the other colour - if( aColor1 == BLACK ) - return aColor2; - - if( aColor2 == BLACK) - return aColor1; - - /* Now we are sure that black can't occur, so the rule is: - * BLACK means not computed yet. If we're lucky we already have - * an answer */ - EDA_COLOR_T candidate = mix_cache[aColor1][aColor2]; - - if( candidate != BLACK ) - return candidate; - - // Blend the two colors (i.e. OR the RGB values) - const StructColors &c1 = g_ColorRefs[aColor1]; - const StructColors &c2 = g_ColorRefs[aColor2]; - - // Ask the palette for the nearest color to the mix - wxColour mixed( c1.m_Red | c2.m_Red, - c1.m_Green | c2.m_Green, - c1.m_Blue | c2.m_Blue ); - candidate = ColorFindNearest( mixed ); - - /* Here, BLACK is *not* a good answer, since it would recompute the next time. - * Even theorically its not possible (with the current rules), but - * maybe the metric will change in the future */ - if( candidate == BLACK ) - candidate = DARKDARKGRAY; - - // Store the result in the cache. The operation is commutative, too - mix_cache[aColor1][aColor2] = candidate; - mix_cache[aColor2][aColor1] = candidate; - return candidate; -} - diff --git a/common/config_params.cpp b/common/config_params.cpp index 1ff4e010c8..a6d4f8769e 100644 --- a/common/config_params.cpp +++ b/common/config_params.cpp @@ -24,7 +24,6 @@ */ -#include // for ColorByName, EDA_COLOR_T, UNSPECIFIE... #include // for LOCALE_IO #include // for PARAM_CFG_INT_WITH_SCALE, PARAM_CFG_... #include // for COLOR4D @@ -243,73 +242,6 @@ void PARAM_CFG_INT_WITH_SCALE::SaveParam( wxConfigBase* aConfig ) const } -PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR( const wxString& ident, COLOR4D* ptparam, - COLOR4D default_val, - const wxChar* group ) : - PARAM_CFG( ident, PARAM_SETCOLOR, group ) -{ - m_Pt_param = ptparam; - m_Default = default_val; -} - - -PARAM_CFG_SETCOLOR::PARAM_CFG_SETCOLOR( bool Insetup, - const wxString& ident, - COLOR4D* ptparam, - COLOR4D default_val, - const wxChar* group ) : - PARAM_CFG( ident, PARAM_SETCOLOR, group ) -{ - m_Pt_param = ptparam; - m_Default = default_val; - m_Setup = Insetup; -} - - -void PARAM_CFG_SETCOLOR::ReadParam( wxConfigBase* aConfig ) const -{ - if( !m_Pt_param || !aConfig ) - return; - - COLOR4D temp; - - if( aConfig->HasEntry( m_Ident ) ) - { - if( temp.SetFromWxString( aConfig->Read( m_Ident, wxT( "NONE" ) ) ) ) - { - *m_Pt_param = temp; - return; - } - } - - // If no luck, try reading legacy format - wxString legacy_Ident = m_Ident; - legacy_Ident.Replace( wxT( "4D" ), wxEmptyString ); - - EDA_COLOR_T old = ColorByName( aConfig->Read( legacy_Ident, wxT( "NONE" ) ) ); - - if( old != UNSPECIFIED_COLOR ) - { - if( m_Ident == wxT( "Color4DErcWEx" ) || m_Ident == wxT( "Color4DErcEEx" ) ) - *m_Pt_param = COLOR4D( old ).WithAlpha( 0.8 ); - else - *m_Pt_param = COLOR4D( old ); - return; - } - - *m_Pt_param = m_Default; -} - - -void PARAM_CFG_SETCOLOR::SaveParam( wxConfigBase* aConfig ) const -{ - if( !m_Pt_param || !aConfig ) - return; - - aConfig->Write( m_Ident, m_Pt_param->ToColour().GetAsString( wxC2S_CSS_SYNTAX ) ); -} - - PARAM_CFG_DOUBLE::PARAM_CFG_DOUBLE( const wxString& ident, double* ptparam, double default_val, double min, double max, const wxChar* group ) : diff --git a/common/gal/color4d.cpp b/common/gal/color4d.cpp index 852ac42b06..14a7e14e1e 100644 --- a/common/gal/color4d.cpp +++ b/common/gal/color4d.cpp @@ -26,9 +26,47 @@ #include #include #include +#include using namespace KIGFX; +#define TS( string ) wxString( _HKI( string ) ).ToStdString() + +const StructColors g_ColorRefs[NBCOLORS] = +{ + { 0, 0, 0, BLACK, TS( "Black" ), DARKDARKGRAY }, + { 72, 72, 72, DARKDARKGRAY, TS( "Gray 1" ), DARKGRAY }, + { 132, 132, 132, DARKGRAY, TS( "Gray 2" ), LIGHTGRAY }, + { 194, 194, 194, LIGHTGRAY, TS( "Gray 3" ), WHITE }, + { 255, 255, 255, WHITE, TS( "White" ), WHITE }, + { 194, 255, 255, LIGHTYELLOW, TS( "L.Yellow" ), WHITE }, + { 72, 0, 0, DARKBLUE, TS( "Blue 1" ), BLUE }, + { 0, 72, 0, DARKGREEN, TS( "Green 1" ), GREEN }, + { 72, 72, 0, DARKCYAN, TS( "Cyan 1" ), CYAN }, + { 0, 0, 72, DARKRED, TS( "Red 1" ), RED }, + { 72, 0, 72, DARKMAGENTA, TS( "Magenta 1" ), MAGENTA }, + { 0, 72, 72, DARKBROWN, TS( "Brown 1" ), BROWN }, + { 132, 0, 0, BLUE, TS( "Blue 2" ), LIGHTBLUE }, + { 0, 132, 0, GREEN, TS( "Green 2" ), LIGHTGREEN }, + { 132, 132, 0, CYAN, TS( "Cyan 2" ), LIGHTCYAN }, + { 0, 0, 132, RED, TS( "Red 2" ), LIGHTRED }, + { 132, 0, 132, MAGENTA, TS( "Magenta 2" ), LIGHTMAGENTA }, + { 0, 132, 132, BROWN, TS( "Brown 2" ), YELLOW }, + { 194, 0, 0, LIGHTBLUE, TS( "Blue 3" ), PUREBLUE, }, + { 0, 194, 0, LIGHTGREEN, TS( "Green 3" ), PUREGREEN }, + { 194, 194, 0, LIGHTCYAN, TS( "Cyan 3" ), PURECYAN }, + { 0, 0, 194, LIGHTRED, TS( "Red 3" ), PURERED }, + { 194, 0, 194, LIGHTMAGENTA, TS( "Magenta 3" ), PUREMAGENTA }, + { 0, 194, 194, YELLOW, TS( "Yellow 3" ), PUREYELLOW }, + { 255, 0, 0, PUREBLUE, TS( "Blue 4" ), WHITE }, + { 0, 255, 0, PUREGREEN, TS( "Green 4" ), WHITE }, + { 255, 255, 0, PURECYAN, TS( "Cyan 4" ), WHITE }, + { 0, 0, 255, PURERED, TS( "Red 4" ), WHITE }, + { 255, 0, 255, PUREMAGENTA, TS( "Magenta 4" ), WHITE }, + { 0, 255, 255, PUREYELLOW, TS( "Yellow 4" ), WHITE }, +}; + + COLOR4D::COLOR4D( EDA_COLOR_T aColor ) { if( aColor <= UNSPECIFIED_COLOR || aColor >= NBCOLORS ) @@ -390,3 +428,40 @@ COLOR4D& COLOR4D::Saturate( double aFactor ) constexpr COLOR4D COLOR4D::UNSPECIFIED( 0, 0, 0, 0 ); constexpr COLOR4D COLOR4D::WHITE( 1, 1, 1, 1 ); constexpr COLOR4D COLOR4D::BLACK( 0, 0, 0, 1 ); + + +EDA_COLOR_T COLOR4D::FindNearestLegacyColor( int aR, int aG, int aB ) +{ + EDA_COLOR_T candidate = EDA_COLOR_T::BLACK; + + /* Find the 'nearest' color in the palette. This is fun. There is + a gazilion of metrics for the color space and no one of the + useful one is in the RGB color space. Who cares, this is a CAD, + not a photosomething... + + I hereby declare that the distance is the sum of the square of the + component difference. Think about the RGB color cube. Now get the + euclidean distance, but without the square root... for ordering + purposes it's the same, obviously. Also each component can't be + less of the target one, since I found this currently work better... + */ + int nearest_distance = 255 * 255 * 3 + 1; // Can't beat this + + for( EDA_COLOR_T trying = EDA_COLOR_T::BLACK; trying < EDA_COLOR_T::NBCOLORS; + trying = static_cast( int( trying ) + 1 ) ) + { + const StructColors &c = g_ColorRefs[trying]; + int distance = (aR - c.m_Red) * (aR - c.m_Red) + + (aG - c.m_Green) * (aG - c.m_Green) + + (aB - c.m_Blue) * (aB - c.m_Blue); + + if( distance < nearest_distance && c.m_Red >= aR && + c.m_Green >= aG && c.m_Blue >= aB ) + { + nearest_distance = distance; + candidate = trying; + } + } + + return candidate; +} diff --git a/common/plotters/DXF_plotter.cpp b/common/plotters/DXF_plotter.cpp index 1bd18bc047..422a21cd81 100644 --- a/common/plotters/DXF_plotter.cpp +++ b/common/plotters/DXF_plotter.cpp @@ -118,9 +118,9 @@ static const char* getDXFLineType( PLOT_DASH_TYPE aType ) // DXF files do not use a RGB definition static wxString getDXFColorName( COLOR4D aColor ) { - EDA_COLOR_T color = ColorFindNearest( int( aColor.r*255 ), - int( aColor.g*255 ), - int( aColor.b*255 ) ); + EDA_COLOR_T color = COLOR4D::FindNearestLegacyColor( int( aColor.r * 255 ), + int( aColor.g * 255 ), + int( aColor.b * 255 ) ); wxString cname( dxf_layer[color].name ); return cname; } @@ -357,7 +357,9 @@ bool DXF_PLOTTER::StartPlot() - Greys (251 - 255) */ - for( EDA_COLOR_T i = BLACK; i < numLayers; i = NextColor(i) ) + wxASSERT( numLayers < NBCOLORS ); + + for( EDA_COLOR_T i = BLACK; i < numLayers; i = static_cast( int( i ) + 1 ) ) { fprintf( outputFile, " 0\n" diff --git a/include/colors.h b/include/colors.h deleted file mode 100644 index 67a9e7388c..0000000000 --- a/include/colors.h +++ /dev/null @@ -1,222 +0,0 @@ -/* - * This program source code file is part of KiCad, a free EDA CAD application. - * - * Copyright (C) 2007-2014 Jean-Pierre Charras, jp.charras at wanadoo.fr - * Copyright (C) 1992-2014 KiCad Developers, see AUTHORS.TXT for contributors. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you may find one here: - * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html - * or you may search the http://www.gnu.org website for the version 2 license, - * or you may write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -/** - * NOTE: EDA_COLOR_T is deprecated and is kept around for compatibility with - * legacy canvas. Once there is no need for legacy support, the color - * table g_ColorRefs in colors.cpp can be re-written in COLOR4D and this - * file can go away. - * - * Please use COLOR4D instead of including this file. - */ - -#ifndef COLORS_H_ -#define COLORS_H_ - -#include - -/** The color enumeration. Also contains a flag and the alpha value in - * the upper bits - */ -enum EDA_COLOR_T -{ - UNSPECIFIED_COLOR = -1, - BLACK = 0, - DARKDARKGRAY, - DARKGRAY, - LIGHTGRAY, - WHITE, - LIGHTYELLOW, - DARKBLUE, - DARKGREEN, - DARKCYAN, - DARKRED, - DARKMAGENTA, - DARKBROWN, - BLUE, - GREEN, - CYAN, - RED, - MAGENTA, - BROWN, - LIGHTBLUE, - LIGHTGREEN, - LIGHTCYAN, - LIGHTRED, - LIGHTMAGENTA, - YELLOW, - PUREBLUE, - PUREGREEN, - PURECYAN, - PURERED, - PUREMAGENTA, - PUREYELLOW, - NBCOLORS, ///< Number of colors - HIGHLIGHT_FLAG = ( 1<<19 ), - MASKCOLOR = 31 ///< mask for color index into g_ColorRefs[] -}; - -/// Checked cast. Use only when necessary (usually I/O) -inline EDA_COLOR_T ColorFromInt( int aColor ) -{ - wxASSERT( aColor >= UNSPECIFIED_COLOR && aColor < NBCOLORS ); - return static_cast( aColor ); -} - -inline EDA_COLOR_T NextColor( EDA_COLOR_T& aColor ) -{ - // We have to accept NBCOLORS for loop termination conditions - wxASSERT( aColor >= UNSPECIFIED_COLOR && aColor <= NBCOLORS ); - aColor = static_cast( int( aColor ) + 1 ); - return aColor; -} - -/// Return only the plain color part -inline EDA_COLOR_T ColorGetBase( EDA_COLOR_T aColor) -{ - EDA_COLOR_T base = static_cast( aColor & MASKCOLOR ); - return base; -} - -/// Mix two colors in some way (hopefully like a logical OR) -EDA_COLOR_T ColorMix( EDA_COLOR_T aColor1, EDA_COLOR_T aColor2 ); - -/// Force the color part of a color to darkdarkgray -inline void ColorTurnToDarkDarkGray( EDA_COLOR_T *aColor ) -{ - *aColor = static_cast( (int(*aColor) & ~MASKCOLOR) | DARKDARKGRAY ); -} - -inline void ColorChangeHighlightFlag( EDA_COLOR_T *aColor, bool flag ) -{ - if( flag ) - *aColor = static_cast( (int(*aColor) | HIGHLIGHT_FLAG ) ); - else - *aColor = static_cast( (int(*aColor) & ~HIGHLIGHT_FLAG ) ); -} - -/** - * Function SetAlpha - * ORs in the alpha blend parameter in to a color index. - */ -inline void SetAlpha( EDA_COLOR_T* aColor, unsigned char aBlend ) -{ - const unsigned char MASKALPHA = 0xFF; - - *aColor = static_cast((*aColor & ~(MASKALPHA << 24)) - | ((aBlend & MASKALPHA) << 24)); -} - -/** - * Function GetAlpha - * returns the alpha blend parameter from a color index. - */ -inline unsigned char GetAlpha( EDA_COLOR_T aColor ) -{ - const unsigned char MASKALPHA = 0xFF; - return (aColor >> 24) & MASKALPHA; -} - - -struct StructColors -{ - unsigned char m_Blue; - unsigned char m_Green; - unsigned char m_Red; - EDA_COLOR_T m_Numcolor; - - const wxChar* m_ColorName; - EDA_COLOR_T m_LightColor; -}; - -/// list of existing Colors -extern const StructColors g_ColorRefs[NBCOLORS]; - -/// Step a color to the highlighted version if the highlight flag is set -inline void ColorApplyHighlightFlag( EDA_COLOR_T *aColor ) -{ - EDA_COLOR_T base = ColorGetBase( *aColor ); - wxASSERT( base > UNSPECIFIED_COLOR && base < NBCOLORS ); - if( *aColor & HIGHLIGHT_FLAG ) - *aColor = g_ColorRefs[base].m_LightColor; -} - -/// Find a color by name -EDA_COLOR_T ColorByName( const wxString& aName ); - -/// Find the nearest color match -EDA_COLOR_T ColorFindNearest( const wxColour &aColor ); - -/** - * Find the nearest color match - * @param aR is the red component of the color to be matched (in range 0-255) - * @param aG is the green component of the color to be matched (in range 0-255) - * @param aB is the blue component of the color to be matched (in range 0-255) - */ -EDA_COLOR_T ColorFindNearest( int aR, int aG, int aB ); - -/** - * Check if a color is light i.e. if black would be more readable than - * white on it - */ -bool ColorIsLight( EDA_COLOR_T aColor ); - -inline const wxChar *ColorGetName( EDA_COLOR_T aColor ) -{ - EDA_COLOR_T base = ColorGetBase( aColor ); - wxASSERT( base > UNSPECIFIED_COLOR && base < NBCOLORS ); - return g_ColorRefs[base].m_ColorName; -} - -inline void ColorSetBrush( wxBrush *aBrush, EDA_COLOR_T aColor ) -{ - EDA_COLOR_T base = ColorGetBase( aColor ); - wxASSERT( base > UNSPECIFIED_COLOR && base < NBCOLORS ); - const StructColors &col = g_ColorRefs[base]; - aBrush->SetColour( col.m_Red, col.m_Green, col.m_Blue ); -} - -/** - * Function MakeColour - * returns a wxWidgets wxColor from a KiCad color index with alpha value. - * Note that alpha support is not available on every wxWidgets platform. On - * such platform the behavior is the same as for wxALPHA_OPAQUE and that - * means the alpha value has no effect and will be ignored. - * @return wxColour - given a KiCad color index with alpha value - */ -inline wxColour MakeColour( EDA_COLOR_T aColor ) -{ - int alpha = GetAlpha( aColor ); - alpha = alpha ? alpha : wxALPHA_OPAQUE; - EDA_COLOR_T ndx = ColorGetBase( aColor ); - wxASSERT( ndx > UNSPECIFIED_COLOR && ndx < NBCOLORS ); - - return wxColour( g_ColorRefs[ndx].m_Red, - g_ColorRefs[ndx].m_Green, - g_ColorRefs[ndx].m_Blue - ,(unsigned char) alpha - ); -} - -#endif // COLORS_H_ diff --git a/include/config_params.h b/include/config_params.h index 46886c1d03..ebc5a92b26 100644 --- a/include/config_params.h +++ b/include/config_params.h @@ -70,7 +70,6 @@ void ConfigBaseWriteDouble( wxConfigBase* aConfig, const wxString& aKey, double enum paramcfg_id { PARAM_INT, PARAM_INT_WITH_SCALE, - PARAM_SETCOLOR, PARAM_DOUBLE, PARAM_BOOL, PARAM_LIBNAME_LIST, @@ -186,27 +185,6 @@ public: }; -/** - * Configuration parameter - SetColor Class - * - */ -class PARAM_CFG_SETCOLOR : public PARAM_CFG -{ -public: - COLOR4D* m_Pt_param; ///< Pointer to the parameter value - COLOR4D m_Default; ///< The default value of the parameter - -public: - PARAM_CFG_SETCOLOR( const wxString& ident, COLOR4D* ptparam, - COLOR4D default_val, const wxChar* group = NULL ); - PARAM_CFG_SETCOLOR( bool Insetup, const wxString& ident, COLOR4D* ptparam, - COLOR4D default_val, const wxChar* group = NULL ); - - virtual void ReadParam( wxConfigBase* aConfig ) const override; - virtual void SaveParam( wxConfigBase* aConfig ) const override; -}; - - /** * Configuration parameter - Double Precision Class * diff --git a/include/gal/color4d.h b/include/gal/color4d.h index 498460967f..97e4850ca0 100644 --- a/include/gal/color4d.h +++ b/include/gal/color4d.h @@ -27,10 +27,69 @@ #ifndef COLOR4D_H_ #define COLOR4D_H_ -#include #include #include +#ifdef WX_COMPATIBILITY +#include +#endif + +/** + * Legacy color enumeration. Also contains a flag and the alpha value in + * the upper bits + */ +enum EDA_COLOR_T +{ + UNSPECIFIED_COLOR = -1, + BLACK = 0, + DARKDARKGRAY, + DARKGRAY, + LIGHTGRAY, + WHITE, + LIGHTYELLOW, + DARKBLUE, + DARKGREEN, + DARKCYAN, + DARKRED, + DARKMAGENTA, + DARKBROWN, + BLUE, + GREEN, + CYAN, + RED, + MAGENTA, + BROWN, + LIGHTBLUE, + LIGHTGREEN, + LIGHTCYAN, + LIGHTRED, + LIGHTMAGENTA, + YELLOW, + PUREBLUE, + PUREGREEN, + PURECYAN, + PURERED, + PUREMAGENTA, + PUREYELLOW, + NBCOLORS, ///< Number of colors + HIGHLIGHT_FLAG = ( 1<<19 ), + MASKCOLOR = 31 ///< mask for color index into g_ColorRefs[] +}; + +struct StructColors +{ + unsigned char m_Blue; + unsigned char m_Green; + unsigned char m_Red; + EDA_COLOR_T m_Numcolor; + std::string m_ColorName; + EDA_COLOR_T m_LightColor; +}; + +/// Global list of legacy color names, still used all over the place for constructing COLOR4D's +extern const StructColors g_ColorRefs[NBCOLORS]; + + namespace KIGFX { /** @@ -298,6 +357,11 @@ public: */ void FromHSV( double aInH, double aInS, double aInV ); + /** + * Returns a legacy color ID that is closest to the given 8-bit RGB values. + */ + static EDA_COLOR_T FindNearestLegacyColor( int aR, int aG, int aB ); + // Color components: red, green, blue, alpha double r; ///< Red component double g; ///< Green component diff --git a/pagelayout_editor/dialogs/dialogs_for_printing.cpp b/pagelayout_editor/dialogs/dialogs_for_printing.cpp index 967ebfddd4..2057e1b079 100644 --- a/pagelayout_editor/dialogs/dialogs_for_printing.cpp +++ b/pagelayout_editor/dialogs/dialogs_for_printing.cpp @@ -173,7 +173,7 @@ void PLEDITOR_PRINTOUT::PrintPage( int aPageNum ) GRForceBlackPen( true ); COLOR4D bg_color = m_parent->GetDrawBgColor(); - m_parent->SetDrawBgColor( MakeColour( WHITE ) ); + m_parent->SetDrawBgColor( WHITE ); screen->m_ScreenNumber = aPageNum; diff --git a/pcbnew/plot_brditems_plotter.cpp b/pcbnew/plot_brditems_plotter.cpp index 20451ca4a7..4335ce241f 100644 --- a/pcbnew/plot_brditems_plotter.cpp +++ b/pcbnew/plot_brditems_plotter.cpp @@ -39,7 +39,6 @@ #include #include // for BOARD_DESIGN_SETTINGS -#include // for LIGHTGRAY, WHITE #include // for dyn_cast, PCB_DIMENSION_T #include // for FILLED, EDA_DRAW_MODE_T #include // for COLOR4D, operator!= diff --git a/qa/common/CMakeLists.txt b/qa/common/CMakeLists.txt index c4cffa9422..d79dc5e3c0 100644 --- a/qa/common/CMakeLists.txt +++ b/qa/common/CMakeLists.txt @@ -33,7 +33,6 @@ set( common_srcs ${CMAKE_SOURCE_DIR}/common/base_units.cpp # stuff from common which is needed...why? - ${CMAKE_SOURCE_DIR}/common/colors.cpp ${CMAKE_SOURCE_DIR}/common/observable.cpp wximage_test_utils.cpp diff --git a/qa/common_tools/CMakeLists.txt b/qa/common_tools/CMakeLists.txt index 3373ceb91e..8789238727 100644 --- a/qa/common_tools/CMakeLists.txt +++ b/qa/common_tools/CMakeLists.txt @@ -27,7 +27,6 @@ add_executable( qa_common_tools # ../../common/eda_text.cpp # stuff from common which is needed...why? - ${CMAKE_SOURCE_DIR}/common/colors.cpp ${CMAKE_SOURCE_DIR}/common/observable.cpp # Mock Pgm needed for advanced_config in coroutines @@ -66,4 +65,4 @@ target_include_directories( qa_common_tools PRIVATE $ ) -kicad_add_utils_executable( qa_common_tools ) \ No newline at end of file +kicad_add_utils_executable( qa_common_tools ) diff --git a/qa/eeschema/CMakeLists.txt b/qa/eeschema/CMakeLists.txt index 957cfbf2c1..6191c72635 100644 --- a/qa/eeschema/CMakeLists.txt +++ b/qa/eeschema/CMakeLists.txt @@ -33,7 +33,6 @@ include_directories( set( QA_EESCHEMA_SRCS # stuff from common which is needed...why? - ${CMAKE_SOURCE_DIR}/common/colors.cpp ${CMAKE_SOURCE_DIR}/common/observable.cpp # need the mock Pgm for many functions diff --git a/qa/pcbnew/CMakeLists.txt b/qa/pcbnew/CMakeLists.txt index bea3ca1866..4dbfe44ec7 100644 --- a/qa/pcbnew/CMakeLists.txt +++ b/qa/pcbnew/CMakeLists.txt @@ -31,7 +31,6 @@ add_executable( qa_pcbnew ${CMAKE_SOURCE_DIR}/common/eda_text.cpp # stuff from common which is needed...why? - ${CMAKE_SOURCE_DIR}/common/colors.cpp ${CMAKE_SOURCE_DIR}/common/observable.cpp # The main test entry points