/************/ /* colors.h */ /************/ #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 operator++( 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_Name; 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 wxChar *aName ); /// Find the nearest color match EDA_COLOR_T ColorFindNearest( const wxColour &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_Name; } 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. wxGtk 2.8.4 is * not supporting alpha. * @return wxColour - given a KiCad color index with alpha value */ inline wxColour MakeColour( EDA_COLOR_T aColor ) { #if wxCHECK_VERSION(2,8,5) int alpha = GetAlpha( aColor ); alpha = alpha ? alpha : wxALPHA_OPAQUE; #endif 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 #if wxCHECK_VERSION(2,8,5) ,(unsigned char) alpha #endif ); } #endif /* ifndef _COLORS_H */